Transformer——Q138 证明Xavier初始化的方差平衡性质

普通人也能看懂的Transformer源代码解释(PyTorch) Transformer源代码解释之PyTorch篇 章节 词嵌入 位置编码 多头注意力 搭建Transformer 在这里插入图片描述 词嵌入 Transformer本质上是一种Encoder,以翻译任务为例,原始数据集是以两种语言组成一行的,在应用时,应是Encoder输入源语言序列,Decoder里面输入需要被转换的语言序列(训练时)。一个文本常有许多序列组成,常见操作为将序列进行一些预处理(如词切分等)变成列表,一个序列的列表的元素通常为词表中不可切分的最小词,整个文本就是一个大列表,元素为一个一 阅读详情

该问题归类到Transformer架构问题集——训练与优化——正则化与初始化。请参考LLM数学推导——Transformer架构问题集。

1. 问题背景或来源

在深度学习领域,神经网络模型的训练恰似搭建一座精密的高楼,而参数初始化就是这座高楼的基石。若基石不稳,高楼便摇摇欲坠;同理,若参数初始化方式不当,神经网络训练过程中会遭遇梯度消失或梯度爆炸等严重问题。

以深度神经网络训练为例,若采用随机初始化参数,在反向传播时,梯度值会随着网络层数增加呈指数级减小,引发梯度消失。此时,底层参数更新极为缓慢,模型如同在黑暗中摸索的行者,难以捕捉数据中的有效特征。而梯度爆炸则与之相反,反向传播时梯度值会突然急剧增大,致使参数更新数值剧烈震荡,最终使训练过程失控崩溃,就像脱缰的野马失去方向。

为攻克这些难题,研究人员不懈探索。2010 年,Xavier Glorot 和 Yoshua Bengio 提出 Xavier 初始化方法,其核心在于通过科学设定神经网络参数初始值,保障信号在网络各层稳定传播,有效规避梯度消失与爆炸问题,进而提升模型训练效率与最终性能。

2. 技术原理或数学理论解析

2.1 基本假设与前提

为深入剖析 Xavier 初始化原理,我们构建一个神经网络层模型。假设某神经网络层输入为向量 x = [x_1, x_2, \cdots, x_{n_{in}}],其中 n_{in} 代表输入维度;输出向量为 y = [y_1, y_2, \cdots, y_{n_{out}}],n_{out} 表示输出维度。该层权重矩阵 W \in \mathbb{R}^{n_{out} \times n_{in}} 连接输入与输出,决定信号转换方式;偏置 b \in \mathbb{R}^{n_{out}} 用于微调输出,助力模型更好拟合数据。

我们的核心目标是:初始化权重 W 时,确保输入和输出方差一致,即 Var(x) = Var(y) 。方差反映数据离散程度,对神经网络而言,保持输入输出方差一致,如同为信号传播搭建稳定通道,防止信号异常波动。同时,在反向传播过程中,保证前向、反向传播的梯度方差一致,确保信号在 “前进” 与 “返回” 时稳定传输,避免因方差变化引发信号失真,进而导致梯度消失或爆炸。

为简化推导,我们做出假设:输入数据各维度相互独立,即输入向量元素间互不影响;权重矩阵元素相互独立,且权重均值为 0,即 E[W_{ji}] = 0 。尽管这些假设在实际场景中不完全成立,但为构建理想化数学模型、推导 Xavier 初始化原理奠定基础。

2.2 前向传播的方差推导

对于该神经网络层输出 y = Wx + b,因偏置 b 为常数向量,仅对输出平移,不改变方差(根据方差性质 Var(a + c) = Var(a),a 为随机变量,c 为常数),所以聚焦 y = Wx 的方差。

以输出 y 的第 j 个元素 y_j 为例,y_j = \sum_{i = 1}^{n_{in}} W_{ji} x_i,即输出向量第 j 个元素由输入向量 x 各元素与权重矩阵 W 第 j 行元素对应相乘后累加得到。

依据方差性质:若 a 为常数,x 为随机变量,则 Var(ax) = a^2Var(x);若 x_1, x_2, \cdots, x_n 相互独立,则 Var(\sum_{i} a_i x_i) = \sum_{i} a_i^2 Var(x_i) 。由于假设 x_i 、W_{ji} 相互独立,可得:

\begin{aligned} Var(y_j) &= Var\left(\sum_{i = 1}^{n_{in}} W_{ji} x_i\right)\\ &= \sum_{i = 1}^{n_{in}} Var(W_{ji} x_i)\\ &= \sum_{i = 1}^{n_{in}} E[W_{ji}^2] Var(x_i) \end{aligned}

其中 E[W_{ji}^2] 为权重 W_{ji} 平方的期望。我们期望 Var(y_j) = Var(x_i) ,即信号经该层网络后波动程度不变。在 Var(x_i) \neq 0 (输入数据无波动不符合实际)情况下,进一步推导:

\begin{aligned} Var(x_i) &= \sum_{i = 1}^{n_{in}} E[W_{ji}^2] Var(x_i)\\ 1 &= n_{in} E[W_{ji}^2]\\ E[W_{ji}^2] &= \frac{1}{n_{in}} \end{aligned}

这表明,要使输出 y_j 与输入 x_i 方差相等,权重 W_{ji} 平方的期望应为输入维度 n_{in} 的倒数。依此初始化权重,从方差角度看,信号前向传播时波动程度可保持稳定。

2.3 反向传播的方差推导

反向传播中,我们需计算梯度 \frac{\partial L}{\partial x_i},L 为衡量模型预测与真实结果差距的损失函数。根据链式法则,\frac{\partial L}{\partial x_i} = \sum_{j = 1}^{n_{out}} W_{ji} \frac{\partial L}{\partial y_j},即输入 x_i 对损失函数的梯度由输出 y 各元素对损失函数的梯度与权重矩阵 W 第 i 列元素对应相乘后累加得出。

基于 \frac{\partial L}{\partial y_j} 相互独立的假设,计算 \frac{\partial L}{\partial x_i} 的方差:

\begin{aligned} Var\left(\frac{\partial L}{\partial x_i}\right) &= Var\left(\sum_{j = 1}^{n_{out}} W_{ji} \frac{\partial L}{\partial y_j}\right)\\ &= \sum_{j = 1}^{n_{out}} Var(W_{ji} \frac{\partial L}{\partial y_j})\\ &= \sum_{j = 1}^{n_{out}} E[W_{ji}^2] Var\left(\frac{\partial L}{\partial y_j}\right) \end{aligned}

为保证反向传播时梯度方差平衡,即 Var\left(\frac{\partial L}{\partial x_i}\right) = Var\left(\frac{\partial L}{\partial y_j}\right),在 Var\left(\frac{\partial L}{\partial y_j}\right) \neq 0 (方差为 0 无实际意义)条件下,可得:

\begin{aligned} Var\left(\frac{\partial L}{\partial y_j}\right) &= \sum_{j = 1}^{n_{out}} E[W_{ji}^2] Var\left(\frac{\partial L}{\partial y_j}\right)\\ 1 &= n_{out} E[W_{ji}^2]\\ E[W_{ji}^2] &= \frac{1}{n_{out}} \end{aligned}

这意味着,从反向传播角度,为稳定梯度方差,权重 W_{ji} 平方的期望应为输出维度 n_{out} 的倒数。当权重满足此条件,反向传播时梯度波动可有效控制,避免梯度消失或爆炸。

2.4 综合得出 Xavier 初始化方差

通过前向、反向传播推导,我们得到对权重 W_{ji} 平方期望的不同要求:前向传播需 E[W_{ji}^2] = \frac{1}{n_{in}} ,反向传播需 E[W_{ji}^2] = \frac{1}{n_{out}} 。我们的目标是找到统一初始化方案,使权重同时满足前向、反向传播需求。

采用调和平均方法综合两者,得到 E[W_{ji}^2] = \frac{2}{n_{in} + n_{out}} ,此为 Xavier 初始化中权重 W 需满足的方差条件。

基于该方差条件,通常从均匀分布 U\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right) 或正态分布 \mathcal{N}\left(0, \frac{2}{n_{in} + n_{out}}\right) 中采样初始化权重矩阵 W 。例如,输入维度为 10、输出维度为 20 的神经网络层,其权重矩阵 W 应从均匀分布 U\left(-\sqrt{\frac{6}{10 + 20}}, \sqrt{\frac{6}{10 + 20}}\right) = U\left(-\sqrt{\frac{1}{5}}, \sqrt{\frac{1}{5}}\right) 采样初始化,以此保障信号在神经网络中稳定传播。

3. 结合实例的对比分析

3.1 多层感知机(MLP)实例

构建用于 MNIST 手写数字识别的 3 层 MLP。使用随机初始化时,训练初期损失值剧烈波动,如同狂风中的海面起伏不定。历经 50 个 epoch 训练,模型准确率仅达 75%,后续提升近乎停滞。

深入探究,随机初始化致使部分神经元输入过大或过小,经激活函数(如 sigmoid 函数)后,输出值接近饱和区。在饱和区,激活函数导数极小,反向传播时梯度近乎为 0,底层参数难以更新,模型难以学习数字有效特征,出现严重梯度消失问题。

而采用 Xavier 初始化后,训练过程平稳有序,损失值稳步下降。训练至 20 个 epoch 时,准确率突破 85%;50 个 epoch 后,准确率高达 95%。这是因为 Xavier 初始化平衡各层输入输出方差,为信号传递搭建稳定通道,使参数合理更新,模型充分学习数字特征,大幅提升识别准确率。

3.2 简单循环神经网络(RNN)实例

在基于 RNN 的股票价格 10 天走势预测任务中,随机初始化参数后,模型训练时梯度剧烈波动,迅速引发梯度爆炸,损失值瞬间变为无穷大,训练被迫中断。

这是由于 RNN 链式结构,反向传播时误差随时间步累积,随机初始化的不合理权重致使误差不断放大,最终引发梯度爆炸。

使用 Xavier 初始化后,训练趋于稳定,模型逐步学习时间序列规律,预测误差持续降低。在测试集上,采用 Xavier 初始化的 RNN 模型预测平均绝对误差较随机初始化降低 40%,有效避免梯度问题,显著提升预测性能。

4. 在 LLM 中的使用示例

4.1 文本生成

以 GPT - 3 这类超大型语言模型为例,其采用 Transformer 架构,参数海量。随机初始化时,模型训练初期生成文本杂乱无章,仅是词汇无序堆砌,无法连贯成句、传达有效信息。这是因为参数初始化不当,语义信息传递失真,梯度难以更新,模型无法学习语言内在模式。

采用 Xavier 初始化后,训练井然有序。初期模型可生成简单短语,随着训练推进,能创作出结构完整、语义合理的故事段落,如自然展开故事情节,从人物登场到情节发展连贯流畅,这得益于 Xavier 初始化保障信号在 Transformer 架构中稳定传播,助力模型学习语言语法、语义与逻辑关系。

4.2 语义理解

BERT 模型用于影评情感分析时,随机初始化使模型对情感词汇语义理解不足,仅关注表面词汇,忽视句子结构与语境,导致情感判断准确率低,如仅依据个别词汇判断情感,无法领会整体语义。

使用 Xavier 初始化后,模型能精准捕捉文本语义特征,综合考虑句子结构、词汇搭配与上下文语境理解情感倾向。在实际影评情感分类任务中,准确率从随机初始化的 65% 提升至 82%,有效提升语义理解准确性。

4.3 问答系统

基于 LLM 的问答系统中,当用户提问 “爱因斯坦的相对论有哪些重要意义”,随机初始化的模型难以准确关联问题与答案,在海量知识中迷失方向,无法有效提取关键信息,回答不准确、不完整。

采用 Xavier 初始化后,模型训练中能稳定学习问题与答案关联,理解问题语义,从庞大知识体系中精准提取相关信息,并组织成条理清晰的回答,如从理论革新、科技推动等方面详细阐述,提升问答系统性能与用户体验。

5. 优缺点分析

5.1 优点

  • 稳定训练过程:有效规避梯度消失与爆炸问题,如上述实例所示,使模型训练平稳,提升训练成功率与效率,众多实验表明,使用 Xavier 初始化的模型在收敛速度与最终性能上优于随机初始化模型。
  • 理论基础坚实:基于严谨数学推导与理论分析,为参数初始化提供科学依据,便于开发者与研究人员从原理层面理解其对模型训练的影响机制,非 “黑箱” 操作。
  • 广泛适用性:适用于多层感知机、Transformer、循环神经网络等多种架构,如同万能钥匙,在深度学习各领域广泛应用。

5.2 缺点

  • 假设条件局限:推导基于输入独立、权重零均值等理想化假设,实际应用中,图像数据相邻像素、自然语言处理中词语间存在相关性,导致假设不成立,影响 Xavier 初始化效果,难以实现预期方差平衡。
  • 深度网络适应性不足:虽可缓解梯度问题,但对极深层神经网络,仍无法彻底解决梯度消失或爆炸难题。随着网络层数增加,激活函数选择、网络结构复杂等因素仍可能引发梯度问题,需结合其他初始化方法或技术优化。

6. 优化策略分析

6.1 结合其他初始化方法

对于深度神经网络,可采用组合初始化策略。网络前几层使用 Xavier 初始化,因其能保证信号稳定传入,适合提取基础特征;后几层采用 Kaiming 初始化,该方法考虑激活函数特性,对使用 ReLU 等激活函数的深度网络效果更佳,二者结合发挥各自优势,适应深度网络不同层需求。

6.2 自适应调整

依据模型训练状态与数据特点,实现自适应初始化调整。训练中实时监测梯度大小与分布,若出现梯度消失或爆炸迹象,动态调整 Xavier 初始化相关参数,如增大或减小权重初始化方差,使参数更新更合理,优化训练效果。

6.3 考虑数据分布

初始化时充分考虑数据分布特性。若数据存在相关性或非均匀分布,改进 Xavier 初始化方法。例如,针对图像数据空间结构、时间序列数据时间依赖关系等,在初始化权重时融入先验知识,调整初始化公式;或对输入数据预处理,使其尽量满足 Xavier 初始化假设条件,提升初始化效果。

7. 代码示例(Python,基于 PyTorch)

import torch
import torch.nn as nn

# 定义一个简单的神经网络模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(10, 20)
        self.fc2 = nn.Linear(20, 2)
        self._init_weights()

    def _init_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Linear):
                nn.init.xavier_uniform_(m.weight)
                nn.init.zeros_(m.bias)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x


# 实例化模型
model = SimpleModel()

8. 代码解读

  • 模型定义:定义SimpleModel类,继承自nn.Module,构建含两个全连接层的神经网络,用于简单分类任务。fc1将 10 维输入映射为 20 维,fc2将 20 维输入映射为 2 维,实现数据维度转换与特征提取、分类。
  • 权重初始化:_init_weights方法遍历模型模块,遇线性层时,使用nn.init.xavier_uniform_按 Xavier 均匀分布初始化权重,确保权重从合适范围采样,满足 Xavier 初始化方差条件;用nn.init.zeros_将偏置初始化为 0,为模型训练提供初始参数设置。
  • 前向传播:forward方法定义数据前向传播路径,输入数据先经fc1层线性变换,再通过 ReLU 激活函数引入非线性,增加模型表达能力,之后经fc2层得到最终输出,用于后续分类决策。
  • 实例化模型:通过model = SimpleModel()实例化模型,创建可用于训练与推理的神经网络对象,后续可对其进行训练、参数调整等操作。

9. 总结

Xavier 初始化凭借科学的方差平衡原理,成为深度学习中重要的参数初始化方法。它有效缓解梯度问题,在多层感知机、循环神经网络及大语言模型等应用中显著提升模型训练效果与性能。然而,其存在假设条件限制与深度网络适应性不足等问题。但通过结合其他初始化方法、自适应调整及考虑数据分布等优化策略,可进一步发挥其优势。深入理解 Xavier 初始化原理、优缺点与优化策略,对构建高效稳定的深度学习模型,尤其是在大语言模型发展中,具有关键意义与实用价值 。

深度学习之Encoder-Only原理与实战 【代码】深度学习之Encoder-Only原理与实战。 阅读详情

相关推荐

深度学习之Seq2Seq原理与实战

【代码】深度学习之Seq2Seq原理与实战。

yumiwangzi30的博客 110

深度学习参数初始化(一)Xavier初始化 含代码

Xavier初始化也称为Glorot初始化,因为发明人为Xavier Glorot。Xavier initialization是 Glorot 等人为了解决随机初始化的问题提出来的另一种初始化方法,他们的思想就是尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0。........................

xian0710830114的专栏 4万+

深度学习之TF-IDF原理与实战

【代码】深度学习之TF_IDF原理与实战。

yumiwangzi30的博客 172

Transformer——Q136 推导Dropout的期望方差补偿公式

Dropout 作为一种重要的正则化技术,在深度学习尤其是大语言模型领域应用广泛。它通过随机丢弃神经元,有效减轻了过拟合问题,提升了模型的泛化能力。然而,其训练和测试阶段的不一致性、超参数选择困难以及理论解释不完善等缺点也不容忽视。通过深入剖析 Dropout 的期望方差补偿公式以及相关的技术原理和数学理论,结合丰富的实际应用示例、优缺点分析和优化策略,我们能够更全面地理解和应用 Dropout 技术,并根据具体任务需求进行灵活调整和改进,从而构建出性能更优、泛化能力更强的深度学习模型。r_i。

墨顿随笔 818

深度学习之LoRA(低秩适配)原理与实战

【代码】深度学习之LoRA(低秩适配)原理与实战。

yumiwangzi30的博客 219

DCA决策曲线的解读和代码实现

0.决策曲线 决策曲线分析法(Decision Curve Analysis,DCA)是个与ROC曲线相提并论的相对比较新的模型评价方法。 关于它的原理,长篇大论的医学统计学知识解读实在不是我的强项,放上两个链接偷偷懒: https://www.plob.org/article/12455.html https://www.iikx.com/news/statistics/1622.html 如果想看文章,这篇里的fig7就是:https://www.ncbi.nlm.nih.gov/pmc/artic

weixin_42960896的博客 1万+

深度学习——Xavier初始化方法

“Xavier”初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文《Understanding the difficulty of training deep feedforward neural networks》,可惜直到近两年,这个方法才逐渐得到更多人的应用和认可。为了使得网络中信息更好的流动,每一层输出的方差应该尽量相等。基于这个目标,现在我们就去推导一下:每一层的权

shuzfan的专栏 14万+

Rust嵌入式开发环境搭建指南(基于Stm32+Vscode)

本文档旨在指导开发者如何搭建基于Rust语言的STM32嵌入式开发环境。相比传统的C/C++开发方式,Rust提供了更强的内存安全保障和现代化的语言特性,非常适合嵌入式系统开发。本指南将详细介绍从环境搭建到项目配置的全过程,特别关注VSCode作为IDE的配置以及STLink和DAPLink调试器的使用。

u014627020的博客 2601

通过方差分析详解最流行的Xavier权重初始化方法

本文假定各位读者了解一些神经网络的基础,包括一些基本的前向与反向传播的表达式。本文很大一部分是进行基础的代数操作,只有少量的基本统计数据。如果读者希望先复习一点神经网络相关的知识,可以阅读以下机器之心曾发过的基础教程。本文尝试用 Glorot 和 Bengio 在他们论文中使用的推导以探讨深度神经网络中的权重初始化问题,并更好地说明为什么他们的方法解决了神经网络面临的训练问题。

机器之心 3539

ZED2双目相机运行VINS-FUSION初试

基于ZED2运行VINS-MONO的经验,在运行VINS-FUSION前有几点tips想跟大家分享,应该能在运行的过程中避免一些踩坑吧。 TIPs 1)关于zed2标定 开始使用Kalibr进行相机单目/双目及联合标定,虽然重投影误差最高也就5个像素,但实际使用效果却并不好,故建议大家相机内参还是从ZED2相机发布出的topic获取或可尝试/usr/local/zed/settings文件下的参数文档 另,启动ZED2.launch的时候,会有一个相机(一般是左目)和IMU的轴系转换关系Camera-IMU

xiaojinger_123的博客 5355

电脑的kernelbase.dll故障怎么处理?kernelbase.dll是什么文件

kernelbase.dll​是一个系统文件,属于Microsoft Windows操作系统的一部分。该DLL(动态链接库)文件包含了许多基本且低级的系统函数,这些函数被Windows上运行的各种程序和进程调用。kernelbase.dll通常与Kernel32.dll紧密相关,它是实现许多Windows API(应用程序编程接口)的封装。这些API涉及到内存管理、输入输出操作、进程和线程管理以及其他许多核心的操作系统功能。

电脑修复君的博客 4533

深度学习方法(二十一):常用权重初始化方法Xavier,He initialization的推导

文章目录交叉熵目标函数更陡峭Xavier initialization [1][4]He initialization [2][3]He init 考虑ReLU函数He init 考虑Leaky ReLU函数结束语参考资料 交叉熵目标函数更陡峭 在论文[1]中给了一个图示,一定程度上说明了为什么Cross Entropy用的很多,效果很好。图中上面的曲面表示的是交叉熵代价函数,下面的曲面表示的是二次代价函数,W1和W2分别表示层与层之间的连接权值。 ) 在1986年 Rumelhart 已经发现:logi

Bin 的专栏 6783

用Matlab系统辨识工具箱搞定温控系统建模:从阶跃响应到传递函数(附完整代码)

本文详细介绍了如何使用Matlab系统辨识工具箱进行温控系统建模,从阶跃响应数据采集到传递函数参数辨识的全过程。通过实际案例和完整代码,帮助工程师快速掌握PID控制参数整定技巧,提升温控系统设计效率。特别适合单片机开发者和自动化控制工程师参考。

weixin_30736301的博客 309

Transformer源代码解释之PyTorch篇

©PaperWeekly 原创 ·作者|Sherlock学校|苏州科技大学本科生研究方向|自然语言处理词嵌入Transformer 本质上是一种 Encoder,以翻译任务为...

Paper weekly 2538

【WRFDA安装第一期】安装 WRFDA 以运行 3DVAR/4DVAR数据同化

【WRFDA安装第一期】安装 WRFDA 以运行 3DVAR/4DVAR数据同化

WW、forever的博客 1894

【ACP】2025-最新-疑难题解析- 练习二汇总

全球加速是优化公网访问的,负载均衡是分发流量的,公网 NAT 网关是处理公网 IP 的,高速通道是建私网连接但不直接提供固定私网地址功能。C 是客户端加密方式,D 是 ECS 云盘加密,都不属于 OSS 服务器端加密。某企业想使用云服务器 ECS + 负载均衡 SLB + 弹性伸缩 (Auto Scaling) 的架构搭建一个企业级门户网站,技术负责人对于负载均衡和弹性伸缩配合使用没有经验,于是将他理解的两种产品配合使用的一些技术细节列成了一个表单,并请作为架构师的您帮他做一下鉴别,以下哪些项是正确的?

jundao1997的专栏 293

CNN数值初始化——xavier(下)

作者:冯超 链接:https://zhuanlan.zhihu.com/p/22044472 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 上回说到我们从前向的方向推导,发现了这些0均值的随机变量在计算过程中会产生方差扩散的问题,我们并且从前向的方向给出了解决的办法。既然在刚才的句子中我们反复提到了前向这两个字,那肯定是在别有用心地告诉大家——还有后

zhongshaoyy的博客 6335

国科大作业考试资料-人工智能原理与算法-2024新编-第十一次作业整理

1、有一位教授想知道学生是否睡眠充足。每天,教授观察学生在课堂 上是否睡觉,并观察他们是否有红眼。教授获得如下的领域知识: (1)没有观察数据时,学生睡眠充足的先验概率为0.7。 (2)给定学生前一天睡眠充足为条件,学生在晚上睡眠充足的概率是0.8;如果前一天睡眠不充足,则是0.3。 (3)如果学生睡眠充足,则红眼的概率是0.2,否则是0.7。 (4)如果学生睡眠充足,则在课堂上睡觉的概率是0.1,否则是0.3。 将这些信息形式化为一个动态贝叶斯网络,使教授可以使用这个网络从观察序列中进行滤波和预

MatsumotoChrikk 1055

CNN数值初始化——xavier(上)

作者:冯超 链接:https://zhuanlan.zhihu.com/p/22028079 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 上一回我们做了三个小实验。第一个是正常的实验,表现优异;第二个实验我们把初始化调整得很奇葩(为什么奇葩?),最终训练结果弱爆了;第三个实验我们把非线性函数重新换回sigmoid,模型奇迹般地回血,虽然表现不够完美

zhongshaoyy的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

系统学习深度学习(十四)--权重初始化Xavier

“Xavier”初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文《Understanding the difficulty of training deep feedforward neural networks》,可惜直到近两年,这个方法才逐渐得到更多人的应用和认可。 为了使得网络中信息更好的流动,每一层输出的方差应该尽量相等。 基于这个目标,现在我们就去推导一下:

工作笔记 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度学习0:数学知识:正态分布1

步骤内容结果1引入e−x2e^{-x^2}e−x2钟形曲线2算它的面积I∫−∞∞e−x2dxI∫−∞∞​e−x2dx3平方变成二重积分I2I^2I24换极坐标简化计算5算出I2πI^2 = \piI2πIπIπ​6代入σ\sigmaσ和μ\muμ做变量替换得到σ2πσ2π​7除以它归一化得到正态分布公式2π2π​不是随便写的,它来自高斯积分∫−∞∞e−x2。

tellmewhoisi的博客 178

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

AlexNet技术剖析:2012年那场ImageNet比赛如何引爆深度学习

2012年,AlexNet在ImageNet竞赛中将图像识别错误率从26.2%降至15.3%,开启深度学习革命。其成功源于三大创新:ReLU激活函数缓解梯度消失、Dropout防止过拟合、GPU并行加速训练。结合大规模标注数据(ImageNet)与数据增强策略,AlexNet突破传统特征工程瓶颈,推动计算机视觉进入“

大雾的小屋的博客 339

计算机毕设:基于深度学习的狗狗品种图像分类

本课题研究基于深度学习的狗狗品种图像分类方法,面向 120 个犬种、20580 张图像构建细粒度分类模型。数据处理采用分层划分并固化清单,模型以 ImageNet 预训练网络做迁移学习,配合标签平滑与数据增强应对标注噪声,评估以 Macro-F1 为主指标并分析易混品种。系统使用 Python 与 Django 实现上传识别、批量识别、资料浏览与记录查询,验证了方法在实际使用场景中的可行性。

WEIXIN_JSJBSZDS的博客 268

基于深度学习的垃圾分类系统的设计与实现

本系统是一个基于 Flask Web 框架与 PyTorch 深度学习模型的垃圾分类智能识别平台。系统面向垃圾图像分类场景,能够对上传图片中的玻璃、纸张、纸板、塑料、金属、其他垃圾等六类垃圾进行自动识别与置信度评估,并提供识别历史、数据统计、模型在线训练与记录导出等完整功能。系统使用 TrashNet 公开垃圾分类数据集进行模型训练,管理员可手动发起模型训练,训练完成后自动加载新权重。启动服务不会自动训练。

aiyuanma_vip的博客 379

【人工智能驱动的电催化研究-01】人工智能是什么?AI、机器学习、深度学习和神经网络之间有什么区别?

介绍人工智能、机器学习、神经网络和深度学习的基本概念及相互关系。围绕催化剂性能预测,解释样本、特征、标签、模型、参数、训练、预测与验证的含义。结合二硫化钼边缘位点与析氢活性的研究案例,说明科学问题如何指导特征选择。利用真实文献中的析氢数据,通过手算和Python实践,对比人工规则与均值模型,理解参数学习和误差评价。强调数据学习不保证预测更优,相关性不能直接证明反应机理,文献数据还须核查实验条件与适用范围,为后续编程、数学和电催化机器学习课程建立基础。

2402_84593233的博客 749

深度学习34:卷积神经网络:池化层(基本概念和代码)

除了 Max 池化(计算窗口内的最大值),还有 Average 池化(平均池化,计算窗口内的平均值)等。一般会将池化的大小窗口和步幅设置为相同的值,比如 2×2 的窗口大小,步幅会设置为 2。池化同样也可以设置填充。3.池化的另一个特点是对微小偏差具有鲁棒性,数据发生微小偏差时,池化可能会返回相同的结果。例如,数据在宽度方向上偏离 1 个元素,返回的结果不变。1.池化层缩小长、宽方向上的空间来进行降维,能够缩减模型的大小并提高计算速度。2.和卷积层不同,池化层没有要学习的参数,并且。

tellmewhoisi的博客 198
上一篇: Transformer——Q137 分析权重衰减(Weight Decay)与L2正则化的等价性条件
下一篇: Transformer——Q139 推导残差连接的零初始化(Zero Initialization)稳定性条件
墨顿
博客等级 码龄22年 1346粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨顿

唵嘛呢叭咪吽

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值