【第三周】李宏毅机器学习笔记03

摘要

这周学习了机器学习的任务攻略。在机器学习中我们通过损失函数的值来判断模型性能的好坏。当训练中的loss值达不到我们理想的结果时我们需要分析loss值过高的原因,有可能是model bias也有可能是optimization。当我们在训练集中的loss取得很好的结果之后就要去观察测试集上的loss。测试集上loss过大则可能产生过拟合,如何解决过拟合也是本周需要学习的内容。此外还学到了一种模型评估办法——K折交叉验证法。本文还介绍了局部最小点和鞍点,对判断局部最小点和鞍点的方法进行了手写推导。本文也介绍了不同的batch size对模型训练的影响,并且将动量法与梯度下降法相结合进行优化模型的方法进行分析。

Abstract

This week, I learned about the strategy for machine learning. In machine learning, we use the value of the loss function to judge the performance of the model. When the loss value during training does not reach our ideal result, we need to analyze the reasons for the high loss value, which may be due to model bias or optimization. After achieving good results in the training set, we need to observe the loss on the test set. If the loss on the test set is too high, it may lead to overfitting. How to solve overfitting is also a topic we need to learn this week. In addition, I learned a model evaluation method, named K-fold cross validation. This article also introduces local minimum points and saddle points, and provides a handwritten derivation of methods for judging local minimum points and saddle points. This article also introduces the impact of different batch sizes on model training, and analyzes the method of combining momentum with gradient descent to optimize the model.

1.机器学习任务攻略

在这里插入图片描述

图1.总览

我们可以将之前课程上讲到的模型按照固定的思路进行优化。如果对训练出来的结果不满意,首先我们应该要检查模型在训练集上的loss大小。如果发现loss的值很大,则需要检查model biasoptimization两方面的问题;如果发现loss很小,则我们需要检查模型在测试值上的loss大小,再继续往下判断。

1.1 Model Bias

在这里插入图片描述

图2.增加函数复杂度

模型在训练集上得到的loss过大可能是因为model bias。产生model bias的原因是模型过于简单。
比如我们的模型是 y = f θ ( x ) y=f_θ(x) y=fθ(x),这个函数可以可以代入任何的 θ θ θ,从而可以得到 y = f θ 1 ( x ) y=f_{θ^1}(x) y=fθ1(x) y = f θ 2 ( x ) y=f_{θ^2}(x) y=fθ2(x) y = f θ 3 ( x ) y=f_{θ^3}(x) y=fθ3(x)等等,这些函数组合起来得到一个函数集。但是这个函数集太小了,里面没有包含一个能让我们loss的值降低的函数,即使找到一个最佳参数也无济于事。此时我们可以重新设计模型,给模型增加更多的弹性,比如引入更多的feature或者使用深度学习的方法增加网络层数等。

1.2 Optimization

在这里插入图片描述

图3.函数陷入局部最低点

造成loss过高不一定是model bias导致的,也有可能是因为optimization的问题。比如我们在使用梯度下降法寻找最佳参数是陷入了局部最低点(local minima),此时虽然函数集里包含了使loss值下降到足够低的函数,但是我们找不到一个全局最低点(global minima)使得loss值最低。

同上,虽然梯度下降法使我们优化模型的常用方法,但它也有自己的局限性:

  • 1.局部最优解:梯度下降法只能保证收敛到局部最优解,而无法保证全局最优解。在非凸函数中,梯度下降可能陷入局部最优解,而无法找到全局最优解。

  • 2.学习率选择困难:学习率的选择对梯度下降的收敛速度和效果有重要影响,但选择合适的学习率并不容易。学习率过大可能导致震荡,学习率过小可能导致收敛速度过慢。

  • 3.过拟合:梯度下降容易陷入过拟合问题,特别是在训练数据量较小或模型复杂度较高的情况下。为了避免过拟合,通常需要使用正则化等方法,或者采用更高级的优化算法。

  • 4.参数初始化:梯度下降对参数的初始值比较敏感,不同的参数初始化可能导致不同的训练结果。为了避免参数初始化影响训练效果,通常采用一些启发式的初始化方法,如Xavier初始化等。

  • 5.稳定性:基本的梯度下降算法可能会受到数据批量大小、数据分布等因素的影响,导致训练不稳定。因此,有时需要使用一些改进的优化算法,如随机梯度下降(SGD)、动量法、Adam等方法来提高算法的稳定性和收敛效果。

那么我们怎么知道是model bias还是optimization导致了loss值太高呢?

下面是一个示例:

在这里插入图片描述

图4.不同层数的模型在测试集和训练集上的误差对比

从图上可以看到,在测试集上随着参数反复更新,模型的loss随之降低。但是,56层网络的loss仍然比20层网络的loss高。这是因为发生了过拟合吗?我们可以再来看模型在训练集上的loss变化。显然,在训练集上56层网络的loss依然高于20层网络。56层网络的弹性已经远远高于20层网络了,按道理来说56层网络的loss应该要低于20层网络,这就可以排除model bias的问题了。很容易可以推断出,56层网络的loss大于20层网络是optimization导致的。

在这里插入图片描述

图5.判断是否属于optimization issue

首先我们可以训练一些比较浅的神经网络并观察他们的loss,然后再训练一些比较复杂的网络。如果深层的网络在训练集上的loss比浅层的大,那就说明我们的optimization没有做好。

1.3 Overfitting

在这里插入图片描述

图6

如果发现训练集的loss值很小,我们需要判断下在测试集上loss值的大小。如果在测试集上的loss值也很小,那么我们训练这个模型就可以结束了,模型也优化的很成功。反之,如果在测试集上loss值很大,那么可能发生了过拟合。为什么会出现这种情况呢?

在这里插入图片描述

图7.过拟合的一个极端例子

一个极端的例子:根据 f ( x ) f(x) f(x)的表达式,当 x = x i x = x^{i} x=xi时,对应输出 y ^ i \hat{y}^{i} y^i,也就是当训练集所包含的的 x x x输入后,对应 的 f ( x ) f(x) f(x)会输出训练集中的 y ^ i \hat{y}^{i} y^i ,否则随机输出一个值。这个函数并没有起到训练数据的作用,它在训练集上表现的非常好,但是放到测试集上表现极差。

在这里插入图片描述

图8.函数的弹性对loss的影响

假设虚线是真实的数据分布,蓝点是训练集,当我们的模型弹性足够高、过于复杂并且又没有什么条件约束它的时候,函数图像虽然说会经过蓝点,但是在蓝点之外的分布就会呈现千奇百怪的现象。当我们把测试集上的点(橙点)放到模型上的时候就可以看出它会产生比较大的loss了。

那么如何防止过拟合呢?

在这里插入图片描述

图9.防止过拟合的方法

最简单的一个方法就是增加更多的训练数据。虽然模型的弹性很大,但是当数据量足够多的时候就会约束模型往真实的情况靠近。不过搜集数据是一个非常耗费精力的事情,因此,我们可以采用数据增强技术(Data augmentation)。比如在对猫做图像识别时,我们可以把训练图片进行左右颠倒或者局部放大来增加更多的训练数据。但是data augmentation一定要根据实际情况进行合理的操作,比如将猫的图片进行上下颠倒再交给机器去学习可能就会训练出来意想不到的结果。

在这里插入图片描述

图10.限制模型复杂度的方法

第二个办法就是限制模型的复杂度。比如我们已经知道真实的数据分布是一个二次曲线,如果我们将模型限制到最高项只有二次项,那么训练出来的图像肯定会与真实分布足够接近。限制模型复杂度主要有以下几个方法:

  • 更少的参数或者共用参数
  • 更少的features
  • 早停策略
  • 正则化
  • Dropout法

早停策略(Early Stopping)是一种用于防止过拟合的常用策略,特别在训练神经网络等机器学习模型时经常被使用。该策略通过在训练过程中监控模型在验证集上的性能,当模型在验证数据集上的性能开始出现恶化时,停止训练,以避免继续训练导致过拟合。

Dropout是一种用于防止神经网络过拟合的正则化技术。在神经网络的训练过程中,Dropout会随机地将神经网络的一部分神经元临时“丢弃”(设置为0),即在前向传播和反向传播过程中将这些神经元的激活值置为0。这样可以促使网络的不同部分适应不同的情况,从而提高了模型的泛化能力。

1.4 Bias-Complexity Trade-off(模型复杂度的权衡)

在这里插入图片描述

图11

在训练集中,随着模型越来越复杂,对应的loss值会越来越低。但是对于测试集而言,起初loss值会随着模型的复杂度逐步下降,当复杂程度超过一定界限后,loss值反而会增加,这说明出现了过拟合。理想化情况下,我们希望选择一个适中的模型,可以在 training data 上能给我们最低的损失和偏差。

在这里插入图片描述

图12.选择最佳模型

那么我们如何选择一个最佳的模型呢?假设我们有三个模型,分别是 Model1、Model2、Model3。我们分别将这三个模型在 texting data 上进行训练,得出这三个模型训练后的loss值。那么是否可以根据训练出来的loss值来判断哪个是最佳模型呢?
考虑如图上的一个极端例子:由于存在偶然性,有可能会找到某一个函数 f 56789 ( x ) f_{56789}(x) f56789(x)在testing set上面表现极好,但是在存在大量新数据的testing set上面表现就差了。因此,我们通常通过 交叉验证法将训练数据分为训练集和验证集来解决这个问题。而在交叉验证中最常用的就是K折交叉验证法

1.5 N折交叉验证

在这里插入图片描述

图13.K折交叉验证

K折交叉验证(K-fold Cross-Validation)是一种常用的评估模型性能和选择超参数的方法。在K折交叉验证中,将原始数据集分成K份,其中K-1份作为训练集,剩下的1份作为验证集,然后进行K次训练和验证。最后通过对不同训练子集上的训练和测试结果的平均得分来评估算法性能。

2.如何把梯度下降做的更好

在这里插入图片描述

图14

当我们对模型进行训练时会出现两种情况:一是loss值一直处于大致平缓的范围,二是loss值降低但是没有达到我们的预期。这是由于发生了梯度消失现象(梯度接近0)。我们将梯度接近0的点称为临界点(critical point),临界点中包括了局部最小点(local minima)鞍点(saddle point)

2.1 鞍点

在这里插入图片描述

图15.鞍点

在优化问题中,鞍点(Saddle Point)是指函数的局部极小值和局部极大值共存的点。在一个多变量函数中,鞍点是一个既不是局部最小值也不是局部最大值的点,其梯度为零但二阶导数不是严格正定的点。

2.2 黑塞矩阵(Hessian Matrix)

请添加图片描述

图16.黑塞矩阵手推

黑塞矩阵(Hessian Matrix)是二阶偏导数矩阵,用于描述多元函数的二阶导数信息和函数的局部曲率,特别在优化算法中被广泛应用。黑塞矩阵是关于多元函数的二阶导数的矩阵,其中第i行第j列的元素是函数的二阶偏导数关于第i个自变量和第j个自变量的混合偏导数,用Hessian函数表示。

请添加图片描述

图17.判断局部最小点还是鞍点

梯度接近0的时候,我们可以通过Hessian矩阵的特征值来判断此时处于局部最小点还是鞍点。

请添加图片描述

图18.例子推导

在这里插入图片描述

图19

Hessian矩阵不仅可以帮助我们区分局部最小点和鞍点,还指出了参数更新的方向。假设 u u u是Hessian矩阵的特征向量, λ λ λ u u u对应的特征值。当梯度为0时, L ( θ ) ≈ L ( θ ′ ) + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) L(θ)≈L(θ')+\frac{1}{2}(θ-θ')^TH(θ-θ') L(θ)L(θ)+21(θθ)TH(θθ),如果此时我们用 u u u替换 ( θ − θ ′ ) (θ-θ') (θθ)可得 L ( θ ) ≈ L ( θ ′ ) + 1 2 u T H u L(θ)≈L(θ')+\frac{1}{2}u^THu L(θ)L(θ)+21uTHu。由特征值的基本定义得 H u = λ u Hu=λu Hu=λu,所以 u T H u = u T ( λ u ) = λ ∣ ∣ u ∣ ∣ 2 u^THu=u^T(λu)=λ{||u||}^2 uTHu=uT(λu)=λ∣∣u∣∣2。如果 λ λ λ小于0,则 λ ∣ ∣ u ∣ ∣ 2 λ{||u||}^2 λ∣∣u∣∣2也是小于0的,即 L ( θ ) < L ( θ ′ ) L(θ)<L(θ') L(θ)<L(θ)。由于 u = θ − θ ′ u=θ-θ' u=θθ
,则 θ = θ ′ + u θ=θ'+u θ=θ+u。所以我们在鞍点处想要减少模型的Loss值,只需要在鞍点处找到的Hessian矩阵的负特征值对应的特征向量 u u u,然后让这个负特征值对应的特征向量 u u u θ ′ θ' θ相加,最终得到更新后的 θ θ θ

在这里插入图片描述

图20

实际上绝大部分Hessian矩阵的特征值都找不到全为正数的情况,这说明了出现local minima是少见的现象,绝大部分时候都只是卡在saddle point上而已。

3.Batch(批次)

在这里插入图片描述

图21

在梯度下降法更新参数时我们通常不会在损失函数中代入全部训练数据来更新参数,因为这样子的效率太低。一般情况是我们会将全部训练数据分成一个个大小相等的batch,然后每个batch建立一个损失函数,再按顺序将参数一次往下更新。每一次参数更新都是在上一个batch进行梯度下降的基础上进行的。

每用一次batch叫做参数的一次update,所有的batch都用过一遍就叫做一次epoch。训练模型时会有多次的epoch,在每个epoch之前会分一次batch,并且每一个epoch分的batch都不一样,这件事情就叫做Shuffle(洗牌)。

在机器学习和深度学习中,shuffle是指对数据进行随机重排或打乱的操作。在训练机器学习模型时,数据通常会被划分为小批量进行优化参数的训练。为了避免模型记忆数据集的顺序而导致模型学习到顺序相关的特征,在每个训练周期(epoch)开始之前,通常会对数据集进行shuffle操作,即将数据集中的样本顺序打乱。shuffle的主要目的是使得模型在不同的训练批次中能够看到不同的样本顺序,增加数据的随机性,防止模型陷入局部最优解或过拟合的情况。通过shuffle操作,可以使得模型更好地学习数据集中的潜在模式和规律,提高模型的泛化能力。

3.1 Small Batch v.s. Large Batch)

在这里插入图片描述

图22.小batch和大batch参数更新的对比

假设现在有20组训练数据,此时有两种极端的情况:

  • 当 Batch Size = 20 时,模型的训练可以利用GPU并行计算的优势,提高训练过程的效率,但是需要消耗更多的内存和计算资源,Batch Size过大时,参数更新频率较低,模型的训练过程更加稳定。
  • 当 Batch Size = 1 时,参数更新频率较高,模型的训练过程不稳定,同时会引入更多的噪声,导致梯度估计的不准确性增加。

在这里插入图片描述

图23.不同batch的参数更新时间变化

更大的Batch在训练过程中所花费的时间不一定比更小的batch所花费的时间长。如图手写识别的例子所示,Batch Size为1时所花费的时间与 Batch Size为1000时所花费的时间几乎相等。这是因为模型的训练利用了GPU并行计算的优势,提高了训练效率。不过GPU并行计算的能力总是有限的。

在这里插入图片描述

图24.不同batch的update和epoch时间的比较

更大的batch反而会使得每个epoch的时间变小。

在这里插入图片描述

图25.不同batch对于两个公开数据集的性能比较

如图可以发现batch size越大,训练的结果也越差。显然,这也不是过拟合的问题。由于不同大小的batch size还是使用同一个model,因此这并不是model bias的问题,是optimization的问题。

但是为什么Batch Size较小时引入更多噪声反而能使得我们的训练结果更好呢?

在这里插入图片描述

图26

假如选择Full Batch,我们在更新参数时会沿着一个loss function来进行梯度下降。当参数下降到临界点(局部最小点或鞍点)时,参数的更新也随之停止。但如果我们选择的是Small Batch,我们在更新参数时,会选择第一个Batch的 L 1 L^1 L1函数来更新。在进行了一次update后机器会选择第二个Batch的 L 2 L^{2} L2函数来更新。当我们用 L 1 L^1 L1函数进行梯度下降时,更新到梯度为0的点停止了,但是由于 L 2 L^2 L2函数与 L 1 L^1 L1函数可能存在些许的不同,因此在 L 1 L^1 L1函数更新至梯度为0的点时,此点在 L 2 L^2 L2函数却不一定梯度为0,所以即便在 L 1 L^1 L1函数处无法更新参数了,但是在 L 2 L^2 L2函数处仍然可以更新参数。

在这里插入图片描述

图27

值得注意的是,小的batch也不一定会使训练的结果变好。比如当我们的loss陷入一个sharp minima时,当下一个epoch开始之后可能会使处于sharp minima的点逃离峡谷,使得模型的性能表现不够好。

在这里插入图片描述

图28.小batch和大batch的优缺点对比

Batch size是一个我们要自己手动设置的超参数,无论是small batch还是large batch都有它们擅长的地方和缺陷,这需要我们去根据不同的任务进行合理的设置。

4.Momentum

在这里插入图片描述

图29

动量法(Momentum algorithm)是一种优化算法,用于在训练神经网络时更新参数。它借鉴了物理学中动量的概念,旨在加速梯度下降的收敛速度,并减少参数更新的波动性。它通过累积梯度更新的动量来控制梯度下降的方向和速度,可以有效地避免陷入局部最优解并加速模型训练。从物理的角度来解释:假如一个小球从山坡上滚落,即使滚到局部最小点或者鞍点,由于动量的存在此时小球并不会被临界点卡住,会在动量的影响下继续进行运动。

在这里插入图片描述

图30

一般的梯度下降法通过计算损失函数的梯度并沿着梯度的反方向移动来更新参数。采用动量法之后,此时是将梯度的反方向和前一步移动的方向加起来的结果去调整我们的参数。例如,初始点为 θ 0 θ^0 θ0,初始运动量 m 0 = 0 m^0=0 m0=0,此时计算初始梯度 g 0 g^0 g0。第一次的运动量 m 1 = λ m 0 − η g 0 m^1=λm^0-ηg^0 m1=λm0ηg0,那么 θ 1 = θ 0 + m 1 θ^1=θ^0+m^1 θ1=θ0+m1。接下来进行第二轮的参数更新,计算梯度 g 1 g^1 g1,第二次的运动量
m 2 = λ m 1 − η g 1 m^2=λm^1-ηg^1 m2=λm1ηg1,那么 θ 2 = θ 1 + m 2 θ^2=θ^1+m^2 θ2=θ1+m2。最后以此类推,反复更新参数。

在这里插入图片描述

图31

那么动量是如何帮助我们逃离临界点的呢?考虑如图所示的例子,当小球进行第一次参数更新时梯度很大,会向右运动。当小球运动到第二个位置的时候虽然梯度变小了,但是考虑了前一步运动的距离也会继续向右进行运动。当小球运动到第三个位置的时候此时梯度为0,但是考虑上一步运动的距离之后小球仍然要向右运动。当小球运动到第四个位置之后,尽管梯度指引小球向右走,但是只要上一步移动的距离足够多,小球就会继续向右运动,甚至会冲出图上的“山坡”。

总结

通过这三周的学习,我也对机器学习的过程有了更加透彻的理解。当模型在训练集上的loss偏大是要考虑是model bias还是optimization的原因。如果是model bias的原因的话应该要重新设计模型,增加模型的复杂度。不过模型太过复杂会产生过拟合现象,因此需要我们选择出一个恰当的模型。如果是optimization的原因的话我们可以采取梯度下降+动量法,让即将陷入临界点的数据可以冲出临界点。当损失函数陷入临界点的时候不一定就是最优参数,我们需要判断此时处于局部最小点还是鞍点。通过对多元泰勒公式的展开我们学习了黑塞矩阵的构成,而通过黑塞矩阵的特征值我们又可以判断此时参数处于局部最小点还是鞍点。当数据集过于庞大时使用梯度下降法计算导数时的计算会非常复杂,但是将数据集分为若干个batch以此更新参数就会大大提高梯度下降法的计算效率。设置多大的batch size也是一个至关重要的问题,我们需要手动设置合理的超参数。为了防止参数陷入临界点通常我们会采用梯度下降+动量法,当参数移动的时候会考虑当前的梯度和前一步运动的方向,即使陷入梯度为0的点时也会因为上一步移动的方向而使得参数脱离临界点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值