人工神经网络的权重必须被初始化为小的随机数。
这是因为这是用于训练模型的随机优化算法——随机梯度下降的预期。
要理解这种解决问题的方法,您必须首先理解非确定性和随机算法的作用,以及随机优化算法在搜索过程中驾驭随机性的必要性。
在这篇文章中,您将发现神经网络权重必须随机初始化的全部背景。
阅读本文后,你将了解:
- 关于在具有挑战性的问题上使用非确定性和随机算法的必要性。
- 在初始化和搜索过程中使用随机性,这在随机优化算法中尤为重要。
- 随机梯度下降是一种随机优化算法,它要求网络权重进行随机初始化。
通过我的新书 《Python 深度学习》 启动你的项目,书中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

为什么用随机权重初始化神经网络?
照片作者:lwtt93,部分权利保留。
概述
本文分为 4 部分;它们是:
- 确定性算法与非确定性算法
- 随机搜索算法
- 神经网络中的随机初始化
- 初始化方法
确定性算法与非确定性算法
经典算法是确定性的。
例如,一个用于排序列表的算法。
给定一个未排序的列表,排序算法(例如冒泡排序或快速排序)将系统地对列表进行排序,直到得到一个有序的结果。确定性意味着每次给算法相同的列表时,它的执行方式都完全相同。它会在过程的每一步都采取相同的操作。
确定性算法很棒,因为它们可以保证最佳、最差和平均运行时间。问题是,它们并非适用于所有问题。
有些问题对计算机来说很困难。可能是因为组合的数量;可能是因为数据的大小。它们之所以如此困难,是因为确定性算法无法有效地解决它们。算法可能会运行,但会一直运行到宇宙的热寂。
另一种解决方案是使用 非确定性算法。这些算法在使用算法执行过程中的决策时,会纳入 随机性 的元素。这意味着当相同的算法在相同数据上重新运行时,会遵循不同的步骤顺序。
它们可以快速加快获得解决方案的过程,但解决方案将是近似的,或者是“好的”,但通常不是“最佳”的。非确定性算法通常无法对运行时间或找到的解决方案质量做出强有力的保证。
这通常是可以接受的,因为问题非常困难,以至于任何好的解决方案通常都是令人满意的。
随机搜索算法
搜索问题通常非常具有挑战性,需要使用大量使用随机性的非确定性算法。
这些算法本身并非随机;而是它们精心使用了随机性。它们在一定范围内是随机的,被称为 随机算法。
搜索的增量式或分步式性质通常意味着该过程和算法被称为从初始状态或位置到最终状态或位置的优化。例如,随机优化问题或随机优化算法。
一些例子包括遗传算法、模拟退火和随机梯度下降。
搜索过程是从解空间中的某个起始点开始,逐步向某个足够好的解前进。
它们在使用随机性方面有共同的特征,例如:
- 在初始化过程中使用随机性。
- 在搜索过程中使用随机性。
我们对搜索空间的结构一无所知。因此,为了消除搜索过程中的偏差,我们从一个随机选择的位置开始。
随着搜索过程的展开,存在陷入搜索空间中不利区域的风险。在搜索过程中使用随机性会增加跳出困境并找到更好候选解决方案的可能性。
陷入并返回一个不太好的解决方案的想法被称为陷入局部最优。
随机初始化和搜索过程中的随机性这两个要素协同工作。
如果我们将搜索找到的任何解决方案视为暂时的或候选的,并且搜索过程可以执行多次,那么它们协同工作得更好。
这为随机搜索过程提供了多次机会,可以从不同的初始条件开始并在候选解空间中进行遍历,以寻找更好的候选解——即所谓的全局最优解。
候选解空间的导航通常使用山脉和山谷的一维或二维景观类比来描述(例如,类似 适应度景观)。如果我们正在搜索过程中最大化一个分数,我们可以将景观中的小山视为局部最优,而最大的山视为全局最优。
这是一个令人着迷的研究领域,也是我有一些背景的领域。例如,请参阅我的书
神经网络中的随机初始化
人工神经网络使用一种称为随机梯度下降的随机优化算法进行训练。
该算法使用随机性来找到一组足够好的权重,以实现数据中正在学习的输入到输出的特定映射函数。这意味着您在特定训练数据上的特定网络每次运行训练算法时,都会得到一个具有不同模型技能的网络。
这是一个特性,而不是一个 bug。
我在这篇文章中更多地写了关于这个问题
如前一节所述,像随机梯度下降这样的随机优化算法在选择搜索起点和搜索过程中使用随机性。
具体来说,随机梯度下降要求网络的权重被初始化为小的随机值(随机的,但接近零,例如在 [0.0, 0.1] 范围内)。在每个 epoch 之前对训练数据集进行随机洗牌的过程中,也会使用随机性,这反过来又会导致每个批次的梯度估计存在差异。
您可以在这篇文章中了解更多关于随机梯度下降的信息
搜索过程或神经网络学习过程的进展被称为收敛。发现次优解或局部最优被称为过早收敛。
深度学习模型的训练算法通常是迭代的,因此需要用户指定一个起始点来开始迭代。此外,训练深度模型是一项足够困难的任务,以至于大多数算法都深受初始化选择的影响。
— 第 301 页,《深度学习》,2016 年。
评估神经网络配置技能的最有效方法是多次重复搜索过程,并报告模型在这些重复中的平均性能。这为配置提供了最佳机会,使其能够从多个不同的初始条件集开始搜索空间。有时这被称为多重重启或多重重启搜索。
您可以在这篇文章中了解更多关于神经网络的有效评估
为何不将权重设置为零?
我们可以每次训练网络时都使用相同的一组权重;例如,您可以将所有权重的值设置为 0.0。
在这种情况下,学习算法的方程将无法对网络权重进行任何更改,模型将卡住。重要的是要注意,每个神经元中的偏置权重默认设置为零,而不是一个小的随机值。
具体来说,隐藏层中并排连接到相同输入的节点必须具有不同的权重,才能使学习算法更新这些权重。
这通常被称为训练期间打破对称性的必要性。
也许唯一可以完全确定地知道的属性是初始参数需要“打破”不同单元之间的对称性。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果它们具有相同的初始参数,那么应用于确定性成本和模型的确定性学习算法将始终以相同的方式更新这两个单元。
— 第 301 页,《深度学习》,2016 年。
何时初始化为相同的权重?
每次训练网络时,我们都可以使用相同的一组随机数。
这在评估网络配置时无济于事。
在模型被用于生产环境的情况下,为了训练相同的最终网络权重集,这可能会有所帮助。
您可以在这篇文章中了解更多关于使用 Keras 开发的神经网络固定随机种子
初始化方法
传统上,神经网络的权重被设置为小的随机数。
神经网络权重的初始化是一个完整的研究领域,因为网络的精心初始化可以加快学习过程。
现代深度学习库,如 Keras,提供了许多网络初始化方法,它们都是用小随机数初始化权重的变体。
例如,在撰写本文时,Keras 中所有网络类型都可用的当前方法包括:
- Zeros:初始化器,生成初始化为 0 的张量。
- Ones:初始化器,生成初始化为 1 的张量。
- Constant:初始化器,生成初始化为常数值的张量。
- RandomNormal:初始化器,生成具有正态分布的张量。
- RandomUniform:初始化器,生成具有均匀分布的张量。
- TruncatedNormal:初始化器,生成截断的正态分布。
- VarianceScaling:能够根据权重形状调整其尺度的初始化器。
- Orthogonal:生成随机正交矩阵的初始化器。
- Identity:生成单位矩阵的初始化器。
- lecun_uniform:LeCun 均匀初始化器。
- glorot_normal:Glorot 正态初始化器,也称为 Xavier 正态初始化器。
- glorot_uniform:Glorot 均匀初始化器,也称为 Xavier 均匀初始化器。
- he_normal:He 正态初始化器。
- lecun_normal:LeCun 正态初始化器。
- he_uniform:He 均匀方差缩放初始化器。
有关更多详细信息,请参阅 文档。
出于兴趣,Keras 开发人员为不同层类型选择的默认初始化器如下:
- Dense(例如 MLP):glorot_uniform
- LSTM:glorot_uniform
- CNN:glorot_uniform
您可以在这篇论文中了解更多关于“glorot_uniform”(也称为“Xavier uniform”),以该方法的开发者 Xavier Glorot 命名。
- 理解训练深度前馈神经网络的难度, 2010.
没有一种最佳的神经网络权重初始化方法。
现代初始化策略简单且是启发式的。设计改进的初始化策略是一项困难的任务,因为神经网络优化尚未被充分理解……我们对初始点如何影响泛化能力的理解尤其原始,几乎没有提供选择初始点的指导。
— 第 301 页,《深度学习》,2016 年。
这是您需要为您的特定预测建模问题探索、测试和试验的另一个超参数。
您是否有偏好的权重初始化方法?
在下面的评论中告诉我。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 深度学习, 2016.
文章
- 维基百科上的非确定性算法
- 维基百科上的随机算法
- 维基百科上的随机优化
- 维基百科上的随机梯度下降
- 维基百科上的适应度景观
- 神经网络常见问题解答
- Keras 权重初始化
- 理解训练深度前馈神经网络的难度, 2010.
讨论
总结
在这篇文章中,您发现了神经网络权重必须随机初始化的原因。
具体来说,你学到了:
- 关于在具有挑战性的问题上使用非确定性和随机算法的必要性。
- 在初始化和搜索过程中使用随机性,这在随机优化算法中尤为重要。
- 随机梯度下降是一种随机优化算法,它要求网络权重进行随机初始化。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
可能值得提及预训练初始化。
例如,如果您处理 RGB 图像并使用标准架构,那么很可能存在 ImageNet 的预训练权重,而这通常比随机初始化是一个更好的起点。
这是一个很好的观点。即使我不处理图像处理,我也看到过人们非常有效地使用迁移学习的文章。
我也开始在 NLP 和时间序列中看到迁移学习。非常有效!
嗯,关于“NLP 中的迁移学习”。
我知道只有一种方法可以有效地做到这一点;预训练词嵌入 + 手动添加单词/向量。例如:“dollares”不在词嵌入中,但您需要它。而“dollares”是“dollar”的同义词。所以您在 txt 或 bin 文件中手动添加单词“dollares”,其词向量(例如 300 维)与“dollar”相同。
对我来说,其他所有方法在“NLP 中的迁移学习”方面都失败了。技术上,还有其他方法(正如您在另一篇博文中提到的),但在实践中,当我尝试它们时,它们不起作用。
弗朗哥
拟合 LSTM 语言模型并对它们进行少量重新训练,在一些项目中对我来说节省了时间,效果很好。
先生,我想就我的职业发展寻求您的建议,因此我在此提出以下问题:
要成为一名 ML 专家(像您一样),我应该走的路径是——“BTech/BE 计算机科学 -> MTech 计算机科学(专注于 ML)-> 博士学位”吗?还是我应该攻读理学学士/硕士学位,或者直接去提供 AI/ML 课程的大学就读?我非常感兴趣了解 ML 算法、它们的工作原理、背后的数学以及对新的 ML 算法或方法的探索或自己创建它们。如果您能更详细地介绍影响我应该选择的课程的因素,那就比任何事都好,因为您是这个领域的。
嗨 Sam…进入机器学习领域有很多途径。
您需要找到最适合您首选学习风格的方法。
我教授的是一种自上而下、结果优先的机器学习方法。
我的方法的核心是让您专注于解决预测建模问题的端到端过程。在这种情况下,一切(或大多数事情)都开始变得有意义。
我关于入门的最佳建议分为 5 个步骤
如何开始应用机器学习
我随时为您提供帮助并回答您的问题。
很好,谢谢 Chris!
3 个问题:使用遗传算法创建初始权重然后插入是否明智?可以在 Keras 中设置初始权重吗?另外,如果训练网络 10 次,平均性能为 X,您对此感到满意,那么使用产生最佳结果的版本是否明智?
关于神经网络使用过多的权重参数,有一点没有被讨论过,那就是可能出现的重复码错误校正。然后,输入的微小变化仍然会导致预期的输出,只是增加了少量的高斯噪声。我认为特别是具有压缩型激活函数的网络会导致相当强的吸引子状态。
我通过我对联想记忆的实验从这个角度看待事物
https://github.com/S6Regen/Associative-Memory-and-Self-Organizing-Maps-Experiments
还有一个问题是,当使用“反馈对齐”代替反向传播时,实际发生了什么。
https://arxiv.org/abs/1609.01596
我的理论是,在这种情况下,您将深度神经网络用作联想记忆。额外的层可以减少记忆之间的“串扰”。其中串扰是量化/错误校正到错误结果。
我发现在对真实图像使用联想记忆时,串扰是一个主要问题,但是如果使用 2 层或更多层的联想记忆,就有解决问题的方法,例如在训练过程中使用随机中间目标。
总之,我更喜欢进化神经网络,并且我对量化和进化有以下看法:
https://groups.google.com/forum/#!topic/artificial-general-intelligence/4aKEE0gGGoA
这是些代码:https://github.com/S6Regen/Thunderbird
我想将这种深度神经网络与联想记忆相结合,以创建 ALife。但是,由于某种原因,我总是拖延。如果进化可以在精心设计的数字生长介质中比在生物系统中快一百万倍,那么也许这会带来一些犹豫。
谢谢分享,Sean。
感谢您对这些随机初始化的见解!我不是 ANN 的专家,事实上,当我将原始的、(空间/时间)结构化信号输入到输入层时,随机权重似乎有点奇怪……我看到 ANN 被用于一些从感兴趣信号派生出的复合特征,没有明显先验结构(需要提前建模),在这种情况下,纯粹的随机方法可能看起来更自然,深层也一样,但我还看到例如原始 EEG 多通道信号直接输入 CNN/RNN,而没有任何信号转换/稀疏化……这些信号既有时间/频谱上的已知结构,它们与前几层的数百个随机矩阵进行卷积……然后我得到了一个拥有数百万参数/权重的优化问题……嗯,不是我,Adam 能完成它的工作,在模糊的多维分类交叉熵景观中找到一个低点……而在繁重训练的最后,我的 GPU 冒烟了,尽管整体识别性能不错,但我仍然对输入层的这种随机性感到困扰:信息在那里是如何学习的?它们的核/滤波器难道不应该更确定性,以模仿/匹配信号波形特征吗?(信号处理课程的老记忆?)。因此,我向景观中引入了一些正则化项来抑制这种噪声(也可能提高性能迁移),并不真正知道我在这个景观中的位置,但肯定被吸引到输入层更平滑、更连续的特征。或者直接用一个好的(适合我的信号结构的)字典原子或小波来初始化我的输入层核?在网络越深的情况下,越来越随机地初始化我们的层是否可以设想?
学习过程会将权重从随机变为规律,以响应数据中的结构并学习输入到输出的映射函数。
不进行随机初始化进行学习怎么样?https://arxiv.org/abs/1805.07828
有趣,我还没读过。你读过了吗?是关于什么的?
在这篇论文中,作者使用线性代数方法通过 MLP 进行训练,而不使用 BP 算法。特别是,使用伪逆运算来获得初始权重。
太迷人了!我猜它在扩展到大型模型时会有困难。
https://github.com/sibofeng/PILAE
> — 第 301 页,《深度学习》,2016 年。
我有这本书,它在第 293 页。
谢谢,我当时用的是 PDF 来获取页码,它们可能与纸质书(我的在书架上)不同。
太棒了,谢谢 🙂
不客气。
“glorot_uniform”,也称为“Xavier normal”
难道不应该是
“glorot_uniform”,也称为“Xavier uniform”吗?
谢谢,已修正。
嗨,Jason Brownlee。
感谢您一直分享您的文章。
如果您不介意,我有一个问题。
我目前正在使用 LSTM 模型,并且得到相同模型但随机不同的结果(损失:RMSLE)。
在这种情况下,如果我保存最低的“RMSLE”模型和权重以供重用,这是正确的方法吗?
(我没有使用 K-fold,只是在循环中使用“fit”步骤)
再次感谢您的分享。
是的,您可以尝试这种方法。
另一种方法可能是拟合多个最终模型并平均它们的预测,例如这里所述
https://machinelearning.org.cn/ensemble-methods-for-deep-learning-neural-networks/
你太棒了!
谢谢。
嗨,Jason,
感谢您这篇富有洞察力的文章。
如果您能帮助我解决以下问题,我将不胜感激。
我构建了我的 MLP 模型,并使用了 ReLu 激活函数和 Xavier 权重初始化方法。结果已经足够好了,模型也表现出了良好的性能。
但我一直在阅读许多文章和书籍,了解权重初始化方法与所选激活函数之间的关系。我意识到在使用 ReLu 时,最好使用 He 初始化。
这是否意味着使用 Xavier 初始化与 Relu 一起是“错误”的?
不,不是错误,只是不同。使用效果好或足够好的方法即可。
你好 Jason,
我无法真正理解的是,为什么只有在我们设置 ANN 的初始权重为零时才会出现问题,而不是当我们将其设置为另一个常量值时?
提前感谢您的时间和您的工作!
它对我来说非常有用且充满启发!
因为模型将无法有效学习。
试试看吧。
你好,
我正在尝试阅读您关于您的书籍“Clever algorithms…”的链接,但出现404错误。
有计划修复它吗??
谢谢
我已经关停了,您可以在这里访问完整的 PDF 版本:
https://github.com/clever-algorithms/CleverAlgorithms
感谢您的回答
https://www.mdpi.com/1424-8220/21/14/4772/htm
卷积网络的非随机初始化,例如论文。
谢谢链接。随机,也可以意味着不同的事情!例如,从高斯分布或均匀分布中抽取随机数可能会有很大的不同。
你好 Jason,
我仍在努力理解为什么不同的初始化可以使神经网络的收敛性大致相同,而不是完全走向不同的方向。是不是真的存在不同的路径,只是它们都能在一定程度上最小化成本函数?
是否有可能随机选择一个特别糟糕的初始化?例如,假设初始化使得同一层中每个节点上的权重都相同(但其他方面是随机的),那么这个神经网络的性能是否就等同于一个只有1个节点的单层密集层?
提前感谢。
不同的初始化给出相同的结果是我们对“收敛”的期望。但并非总是如此。人们对此进行了仔细研究,以找出哪些方法更容易带来收敛。事实上,不同的初始化会导致你的模型完全不同(检查最终的网络权重),只是结果看起来相似。
如果你想要一个非常糟糕的结果,可以尝试将权重初始化为一个大数字(例如,高斯分布(10000,10)或类似的值)。你将会看到梯度爆炸/消失的问题。