第九章 神经网络:学习(Neural Networks: Learning)(一)
第1节 代价函数和反向传播(Cost Function and Backpropagation)
9.1 代价函数
参考视频 : 9 - 1 - Cost Function (7 min).mkv
首先引入一些便于讨论的标记。假设神经网络的训练样本有m个,每个样本包含输入x和类标签y。用L表示神经网络层数,Sl表示第l层的神经元个数,所以SL就是最后一层输出层的神经元个数。
将基于神经网络的分类分为两种情况:二分类和多分类。在二分类中,输出层只有一个神经元。在多分类中,输出层有K个神经元(K为分类的个数)。如下图,

回顾一下逻辑回归的代价函数(第二项是正则化项):
J(θ)=−1m∑i=1m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]+λ2m∑j=1nθ2j
在逻辑回归中,我们的输出结果hθ(x)是一个标量值,类标签y也是标量值。在神经网络中,二分类也是如此。但对于多(K)分类来说,输出结果hθ(x)是K维向量,所以我们训练集中的类标签y也得转化为K维向量。神经网络的一般化代价函数:
J(Θ)=−1m∑t=1m∑k=1K[y(t)k log(hΘ(x(t))k)+(1−y(t)k) log(1−hΘ(x(t))k)]+λ2m∑l=1L−1∑i=1sl∑j=1sl+1(Θ(l)j,i)2
如前文所说,神经网络实现二分类用 1 个输出单元即可。为了一般化,我们用 2 个输出单元(K=2)表示二分类。虽然神经网络的代价函数看起来非常复杂,但其背后的思想还是一样的:我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大。
注意:hΘ(x)中下标Θ表示所有的权重矩阵,表示数据 x 做每一层权重矩阵的作用下达到最后一层输出,该值就是最后一层的输出结果。第一项中,里层的循环 k 循环输出层的 k 个输出值,外层循环 t 循环所有的数据,y(i)k表示类标签向量y(i)中第k个元素。第二项是正则化项,它排除了每一层权重矩阵的第一列(θ0不进行正则化)并计算每一层权重矩阵其他元素的元素之和,里层的循环 j 循环所有的行(j=1代表权重矩阵第一行),循环 i 循环所有的列(i=1代表权重矩阵第二列。i=0代表第一列,相当于回归问题中的θ0),外层的求和循环层数 1 到 L-1。
用作业中的编程题举个例子:输入数据X大小为 5000*400,类别y为0、1、2、3、4、5、6、7、8、9、10(10代表0)10个类别。神经网络共有3层,输入层有400个神经元(不包括偏置单元),中间层有25个神经元(不包括偏置单元),输出层有10个神经元。所以输入层的权重矩阵Θ1大小为25*401,中间层的权重矩阵Θ2大小为10*26。

该网络的代价函数如下,其中m=5000,K=10,而且不对θ0进行惩罚。
J(Θ)=−1m∑t=1m∑k=1K[y(t)k log(hΘ(x(t))k)+(1−y(t)k) log(1−hΘ(x(t))k)]+λ2m[∑j=125∑i=1400(Θ(1)j,i)2+∑j=110∑i=125(Θ(2)j,i)2]
9.2 反向传播算法
参考视频:9 - 2 - Backpropagation Algorithm (12 min).mkv
之前在计算神经网络输出层结果时我们采用了一种正向传播算法,我们从第一层开始正向一层一层进行计算,直到得到输出层的hθ(x)。
现在,为了计算代价函数的偏导数∂∂Θ(l)j,iJ(Θ),我们需要采用一种反向传播算法。反向传播算法是神经网络中的术语,它就像线性回归和逻辑回归中的梯度下降一样,用来最小化神经网络的代价函数。
反向传播算法的大致过程为:首先计算最后一层的误差,然后再一层一层反向求出各层的误差,进而调节权重矩阵,找到使误差函数达到一个极小值的权重矩阵Θ。因为要计算最后一层的误差,所以需要借助正向传播算法计算初每一层的输出值!
我们用一条数据 (x, y) 开始讲起。下图为正向传播算法和一个四层的神经网络,以此为例。


输出层的误差是δ(4)=a(4)−y。第 l 层的误差是δ(l),且δ(l)=a(l)−y(l)。第 l 层第 j 个结点的误差是δ(l)j,且δ(l)j=a(l)j−y(l)j。由当前层的误差计算前一层的误差:δ(l)=((Θ(l))Tδ(l+1)) .∗ g′(z(l)),其中g′(z(l))=a(l) .∗ (1−a(l))。数学证明参考:Coursera机器学习笔记 第5周 第九章 神经网络 相关数学公式证明
一条数据的反向传播如下:
- 计算输出层的误差:δ(4)=a(4)−y
- 计算第三层的误差:δ(3)=((Θ(3))Tδ(4)) .∗ a(3) .∗ (1−a(3))
- 计算第二层的误差:δ(2)=((Θ(2))Tδ(3)) .∗ a(2) .∗ (1−a(2))。第一层是输入变量,不存在误差,所以到第二层即可。
- 为什么计算每一层的误差 δ ?因为经过一系列复杂的求导后,我们通过 δ 可以计算代价函数对每一层权重矩阵的每一个参数的偏导数(无正则化处理或λ=0):∂∂Θ(l)j,iJ(Θ)=δ(l+1)ja(l)i,其中每个元素都是一个实数!
现在,我们使用整个数据集来说明反向传播算法,每一条数据的处理过程与上面的 (x,y) 相同。伪代码如下:
Training set: {(x(1),y(1))⋯(x(m),y(m))}
Set Δ(l)i,j (for all l,i,j) // 累加m条数据的偏导数,其形状大小和Θ(l)相同
Set D(l)i,j (for all l,i,j) // 得到最终的偏导数
For t = 1 to m
-
Set a(1) = x(t)
-
Perform forward propagation to compute a(l) for l=2,3,…,L
-
Using y(i), compute δ(l)=a(l)−y(l)
-
Compute δ(L−1),δ(L−2),...,δ(2) using δ(l)=((Θ(l))Tδ(l+1)) .∗ a(l) .∗ (1−a(l))
-
Δ(l)ij:=Δ(l)ij+a(l)jδ(l+1)i, or with vectorization, Δ(l):=Δ(l)+δ(l+1)(a(l))T
End
D(l)i,j:=1mΔ(l)i,j+λΘ(j)ij if j≠0
D(l)i,j:=1mΔ(l)i,jif j=0
所以我们最终的偏导数矩阵结果为:∂∂Θ(l)ijJ(Θ)=D(l)ij,而且其中的每个元素都是一个实数!
另外在Matlab/Octave中,如果我们要使用fminuc这样的优化算法来求解权重矩阵,我们需要将矩阵展开为向量,然后利用优化算法求出最优解后再重新转化为权重矩阵。
9.3 反向传播算法的直观理解
参考视频:9 - 3 - Backpropagation Intuition (13 min).mkv
反向传播算法需要很多复杂的步骤,以致于不知道应该怎么使用。感觉反向传播算法就像一个黑箱,里面充满了复杂的东西。有这样的感觉是正常的,相比于线性回归算法和逻辑回归算法而言,反向传播在数学上一点也不简洁。我将这些复杂的步骤梳理了一遍,希望能让你有一个直观的理解,另外做编程练习作业或多或少能帮助你。
以下图中的神经网络为例:

还是从正向传播开始,只用一条训练数据(x(i),y(i))。正向传播就是从训练数据(x(i),y(i)),依次计算第二层z(2)1,z(2)2,a(2)1,a(2)2,第三层z(3)1,z(3)2,a(3)1,a(3)2,直到最后一层z(4)1,a(4)1。
神经网络的一般化代价函数为:
J(Θ)=−1m∑t=1m∑k=1K[y(t)k log(hΘ(x(t))k)+(1−y(t)k) log(1−hΘ(x(t))k)]+λ2m∑l=1L−1∑i=1sl∑j=1sl+1(Θ(l)j,i)2
对一条训练数据来说,并忽略正则化,代价函数变为(下图中的公式错了):
Cost(x)=−[y log(hΘ(x))+(1−y) log(1−hΘ(x))]
记住:hΘ(x)=a(4)。代价函数对z(4)1求导得:∂∂z(4)1Cost(x)=δ(4)1。另外δ(4)1是a(4)1的误差(δ(4)1=a(4)1−y(4)1),误差δ(4)恰好是代价函数对z(4)的偏导数!

反向传播中的误差计算:
- 最后一层,δ(4)1=a(4)1−y(i)(图片中右上角公式错了)
- 第三层,δ(3)1=Θ(3)11∗δ(4)1,δ(3)2=Θ(3)12∗δ(4)1
- 第二层,δ(2)1=Θ(2)11∗δ(3)1+Θ(2)21∗δ(3)2,δ(2)2=Θ(2)12∗δ(3)1+Θ(2)22∗δ(3)2(就是加权求和)
资料:
- 数学证明参考:Coursera机器学习笔记 第5周 第九章 神经网络 相关数学公式证明