
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本指南基于 AI-For-Beginners 课程第 8 课迁移学习配套文档《Deep Learning Training Tricks》展开系统讲解深层神经网络训练中的核心难点与应对技巧包括数值范围控制、权重初始化、批归一化、Dropout、防过拟合策略以及各类优化算法。文中将结合本仓库中的 Dropout.ipynb、TransferLearningPyTorch.ipynb、TransferLearningTF.ipynb 等真实实验代码帮助读者理解这些技巧的底层原理并能在自己的训练流程中直接落地使用。说明本主题原文档位于 translations/fi/lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md归属于迁移学习课程单元该单元的主 READMElessons/4-ComputerVision/08-TransferLearning/README.md也明确建议读者通过本篇来加深对模型训练方法的理解。训练深层网络的挑战梯度消失与梯度爆炸随着神经网络层数不断加深训练过程会变得愈发困难。其中最典型的障碍就是**梯度消失Vanishing Gradients与梯度爆炸Exploding Gradients**问题当反向传播的梯度在逐层传递时如果每层的权重矩阵谱范数小于 1梯度会指数级衰减直至接近 0前层参数几乎得不到有效更新反之如果大于 1梯度则会指数级放大导致权重更新幅度失控、训练发散。从数学上可以更直观地看到这一点网络前向传播时信号在每一层都要与权重矩阵 Wi相乘。梯度回传时同样会与这些矩阵反复相乘因此梯度的量级取决于各层 ||Wi|| 的乘积其结果要么趋近于 0、要么无界增长——这正是梯度消失/爆炸问题的核心成因也是后续所有训练技巧试图解决的底层矛盾。为了让深层网络的训练更高效本课程给出了一个完整的工具箱下文将逐一展开。保持数值在合理范围内要保证数值计算的稳定性最朴素也最基础的做法是让神经网络中所有的值都处于一个合理的量级通常是[-1..1] 或 [0..1]。这不是一个非常严格的要求但浮点运算的本质决定了量级差异过大的数值无法被精确地同时处理。例如将 10-10与 1010相加结果几乎一定是 1010——因为较小的数值会被换算到与较大数值同一量级其尾数mantissa在这个过程中被完全丢弃。此外绝大多数激活函数的非线性区域都集中在 [-1..1] 附近例如 sigmoid、tanh 的饱和区间因此把输入数据缩放到 [-1..1] 或 [0..1] 往往是一个好主意。本仓库的实战代码中随处可以印证这一习惯在 Dropout.ipynb 中MNIST 数据在送入网络前被显式执行了x_train.astype(float32) / 255即把像素值从 [0..255] 归一化到 [0..1]在 TransferLearningPyTorch.ipynb 中用于迁移学习的图像同样经过归一化预处理后才喂给 VGG-16。这种缩放是后续所有训练技巧生效的前提。权重初始化让分布穿过各层得以保持理想情况下我们希望数值在穿越网络各层时保持在同一尺度上。因此用能保持值分布的方式初始化权重至关重要——这决定了网络刚启动时的信号量级也直接影响了训练初期的收敛速度。文档特别指出直接采用标准正态分布N(0,1)并不是好主意。原因是如果某一层有n个输入输出在求和之后的标准差会放大到n的量级数值极大概率直接跳出 [0..1] 的合理区间。实践中常用的初始化方案有以下几类初始化方式分布形式特点均匀分布uniform在对称区间内均匀采样实现简单高斯分布N(0, 1/n)方差随输入数量缩小对应框架中的gaussian方差缩放到输入维度N(0, 1/√n_in)对零均值、标准差为 1 的输入能保证输出保持同样的均值与标准差XavierGlorot初始化N(0, √2/(n_inn_out))同时考虑输入与输出维度帮助信号在正向传播与反向传播两个方向上都能保持在合理区间其中Xavier 初始化在 Keras 中等价于glorot是文档重点推荐的做法它同时使用输入维度 n_in 与输出维度 n_out使得信号在前向与反向传播时都不至于过度放大或衰减是搭建深层网络时的默认首选之一。批归一化Batch Normalization即便权重初始化正确训练过程中权重仍可能任意地增大或减小把信号推出合理区间。此时就需要借助归一化技术把信号拉回正轨。归一化技术有多种如权重归一化 Weight Normalization、层归一化 Layer Normalization但最常用的当属批归一化Batch Normalization。批归一化的核心思想是统计当前 minibatch 内所有值的均值和标准差然后执行归一化——即减去均值、除以标准差。它以一个网络层的形式实现在权重施加之后、激活函数之前执行归一化。其带来的典型收益是最终精度更高、训练速度更快允许使用更大的学习率同时缓解内部协变量偏移。本仓库的 TransferLearningTF.ipynb 中预训练模型如基于卷积的骨干网络的层结构里就明确出现了BatchNormalization层例如conv1_bn (BatchNormalization)输出形状为(None, 112, 112, 64)可以直观地看到批归一化在现代 CNN 架构中几乎成为标配——它紧跟在卷积层之后正是文档所描述的先做归一化、再进入激活的布局。Dropout随机关掉一部分神经元Dropout是一种很有意思的技术在训练过程中按一定比例随机移除神经元。它同样实现为一个网络层只带一个参数——被移除神经元的百分比典型取值为10%–50%训练时该层会把输入向量中的随机元素置零再传给下一层。这个想法听起来很反直觉为什么要故意丢掉信息但文档指出在 Dropout.ipynb 中观察 MNIST 数字分类器的训练即可看到它的实际效果它能够加速训练并在更少的训练轮次内达到更高的精度。该 notebook 给出了一个可直接复现的完整实验框架定义train(d)函数接受 dropout 比例d构造一个包含两层卷积 最大池化 FlattenDropout(d) softmax 输出层的 Keras 顺序模型并使用 Adam 优化器与sparse_categorical_crossentropy损失函数训练 5 个 epochdef train(d): print(fTraining with dropout {d}) model keras.Sequential([ keras.layers.Conv2D(32, kernel_size(3, 3), activationrelu, input_shape(28,28,1)), keras.layers.MaxPooling2D(pool_size(2, 2)), keras.layers.Conv2D(64, kernel_size(3, 3), activationrelu), keras.layers.MaxPooling2D(pool_size(2, 2)), keras.layers.Flatten(), keras.layers.Dropout(d), keras.layers.Dense(10, activationsoftmax) ]) model.compile(losssparse_categorical_crossentropy, optimizeradam, metrics[acc]) hist model.fit(x_train, y_train, validation_data(x_test, y_test), epochs5, batch_size64) return hist res { d : train(d) for d in [0, 0.2, 0.5, 0.8] }该实验对 4 种 dropout 取值0、0.2、0.5、0.8分别训练并绘制验证精度曲线notebook 给出的结论非常明确dropout 取 0.2–0.5 时训练最快、总体效果最好例如 dropout0.5 时第 5 个 epoch 的 val_acc 达到 0.9899甚至超过不使用 dropout 时的 0.9894且验证损失更低不使用 dropoutd0时训练过程往往更不稳定、收敛更慢过高的 dropout如 0.8反而让事情变糟第 1 个 epoch 的 val_acc 仅 0.9732训练损失也明显偏高。另外在 TransferLearningPyTorch.ipynb 中PyTorch 版本的 VGG-16 分类头里同样可以看到Dropout(p0.5)层的身影其注释明确将 dropout 定位为正则化regularization技术它通过轻微修改学习算法让模型更好地泛化训练时丢弃前一层约 30%此处示例为 50%的神经元从而帮助优化过程跳出局部极小值、在不同神经通路间分散决策权提升网络的整体稳定性。Dropout 之所以有效可以从两个角度理解随机扰动它相当于给模型施加随机的冲击把优化过程从局部极小值中推出来隐式模型平均implicit model averaging每次 dropout 时我们实际上是在训练一个略有不同的模型训练多轮后等效于对多个模型做平均从而降低方差。文档中还有一个趣闻式的类比据说喝醉的人学习东西第二天早上反而记得更牢因为大脑中部分神经元失灵后会迫使剩下的神经元更努力地去理解含义——当然文档作者也注明他们并未亲自验证过这个说法是否属实。防止过拟合平衡模型容量与数据量深度学习的一个重要方面是防止过拟合overfitting。虽然使用一个能力极强的神经网络模型很诱人但我们始终要在模型参数数量与训练样本数量之间保持平衡——模型越强大、参数越多就越容易把训练集上的噪声也记住导致泛化能力下降。因此文档强调请务必确保自己理解前面课程中介绍的过拟合概念。防止过拟合的常用手段包括早停Early Stopping持续监控验证集上的误差一旦验证误差开始上升就停止训练。这是成本最低、最容易落地的手段显式权重衰减 / 正则化Weight Decay / Regularization在损失函数中为过大的权重值增加额外惩罚项阻止模型产生极不稳定的输出模型平均Model Averaging训练多个模型并对结果取平均可以有效最小化方差Dropout隐式模型平均如上一节所述Dropout 本质上就是一种轻量级的隐式模型平均同时兼具正则化与加速训练的双重效果。优化算法从 SGD 到 Adam选择合适的训练算法是训练的另一个关键环节。经典的梯度下降Gradient Descent虽然合理但有时太慢或会引发其他问题因此在深度学习中通常使用随机梯度下降Stochastic Gradient Descent, SGD——即对训练集中随机选取的 minibatch应用梯度下降。权重更新公式为w(t1) w(t) - η∇ℒ其中 η 是学习率∇ℒ 是损失函数对权重的梯度。Momentum动量在**带动量的 SGDMomentum SGD**中我们保留一部分来自之前步长中的梯度。这就像带着惯性移动当你在某个方向受到一个不同方向的推力时轨迹不会立刻改变而是保留一部分原有的运动。为此引入一个表示速度的向量 vv(t1) γ·v(t) - η∇ℒ w(t1) w(t) v(t1)参数 γ 表示考虑了多少惯性γ0 时退化为经典 SGDγ1 时是纯运动方程完全保留历史速度。实践中 γ 通常取 0.9 左右在 0 与 1 之间取得平衡。Adam、Adagrad 等自适应方法如前所述信号在每一层都与矩阵 Wi相乘梯度量级取决于 ||Wi||可能消失到接近 0也可能无限增长——这正是梯度爆炸/消失问题的根源。一个解决思路是只使用梯度的方向忽略其绝对大小即对梯度做归一化w(t1) w(t) - η·(∇ℒ / ||∇ℒ||)其中 ||∇ℒ|| √(Σ(∇ℒ)²)这一算法称为Adagrad。采用相同思想的算法还有RMSProp与Adam。文档给出的实用建议非常直接Adam 被广泛认为是许多应用场景下非常高效的算法如果你不确定该用哪个优化器就直接用 Adam。这也与仓库中的实际代码一致前文 Dropout.ipynb 的实验就选用adam作为优化器TransferLearningPyTorch.ipynb 中训练迁移学习分类头时同样以 Adam 类优化器为主。梯度裁剪Gradient Clipping梯度裁剪是上述思想的进一步扩展。设阈值为 θ当 ||∇ℒ|| ≤ θ 时使用原始梯度进行权重优化当 ||∇ℒ|| θ 时将梯度除以其范数等价于把梯度归一化到范数 θ。参数 θ 在大多数情况下可取θ1 或 θ10。梯度裁剪尤其适合 RNN、Transformer 等容易发生梯度爆炸的架构是工程中非常实用的一道安全阀。学习率衰减Learning Rate Decay训练成败往往取决于学习率参数 η 的取值。直觉上较大的 η 会带来更快的训练这在训练初期通常是可取的而较小的 η 则能让网络进行更精细的微调。因此大多数情况下我们希望在训练过程中逐步减小 η。实现方式有两种逐轮衰减每完成一个训练 epoch就把 η 乘以某个因子例如 0.98学习率调度Learning Rate Schedule使用更复杂、非线性的衰减策略如步长衰减、余弦退火、预热等。无论哪种方式其目标都是前期大步快跑、后期小步精调这也是现代训练流程中的标准配置。网络架构的选择与自适应架构为你的问题选择合适的网络架构可能颇具挑战。通常的做法是选择在该任务或类似任务上已被证明有效的架构。尤其要注意架构的能力必须与手头训练样本的数量相匹配——选择一个能力过强的模型很容易导致过拟合。另一个好思路是使用能自动适应所需复杂度的架构。在一定程度上ResNet与Inception就是这类自适应架构ResNet通过**残差块residual block**引入恒等捷径连接使每一层只负责学习与上一层的差值。训练初期权重值很小大部分信号沿恒等连接直接通过随着训练推进、权重增大网络才逐步启用更多参数来表达复杂度。这让它能在数据量有限时自动控制有效容量并可堆叠出几十上百层的深度网络Inception则把每一层构建为多条不同路径的组合配合 1×1 卷积进行跨通道信息融合与降维同样具备对复杂度的自适应能力。关于这些架构的详细结构与选型可直接参阅本仓库的 CNN 架构专题对应第 7 课其中详细介绍了 VGG-16、ResNet、Google Inception 与 MobileNet 的层结构、设计动机与适用场景。迁移学习单元中大量使用这些预训练骨干网络详见 TransferLearningPyTorch.ipynb 与 TransferLearningTF.ipynb理解这些训练技巧能帮助你更好地微调它们。小结一份可落地的训练检查清单综合全篇在训练深层神经网络尤其是迁移学习场景下的预训练模型微调时可以按以下清单逐项自查数据与数值输入数据是否已缩放到 [0..1] 或 [-1..1]权重初始化是否使用了glorotXavier等保持分布尺度的初始化而非 N(0,1)信号稳定性深层网络中是否插入了批归一化层在卷积/全连接之后、激活之前正则化与泛化是否使用了 dropout建议 0.2–0.5过高反而有害是否配合早停与权重衰减优化器不确定时优先 Adam追求可解释性或特定场景再考虑 SGD Momentum稳定性保护面对 RNN/Transformer 等易爆炸场景是否配置了梯度裁剪θ 取 1 或 10学习率策略是否实现了逐轮衰减如 ×0.98或更精细的学习率调度模型容量所选架构VGG/ResNet/Inception/MobileNet的参数规模是否与训练样本量匹配避免过拟合以上技巧并非孤立的知识点而是相互配合的完整体系——从数值范围控制、初始化、批归一化保证信号不跑偏到 dropout、正则化保证泛化不跑偏再到优化器与学习率策略保证收敛足够快。对照 Dropout.ipynb 的对照实验与两份迁移学习 notebook 中的真实代码你可以立即在自己的训练脚本中验证这些技巧的实际收益。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI-For-Beginners 深度学习训练技巧全解梯度稳定、权重初始化、批归一化、Dropout 与优化器选择AI For Beginners 深度学习训练技巧全解梯度稳定、权重初始化、批归一化、Dropout 与优化器选择 本文是微软开源课程 AI For Begi教程人工智能机器学习深度学习深度学习训练技巧全解析从梯度消失到优化器选择AI-For-Beginners 实战指南深度学习训练技巧全解析从梯度消失到优化器选择AI For Beginners 实战指南 本文是微软开源课程 AI For Beginners12 周、2教程人工智能机器学习深度学习AI-For-Beginners 深度学习训练技巧实战指南初始化、归一化、Dropout 与优化器调优AI For Beginners 深度学习训练技巧实战指南初始化、归一化、Dropout 与优化器调优 本文围绕 AI For Beginners 课程仓库中教程人工智能机器学习深度学习上一篇ServerPackCreator 文件包含与排除指南用正则表达式精准控制服务器包内容下一篇加入源师兄开源硬件生态如何将自己的原理图与PCB贡献到项目创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考