吴恩达机器学习系列课程笔记——第九章:神经网络的学习(Neural Networks: Learning)
时间:2022-10-29 18:00:00
9.1 代价函数
https://www.bilibili.com/video/BV164411b7dx?p=50
首先,介绍一些便于以后讨论的新标记方法:
假设神经网络的训练样本有 m m m每个包含一组输入 x x x一组输出信号 y y y, L L L表示神经网络层数, S L S_L SL表示每层的neuron个数( S l S_l Sl表示输出层神经元数), S L S_L SL代表最后一层处理单元的数量。
将神经网络的分类定义为两种情况:二类和多类,
二类分类: S L = 0 , y = 0 o r 1 S_L = 0,y = 0 or 1 SL=0,y=0or1表示哪一类;
K K K类分类: S L = k , y i = 1 S_L = k,y_i = 1 SL=k,yi=1表示分到第 i i i类;( k k k>2)
我们回顾逻辑回归问题中我们的代价函数为:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量 y y y,y的取值是一个实数,但是在神经网络中,我们可以有很多输出变量,我们的 h θ ( x ) h_θ(x) hθ(x)是一个维度为 K K K的向量,例如[0,0,0,1],并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出 K K K个预测,基本上我们可以利用循环,对每一行特征都预测 K K K个不同结果,然后在利用循环在 K K K个预测中选择可能性最高的一个,将其与 y y y中的实际数据进行比较。
也就是求出的结果与y([1,0,0,0]等)比较,看接近哪个。
正则化的那一项只是排除了每一层后,每一层的 矩阵的和。最里层的循环循环所有的行(由 s l s_l sl +1 层的激活单元数决定),循环则循环所有的列,由该层( s l s_l sl层)的激活单元数所决定。即: h θ ( x ) h_\theta(x) hθ(x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。(至于为什么只有平方项,可以回到7-2章节中,类比二类分类的情况下,为什么选择平方项和)
9.2 反向传播算法
https://www.bilibili.com/video/BV164411b7dx?p=51
之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的。
现在,为了计算代价函数的偏导数
我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法。
假设我们的训练集只有一个样本 ( x ( 1 ) , y ( 1 ) ) (x^{(1)},y^{(1)}) (x(1),y(1)),我们的神经网络是一个四层的神经网络,其中
, K = 4 , S L = 4 , L = 4 K=4,S_L=4,L=4 K=4,SL=4,L=4:
前向传播算法:
我们从最后一层的误差开始计算,误差是激活单元的预测( a ( 4 ) a^{(4)} a(4))与实际值( y k y^k yk)之间的误差,( k = 1 : k k=1 : k k=1:k)。
我们用来 δ δ δ表示误差,则: δ ( 4 ) = a ( 4 ) − y δ^{(4)} = a^{(4)} - y δ(4)=a(4)−y 我们利用这个误差值来计算前一层的误差: δ ( 3 ) = ( θ ( 3 ) ) T δ ( 4 ) ∗ g ′ ( z ( 3 ) ) δ^{(3)}=(θ^{(3)})^Tδ^{(4)} * g'(z^{(3)}) δ(3)=(θ(3))Tδ(4)∗g′(z(3))
其中 g ′ ( z ( 3 ) ) g'(z^{(3)}) g′(z(3))是 S S S 形函数的导数, g ′ ( z ( 3 ) ) = a ( 3 ) ∗ ( 1 − a ( 3 ) ) g'(z^{(3)})=a{(3)}*(1-a^{(3)}) g′(z(3))=a(3)∗(1−a(3))。(这个等式可以通过不严格的条件下证明出)
而 ( θ ( 3 ) ) T δ ( 4 ) (θ^{(3)})^Tδ^{(4)} (θ(3))Tδ(4)则是权重导致的误差的和。(我们用来 δ δ δ表示误差,则: δ ( 4 ) = a ( 4 ) − y δ^{(4)} = a^{(4)} - y δ(4)=a(4)−y)
下一步是继续计算第二层的误差: δ ( 2 ) = ( Θ ( 2 ) ) T δ ( 3 ) ∗ g ′ ( z ( 2 ) ) \delta^{(2)}=(\Theta^{(2)})^{T}\delta^{(3)}\ast g'(z^{(2)}) δ(2)=(Θ(2))Tδ(3)∗g′(z(2)) 因为第一层是输入变量,不存在误差。
我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设,即我们不做任何正则化处理时有:
重要的是清楚地知道上面式子中上下标的含义:
l l l 代表目前所计算的是第几层。
j j j 代表目前计算层中的激活单元的下标,也将是下一层的第个输入变量的下标。
i i i 代表下一层中误差单元的下标,是受到权重矩阵中第行影响的下一层中的误差单元的下标。
如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用 Δ i j ( l ) Δ_{ij}^{(l)} Δij(l)来表示这个误差矩阵。第 l l l 层的第 i i i 个激活单元受到第 j j j 个参数影响而导致的误差。
我们的算法表示为:
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
在求出了之后,我们便可以计算代价函数的偏导数了,计算方法如下:
D i j ( l ) : = 1 m Δ i j ( l ) + λ Θ i j ( l ) ; i f j ≠ 0 D_{ij}^{(l)} :=\frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)} ; if j≠0 Dij(l):=m1Δij(l)+λΘij(l);ifj=0
D i j ( l ) : = 1 m Δ i j ( l ) ; i f j ≠ 0 D_{ij}^{(l)} :=\frac{1}{m}\Delta_{ij}^{(l)}; if j≠0 Dij(l):=m1Δij(l);ifj=0
在Octave 中,如果我们要使用 fminuc
这样的优化算法来求解求出权重矩阵,我们需要将矩阵首先展开成为向量,在利用算法求出最优解后再重新转换回矩阵。
假设我们有三个权重矩阵,Theta1、Theta2 和 Theta3,尺寸分别为 10 * 11,10 * 11 和1 * 11,下面的代码可以实现这样的转换:
thetaVec = [Theta1(:) ; Theta2(:) ; Theta3(:)]
...optimization using functions like fminuc...
Theta1 = reshape(thetaVec(1:110, 10, 11);
Theta2 = reshape(thetaVec(111:220, 10, 11);
Theta1 = reshape(thetaVec(221:231, 1, 11);
9.3 反向传播算法的直观理解
https://www.bilibili.com/video/BV164411b7dx?p=52
在上一段视频中,我们介绍了反向传播算法,对很多人来说,当第一次看到这种算法时,第一印象通常是,这个算法需要那么多繁杂的步骤,简直是太复杂了,实在不知道这些步骤,到底应该如何合在一起使用。就好像一个黑箱,里面充满了复杂的步骤。如果你对反向传播算法也有这种感受的话,这其实是正常的,相比于线性回归算法和逻辑回归算法而言,从数学的角度上讲,反向传播算法似乎并不简洁,对于反向传播这种算法,做过编程练习的同学应该可以感受到这些练习或多或少能帮助你,将这些复杂的步骤梳理了一遍,巩固了反向传播算法具体是如何实现的,这样你才能自己掌握这种算法。
在这节中,深入地讨论一下反向传播算法的这些复杂的步骤,并且希望给你一个更加全面直观的感受,理解这些步骤究竟是在做什么,也希望通过这节,你能理解,它至少还是一个合理的算法。为了更好地理解反向传播算法,我们再来仔细研究一下前向传播的原理:
前向传播算法:
反向传播算法做的是:
感悟:上图中的 δ ( l ) j = " e r r o r " o f c o s t f o r a ( l ) j ( u n i t j i n l a y e r l ) \delta^{(l)}{j}="error" \ of cost \ for \ a^{(l)}{j} \ (unit \ j \ in \ layer \ l) δ(l)j="error" ofcost for a(l)j (unit j in layer l) 理解如下:
δ j ( l ) \delta^{(l)}_{j} δj(l) 相当于是第 l l l 层的第 j j j 单元中得到的激活项的“误差”,即”正确“的 a j ( l ) a^{(l)}_{j} aj(l) 与计算得到的差。