[深度之眼机器学习训练营第四期]神经网络之参数学习

Posted littleorange

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[深度之眼机器学习训练营第四期]神经网络之参数学习相关的知识,希望对你有一定的参考价值。

损失函数

为了学习神经网络中的参数,我们要为神经网络模型定义损失函数。回想一下,逻辑回归可以将数据分成正例和负例两类,因此它的损失函数为:
[ J( heta) = -frac{1}{n}sum_{i=1}^n left[y^{(i)}log(h_ heta(x^{(i)}) ) + (1-y^{(i)})log(1-h_ heta(x^{(i)})) ight] + frac{lambda}{2n}sum_{j=1}^n heta^2_j ]

而对于神经网络模型,其输出层可能有多个神经元,因此我们需要在逻辑回归损失函数的基础上考虑多个类别的问题。假设模型共有(K)个输出层神经元,那么其损失函数为:

[ egin{gathered} J(Theta) = - frac{1}{n} sum_{i=1}^n sum_{k=1}^K left[y^{(i)}_k log ((h_Theta (x^{(i)}))_k) + (1 - y^{(i)}_k)log (1 - (h_Theta(x^{(i)}))_k) ight] + frac{lambda}{2n}sum_{l=1}^{L-1} sum_{i=1}^{s_l} sum_{j=1}^{s_{l+1}} ( Theta_{j,i}^{(l)})^2end{gathered} ]

其中(L)表示神经网络模型的层数,(s_{l})则表示每一层神经元的数量。

误差反向传播算法

神经网络的参数学习过程是通过误差反向传播算法与梯度下降法(或其他优化算法)完成的,其中误差反向传播算法用来计算每层参数的梯度,梯度下降法用来更新每一层的参数。在介绍误差反向传播算法之前,我们先回顾一下前向传播的过程。

假设我们有一个4层的神经网络,每层的参数用(Theta^{(l)})表示,激活函数使用sigmoid函数,那么它的前向传播进行预测过程如下:
[ egin{aligned} a^{(1)} &= x z^{(2)} &= Theta^{(1)}a^{(1)} a^{(2)} &=g(z^{(1)}) z^{(3)} &= Theta^{(2)}a^{(1)} a^{(3)} &=g(z^{(3)}) z^{(4)} &= Theta^{(3)}a^{(3)} h_{Theta}(x)&=a^{(4)} =g(z^{(4)})\end{aligned} ]

误差反向传播,顾名思义,就是误差沿着神经网络从最后一层传递到第一层。我们用(delta^{(l)})表示每层的误差。首先,我们先来看一下最后一层的误差是如何计算的:

[ egin{aligned} delta^{(4)} = frac{partial J}{partial z^{(4)}} &= frac{partial}{partial z^{(4)}}left[-ylog(h_{Theta}(x)) -(1-y)log(1-h_{Theta}(x)) ight] &= frac{partial}{partial z^{(4)}}[-ylog(g(z^{(4)}))-(1-y)log(1-g(z^{(4)}))] &= -yfrac{1}{g(z^{(4)})}g(z^{(4)})(1-g(z^{(4)}))-(1-y)frac{1}{1-g(z^{(4)})}(-1)g(z^{(4)})(1-g(z^{(4)})) &= -y(1-g(z^{(4)})) +(1-y)g(z^{(4)}) &= g(z^{(4)}) -y &= a^{(4)} - y end{aligned} ]

通过求导计算出第4层的误差后,我们就可以通过链式法则计算前面几层的误差,这里给出了第3层的误差计算过程,其中(circ)表示矩阵的Hadamard积:

[ egin{aligned} delta^{(3)} = frac{partial J}{partial z^{(3)}} &=frac{partial J}{partial z^{(4)}} frac{partial z^{(4)}}{partial z^{(3)}} &= frac{partial J}{partial z^{(4)}} frac{partial z^{(4)}}{partial a^{(3)}}frac{partial a^{(3)}}{partial z^{(3)}} &=left(left(Theta^{(3)} ight)^T delta^{(4)} ight) circ g'(z^{(3)}) end{aligned} ]

其中sigmoid函数的导数(g'(cdot))为:
[ g'(z^{(l)}) = a^{(l)} circ (1-a^{(l)}) ]

通过链式法则和下面的公式,我们可以按照顺序求出(delta^{(L-1)},delta^{(L-2)},cdots,delta^{(2)})
[ delta^{(l)} = left(left(Theta^{(l)} ight)^T delta^{(l+1)} ight) circ g'(z^{(l)}) quad 2 le l le L-1 ]

在求解出每一层的梯度后,我们就可以使用不同的优化算法,比如梯度下降,来更新神经网络模型的参数了。

随机初始化

在训练神经网络的过程中,参数初始化方式非常关键。将所有的参数初始化为0并不是一种好方法,那样在反向传播过程中所有的神经元就会重复地更新相同的值。一般来说,我们通常使用随机初始化方法。

以上是关于[深度之眼机器学习训练营第四期]神经网络之参数学习的主要内容,如果未能解决你的问题,请参考以下文章

[深度之眼机器学习训练营第四期]对数几率回归

[深度之眼机器学习训练营第四期]过拟合与正则化

深度之眼PyTorch训练营(第二期)笔记目录(已完结)

深度之眼GNN图神经网络核心培养计划视频代码齐全

深度之眼PyTorch训练营第二期---14正则化

详解凸优化图神经网络强化学习贝叶斯方法等四大主题