• MachineLearning Exercise 4 :Neural Networks Learning


    nnCostFunction

    消耗公式:

    a1 = [ones(m,1) X];
    z2 = a1*Theta1';
    pre = sigmoid(a1*Theta1');
    a2 = [ones(m,1) pre];
    z3 = a2*Theta2';
    a3 = sigmoid(z3);
    
    y_vec = zeros(m,num_labels);
    for i=1:m;
        y_vec(i,y(i)) = 1;
    end
    
    for i=1:m
        J = J + y_vec(i,:)*log(a3(i,:)')+(1-y_vec(i,:))*log(1-a3(i,:))';
    end
    J = (-1/m)*J;
    
    % add regularized
    J = J + (lambda/(2*m))*(sum(sum(Theta1(:,2:end).^2))+sum(sum(Theta2(:,2:end).^2)));
    
    % back
    Delta1 = zeros(size(Theta1));  
    Delta2 = zeros(size(Theta2));  
    for i=1:m,  
        delta3 = a3(i,:) - y_vec(i,:);  
        temp = (delta3*Theta2);
        delta2 = temp(:,2:end).*sigmoidGradient(z2(i,:));  
    
        Delta2 = Delta2 + delta3' * a2(i,:);  
          
        Delta1 = Delta1 + delta2' * a1(i,:);  
    end;  
      
    Theta2_grad = Delta2/m;  
    Theta1_grad = Delta1/m;  
      
    Theta2_grad(:,2:end) = Theta2_grad(:,2:end) + lambda * Theta2(:,2:end) / m;  
    Theta1_grad(:,2:end) = Theta1_grad(:,2:end) + lambda * Theta1(:,2:end) / m;
    • 为了方便使用fminunc(),这里讲Theta1和Theta2展开组合成一个vector(nn_params=[Theta1(:);Theta2(:)]),在需要使用时使用reshape重构。
    • 初始化是,y是一个由0到9组成的向量,由于我们使用了sigmoid函数,需要将y转化成一个编码式的矩阵。
    • a1,a2,a3分别为各层激活值。
    • 对矩阵使用一次sum只是分别将行相加求和得到一个向量,因此在求消耗值时应该使用两次sum。
    • 没必要求delta1,因为第一层是我们的原始输入数据,不存在误差一说。

    反向传播算法公式推导

    反向传播算法的本质是利用链式求导法则,虽然神经网络求grad的公式一眼看不明白,但实质都是根据对 J 求导推导出来的,下面将给出一个大致的分析过程:

    这是我们熟悉的cost函数,这里故意没有写求和符号,把各种角标丢掉,使公式清晰一些,而且也不影响推导过程。

    我们假设有神经网络L层,那么对thetaL-1求导公式为:

    上一层公式为:

    从上边两个公式就可以看出,他们是有公共部分的,而这个公共部分就是我们的delta:

    以此类推,之后的各层delta就有了:

    把delta带入我们的求导公式中:

    有了上面的解释,整个过程基本就比较明了了,让我们再仔细验证一番,首先从输出层开始,也就是练习的三层神经网络最后一层;

    其中

    然后我们将开头的cost函数变换为,对a(L)求导得:

    由于a(L)=g(z),而g(z)就是我们的s函数,所以a(L)对z求导得:

    这样就可以得到delta了:

    终于,看到一丝曙光了,对于练习中的三层神经网络来说,delta3的值显而易见了:

    z的值是theta*a,因此:

    把上边的总结下,对于输出层,我们得到:

    然后是隐藏层:

    对于三层网络来说:

    最后带入整合:

  • 相关阅读:
    java内存区域模型
    Java类加载器(双亲委派模型)(综述)
    2.无重复字符的最长子串
    浅谈Java中的对象和引用
    OSI七层协议大白话解读
    MPLS
    计算机网络为什么要分为五层结构?其依据是什么?
    前端技巧小结
    移动端尺寸新写法-rem
    编写高质量代码:Web前端开发修炼之道(四)
  • 原文地址:https://www.cnblogs.com/1024incn/p/4572879.html
Copyright © 2020-2023  润新知