机器学习系列(11)| 反向传播

职场   2024-10-29 14:55   四川  
开始之前,我们需要稍微回顾一下上一篇讲的梯度下降算法。梯度下降是一种优化算法,用于更新模型参数(如权重和偏置),目的是最小化损失函数。它通过计算损失函数关于参数的导数(即梯度),然后按照梯度的方向调整参数,使损失函数逐步减小。

而今天要学习的反向传播则是一种训练神经网络的算法,也通过调整模型的参数,来更好地拟合数据。它的核心思想是通过计算损失函数相对于每个参数的导数,来更新神经网络中的权重和偏置。初次学习这个算法,感觉它和梯度下降还挺像的对不对?其实反向传播可以看作是梯度下降计算的一部分:反向传播负责计算梯度,梯度下降负责利用这些梯度来更新参数。两者的区别就是它们的目的不同:梯度下降是为了更新模型的权重和偏置;反向传播是为了在神经网络中获取损失函数关于每一层参数的导数(即每一层神经网络权重的梯度),为梯度下降提供依据。
为了更好地理解,这里再铺垫一点神经网络(Neural Network)的知识。我们小学二年级学过:神经元是人脑中的基本功能单位,由树突细胞体轴突突触四个主要部分组成。树突负责接收来自其他神经元的信号,类似于神经网络中的输入层,它将外部输入数据传递到网络中,供后续处理;细胞体对接收到的信号进行处理、整合,类似于在神经网络中,每个节点会对输入特征进行加权求和,并通过激活函数处理,决定是否激活该节点;当信号强度达到阈值时,轴突负责将处理后的信号传递给其他神经元。在神经网络中,层间的连接权重和数据传递就可以类比于轴突的信号传递功能。激活后,每个神经元的输出通过“轴突”传递到下一层的节点;突触在生物神经元之间起到桥梁作用,负责在神经元之间传递信息。类似于神经网络中的“权重”决定了不同节点之间连接的强度。每个神经网络都是由多个神经元组成的,于是形成了下面这张复杂的深层神经网络图:

图1

为了更好地理解,下面以一个单变量输入的神经网络来举例:众所周知,函数z=w*x+b在二维坐标轴中是一条直线,那么对于一个随机点,我们如何判断它是否在直线上呢?

图2

一般思路是构造一个判断函数即可:f(x)=z-(w*x+b),如果f(x)=0,则判断点就在函数上示意图如下:

图3

有了这个例子,从单变量输入,扩展到n维变量输入,二维平面上任意图形是不是就都可以逼近了?因为任意图形都可以分解成无数条线段围成的嘛!

图4

平移到神经网络,原理其实一样,就是通过多个节点的连接和计算来实现非线性模型的组合和输出。图3中的判断函数就是神经网络中常说的激活函数(由于神经网络中的加权和本身只能表示线性关系,而现实世界中的绝大多数问题都是非线性的。所以有时需要引入非线性的激活函数,才能将神经元的输入映射到输出,解决复杂的非线性问题。但对于回归问题,输出层一般不使用激活函数,或者使用线性激活函数,以输出连续的数值)。

图5

以下是神经网络使用反向传播算法的一般过程:
1、前向传播:
输入层接收数据,每个输入X通过权重Wi(连接不同神经元的参数,代表一个神经元输出对另一个神经元输出的影响力)传递到加权和节点。将各个输入值X与对应的权重W相乘后求和,并加上偏置项(可以看作是每个神经元的一个额外输入),即:

得到的z值传递到激活函数f(x) 中,以决定神经元是否激活。常见的激活函数有Sigmoid、ReLU等。在神经网络中,通过激活函数得到的输出值y_pred,就是模型对输入数据的预测值。

2、计算损失:

对于回归问题,我们可以使用均方误差(MSE)损失函数:

L = (y_pred - y)^2 / 2
3、反向传播:
接下来要通过反向传播来重新调整权重,首先从输出层开始,通过链式法则将误差反向传递到每个权重和偏置,计算它们对误差的贡献,从而更新参数:
首先计算损失对于输出的偏导数:
dL/dy_pred = y_pred - y
再计算预测输出相对于加权和z的偏导数(结果取决于激活函数,这里假设使用Sigmoid激活函数):
dy_pred/dz = y_pred * (1-y_pred)

然后,通过链式法则计算损失相对于加权和z的偏导数:

dL/dz = dL/dy_pred * dy_pred/dz

接下来再计算损失相对于每个权重Wi的偏导数:

dL/dWidL/dz * dz/dWi = dL/dz * Xi

最后,对偏置b求导:

dL/db = dL/dz dz/db = dL/dz * 1 = dL/dz

偏置b在神经网络中相当于一个平移量(独立的常数项),它的作用是调整神经元的输出不受输入X的影响。因此在计算反向传播时,加权和相对于b的导数就是1。

4、更新权重和偏置:

有了梯度之后,就可以使用梯度下降法更新权重和偏置,使神经网络向最小化误差的方向调整。更新公式为:

权重更新:Wi = Wi - η * dL/dWi

偏置更新:bias = bias - η * dL/db

其中,η 是学习率,控制更新的步长。

重复以上步骤,通过多次迭代更新权重和偏置,逐渐减少预测误差,就能使模型更准确地拟合数据,使神经网络的输出逐步逼近理想输出。综上,反向传播的核心步骤就是:前向传播计算网络输出,并计算损失函数。再从输出层开始,通过链式法则逐层计算每个参数的梯度。

由于scikit-learn库中没有直接实现反向传播的算法,无法支持自定义网络结构或大规模的深度学习模型。因此,我选择了一个流行的深度学习框架——PyTorch,来构建网络层并训练神经网络,以实现上述案例中的线性回归模型训练和反向传播优化:
import torch
import torch.nn as nn
import torch.optim as optim

# 1. 创建数据
torch.manual_seed(0)  # 设置随机种子,确保每次生成的数据都是一样的
X = torch.rand(100, 1) * 10  # 输入数据,随机生成100个x值,范围在0到10之间
Y = 2 * X + 1 + torch.randn(100, 1) * 2  # 生成对应的y值,根据线性关系y = 2x + 1,并添加一些正态分布的噪声

# 2. 定义模型
# 使用 PyTorch 的 nn.Linear 构建一个简单的线性模型
model = nn.Linear(1, 1)  # 输入和输出都是一维

# 3. 定义损失函数和优化器
criterion = nn.MSELoss()  # 均方误差损失
optimizer = optim.SGD(model.parameters(), lr=0.003)  # 使用随机梯度下降,学习率为0.003

# 4. 训练模型
epochs = 1000  # 训练的轮数
for epoch in range(epochs):
    # 前向传播:计算预测值
    y_pred = model(X)

    # 计算损失
    loss = criterion(y_pred, Y)

    # 反向传播:计算梯度
    optimizer.zero_grad()  # 清零上一步的梯度
    loss.backward()  # 反向传播,计算梯度
    optimizer.step()  # 更新参数

    # 每隔100轮输出一次损失
    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}')

# 5. 查看训练后的参数
print("w = ", model.weight.item())
print("b = ", model.bias.item())

1000轮训练过程如下,每100轮输出一次当前的损失值,可以看出损失值是逐渐收敛的,最后打印出模型的权重 w 和偏置 b与设定的数据生成公式中的参数(2和1)也比较接近:

看似挺简单的对不对?但在实际中,你会遇到很多问题。比如:学习率过大,导致更新步骤时参数发散;模型训练前没有先将特征进行标准化或归一化处理,导致梯度更新不稳定,等等。

另外,神经网络的结构对小样本量的数据集和复杂曲线的拟合效果其实并不太好。如果在训练过程中观察到损失值在达到某一轮次后开始波动或逐渐增大,说明模型可能已经达到了最佳拟合状态,继续训练反而可能导致过拟合。总而言之,需要不断地改进(增加神经网络的层数和神经元数量)、调超参数(调整学习率或迭代次数)才能提高神经网络的拟合效果。我也只学了皮毛,连入门都谈不上,一起努力吧!共勉


感谢大家对机务论坛的支持,关注机务论坛,倾听机务心声!航企优秀的方面必定宣传,不足的地方也必须指出,让领导们重视问题,解决问题,营造更好的机务维修环境。

征稿:
所见所闻,个人感悟,个人成长历程及感人故事。
特别征稿:我师傅的故事!
同时,征集劳动仲裁案例,分享案例,让更多的小伙伴能了解劳动纠纷的解决方式,通过劳动仲裁维护自己的合法权益。




评论区留言,同意的点赞
扫码添加小编微信
匿名爆料

民航机务论坛微信公众平台
改名为:机务论坛
发布最新行业动向 深入解读政策法规
开辟维修工程专栏 交流飞机排故经验
分享前沿技术应用 预测职业发展前景
行业大咖讲经布道 业界专家授业解惑
致力打造一流的民航机务朋友圈----机务论坛
关注机务论坛,倾听机务心声!
投稿邮箱:duanwei0615@163.com

机务论坛
民航机务论坛改名为:机务论坛 发布最新行业动向 深入解读政策法规 开辟维修工程专栏 交流飞机排故经验 分享前沿技术应用 预测职业发展前景 行业大咖讲经布道 业界专家授业解惑 致力打造一流的民航机务朋友圈----机务论坛
 最新文章