监督学习基础(分类)
在具有概念、组件和示例的机器学习中
由 Unsplash 上的 Pietro Jeng 拍摄
在这篇文章中,我们将深入探讨监督学习的概念,或者更确切地说是机器学习领域中的分类。我们将讨论分类的定义、组成和例子。
分类可以定义为学习一个目标函数 f 的任务,该目标函数将每个属性集合 x 映射到一个预定义的标签 y 。
**示例:**将一条新闻分配到预定义的类别之一。
在数据科学或机器学习的社区中,对数据所做的任何事情都被称为**建模。**在分类的背景下,有两种类型的建模:
- *描述性建模:*分类模型可以作为一种解释工具,用于区分不同类别的对象。**示例:**基于特征定义椎骨类型的模型。
- *预测建模:*分类模型也可用于预测未知记录的类别标签。
分类技术最适合预测或描述带有二进制或名义类别的数据集。它们对于有序类别(例如,将一个人归类为高、中或低收入群体的成员)不太有效,因为它们没有考虑类别之间的隐含顺序。
从鸟瞰图分类
让我们稍微详细地看看上面提到的所有组件。
- *训练和测试集:*整个数据通常分为两部分,一部分由学习算法用来学习一个模型(称为训练数据),另一部分用来评估所学习模型的性能(称为测试数据)。更多细节请看下面的帖子。
有了详细的概念…
towardsdatascience.com](/data-preprocessing-in-data-mining-machine-learning-79a9662e2eb) [## Python 中的数据预处理
对于机器学习与工作代码的例子…
towardsdatascience.com](/data-preprocessing-in-python-b52b652e37d5)
2.*学习算法:*它是一种在数据集(训练集)中寻找模式,并将该数据的属性与训练数据集中提到的类别关联起来的算法,这样当测试数据作为输入时,它就可以分配准确的类别。
学习算法的一个关键目标是建立具有良好概括能力的模型,即准确预测先前未知记录的类别标签的模型。
3.*模型/分类器:*它实际上做分类。它识别一个数据实例与另一个数据实例的差异,然后将新的数据实例分配给其中一个类。
4.*归纳与演绎:*在理解它之前,需要理解分类的两个阶段。它们分别是学习和查询阶段。
学习阶段由两部分组成,即归纳(训练)和演绎(测试)。
查询阶段也称为应用阶段。
现在用更正式的方式来说吧。
正式定义:
- 在任务测试上有所改进,
- 关于业绩计量 P,
- 基于经验 e。
这个正式的定义可能有点难以理解。举几个例子可以更好理解。
示例:垃圾邮件分类
- 任务 T-将电子邮件分类为垃圾邮件/非垃圾邮件
- 性能指标 P —正确分类的电子邮件的比例
- 体验 E —手动标记垃圾邮件/非垃圾邮件
举例:跳棋
- 任务 T —玩跳棋
- 绩效指标 P —锦标赛中获胜游戏的百分比
- 体验 E——与自我对抗的机会
其他例子包括
- 基于 MRI 扫描的结果将细胞分类为恶性或良性
- 根据星系的形状对它们进行分类
上述这些例子可以基于不同的学习方法进行建模。以下是一些学习方法:
- 朴素贝叶斯分类器
- 决策树分类器
- 神经网络
- 基于规则的分类器
- 支持向量机
还有很多。
我将免费赠送一本关于一致性的电子书。在这里获得你的免费电子书。
感谢您的阅读。我希望阅读这篇文章的人都清楚监督学习的基本知识。
如果你喜欢阅读这样的故事,那么你应该 在你的收件箱 中收到我的帖子,如果你想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金,不需要你额外付费。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
tarun-gupta.medium.com](https://tarun-gupta.medium.com/membership)
你可以在这里阅读我的更多帖子:
[## 标记故事列表的快速链接—感谢您的访问
我也有一份以快节奏出版为目标的出版物。读书成为作家。
tarun-gupta.medium.com](https://tarun-gupta.medium.com/thank-you-for-visiting-my-profile-9f708062c75e)
使用 Tensorflow 的标记器基础
一个直观的仪表板,用于研究记号赋予器的工作原理
这篇文章是写给那些在自然语言处理领域是新手,想做一个情感分类/文本分类的项目的人。
什么是标记化?
顾名思义,记号化意味着将句子分成一系列记号,或者用外行的话来说,我们可以说,只要句子中有空格,我们就在它们之间添加一个逗号,这样我们的句子就会被分解成记号,每个单词都获得一个唯一的整数值。
下面是使用 TensorFlow 的 python 代码。
tokenizer = Tokenizer ( num_words=20, oov_token='<OOV>')
tokenizer.fit_on_texts(sentence)word_index=tokenizer.word_index
sequences=tokenizer.texts_to_sequences(sentence)
在执行了上面这段代码后,我们的普通文本被转换成一组整数,如下所示。
[[3, 4, 5, 2], [3], [4, 5, 2], [6, 7, 8], [9, 2]]
['Hello How are you ?', 'Hello', 'How are you', 'I am fine', 'Thank You']
现在我们的任务是将可变长度的数组转换成固定长度的数组,这可以使用填充来完成。
什么是填充?
填充是通过截断(如果长度大于定义的 max_length,则截断数组)或填充(如果长度小于 max_length,则用 0 填充数组)将可变长度的整数数组转换为固定长度的方法。
下面是这样做的 python 代码。
padded=pad_sequences(sequences, maxlen=7, truncating='post')
执行上面的代码后,我们的新数组的长度将是固定的,如下所示。
[[0 0 0 3 4 5 2]
[0 0 0 0 0 0 3]
[0 0 0 0 4 5 2]
[0 0 0 0 6 7 8]
[0 0 0 0 0 9 2]]
对应文字的整数值
下面是 python 代码,看看每个单词对应的值是什么。
tokenizer.word_index
执行上述代码后,输出将如下所示。
{'<OOV>': 1, 'am': 7, 'are': 5, 'fine': 8, 'hello': 3, 'how': 4, 'i': 6, 'thank': 9, 'you': 2}
结论
在这里,我们实现了基本的标记器,这将有助于使用深度学习进行情感分类,并将用于真实世界的数据集中。
批量标准化说明
批量标准化
批量标准化工作原理及其解决的问题的详细指南
在这篇文章中,我详细介绍了批量规范化及其工作原理。Loffe 和 Szegedy 在 2015 年引入了批量规范化,并迅速成为几乎每个深度网络中实施的标准功能。
概述
- 内部协变量移位
- 消失和爆炸渐变
- 批量标准化是如何工作的?
- 批量标准化的优势
1.内部协变量移位
批量标准化处理的关键问题是内部协变量移位。由于神经网络的本质,会发生内部协变量移位。在训练的每一个时期,权重被更新,不同的数据被处理,这意味着神经元的输入每次都略有不同。当这些变化传递到下一个神经元时,它会产生一种情况,即每个神经元的输入分布在每个时期都是不同的。
通常,这没什么大不了的,但在深层网络中,输入分布的这些微小变化会快速累积,并在网络深处放大。最终,由最深层神经元接收的输入分布在每个时期之间变化很大。
因此,这些神经元需要不断适应不断变化的输入分布,这意味着它们的学习能力受到严重制约。这种不断变化的输入分布被称为内部协变量移位。
2.消失和爆炸渐变
批量规格化处理的另一个问题是消失或爆炸梯度。在整流线性单元(ReLUs)之前,使用饱和激活函数。饱和函数是具有朝向左右边界的“平坦”曲线的函数,例如 sigmoid 函数。
Sigmoid 曲线及其导数
在 sigmoid 函数中,随着 x 的值趋向于∞,梯度趋向于 0。随着神经网络被训练,权重可以被推向 s 形曲线的饱和端。这样,梯度变得越来越小,接近 0。
当这些小梯度在网络中更深地相乘时,它们会变得更小。当使用反向传播时,梯度以指数方式接近 0。这种“消失”梯度严重限制了网络的深度。
虽然可以通过使用 ReLU 等非饱和激活函数轻松管理这种消失梯度,但批量归一化仍然有一席之地,因为它通过确保没有值变得过高或过低,防止权重被推到那些饱和区域。
3.批量标准化是如何工作的?
批量标准化通过减去小批量平均值和除以小批量标准偏差来标准化层输入。小批量指的是为任何给定时期提供的一批数据,是整个训练数据的子集。
批量归一化的公式,其中 x̂指的是归一化的向量。
标准化确保输入的平均值为 0,标准偏差为 1,这意味着每个神经元的输入分布是相同的,从而解决了内部协变量偏移的问题,并提供了正则化。
然而,网络的代表性已经严重受损。如果对每一层进行归一化,则前一层所做的权重变化和数据间的噪声会部分丢失,因为在归一化过程中会丢失一些非线性关系。这可能导致传递次优权重。
为了解决这个问题,批处理规格化增加了两个可训练的参数,gamma γ和 beta β,它们可以缩放和移动规格化的值。
随机梯度下降可以在标准反向传播过程中调整γ和β,以找到最佳分布,从而解决数据之间的噪声和权重变化的稀疏性。从本质上讲,这些参数缩放并改变了归一化的输入分布,以适应给定数据集的特性。
例如,假设未归一化的输入分布对于给定的数据集是最佳的,γ和β将收敛到√Var[x]和 E[x],从而获得原始的未归一化的 x 向量。因此,批量归一化确保归一化对于给定的数据集总是最优的。
a.为什么要针对小批量进行标准化?
理想情况下,标准化应该针对整个训练数据集,因为这确保了不同批次之间的输入分布没有变化。然而,由于不在当前批次中的任何数据集都在反向传播的范围之外,随机梯度下降将不起作用,因为归一化中使用的统计数据来自该范围之外。
因此,标准化是针对小批量进行的,以确保可以进行标准反向传播。唯一的含义是,每一批应该在某种程度上代表整个训练集的分布,如果您的批大小不是太小,这是一个安全的假设。
b.测试阶段
在训练期间,使用小批量中的样本计算平均值和标准偏差。但是,在测试中,计算新值没有意义。因此,批量标准化使用在训练期间计算的运行平均值和运行方差。需要引入一个新的参数,动量或衰变。
running_mean = momentum * running_mean + (1-momentum) * new_mean
running_var = momentum* running_var + (1-momentum) * new_var
动量是对最后一次看到的小批量的重视,也被称为“滞后”。如果动量设置为 0,运行平均值和方差来自最后一次看到的小批量。然而,这可能是有偏见的,不是理想的测试。相反,如果动量设置为 1,它将使用第一个小批量的运行平均值和方差。本质上,动量控制每个新的小批量对运行平均值的贡献。
理想情况下,动量应设置为接近 1 (>0.9),以确保运行均值和方差的缓慢学习,从而忽略小批量中的噪声。
4.批量标准化的优势
a.更高的学习率
通常,较大的学习速率会导致梯度消失/爆炸。然而,由于批量标准化处理了这一点,可以放心地使用更大的学习率。
b.减少过度拟合
批量归一化具有正则化效果,因为它向每一层的输入添加了噪声。这阻止了过度拟合,因为模型不再单独为给定的训练示例产生确定性的值。
结论
批量标准化的力量已经在机器学习的许多领域反复展示。这是一个简单的解决方案,将产生几乎任何型号的性能显着改善。
参考资料:
为什么批量归一化在深度神经网络中有用?
数据科学,深度学习
批量规范化有助于深度神经网络的规范化
纳斯蒂亚·杜尔希尔在 Unsplash 上的照片
在本文中,您可以探索规范化与批量规范化,为什么深度学习需要批量规范化,批量规范化在深度神经网络中是如何执行的,以及批量规范化的优势是什么?
什么是规范化 vs 批量规范化?
标准化是将数据集中数值变量的值更改为典型标度的过程,不会在值的范围内形成错误的对比。
批量标准化是一种用于训练深度神经网络的技术,可对每个小批量的层贡献进行标准化。这有助于解决学习过程,并大幅减少训练深度神经网络所需的训练次数。
深度学习为什么需要批量归一化?批处理规范化为什么有帮助?
在深度学习中,准备具有许多层的深度神经网络,因为它们可能对底层初始随机权重和学习算法的设计很敏感。
这个问题背后的一个潜在目的是,当权重被刷新时,在每个小批量之后,网络中某处的层的输入分布可能改变。这可以使学习算法始终追求一个移动的目标。对网络中各层的输入分布的这种调整暗指了专门的名称内部协变量移位。
挑战在于,利用接受当前层之前的层中的权重是固定的误差估计,从输出到输入逐层反向刷新模型。
批量规格化 给出了一个丰富的参数化实际上任何深度神经网络的方法。重新参数化从根本上减少了跨多个层规划更新的问题。
深度神经网络是如何进行批量归一化的?
它通过对每个小批量的每个输入变量的激活进行归一化,明确地缩放该层的输出,例如,来自最后一层的节点的制定。回顾一下,标准化意味着重新调整数据以使平均值为 0,而标准偏差为 1。
通过使每一层的输入变亮,它将朝着实现输入的固定分布迈出一大步,这将消除内部协变量移动的不利影响。
归一化早期层的激活意味着后续层在权重更新期间做出的关于输入的传播和分布的假设不会改变,无论如何不会显著改变。这具有稳定和加速深度神经网络的准备训练过程的影响。
对于不包含来自训练数据集的模型的代理分布的较小的小批量,训练和推理(利用训练后的模型)之间的标准化输入的差异可以在执行性能中带来可察觉的对比。这可以通过改变称为批量重正化的技术来实现,该技术使得小批量的变量平均值和标准偏差的评估越来越稳定。
这种输入的标准化可以应用于第一个隐藏层的输入变量,或者应用于更深层的隐藏层的激活。
倾向于与大多数深度网络类型一起使用,例如 卷积神经网络(CNN) 和 递归神经网络(RNN) 。
它可以用在先前层的输入上,或者用在过去层的激活功能之后。
如果对于像 双曲正切 和 逻辑函数 这样的 s 形容量,激活函数后可能会更加合适。
它可能在激活函数之前适合于可能在非高斯散射中上升的激活,如整流线性激活函数(ReLU)** ,这是大多数深度神经网络类型的前线默认值。**
它提供了一些正则化影响,减少了泛化误差,可能需要利用丢失进行正则化。
在批量标准化网络中,平均值和方差在整个网络中保持适度稳定。对于一个非规范化的网络,他们似乎以指数发展有深度。
批量标准化的优势是什么?
- 该模型对超参数调整不太敏感。也就是说,尽管更大的学习率已经促进了无价值的模型,更大的 lr 在这一点上是令人满意的
- 收缩内部协变移位
- 减少渐变对参数比例或其潜在值的依赖
- 权重初始化在这一点上不太重要
- 辍学者可被疏散进行调整
结论
这使我们达到了本文的最大限度,在这里我们发现了批处理规范化和利用它的优点。批处理规范化解决了一个叫做内部协变量移位的主要问题。
它有助于使神经网络中间层之间的数据流动看起来,这意味着你可以使用更高的学习速率。它有一个正规化的效果,这意味着你可以经常消除辍学。
现在,把你对Twitter*,Linkedin,以及Github!!*
同意 还是 不同意 与 Saurav Singla 的观点和例子?想告诉我们你的故事吗?
他乐于接受建设性的反馈——如果您对此分析有后续想法,请在下面的 评论 或联系我们!!
推文@ SauravSingla _ 08、评论Saurav _ Singla以及明星SauravSingla对
批量标准化—直观的解释
为什么批量范数有助于训练深度学习模型?
这篇文章的目的是提供一个简单直观的理解批处理规范化(BN)以及它如何帮助训练更深更好的模型。我们开始吧,好吗?
开始吧!伊恩·杜利在 Unsplash 上拍摄的照片
前奏:
一般来说,规范化是指将不同范围的数字压缩到一个固定的范围。例如,考虑简单双参数模型 f(x)的输入 x1 和 x2
f(x)= w1 * x1+w2 * x2
如果 x1 和 x2 处于完全不同的范围,比如 x1 的范围是[1000–2000]而 x2 的范围是[0.1–0.5],那么按原样使用它们就意味着优化我们的损失函数。直观地说,在这种情况下,模型参数没有一个公平的竞争环境,网络容易被 w1 压倒。通过将 x1 和 x2 的范围归一化为[0–1 ],可以使所有输入达到相似的范围,并帮助模型更快地学习。这是应用于输入的规范化的特例,称为 输入规范化 (咄!).在计算机视觉中,通常使用训练数据集的平均值和标准差来标准化模型输入。如果你仍然困惑,我推荐这个来自吴恩达的简短的视觉解释。
好了,有了上述直觉,让我们问这个问题:考虑到输入只是深层神经网络(DNN)的另一层,那么模型的其他层的输入呢?将这些中间输入标准化是否也有益?
这就引出了我们的问题陈述。
问题——或者说我们为什么需要批量定额:
深度学习模型通常是一系列级联的层,每一层都接收一些输入,应用一些计算,然后将输出移交给下一层。本质上,每一层的输入构成了该层试图以某种方式“适应”的数据分布。现在,只要一个层的输入数据分布在数据的多个批处理/传递中保持相当一致,该层就可以轻松地完成拟合数据的“任务”。
但是模型/网络管道的本质使得这种一致的输入分布的期望变得困难。随着不同的小批量数据在网络中加载和传递,各层的输入分布会发生跳跃,使我们的各层更难完成工作。除了拟合基础分布之外,所讨论的图层现在还必须考虑图层输入分布中的漂移。这种转移输入分布的现象被称为 内部同变量转移 。
另一个问题是,当网络的不同参数的比例与梯度更新相关联时,它们可能导致 爆炸和消失梯度 。一些激活可能会被推到它们的饱和区域,并且可能永远不会从那里恢复。直观上,模型参数不再具有公平的竞争环境(就像前面提到的 f(x)中 w1 和 w2 的比例一样),并且一些参数的梯度可能不受控制地增加和减少。因此,从梯度更新中分离网络参数的比例可能有利于训练。 避免爆炸和消失梯度的变通方法通常包括使用更鲁棒的激活函数,如***【ReLU】,*** 选择较低的学习速率和小心初始化网络参数,但由于有许多旋钮要调节,核心问题仍然存在:训练我们的 DNN 是一个挑战。
解决方案:
批处理规范化旨在解决我们上面描述的问题:
- 避免不稳定的梯度
- 减少网络初始化对收敛的影响。
- 允许更快的学习速率导致更快的收敛。
所有这些都是通过一个相当简单的方法→ 来实现的,即使用数据集均值和标准偏差 来归一化每个中间层的输入。理想情况下,与输入归一化一样,批处理归一化也应基于整个数据集归一化每个图层,但 t 这并非微不足道,因此作者进行了简化: 使用小型批处理统计数据而非 进行归一化,因此得名—批处理归一化。
就是这样!
不完全是,我还没有复制粘贴强制 BN 方程!
图片来自http://arxiv.org/abs/1502.03167
在上面的片段中,前三个方程计算批次平均值和标准差,然后分别用这些矩对输入进行归一化。第三步中的ε是一个小数值,有助于数值稳定性。需要注意的关键点是,对批处理中的所有输入维度分别进行归一化(在卷积术语中,认为是通道)
最后一个等式引入了两个参数-> *伽马(缩放)和贝塔(移位)*来进一步变换归一化的输入。原因是简单的标准化通过限制其范围降低了后续激活的表达能力(对于 sigmoid,这将限制其输出到 S 曲线的线性范围)。为了克服这一点,BN 允许网络学习 gamma 和 beta 参数,以便让层“调整”标准化的输入分布,使其更具表现力。与每个小批量计算的平均值和方差相反,伽马和贝塔参数是在整个数据集上学习的。
BN 有助于内部协变量转移->神话还是事实?
在介绍 BN 时,我说它有助于解决内部同变量转移的问题,这也是最初的作者声称的。但是,经过几年的辩论和研究,最近的证据指出情况可能并非如此。批次标准和内部协变量移位可能无关。事实上,在某些情况下,BN 实际上可能增加内部同变移位!
一个这样的实验训练了三个不同的模型:
1.没有国阵的 DNN
2.一个 DNN 与和 BN
3.具有 BN 的 DNN ,但是现在具有添加噪声的(在应用 BN 之后并且在应用激活以创建同变量移位之前)。****
结果表明,后两种模型更快地达到更好的精度,这是预期的,因为它们使用了 BN。然而,第二种模式并不比第三种模式好多少。这表明,虽然 BN 确实有助于更好的训练制度,但它可能与内部协变量变化无关。
那么,BN 到底为什么有效呢?
有些答案很直观。由于 BN 对每一层的输入进行归一化,这将梯度从网络参数的规模中解耦,从而防止不稳定的梯度。这也允许更高的学习率,因为网络现在有更少的机会卡住。所有这些都是稳定训练体制的关键因素。
进一步观察发现,BN 实际上将优化过程(准确地说是损失面)重新参数化为更平滑的状态。直观地说,这意味着 BN 采用了一个充满山丘和山谷的复杂损失表面,并使其变得更简单,山丘和山谷越来越少。优化过程现在可以朝着全局最优迈出更有信心和更大的步伐(具有更大的学习率),并且陷入可怕的局部最优的机会更少。用专业术语来说,这被描述为“平滑损失函数的】Lipschitz ness”。**
我在参考资料部分包括了所有的资源,如果你想了解更多关于 BN 的细节,我强烈推荐你阅读前三篇文章。
今天到此为止,各位!一如既往的感谢阅读!
参考
- 约夫和塞格迪(2015 年)。批量标准化:通过减少内部协变量偏移来加速深度网络训练。http://arxiv.org/abs/1502.03167
- 比约克、戈麦斯、塞尔曼和温伯格。了解批量标准化。
https://arxiv.org/abs/1806.02375 - 桑图尔卡,齐普拉斯,伊利亚斯,麻省理工学院,˛。批量规范化对优化有什么帮助? https://arxiv.org/abs/1805.11604
- https://www.jeremyjordan.me/batch-normalization/
解释了神经网络中的批量标准化(算法分解)
理解深度神经网络中使用的一种常见转换技术
瓦迪姆·谢尔巴科夫在 Unsplash 上拍摄的照片
介绍
批量归一化(BN) 是很多机器学习从业者都会遇到的技术。如果你曾经使用过卷积神经网络,比如exception、 ResNet50 和 Inception V3 ,那么你就使用过批量归一化。
这篇文章解释了 BN 背后的基本直觉。对于那些已经熟悉 BN 技术的人来说,这篇文章深入研究了 BN 算法并解释了它的关键部分。
定义
批量标准化是一种减轻深度神经网络中不稳定梯度影响的技术。BN 为神经网络引入了一个附加层,该层对来自前一层的输入执行操作。
该操作对输入值进行标准化和规范化。然后,输入值通过缩放和移位操作进行转换。
如果这令人困惑,下面的下一节将使该技术变得更加清晰。
说明
Christian Szegedy 和 Sergey Ioffe 于 2015 年在这篇已发表的论文中提出了批量标准化技术。
通过在神经网络层内引入输入值的内部标准化,执行批量标准化作为加速深度神经网络训练阶段的解决方案。
术语“批处理规范化”中使用“批处理”的原因是因为神经网络通常一次用一组经过整理的数据进行训练,这组或一组数据被称为批处理。BN 技术中的运算发生在整批输入值上,而不是单个输入值上。
通常,在机器学习中,在将数据传递到输入层之前,通常会对输入数据进行规范化。我们规范化的部分原因是为了确保我们的模型能够适当地一般化。这是通过确保值的比例是平衡的来实现的,并且尽管值的比例变化,值的范围也是保持和成比例的。
通常对输入数据进行规范化,但是网络中的内部数据流应该保持规范化。
BN 是在神经网络层之间传递的输入值内标准化的内部实施者。内部标准化限制了通常发生在层内激活的协变量偏移。
如前所述,BN 技术的工作原理是对进入 BN 层的输入数据执行一系列操作。下面是一个小批量 BN 算法的数学符号片段。
官方研究论文中提出的批量归一化操作
上图中的数学符号可能看起来有点吓人,但是有一些主要的要点。
- 输入数据的标准化
- 输入数据的归一化和重新缩放
- 偏置的输入数据
标准化是将一批输入数据转换为平均值为零、标准差为一的操作。在 BN 算法中,我们需要计算最小批量的平均值,然后计算方差。方差提供了关于标准偏差的信息;我们只需要求方差的平方根。
让我们分解算法的数学符号,解释这个过程。
计算当前小批量的平均值
第一个操作计算小批量内输入的平均值。运算的结果是一个包含每个输入平均值的向量。
m 指小批量的投入数量。
谓卑鄙。
B 是指当前批次的下标。
xi 是输入数据的一个实例。
一批(‘B’)的平均值(’)是通过该批的几个输入实例的总和除以输入总数(‘m’)来计算的。
计算当前小批量的差异
在上面的操作中,输入方差( σ )通过平方输入的标准偏差来计算。为了计算标准偏差,我们取当前小批量中的每个输入实例( Xi ),减去在先前操作中计算的小批量的平均值( B ),并对结果求平方。
这个值然后被平方以获得方差( σ )。
标准化输入
现在我们有了零定心和标准化输入所需的所有值。在上面的操作中,我们对输入数据进行了标准化处理。术语标准化和规范化可以互换使用。这两个术语之间有细微的差别。
在上面的操作中,从每个输入时刻减去批次的平均值。然后我们将结果除以当前批次的标准偏差值与平滑项( ε )相加的平方根值。
平滑项( ε )通过停止除以零值来确保运算中的数值稳定性。平滑项通常为 0.00005。
缩放和偏移输入
在最后一个操作中,输入值的重新缩放和偏移发生。该操作的输出是 BN 算法对当前小批量的结果。
在最后的操作中,我们介绍了 BN 算法的两个新组件。这些分量是参数向量,用于包含来自先前操作的值的向量的缩放( γ )和移位( β )。用于缩放和移位的参数向量的值是可学习的参数。在神经网络训练期间,BN 确保可学习的参数是能够使每个小批量精确标准化的最佳值。
BN 变换是提高深度神经网络性能的有效方法。
批量标准化的好处
- 在深度神经网络中包括批量标准化技术改进了训练时间
- BN 能够利用更大的学习速率,这在训练神经网络时缩短了收敛时间
- 减少渐变消失的常见问题
- 减少了神经网络内的协变量移位
结论
BN 背后的算法并没有看起来那么复杂。
通过引入现代机器学习库,如 TensorFlow 和 PyTorch ,抽象出在神经网络内实现 BN 的复杂性。这使得在神经网络中实现 BN 成为一项微不足道的任务。
理解批处理规范化算法如何操作仍然是一项有价值的技能。
3 个理解层次的批量标准化
入门
到目前为止,我们对它了解多少:从 30 秒摘要到综合指南
T 网上有很多关于批量归一化(BN)的内容。然而,他们中的许多人都在捍卫一种过时的直觉。我花了很多时间将所有这些零散的信息放在一起,以建立对这个基本方法的良好直觉,我认为一步一步的演练可能对一些读者有用。
特别是,这个故事旨在带来:
- 从到三级理解的更新解释:30 秒,3 分钟,全面指导;
- 涵盖关键要素以充分利用 BN;
- **在 Google Colab **、中使用 Pytorch 实现 BN 层的简单实现,从官方论文中复制基于 MNIST 的实验(随意摆弄笔记本);
- 理解为什么 BN 仍然不为人所知(甚至在阅读了高质量作者的解释之后!).
让我们投入进去吧!
概观
a)30 秒
B) 再过 3 分钟
— 1.原理
— — 1.1.培训
— — 1.2.评估
— 2.在实践中
— 3.结果概述
C) 了解批量归一化(BN)
— 1.实施
— 2.实践中的 BN
— — 2.1.原文章结果
— — 2.2.正规化,一个 BN 副作用
— — 2.3.评估期间的标准化
— — 2.4.稳定性问题
— — 2.5.递归网络&图层归一化
— — 2.6.非线性之前还是之后?
— 3.BN 为什么管用?
— — 3.1.第一个假设:围绕内部协变量移位(ICS)的困惑
— — 3.2.第二个假设:减轻分布之间的相互依赖性
— — 3.3.第三个假设:使优化前景更加平滑
— 4.总结:我们现在了解了什么
A)在 30 秒内
**【BN】是一种算法方法,使深度神经网络【DNN】训练更快。
它由使用当前批次的第一和第二统计矩(均值和方差)归一化来自隐藏层的激活向量组成。这个归一化步骤正好在非线性函数之前(或之后)应用。****
多层感知器(MLP) 无批量归一化(BN) | 鸣谢:作者-设计:娄高清
多层感知器(MLP)(BN)|鸣谢:作者-设计:娄高清
所有当前的深度学习框架都已经实现了应用批量规范化的方法。它通常用作模块,可以作为标准层插入到 DNN 中。
备注:对于那些喜欢阅读代码而不是文本的人,我在 这个 repo 中写了一个简单的批量规范化实现。
b)3 分钟后
B.1)原则
在训练和测试阶段,批处理规范化的计算方式不同。
B.1.1)培训
在每个隐藏层,批量标准化将信号转换如下:
**********
BN 层首先使用(1)和(2)确定整批激活值的均值𝜇 和方差σ* 。*****
然后用(3)归一化激活向量*【z^(i】。这样,每个神经元的输出都遵循一个标准的正态分布。(𝜀是用于数值稳定性的常数)***
****批量归一化第一步。一个 3 神经元隐藏层的例子,批量大小为 b。每个神经元遵循标准正态分布。 | 鸣谢:作者-设计:娄高清
它最终通过应用带有两个可训练参数(4)的 𝛾 和 𝛽 的线性变换来计算层的输出****ẑ(i】。该步骤允许模型通过调整以下两个参数来为每个隐藏层选择最佳分布:****
- 𝛾 允许调整标准偏差;
- 𝛽 允许调整偏差,将曲线移向右侧或左侧。
**𝛾和𝛽 参数的好处。修改分布(顶部)允许我们使用非线性函数的不同机制(底部)。 | 鸣谢:作者—设计:娄高清
备注:解释 BN 层有效性的理由容易受到误解和错误的影响(即使在原文中也是如此)。最近的一篇论文[2]反驳了一些错误的假设,提高了社区对这种方法的理解。我们将在第 C.3 节讨论这个问题:“BN 为什么起作用?”。
在每次迭代中,网络计算与当前批次相对应的平均𝜇和标准差σ。然后,它通过梯度下降训练 𝛾 和 𝛽,使用指数移动平均(EMA) 赋予最新迭代更多的重要性。
B.1.2)评估
与训练阶段不同,在评估阶段,我们可能没有完整的批次输入到模型中。
为了解决这个问题,我们计算( 𝜇 _pop, σ _pop),如:
- 𝜇 _pop:研究人群的估计均值;
- σ _pop:研究人群的估计标准差。
使用在训练期间确定的所有( 𝜇 _batch, σ _batch)来计算那些值,并且在评估期间直接馈入等式(3)(而不是调用(1)和(2))。
备注:我们将在第 C.2.3 节“评估期间的标准化”中深入讨论该问题。
B.2)实际上
在实践中,我们将批量归一化视为一个标准层,如感知器、卷积层、激活函数或漏失层。
每个流行的框架都已经实现了批处理规范化层。例如:
py torch:torch . nn . batch norm 1d, torch.nn.BatchNorm2d , torch.nn.BatchNorm3d
tensor flow/Keras:TF . nn . batch _ normalization,TF . Keras . layers . batch normalization
所有 BN 实现都允许您独立设置每个参数。然而,输入向量大小是最重要的一个。它应该设置为:
- 当前隐层有多少神经元(针对 MLP);
- 当前隐藏层中有多少个过滤器(对于卷积网络)。
看看你最喜欢的框架的在线文档,并阅读 BN 层页面:它们的实现有什么特别的吗?
B.3)结果概述
即使我们还不理解批处理规范化的所有底层机制(参见 C.3),但有一点大家都同意:它工作。
为了获得第一个洞察力,让我们看看官方文章的结果[1]:
****图 1:BN 如何影响训练。ImageNet(2012)验证集上的准确度,相对于训练迭代次数。比较了五个网络:“初始”是标准初始网络[3],“BN-X”是具有 BN 层的初始网络(对于 3 种不同的学习速率:x1,x5,x30,初始最优网络,“BN-X-Sigmoid”是具有 BN 层的初始网络,其中所有的 ReLU 非线性被 Sigmoid 代替。|来源:[1]
结果很明显:BN 层使训练更快,而允许更大范围的学习速率而不会影响训练的收敛性。****
备注:此时,你应该对 BN 层有足够的了解来使用它们。然而,如果您想从批处理规范化中获得最大收益,您将需要更深入地挖掘!
批量归一化和这张图有什么联系? |信用:达尼洛·阿尔维斯上 Unsplash
c)了解批量标准化(BN)
C.1) 实施
我已经用 Pytorch 重新实现了批处理规范化层,以再现原始的论文结果。代码可以在这个 github 库上找到。
我建议你看看网上的一些 BN 层的实现。看看在自己喜欢的框架里是怎么编码的,很有启发!
实践中的 BN 层
在深入理论之前,让我们先从批处理规范化有哪些确定性开始。
在本节中,我们将看到:
- BN 如何影响培训绩效?为什么这种方法在如今的深度学习中如此重要?****
- 我们必须注意哪些副作用?
- ****当和我们应该如何使用 BN?
C.2.1)来自原始文章的结果
如前所述,BN 被广泛使用,因为它几乎总是让深度学习模型表现得更好。****
官方文章[1]进行了 3 个实验来说明其方法的有效性。
首先,他们在 MNIST 数据集(手写数字)上训练了一个分类器。该模型由 3 个完全连接的层组成,每层 100 个神经元,全部由 sigmoid 功能激活。他们已经使用随机梯度下降(SGD)和相同的学习率(0.01)对该模型训练了两次(有和没有 BN 层)50 000 次迭代。请注意,BN 层正好放在激活函数之前。
您可以轻松地再现这些结果,而无需 GPU,这是一个更熟悉这个概念的好方法!
图 2:BN 如何影响简单多层感知器(MLP)的训练 |左:训练精度 w.r.t .迭代|右:训练损失 w.r.t .迭代|作者
看起来不错!批处理规范化提高了我们的网络性能,包括损失和准确性。
第二个实验包括查看隐藏层中的激活值。以下是对应于最后一个隐藏层(就在非线性之前)的图:
图 3 : 批量归一化对最后一个隐藏层激活值的影响| 鸣谢:作者
如果没有批处理规范化,激活的值在第一次迭代中会有很大的波动。相反,当使用 BN 时,活化曲线更平滑。
图 4 : 批量标准化对隐藏层激活的影响 |有 BN 的模型比没有 BN 的模型有更平滑的激活曲线| Credit : author
此外,当添加 BN 层时,信号噪声更小。这似乎使模型的收敛更容易。
这个例子没有显示批处理规范化的所有好处。
官方文章进行了第三次实验。他们希望在更大的数据集 ImageNet (2012)上添加 BN 图层时比较模型性能。为此,他们训练了一个强大的神经网络(当时),名为 Inception [3]。最初,这个网络没有任何 BN 层。他们添加了一些,并通过修改其学习率来训练模型(x1,x5,x30 以前的最佳值)。他们还试图在另一个网络中用 sigmoid 替换每个 ReLU 激活功能。然后,他们将这些新网络的性能与原来的进行了比较。
以下是他们得到的结果:
图 5 : 批量归一化对训练的影响(ImageNet) |《盗梦空间》:原网[3];“BX-基线”:与 BN 的 Inception 相同,学习率(LR)相同;“BX-x5”:与 BN、LR x5 的《盗梦空间》相同;“BX-x30”:与 BN 的 Inception 相同,LR x30“BN-x5-Sigmoid”:与 Inception 相同,使用 BN、LR x5 和 Sigmoid 代替 ReLU | Source : [1]
从这些曲线中我们可以得出以下结论:
- 增加 BN 层导致更快和更好的收敛(其中更好意味着更高的精度);****
在如此大的数据集上,这种改善比在小 MNIST 数据集上观察到的改善要显著得多。
- 增加 BN 层允许我们使用更高的学习速率(LR)而不影响收敛;****
作者已经成功训练了他们的 Inception-with-BN 网络,使用了比原始网络高 30 倍的学习速率。请注意,5 倍大的 LR 已经使普通网络发散了!****
这样,就更容易找到一个“可接受的”学习率:位于欠拟合和梯度爆炸之间的 LR 的间隔要大得多。
此外,较高的学习率有助于优化器避免局部极小值收敛。受到鼓励去探索,优化器将更容易收敛于更好的解决方案。****
- 基于 sigmoid 的模型 达到了与基于 ReLU 的模型的竞争结果
我们需要后退一步,看看更大的图景。我们可以清楚地看到,与 sigmoid 模型相比,基于 ReLU 的模型可以获得略好的性能,但这不是这里的重点。
为了说明为什么这个结果是有意义的,让我重新表述一下 Ian good fellow(GANs[6]的发明者,著名的“深度学习”手册的作者)对此的看法:
在 BN 之前,我们认为在隐藏层中使用 sigmoid 有效地训练深度模型几乎是不可能的。我们考虑了几种解决训练不稳定性的方法,比如寻找更好的初始化方法。这些解决方案很大程度上是启发式的,而且太脆弱,不令人满意。批量归一化使那些不稳定的网络可训练;这个例子说明了这一点。
——伊恩·古德菲勒(改编自:来源)
现在我们明白了为什么 BN 对深度学习领域有如此重要的影响。
这些结果为提供了批处理标准化对网络性能的益处的概述。然而,有一些副作用,你应该记住,以获得最大的 BN。****
C.2.2)规则化,一个 BN 副作用
BN 依靠批量第一和第二统计矩(均值和方差)来归一化隐藏层激活。然后,输出值与当前批次统计数据紧密相关。根据当前批处理中使用的输入示例,这种转换会增加一些噪声。
添加一些噪声以避免过度拟合…听起来像是一个正则化过程,不是吗?;)****
在实践中,我们不应该依靠批量归一化来避免过拟合,因为正交性很重要。简而言之,我们应该始终确保一个模块解决一个问题。依靠几个模块来处理不同的问题使得开发过程比需要的要困难得多。
尽管如此,了解正则化效应还是很有趣的,因为它可以解释网络中的一些意外行为(尤其是在健全性检查期间)。
备注:批量越大,正则化越小(因为它减少了噪声影响)。
如果我们想在如此出色的嵌入式系统上部署批量规范化模型,该怎么办? |信用:玛利亚·卡斯特利于 Unsplash
评估过程中的标准化
有两种情况可以在评估模式中调用模型:****
- 在进行交叉验证或测试时,在模型训练和开发过程中;****
- 当部署模型时。****
在第一种情况下,为了方便起见,我们可以使用当前的批处理统计数据来应用批处理规范化。在第二个例子中,使用同样的方法没有意义,因为我们不一定要预测整个批次。
让我们看一个带有嵌入式摄像头的机器人的例子。我们可以有一个模型,使用当前的框架来预测任何即将到来的障碍的位置。因此,我们希望每次迭代都在单个帧(即一个 rgb 图像)上计算推断。如果训练批量为 N,我们应该为模型期望的(N - 1)个其他输入选择什么来进行前向传播?
记住,对于每一个 BN 层,( 𝛽 , 𝛾 )都是使用归一化信号训练的。所以我们需要确定 (𝜇,σ) 才能有有意义的结果。****
一种解决方案是选择任意值来完成批量。通过将第一批输入到模型中,我们将获得感兴趣的图像的某个结果。如果我们用其他随机值构建第二批,我们将对同一幅图像有不同的预测。一个输入两个不同的输出不是理想的模型行为。
这一招就是定义( 𝜇 _pop, σ _pop),分别是目标人群的估计均值和标准差。这些参数计算为训练期间确定的所有( 𝜇_ 批次,σ_ 批次)的平均值。****
我们就是这么做的!
备注:这个技巧可能会导致评估阶段的不稳定性:让我们在下一部分讨论它。
C.2.4) BN 层稳定性
尽管批处理规范化工作得很好,但它有时会导致稳定性问题。存在 BN 层在评估阶段使激活值爆炸的情况(使模型返回 loss = NaN)。
我们刚刚提到如何确定( 𝜇 _pop, σ pop),以便在评估期间使用它们:我们计算在训练期间计算的所有( **𝜇 批次,σ_ 批次)的平均值。**
让我们考虑一个只在包含运动鞋的图像上训练的模型。如果测试集中有类似德比的鞋子呢?
如果输入分布从训练到评估变化太大,模型可能对某些信号、反应过度,导致活动发散。 |信用:格里夫(左)叶佳(右)在 Unsplash
我们假设隐藏层的激活值在训练和评估期间将具有显著不同的分布——可能太多了。在这种情况下,估计的(𝜇_pop,σ_pop)不能正确估计真实总体均值和标准差。应用( 𝜇 _pop, σ _pop)可能会将激活值推离(𝜇 = 0,σ = 1),导致高估激活值。
备注:训练集和测试集之间分布的移动称为“协变量移动”。我们将在(C.3 .)节中再次讨论这种效应。
BN 的一个众所周知的特性增加了这种效果:在训练期间,激活值使用它们自己的值进行归一化。在推断期间,使用训练期间已经计算的( 𝜇 _pop, σ _pop)对信号进行归一化。因此,用于标准化的系数不考虑实际激活值本身。****
一般来说,训练集必须与测试集“足够相似”:否则,就不可能在目标任务上正确地训练模型。所以在大多数情况下, 𝜇 _pop 和 σ _pop 应该很适合测试集。如果不是,我们可以得出结论,训练集不够大,或者它的质量对于目标任务来说不够好。
但是有时候,就这么发生了。这个问题并不总是有一个干净的解决方案。
我曾亲自面对过一次,在肺纤维化进展卡格尔比赛期间。训练数据集由元数据和与每个患者相关的肺部 3D 扫描组成。这些扫描的内容是复杂多样的,但是我们只有大约 100 名患者来分成训练集和验证集。结果,当模型从训练模式切换到评估模式时,我想用于特征提取的卷积网络返回 NaN。调试愉快。
当您无法轻松获得额外的数据来增强您的训练集时,您必须找到一种变通方法。在上面的例子中,我已经手动强制 BN 层也在验证集上进行计算( 𝜇 _batch, σ _batch)。(我同意,这是一种丑陋的修复方式,但我没有时间了。;) )
在你的网络中增加 BN 层——假设它不会有负面影响——并不总是最好的策略!
C.2.5)递归网络和层标准化
在实践中,人们普遍承认:
- 对于卷积网络(CNN) : 批量归一化(BN) 比较好
- 对于递归网络(RNN) : 图层归一化(LN) 比较好
BN 使用当前批次来规格化每个单个值,而 LN 使用所有当前层来进行规格化。换句话说,使用来自单个示例的其他特征来执行归一化,而不是在所有当前批量示例中使用相同的特征。这种解决方案对于循环网络似乎更有效。注意,很难为这些种类的神经元定义一致的策略,因为它们依赖于相同权重矩阵的多次乘法。我们是否应该独立地规范化每一步?或者我们应该计算所有步骤的平均值,然后递归地应用标准化?(直觉论证的来源 : 这里 )
我不会在这个问题上做任何进一步的详述,因为这不是本文的目的。
C.2.6)非线性之前还是之后?
从历史上看, BN 层位于**非线性函数之前,这与作者当时的目标和假设一致:**
他们在文章中指出:
“我们希望确保,对于任何参数值,网络总是产生具有期望分布的激活。”
——谢尔盖·约菲和克里斯蒂安·塞格迪(来源:[1])
一些实验表明,在非线性函数之后立即定位 BN 层会导致更好的结果。这里有一个的例子。****
Keras 的创始人、现任谷歌工程师的 Franç ois Chollet 表示:
“我还没有回去检查他们在原始论文中的建议,但我可以保证克里斯蒂安[塞格迪] 最近写的代码在 BN 之前应用 relu。不过,这偶尔还是一个争论的话题。
—弗朗索瓦·乔莱(来源)
尽管如此,许多常用的迁移学习架构在非线性之前应用 BN(ResNet,mobilenet-v2,…)。
请注意,文章[2]质疑了原文章[1]所捍卫的解释 BN 有效性的假设(见 C.3.3)),将 BN 层放在激活函数之前,但没有给出充分的理由。
据我所知,这个问题还在讨论。
延伸阅读:这里有一个有趣的 reddit 线程——即使有些论点没有说服力——激活后大多赞成 BN。**
我那些乱七八糟的代码到底为什么能工作?| 信用: Rohit 农民上 Unsplash
C.3)批量归一化为什么有效?
在大多数情况下,批处理规范化提高了深度学习模型的性能。太好了。但是我们想知道黑匣子里到底发生了什么。
这就是事情变得有点棘手的地方。
问题是:我们还不确切知道是什么让批处理规范化工作得这么好还是。DL 社区中经常讨论一些假设:我们将一步一步地探索它们。****
在开始讨论之前,我们将看到以下内容:
- 原文[1]假设 BN 有效性是由于的减少他们称之为内部协变量移位* (ICS)。最近的一篇论文[2]驳斥了这一假设。(参见 C.3.1)*****
- 另一个假设更加谨慎地取代了第一个假设:BN 减轻了训练过程中各层之间的相互依赖性。(参见 C.3.2)
- 麻省理工学院最近的一篇论文[2]强调了 BN 对优化景观平滑度的影响,使得训练更加容易。(参见 C.3.3)****
我敢打赌,探索这些假设将有助于您建立一个关于批处理规范化的强大直觉。
我们走吧!
C.3.1)假设 n 1 — BN 减少了内部协方差偏移(ICS)
批量正常化尽管对 DNN 的表现有着根本性的影响,但仍然会受到误解。
关于 BN 的困惑大多是由于原始文章【1】支持的错误假设。****
Sergey Ioffe 和 Christian Szegedy 对 BN 介绍如下:
“在训练过程中,我们将深度网络内部节点分布的变化称为内部协变量移位。[……]我们提出了一种新的机制,我们称之为批量标准化*,它向减少内部协变量偏移迈出了**的一步,并在这样做的过程中极大地加速了深度神经网络的训练。”*******
——谢尔盖·约菲和克里斯蒂安·塞格迪(来源:[1])
换句话说,BN 是有效的,因为它部分地解决了内部协变量转移的问题。
****这种说法受到了后来作品的严峻挑战【2】。
批注:从现在开始, ICS 指内部协变移位。
**为了理解是什么导致了这样的混乱,让我们从讨论什么是协变量移位 i ,开始,以及它是如何受到归一化的影响的。
什么是协变量转移(分布稳定性观点)?
[1]的作者明确地定义了它:协变量转移——从分布稳定性的角度——描述了一个模型输入分布的转移。推而广之,内部协变量移位描述了发生在深度神经网络的隐层*中的这种现象。*******
让我们通过一个例子来看看为什么它会成为一个问题。
让我们假设我们想要训练一个能够回答以下问题的分类器:这个图像包含一辆汽车吗?如果我们想从一个非常大的无标签数据集中提取所有的汽车图像,这样的模型将会节省我们大量的时间。
我们会有一个 RGB 图像作为输入,一些卷积层,然后是完全连接的层。输出应该是一个单一的值,输入到一个逻辑函数中,使最终值介于 0 和 1 之间——描述输入图像包含一辆汽车的概率。
图 5 : 一个 简单的 CNN 分类器。| 鸣谢:作者-设计:娄高清
为了训练这样一个模型,我们需要大量带标签的图像。
现在,假设我们只有用于训练的“普通”汽车。如果我们让模型给一级方程式赛车分类,它会有什么反应?
如前所述,协变量转移会使网络激活发散(第 C.2.4 节)。即使没有,也会降低整体性能! |演员表:迪瓦·克里希纳(左)和弗哈特·德尼兹·福斯(右)在 Unsplash
在这个例子中,在培训和测试分布之间有一个转移。更广泛地说,不同的汽车方向、闪电或天气状况足以影响我们的车型性能。这里,我们的模型不能很好地概括。
如果我们在特征空间中绘制提取的特征,我们将得到如下结果:
***图表 6.a : *为什么我们需要归一化模型输入值?案例没有规范化。在训练过程中,输入值是分散的:在点密度较高的地方,近似函数会非常精确。相反,在点的密度较低的情况下,它将是不准确的,并且服从随机性。(例如,近似曲线可以是绘制的 3 条线之一。) | 鸣谢:作者-设计:楼高清
假设十字描述与不包含任何汽车的图像相关的特征,而圆环描述包含汽车的图像。在这里,一个函数可以将两个系综分开。但是在图的右上角,函数可能不太准确:没有足够的点来确定一个好的函数。这可能会导致分类器在评估过程中出现许多错误。****
为了有效地训练我们的模型,我们需要许多汽车图像,在任何我们可以想象的可能的环境中。即使这仍然是我们今天训练 CNN 的方式,我们也要确保我们的模型能够使用尽可能少的例子进行很好的概括。
这些问题可以总结如下:
从模型的角度来看,训练图像在统计上与测试图像差别太大。
有一个协变档*。***
我们可以用更简单的模型来面对这个问题。众所周知,线性回归模型在输入值归一化时更容易优化(即使其分布接近( 𝜇 = 0, σ = 1)):这就是为什么我们通常归一化一个模型的输入值。****
***图表 6.b : *为什么我们需要归一化模型输入值?规范化案例。在训练期间,标准化输入信号使特征空间中的点彼此更接近:现在更容易找到一个良好的概括函数。 | 鸣谢:作者—设计:楼高清
在 BN 论文发表之前,这种解决方案已经广为人知。对于 BN,[1]的作者希望将这种方法扩展到隐藏层,以帮助训练。
内部协变量转移恶化训练:原始论文假说
图 7:分布稳定性视角下的内部协变量移位(ICS)原理(ICS _ distrib)。 | 鸣谢:作者-设计:楼高清
在我们的汽车分类器中,我们可以将隐藏层视为单元,当它们识别出一些与汽车相关的“概念”特征时,就会被激活:它可能是一个车轮、一个轮胎或一扇门。我们可以假设前面描述的效果会发生在隐藏的单元中。有一定方向角的轮子会激活特定分布的神经元。理想情况下,我们希望让一些神经元对任何车轮方向的可比分布做出反应,这样模型就可以有效地推断出输入图像包含汽车的概率。**
如果输入信号中存在巨大的协变量偏移,优化器将很难很好地推广。相反,如果输入信号总是遵循标准的正态分布,那么优化器将更容易泛化。考虑到这一点,[1]的作者应用了在隐藏层标准化信号的策略。他们假设强制(𝜇 = 0,σ = 1)中间信号分布将有助于网络在特征的“概念”级别上的泛化*。***
然而,我们并不总是希望隐藏单元中的标准正态分布。这会降低模型的代表性:
***图表 8 : *我们为什么不总是要一个标准的正态分布在隐单元中。此处,sigmoid 函数仅在其线性范围内有效。 | 鸣谢:作者-设计:娄高清
最初的文章以 sigmoid 函数为例,说明为什么标准化本身就是一个问题。如果输入信号值介于 0 和 1 之间,非线性函数仅在其线性范围内工作。听起来有问题。
为了解决这个问题,他们添加了两个可训练参数 𝛽 和 𝛾 ,允许优化器为特定任务定义最佳均值(使用 𝛽 和标准偏差(使用 𝛾 )。
⚠Warning:下面的假设现在已经过时了。许多关于 BN 的伟大内容仍然声称它是使方法在实践中起作用的原因。然而,最近的作品对它提出了严峻的挑战。
在[1]发布后的几年里,DL 社区对 BN 有效性的解释如下:
—假设 1———
BN ➜ 输入信号的标准化在隐藏单元内➜添加两个可训练参数到调整分布并最大限度地利用非线性➜更容易训练**
这里,归一化到(𝜇 = 0,σ = 1)是 BN 有效性的主要解释。这一假设已经受到挑战(见第 C.3.3 节),被另一个假设所取代:
—假设 2————
隐藏单元内输入信号的 BN ➜归一化➜ 减少隐藏层之间的相互依赖性(从分布稳定性角度看)➜更容易训练
有一个微小但非常重要的区别。这里,规范化的目的是减少层之间的相互依赖性(从分布稳定性的角度来看),因此优化器可以通过只调整两个参数来选择最佳分布!让我们进一步探讨这个假设。
批量归一化和这张图有什么联系? |信用:达尼洛·阿尔维斯在 Unsplash 上
C.3.2)假设 n 2 — BN 减轻了训练期间隐藏层之间的相互依赖性
关于这一节:我找不到任何关于这一节所讨论的假设的确凿证据。因此,我决定主要依靠 Ian Goodfellow 对那件事的解释(特别是在 这个精彩的视频 )。
考虑下面的例子:
图 9 : 一个简单的 DNN ,它由线性变换组成。|灵感来自 Ian Goodfellow
其中(a)、(b)、©、(d)和(e)是网络的顺序层。这里有一个非常简单的例子,所有的层都通过线性变换连接起来。让我们假设我们想要使用 SGD 来训练这样的模型。
为了更新层(a)的权重,我们需要根据网络的输出计算梯度:
我们首先考虑一个没有 BN 层的网络。从上面的等式,我们得出结论,如果所有梯度都很大,grad(a)就会很大。相反,如果所有梯度都很小,grad(a)几乎可以忽略不计。
通过观察隐藏单元的输入分布,很容易看出各层之间的依赖程度:( a)权重的修改将修改(b)权重的输入分布,这将最终修改(d)和(e)的输入信号。这种相互依赖性对于训练稳定性可能是有问题的:如果我们想要 调整特定隐藏单元的输入分布,我们需要考虑整个层序列。
然而,SGD 考虑层之间的一阶关系。所以他们没有考虑到上面提到的更高程度的关系!
图解 10 : 假设 n 2 原理。BN 层通过标准化每个隐藏单元内部的信号,使信号调节更加容易,并允许使用 𝛽 和 𝛾 进行分布调节。BN 就像一个阀门,在某些点上使流量控制更容易,而不会恶化网络的潜在复杂性! | 鸣谢:作者-设计:楼高清
添加 BN 层显著降低了训练期间各层之间的相互依赖性(从分布稳定性的角度来看)。批量正常化就像一个阀门,阻止流量,并允许使用 𝛽 et 𝛾 进行调节。然后,不再需要考虑所有参数来获得隐藏单元内部分布的线索。
备注:优化器可以进行更大的权重修改,而不会影响其他隐藏层中调整后的参数。它使超参数调谐方式更容易!
这个例子抛开了声称 BN 有效性是由于中间信号分布的归一化到(𝜇 = 0,σ = 1)的假设。
在这里,BN 的目标是使优化器的工作更容易*,允许它调整隐藏层分布,一次只需两个参数。***
⚠ 然而,请记住这主要是猜测*。这些讨论应该被用作建立对 BN 的直觉的见解。我们仍然不知道为什么 BN 在实践中是有效的!***
2019 年,来自麻省理工学院的一组研究人员进行了一些关于 BN 的有趣实验[2]。他们的结果严重挑战了假设 n 1 (仍然被许多严肃的博客帖子和 MOOCS 分享!).
如果我们想避免关于 BN 对训练的影响的“局部极小假设”,我们应该看看这篇论文。)
C.3.3)假设 n3-BN 使优化前景更加平滑
关于这一部分:我已经综合了[2]的结果,这些结果可以帮助我们对 BN 建立更好的直觉。我不可能面面俱到,这篇文章很密集,如果你对这些概念感兴趣,我建议你通读一遍。
让我们直接进入[2]的第二个实验。他们的目标是检验 ICS 和 BN 对训练表现的益处之间的相关性*(假设 1)。***
符号:我们现在用ICS _ distrib来指代这个协变量移位。
为此,研究人员训练了三个 VGG 网络(在 CIFAR-10 上) :
- 第一个没有任何 BN 层;
- 第二个确实有 BN 层;
- 第三个类似于第二个,除了在激活之前他们已经在隐藏单元中明确添加了一些 ICS_distrib(通过添加随机偏差&方差)。**
他们测量了每个模型达到的精度,以及分布值随迭代的演变。以下是他们得到的结果:
***图 6:*ICS _ distrib |上的 BN,有 BN 的网络比标准的网络训练速度快;在受管制的网络上明确增加 ICS_distrib 不会损害 BN 的利益。|来源:[2]
***我们可以看到,第三个网络的 ICS 非常高。然而,**嘈杂的网络仍然比标准网络训练得更快。**其达到的性能可与使用标准 BN 网络获得的性能相媲美。这个结果表明 *BN 有效性与 ICS_distrib 无关。哎呀!
我们不应该太快抛弃 ICS 理论:如果 BN 有效性不是来自 ICS_distrib,它可能与 ICS 的另一个定义有关。毕竟,假设 n 1 背后的直觉是有道理的,不是吗?
ICS_distrib 的主要问题是它的定义与隐藏单元的输入分布有关。所以和优化问题本身没有直接联系。
[2]的作者提出了 ICS 的另一个定义:
让我们考虑一个固定的输入 x。
我们从优化的角度将内部协变量移位定义为在反向传播误差 L(X)_it 之后在隐藏层 k 上计算的梯度与在权重的迭代=* it 更新之后根据损失 L(X)_it+1 在同一层 k 上计算的梯度之间的差。***
该定义旨在更多地关注梯度而不是隐藏层输入分布,假设它可以为我们提供更好的线索,说明 ICS 如何影响底层优化问题*。***
符号:ICS _ opti现在指的是从优化角度定义的 ICS。
在下一个实验中,作者评估 ICS_opti 对训练绩效的影响。为此,他们测量了具有和不具有 BN 层的 DNN 在训练期间 ICS_opti 的变化。为了量化 ICS_opti 定义中提到的梯度变化,他们计算:
- ****L2 差:在权重更新之前和之后,梯度是否具有接近的范数?理想情况下:0
- 余弦角度:在权重更新前后,渐变是否具有相近的方向?理想情况下:1
图 7 : BN 对 ICS_opti 的影响 | L2 diff 和余弦角暗示 BN 并没有阻止 ICS_opti(似乎稍微增加了一点,不知怎么的)。|来源[2]
结果有点令人惊讶:依赖于 BN 的网络似乎比标准网络具有更高的 ICS_opti 。记住带 BN(蓝色曲线)的网络比标准网络(红色曲线)训练得快!
ICS 似乎肯定与训练表现无关…至少对于 ICS 的定义是这样的。
不知何故,批量归一化对网络产生了另一个* 的影响,这使得收敛更容易。***
现在,让我们研究一下BN 如何影响* 优化格局。我们可能会在那里找到线索。***
这是这个故事中的最后一个实验:
图 11 : 渐变方向的优化景观探索。论文中进行的实验[2] |灵感来自安德鲁·-设计:娄高清
从单个梯度,我们用不同的优化步骤更新权重(其作用类似于学习率)。直观地说,我们从特征空间中的某个点*(即网络配置ω) 定义一个方向,然后在这个方向上越来越远地探索优化景观。***
在每一步,我们测量坡度和损失*。因此,我们可以将优化领域的不同点与起点进行比较。如果我们测量大的变化,那么景观非常不稳定并且梯度是不确定的:大的步骤可能会恶化优化。相反,如果测量的变化很小,则景观是稳定的并且梯度是可信的:我们可以应用更大的步长而不损害优化。换句话说,我们可以用一个更大的学习速率,并使收敛得更快(BN 的一个众所周知的性质)。***
让我们来看看结果:
图 8 : BN 对优化景观平滑的影响 |使用 BN 显著减少梯度变化。|来源:[2]
我们可以清楚地看到BN 层的优化前景更加平滑*。***
我们终于有了可以用来解释 BN 有效性的结果:BN 层在某种程度上使得优化前景更加平滑。这使得优化器的工作更容易:我们可以定义一个更大的学习率,而不会受到梯度消失(权重停留在突然平坦的表面上)或梯度爆炸(权重突然落入局部最小值)的影响。
我们可以知道公式化的第三个假设,由[2]提出:
—假设三 : — — — — — —
BN ➜对隐单元➜内部输入信号的归一化使得优化景观更平滑* ➜更快更稳定的训练***
这又引出了另一个问题:BN 是如何让优化版图变得更加平滑的?
[2]的作者也从理论的角度探讨了这些问题。他们的工作很有启发性,有助于更好地掌握批处理规范化的平滑效果。特别是,他们表明 BN 使优化景观更加平滑,而保留了正常景观的所有最小值*。换句话说, BN 重新参数化底层优化问题,使训练更快更容易!***
⚠ 在额外的研究中,【2】的作者观察到这种效应并不是 BN* 独有的。他们用其他归一化方法(例如 L1 或 L2 归一化)获得了相似的训练性能。这些观察表明 BN 的有效性主要是由于偶然发现,利用了我们还没有完全识别的潜在机制。***
现在是时候设定一个非常高的学习率了。 |信用:寻找丹|丹·格林维斯上 Unsplash
作为本节的总结,本文对广为接受的观点提出了严峻挑战,即 BN 的有效性主要是由于 ICS 的减少(从训练稳定性分布的角度,以及从优化的角度)。但是,它强调了 BN 平滑效果对优化前景的影响。**
虽然本文陈述了一个关于 BN 对训练速度影响的假设,但它并没有回答为什么 BN 有助于推广。
他们简要地争辩说,使最优化前景更加平滑可以帮助模型收敛于平坦的最小值,后者具有更好的概括属性*。不过,没有更多细节了。***
他们的主要贡献是挑战了普遍承认的 BN 效应对 ICS 的影响——这已经很显著了!
C.4)总结:BN 为什么管用?目前我们知道些什么
- 假设 1 : BN 层减轻内部协变量偏移* (ICS)***
❌ 错:【2】表明,在实践中,ics 和训练成绩之间没有相关性。
- 假设 2 : BN 层通过允许其仅用两个参数调整隐藏单元的输入分布,使优化器的工作更加容易。**
***❓ **也许:**这种假设强调了参数之间的相互依赖性,使得优化任务更加困难。*没有确凿的证据,尽管如此。
- 假设三 : BN 层重新参数化底层优化问题,使其更加平滑稳定。**
❓:也许吧:他们的结果是最近才有的。据我所知,到目前为止,他们还没有受到挑战。他们提供了经验证明和一些理论论证,但是一些基本问题仍然没有答案(比如“BN 如何帮助一般化?”).
讨论:在我看来,后两种假设是兼容的。直观地说,我们可以把假设 n 2 看作是从一个有许多参数的问题到许多有几个参数的问题的投影;一种降维,这将有助于推广。有什么想法吗?
许多问题仍然悬而未决,批处理规范化仍然是当今的一个研究课题。讨论这些假设仍然有助于更好地理解这种常用的方法,抛弃一些我们已经想了几年的错误说法。
然而,这些问题并不妨碍我们在实践中利用 BN 的优势!
结论
批量归一化 (BN) 是近年来在深度学习* (DL)领域最重要的进展之一。依靠两次连续的线性变换,这种方法使得深度神经网络(DNN) 训练更快和更稳定**。***
关于什么使得 BN 在实践中有效,最广为接受的假设是在训练期间隐藏层之间的相互依赖的减少*。然而,优化景观平滑度的归一化变换影响似乎是 BN 有效性的重要机制。***
现在许多常用的 DNN 都依赖于 BN(例如:ResNet [4],EfficientNet [5],…)。
如果你对深度学习感兴趣,你肯定要熟悉这种方法!
开放问题
即使 BN 在多年的实践中看起来是有效的,许多关于其潜在机制的问题仍然没有答案。
以下是关于 BN 的未决问题的非详尽列表:
- BN 如何帮助泛化*?***
- BN 是使优化更容易的最佳归一化方法吗?
- 𝛽 等人 𝛾 如何影响优化景观平滑度?
- [2]进行的探索优化景观的实验集中在BN 对梯度的短期影响:他们测量了几个步长值的单次迭代的梯度&损失的变化。BN 如何长期影响坡度*?权重的相互依赖性对优化前景有其他有趣的影响吗?*****
承认
非常感谢 Lou haquet-dele pine 绘制的所有图表,以及她在校对方面的全面帮助!
参考
[1]约夫,s .,&塞格迪,C. (2015)。批量归一化:通过减少内部协变量移位加速深度网络训练, arXiv 预印本 arXiv:1502.03167 。
[2]桑图尔卡尔、齐普拉斯、易勒雅斯和马德瑞(2018 年)。批量规范化如何帮助优化?、神经信息处理系统的进展
[3] Szegedy,c .,Liu,w .,Jia,y .,Sermanet,p .,Reed,s .,Anguelov,d,…和 Rabinovich,A. (2015)。深入卷积,IEEE 计算机视觉和模式识别会议论文集
[4]何,王,张,徐,任,孙等(2016)。用于图像识别的深度残差学习。在IEEE 计算机视觉和模式识别会议论文集
[5]谭,m .,,乐,2019 . Efficientnet:反思卷积神经网络的模型缩放, arXiv 预印本 arXiv:1905.11946 。
[6] Goodfellow,I .、Pouget-Abadie,j .、Mirza,m .、Xu,b .、Warde-Farley,d .、Ozair,s .、A. Bengio,Y. (2014),生成对抗网络, 神经信息处理系统进展
更进一步
- 伊恩·古德费勒的精彩演讲。他在课程开始时谈到了批量标准化:链接
- 一名作者口头介绍论文[2]。观众提出尖锐的问题,开启关于国阵的精彩辩论:链接
- "我们应该把 BN 放在激活之前还是之后?"在 stackoverflow 上:链接
- "我们应该把 BN 放在激活之前还是之后?"在 reddit 上:链接
神经网络中的批量标准化(包括代码)
通过 TensorFlow (Keras)实施
克里斯托夫·高尔在 Unsplash 上拍摄的照片
介绍
批量归一化(BN) 是很多机器学习从业者遇到的一种技术。
如果你还没有,这篇文章解释了 BN 背后的基本直觉,包括它的起源以及如何使用 TensorFlow 和 Keras 在神经网络中实现它。
对于那些熟悉 BN 技术并想专注于实现的人来说,你可以跳到下面的代码部分。
对于那些可能对其背后的数学更感兴趣的人,请随意阅读下面的文章。
理解深度神经网络中使用的一种常见转换技术
towardsdatascience.com](/batch-normalization-explained-algorithm-breakdown-23d2794511c)
定义
批次正常化是一种技术,它透过引入额外的层来减轻神经网路内不稳定梯度的影响,该层会对前一层的输入执行作业。这些操作对输入值进行标准化和规范化,然后通过缩放和移位操作转换输入值。
密码
第一步是导入将用于实现或支持神经网络实现的工具和库。使用的工具如下:
- TensorFlow :一个开源平台,用于机器学习模型的实现、训练和部署。
- Keras :一个开源库,用于实现运行在 CPU 和 GPU 上的神经网络架构。
import tensorflow as tf
from tensorflow import keras
我们将利用的数据集是普通的时尚-MNIST 数据集。
时尚-MNIST 数据集包含 70,000 幅服装图像。更具体地说,它包括 60,000 个训练样本和 10,000 个测试样本,这些样本都是尺寸为 28×28 的灰度图像,分为十类。
数据集的准备包括通过将每个像素值除以 255.0 来归一化训练图像和测试图像。这将像素值置于范围 0 和 1 之间。
数据集的验证部分也在此阶段创建。这组数据集在训练期间被用来评估网络在各种迭代中的性能。
(train_images, train_labels), (test_images, test_labels) = keras.datasets.fashion_mnist.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0
validation_images = train_images[:5000]
validation_labels = train_labels[:5000]
Keras 提供了实现分类模型所需的工具。Keras 提出了一种顺序 API,用于以连续的方式堆叠神经网络的层。
下面是一些层的信息,这些层将被实现以构成我们的神经网络。
- 展平:取一个输入形状,将输入图像数据展平成一维数组。
- 密集:密集层中嵌入了任意数量的单元/神经元。每个神经元都是一个感知器。
- 感知器是人工神经网络的基本组成部分,由弗兰克·罗森布拉特于 1958 年发明。感知器利用基于阈值逻辑单元的操作。
- 批量规范化:批量规范化层通过对传入的输入数据执行一系列操作来工作。这组操作包括进入 BN 层的输入值的标准化、规范化、重缩放和偏移。
- 激活层:对神经网络内的输入执行指定的操作。这一层在网络中引入了非线性。本文中实现的模型将利用激活函数:整流线性单元(ReLU) 和 softmax 。
- 由 ReLU 对来自神经元的值施加的变换由公式 y=max(0,x)表示。ReLU 激活函数将来自神经元的任何负值钳制为 0,而正值保持不变。该数学变换的结果被用作当前层的激活,并作为下一层的输入。
# Placing batch normalization layer before the activation layers
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28,28]),
keras.layers.Dense(300, use_bias=False),
keras.layers.BatchNormalization(),
keras.layers.Activation(keras.activations.relu),
keras.layers.Dense(200, use_bias=False),
keras.layers.BatchNormalization(),
keras.layers.Activation(keras.activations.relu),
keras.layers.Dense(100, use_bias=False),
keras.layers.BatchNormalization(),
keras.layers.Activation(keras.activations.relu),
keras.layers.Dense(10, activation=keras.activations.softmax)
])
让我们来看看 BN 层的内部组件
仅仅访问索引 2 处的层将向第一 BN 层内的变量及其内容提供信息,
model.layers[2].variables
我不会在这里进入太多的细节,但请注意变量名’伽马’和’贝塔’,这些变量中的值负责层内激活的重新缩放和偏移。
for variable in model.layers[2].variables:
print(variable.name)>> batch_normalization/gamma:0
>> batch_normalization/beta:0
>> batch_normalization/moving_mean:0
>> batch_normalization/moving_variance:0
这篇文章详细介绍了 BN 层内的操作。
在密集层中,偏置分量被设置为假。偏差的省略是由于在激活的标准化过程中由于均值相减而发生的常量值的抵消。
下面是特斯拉现任人工智能总监安德烈·卡帕西(Andrej Karpathy)的一篇 twitter 帖子的片段。他的推文是基于经常犯的神经网络错误的主题,而不是在使用 BN 时将 bias 设置为 false。
在下一段代码中,我们设置并指定了用于训练已实现的神经网络的优化算法,以及损失函数和超参数,如学习速率和时期数。
sgd = keras.optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss="sparse_categorical_crossentropy", optimizer=sgd, metrics=["accuracy"])
现在,我们使用模型的顺序 API 的’ fit 方法来训练网络。我们将跳过关于如何训练神经网络模型的一些细节。有关神经网络的训练和实现的详细解释的进一步信息,请参考下面的链接。
[## 使用 TensorFlow 2.0 进行(深入)机器学习图像分类
理解实现用于图像分类的神经网络的过程。
towardsdatascience.com](/in-depth-machine-learning-image-classification-with-tensorflow-2-0-a76526b32af8)
model.fit(train_images, train_labels, epochs=60, validation_data=(validation_images, validation_labels))
使用先前搁置的测试数据进行模型性能的评估。
通过评估结果,您可以在观察测试数据集评估的准确性后,决定微调网络超参数或继续生产。
model.evaluate(test_images, test_labels)
在训练阶段,您可能会注意到,与没有批量归一化图层的训练网络相比,每个历元的训练时间更长。这是因为批量标准化增加了神经网络的复杂性,以及模型在训练期间学习所需的额外参数。
尽管每个历元时间的增加与批量标准化减少了模型收敛到最优解所需的时间这一事实相平衡。
本文中实现的模型太浅,我们无法注意到在神经网络架构中使用批处理规范化的全部好处。通常情况下,批量归一化出现在更深层次的卷积神经网络中,如异常、 ResNet50 和 Inception V3 。
额外的
- 上面实现的神经网络在激活层之前具有批量标准化层。但是在激活层之后添加 BN 层是完全可能的。
# Placing batch normalization layer after the activation layers
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28,28]),
keras.layers.Dense(300, use_bias=False),
keras.layers.Activation(keras.activations.relu),
keras.layers.BatchNormalization(),
keras.layers.Dense(200, use_bias=False),
keras.layers.Activation(keras.activations.relu),
keras.layers.BatchNormalization(),
keras.layers.Dense(100, use_bias=False),
keras.layers.Activation(keras.activations.relu),
keras.layers.BatchNormalization(),
keras.layers.Dense(10, activation=keras.activations.softmax)
])
结论
BN 是神经网络中常用的技术,因此理解该技术如何工作以及如何实现将是有用的知识,尤其是在分析大多数神经网络架构时。
下面是 GitHub 到一个笔记本的链接,其中包含了本文中的代码片段。
[## Richmond alake/tensor flow _ 2 _ 教程
permalink dissolve GitHub 是 4000 多万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/RichmondAlake/tensorflow_2_tutorials/blob/master/04_batch_normalisation.ipynb) [## 你应该读机器学习硕士吗?
包含来自理学硕士毕业生的想法和意见
towardsdatascience.com](/should-you-take-a-masters-msc-in-machine-learning-c01336120466) [## AI 如何检测物体?(技术)
了解如何使用机器和深度学习技术应用和实现对象检测
towardsdatascience.com](/how-does-ai-detect-objects-technical-d8d63fc12881)
实践中的批量规范化:以 Keras 和 TensorFlow 2.0 为例
添加和自定义批处理规范化的分步教程
在本文中,我们将重点关注在我们的机器学习模型中添加和定制批处理规范化,并查看一个示例,说明我们如何在 Keras 和 TensorFlow 2.0 的实践中做到这一点。
批处理规范化的简明介绍
在深度学习的兴起中,最重要的一个思想一直是一种叫做 批量规格化 (也叫 批量规格化 )的算法。
批量标准化 是一种用于训练深度神经网络的技术,它将每个小批量的输入标准化到一个层。这具有稳定学习过程和显著减少训练深度网络所需的训练时期的效果。
杰森·布朗利
在训练期间,可以通过计算每个小批量层的每个输入变量的平均值和标准偏差,并使用这些统计数据来执行标准化,从而实现批量标准化。
形式上,批处理规范化算法[1]被定义为:
来自原论文:批量归一化:通过减少内部协变量移位加速深度网络训练
在该算法中,*B*
被用来表示整个训练集的一个规模为m
的小批量。*B*
的均值和方差可计算如下:
对于具有 d 维度输入*x* = (*x_1*, …, *x_d*)
的层,其输入的每个维度可以单独归一化(重新居中和重新缩放)。因此,一个 d 维输入的归一化可以计算为:
ε加在分母中以保持数值稳定,它是一个任意小的常数。
最后,为了恢复网络的表示能力,变换步骤被定义为:
其中参数β和γ随后在优化过程中被学习。
批量标准化的好处有[2]:
- **可以更快地训练深度神经网络:**虽然由于正向传递期间的额外归一化计算和反向传播期间要训练的额外超参数,每次训练迭代将更慢,但它应该收敛得更快;因此,训练总体上应该更快。
- **更高的学习率:**梯度下降一般需要较小的学习率,网络才能收敛。随着网络变得更深,梯度在反向传播过程中变得更小,因此需要更多的迭代。使用批量标准化允许更高的学习率,从而提高训练速度。
- **更容易初始化权重:**权重初始化可能很困难,尤其是在创建更深层次的网络时。批次标准化降低了对初始起始重量的敏感度。
如果您正在寻找完整的解释,您可能会发现以下资源很有用:
在下面的文章中,我们将在我们的机器学习模型中添加和定制批处理规范化。
环境设置、源代码和数据集准备
我们将使用与在模型正则化教程中相同的数据集。如果你已经熟悉这一章,你可以跳过它。
为了运行本教程,您需要安装
TensorFlow 2,numpy,pandas,sklean,matplotlib
它们都可以直接安装在 vis PyPI 上,我强烈建议创建一个新的虚拟环境。关于创建 Python 虚拟环境的教程
源代码
这是一个循序渐进的教程,所有的说明都在这篇文章中。源代码请查看我的 Github 机器学习报告。
数据集准备
本教程使用安德森鸢尾花(iris) 数据集进行演示。数据集包含五个属性下的一组 150 条记录:萼片长度、萼片宽度、花瓣长度、花瓣宽度、和类别(从 sklearn 数据集称为目标)。
首先,让我们导入库并从 scikit-learn 库中获取虹膜数据集。你也可以从 UCI 虹膜数据集下载。
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split**iris = load_iris()**
为了研究数据,让我们将数据加载到一个数据帧中
# Load data into a DataFrame
**df = pd.DataFrame(iris.data, columns=iris.feature_names)** # Convert datatype to float
**df = df.astype(float)** # append "target" and name it "label"
**df['label'] = iris.target** # Use string label instead
**df['label'] = df.label.replace(dict(enumerate(iris.target_names)))**
并且df
应该如下所示:
我们注意到 标签 列是一个分类特征,需要将其转换为一键编码。否则,我们的机器学习算法将无法直接将其作为输入。
# label -> one-hot encoding
**label = pd.get_dummies(df['label'], prefix='label')**
**df = pd.concat([df, label], axis=1)**
# drop old label
df.drop(['label'], axis=1, inplace=True)
现在,df
应该是这样的:
接下来,让我们创建X
和y
。Keras 和 TensorFlow 2.0 只接受 Numpy 数组作为输入,所以我们必须将 DataFrame 转换回 Numpy 数组。
# Creating X and y**X = df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']]**
# Convert DataFrame into np array
**X = np.asarray(X)y = df[['label_setosa', 'label_versicolor', 'label_virginica']]** # Convert DataFrame into np array
**y = np.asarray(y)**
最后,让我们使用来自 sklearn 库的**train_test_split()**
将数据集拆分成训练集(80%)和测试集(20%)。
X_train, X_test, y_train, y_test = **train_test_split**(
**X,
y,
test_size=0.20**
)
太好了!我们的数据已经准备好建立一个机器学习模型。
用批量归一化建立神经网络模型
用 Keras 和 TensorFlow 2.0 创建机器学习模型有 3 种方法。由于我们正在构建一个简单的全连接神经网络,为了简单起见,让我们使用最简单的方法:带有Sequential()
的顺序模型。
首先,让我们导入Sequential
和BatchNormalization
from tensorflow.keras.models import **Sequential**
from tensorflow.keras.layers import Dense, **BatchNormalization**
让我们继续创建一个顺序模型
model = Sequential([
Dense(64, **input_shape=(4,)**, activation="relu"),
Dense(128, activation='relu'),
Dense(128, activation='relu'),
Dense(64, activation='relu'),
Dense(64, activation='relu'),
Dense(3, **activation='softmax'**)
]);
我们的型号有以下规格:
- 第一层(也称为输入层)有
input_shape
来设置输入尺寸(4,)
- 输入层有 64 个单元,后面是 2 个密集层,每个层有 128 个单元。然后还有 2 个密度层,每个层有 64 个单元。所有这些层都使用
relu
激活功能。 - 输出密集层有 3 个单元和
softmax
激活功能。
我们可以将批量规范化添加到我们的模型中,添加方式与添加Dense
层相同。
model = Sequential([
Dense(64, input_shape=(4,), activation="relu"),
**BatchNormalization(),**
Dense(128, activation='relu'),
**BatchNormalization(),**
Dense(128, activation='relu'),
**BatchNormalization(),**
Dense(64, activation='relu'),
**BatchNormalization(),**
Dense(64, activation='relu'),
**BatchNormalization(),**
Dense(3, activation='softmax')
]);
BatchNormalization()
在每一批标准化前一层的激活,默认情况下,它使用以下值[3]:
- 动量默认为
0.99
- 超参数ε默认为
0.001
- 超参数β默认为一个
all-zeros
向量 - 超参数γ默认为一个
all-ones
矢量
这些都可以通过给BatchNormalization()
添加可选参数来改变。例如
from tensorflow.keras.initializers import **RandomNormal, Constant**# Model with default batch normalization
model = Sequential([
Dense(64, input_shape=(4,), activation="relu"),
BatchNormalization(),
Dense(128, activation='relu'),
BatchNormalization(),
Dense(128, activation='relu'),
BatchNormalization(),
Dense(64, activation='relu'),
BatchNormalization(),
Dense(64, activation='relu'),
**BatchNormalization(
momentum=0.95,
epsilon=0.005,
beta_initializer=RandomNormal(mean=0.0, stddev=0.05),
gamma_initializer=Constant(value=0.9)
),**
Dense(3, activation='softmax')
]);
RandomNormal()
生成正态分布的张量,而Constant()
生成常数值的张量。通过运行model.summary()
,您应该会得到一个如下所示的模型摘要:
培养
现在让我们用批处理规范化来编译和拟合我们的模型。我们首先用以下规范编译我们的模型
- 使用 Adam (
adam
)优化算法作为优化器 - 使用分类交叉熵损失函数(
categorical_crossentropy
)来解决我们的 多类分类 问题 - 为简单起见,使用
accuracy
作为我们在训练和测试期间评估模型的评估指标。
model.compile(
**optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy']**
)
之后,我们可以调用model.fit()
来使我们的模型符合训练数据。
history = model.fit(
X_train,
y_train,
epochs=200,
validation_split=0.25,
batch_size=40,
verbose=2
)
如果一切顺利,我们应该得到如下输出
Train on 90 samples, validate on 30 samples
Epoch 1/200
90/90 - 3s - loss: 0.8735 - accuracy: 0.5778 - val_loss: 1.0685 - val_accuracy: 0.6667
Epoch 2/200
90/90 - 0s - loss: 0.1983 - accuracy: 0.9333 - val_loss: 1.0640 - val_accuracy: 0.4667
......
......
Epoch 200/200
90/90 - 0s - loss: 0.0532 - accuracy: 0.9778 - val_loss: 0.1453 - val_accuracy: 0.9333
模型评估
最后,是时候看看这个模型到底有没有用了
- 绘制训练和验证损失和准确性,以观察我们的模型的准确性如何随着时间的推移而提高。
- 使用我们之前搁置的测试数据集
X_test
再次测试我们的模型
让我们创建一个函数plot_metric()
来绘制指标。
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
def plot_metric(history, metric):
train_metrics = history.history[metric]
val_metrics = history.history['val_'+metric]
epochs = range(1, len(train_metrics) + 1)
plt.plot(epochs, train_metrics)
plt.plot(epochs, val_metrics)
plt.title('Training and validation '+ metric)
plt.xlabel("Epochs")
plt.ylabel(metric)
plt.legend(["train_"+metric, 'val_'+metric])
plt.show()
通过运行plot_metric(history, 'accuracy')
绘制精度进度。
通过运行plot_metric(history, 'loss')
绘制损失进度。
在测试集上评估模型
# Evaluate the model on the test set
model.**evaluate**(**X_test**, **y_test**, verbose=2)
我们应该得到如下所示的输出
30/1 - 0s - loss: 0.1192 - accuracy: 0.9667
[0.11924469470977783, 0.96666664]
好了
感谢阅读。
请在我的 Github 上查看笔记本的源代码。
如果你对机器学习的实用方面感兴趣,请继续关注。
参考资料:
- [1] 批量归一化:通过减少内部协变量偏移加速深度网络训练
- [2]深度学习的以人为中心的视觉分析,第 7–8 页
- [3] 来自 Keras API 文档的批量标准化
批处理规范化:一个非常通用的深度学习工具
来源:创新企业。图片免费分享。
它是如何工作的——又是如何如此有效的?
尽管批处理规范化的概念本身相当简单,但它解决了深度神经网络中许多常见而持久的问题,因此被许多人视为深度学习中最伟大的突破之一。
训练一个卷积神经网络来处理图像在几个问题上非常困难——有大量的参数需要大量的计算,学习目标有许多糟糕的局部最小值,需要大量的训练数据,但最重要的是,特别容易出现消失和爆炸梯度。
消失梯度问题是在训练深度神经网络时经常遇到的不稳定行为的例子,并且当神经网络如此长且复杂以至于神经网络不能将有用的梯度信息反向传播到网络开始处的权重时发生。这通常是因为当信号在整个网络中反向传播时,激活功能会逐渐减弱信号。因此,模型输入附近的图层保持相对不变,提供的值很少,从而限制了模型发挥其真正的预测能力。因此,到目前为止,优化器只能使用它可以访问的权重来优化模型,因此,即使前端结构没有被利用,优化器也会停滞不前,没有任何改进。
由作者创建
另一方面,当大的误差梯度连续累积并导致训练期间神经网络权重的大的、不稳定的、钟摆状的更新时,就会出现爆炸性梯度问题。消失梯度和爆发梯度都提供了经常困扰神经网络的两个巨大问题。为了解决这些梯度问题,用于解决它们的主要方法包括小心地设置学习速率(当模型接近最优值时缓慢地衰减学习速率),设计具有不同激活函数的更好的 CNN 架构,更小心地初始化权重,以及调整数据分布。最有效的解决方案是批量标准化。
批量归一化图层接收流经网络的数据,并输出经过重缩放和归一化的过滤器。这具有改变流经整个网络的输入分布的效果。
作者创建的图像。
最初的批处理规范化论文声称批处理规范化在提高深度神经网络性能方面如此有效是因为一种称为“内部协变量移位”的现象。根据这一理论,当模型参数更新时,深层神经网络中隐含层的输入分布不规则地变化。批量标准化本能地恢复输入的分布,这些输入在通过隐藏层时可能已经移动和伸展,从而防止训练受阻。
在 CIFAR-10 上训练的标准 VGG 网络的(a)训练(优化)和(b)测试(泛化)性能的比较,有和没有批量归一化。©使用和不使用批量标准化比较第三层和第十一层的权重。请注意更加集中和正常的分布,与标准的倾斜和不均匀的分布相反。来源— arXiv:1805.11604v5 .图片免费分享。
不幸的是,对内部协变量变化的本能解释被证明是不正确的。事实上,输入通过隐藏层时的分布变化似乎不会对模型的训练产生太大影响。揭示这一真理的开创性论文《批处理规范化如何帮助优化》的作者来自麻省理工学院,进行了一项实验,以衡量内部协变量转移理论的有效性。
实验中,在 CIFAR-10 数据集上训练了一个标准和两个标准+批量归一化标准 VGG16 网络架构。其中一个标准+批次归一化网络在批次归一化层之后注入了完全随机的噪声,导致了大量的内部协变量偏移,而这些偏移无法通过批次归一化层进行“校正”。结果令人着迷——尽管很明显,“嘈杂”批量归一化网络后的权重分布不如常规批量归一化模型中的均匀,但它的表现一样好,两个批量归一化神经网络都优于标准网络。
来源— arXiv:1805.11604v5 .图片免费分享。
相反,作者发现批处理规范化平滑优化景观。当梯度下降优化器试图找到全局最优值时,它需要对当前最优值是局部最优值还是全局最优值做出权衡决定,并牺牲误差的暂时增加以获得更大的下降。通常,在具有许多陡峭山峰、平坦平原和锯齿状山谷的崎岖地形中的优化者发现这项任务很困难,并且变得过度依赖于通常不小心设置的学习速率,从而导致较差的准确性。
来源— arXiv:1805.11604v5 .图片免费分享。
批量归一化大大减少了损失景观、梯度生产率和β平滑度的变化,使得导航地形以找到全局误差最小值的任务变得更加容易。简单地添加批量标准化图层具有几个巨大的优势:
- 在设置初始学习率时更加自由。大的初始学习率不会导致在优化过程中错过最小值,并且可以导致更快的收敛。
- 加速学习速度衰减。由于批量标准化使模型对超参数更加稳健,因此除了为最佳训练时间设置更高的初始学习速率之外,还可以加速学习速率衰减的速率。
- 去掉漏音。当使用批量标准化时,可以不使用漏失层,因为漏失会造成损坏和/或减慢训练过程。批量标准化引入了防止过度拟合的另一种形式。
- 降低 L2 权重正规化。成功训练一个神经网络的很大一部分是调整权重。虽然使用 L2 正则化(以误差的平方来惩罚对象以强调对较大对象的惩罚)是有效且常用的,但它也带来了自己的一系列问题,包括权重复杂性的增加和过度拟合的趋势。批处理规范化具有正则化属性,这可能是一种更“自然”的正则化形式。
- 解决消失渐变问题。虽然内部协变量移位可能不会提高精度,但它在某种程度上涉及到消失梯度问题。当输入的分布发生变化时,由于激活函数(例如,sigmoid 将最小值设置为 2.5,或 ReLU 将任何 x < 0 设置为 0),它将倾向于固有的较小梯度更新。批量标准化有助于确保在反向传播过程中,通过将分布从网络的末端转移到起点,信号被听到且不被减弱。
- *解决爆炸梯度问题。*由于批量标准化平滑了优化前景,它消除了累积的极端梯度,从而消除了梯度累积导致的主要重量波动。这极大地稳定了学习。
感谢阅读!
使用 Pillow 在 Python 中批量调整图像大小
一个重要的 PYTHON 技巧
一步一步的使用 Python 调整图片大小的指南
带枕头的蟒蛇插图作者金彩云
有时你需要为你的项目编辑大量的图片。例如,在 web 开发中,大容量调整图像大小是为了使所有图像变得更小、更亮,以优化通过 web 的传输速度。在数据科学中,您可能需要提高所有图像的 DPI,以便在科学文章中发布。在图像处理软件中自己管理它们可能会很无聊。所以,你可以试着用枕头自动为你做这项工作!
这篇短文将通过一个示例脚本,一步步向您展示如何使用 Python 中的 Pillow ,重点关注批量调整图像大小。即使这个 Pillow 库已经推出很久了,它仍然像在 2020 年一样强大和非常有用。
使用 Python 和 Pillow 调整文件夹中所有图像大小的示例。(作者 gif)
例如,上面的 gif 图像显示,Python with Pillow 只需大约 8-10 行代码就可以调整/重缩放一个文件夹中的所有图像文件。Pillow 可以完成多种操作,如调整大小、重新缩放、旋转、变换、在文件格式之间转换、增强对比度等等。
我们开始吧!
装置
您可以简单地使用**pip**
安装枕库,如下所示:
**$ pip install pillow**
Python 2.x 不再支持最新的 Pillow。您可以在下面检查 Pillow 版本以匹配您的 Python 版本。
枕头版支持(来源:https://pillow.readthedocs.io/en/stable/installation.html)
基本用法
枕头的概念很简单,有三个步骤
- 加载一幅图像(或大量图像)
- 进行一些图像编辑/处理操作
- 以您喜欢的格式保存编辑过的图像。
**from PIL import Image** # ---- 1 ---- **im = Image.open("*input_path"*)** # ---- 2 ---- **# ... Do some operation** # ---- 3 ---- **im = Image.save("*output_path"*)**
支持格式
枕头支持多种光栅文件格式。图书馆可以识别和阅读 30 多种不同的文件格式。书写支持不太广泛,但支持大多数常见的交换和表示格式。[1]
现在,让我们来看一些真实的例子:
真实实践
您可以使用pathlib
或os
遍历文件夹中的每个图像文件,然后使用 Pillow 加载图像。之后,您可以使用thumbnail
命令将图像尺寸缩小到指定的最大宽度或最大高度值,并保留图像的外观。
# Load image
**im = Image.open(input_img_path)**#Smaller image/ preserve the aspect of the image **resized_im = im.thumbnail(<maxwidth>, <maxheight>)**# Or Resize image to exact specified size **resized_im = im**.**resize(<width>, <height>)** # Then, save the resized image
**resized_im**.**save(<output_img_path>, <file type>, dpi, ...)**
例如,下面的脚本显示了如何调整名为“input”的文件夹中的所有图像的大小,使其最大宽度和高度为 512 像素,并保留图像的外观,并将它们以 300 dpi 的 JPEG 格式保存在“output”文件夹中。这个例子使用pathlib
遍历一个文件夹中的所有文件。
使用这个脚本,您可以在第 7 行和第 8 行之间添加任何图像操作。如旋转,变换,文件格式之间的转换,增强对比度。您可以从 Pillow 文档中看到可用操作的列表。
此外,还有几个 Python 图像处理工具可以使用,比如 OpenCV 和 scikit Image。
临终遗言
所以,大概就是这样。我希望你喜欢这篇文章,并发现它对你的日常工作或项目有用。如果您有任何问题或意见,请随时给我留言。
关于我&查看我所有的博客内容:链接
安全健康和健康!💪
感谢您的阅读。📚
参考
[1]Alex Clarkhttps://Pillow . readthe docs . io/en/stable/handbook/image-file-formats . html(2020),Pillow (PIL 福克)
公共云之王争夺战:AWS vs. Azure
我应该信任谁来满足我的企业未来十年的软件开发需求?
不管你喜不喜欢,公共云正在接管。有什么不喜欢的呢?
云计算使得管理我们所有的计算机系统资源变得非常容易。它提供了一个抽象层,这在 2006 年之前似乎是不可能的。
我们不再需要以物理方式管理我们的底层基础架构。这些发展意味着我们不再需要:
- 购买不动产来放置我们的服务器。
- 雇佣工人来处理维护(供暖/制冷、电线等。)
- 当我们看到使用量激增时,添加新的物理服务器。
- 受到任何类型的基础设施可用性的限制。
这使我们能够:
- 尽可能降低我们的成本。
- 专注于我们的业务,提高功能开发速度
- 有更好的安全性
- 通过改进的灾难恢复实现高可用性
我们业务的发展速度是前所未有的。我们从未有过如此快速地从计划到生产的能力。
但是,就像科技世界中的一切一样,一旦有了新的前沿,每个人都必须做出自己的版本。
我们将关注云计算领域的两个领导者:Amazon Web Services 和 Microsoft Azure。
目标
回答问题:我应该选择谁来满足我的企业未来十年的软件开发需求?
AWS 和微软 Azure 已经成为这个领域的两个领导者。所以今天,我们要深入研究这两个,并确定哪个更好。
目录
AWS 概述
云计算可以追溯到 60 年代,那时首次实现了计算机不同方面的“虚拟化”。所以说亚马逊开创了云计算是不正确的。
但是就基础设施即服务(IaaS) 以及我们今天所知的方式而言,亚马逊在将它推向大众方面发挥了巨大作用。
什么是 IaaS?将原始计算能力作为服务提供的能力,以及通过互联网访问和配置新服务器和存储的能力。
如果不是亚马逊,我们会有云计算吗?很难想象我们会走到这一步。
早在 2006 年,亚马逊就推出了亚马逊网络服务。他们的第一批服务是 S3(简单存储服务)、EC2(弹性云计算)和 SQS(简单队列服务)。
这些服务允许您通过在线 web 服务界面(S3)将数据存储在在线存储中,在 web 应用程序之间进行通信(SQS),以及按需部署新服务器(EC2)。
此后,截至 2020 年,AWS 的服务超过 212 项。这些服务几乎涵盖了您发展 IT 业务所需的一切。服务横跨数据库、网络、移动、开发者工具、物联网(IoT)、机器学习、AR & VR、区块链、量子技术。这个清单还在继续。
随着这些服务的发展,云计算游戏将被永远改变。
Azure 概述
由 Ashkan Forouzani 在 Unsplash 上拍摄
微软 Azure 起步较晚,最初在 2008 年以“Project Red Dog”开始,并在 2010 年正式成为“Windows Azure ”,当时它已投入商业使用。这是它开始获得动力的时候。
Azure 寻求提供许多与 AWS 相同的服务,包括虚拟机、对象存储和内容交付网络。然而,这些服务是专门为微软产品设计的。
也就是说,如果您的企业是使用 Windows 堆栈(Microsoft SQL Services、Microsoft。网络服务、实时服务、Sharepoint 等。),Azure 会对你有帮助。
意识到他们需要超越 Windows 堆栈,Azure 开始提供对更多编程语言、框架和操作系统的支持。
因为它不再只是 Windows 的工具,2014 年,他们更名为“微软 Azure”
与 AWS 类似,Azure 提供基础设施即服务(IaaS)、软件即服务(SaaS)和平台即服务(PaaS)。
利弊
赞成的意见
骗局
培训和认证
怎么才能入门?
获得其中任何一种云技术的认证对你和你的职业生涯来说都是非常有价值的,并且对于任何想要了解更多关于云的知识的人来说都是一个很好的起点。
微软目前提供三种认证:
- Azure 管理员助理
- Azure 解决方案架构师专家
- Azure 安全工程师助理
AWS 提供了更多(以及许多专业):
- 云从业者(基础)
- 开发人员(助理)
- 系统运行管理员(助理)
- DevOps 工程师(专业)
- 解决方案架构师(助理和专业人员)
试图在解决方案架构师和开发人员认证之间做出选择?点击这里看我对两者的对比。
如果你已经知道你想追求哪种认证,我已经写了一些关于如何开始获得解决方案架构师和开发人员认证的文章。
结论
我想谈谈定价,并做一个功能细分;然而,这些云提供商中的每一个都在不断地重新思考他们的价格模型并发布新功能。今天在价格和功能可用性方面是正确的,明天可能就不正确了。
但是回到我们的问题:我应该选择谁来托管我的企业未来十年的软件开发需求?
当然,要看情况。如果你正在处理一个已经存在的微软堆栈,我会推荐 Azure。
但如果我要从零开始创业,并且只能选择一个,我会选择 AWS。为什么?因为 AWS 的成熟程度和培训机会。我觉得使用 AWS 作为我的云提供商会更安全。
如果我让一名新工程师入职,而他们对云一无所知,他们可以通过 AWS 认证快速学习。目前最热门的认证是 AWS 解决方案架构师和 AWS 开发人员,他们的需求量很大。
这并不是说微软不提供认证。他们是。他们只是还没有达到 AWS 的成熟水平。
不成熟也延伸到文档和技术支持。由于 AWS 自身和社区的大力支持,学习如何在 AWS 中使用新功能或故障排除变得更加简单。
当然,你可以一直使用多云策略,并两者并用。你不必只选择一个。
但是为了这个讨论,如果我必须选择一个,我会选择 AWS,因为它们目前的成熟度。
赖安·格里森报道
[## Node.js 与 Spring Boot——你该选择哪一个?
轻松点。Spring Boot。对吗?没那么快…
medium.com](https://medium.com/better-programming/node-js-vs-spring-boot-which-should-you-choose-2366c2f76587) [## 是时候忘记反应,加入苗条的潮流了吗?
一场真正的泰坦之战(苗条还能算泰坦吗?)
medium.com](https://medium.com/better-programming/is-it-time-we-forget-react-and-jump-on-the-svelte-bandwagon-4848bb5d0839) [## 解决方案架构师与开发人员:AWS 认证细分
哪个适合你?
towardsdatascience.com](/solutions-architect-vs-developer-an-aws-certification-breakdown-4a7a28a8d7bd)
助推器之战
梯度助推器
最后一名支持者站在一场激烈的打斗比赛中
在梯度推进领域,我们已经取得了长足的进步。如果您已经阅读了整个系列,那么您应该对这个领域中主要算法的理论和实践方面有更好的理解。在对这些算法背后的数学和理论进行了一番严肃的研究后,我认为在一篇高度实用的博客文章中看到它们的实际应用会是一个有趣的改变。
所以,我向你们展示,助推器之战。
数据集
我从 Kaggle 数据集中选择了几个数据集进行回归,主要是因为它在 Google Colab 中易于设置和运行。另一个原因是,我不需要在数据预处理上花很多时间,相反,我可以选择一个公共内核并开始破解。我还将分享我们选择的数据集的 EDA 的一个内核。所有的笔记本也会被分享,博客底部有链接。
- auto pgg—数据是来自 UCI 机器学习库的汽车技术规格。
外形:(398,9), EDA 内核,数据量:低 - 房价:高级回归技术—Ames 住房数据集由 Dean De Cock 编制,用于数据科学教育。对于寻找经常被引用的波士顿住房数据集的现代化和扩展版本的数据科学家来说,这是一个令人难以置信的替代方案。有 79 个解释变量描述了(几乎)爱荷华州埃姆斯住宅的每个方面,这个比赛挑战你预测每个家庭的最终价格。
外形:(1460,81), EDA 内核,数据量:中等 - 电动机温度 —数据集包括从部署在测试台上的永磁同步电动机(PMSM)收集的几个传感器数据。PMSM 代表了德国 OEM 的原型模型。
外形:(998k,13), EDA 内核,数据量:高
实验装置
竞争中的算法
- XGBoost
- LightGBM
- 正则贪婪森林
- NGBoost
数据预处理
这里没什么特别的。只是做了一些基本的数据清理和缩放。大部分代码来自某个随机内核。唯一的一点是,相同的预处理应用于所有算法
交叉验证设置
我选择了交叉验证,以确保不同算法之间的比较更具普遍性,而不是针对某个特定的数据分割。在这个练习中,我选择了一个简单的 5 折 K 折。
估价
**评估指标:**均方误差
为了对所有算法进行标准评估(幸好它们都是 Sci-kit Learn api),我定义了几个函数。
**默认参数:**首先用模型的默认参数拟合 CV 分割。我们记录 CV 分数的平均值和标准偏差,然后拟合整个训练分割以预测测试分割。
使用超参数调整:与上一个非常相似,但是增加了一个 GridSearch 步骤来查找最佳参数。
超参数调优并不详尽,但相当不错。
我们针对不同算法运行 GridSearch 的网格有
XGBoost :
{ "learning_rate": [0.01, 0.1, 0.5], "n_estimators": [100, 250, 500], "max_depth": [3, 5, 7], "min_child_weight": [1, 3, 5], "colsample_bytree": [0.5, 0.7, 1], }
灯 GBM :
{ "learning_rate": [0.01, 0.1, 0.5], "n_estimators": [100, 250, 500], "max_depth": [3, 5, 7], "min_child_weight": [1, 3, 5], "colsample_bytree": [0.5, 0.7, 1], }
RGF :
{ "learning_rate": [0.01, 0.1, 0.5], "max_leaf": [1000, 2500, 5000], "algorithm": ["RGF", "RGF_Opt", "RGF_Sib"], "l2": [1.0, 0.1, 0.01], }
NGBoost :
因为 NGBoost 有点慢,我没有为所有实验定义一个标准的网格,而是沿着每个参数独立地搜索,并根据实验的直觉决定一个网格
结果
我已经列出了所有三个数据集的训练 CV 分割的 RMSEs 的平均值和标准偏差。对于电动马达,我没有调整数据,因为它的计算成本很高。
自动编程
自动 MPG 数据集结果
自动 MPG 平均值与 SD (RMSE)散点图
4 次 CV 分割和 1 次测试分割的执行时间
房价:高级回归技术
房价数据集结果
房价均值与标准差(RMSE)散点图
4 次 CV 分割和 1 次测试分割的执行时间
电机温度
电机温度数据集结果
电机温度平均值与标准差(RMSE)散点图
4 次 CV 分割和 1 次测试分割的执行时间
最后的话
免责声明 :这些实验绝不是完整的。人们需要更大规模的实验来得出哪个算法做得更好的结论。此外,我们还需要记住没有免费的午餐定理。
马上,NGBoost 似乎是这个领域的一个强有力的竞争者。在 AutoMPG 和房价数据集中,NGBoost 在所有其他助推器中表现最好,无论是在平均 RMSE 还是在 CV 分数的标准差上,都是如此,而且差距很大。NGBoost 还显示了默认版本和优化版本之间相当大的差距。这表明,要么默认参数没有设置好,要么数据集的每次调整都是从 NGBoost 获得良好性能的关键因素。但是该算法的致命弱点是运行时间。这些巨大的横条高耸在其他横条之上,我们可以看到,与其他加速器相比,运行时实际上处于不同的规模。特别是在像电机温度数据集这样的大型数据集上,运行时间非常大,因此我也没有调整算法。在竞争中,它在其他支持者中排名最后。
另一个突出的算法是正则化贪婪森林,它的性能与 XGBoost 一样好,甚至更好。在中低数据设置下,运行时间也堪比在位王者 XGBoost。
在低数据设置下,XGBoost 和 LightGBM 等流行算法表现不佳。并且 CV 值的标准差较高,特别是 XGBoost,表明它过拟合。XGBoost 在三个例子中都有这个问题。在运行时方面,LightGBM 是王者(尽管我没有针对计算性能进行过调整),在所有三个例子中都击败了 XGBoost。在高数据设置中,它通过比其他竞争对手低得多的 RMSE 和运行时间,击败了其他一切。
带实验的 Colab 笔记本
其他文章 渐变增强器
我们已经在梯度增强领域取得了长足的进步,我希望至少对你们中的一些人来说,梯度增强并不意味着 XGBoost。这个世界上有很多算法都有自己的特点,其中很多算法的性能与 XGBoost 相当或者更好。另一个令人兴奋的领域是概率回归。我希望 NGBoost 变得更加高效,跨越计算效率障碍。一旦发生这种情况,NGBoost 是概率回归空间中一个非常强的候选者。
原载于 2020 年 7 月 1 日 http://deep-and-shallow.com。
邻里之战
照片由 Pixaby 提供
使用数据科学在多伦多寻找最佳社区
作者:乌马尔·汗
这个项目旨在利用在 IBM 数据科学专业课程中学到的所有数据科学概念。我们定义一个业务问题,将被利用的数据,并使用这些数据,我们能够使用机器学习工具来分析它。在这个项目中,我们将一步一步地经历从问题设计、数据准备到最终分析的所有过程,并最终提供一个商业利益相关者可以用来做决策的结论。
目录
- 介绍
- 目标受众
- 数据概述
- 方法学
- 讨论
- 结论
1。识别业务问题(简介):
多伦多是加拿大人口最稠密的地区之一。作为充满机会的土地,它将来自不同种族背景的各种各样的人带到了加拿大的核心城市多伦多。作为加拿大最大的城市,估计人口超过 600 万,人口的多样性是毋庸置疑的。多元文化体现在各个社区,包括:唐人街、Corso Italia、小印度、肯辛顿市场、小意大利、韩国城等等。多伦多市中心是不同种族之间互动的中心,为企业家提供了许多创业或发展业务的机会。这是一个人们可以尝试各种文化精华的地方,无论是在工作时还是只是路过。多伦多以其美食而闻名。
这个项目的目标是使用 Foursquare 的位置数据和场地信息的区域聚类来确定多伦多开设餐馆的“最佳”社区。比萨和意大利面是多伦多最受欢迎的菜肴之一,源自意大利。多伦多是意大利人的第四大家园,人口超过 50 万,有很多机会开一家新的意大利餐厅。通过这个项目,我们将为一位企业家在加拿大多伦多开设一家新的意大利餐厅找到最合适的地点。
2.目标受众
这个项目是针对那些想开一家新的意大利餐馆或扩大现有业务的企业家或企业主的。分析将提供目标受众可以使用的重要信息
3.数据概述
将需要的数据将是已准备好的 CSV 文件的组合,用于从多个来源进行分析,这些来源将提供多伦多的街区列表(通过维基百科)、街区的地理位置(通过地理编码器包)和与意大利餐馆有关的地点数据(通过 Foursquare)。场地数据将有助于找到哪个街区最适合开设意大利餐厅。
3.1 —数据采集:
来源 1:通过维基百科的多伦多社区
图 1:维基百科页面显示了多伦多的居民区列表以及各自的邮政编码
上面显示的维基百科网站提供了几乎所有关于社区的信息。它包括邮政编码,行政区和多伦多的街区名称。由于数据的格式不适合分析,所以从这个站点收集数据(如图图 2 所示)。
图 2:从维基百科网站收集的数据放入熊猫数据框
来源 2:使用地理编码器包的地理位置数据
2.【https://cocl.us/Geospatial_data
第二个数据来源为我们提供了带有各自邮政编码的街区的地理坐标。该文件是 CSV 格式的,所以我们必须将其附加到 Pandas 数据框中(如图 3 所示)。
来源 3:使用 Foursquare 的场馆数据
我们进行了一些数据清理。从图 5(上图)中可以看出,邻域是按照邻域的名称进行分组的,因此以后的数据聚类更加容易。
4.方法学
4.1 —数据清理
在收集所有数据并将其放入数据框后,需要清理和合并数据以开始分析过程。从维基百科获取数据时,有些行政区未被分配到任何街区。因此,做出了以下假设:
1.只会处理具有指定区的像元。未分配的行政区会被忽略。
2.一个邮政编码区中可以有多个居民区。例如,在维基百科页面的表格中,您会注意到 M5A 被列出了两次,并且有两个街区:Harbourfront 和 Regent Park。这两行将合并成一行,相邻行用逗号分隔,如图图 2 第 4 行所示。
3.如果一个像元有一个区,但没有分配邻域,那么邻域将与区相同。
在实现以下假设后,根据区对行进行分组,如下所示。
使用从 Geocoder 包中收集的纬度和经度,我们根据邮政编码将两个表合并在一起。
之后,从 Foursquare API 中提取的场地数据与上表合并,为我们提供了 500 米半径内的本地场地,如下所示。
4.2 —数据探索
清理完数据后,下一步是分析数据。然后我们用叶子制作了一张地图,并根据每个街区所在的行政区对其进行了颜色编码。
这段代码为我们提供了下面的地图:
接下来,我们使用 Foursquare API 获得多伦多所有场所的列表,包括公园、学校、咖啡馆、亚洲餐馆等。获得这些数据对于分析多伦多的意大利餐馆数量至关重要。多伦多总共有 45 家意大利餐馆。然后,我们将 Foursquare 地点数据与邻近地区数据合并,这样我们就可以得到每个邻近地区最近的地点。
4.3 —机器学习
然后,为了分析数据,我们执行了一项技术,将分类数据转换为机器学习算法的数值数据。这种技术叫做 One hot encoding 。对于每一个街区,单个场馆被转换成每个街区有多少个场馆的频率。
然后,我们根据邻近地区对这些行进行分组,并取每个场馆类别出现频率的平均值。
之后,我们创建了一个新的数据框,它只存储街区名称以及该街区意大利餐馆的平均出现频率。这使得数据可以基于每个单独的邻域进行汇总,并使数据分析更加简单。
k 均值聚类
为了使分析更有趣,我们希望根据附近意大利餐馆的平均数量对附近进行聚类。为此,我们使用了 K-Means 聚类。为了得到我们的最佳 K 值,既不过度拟合也不欠拟合模型,我们使用了肘点技术。在这种技术中,我们使用不同数量的 K 值进行测试,测量精确度,然后选择最佳的 K 值。最佳 K 值选择在直线具有最大转弯的点上。在我们的例子中,我们的肘点在 K = 4。这意味着我们总共有 4 个集群。
然后,我们使用一个模型,准确地指出最佳 K 值。我们从 *Yellowbrick 包中导入了“ KElbowVisualizer ”。*然后,我们将上面的 K-Means 模型与 Elbow visualizer 进行拟合。
这给出了下面的模型:
我们只是整合了一个模型来拟合误差并计算失真分数。从虚线中,我们可以看到弯头位于 K=4 处。此外,在 K-Means 聚类中,基于某个变量相似的对象被放入同一聚类中。具有相似的意大利餐馆平均频率的街区被分成 4 组。这些簇中的每一个被标记为从 0 到 3,因为标记的索引从 0 而不是 1 开始。
之后,我们将场地数据与上表合并,创建了一个新表,作为分析在多伦多新开一家意大利餐厅的新机会的基础。然后,我们使用 Python 中的 Folium 包创建了一个地图,并根据聚类标签对每个邻域进行了着色。
- 集群 1 —红色
- 集群 2 —紫色
- 第 3 组——蓝绿色
- 第 4 组—深卡其色
上图显示了意大利餐馆平均出现频率相似的不同聚类。
4.4 —数据分析
我们总共有 4 个聚类(0,1,2,3)。在我们逐一分析它们之前,让我们检查每个聚类中的街区总数以及该聚类中的平均意大利餐馆数。从使用 Matplotlib 制作的条形图(图 18)中,我们可以比较每个集群的邻域数量。我们看到,聚类 1 的邻域最少(1),而聚类 2 的邻域最多(70)。簇 3 有 14 个街区,而簇 4 只有 8 个。然后我们比较了每个集群的平均意大利餐馆。
聚类分析
这一信息至关重要,因为我们可以看到,尽管聚类 1 中只有 1 个邻域,但其意大利餐馆的数量最多(0.1304),而聚类 2 中的邻域最多,但意大利餐馆的平均数量最少(0.0009)。普通意大利餐馆的平均值构成了图 18 的数据。此外,从地图上,我们可以看到集群 2 中的居民区是人口最稀少的。现在让我们单独分析这些集群(注意:这些只是数据的片段)。
聚类 1(红色):
第一组位于北约克地区。贝德福德和劳伦斯庄园东是该集群中的两个社区。集群 1 有 19 个独特的地点,其中只有 3 个是意大利餐馆。聚类 1 具有最高的意大利餐馆平均值,相当于 0.130435。意大利餐厅的平均水平最高的原因是,所有这些餐厅都在贝德福德和劳伦斯庄园东两个街区。
集群 2(蓝色):
总共有 70 个街区,229 个不同的场地,只有一家意大利餐馆。因此,在第 2 组中靠近场馆的意大利餐馆的平均数量是最低的,为 0.01。在地图上,我们可以看到集群 3 的节点分散在整个多伦多,使其成为人口最稀少的集群之一。
集群 3(青绿色):
集群 3 拥有第二低的意大利餐馆平均数。第 3 组主要位于市区,但也有一些在西多伦多,东多伦多和北约克的居民区。像瑞尔森,多伦多统治中心,唐米尔斯,花园区,女王公园和更多的街区都包括在这个集群中。总共有 176 个独特的场馆,其中 27 个是意大利餐厅。
聚类 4(深卡其色):
第 4 组场馆位于多伦多市区、西部、东部和中部以及斯卡伯勒。中央湾街、多伦多大学、中央湾街和河谷镇等街区构成了这个集群。第 4 组共有 91 个独特的场馆,16 家意大利餐厅。这是该集群中意大利餐馆的第二高平均值,约为 0.063。
因此,每个聚类中的普通意大利餐馆的排序如下:
1.聚类 1 (≈0.1304)
2.聚类 4 (≈0.0632)
3.聚类 3 (≈0.0317)
4.聚类 2 (≈0.0009)
5.讨论:
大多数意大利餐馆都在由红色聚类表示的聚类 1 中。位于北约克区的意大利餐馆平均数量最高的街区是贝德福德公园和劳伦斯庄园东。尽管在集群 2 中有大量的社区,但是几乎没有意大利餐馆。我们看到,在多伦多市区(集群 3)有倒数第二的意大利餐馆。看看附近的场地,多伦多市中心是开设新意大利餐厅的最佳地点,因为该地区有许多社区,但几乎没有意大利餐厅,因此消除了任何竞争。拥有巨大机会的第二好的社区是在阿德莱德和国王、美景镇等地区。也就是第二组。该地区有 70 个街区没有意大利餐馆,这给了开一家新餐馆的好机会。这种分析的一些缺点是——聚类完全基于从 Foursquare API 获得的数据。此外,该分析没有考虑邻近地区的意大利人口,因为这在选择开设新意大利餐厅的地点时会起到很大的作用。这总结了该项目的最佳发现,并建议企业家在这些地方开设一家正宗的意大利餐厅,几乎没有竞争。
6.结论
总之,为了结束这个项目,我们有机会解决一个业务问题,解决这个问题的方式与真正的数据科学家相似。我们利用大量 Python 库来获取信息、控制内容、分解和可视化这些数据集。我们利用 Foursquare API 调查了多伦多附近的环境,从维基百科获得了大量数据,这些数据是我们用 Beautifulsoup 网络抓取库抓取的。我们还利用 seaborn 和 Matplotlib 库中的不同绘图进行了可视化。类似地,我们应用人工智能策略来预测给定信息的错误,并利用 follow 将其描绘在地图上。
有改进空间或某些缺点的地方让我们知道,这个项目可以在更多信息和独特的机器学习策略的帮助下进一步改进。此外,我们可以利用这一风险来调查任何情况,例如,开一家替代餐馆或开一家电影院等等。理想情况下,这项任务充当使用数据科学解决更复杂的现实生活问题的初始方向。
代码可以在 Github 上找到,也可以在 T2 的 Linkedin 上找到我!!!
进入下一个问题:)
变形金刚之战:伊莱克特拉,伯特,罗伯塔,还是 XLNet
伊莱克特拉是新来的。让我们来看看它是如何对抗老守卫的!
Transformer 模型成功背后的“秘密”之一是迁移学习技术。在迁移学习中,一个模型(在我们的例子中是一个 Transformer 模型)使用一个无监督的预训练目标在一个巨大的数据集上预训练*。同样的模型然后在手头的实际任务中进行微调*(通常是监督训练)。这种方法的美妙之处在于微调数据集可以小到 500–1000 个训练样本!如果称之为深度学习,这个数字小到可能会被嗤之以鼻。这也意味着昂贵且耗时的流水线部分预训练只需进行一次,并且预训练模型可在此后的任意数量的任务中重复使用。因为预先训练的模型通常是公开的🙏,我们可以获取相关模型,在自定义数据集上对其进行微调,几个小时后就有一个最先进的模型可以使用了!
如果您有兴趣了解预训练如何工作,以及如何在单个 GPU 上训练一个全新的语言模型,请查看下面链接的我的文章!
[## 理解 ELECTRA 并训练一个 ELECTRA 语言模型
变形金刚模型如何学习语言?伊莱克特拉有什么新消息?你如何在一个…
towardsdatascience.com](/understanding-electra-and-training-an-electra-language-model-3d33e3a9660d)
ELECTRA 是谷歌发布的预训练变形金刚模型的最新类别之一,与大多数其他版本相比,它有所改变。在很大程度上,Transformer 模型遵循了人们熟知的深度学习路径,更大的模型、更多的训练和更大的数据集等于更好的性能。然而,ELECTRA 通过使用更少的计算能力、更小的数据集、和更少的训练时间,超越了早期的模型,如 BERT,从而扭转了这种趋势。(如果你想知道,伊莱克特拉和伯特的“尺寸”是一样的)。
在这篇文章中,我们将看看如何使用一个预训练的 ELECTRA 模型进行文本分类,并在此过程中与其他标准模型进行比较。具体来说,我们将比较下面列出的每个模型的最终性能(马修斯相关系数 (MCC) )和训练时间。
- electra-小型
- 电子基础
- 伯特基础案例
- 蒸馏底壳的
- 蒸馏贝塔碱
- 罗伯塔基地
- xlnet-base-cased
和往常一样,我们将使用简单变形金刚库(基于拥抱脸变形金刚库)来完成这项工作,并且我们将使用权重&偏差进行可视化。
您可以在库的示例目录中找到这里使用的所有代码。
装置
-
从这里安装 Anaconda 或 Miniconda 包管理器。
-
创建新的虚拟环境并安装软件包。
conda create -n simpletransformers python pandas tqdm
conda activate simpletransformers
-
如果您使用 fp16 培训,请安装 Apex。请遵循此处的说明。
-
安装简单变压器。
数据准备
我们将使用 Yelp 评论极性数据集,这是一个二元分类数据集。下面的脚本将下载它并存储在data
目录中。或者,您可以从 FastAI 手动下载数据。
超参数
一旦数据在data
目录中,我们就可以开始训练我们的模型。
简单的变压器模型可以进行广泛的配置(见文档),但是我们将只进行一些基本的、“足够好的”超参数设置。这是因为我们更感兴趣的是在平等的基础上相互比较模型,而不是试图优化每个模型的绝对最佳超参数。
考虑到这一点,我们将把train_batch_size
增加到128
,并且我们将把num_train_epochs
增加到3
,这样所有的模型都将有足够的训练来收敛。
这里需要注意的是,XLNet 的train_batch_size
减少到了64
,因为它不能在 RTX 泰坦 GPU 上用train_batch_size=128
进行训练。但是,通过将gradient_accumulation_steps
设置为2
,将有效批量更改为128
,可以将这种差异的影响降至最低。(每两步只计算一次梯度并更新一次模型权重)
影响训练的所有其他设置都保持默认值不变。
训练模型
设置培训流程非常简单。我们只需要将数据加载到数据帧中并定义超参数,然后我们就可以开始比赛了!
为了方便起见,我使用相同的脚本来训练所有模型,因为我们只需要在每次运行之间更改模型名称。模型名称由 shell 脚本提供,该脚本还会自动为每个模型运行训练脚本。
培训脚本如下所示:
注意,Yelp 评论极性数据集使用标签 *[1, 2]*
分别表示正极和负极。我把这个改成 *[0, 1]*
分别表示否定和肯定。简单变形金刚要求标签从 *0*
(咄!)而负面情绪的一个标签 *0*
就直观了很多(在我看来)。
可以自动化整个过程的 bash 脚本:
注意,您可以通过向 bash 脚本添加 *rm -r outputs*
来删除每个阶段保存的模型。如果你没有足够的磁盘空间,这可能是个好主意。
训练脚本还将记录权重和偏差的评估分数,让我们可以轻松地比较模型。
有关训练分类模型的更多信息,请查看简单转换程序文档。
结果
你可以在这里找到我所有的结果。尝试使用不同的图表和信息!
让我们回顾一下重要的结果。
最终分数
这些是每个模型获得的最终 MCC 分数。如你所见,所有型号的分数都非常接近。
为了更好地了解差异,下面的图表放大到 X 轴,只显示范围 0.88-0.94。
请注意,放大视图虽然有助于发现差异,但会扭曲对结果的感知。因此,下表仅用于说明目的。 当心隐藏了零的图!
roberta-base
型号领先,xlnet-base
紧随其后。接下来是distilroberta-base
和electra-base
车型,它们之间几乎没有任何区别。老实说,在这种情况下,两者之间的差异可能更多地是由于随机机会而不是其他任何东西。最后,我们分别有bert-base-cased
、distilbert-base-cased
和electra-small
。
查看实际值会发现它们非常接近。
在这次实验中,罗伯塔似乎比其他模特表现得更好。然而,我敢打赌,通过一些技巧,如超参数调整和集成,ELECTRA 模型能够弥补这一差异。这一点得到了当前 GLUE 基准排行榜的证实,在该排行榜中,伊莱克特拉位于罗伯塔之上。
重要的是要记住,与 RoBERTa 相比,ELECTRA 模型所需的预培训资源要少得多(大约四分之一)。对于distilroberta-base
也是如此。尽管distilroberta-base
模型相对较小,但在将提取到distilroberta-base
之前,您需要原始的roberta-base
模型。
XLNet 模型几乎与 RoBERTa 模型并驾齐驱,但它比这里显示的所有其他模型需要更多的计算资源(参见训练时间图)。
古老的(虽然不到两年)BERT 模型开始显示出它的年龄,并且被除了electra-small
模型之外的所有模型超越。
虽然不完全符合其他型号的标准,但electra-small
型号的性能仍然令人钦佩。正如所料,它训练速度最快,内存需求最小,推理速度最快。
说到训练时间…
训练的速度主要由模型的大小(参数的数量)决定,XLNet 的情况除外。与 XLNet 一起使用的训练算法使得它比比较的 BERT、RoBERTa 和 ELECTRA 模型慢得多,尽管具有大致相同数量的参数。与这里测试的其他模型相比,XLNet 的 GPU 内存需求也更高,因此需要使用更小的训练批量(如前所述,64 比 128)。
推断时间(此处未测试)也应遵循这一总体趋势。
最后,另一个重要的考虑因素是每个模型收敛的速度。所有这些模型都训练了 3 个完整时期,没有使用早期停止。
显然,在收敛需要多少训练步骤方面,模型之间没有可辨别的差异。所有的模型似乎都集中在 9000 步左右。当然,收敛所需的时间会因训练速度的不同而不同。
结论
很难在不同的变压器型号之间做出选择。然而,我们仍然可以从我们看到的实验中获得一些有价值的见解。
- 根据具体情况,旧型号可能会超过 ELECTRA 型号。但是,它的优势在于它能够以明显更少的用于预训练的计算资源达到有竞争力的性能水平。
- ELECTRA 论文指出
electra-small
模型明显优于类似规模的 BERT 模型。 - 为了更快的训练和推断,Transformer 模型的精华版本牺牲了一些精度点。在某些情况下,这可能是一种理想的交换。
- XLNet 牺牲了训练和推理的速度,以换取在复杂任务上可能更好的性能。
基于这些见解,我可以提供以下建议(尽管应该有所保留,因为不同数据集之间的结果可能会有所不同)。
- 对于大多数任务来说,这似乎仍然是一个很好的起点。根据结果,您可以决定超参数调整,变大,或变小!
- 如果你正在训练一个新的语言模型,或者如果你想微调一个语言模型,我推荐使用 ELECTRA 方法。尤其是在计算资源和/或可用数据有限的情况下。
看看大型车型是否也追随这一趋势会很有趣。我希望在以后的文章中测试这一点(T5 也可能会加入进来)!
如果你想看到一些关于不同模型的训练和推理速度的更深入的分析,请查看下面链接的我的早期文章(很遗憾,没有 ELECTRA)。
变形金刚是自然语言处理中无可争议的王者。但是有这么多不同的模型,它可以…
towardsdatascience.com](/to-distil-or-not-to-distil-bert-roberta-and-xlnet-c777ad92f8)