Fourth and fifth week of machine learning on Coursera
@(Coursera)
第四周和第五周主要都是在讲解神经网络的知识点,理解有限,自己的内容主要是些零碎的知识点,系统性的讲解可参考我贴出的博客。
神经网络(Representation)
神经网络(learning)
反向传播算法解析
知识点:
α(j)i
表示第
j
层第
Θ(j)
表示第
j
层第
相当于第j层多出了一个输入单元 x0 ,导致计算下一层各unit值时候,多乘以 x0 作用的情况,矩阵看起来多出了一列。如下图所示:
反向传播算法&损失函数
- L: 神经网络中的总层数;
- sl: 第 l 层单元的数量;
K: 输出单元的数量;
损失函数沿用逻辑回归的形式:
神经网络的损失函数为:
对于反向传播算法的梯度计算:
定义 δ(l)j第l层第j个节点的误差:
例如: 对于第4层的每个输出单元:δ(4)j=α(4)j−yj
上图可知,第4层含有4个输出单元,所以第4层输出单元的误差可以写为向量形式:
误差反向传播:
注:上面误差逆传播推导我没有推导出来,视频中也是直接给出的。
sigmoid()导数有个性质是:
所以上述的
上图误差反向传播的时候,
δ(2)2只会来自于δ(3)1和δ(3)2
矩阵和向量转换:
矩阵A,B,C,size(A)=10∗11,size(B)=10∗11,size(C)=1∗11,thetaVec=[A(:);B(:);C(:)];此时size(thetaVec)=231∗1;
如果想从
thetaVec得到A,B,C
可以使用
reshape(thetaVec(1:110),10,11);这个命令恢复矩阵A
梯度检查
反向传播算法计算梯度值非常快,但是有的时候容易出错误,所以需要进行梯度检查。
Matlab程序:
epsilon = 1e-4;
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) += epsilon;
thetaMinus = theta;
thetaMinus(i) -= epsilon;
gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;
将求出的梯度值 gradApprox 和反向传播求出的 deltaVector 相比较,如果近似相等,证明反向传播算法计算是对的,由于上述校验计算梯度非常,验证正确后即可从程序段中去除验证部分。