)
示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载本文围绕 NYU Deep Learning Spring 2020 课程第 5 讲下半部分讲者 Aaron Defazio对应韩文文档 docs/ko/week05/05-2.md英文原稿见 docs/en/week05/05-2.md展开系统讲解两类提升深度网络训练效果的手段自适应优化方法RMSprop、ADAM与归一化层Batch/Layer/Instance/Group Norm最后以加速 MRI 重建案例展示用深度网络直接替代逐时刻优化求解的范式。读完你将掌握为什么需要逐权重自适应学习率、RMSprop/ADAM 的数学原理与各自缺陷、四种归一化方式的区别与选型以及 PyTorch 中对应 APItorch.optim.Adam、torch.nn.BatchNorm2d、torch.nn.GroupNorm等的实战用法并结合仓库内真实 notebook 代码加深理解。一、自适应方法为什么每个权重需要独立的学习率在标准 SGD 公式中网络内每一个权重都用同一个全局学习率γ 更新$$w_{t1} w_t - \gamma \nabla f_i(w_t)$$而所谓自适应方法Adaptive Methods的核心思想是为每一个权重单独适配一个学习率依据是该权重历史梯度的信息。这类方法尤其适用于条件不良poorly conditioned的优化问题——也就是当普通 SGD 难以收敛时的有力备选。为什么要逐权重调学习率因为真实网络的不同部分结构差异巨大。以 VGG16 为例下图对应韩文文档的图 1网络前部是在大尺寸图像上做浅层卷积后部则是在小尺寸特征图上做大量通道的卷积。这两种运算性质截然不同在前部表现良好的学习率在后部很可能失效。更关键的是后部权重如图中 4096 维的全连接层直接决定输出对输出的影响极强因此需要更小的学习率而前部权重对输出的个体影响较弱随机初始化时尤其如此可以承受相对更大的学习率。这意味着按层/按参数自适应的学习率在实践中非常有价值。图 1VGG16——网络前部与后部的运算结构差异巨大二、RMSprop用梯度的均方根归一化梯度RMSpropRoot Mean Square Propagation均方根传播的关键思想是用梯度的均方根对梯度本身做归一化。下式中对梯度取平方表示对向量中每个元素逐一平方$$ \begin{aligned} v_{t1} {\alpha}v_t (1 - \alpha) \nabla f_i(w_t)^2 \ w_{t1} w_t - \gamma \frac {\nabla f_i(w_t)}{ \sqrt{v_{t1}} \epsilon} \end{aligned} $$其中各符号含义γ全局学习率ε接近机器精度machine epsilon的小值量级约 $10^{-7}$ 或 $10^{-8}$用于避免除零错误$v_{t1}$对**二阶矩second moment**的估计。2.1 指数移动平均如何估计带噪声的二阶矩梯度平方 $\nabla f_i(w_t)^2$ 是一个带噪声的量RMSprop 用指数移动平均exponential moving average来估计它——这是对随时间变化的量维护平均值的标准做法。新值携带更多信息应给予更大权重实现方式是对旧值做指数衰减$v$ 中越老的数值每一步都被 0 到 1 之间的常数 α 进一步压缩down-weight直到它们不再是移动平均中的重要成分。需要强调的是原始方法维护的是非中心二阶矩non-central second moment的指数移动平均因此这里不减去均值。这个二阶矩被用来对梯度做逐元素归一化梯度的每个元素都除以二阶矩估计的平方根。当梯度的期望值很小时这个过程近似于用标准差去除梯度即白化操作。分母中使用很小的 ε 并不会导致发散因为当 $v$ 很小时有效步长momentum 意义上的缩放量也非常小。三、ADAMRMSprop 加上动量ADAMAdaptive Moment Estimation自适应矩估计本质上是RMSprop 动量是实践中更常用的方法。动量更新被改写成指数移动平均的形式并且引入 β 时无需调整学习率与 RMSprop 相同这里也对梯度平方维护指数移动平均。设 $m_{t1}$ 为动量的指数移动平均更新公式为$$ \begin{aligned} m_{t1} {\beta}m_t (1 - \beta) \nabla f_i(w_t) \ v_{t1} {\alpha}v_t (1 - \alpha) \nabla f_i(w_t)^2 \ w_{t1} w_t - \gamma \frac {m_{t}}{ \sqrt{v_{t1}} \epsilon} \end{aligned} $$注意韩文文档中第一式写作 $m_{t1} \beta v_t (1-\beta)\nabla f_i(w_t)$应理解为排版笔误正确形式为对动量项 $m_t$ 做指数移动平均即上式。公式中 $m$ 由一阶矩带符号的梯度均值驱动更新方向$v$ 由二阶矩决定逐参数步长缩放。文档特别说明用于在训练早期保持移动平均无偏的偏置校正bias correction机制此处未展开——但它在标准 PyTorch 实现中是默认开启的。四、实践对比SGD vs RMSprop vs ADAM训练神经网络时SGD 在训练初期常常一开始就走错方向RMSprop 则能较快对准正确方向但它和普通 SGD 一样带有噪声接近局部极小值时会在最优点附近明显震荡。正如给 SGD 加动量能带来改善ADAM 把同样的改进带给了 RMSprop——它是解的低噪声估计因此一般更推荐 ADAM 而非 RMSprop。图 2SGD vs RMSprop vs ADAM 的训练轨迹对比对某些网络例如部分语言模型的训练ADAM 甚至是必要条件。总体上神经网络优化要么用带动量的 SGD要么用 ADAM。但论文中对 ADAM 的理论理解仍然薄弱它也有若干公认缺陷存在不收敛的简单反例在非常简单的测试问题上即可证明该方法不收敛已知会带来泛化误差在训练数据上把损失压到 0 的网络在未见过的数据上无法保持 0 损失。尤其在图像任务上ADAM 的泛化误差常常比 SGD 更差可能的原因包括它倾向于找到最近的局部极小值、ADAM 本身噪声更少、或它的结构特性等内存占用更高ADAM 需要维护3 个缓冲区而 SGD 只需 2 个。对几个 GB 量级的模型训练来说这可能使模型放不进内存超参数更多需要调节 2 个动量参数β 与 α而不是 SGD 的 1 个。仓库中的 04-spiral_classification.ipynb 恰好演示了这两种优化器的等价替换先以torch.optim.SGD(model.parameters(), lrlearning_rate, weight_decaylambda_l2)L153内置 L2 正则训练线性分类器随后在加入nn.ReLU()的版本中改用torch.optim.Adam(model.parameters(), lrlearning_rate, weight_decaylambda_l2)L232其余训练循环完全一致——这直观展示了从 SGD 切换到 ADAM 只需改动一行优化器构造代码。五、归一化层改进网络结构本身与改进优化算法不同归一化层改进的是网络结构它们作为额外的层插在既有层之间目标是同时提升优化性能与泛化性能。神经网络通常交替使用线性运算与非线性运算后者即激活函数如 ReLU。归一化层可以放在线性层之前也可以放在激活函数之后但最常见的做法是放在线性层与激活函数之间如下图所示。(a) 添加归一化之前(b) 添加归一化之后(c) CNN 中的例子图 3归一化层的典型位置。在图 (c) 中顺序为卷积线性层→ 批量归一化 → ReLU。需要注意归一化层只影响流经其中的数据并不会改变网络的表达能力——只要权重配置得当未归一化的网络仍可给出与归一化网络相同的输出。5.1 归一化的通用公式归一化层可以统一写成如下形式$$y \frac{a}{\sigma}(x - \mu) b$$其中x输入向量y输出向量μ对 x 均值的估计σ对 x 标准差std的估计a可学习的缩放因子learnable scaling factorb可学习的偏置项learnable bias term。如果没有可学习的 a 和 b输出 y 的分布会被固定为均值 0、标准差 1。a 与 b 的作用是保持网络的表达能力——输出值仍可落在任意范围。注意 a 和 b 并不撤销归一化因为它们是可学习参数比 μ 和 σ 稳定得多。5.2 四种归一化方式对归一化样本的选择不同就得到不同的归一化方法。考虑一个由 N 张图像组成的 mini-batch每张高 H、宽 W、有 C 个通道图 4四种归一化操作对 N×C×H×W 的 mini-batch批量归一化Batch Norm仅对输入的一个通道跨整个 batch 做归一化。这是第一个被提出、也最广为人知的方法层归一化Layer Norm在单张图像内、跨所有通道做归一化实例归一化Instance Norm仅对单张图像、单个通道做归一化分组归一化Group Norm在单张图像内、跨一部分通道做归一化。例如通道 0–9 为一组、通道 10–19 为另一组依此类推。实践中组大小几乎总是32。这是讲者 Aaron Defazio 推荐的方法因为它在实践中性能良好且与 SGD 不冲突。实践选型经验Batch Norm 和 Group Norm 在计算机视觉问题上表现良好而 Layer Norm 和 Instance Norm 在语言问题上被大量使用。仓库中的 15-transformer.ipynb 即为语言建模场景的佐证——Transformer 模块里两处归一化都用的是层归一化nn.LayerNorm(normalized_shaped_model, eps1e-6)L306–L307以及nn.LayerNorm(d_model, eps1e-12)L373。而图卷积网络 16-gated_GCN.ipynb 则在节点特征上使用了nn.BatchNorm1d(output_dim)L372–L373对应视觉/图数据场景下批量归一化的典型用法。六、为什么归一化有效虽然归一化在实践中效果显著但其有效性的原因至今仍有争议。最初归一化是为减少内部协变量偏移internal covariate shift而提出但已有学者通过实验证明该解释并不成立。尽管如此可以确定归一化的收益来自以下几方面因素的组合优化效果带归一化层的网络更容易优化允许使用更大的学习率从而加快训练速度正则化效果由于 batch 内样本的随机性均值/标准差的估计带有噪声这种额外的噪声在某些情况下反而带来更好的泛化降低对初始化的敏感度归一化减小了权重初始化方式对训练结果的影响。结论是归一化让你可以更粗心——几乎可以把任意网络构件拼在一起不必担心网络条件不良就有很大机会成功训练。七、PyTorch 实战归一化层的实现与推荐归一化生效的前提是反向传播必须穿过均值与标准差的计算过程以及归一化本身否则网络训练会发散。这一反向传播推导相当困难且易出错好在PyTorch 能自动计算。文档给出的两个归一化层类为torch.nn.BatchNorm2d(num_features, ...) torch.nn.GroupNorm(num_groups, num_channels, ...)选型建议Aaron Defazio 的明确推荐Batch Norm 是第一个被开发、也最广为人知的方法但讲者更推荐使用 Group Norm——它更稳定、理论上更简单、通常效果更好默认组大小取 32 是一个好的起点。另一个重要的工程细节Batch Norm 与 Instance Norm 在训练结束后使用的均值/标准差会被固定而不是每次评估网络时重新计算——因为它们的归一化需要多个训练样本。而 Group Norm 与 Layer Norm 只对单个训练样本做归一化因此没有这个限制PyTorch 中对应BatchNorm2d的track_running_stats与运行时均值/方差缓存机制。八、优化的终结以加速 MRI 重建为例有时候我们可以在完全陌生的领域里改善别人的既有实现——用深度神经网络加速 MRI 图像重建就是这样的例子。图 5有时它真的能奏效8.1 传统 MRI 重建传统 MRI 重建中原始数据来自 MRI 机器再用一个简单管线/算法重建图像。MRI 机器在二维傅里叶域中采集数据每隔几毫秒采集一行或一列。原始输入由频率与相位两个通道组成数值代表特定频率和相位下正弦波的幅度——简单说可把它看作带实部与虚部通道的复值图像。对该输入施加逆傅里叶变换即把所有正弦波按其权重相加就能得到原始解剖图像。从傅里叶域到图像域目前已存在线性映射且非常高效——无论图像多大都只需毫秒级。那么问题来了能不能更快8.2 加速 MRI欠采样打破线性映射加速 MRI 的目标是让重建过程大幅变快机器跑得更快同时仍产出同等质量的图像。目前最成功的方法之一就是不全量采集 MRI 扫描的列可以随机跳过部分列不过实践中有用做法是保留中间列它们横跨整幅图像、信息量大外围区域则随机采样。问题在于欠采样后不能再使用线性映射重建图像——对欠采样的傅里叶空间直接施加线性映射得到的输出图 7 最右图几乎没有实用价值这为更智能的方法留下了空间。8.3 压缩感知基于优化理论的重建压缩感知是理论数学领域长期以来的重大突破之一。Candes 等人的论文从理论上证明可以从欠采样的傅里叶域图像实现完美重建——只要待重建信号是稀疏的或具有稀疏结构就能用更少的测量完美重建。但工程上有两个现实条件非相干采样理论上需要的是非相干incoherently采样而非纯随机采样不过实践中人们最终还是随机采样并且由于采集整列与采集半列耗时相同实践中会采集完整列图像稀疏性需要图像含大量零值/黑色像素。原始输入经波长分解后可稀疏表示但分解结果只是近似稀疏而非精确稀疏因此压缩感知给出的是相当好但并非完美的重建。压缩感知建立在优化理论之上其重建通过求解一个带额外正则项的小型优化问题得到$$\hat{x} \arg\min_x \frac{1}{2} \Vert M (\mathcal{F}(x)) - y \Vert^2 \lambda TV(x)$$其中 M 是掩码函数把未采样位置置零$\mathcal{F}$ 是傅里叶变换y 是观测到的傅里叶域数据λ 是正则化惩罚强度V 是正则化函数。这个优化问题必须在 MRI 扫描的每个时间步/每个切片上求解往往比扫描本身耗时更长——这成为寻找更好方案的又一理由。8.4 谁还需要优化——深度网络一步求解与其每个时间步都去求解一个小型优化问题为什么不直接用一个大神经网络一步产出所需解目标是用足够复杂的网络本质上一步解决优化问题输出与逐时刻求解同样好的结果$$\hat{x} B(y)$$其中 B 是深度学习模型y 是观测到的傅里叶域数据。15 年前这还很难实现如今则容易得多图 9深度学习重建结果优于压缩感知接近真实扫描用于该重建的模型采用了ADAM 优化器、分组归一化层和基于 U-Net 的卷积神经网络——这恰好把本文前两部分自适应优化 归一化层串成了一个端到端的真实案例。该方案已非常接近实际应用有望在数年内看到加速 MRI 进入临床实践。总结本章通过算法改进与结构改进两条主线给出了深度网络训练提速的完整工具箱自适应优化从全局学习率的 SGD到逐权重自适应学习率的 RMSprop再到融合动量的 ADAM。选型上通常优先 ADAM必要时使用注意其泛化与内存代价或保留带动量 SGD归一化层y a/σ(x−μ) b的统一形式下Batch/Layer/Instance/Group 四种方式各有适用场景视觉任务推荐 Batch Norm 与 Group Norm组大小 32语言任务多用 Layer/Instance Norm讲者个人推荐 Group Norm范式转变MRI 加速案例说明当逐时刻优化求解代价过高时可以用足够复杂的网络如 U-Net ADAM Group Norm一步逼近优化问题的解开启优化之死的深度学习替代路径。以上要点均可结合仓库内的 04-spiral_classification.ipynbSGD/ADAM 一行切换、15-transformer.ipynbLayerNorm 用法、16-gated_GCN.ipynbBatchNorm1d 用法与韩文/英文讲稿原文进一步对照学习。赞分享示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载相关推荐NYU-DLSP20 优化技术 II自适应学习率、归一化层与深度学习 MRI 重建实战解析NYU DLSP20 优化技术 II自适应学习率、归一化层与深度学习 MRI 重建实战解析 本篇文章基于 NYU Deep Learning Spring 2示例工程深度学习优化进阶指南自适应方法、归一化层与加速 MRI 重建NYU-DLSP20 第 5 周第 2 讲深度学习优化进阶指南自适应方法、归一化层与加速 MRI 重建NYU DLSP20 第 5 周第 2 讲 本文基于 NYU 深度学习课程Deep Lear示例工程NYU-DLSP20 第 5 周深度学习实战梯度下降、动量与自适应优化、归一化层与卷积演习NYU DLSP20 第 5 周深度学习实战梯度下降、动量与自适应优化、归一化层与卷积演习 本篇文章对应 NYU Deep Learning Spring 2示例工程上一篇Windows风扇控制终极指南如何用FanControl实现精准散热与极致静音下一篇英雄联盟玩家的终极效率工具League Akari 3步搞定游戏体验升级创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考