本文是沐神10.1 深度神经网络架构课程笔记,以及对部分内容扩展补充,增加个人理解

PPT地址:https://c.d2l.ai/stanford-cs329p/_static/pdfs/cs329p_slides_13_1.pdf

目录

1 深度神经网络的设计

2 批量归一化(BN)作用

3 BN实现原理

4 BN

代码实现

5 层归一化LN

6 其他的 Normalization

7 总结

1 深度神经网络的设计

PPT做神经网络 神经网络课设_PPT做神经网络

深度学习(DL)是可以认为是一种编程语言,用来表达我们对数据上、结构上、设计上、理念上的一些理解。与一般编程的语言不同点是:

  • 深度神经网络里面有很多值可以根据真实的数据训练得到,即我们定义了一个模板,模板里面的内容由之后的学习中得到。
  • 整个学习过程是可以导的,然后在给了损失函数和数据之后,就可以通过误差反向传递来进行对权重的更新。

与一般的编程语言类似,也有很多的设计模式,比如层如何设计;整个网络如何设计

这一章主要是关于深度神经网络里面的一些共用的设计模式:

  • 批量与层的归一化(BN和LN)
  • 残差连接
  • 注意力机制

其中残差连接和注意力机制在论文精读课程中已讲解,详见链接:

        resNet:https://www.bilibili.com/video/BV1P3411y7nn

        Attention:https://www.bilibili.com/video/BV1pu411o7BE

2 批量归一化(BN)作用

PPT做神经网络 神经网络课设_PPT做神经网络_02

 在线性模型中,我们会对数据进行标准化,即将数据的每一个特征转换为均值为0、方差为1,使得训练更简单。从数学角度讲,使得损失函数更加平滑

  • 平滑是指损失函数对输入x,输出y,损失函数f,f对于x的导数与对y的导数差的平方和,会小于等于xy之间差的平方和乘以系数β。这意味当x沿着导数方向走的很远的时候,比如到y,梯度可能发生较大变化,方向偏离大,若y处的梯度变化不是很大,则可以沿着该梯度方向继续走,学习率也可以更大。当x和y距离不太大,梯度改变的大小可以被限制住。 
  • β比较小得时候,可以使用一个大的学习率,即训练时步长可以更大
  • 标准化对较深的神经网络无效,因为如果是对x做标准化的话,他只会帮助直接线性作用于x的那个函数,也就是线性模型是可以的。但在多层的情况下,他会帮助最下面那层的线性层,对上面的层无效

 批量归一化将中间那些层的输入也做标准化

  • 有助于使整个函数更加平滑,使得在训练深度神经网络的时候会更加容易
  • BN为什么有效目前还有争议

使用批量归一化之后,可以选用更大的学习率,因此收敛会更容易,但是一般不会改变最后的结果精度

3 BN实现原理

PPT做神经网络 神经网络课设_机器学习_03

批量归一化可以拆解为四步:

变形(Reshape):如果输入是2维的矩阵就不用改变,否则需要将输入X变换成2维

  • 假设输入X∈ℝn×c×w×h是4维,n是批量大小、c通道数、w是宽、h是高,需要将X变化为X′∈ ℝnwh × c  2维矩阵,即通道维移到后面变为列,把nwh这三个维度合并在一起,变成行(c的每个通道可以看成是不同的特征表示,即特征维度,而nwh表示样本的数据,即样本数据维度)

标准化(Normalization):对每一列特征维度x′ j数据标准化

  • 对reshape后的矩阵的每一列减去这一列的均值,再除以该列的标准差(x′ j − mean(x′ j )) / std(x′ j),变换后得到′ j

还原(Recover)Y′:对上一步骤的每列数据′ j ,乘以该列对应的γj,加上这一列对应的βj,得到Y′的每一列y′ j  =  γj x′ j + βj

  • 虽然对数据减了均值后再除了标准差,但是我们还是有点想要数据有一点偏差,因此这里通过这个线性变换还原,在这里γj与βj是可以学习的,通过学习确认还原的程度,当γj是标准差,βj是均值可以完全还原。

恢复变形:最后就是将处理后的变形矩阵Y′还原成Y,使得YX形状相同

4 BN

代码实现

PPT做神经网络 神经网络课设_机器学习_04

 

代码先判断是训练阶段还是预测阶段:

  • 对于预测阶段,均值和方差直接使用前面训练得到的moving_mean, moving_var
  • 对于训练阶段,均值和方差使用本轮批量内计算的mean和var,训练阶段每个批量计算的mean和var会使用动量平滑的方式更新moving_mean, moving_var,使得较近的值权重大一些,较远的值权重小一些。

由于本代码并没有真的将X变形,因此输出Y也没有反变形的步骤。完整代码详见动手学pytorch课件:http://d2l.ai/chapter_convolutional-modern/batch-norm.html

5 层归一化LN

PPT做神经网络 神经网络课设_深度学习_05

若将BN用于RNN中,会出现问题,效果不佳。

  • RNN中,假如句子长度为P,RNN相当于做P次的MLP,即每一个时间步骤,将当前矩阵(样本乘以特征)算一下,并综合历史信息。若将BN用于RNN中,每一个时间步都需要维护均值方差数据,甚至是学到得γ与β,在不同时间步之间最好不要共享这些均值与方差(因为在不同的时间步中,这些数值变化很大,而BN需要一个比较稳定且准确的均值方差的估计,若抖动比较大就失去了做标准化的意义)
  • 若使用BN,当预测阶段输入更长的序列会有问题。假设输入长度是10,则需要维护10个不同时间步的均值方差(预测用),同时需要维护γ与β,假设训练时候最长的长度是10,但是预测时候输入长度是20,则后面10个没有对应的均值和方差,因此使用LN。

LN主要是reshape步骤与BN不同。两者之间主要区别是在哪个维度计算均值和方差,BN是按列(每个特征维度)计算,LN是按行(每个样本维度)计算,因此对于初始是2维矩阵,需要转置,X∈ℝn×p  , 需要将X变化为X′∈ ℝp×n  矩阵;对于初始是4维矩阵,假设输入X∈ℝn×c×w×h是4维,n是批量大小、c通道数、w是宽、h是高,需要将X变化为X′∈ ℝnwh × c  2维矩阵,即通道维移到后面变为列,把nwh这三个维度合并在一起,变成行。

以RGB图像为例,假设有n张图,每个图有R,G,B这3个通道,宽度w高度h。

        BN:计算R,G,B每个通道下,n张图总的均值、方差

        LN:对于n张图中每个图,计算R,G,B三个通道总的均值方差。

对于RNN,输入npt,n个输入,每个输入的时间戳是t,长度是p,LN将pt算成一个维度归一化

  • 标准化每个输入样本,到当前的时间步。
  • 优点是训练和预测保持一致性。因为均值方差都在样本里面,在预测时候,不需要存任何全局的数据,对每个样本,不需要结合前面样本数据,仅在本样本内部计算。
  • 在RNN和Transformer(每个输入样本长度可能不同)中应用广泛

6 其他的 Normalization

PPT做神经网络 神经网络课设_方差_06

这些Normalization 方法修改和LN相同,主要是在reshape步骤,需要根据不同的应用选择合适的归一化方法。下面是几种归一化的图例

     

PPT做神经网络 神经网络课设_人工智能_07

  • InstanceNorm IN输出通道数c与批量数n放在一起,高h与宽w放在一起,算h*w的均值,用在风格化迁移(因为在图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对hw做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。)
  • GroupNorm:GN就是将输出通道数c分group,然后每个group内做归一化,即c拆成 s*g s与wh放在一起,g与批量数n放在一起。由于BN 需要用到足够大的批大小,一个小批量会导致估算统计不准确,而GN 的计算与批量大小无关,其精度也在各种批量大小下(小到2)保持稳定。可以降低对硬件的需求。
  • CrossNormCN源于GN,将通道1和通道2的均值与方差在算出来之后,将两个通道均值与方差交换,即通道1图像用通道2的均值方差进行标准化,通道2同理。CN在通道之间传输统计数据,丰富了标准化特征和统计数据的组合CN只在训练中起作用。
  • SelfNorm:SN将β和γ替换为重新校准的均值µ'A= f(µA,σA)µA和标准差σ'A= g(µA,σA)σA。其中f(*) 和 g(*)为注意力函数。SN在测试中进行风格的重新校准,只关注必要的风格,减少标准化特征和统计混合的多样性。

修改标准化方式:例如白化(Whitening),不仅均值变0、方差变1,并且除去特征之间的相关性,例如PCA。

修改还原方式:将可学习的γ、β变为一个线性层、或者MLP,或者神经网络来进行还原。

标准化应用到权重或梯度上。

7 总结

PPT做神经网络 神经网络课设_人工智能_08

Normalization就是把一些中间的层的在数值上变得稳定点,让整个损失函数更加平滑,可以使得神经网络的训练更加容易,一般来说不会改变最后的精度。

目前也有很多研究不使用Normalization,比如梯度使用clipping,使得梯度不要太大,也可以达到类似效果,关键是使损失函数更加平滑