后向传播算法
首先需要说明的是,在这一篇笔记中,我们的目的是:通过不断地调整我们的参数,来更新cost function 以获取其最小值。在实现的过程中,我们主要用到的方法主要是梯度下降法,可以参考逻辑回归章节中我们所采用的梯度下降的方法。
但是需要注意的是,NN的代价函数是一个非凸性质的函数,所以对NN使用梯度下降法的时候可能会陷入局部最优解,不过不用担心,一般NNe的局部最优解也是一个比较好的解。
我们关注的问题有 这么几个:
1. 代价函数
J(Θ)
2. 残差
δ(l)
3. 梯度
4. 调整参数
Θ
5. 梯度检验
6. 随机初始化
在这整个过程中,隐藏的一条规则的偏导的链式法则:
并且根据 Θ 的不同,而链式的项也不同,越靠前项数越多!
——————————————————————————————————————
1. 代价函数 Cost Function J(Θ)
2. 计算残差 δ(l)
用
δ(l)j
来表示第l层第j个节点的误差
那么,我们就可以得到最后一层每个节点的误差
这个公式的意义是 error = hypothesis - realvaule 也就是真实值和预测值之间的差距,也就是统计学里面的 残差 residual。
接下来我们要做的事情是这样子:我们参考前向传播的方式,将我们求出来的残差,作为起点来向前传递。
我们现在先不考虑求梯度的问题,只考虑残差的传递问题。值得注意的事情是这里的误差传递过程并不是在前面的输入输出所带来了误差,所以要按照权重分配回去,而是看作输入,沿着网络传播,传播的过程总会有一定的损耗!也就是类似前向的过程!
接下来要插入一张图,便于理解
以下这一部分是个人的理解,并没有什么依据,只是方便理解和记忆,不保证其正确性:
在考虑后向传播的时候我们应该要考虑到每一个
z(l),a(l)
- 我们首先计算最开始的残差
δ(4)=h(Θ)−y ,这个残差是属于 a(4) 的 - 接下来,因为从
z(4)
到
a(4)
经历了一个sigmoid函数,所以不妨把这个过程看成一个编码的过程,现在我们要做的事情是解码。于是我们就有
error(4)=δ(4)g′(z(4))=δ(4)g(z(4))(1−g(z(4)))=δ(4)a(4)(1−a(4)) ,这里的这个残差是属于 z(4) 的,我们暂时只考虑第一个等式(Ng的课程里面并没有使用形如 error(4) 的符号) - 紧接着,残差会沿着网络往前传递。我们不妨拿出一个单元节点来考虑。比如
a(3)
,在这个节点的位置,我们有
δ(3)=w∗error(4)=w∗δ(4)g′(z(4)) - 继续我们“解码的过程”,我们又可以得到
z(3)
的残差
error(3)=δ(3)g′(z(3)) - 按照这个思路往下循环,一直到隐藏层的第一层,这样子我们就得到了每一个节点
z(l),a(l)
的残差
在Ng的视频里面,他是这样子表示的:
δ(l)=(Θ(l))Tδ(l+1).∗g′(z(l))
并且在前面遗漏的一个问题是,关于sigmoid函数求导的问题,上次只是单纯计算出来了,但是现在需要把这个公式写下来
所以我们就有 g′(z(l))=g(z(l))(1−g(z(l)))=a(l)(1−a(l))
3. 梯度
从我个人的理解来看,逻辑回归里面的梯度可以简单地看作是残差与输入的乘积,这里也可以这样子来理解,所以立刻就有 Δ(l)=Δ(l)+δ(l+1)a(l) 加入学习速率或者说步长,我们就有
所以,
关于这个过程的数学推导和证明,油管上有一些比较好的解释,文字版,视频参考
4. 调整参数
参考逻辑回归调整 θ 的方法即可,但是在参数计算出来还需要做一个检查,然后才能投入到神经网络中使用
5.梯度检查法
在后向传播的过程中, 可能会有一些小的bug,让代价函数 J(Θ) 看上去是在递减,但是实际带来的误差可能会更大,并且你还不能发觉,所以需要梯度检查法来评估你所所计算出来的代价函数的梯度。
numerical estimation of gradients
梯度是
J(Θ)−Θ
平面上曲线的斜率。
我们在
J(Θ)
曲线上选取一个点
Θ
,在
Θ
的两边分别取一段
ϵ
,构成
[Θ−ϵ,Θ+ϵ]
,然后求这两个点对应
J
值连线所代表的斜率,该斜率与我们所要求的梯度应该是非常相近的。
所以推广到一般的情况就有:
θ∈Rn,θ=[θ1,θ2,...,θn]
最后,比较得到的gradApprox 和Dvec(D是我们计算出来的梯度 = αresidual Input)
但是我觉得Ng的这个说法是有问题的,他说的 δ(4) 指的是 a(4) 的残差,而 δ(3) 指的应该是 z(3) 的残差
6. 参数初始化的问题
在做神经网络的过程中我们的参数是通过不断地学习得到的,并不是一开始就设定好的。或者说,我们初始化的参数其实为了后面更好地学习参数,调整参数。
zero initialization
考虑到NN和logistic regression的相似处,而逻辑回归的初设都是
θ=zeros(n,1)
,我们尝试将参数同样地也应用于NN。但是会发现,如果这样子做,我们得到
a(l),δ(l),∂J(Θ)∂Θ
最后都会变成一样。也就是意味着我们想要区分特征的特征的目的没有达到,所有的unit都是同一个特征,NN也就没有了意义.
random initialization
为了解决这个问题,我们考虑使用random initialization的方法来实现对称失效,即给每一个
θ
赋一个
[−ϵ,ϵ]
之间的值,
ϵ
是0点附近的一个小波动。比如我们可以采用正态分布
N(0,ϵ2)
生成的随机量。