9.神经网络学习

9 神经网络学习

9.1 代价函数

分类问题:二元分类、多分类

我们用L表示总层数,$s_l$表示第$l$层的神经元个数,常用$s_l$或$K$表示最后一层神经元的个数。

在二元分类中,输出$y=0 or 1\in\mathbb{R}$,$s_l=K=1$.在多元分类中,输出$y\in\mathbb{R}^K$, $s_l=K$, $(K \ge3)$.

image-20250113140327471

神经网络中我们的代价函数与逻辑回归中的代价函数类似,我们的输出$h_\Theta(x)\in\mathbb{R}^K$,其中$(h_\Theta(x))_i$表示输出向量中第i项的值。

首先前面的项多了$\sum_{k=1}^{K}$表示将输出层每个神经元的预测值与真实值之间的距离加和,后面项是规格化项,这里通常规定不计算每一层的$\theta_0$,然后将每一层的$\theta$矩阵平方加和。即所有参数的平方和。(计算$\theta_0$也是可以的,但通常不这样做)

image-20250113165449147

9.2 反向传播算法

为了执行梯度下降算法,我们需要计算$J(\Theta)$和$J(\Theta)$对各个参数$\Theta_{ij}^{(l)}$的偏导。

假设我们的网络如右图,只有一个样本$(x,y)$时我们先进行前向传播,计算出以下:

image-20250113171928633

定义$\delta_j^{(l)}$表示第l层第j个节点的误差。则$\delta_j^{(4)}=(h_\Theta(x))_j-y_j=a_j^{(4)}-y_j$。我们也可以写成向量的形式$\delta^{(4)}=a^{(4)}-y,\delta^{(4)},a^{(4)},y\in\mathbb{R}^K$,第3层的误差项为$\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}.g’(z^{(3)})$,其中$g’(z^{(3)})$是sigmoid函数的导数,经推导sigmoid函数导数有一个特点:$g’(z^{(3)})=a^{(3)}.(1-a^{(3)})$。

同理$\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g’(z^{(2)})$, $g’(z^{(2)})$类似.注意第一层没有误差项,因为我们不想改变我们的输入$x$.

当我们忽略正则化项,即当$\lambda=0$时。经推导,$J(\Theta)$对各矩阵参数$\Theta_{ij}^{(l)}$的偏导为$a_j^{(l)}\delta_i^{(l+1)}$.

image-20250113171510938

下面是反向传播算法的伪代码。当有m个样本时,变量i遍历每个样本,令$a^{(1)}=x^{(i)}$,然后执行前向传播计算出$a^{(l)}$,再使用$y^{(i)}$计算出$\delta^{(L)}$,然后进行反向传播计算出$\delta^{(L-1)},\delta^{(L-2)}…\delta^{(2)}$. 使用$\Delta_{ij}^{(l)}$累加各偏导数项$a_j^{(l)}\delta_i^{(l+1)}$,写成向量的形式即为$\Delta^{(l)}:=\Delta^{(l)}+\delta^{(l+1)}(a^{(l)})^T$.

image-20250114192316746

当$j=0$时没有偏差项。计算代价函数的偏导数,公式如下:

image-20250114194028905

9.3 理解反向传播

当只有一个输出单元时,前向传播的过程:

image-20250114201012101

当只考虑一个样本i时。我们简化代价函数,去掉正则化项,得到 cost(i):

image-20250114201230325

反向传播的过程:$\delta^{(4)}_1=y^{(i)}-a^{(i)}1$。$\delta^{(3)}2=\Theta{12}^{(3)}\delta_1^{(4)},\delta^{(2)}2=\Theta{12}^{(2)}\delta_1^{(3)}+\Theta{22}^{(2)}\delta_2^{(3)}$.

即对于每一层来说,$\delta$分量都等于后面一层所有的$\delta$的加权和,其中权值就是参数$\Theta$:$\delta_j^{(l)}=\sum_{k=1}^{s_{(l+1)}-1}\Theta_{kj}^{(l)}\delta_k^{(l+1)}$

image-20250114195858686

9.4 展开参数

使用矩阵表达式的好处:更方便进行前向和反向传播;使用向量表达式的好处:优化算法通常需要将参数展开成长向量的形式。

image-20250205193027431

9.5 梯度检验

在反向传播中,因为其复杂性通常会产生一些bug,虽然代价函数$J(\theta)$也在下降,但最终的代价可能比在没有bug的情况下高出一个量级,通常使用梯度检验来解决这个问题。

我们可以在$\theta$点两侧加减$\epsilon$的距离,根据斜率估计出$\theta$点的导数。$\epsilon$取很小的值。

image-20250205194000939

当有多个参数时,例如当$\theta \in \mathbb{R}^n$时,长度为n的向量。我们可以分别在各参数上加减$\epsilon$,来计算代价函数对各参数的偏导数。

image-20250205194407308

算法实现如下:对每个参数分别计算偏导得到gradApprox,再与反向传播计算得到的偏导Dvec进行比较,当两者较为接近时,说明反向传播的实现是正确的。

image-20250205195155303

应用步骤:1.先反向传播计算DVec 2.数值估计计算gradApprox 3.确保两者数值差距较小,否则说明反向传播算法有错误。

梯度检验计算量大,准确性高;反向传播计算速度更快,但实现复杂可能出现问题。所以当我们确定下来反向传播没问题时,正式训练之前需要关闭梯度检验,否则训练过程会很慢。(只在测试时进行梯度检验)

image-20250205195717287

9.6 随机初始化

在之前的逻辑回归中,我们将参数$\theta$全部初始化为0。在神经网络中,此方法不可行:如果第一层参数$\theta$都相同(不管是不是0),意味着第二层的所有激活单元的值会完全相同。因为初始权重相等,权重更新值也相等。这意味着最后的逻辑回归单元只能得到一个特征。

image-20250205201534850

为了解决这个问题,在神经网络中通常将参数初始化为$[-\epsilon,\epsilon]$之间的随机值。参考代码如下:

image-20250205202431990

9.7 综合起来

神经网络训练的步骤如下:

0.选择网络结构:确定输入单元数、输出单元数、隐藏层个数、每个隐藏层的单元数。

输入单元数通常等于特征向量$x$的维度。输出单元数通常等于待分类的类别数。隐藏层数:比较合理的是1层隐藏层,或者多于1层且每层的单元数相等。隐藏层的单元数通常等于输入单元数或大几倍。

image-20250205203213254

1.随机初始化参数

2.应用前向传播计算出$h_\theta(x^{(i)})$

3.计算代价函数$J(\Theta)$

4.应用反向传播计算偏导数

5.利用梯度检测方法检验这些偏导数:检验通过后关闭

6.使用优化算法来最小代价函数:反向传播计算出偏导数,使用优化算法最小化代价函数$J(\Theta)$.

image-20250205204122375 image-20250205204904433

代价函数不是一个凸函数,我们使用优化算法通常可以到达一个局部最小值点。

反向传播算法计算出梯度下降的方向,优化算法让代价函数沿着这个方向一点点的下降。

image-20250205205656384

9.神经网络学习
http://example.com/2025/02/16/9 神经网络学习/
作者
Dongxuan Liu
发布于
2025年2月16日
许可协议