当前位置: 首页 > news >正文

深度学习-模型初始化与模型构造

模型初始化是神经网络训练过程中的关键步骤,其目标是为网络参数设置合理的初始值,从而加速训练过程并提高模型性能。

下面是三种有效的模型初始化方法:

  1. 将乘法操作转换为加法操作:在某些网络结构中,乘法操作可能会导致梯度消失或爆炸问题。通过将乘法操作转换为加法操作,可以稳定梯度流动,使训练过程更加平稳。

  2. 归一化技术:归一化是将输入数据或网络激活值调整到特定范围(如0到1或-1到1)的过程。常见的归一化方法包括批量归一化(Batch Normalization)和层归一化(Layer Normalization)。这些技术可以帮助加速网络的收敛,并提高模型的泛化能力。

  3. 合理的权重初始化和激活函数选择:选择合适的权重初始化方法(如He初始化或Xavier初始化)可以确保网络在训练初期的梯度流动稳定。同时,选择合适的激活函数(如ReLU、Leaky ReLU或Swish)可以引入非线性,帮助网络学习复杂的特征表示。

 有上面三个方法,这里介绍第三种方法:选择合理的模型初始化权重(随机初始化的Xavier初始化)与激活函数

1. Xavier初始化

Xavier初始化也称为Glorot初始化,因为发明人为Xavier Glorot。Xavier initialization是 Glorot 等人为了解决随机初始化的问题提出来的另一种初始化方法,旨在保持激活函数的方差在前向传播和反向传播过程中大致相同。

  • Xavier 初始化试图使得每一层的输出的方差接近于其输入的方差。从而避免梯度消失或梯度爆炸的问题。

  • Xavier 初始化使得每一层的输出的方差接近于其输入的方差,从而使得每一层的梯度的方差接近于 1。这样,每一层的参数更新的幅度就不会相差太大,从而加速收敛

假设我们有一个简单的神经网络,包含一个输入层、一个隐藏层和一个输出层:

  • 输入层有3个神经元。

  • 隐藏层有2个神经元。

  • 输出层有1个神经元。

Xavier初始化步骤

  1. 确定每层的输入和输出神经元数量

    • 输入层到隐藏层:输入神经元数量(n_in​)= 3,输出神经元数量(n_out​)= 2。

    • 隐藏层到输出层:输入神经元数量(n_in​)= 2,输出神经元数量(n_out​)= 1。

  2. 计算权重的方差

    • 对于输入层到隐藏层的权重,使用Xavier正态初始化时,方差为:

      Var(W)=n_in​1​=1/3​
    • 对于隐藏层到输出层的权重,方差为:

      Var(W)=n_in​1​=1/2​
  3. 初始化权重矩阵

    • 输入层到隐藏层的权重矩阵大小为 3×2(输入维度3,输出维度2)。

    • 隐藏层到输出层的权重矩阵大小为 2×1(输入维度2,输出维度1)。

2. 模型构造

层:接受一组输入 + 生成相应的输出 + 由一组可调整参数(超参数)描述。

  • 一个单层本身就是模型。

块:可以描述单个层、由多个层组成的组件或整个模型本身。

  • 使用块进行抽象的一个好处是可以将一些块组合成更大的组件, 这一过程通常是递归的。

之前都是调用 nn.Sequential 实现的。可以把它理解为一个类似于 Python 的列表,用于封装一系列有序的网络层或模块,将它们组合成一个更复杂的网络结构。nn.Sequential 会按照添加的顺序依次执行其中的层或模块,其内部的层或模块会自动被正确地连接起来。

例子:

import torch
import torch.nn as nn# 定义一个包含多个层的模型
model = nn.Sequential(nn.Linear(10, 5),  # 输入特征维度为 10,输出特征维度为 5 的线性层nn.ReLU(),         # ReLU 激活函数nn.Linear(5, 2)    # 输入特征维度为 5,输出特征维度为 2 的线性层
)# 输入数据
x = torch.randn(1, 10)  # 假设输入数据的形状为 [1, 10]# 前向传播
output = model(x)
print(output)

其中,上面的部分有:model[0]代表nn.Linear(10, 5),model[1]代表nn.ReLU(),model[0]代表nn.Linear(5, 2)。

图片来源于《动手学深度学习》

在深度学习框架 PyTorch 中,(自定义的网络层或模型组件)是继承nn.Module 类的一个类,主要包含 initforward 两个部件。

  • init 方法用于初始化层的参数和结构,定义该层包含的各种子模块(如卷积层、线性层等),可以设置一些可学习的参数以及固定的参数配置等。

  • forward 方法定义了输入数据在该层中的传播方式,即前向传播时对输入数据进行的操作和变换,以产生输出。

import torch
import torch.nn as nnclass MyLayer(nn.Module):def __init__(self):super().__init__()self.linear = nn.Linear(10, 5)  # 初始化一个线性层作为子模块self.weight = nn.Parameter(torch.randn(5, 10))  # 定义一个可学习的参数def forward(self, x):x = self.linear(x)x = torch.matmul(x, self.weight)return x

http://www.xdnf.cn/news/1229617.html

相关文章:

  • 高性能MCP服务器架构设计:并发、缓存与监控
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情数据可视化分析-热词情感趋势树形图
  • 【机器学习】非线性分类算法详解(下):决策树(最佳分裂特征选择的艺术)与支持向量机(最大间隔和核技巧)
  • 在 AKS 中运行 Azure DevOps 私有代理-1
  • Linux性能监控与调优全攻略
  • React ahooks——副作用类hooks之useThrottleFn
  • React ahooks——副作用类hooks之useDebounceFn
  • Shell【脚本 02】离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
  • 堆----1.数组中的第K个最大元素
  • 通过filezilla在局域网下实现高速传输数据
  • 2025-08 安卓开发面试拷打记录(面试题)
  • 【龙泽科技】汽车故障诊断仿真教学软件【风光580】
  • Vue 详情模块 4
  • Python科研数据可视化技术
  • 知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例
  • 在 AKS 中运行 Azure DevOps 自托管代理-2
  • 线程池的实现
  • 能力显著性向量:验证损失与下游能力的缩放定律
  • k8s使用 RBAC 鉴权
  • 如何在 Ubuntu 24.04 或 22.04 LTS Linux 上安装 Guake 终端应用程序
  • Allegro降版本工具
  • 学习笔记:无锁队列的原理以及c++实现
  • C# 中抽象类、密封类、静态类和接口的区别
  • Qt 信号和槽正常连接返回true,但发送信号后槽函数无响应问题【已解决】
  • WinForm之ListBox 控件
  • Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效【已解决】
  • 电子电气架构 --- 汽车网络安全概述
  • Java高性能编程实践指南
  • cv弹窗,退款确认弹窗
  • Java中Lambda 表达式的解释