前言
传统机器学习不足
【例】预测房价,不同的房子有上百个特征
如果要包含所有的二次项(即使只是二次),最终也有很多项, 每个参数都有 n 个变量,那二次项数量将会是 n^2 /2 级别的量级,模型很可能过拟合,运算量也很大。但如果减少了相关变量,模型的拟合效果又不佳。

由此可见,对于很复杂的数据,特征很多,非线性建模非常复杂。

上图假设一张汽车图片是 50x50 的像素,那么就有 2500 个像素点,我们根据每个像素点的亮度来进行汽车图像识别,如果是多项式方程,那将会有三百万(2500x2500/2)的特征,如此大的计算量是完不成的。
神经网络背景
人的大脑天然的计算机,人们就思考能不能模拟大脑的行为来进行学习和处理数据。我们知道人的大脑处理数据都是用的同一种方式,比如将视觉信号接入听觉皮层你的耳朵将学会看,这就意味着我们不需要写成千上万的程序,只需一种程序即可处理所有的数据。


模型表示
神经网络是一种受到人类大脑神经元结构启发而设计的人工智能模型。它是由许多简单的单元(神经元)组成的网络,这些单元相互连接并通过调整连接权重来学习输入数据的特征和模式。
由下图人脑的神经元结构可以知道,树突:输入 轴突:输出

人们根据上述结构仿造了神经元的结构:

一组神经元连接组合在一起:
- 输入层:输入特征
- 隐藏层:函数运算
- 输出层:输出最终计算结果

【例】具体计算如下图所示,隐藏层的神经元等于输入层的所有神经元乘权重矩阵后的函数运算结果。


【例】下面是一个简化的示意图,展示了一个具有三层的神经网络,并标注了连接相邻两层的权重矩阵的维度:
o1 o2 o3 # 第 1 层(输入层)有 3 个神经元
\ | /
o1 # 第 2 层(隐藏层)有 1 个神经元
/ | \
o1 o2 o3 # 第 3 层(输出层)有 3 个神经元
连接第 1 层和第 2 层的权重矩阵维度:1x4
连接第 2 层和第 3 层的权重矩阵维度:3x2
代价函数
【例】下面是一个四分类的例子
如果是一个二分类问题,那么输出层只包含一个神经元,并且神经元的值为 0 or 1
如果是一个多分类问题,那么输出层将包含多个神经元,并且神经元的值是一个多维向量,如下图所示

【问】如何计算上述逻辑回归问题的损失函数呢?
按照之前的逻辑回归的损失函数带正则化的式子是对一个输出进行计算损失,现在我们要对 K 维输出求损失和,并且对所有权重系数进行惩罚求和。

反向传播
这里结合李宏毅第 14 节课程和吴恩达机器学习的视频一起理解。
【(强推)李宏毅2021/2022春机器学习课程】 (选修)To Learn More - 反向传播(Backpropagation)_哔哩哔哩_bilibili
为了训练我们的模型,需要让代价函数的值减小,从而不断减少损失找出模型的解。
线性回归中我们很轻易的就能更新参数进行梯度下降,但是在神经网络中我们有非常多的参数,vector 是上百万维的,为了有效的计算梯度,我们使用反向传播。

在此之前我们要先了解一下 Chain Rule 链式法则微分

如下图所示:总损失=所有参数的损失和 对左边的式子进行偏微分得到右边的式子
总损失对某一个参数的偏微分= ∑一笔数据对参数的偏微分
我们只需考虑一个 neruo 然后对他们求和即可

接下来让我们看看一个 neruo 中的偏微分怎么求。
如下图所示:乘上权重 w 之后的值 为 z,求 loss 对 w 偏微分使用到链式法则

z 对 w 的微分计算方法如下:

C 对 z 的微分计算方法如下:按照链式法则

a 代表经过激活函数之后的输出,微分结果也就是:

缩略图如下:通过反向传播计算得到最后的 C 对 z 的微分从而进行梯度下降。

反向传播过程如下图所示:建反向的神经网络,要先算出前向传播之后才能算出反向传播(我们要先得到输出才能根据输出进行反向计算,前向传播的输出值是反向传播的输入源)

总览:a 代表上一个 neruo 的输出也就是未经过权重处理的原始值,z 代表经过权重处理之后的值也就是下一个 neruo 的输入值。

下面是吴恩达机器学习的 PPT:

梯度检测
梯度检验,有可能出 bug 的情况下损失函数值比正常情况多一个量级
梯度检测(Gradient Checking)是一种用于验证数值计算梯度(数值梯度)与解析计算梯度(解析梯度)是否一致的方法。在训练神经网络等模型时,梯度检测可以帮助我们确保实现的反向传播算法正确地计算梯度,从而提高模型的稳定性和可靠性。
梯度检测的基本思想是利用数值微分 的方式来近似计算解析梯度,然后比较数值梯度和解析梯度之间的差异。如果它们之间的差异很小,则说明反向传播算法实现正确;如果差异较大,则需要检查反向传播算法的实现是否有误。
梯度检测是一种用于调试和验证反向传播算法实现是否正确 的重要工具,在实践中通常会在实现模型时使用。值得注意的是,梯度检测会增加计算成本,因此通常在调试阶段才会使用,一旦确认反向传播算法实现正确,就可以关闭梯度检测以提高训练速度。

随机初始化
对称权重
如果初始化所有参数为零,则每个神经元都将计算出相同的梯度 ,并且在进行梯度更新时,它们会按照相同的步长 朝着相同的方向移动,这就导致了对称性的问题。在这种情况下,即使网络具有多个隐藏层,每个隐藏层中的神经元也会具有相同的权重,这等效于一个更浅层的网络,无法充分利用神经网络的深层结构来学习复杂的特征。
为了避免这种情况,需要对参数进行随机初始化。常见的做法是采用均匀分布或者高斯分布来随机初始化参数,使得每个神经元都拥有不同的初始权重,从而打破对称性,促进网络的有效训练和学习。初始化参数时,通常会根据网络的规模和激活函数的特性选择适当的分布和范围。假设我们有一个简单的神经网络,包含一个输入层、两个隐藏层和一个输出层,每个隐藏层有两个神经元。我们使用线性求和作为激活函数。
神经网络的结构如下:
- 输入层:x1, x2(输入特征)
- 第一个隐藏层:h11, h12(隐藏层1的输出)
- 第二个隐藏层:h21, h22(隐藏层2的输出)
- 输出层:y(输出)
每个隐藏层和输出层的计算公式为:
h11 = w11x1 + w12x2
h12 = w21x1 + w22x2
h21 = w31h11 + w32h12
h22 = w41h11 + w42h12
y = w51h21 + w52h22
其中,wij 表示连接的权重。
如果所有的权重初始化为相同的值,比如0,那么在进行前向传播计算时,每个隐藏层和输出层的值都将相同,因为权重相同导致的输出值相同。
现在,我们来看看在这种情况下反向传播的梯度变化和输出值。假设损失函数为均方误差(MSE),即:
J = 1/2(ytrue - y)^2
在反向传播过程中,梯度的计算如下:
- 计算输出层的误差项:
δy = (∂J/∂y) = y - ytrue
- 计算隐藏层2的误差项:
δh21 = (∂J/∂h21) = δy * (∂y/∂h21)
δh22 = (∂J/∂h22) = δy * (∂y/∂h22)
- 计算隐藏层1的误差项:
δh11 = (∂J/∂h11) = δh21 (∂h21/∂h11) + δh22 (∂h22/∂h11)
δh12 = (∂J/∂h12) = δh21 (∂h21/∂h12) + δh22 (∂h22/∂h12)
- 计算输入层的误差项:
δx1 = δh11 (∂h11/∂x1) + δh12 (∂h12/∂x1)
δx2 = δh11 (∂h11/∂x2) + δh12 (∂h12/∂x2)
在这种情况下,所有神经元的误差项都相同,因为它们所计算的梯度都受到相同的误差项影响,并且在反向传播过程中误差会被传播到更浅层的神经元。这导致了网络的权重更新出现问题,无法学习到不同的特征表示。因此,初始化所有参数为相同的值会导致对称权重的问题。
组合
最好一层隐藏层,如果是多层应该有同样的单元数(单元数越多越好,至少大于等于输入层)

步骤
- 构建网络,初始化权重
- 实现前向传播
- 计算代价函数
- 反向传播计算偏导数
- 梯度检测比较数值梯度和计算梯度
- 通过梯度下降或更优方法最小化代价函数
