多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

深入浅出 NYU-DLSP20 优化方法(二):自适应学习率、归一化层与“优化的终结“——从 RMSprop/ADAM 到加速 MRI 重建实战

深入浅出 NYU-DLSP20 优化方法(二):自适应学习率、归一化层与“优化的终结“——从 RMSprop/ADAM 到加速 MRI 重建实战 示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载本文基于 NYU 深度学习课程NYU Deep Learning Spring 2020即本仓库对应的 DLSP20 课程第五周第二部分讲义docs/tr/week05/05-2.md对应英文原版 docs/en/week05/05-2.md整理而成。课程由 Yann LeCun 与 Alfredo Canziani 讲授本节由 Aaron Defazio 主讲。文章围绕自适应优化方法RMSprop / ADAM归一化层Normalization Layers与加速 MRI 重建中的深度学习三大主题展开并结合仓库内真实 Notebook 与源码补充实战细节帮助你理解为什么逐权重自适应学习率更有效、ADAM 有哪些代价、归一化层为什么能让你更粗心地搭网络以及优化算法如何被端到端神经网络逐步终结。从全局学习率到逐权重学习率为什么要自适应在第五周第一部分docs/tr/week05/05-1.md中我们讨论了梯度下降GD、随机梯度下降SGD与 Momentum 更新。传统 SGD 的更新公式中网络中每一个权重共享同一个全局学习率 $\gamma$$$ w_{k1} w_k - \gamma_k \nabla f_i(w_k) $$问题在于实际使用的网络例如 CNN不同部分的结构差异极大——网络早期通常是在大尺寸图像上做浅层卷积而后期则是在小尺寸特征图上做大量通道的卷积。这两种运算性质完全不同因此对网络开头很合适的学习率对网络后半段很可能并不合适。以 VGG16 为例网络后半段的权重下图中标注为 4096 的全连接层直接决定输出对输出有非常强的支配性影响因此需要更小的学习率而网络前半段的权重尤其是随机初始化状态下对输出的单个影响要小得多。图 1VGG16——网络不同部位结构差异巨大催生了逐层/逐权重自适应学习率的需求自适应方法Adaptive Methods的核心思想正是为每一个权重单独自适应一个学习率所使用的信息来自每个权重各自的梯度历史。这类方法在问题条件数很差ill-conditioned、SGD 无法奏效的场景下尤其有用。RMSprop用梯度均方根做逐元素归一化RMSpropRoot Mean Square Propagation均方根传播的核心思想是用梯度自身的均方根root-mean-square对梯度做归一化。更新公式如下对向量做平方表示对每个元素逐一平方$$ \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} $$其中$\gamma$全局学习率$\epsilon$一个接近机器精度machine epsilon的小常数量级约为 $10^{-7}$ 或 $10^{-8}$用于避免除零错误$v_{t1}$梯度的二阶矩估计2nd moment estimate。指数移动平均怎么估计这个嘈杂量直接使用单个样本的梯度平方作为分母会非常不稳定因此 RMSprop 通过**指数移动平均exponential moving average**来维护 $v$ 这个随时间变化的量的均值。由于新值携带更多信息我们给新值更大的权重同时对旧值按因子 $\alpha$0 到 1 之间逐步指数衰减直到旧值不再对移动平均产生实质影响。这里需要澄清一个细节原始的 RMSprop 维护的是非中心二阶矩的指数移动平均——即不减去均值。二阶矩被用来对梯度做逐元素归一化每个梯度元素除以二阶矩估计的平方根。当梯度的期望值较小时这个过程近似等价于用梯度除以标准差。关于分母里的 $\epsilon$使用很小的 $\epsilon$ 并不会导致发散因为当 $v$ 非常小时梯度的动量本身也非常小。ADAMRMSprop 动量ADAMAdaptive Moment Estimation自适应矩估计本质上是RMSprop 加上动量是目前使用更广泛的方法。动量更新被改写为指数移动平均并且在使用 $\beta$ 时无需调整学习率与 RMSprop 一样它同样对梯度平方维护指数移动平均。$$ \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}$ 是动量的指数移动平均。注意为保持早期迭代中移动平均无偏而引入的**偏差修正bias correction**在推导中并未显式展示但在实际实现如 PyTorch 的torch.optim.Adam中默认启用。实战对比为什么一般推荐 ADAM 而非 RMSprop训练神经网络时SGD 在训练初期经常走错方向而 RMSprop 能较快锁定正确方向。但 RMSprop 与普通 SGD 一样受噪声影响——一旦接近局部最优解它会在最优点附近显著震荡。而 ADAM 在 RMSprop 的基础上叠加了动量相当于给 SGD 加动量带来的同类改善得到的是低噪声的良好解估计因此ADAM 通常比 RMSprop 更受推荐图 2SGD vs. RMSprop vs. ADAM 的训练行为对比ADAM 的四个已知缺点讲义同时明确指出了 ADAM 的代价论文中其理论性质其实并未被很好理解在非常简单的测试问题上可能不收敛——可以构造极简问题展示这一点泛化误差较差若网络在训练数据上达到零损失在未见过的数据点上并不会是零损失。尤其在图像任务上ADAM 的泛化误差常常比 SGD 更差可能的原因包括它倾向于找到最近的局部最优、ADAM 内部噪声更小等显存开销更大ADAM 需要维护 3 个缓冲区buffer而 SGD 只需 2 个。对于几个 GB 量级的模型这可能造成显存放不下的问题需要调节 2 个动量参数$\beta$ 和 $\alpha$而 SGD 只有 1 个。结论是训练神经网络时一般优先选择带动量的 SGD或ADAM在训练语言模型等某些网络时ADAM 甚至是必需的。仓库实战佐证Notebook 中的优化器选择本仓库的课程 Notebook 恰好体现了这两种主流选择的典型用法04-spiral_classification.ipynb 同时演示了torch.optim.SGD(...)第 153 行附近与torch.optim.Adam(model.parameters(), lrlearning_rate, weight_decaylambda_l2)第 232 行附近内置 L2 正则05-regression.ipynb 同样先后使用optim.SGD与带weight_decay的Adam06-convnet.ipynb 使用带动量的 SGDoptim.SGD(model_cnn.parameters(), lr0.01, momentum0.5)16-gated_GCN.ipynb 使用torch.optim.Adam(model.parameters(), lr1e-3)课程练习 extra/optimization.ipynb 基于 extra/utils/optim.py 中定义的Optim基类从零实现了SGDOptimizer、SGDMomentumOptimizer、RMSPropOptimizerdefaults dict(lrlr, alphaalpha)和AdamOptimizerdefaults dict(lrlr, alphaalpha, momentummomentum)并在二维非凸目标上可视化对比各类优化器的收敛轨迹——与本讲公式一一对应非常适合动手验证。归一化层从改进优化算法到改进网络结构归一化层Normalization Layers与前文不同它不是改进优化算法而是改进网络结构本身。它作为额外层插入现有层之间目标是同时改善优化性能与泛化性能。神经网络通常交替使用线性运算与非线性运算激活函数如 ReLU。归一化层可以放在线性层之前也可以放在激活函数之后最常见的做法是放在线性层与激活函数之间例如(a) 未加归一化时线性层 → 激活函数(b) 加入归一化后线性层 → 归一化层 → 激活函数(c) CNN 中的实例卷积线性层→ 批归一化Batch Norm→ ReLU。需要强调的是归一化层只影响流经它的数据并不会改变网络的表达能力——只要权重配置得当未归一化的网络同样可以输出与归一化网络完全相同的结果。归一化的统一数学表示归一化层的通用记法如下$$ y \frac{a}{\sigma}(x - \mu) b $$其中 $x$ 是输入向量$y$ 是输出向量$\mu$ 是 $x$ 的均值估计$\sigma$ 是 $x$ 的标准差std估计$a$ 是可学习的缩放因子scaling factor$b$ 是可学习的偏置项bias。如果没有可学习参数 $a$ 和 $b$输出向量 $y$ 的分布将被固定为均值 0、标准差 1。$a$ 与 $b$ 的存在维护了网络的表示能力输出可以落在任意范围。需要注意$a$ 和 $b$ 并不会撤销归一化——因为它们是可学习参数比 $\mu$ 和 $\sigma$ 稳定得多。四种归一化方式按统计量的计算范围划分给定一个包含 $N$ 张高 $H$、宽 $W$、$C$ 个通道的 mini-batch 输入选择哪些样本参与统计量计算决定了归一化的类型见图 4Batch norm批归一化仅对输入的一个通道做归一化统计量跨 batch 内的样本计算。这是最早提出、最广为人知的方法Layer norm层归一化对单张图像内的所有通道做归一化Instance norm实例归一化仅对单张图像、单个通道做归一化Group norm分组归一化对单张图像内的一组通道做归一化例如通道 0~9 为一组、10~19 为另一组以此类推。实践中组大小几乎总是取32。图 3Batch / Layer / Instance / Group Norm 四种归一化方式对比经验法则计算机视觉问题常用 batch norm 与 group norm语言问题则大量使用 layer norm 与 instance norm。为什么归一化有效归一化在实践中效果很好但其有效性的原因至今仍有争议。最初它被提出是为了减少内部协变量偏移internal covariate shift但已有研究者通过实验证明该解释并不成立。目前公认它至少由以下因素共同作用优化效应带归一化层的网络更容易优化允许使用更大的学习率从而加速训练正则化效应均值/标准差的估计因 batch 内样本的随机性而带有噪声这种额外噪声在某些情况下带来更好的泛化降低对权重初始化的敏感性。因此归一化让你可以更粗心几乎可以把任意神经网络模块堆叠在一起而无需担心网络条件数有多差训练成功的概率依然很高。实战注意事项与 PyTorch 实现讲义强调反向传播必须穿过均值、标准差的计算以及归一化的应用本身否则网络训练会发散。手写这一反向传播非常困难且易错而 PyTorch 的自动微分可以替我们完成。PyTorch 中两个对应的归一化层类torch.nn.BatchNorm2d(num_features, ...) torch.nn.GroupNorm(num_groups, num_channels, ...)批归一化是最早开发、最广为人知的方法但Aaron Defazio 建议改用 Group Norm——它更稳定、理论上更简单、通常效果也更好组大小取 32 是一个不错的默认值。另一个容易踩坑的细节Batch Norm 和 Instance Norm使用的均值/标准差在训练结束后会被固定下来而不是每次评估网络时重新计算——因为它们的归一化需要多个训练样本而Group Norm 和 Layer Norm只针对单个训练样本做归一化因此无需固定统计量。仓库佐证本课程 Notebook 中归一化层的使用与上述两类典型场景完全吻合——16-gated_GCN.ipynb 的图卷积网络使用nn.BatchNorm1d(output_dim)node/edge 特征各一而 15-transformer.ipynb 的 Transformer 实现则使用nn.LayerNorm(normalized_shaped_model, eps1e-6)并用torch.optim.AdamW(model.parameters(), lr0.001)训练——恰好是CV 用 BN/GroupNorm、NLP 用 LayerNorm的生动例证。优化的终结用深度学习一步完成 MRI 图像重建本节展示了一个从零闯入陌生领域并改进其做法的真实案例用深度神经网络加速**磁共振成像MRI**的图像重建。传统 MRI 重建线性映射已经很快但还能更快吗MRI 机器在二维傅里叶域中逐行/逐列采集数据每隔几毫秒采集一条线。原始输入由频率与相位两个通道构成每个值代表某个频率和相位正弦波的幅值——可理解为一张含实部、虚部两个通道的复值图像。对该输入施加逆傅里叶变换即把所有正弦波按各自权重叠加即可得到原始解剖图像。从傅里叶域到图像域目前已有线性映射且无论图像多大都只需毫秒级时间。问题随之而来能不能更快加速 MRI欠采样让线性映射失效加速 MRI 的目标是让机器运行更快、同时产出同等质量的图像。目前最成功的方式是不采集全部列可以随机跳过若干列但实践中更稳妥的是保留包含大量全局信息的中间列其余位置随机采样。麻烦在于欠采样后无法再使用线性映射重建图像——对欠采样傅里叶空间直接做线性映射得到的图像下图最右侧几乎没有实用价值必须寻找更聪明的方案。压缩感知基于优化的经典解法压缩感知Compressed Sensing是理论数学领域的重大突破之一Candes 等人的论文从理论上证明当被重建信号稀疏或具有稀疏结构时用更少的测量即可实现完美重建。但实际落地有几个要求采样应当是**非相干的incoherent**而非完全随机的——尽管实践中大家往往还是随机采样图像中需要存在稀疏性大量零值/黑色像素。对原始输入做波长分解wavelet decomposition可以得到近似稀疏而非精确稀疏的表示因此压缩感知给出的重建相当好但并非完美若输入在波长域真正稀疏则能得到完美图像。压缩感知本质上基于优化理论——通过求解一个带额外正则化项的 mini 优化问题来完成重建$$ \hat{x} \arg\min_x \frac{1}{2} \Vert M (\mathcal{F}(x)) - y \Vert^2 \lambda TV(x) $$其中 $M$ 是将未采样位置置零的掩码函数$\mathcal{F}$ 是傅里叶变换$y$ 是观测到的傅里叶域数据$\lambda$ 是正则化惩罚强度$V$讲义公式中记作 $TV$是正则化函数如全变差。关键痛点在于这个优化问题必须针对 MRI 扫描中的每个时间步/每个切片分别求解耗时通常远超扫描本身——这成为寻找替代方案的直接动机。谁能取代优化——端到端神经网络 $\hat{x} B(y)$既然每个时间步都要解一个小优化问题为什么不直接用一个大神经网络一步生成所需解核心期望是训练一个复杂度足够的网络 $B$使其一步求解优化问题输出质量不逊于逐时间步求解的结果$$ \hat{x} B(y) $$其中 $B$ 是我们的深度学习模型$y$ 是观测到的傅里叶域数据。15 年前这样做很困难如今实现起来则容易得多——下图显示深度学习方法的输出明显优于压缩感知且与真实扫描非常接近值得注意的是产生该重建的模型恰好把本讲两大主题融为一体ADAM 优化器 Group Norm 归一化层 基于 U-Net 的卷积神经网络。这类方案已非常接近实际落地我们有望在数年内看到加速 MRI 进入临床实践。小结主题核心结论关键参数/默认值RMSprop用梯度二阶矩的均方根做逐元素归一化训练初期方向准但噪声大全局学习率 $\gamma$衰减 $\alpha \in (0,1)$$\epsilon \approx 10^{-7}\sim 10^{-8}$ADAMRMSprop 动量收敛稳定噪声小一般优于 RMSprop两个动量参数 $\beta$、$\alpha$需偏差修正ADAM 的代价简单问题上可能不收敛、泛化误差偏大、3 个缓冲区、2 个可调动量参数记忆开销在数 GB 级模型上不可忽视归一化层改进网络结构而非优化算法可放线性层前或激活函数后最常见于两者之间$y\frac{a}{\sigma}(x-\mu)b$$a$、$b$ 可学习四种归一化CV 常用 Batch/Group NormNLP 常用 Layer/Instance NormGroup Norm 组大小默认 32Aaron Defazio 推荐PyTorch APItorch.nn.BatchNorm2d(num_features, ...)、torch.nn.GroupNorm(num_groups, num_channels, ...)BN/Instance Norm 训练后固定统计量GN/LN 不需要加速 MRI欠采样破坏线性映射压缩感知需逐切片解优化问题深度网络 $\hat{x}B(y)$ 一步重建典型方案ADAM Group Norm U-Net想要亲手验证这些结论可以打开本仓库的 extra/optimization.ipynb从零实现并对比 SGD / SGDMomentum / RMSprop / ADAM、04-spiral_classification.ipynbSGD 与 Adam 切换对比以及 15-transformer.ipynbLayerNorm AdamW 的语言模型实战继续深入。赞分享示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载相关推荐PyTorch 深度学习实战自适应优化、归一化层与加速 MRI 重建NYU DLSP20 Week05-2PyTorch 深度学习实战自适应优化、归一化层与加速 MRI 重建NYU DLSP20 Week05 2 导读 本文整理自 NYU 深度学习课程NYU示例工程NYU-DLSP20 优化技术二自适应优化器、归一化层与加速 MRI 重建实战解析NYU DLSP20 优化技术二自适应优化器、归一化层与加速 MRI 重建实战解析 导读 本文是 NYU Deep Learning Spring 20示例工程NYU-DLSP20 第5周深度解析RMSprop/ADAM 自适应优化与归一化层的原理与实战附加速 MRI 案例NYU DLSP20 第5周深度解析RMSprop/ADAM 自适应优化与归一化层的原理与实战附加速 MRI 案例 本文基于 NYU 深度学习课程Spr示例工程上一篇X-AnyLabeling AI辅助标注工具上手指南3条命令装好50模型直接用下一篇LeetCode 1168. 水资源分配优化虚拟根节点建模 Kruskal 最小生成树Java/Python3题解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表