反向传播法(Backpropagation algorithm)
使用梯度下降法求解价值函数j(x)的最小值时,我们需要知道j(x)的导数
先给一个样本(x,y)时的正向传播过程
a(1) = x
z(2) = theta(1)a(1)
a(2) = g(z(2))
z(3) = theta(2)a(2)
a(3) = g(z(3))
z(4) = theta(3)a(3)
a(4) = h(x) = g(z(4))
设置∂_j^l 为第l成j节点的误差
δ(4)=a(4)−yδ(4)=a(4)−y
δ(3)=(θ(3))Tδ(4).∗g′(z(3))δ(3)=(θ(3))Tδ(4).∗g′(z(3))
δ(2)=(θ(2))Tδ(3).∗g′(z(2))δ(2)=(θ(2))Tδ(3).∗g′(z(2))
算法步骤如下
function [jVal, gradient] = costFunction(theta)
…
Optheta = fminunc(@costFunction, initialTheta, options)
在上面的函数中,我们需要传递的参数为向量,但在以前的课程中可以发现这些参数都为矩阵形式,所以我们需要把矩阵换为向量传递,在函数中将向量转换为矩阵使用。
下面举一个例子
S1 = 10,S2 = 10,S3 = 1
Theta(1)=R(10×11,) , theta(2)=R(10×11),theta(3)=R(1×11)
D(1)=R(10×11),D(2)=R(10×11),D(3)=R(1×11)
梯度下降检测法
因为梯度计算方式的复杂,下面给出一种检测计算的方式
我们学习过倒数的几何意义如下
由此我们可以想到一种检测梯度的方式
相对应的代码形式为
但在运行代码的时候需要把梯度下降检测算法的代码给删去,因为它的作用只是为了检测反向传播算法的正确性,如果证明了正确,就不必再用了,如果使用会让神经网络计算的很慢。
随意初始值
在调用梯度下降发河先进的优化算法时,我们需要给出初始值,我们不能和以前一样把初始值都设置为0,因为根据正向传播算法,如果初始值都一样,则每层的单元之a(l)会想通,同样,根据反向传播算法,每个δ(l)会相同。如此一来,。诶次更新后,输入到每层的各个单元值相同。
采用随机初始化的代码如下
且初始化theta(l)的范围为[−ε,+ε]. (ε的值通常很小,约为0.001)