首页 > 其他分享 >【李宏毅机器学习2021】(二)Tips for training

【李宏毅机器学习2021】(二)Tips for training

时间:2024-02-26 16:00:54浏览次数:27  
标签:Loss training 训练 loss 李宏毅 参数 2021 梯度 vec

这一节主要讲解机器学习、类神经网络训练不起来怎么办?讲解一些训练的 tips。

先来回顾下机器学习的步骤:

image-20240215121236392

接下来将介绍在机器学习过程中,遇到问题时如何判断原因并解决:

image-20240215121710408

在训练数据上 Loss 值很大

Model Bias

在训练数据上 Loss 值很大,有可能是发生了 Model 问题。

问题原因:模型太过简单,可以让 Loss 变得很小的 function 不在所定义的 Model 可以描述的范围之内。Model 里有未知参数,未知参数可以代入任何的数值,代入不同的数值就能得到不同的 function,把所有的function 集合起来就得到了一个 function set。所找到的 \(f_{\theta^\star}(\vec{x})\) 也不过是一个相对 function set 里其他 function 来说 Loss 值小,真正能使 Loss 值很小的 function 并不在 set 里。

解决方法:重新设计一个更有弹性的 Model。

image-20240215123546470

Optimization Issue

在训练数据上 Loss 值很大,也有可能因为 Optimization 做得不太好。

例如,在前面介绍的 Optimization 的过程中我们用到的是梯度下降算法,该算法存在一些问题,如遇到局部最小值问题。

image-20240215123943665

区分 Model Bias or Optimization Issue

Model Bias 相当于”从大海捞针,但针却不在大海里“,Optimization Issue 相当于”针在大海里,但却捞不到“。两者的区别在于 Model 是否够大,可以通过比较不同的模型来了解 Model 是否够大。

先来观察下图,只是看到在测试数据上的 Loss 很大,就推测是 overfitting,但还需要观察在训练数据上的 Loss,能看到在训练数据上也 Loss 也很大,所以不是 overfitting。

image-20240215125409608

那如何判断是 Model Bias 还是 Optimization Issue 呢?Model Bias 是因为模型太简单导致 Loss 大,假如 56层网络是 Model Bias 的问题,那么比 56层网络更简单的 20层网络的 Loss 应该更大,因为 20层网络的弹性更小,更不能描述复杂问题。可是20层网络的 Loss 却比 56层的 Loss要低,所以56层网络是由于没有做好优化导致 Loss 偏高。

建议:在遇到一个陌生的问题时,可以先跑一些比较浅的 network,或者用一些不是 Deep Learning 但比较容易进行 Optimization 的方法(如 Linear Model、support vector machine)。然后再做一个比较深的 network,如果深的 network 明明弹性更大,但 Loss 却无法比浅的 network 压得更低,那就代表存在 Optimization Issue。

image-20240215131618929

解决 Optimization Issue:更换优化算法。

在测试数据上 Loss 值很大

overfitting

在训练数据上 Loss 小,在测试数据上 Loss 大,可能遇到 overfitting 问题。

为什么会存在 overfitting 问题?

举一个极端的例子,当 \(\vec{x}\) 作为输入时,检查其是否出现在训练数据里,若有,则输出对应的 \(y_i\),否则输出一个随机值:

\[f(\vec{x}) = \begin{cases} y_i & \exists\vec{x}_i \in \vec{x} \\ random & otherwise \end{cases} \]

毫无疑问,这个 Model 在训练数据上的 Loss 为 0,但它却什么也学到,在测试数据上的 Loss 会很大。

再来看个一般的例子,如下图:

image-20240218222247820

假设输入的 feature 为 x,输出的 level 为 y。x 与 y 之间的关系是图一的虚线表示的曲线,我们是无法直接观察到该曲线的,我们真正能观察到的是训练数据,可以把训练数据想象为是从曲线上随机取样的点。只给蓝色的点作为训练数据,当模型很强很有弹性时,训练出的曲线,会通过蓝色点,但其他没有训练数据作为限制的地方,就很自由了,如图2的曲线所示。但如图3所示,此模型在测试数据上的表现并不好。

如何解决 overfitting

  • 增加训练数据: 增加更多的训练数据可以帮助模型更好地学习数据的真实分布,从而减少过拟合的风险。没有足够多的训练数据时可以使用数据增强(Data Augmentation)技术,通过对原始数据进行一系列的变换操作来生成新的数据,从而扩增数据集的规模。
image-20240218223510893
  • 约束模型。基于对问题的理解,决定模型的弹性。
    • Less parameters, Sharing parameters:Less parameters 通过减少模型中的参数数量来简化模型。例如,可以通过减少神经网络的层数、每层的神经元数量或减少卷积核的数量等方式来减少参数数量。减少参数数量有助于降低模型的复杂度,使其更容易训练,并减轻过拟合的风险。Sharing parameters 即模型中的某些参数被多个部分共享。例如,在卷积神经网络中,可以将卷积核应用到图像的不同区域上,从而实现参数共享。参数共享可以减少模型的参数数量,并且有助于模型对数据的统计特性进行更好的学习,提高模型的泛化能力。这两种方法通常结合使用,以帮助降低模型的复杂度并提高泛化能力。
    • 减少特征,尽量选择最具代表性的特征来减少模型的复杂度,可以降低过拟合的风险。
    • 正则化(Regularization): 正则化是一种通过在损失函数中添加惩罚项来限制模型参数的大小的技术。常见的正则化方法包括L1正则化和L2正则化。
    • 早停(Early Stopping): 早停是一种通过在训练过程中监控验证集的性能,并在验证集性能达到最优时停止训练的方法,以防止模型在训练集上过拟合。
    • Dropout: 一种常用的正则化技术,通常用于减少神经网络中的过拟合现象。在训练过程中,Dropout 随机地将网络中的一部分神经元(或者称为节点)的输出置零(即“丢弃”),并且在每次迭代中随机选择不同的节点进行丢弃。这样可以减少网络的复杂度,防止网络依赖于特定的神经元,从而提高模型的泛化能力。
image-20240218224152671

需要注意的是,不能为了解决 overfitting 就疯狂约束模型,一旦矫枉过正就会导致 Model Bias:

image-20240218230217346

看下图,随着模型变复杂,在训练数据上 loss 是一直变低的,在测试数据上 loss 是先变低再变高的,我们要选择的是能使 testing loss 最小的模型。

image-20240218230522572

mismatch

在训练数据上 Loss 小,在测试数据上 Loss 大,另一种可能是遇到了 mismatch 问题。

在机器学习中,训练数据和测试数据之间的 mismatch 意味着它们之间存在差异或不匹配。这种不匹配可能会导致训练的模型在测试数据上的性能表现不佳,因为模型在训练阶段学习到的模式不完全适用于测试数据。

导致训练数据和测试数据之间 mismatch 的原因可能包括但不限于:

  1. 数据来源不同: 训练数据和测试数据可能来自不同的分布或来源,例如训练数据来自一个地区的样本,而测试数据来自另一个地区。
  2. 数据采样偏差: 数据采样过程中可能存在偏差,导致训练数据和测试数据中的样本分布不均匀或者不一致。
  3. 特征表示不同: 训练数据和测试数据可能使用不同的特征表示方法,或者特征的定义和提取方式有所不同。
  4. 数据预处理不同: 对数据进行预处理(如归一化、标准化、填充缺失值等)的方式可能在训练和测试阶段不一致。
  5. 标签定义不同: 标签或目标变量的定义在训练和测试数据中可能存在差异,导致模型在测试阶段的预测结果不准确。
image-20240218233246128

局部最小值与鞍点

观察下图,在做 Optimization 的过程中会发现随着参数不断更新,但 training loss 不会再下降了(如蓝色曲线)。与更浅的 network 作比较,发现 loss 压得反而没有更浅的 network 低,显然是碰到了 Optimization Issue 了。甚至,有时候会发现从一开始 training loss 就掉不下去(如橙色曲线)。常见的一个猜想是梯度接近于零,参数更新的步伐自然也接近零,所以 loss 降不下去。

image-20240219111040242

下面介绍优化过程中的三个重要概念,都与损失函数的梯度相关:

  • 临界点(Critical Point): 临界点是指函数在某个位置上的梯度为零或者不存在的点,包括鞍点、局部最小值和局部最大值。临界点是优化问题的关键点,因为它们可能是梯度下降算法的停止点。
  • 局部最小值(Local Minima): 局部最小值是指函数在某个局部范围内的最小值,但并不保证是全局最小值。在局部最小值处,函数的梯度为零,但该点附近的函数值比该点更大。优化算法在到达局部最小值时可能会停止,导致得到一个局部最优解而不是全局最优解。
  • 鞍点(Saddle Point): 鞍点是指函数在某个位置上的梯度为零,但该点既不是局部最小值也不是局部最大值的点。在鞍点处,函数沿着某些方向是凹的(梯度为正),而沿着其他方向是凸的(梯度为负),这导致在该点处梯度为零。鞍点可能会使得优化算法停滞,因为梯度为零可能被误认为是达到了最优解。

卡在局部最小值无路可走,但卡在鞍点还有机会逃离,改变梯度下降的方向,就能让 loss 继续降低。


如果发现在某个位置上梯度接近零,卡在某个临界点上,如何知道是局部最小值还是鞍点:

Loss 函数在 \(\vec{\theta}'\) 附近可以用泰勒级数近似:

image-20240219120054977

在临界点处梯度为零,那么绿框部分为零,可以根据红框部分判断临界点的类型:

image-20240219120844087

有三种可能,对于所有 \(\vec{\theta}-\vec{\theta}'\)

  • 红框部分大于零,即在 \(\vec{\theta}'\)附近有 \(L(\vec{\theta}) > L(\vec{\theta}')\),故该点为局部最小值点。
  • 红框部分小于零,即在 \(\vec{\theta}'\)附近有 \(L(\vec{\theta}) < L(\vec{\theta}')\),故该点为局部最大值点。
  • 有时红框部分小于零,有时却大于零,那么该点为鞍点。

实际不太可能真的尝试所有的 \(\vec{\theta}-\vec{\theta}'\) ,可以通过计算 Hessian 矩阵的特征值来判断:

image-20240219122152073

Hessian 矩阵除了能判断该点是否为鞍点外,还能告诉我们该点是鞍点的情况下参数的更新方向:沿着小于零的特征值对应的特征向量方向更新参数即可减少损失值。

image-20240219123941358

但实际应用中其实并不会用到以上方来更新参数,因为 Hessian 矩阵、找特征值和特征向量需要很大的运算量。还有其他方法能更新卡在鞍点的参数,之所以讲这些是为了让你体会卡在鞍点并不可怕,最糟糕的情况下还有这种方法能解决。


那在日常实际应用中,卡在局部最小值和卡在鞍点,哪个更常见?

在一维的空间中好像 error surface 好像处处都是 local minima,但是会不会在二维的空间上看它只是个 saddle point 呢?维度越高是不是可以走的路就越多呢?在今天我们训练的 network 的参数往往百万千万以上,所以 error surface 是在一个很高的维度中,是不是能有更多的路可以走,其实 local minima 会更少见呢?

image-20240219125944418

实验上也支持“参数越多,local minima 越少见”这一假说。实验是训练一个 network,直到卡在临界点,然后进行记录。纵轴为卡在临界点时的 training loss,横轴为此时 Hessian 矩阵的特征值中正值的比例(Minimum Ratio)。显然 Minimum Ratio 为 1,代表是卡在了 local minima。但在实验中几乎找不到 Minimum Ratio 为 1,最高停留在 0.5 到 0.6 之间,这表明几乎有一半的特征值是负数,即还有一半的路可以使 loss 降低,所以在实际问题中,local minima 并没有那么常见,也就不是梯度下降的一个痛点。

image-20240219131203348

批次训练与动量优化

对抗临界点的两个方法就是批次(batch)训练和动量(momentum)优化。

批次训练

在实际操作中并不会算所有训练数据的损失函数然后才求梯度来更新参数,而是将训练数据切分成一批批的训练数据来更新参数。假设有 N 个训练数据,不妨分为每 B 个训练数据一组(每组有多少个训练数据是超参数)。本来是用全部 N 个训练数据计算梯度,然后更新参数值。实际操作是每次更新都只用一批数据来算梯度,下次更新时换另一批数据计算。每次更新一次参数叫做一次 Updata,把所有的 batch 都用来计算过一次梯度并更新参数值叫做一个 Epoch。每看完一个 epoch 就把训练数据打乱,然后重新分批次。这样能保证每个 epoch 中的 batch 不同,避免偶然性。

image-20240219152015988

在探讨批次训练为什么能对抗临界点之前,我们先来看下大批次和小批次的比较。

不妨设小批次的 batch size 为 1,大批次的 batch size 为全部训练数据数。大批次是看完全部训练数据后才更新参数,而小批次是看一份数据就更新一次参数,总共更新 20 次。可以看到大批次每次 update 时间长但效果好,而小批次每次 update 的时间短但效果差,需要进行多次运算效果才好。

image-20240219153215687

如果采用的GPU支持平行运算(Parallel computing),大批次的单次运算可能并不需要很长的时间。从下图运算结果可以看出来:batch size 在 1000 以内,每次 updae 的运算时间差不多。当batch size 很大时,每次 update 的时间还是会急剧增加的。

image-20240219154024422

由于平行运算,实际上小批次每个 epoch 时间反而比大批次要长。假设有 6 万份训练数据,batch size 为 1则一个 epoch 需要 6 万个update,batch size 为 1000,则需要 60 个 update,而两者每次 update 所需时间又是较接近的,这就造成了大批次反而更有效率。

image-20240219154721418

得益于平行运算,大批次更有效率,且每次 update 的梯度方向较小批次而言没那么 noisy,那为什么实际中应用中还分成小批次呢?

来看下在影像辨识问题 MNIST 和 CIFAR-10 上所做的实验,纵轴为正确率,横轴为 batch size。从下图可以得知当 batch size 变大时,正确率反而下降。如果是 model bias 的问题,那么在 size 小的时候也会表现差,而不会等到 size 变大才差。所以这是Optimization issue 导致大批次性能差。

image-20240219155903882

不管是在哪个问题上,小批次反而拥有更高的正确率,明明小批次每次 update 更 noisy 呀,这是为什么呢?

假设是 Full Batch,是沿着一个 Loss 函数来更新参数,当卡在临界点时,梯度为零,无法继续更新参数。

假设是 Small Batch,那么每次更新参数都是用的不同 Loss 函数,假设用 \(L_1\) 更新参数卡在了临界点,但是换到 \(L_2\) 却不一定卡住,有可能继续更新参数。所以 Noisy 的小批次反而更能帮助训练

image-20240219160331572

还有一个更神奇的现象,假设我们能将大批次和小批次在训练数据上训练的一样好,但是在测试数据上小批次表现更好。

image-20240219161537512

如下图,假设实曲线是 Training Loss,可能有很多 local minima。由于训练数据和测试数据之间存在 mismatch,所以 Training Loss 和 Testing Loss 存在差异,不妨设虚曲线为 Testing Loss。

local minama 有好坏之分,对于 Flat Minima 来说,Training Loss 值和 Testing Loss 值差别不大,但对于 Sharp Minima 而言,在 Training Loss 表现很好,在 Testing Loss 就表现很差了。

大批次一旦进入陡峭处,就走不出去,会更容易走向 Sharp Minima,小批次存在 noisy,会更容易跳出陡峭处,往往走向 Flat Minima。

image-20240219162350353

虽然小批次 1 个 epoch 耗时长,但小批次在优化过程性能更好,在测试时的性能也更好,所以在实际操作中是分成小批次。

批次大小是一个超参数,需要自行设定。

image-20240219164433369

动量优化

动量优化是另一个可以对抗临界点的技术。

假设 error surface 是一个斜坡,而参数是一个球,将球从斜坡滚下来,由于惯性的存在,滚到临界点并不会停下来,而是会继续滚,甚至动量够大还能翻过斜坡继续往下滚。

image-20240219164742545

那么如何将这个物理思想应用到梯度下降算法里呢?先来复习下一般的梯度下降算法:往梯度的反方向更新参数。

image-20240219165205937

用 Movement 优化梯度下降算法:综合考虑梯度方向和上一步的方向。

一种解读是“移动方向=上一步移动方向+现在的梯度反方向”:

image-20240219165356016

另一种解读是所谓的 momentum 不是只考虑现在的梯度,而是考虑过去所有梯度的总和:

image-20240219170252593

观看下图更好理解 momentum 。移动距离形象地表示为梯度更新距离+上一步惯性距离。第三个球位于临界点时,梯度更新距离是 0,但是由于上一步惯性距离,所以球能越过临界点。甚至,假如第四个球的上一步惯性距离大于梯度更新距离,则球可能可以越过山顶!

image-20240219170757000

自动调整学习速率

在训练的过程中 loss 不再下降,不一定是卡在 critical point,也有可能是因为振荡。观察训练过程中的梯度情况,发现 loss 已经趋于稳定了,而梯度还是有很明显的波动,显然不是卡在了 critical point,这是由于 learning rate 设得太大,从而导致振荡使得 loss 不再下降。

image-20240219172029839

那把 learning rate 设置小一点不就好了吗?来看下面实验,假设有个 error surface 是凸面,横轴参数的 loss 变化很小,而纵轴参数的 loss 变化快,坡度陡峭。黑点是初始点,黄色叉叉是 loss 最低点。假如设置个较大的 learning rate,纵轴参数更新时会振荡;假如设置个较小的 learning rate,纵轴参数能较好更新,而横轴参数却更新很慢,因为横轴坡度本来就平缓,再设置一个小的 learning rate,更新速度当然就更慢了!因此没有哪个 learning rate能一劳永逸,适应所有参数更新速度!

image-20240219173148564

每个参数需要有自己的 learning rate!设置每个参数自己的 learning rate,有一个大原则:在某个方向上比较平缓,即 gradient 值很小,那么它的 learning rate 就设大一点,加快更新速度;在某个方向上非常陡峭,gradient 值很大,那么 learning rate 设得小一点,减少振荡。

learning rate 要如何自动地根据 gradient 的大小作调整呢?为了方便讲解,只写某个参数 update 的式子,这里只看 \(\theta_i\),

原来的梯度下降式子:

\[\theta^{t+1} = \theta_i^t-\eta g_i^t \]

其中,\(\theta_i^t\) 是 \(\theta_i\) 在第 t 个 iteration 的值,\(g_i^t\) 是在第 t 个 iteration 也就是 \(\theta_i=\theta_i^t\) 时 loss function 对参数 \(\theta_i\)的偏微分。这个式子中 learning rate 是固定的。

为了能自动调整 learning rate,可以将式子中的 \(\eta\) 改写为 \(\eta/\sigma_i^t\)。\(\sigma_i^t\) 表明不同的参数,不同的 iteration 都会有不同的 \(\sigma\)。这样子我们就有 Parameter dependent learning rate 了,即意味着学习率的大小不是固定的,而是根据模型参数的某些属性或状态来动态调整。

image-20240219224111456

Parameter dependent learning rate 常见的计算方式,也就是自适应学习率算法有:

  • Root Mean Square
  • RMSProp
  • Adam

Root Mean Square

Root Mean Square 计算 \(\sigma\) 的公式如下图:

image-20240219231917329

当 loss 曲线较平缓时,梯度自然也较小,计算出来的 \(\sigma\) 自然较小,从而 learning rate 较大,更新时有更大的步伐。当 loss 曲线较陡峭时,梯度自然也较大,计算出来的 \(\sigma\) 自然较大,从而 learning rate 较小,更新时有更小的步伐。Root Mean Square 通常在 Adagrad 自适应学习率算法中使用。

image-20240219232349765

这里存在一个问题:上面例子的梯度方向和大小的变化幅度较小,当变化幅度较大时,比如曲线突然从陡峭变平缓,自然需要更大的学习率,但是 Adagrad 算法里每个 gradient 都是同等的重要性,当前平缓处的 gradient 得不到重视,不能及时把学习率变大。如何解决Adagrad 反应迟钝,对当前的梯度不灵敏问题呢?请看接下来的 RMSProp。

image-20240219235107612

RMSProp

RMSProp 不仅考虑到整体的梯度大小,更考虑到当前梯度的重要性。

image-20240219234428388

\(\alpha\) 是个超参数,当其接近于零时,表示当前的梯度较过去整体梯度更重要,有着更大的影响。

有下图曲线,当坡度较平缓时,有较小的 \(\sigma_i^t\),从而更新的步伐较大。当坡度突然变陡峭时,还是用原来的 Adagrad 则反应比较慢,而用 RMSProp,可以将 \(\alpha\) 设得小一点,让当前 gradient 具有更大的影响,就可以很快地让 \(\sigma_i^t\) 的值变大,从而更新的步伐变小。

image-20240220001234866

Adam

Adam(Adaptive Moment Estimation)是一种常用的自适应学习率优化算法,结合了动量优化和 RMSProp 的优点。Adam 算法的核心思想是通过动量机制来加速收敛,并通过自适应调整学习率来解决不同参数梯度变化幅度差异大的问题。

Adam 的算法和原始论文如下:

image-20240220002012281

Learning Rate Scheduling

来看下没使用自适应学习率优化算法和使用了 Adagrad 算法的效果,可以看到 Adagrad 算法能轻松接近 loss 最低点。

image-20240223233726386

注意上图中红圈部分,为什么会“爆炸”呢?往左走时参数 w 的 gradient 很小,由于 \(\sigma\) 的计算是分子每次都加很小的 gradient,分母是加一,当累积到一定程度时,\(\sigma\) 就变得很小,学习率会相应变大,w 更新步伐自然大,走到了 gradient 比较大的地方以后 \(\sigma\) 慢慢变大,自然又往回走。

Learning Rate Scheduling 可以解决这个问题。式子中还有一项 \(\eta\),假如 \(\eta\) 也慢慢变小,问题就迎刃而解。常见的策略叫做 Learning Rate Decay,随着训练的进行,让 \(\eta\) 随着时间慢慢降低,让参数的更新步伐慢下来。

image-20240224001259662

另一个非常常用的 Learning Rate Scheduling 策略是 Warm up:刚开始训练时以很小的 \(\eta\) 进行训练,随着训练的进行 \(\eta\) 逐渐变大,到了一定程度后逐渐变小。

Warm up 策略是一个黑科技(在 Transformer 里也有提到这个黑科技),为什么 Warm up 表现如此好的原因还有待研究。一个可能的解释是在神经网络训练的初期阶段,模型的参数通常是随机初始化的,而这些初始参数可能距离最优解的位置相距甚远。由于初始权重离最优权重较远,模型的损失函数会很大,导致计算得到的梯度也很大。如果此时使用较大的学习率,会使得参数更新的幅度过大,模型的优化过程就会“跑飞”,即偏离了最优解的方向,而不是朝着最优解的方向逐步迭代。这种情况下,模型可能会陷入更差的局部最优解,或者根本无法收敛到一个满意的解。即使在后续训练过程中调整学习率,也可能难以将模型拉回到正确的轨道上来。因此,在训练初期,采用较小的学习率,以及逐步增加学习率的方式,可以更好地避免模型的优化过程“跑飞”的情况,有助于提高模型的收敛性和稳定性,从而获得更好的训练效果。

image-20240224095347368

损失函数的影响

先来简单了解下分类问题,然后了解 MSE 和 Cross-entropy 这两个损失函数应用于分类问题的区别之处。

当我们在做分类问题时比较常用的做法是把每一个 class 用一个 one-hot vector 表示。在回归问题中的神经网络只有一个输出,而分类问题可能需要多个输出,如何由一个输出变成多个输出:在最后一层乘上不同的 weight,加上不同的 bias 即可产生多个输出。

image-20240225122348759

回归问题是产生一个输出值,然后再计算和 label 的距离。分类问题是产生一组输出值组成的向量,还要经过 softmax 处理产生新的向量,再计算和 label 的距离。

image-20240225123028030

为什么要经过 softmax 处理呢?一个简单的解释是 \(\vec{\hat{y}}\) 里只有 0 和 1,而 \(\vec{y}\) 的元素可以是任何值,softmax 把 \(\vec{y}\) 里的值转变到 0~1 之间。

softmax 运作模式如下图,分子用来将 \(y_i\) 变成正值,分母用来归一化,保证输出在 0~1 之间。softmax 的输入叫做 logit。

image-20240225123954249

如果是二分类问题当然也可以套 softmax 解,更常用的是 sigmoid,但其实这两个处理方式是等价的。


简单了解完分类问题,让我们进入正题,MSE 和 Cross-entropy 谁更适合用于分类问题。

image-20240225124829741

接下来将从 Optimization 的角度解释为什么 Cross-entropy 是被更常用在分类问题。

假设 \(y_1\) 和 \(y_2\) 的变化均是从 -10~10,\(y_3\) 固定设成 -1000,过softmax 后 \(y_3'\) 就非常接近于 0,对结果影响很小,我们就只需看 \(y_1\) 和 \(y_2\) 的变化对 loss 的影响。下图是分别在 e 是 MSE 和 Cross-entropy 时 \(y_1\),\(y_2\) 的变化对 loss 的影响。

image-20240225125907630

右下角是 \(y_1\) 大,\(y_2\) 小的情况,此时有很小的 loss,左上角是右下角是 \(y_1\) 小,\(y_2\) 大的情况,此时有很大的 loss。所以我们期待在训练的过程中参数可以往右下角走。

假设我们开始训练的地方是在左上角。MSE 在 loss 很大的地方,它的 error surface 是非常平坦的,它的 gradient 是非常小甚至接近于 0 的,有非常大的可能性 train 不起来(没有用 Adam 优化梯度下降算法的情况下)。如果选择 Cross-entropy 则在 loss 很大的地方也会有大的 gradient,较容易 train 起来。

这个例子告诉我们 Loss function 的定义都可能影响 training 是否容易,改变 Loss function 可以影响 Optimization 的难度

批次标准化

当 error surface 崎岖时是比较难训练的,那我们能不能直接把山铲平使得其比较好训练呢?批次标准化(Batch Normalization)就是其中一个把山铲平的想法。

image-20240225133426314

如下图,现在来看一个 Linear Model 的例子:\(x_1\) 范围小,\(w_1\) 变化所带来的影响小,而 \(x_2\) 范围大,\(w_2\) 变化所带来的影响大,这就是 \(w_1\) 方向坡度平缓,\(w_2\) 方向坡度陡峭的原因。由于不同特征的量级不同,导致其对应的参数的 loss 变化速度不同,也就形成了坡度不同的 error surface。所以,为了使不同参数的 loss 变化速度一样,可以让全部特征都处于同一量级上,这就叫做标准化。

image-20240225134908185

Feature Normalization(特征归一化)是指将输入数据中的特征进行标准化处理,使得它们在相同的尺度范围内。以下所讲内容是 Feature Normalization 的一种实现。

有一组特征向量,对于每一个维度 i 都计算其均值 \(m_i\) 和标准差 \(\sigma_i\),然后将该维度的每个特征 \(x_i^r\) 标准化:\(\frac{x_i^r-m_i}{\sigma_i}\)。当对所有维度都做一样的标准化后,每一个维度特征的均值是0,方差是1,会发现所有特征向量不同维度的数值都在0上下,可能就能制造一个比较好的 error surface。

image-20240225170332241

Feature Normalization 的目的是消除不同特征之间的尺度差异,从而有助于提高模型的训练速度和性能。如果不进行特征归一化,那么某些特征的值范围可能会非常大,而某些特征的值范围可能很小,这样会导致模型收敛缓慢,难以找到最优解。通过对特征进行归一化处理,可以确保模型更加稳健和高效地训练,同时减少了梯度下降过程中可能出现的数值问题。


当 Feature Normalization 用于深度学习时会带来一个问题:虽然在输入神经网络之前已经进行了 Feature Normalization了,但经过一层处理后产生的输出 \(\vec{z^i}\) 在不同维度也可能有不同的尺度范围,我们要 train 下一层的参数时会不会也有困难呢?因此需要进行标准化处理后再传给下一层网络。

image-20240225212624251

对 \(\vec{z^i}\) 或对 \(\vec{a^i}\) 做 Normalization 都行,由于这里的激活函数是 sigmoid,其在0附近的斜率比较大,对 \(\vec{z^i}\) 做 Normalization,把所有的值都移到0附近,之后求 gradient 的值会比较大。

隐藏层输出标准化步骤和特征向量标准化步骤一样:

image-20240225214511897

现在的训练数据百万千万甚至上亿量级,而均值向量和标准差向量的计算都取决于所有的 \(\vec{z}^i\),这就相当于一个大的网络,计算难以完成。所以考虑分批输入训练数据,保证一次只对一个 batch 进行标准化。批次标准化仅适用于 batch size 较大的情况,因为只有 batch size 够大才能近似总体分布。

image-20240225214854132

对隐藏层输出进行标准化处理后往往会将 \(\vec{\tilde{z}^i}\) 和 \(\vec{\gamma}\) 的对应元素相乘,然后加上\(\vec{\beta}\)。

image-20240225221443016

标准化处理是为了使得隐藏层的输出在一个较为稳定的范围内,有助于提高模型的训练速度和稳定性。然而,标准化处理会使得隐藏层的输出失去一定的灵活性,因为它将输出的分布限制在了一个特定的范围内。为了增加模型的表达能力和灵活性,我们引入了缩放参数 \(\vec{\gamma}\) 和偏移参数 \(\vec{\beta}\)。这两个参数是可学习的,它们允许模型对标准化后的隐藏层输出进行缩放和平移。通过调整 \(\vec{\gamma}\) 和 \(\vec{\beta}\) 的值,模型可以自动学习到如何调整标准化后的输出,以适应不同的数据分布和模型任务。通常设 \(\vec{\gamma}\) 为全1向量、\(\vec{\beta}\) 为全0向量,这样一来,标准化处理和 \(\vec{\gamma}\)、\(\vec{\beta}\) 参数的结合使用,既能够保持隐藏层输出的稳定性,又能够增加模型的灵活性,使得模型更好地适应不同的数据分布和任务要求。


在 testing 时我们不能等集齐一个 batch 的数据才进行输入执行运算,而是一笔数据进来一次运算,那我们在做 Batch Normalization 时如何计算均值和标准差呢?

计算 training 的每个批次的均值和标准差的移动平均,用该值作为 testing 过程中的均值和标准差。

image-20240225223011969

其他的 Normalization 方如下:

image-20240225224214022

标签:Loss,training,训练,loss,李宏毅,参数,2021,梯度,vec
From: https://www.cnblogs.com/hzyuan/p/18034517

相关文章

  • 【李宏毅机器学习2021】(一)引入机器学习和深度学习
    引入机器学习MachineLearning概括来说就是LookingforFunction,即让机器具备找一个函数的能力这些函数显然非常复杂,要依靠机器自动找出该函数。随着要找的函数不同,机器学习有不同的类别:Regression,回归:函数输出的是数值。Classification,分类:函数从给定选项(类别)中选择一个......
  • [陇剑杯 2021]webshell
    追踪流进行解题第一题:黑客登录系统使用的密码是Admin123!@#在第6个流的时候可以发现login的页面和有相关的信息,复制进行解码得到结果或者在搜索栏里用POST规则搜索,因为密码登录的规则一般是POST方式  第二题:黑客修改了一个日志文件,文件的绝对路径为/var/www/html/data......
  • 李宏毅2022机器学习HW3 Image Classification
    Homework3数据集下载在本地环境下进行实验总是令人安心,但是又苦于网上找不到数据集,虽然kaggle上有数据集但是下载存在问题于是有了一个天才的想法,间接从kaggle上下载(利用output文件夹中的文件是可下载这一机制将数据集从input文件夹拷贝到output文件夹),具体操作如下图等待数......
  • 李宏毅《机器学习》总结 - RL
    引入给一张动物的图片,分辨是什么动物。这个问题可以用CNN解决(HW3)。核心是通过有标注(label)的图片进行学习。而在下围棋时,如何落子是一个难以标注的问题,但是机器可以学到什么是好的,什么是不好的。这就是强化学习的适用场景。结构总的目标是想找一个Actor(或称policy),环境(envir......
  • [SWPUCTF 2021 新生赛]ez_unserialize
    概括这是一道PHP反序列化的CTF赛题,本意是想用这道题对PHP反序列化进行一定的学习。过程我们打开赛题,看看内容 没有发现什么东西,看看他的页面代码  根据他的提示,感觉是存在一个robots.txt文件的,尝试访问一下。 进去看看。 果然如此我们来分析一下这段代码<......
  • 李宏毅《机器学习》总结 - 2022 HW8(Anomaly Detection、ResNet) Strong Baseline
    重新学习了一下ResNet。。这作业平均一跑就是3、4个小时题目大意是让你做异常检测(anomalydetection),即给你一些正常的图片,再让你测试图片是正常的还是异常的(可以理解为2分类问题,只不过其中一个类别是无限大的)代码:https://www.kaggle.com/code/skyrainwind/hw8-anomaly-detec......
  • 微软 Office 2021 专业增强版,安装完自动激活
    123盘下载地址  MicrosoftOffice2021VL官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘(123pan.com)安装前先关闭windows系统自带的 病毒  微软办公软件套件MicrosoftOfficeLTSC2021专业增强版2024年01月批量许可版更新推送!Office2021正式版和Windows11......
  • 2021/1/14
    可以看出,for循环是将字符串的内容:依次取出所以,for循环也被称之为:遍历循环 同while循环不同,for循环是无法定义循环条件的只能从被处理的数据集中,依次取出内容进行处理所以,理论上讲,Python的for循环无法构建无限循环(被处理的数据集不可能无限大 range语句语法1:range(nu......
  • P9847 [ICPC2021 Nanjing R] Crystalfly
    前景导入当\(t\in[1,2]\)时,本题如何求解?答:树形dp设\(f[i]\)为以\(i\)为根的树,根节点的晶蝶已消散且儿子节点的晶蝶还未被惊动,能获得的最大晶蝶数。则有状态转移方程\(f[i]=(\sumf[u])+max(a[u])\),其中\(u\)为\(i\)的儿子。最终的答案即为\(f[1]+a[1]\)划向更......
  • CF1662J Training Camp
    网络流。先考虑建图。具体方式为\(s\)向每一个\(a\)值为\(1\)的点连边,每一个\(a\)值为\(n\)的点向\(t\)连边。然后对于每一行,每一列,\(a\)权值为\(i\toi+1\)连边。此时转化为最小割模型,割掉一个点意为选择该点。为什么是割?首先证明若源点汇点不连通则方案合法......