Chapter 4.4:Adding shortcut connections

embedded/2025/1/12 11:28:13/

4 Implementing a GPT model from Scratch To Generate Text

4.4 Adding shortcut connections

  • 接下来,让我们讨论 shortcut connections(快捷连接)背后的概念,也称为 skip connections(跳跃连接)或 residual connections(残差连接)。最初,在残差网络(ResNet)中提出,用于缓解梯度消失问题。梯度消失问题指的是梯度(在训练过程中指导权重更新)在向后传播通过各层时逐渐变小,导致难以有效训练较早的层,如下图所示

    对比一个由 5 层组成的深度神经网络,左侧没有快捷连接,右侧带有快捷连接。快捷连接涉及将某一层的输入与其输出相加,从而有效地创建一条绕过某些层的替代路径

    工作原理

    1. 创建更短的梯度路径,跳过中间层。
    2. 通过将某一层的输出与后面某一层的输出相加实现。
  • 前向方法中添加快捷连接

    python">class ExampleDeepNeuralNetwork(nn.Module):def __init__(self, layer_sizes, use_shortcut):super().__init__()self.use_shortcut = use_shortcutself.layers = nn.ModuleList([nn.Sequential(nn.Linear(layer_sizes[0], layer_sizes[1]), GELU()),nn.Sequential(nn.Linear(layer_sizes[1], layer_sizes[2]), GELU()),nn.Sequential(nn.Linear(layer_sizes[2], layer_sizes[3]), GELU()),nn.Sequential(nn.Linear(layer_sizes[3], layer_sizes[4]), GELU()),nn.Sequential(nn.Linear(layer_sizes[4], layer_sizes[5]), GELU())])def forward(self, x):for layer in self.layers:# Compute the output of the current layerlayer_output = layer(x)# Check if shortcut can be appliedif self.use_shortcut and x.shape == layer_output.shape:x = x + layer_outputelse:x = layer_outputreturn x
    

    该代码实现了一个包含 5 层的深度神经网络,每层由一个 Linear layer(线性层)和一个 GELU activation function(GELU 激活函数)组成。在前向传播过程中,我们迭代地将输入传递到各层,如果 self.use_shortcut 属性设置为 True,则可以选择性地添加上面图中的 shortcut connections(快捷连接)。

    python">def print_gradients(model, x):# Forward passoutput = model(x)target = torch.tensor([[0.]])# Calculate loss based on how close the target# and output areloss = nn.MSELoss()loss = loss(output, target)# Backward pass to calculate the gradientsloss.backward()for name, param in model.named_parameters():if 'weight' in name:# Print the mean absolute gradient of the weightsprint(f"{name} has gradient mean of {param.grad.abs().mean().item()}")
    

    接下来,我们实现一个计算模型向后传递中的梯度的函数:

    python">def print_gradients(model, x):# Forward passoutput = model(x)target = torch.tensor([[0.]])# Calculate loss based on how close the target# and output areloss = nn.MSELoss()loss = loss(output, target)# Backward pass to calculate the gradientsloss.backward()for name, param in model.named_parameters():if 'weight' in name:# Print the mean absolute gradient of the weightsprint(f"{name} has gradient mean of {param.grad.abs().mean().item()}")
    

    在前面的代码中,我们定义了一个损失函数来计算模型输出与目标值(如 0)的接近程度,并通过调用 loss.backward() 自动计算每一层的损失梯度。使用 model.named_parameters() 可以遍历权重参数,例如对于 3×3 的权重矩阵,计算其 3×3 梯度值的平均绝对梯度,从而得到每一层的单一梯度值,便于比较各层梯度。.backward() 方法的优势在于自动完成梯度计算,无需手动实现数学过程,极大地简化了深度神经网络的训练和使用。

    接下来我们首先打印没有使用shortcut的梯度

    python"># 未使用shortcut
    layer_sizes = [3, 3, 3, 3, 3, 1]  
    sample_input = torch.tensor([[1., 0., -1.]])torch.manual_seed(123)
    model_without_shortcut = ExampleDeepNeuralNetwork(layer_sizes, use_shortcut=False
    )
    print_gradients(model_without_shortcut, sample_input)"""输出"""
    layers.0.0.weight has gradient mean of 0.00020173587836325169
    layers.1.0.weight has gradient mean of 0.0001201116101583466
    layers.2.0.weight has gradient mean of 0.0007152041653171182
    layers.3.0.weight has gradient mean of 0.001398873864673078
    layers.4.0.weight has gradient mean of 0.005049646366387606
    

    接着打印使用shortcut的梯度

    python"># 使用shortcut
    torch.manual_seed(123)
    model_with_shortcut = ExampleDeepNeuralNetwork(layer_sizes, use_shortcut=True
    )
    print_gradients(model_with_shortcut, sample_input)"""输出"""
    layers.0.0.weight has gradient mean of 0.22169792652130127
    layers.1.0.weight has gradient mean of 0.20694106817245483
    layers.2.0.weight has gradient mean of 0.32896995544433594
    layers.3.0.weight has gradient mean of 0.2665732502937317
    layers.4.0.weight has gradient mean of 1.3258541822433472
    

    根据上面的输出结果可以看出,shortcut connections(快捷连接)防止了梯度在早期层(如 layer.0)中消失,确保梯度的有效传播。


http://www.ppmy.cn/embedded/153270.html

相关文章

windows及linux 安装 Yarn 4.x 版本

1. 确保系统环境准备 a. 安装 Node.js Yarn 依赖于 Node.js,所以需要先安装 Node.js。前往 Node.js 官网 下载并安装适合你的 Windows 版本的 Node.js(推荐 LTS 版本)。安装完成后,打开命令提示符(CMD)或 PowerShell,验证安装:node -v npm -v如果显示版本号,则表示安…

Pixel 6a手机提示无法连接移动网络,打电话失败!

1、开启VoLTE 2、如果没有,下载shizuku和PixelIMS应用。 shizuke Releases RikkaApps/Shizuku GitHub PixellMS Release v1.2.8 kyujin-cho/pixel-volte-patch GitHub 3、安装shizuke启动,开通root可以直接点击下面的启动,如果没有就…

每日一题(一):识别字符串中的字符是否唯一

目录 一、前言 二、题目 三、题目分析 (一)明确需求 (二)分析思路 四、将思路转变为一个程序 C代码 C代码 注释: 五、总结 一、前言 作为博主在本系列文章中的第一篇文章,博主先对本系列做一个简单的介绍…

游戏关卡设计的常用模式

游戏关卡分为很多种,但常用的有固定套路,分为若干种类型。 关卡是主角与怪物、敌方战斗的场所,包括装饰物、通道。 单人游戏的关卡较小,偏线性; 联机/MMO的关卡较大,通道多,自由度高&#xf…

Centos 下安装 GitLab16.2.1

参考 https://blog.csdn.net/weixin_46059351/article/details/140649426 https://blog.csdn.net/qq_46028493/article/details/144993598 Centos 安装 GitLab 修改 yum 的配置 首先查看目前配置的 yum: cat /etc/yum.repos.d/CentOS-Base.repo应该是这个样子…

【数据库】二、关系数据库

文章目录 二、关系数据库1 关系2 关系数据库3 完整性约束4 关系运算 二、关系数据库 1 关系 域:一组具有相同数据类型的值的集合。 笛卡尔积:所有域(域可相同)中所有取值的组合 例如:D1{1,2,3},D2{A,b}&…

基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)

已完成功能: 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制,可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…

【华为OD-E卷 - 求字符串中所有整数的最小和 100分(python、java、c++、js、c)】

【华为OD-E卷 - 求字符串中所有整数的最小和 100分(python、java、c、js、c)】 题目 输入字符串s,输出s中包含所有整数的最小和。 说明: 字符串s,只包含 a-z A-Z 合法的整数包括 1)正整数:一…