机器学习课程学习周报三

机器学习课程学习周报三

摘要

本周的学习主要集中在以下几个方面:损失函数在训练集和测试集上的表现、优化问题及其解决方法、过拟合与模型复杂度的平衡、批量和动量的使用、自动调整学习率的方法以及学习率调度策略。具体内容包括模型偏差和优化问题的区分及解决、过拟合现象的识别和处理、局部极小值与鞍点的定义和影响、动量法在梯度下降中的应用、AdaGrad和RMSprop等自适应学习率方法、Adam优化器的原理及其优势,以及学习率衰减策略。

Abstract

This week’s study primarily focused on the following aspects: the performance of loss functions on training and test sets, optimization issues and their solutions, balancing overfitting and model complexity, the use of batches and momentum, methods for automatically adjusting learning rates, and learning rate scheduling strategies. Specific topics included distinguishing and addressing model bias and optimization issues, identifying and managing overfitting, defining and understanding the impact of local minimum and saddle points, applying momentum methods in gradient descent, adaptive learning rate methods such as AdaGrad and RMSprop, the principles and advantages of the Adam optimizer, and learning rate decay strategies.

一、机器学习部分

1.1 损失函数在训练集上的不同表现

当损失函数在训练数据上的损失很大时,显然模型在训练集上面的学习效果并不好,我们需要分析其原因;当损失函数在训练数据上的损失较少时,我们需要继续分析损失函数在测试数据上的情况,若损失函数在测试集上的表现不佳,我们需要分析其原因并改进。

image-20240711193553163

首先考虑损失函数在训练数据上的损失很大的情况:

1.1.1 模型偏差(Model Bias)

模型偏差即模型过于简单,把模型能找到的所有函数集合起来得到一个函数的集合。但是这个集合太小了,可以让损失变低的函数不在模型可以描述的范围内。在这种情况下,就算找出了一个 θ ∗ {\theta ^ * } θ,虽然是下图中蓝色函数集合中最好的一个,但是损失还是不够低。

image-20240712195742967

这时候需要重新设计一个模型,给模型更大的灵活性。

1.1.2 优化问题(Optimization Issue)

当模型的灵活性足够时,使用梯度下降法来解优化问题,找一个 θ ∗ {\theta ^ * } θ,但梯度下降法可能会卡在局部极小值,从而无法找到一个真正可以让损失很低的参数。

当损失函数在训练数据上的损失很大时,如何判断这是模型偏差导致的还是优化问题导致的?

image-20240712202536063

举个例子,56层的网络在训练集上的损失比20层的网络要高,这代表56层的网络的优化没有做好。因为56层网络的灵活性一定比20层的更大,20层的损失都可以做到这样了,只要56层网络的前20层的参数跟这个20层的网络一样,剩下36层什么事都不用做,复制前一层的输出就好了,所以56层这个网络的问题是优化做得不够好。(因此,如果更深的网络结构不能再训练数据上获得更低的损失值,那这就是一个优化问题。)

接下来,考虑损失函数在训练数据上的损失很小的情况:

1.1.3 过拟合(Overfitting)

在训练数据上面的损失小,测试数据上的损失大,是真正的过拟合。下图中,左侧图虚线是真实数据的分布,而右边是灵活性较大的模型能够很好地拟合现有的训练数据,而模型的其他地方没被限制,因此在测试集上的拟合效果很差。

image-20240712205121100

解决过拟合有两种方向:

第一个方向往往是最有效的方向,即增加训练集。在上图中表现为,增加代表训练数据的蓝色点,虽然模型的灵活性可能很大,但是点非常多,就可以很好地限制住模型。增加训练资料的方法可以通过多收集一些数据,也可以做数据增强(data augmentation),数据增强就是根据问题的理解创造出新的数据。举个例子,在图像识别中,常用的方法是 将训练集的图片左右翻转,或者将其中的一块截出来放大等等。

第二个方向是给模型一些限制,让模型不要有过大的灵活性。模型限制可以通过给模型比较少的参数,比如全连接网络(Fully-connected Network)就是一个比较有灵活性的架构,而卷积神经网络(Convolutional Neural Network, CNN)是一个比较有限制性的架构,CNN所找出来的函数集合其实是包含在全连接网络里的,然而正是因为CNN网络是受限制的网络,其在图像上的学习做得更好。限制的其它方法有早停(early stopping)正则化(regularization)丢弃法(dropout)

在Model Bias中需要使模型变得更复杂,在Overfitting中需要使模型变得更简单一些,如何做好trade-off(平衡)呢?

如下图,随着模型越来越复杂,训练损失可以越来越低。但测试时,当模型越来越复杂时,刚开始时,测试损失会跟着下降,但是当复杂程度超过一个程度以后,测试损失就会突然暴增了。这是因为当模型越来越复杂时,复杂到某一个程度,过拟合的情况就会出现,所以在训练损失上面可以得到比较好的结果,但是在测试损失上面,就会得到比较大的损失。可以选一个中庸的模型,不是太复杂,也不是太简单的,刚刚好可以在训练集和测试集上损失最低。

image-20240712213041253

1.1.4 交叉验证(Cross Validation)

比较合理选择模型的方法是把训练的数据分为两半,一部分为训练集,一部分为验证集。因此在选择最好模型的时候选择验证损失最小的模型即可。但是如果随机分验证集,可能会分得不好,导致验证损失很差,在这种情况下可以使用k折交叉验证(k-fold Cross Validation)

image-20240713082458118

k折交叉验证就是先把训练集切成k等份,在上图中训练集被切成3等份,切完以后,那其中一份当验证集,另外两份当训练集,这件事要重复3次。即第一份第二份当训练,第三份当验证;第一份第三份当训练,第二份当验证;第二份第三份当训练,第一份当验证。接下来有3个弹性不同的模型,也就是不同类型的网络模型,不知道哪一个好。把这3个模型,在这3个设置下的训练集和验证集上都训练一次,分别将3个模型在这3中设置下的损失加起来再取平均,再选择最好的那个模型。

1.1.5 不匹配(Mismatch)

不匹配是指训练集和测试集的分布不同,在这种情况下,增加数据也不能让模型做得更好。判断Mismatch要看对数据本身的理解或者说是训练集和测试集的产生方式等等。

1.2 局部极小值与鞍点

这一节主要讨论优化问题,首先要理解为什么优化会失败,收敛在局部极值与鞍点会导致优化失败。下图中蓝色的线代表深度模型没有发挥出完整的力量,训练的损失还是不够小;黄色的线从一开始时就训练不起来,它们的梯度都接近0,这都是优化问题。

image-20240713085440340

梯度为零的地方,分为局部极小值(local minimum)局部极大值(local maximum)鞍点(saddle point),梯度为零的地方也统称为临界点(critical point)

image-20240713091346403

接下来的问题是判断梯度为零,究竟是卡在了哪一种的临界点上?

微信图片_20240714141409

2

3

4

1.3 批量和动量

根据之前的学习,实际上在计算梯度的时候,并不是对所有数据的损失L计算梯度,而是把所有的数据分成一个一个的批量(batch)。在批量大小为训练数据的大小时,使用全批量的数据来更新参数的方法是批量梯度下降法(Batch Gradient Descent, BGD),此时模型必须把所有数据都看完,才能计算损失和梯度,参数才能够都更新一次。当批量大小等于1时,此时使用的方法是随机梯度下降法(Stochastic Gradient Descent, SGD),批量大小为1意味着只要取出一笔数据即可计算损失并更新参数。

image-20240713161807902

**动量法(momentum method)**仿照的是物理世界中的动量,**一般的梯度下降(vanilla gradient descent)**往梯度的反方向更新参数,在引入动量之后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定下一步的移动方向。

image-20240713161858957

每一步的移动都用m来表示,m其实可以写成之前所有计算的梯度的加权和,引入动量法后,可以从两个角度来理解动量法。一个角度是动量是梯度的负反方向加上前一次移动的方向。另外一个 角度是当加上动量的时候,更新的方向不是只考虑现在的梯度,而是考虑过去所有梯度的总和。

image-20240713162019616

如上图,红色表示负梯度方向,蓝色虚线表示前一步的方向,蓝色实线表示真实的移动量。一开始没有前一次更新的方向,完全按照梯度给指示往右移动参数。负梯度方向跟前一步移动的方向加起来,得到往右走的方向。一般梯度下降走到一个局 部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度, 还看前一步的方向。即使梯度方向往左走,但如果前一步的影响力比梯度要大,球还是有可能继续往右走,甚至翻过一个小丘,也许可以走到更好的局部最小值,这就是动量有可能带来的 好处 。

1.4 自动调整学习率

**AdaGrad(Adaptive Gradient)**是典型的自适应学习率方法,其能够根据梯度大小自 动调整学习率。AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就增大。

微信图片_20240714123753

参数相关的一个常见的类型是算梯度的均方根(root mean square)

微信图片_20240714123801

**RMSprop(Root Mean Squared propagation)**调整学习率的方法使得可以调整当前梯度的重要性,而在AdaGrad方法中每个梯度的重要性都是一样的。在RMSprop方法中,调整 α \alpha α,如果 α \alpha α设很小趋近于0,表明现在算出来的梯度比之前算出来梯度而言,比较重要;如果 α \alpha α设很大趋近于1,代表当前的梯度比较不重要,之前算出来的梯度比较重要。 α \alpha α是动态调整的。

image-20240714130046554

最常用的优化策略/优化器(optimizer)是Adam(Adaptive moment estimation),这是由RMSProp和动量法组合成的优化方法,其使用动量作为参数的更新方法,并且能够自适应调整学习率。

1.5 学习率调度

之前的学习率调整中学习率$\eta 是一个固定值,而在学习率调度中 是一个固定值,而在学习率调度中 是一个固定值,而在学习率调度中\eta 跟时间有关。学习率调度中最常见的策略是 ∗ ∗ 学习率衰减( l e a r n i n g r a t e d e c a y ) ∗ ∗ ,也称 ∗ ∗ 学习率退火( l e a r n i n g r a t e a n n e a l i n g ) ∗ ∗ 。随着参数的不断更新, 跟时间有关。学习率调度中最常见的策略是**学习率衰减(learning rate decay)**,也称**学习率退火(learning rate annealing)**。随着参数的不断更新, 跟时间有关。学习率调度中最常见的策略是学习率衰减(learningratedecay,也称学习率退火(learningrateannealing。随着参数的不断更新,\eta $越来越小。

image-20240714144343306

**预热(Warm Up)**是另一种学习率调度方式,学习率要先变大再变小,至于变多大、变大的速度和变小的速度都是超参数,残差网络、BERT和Transformer中的训练都用到了Warm Up。

image-20240714145156408

1.6 分类

在分类问题中,常用one-hot向量表示类。如果有三个类,标签 y y y就是一个三维向量,比如类1是 [ 1 , 0 , 0 ] T {\left[ {1,0,0} \right]^{\rm{T}}} [1,0,0]T,类2是 [ 0 , 1 , 0 ] T {\left[ {0,1,0} \right]^{\rm{T}}} [0,1,0]T,类3是 [ 0 , 0 , 1 ] T {\left[ {0,0,1} \right]^{\rm{T}}} [0,0,1]T。在分类问题中通常会把网络的预测值 y ^ {\hat y} y^通过softmax函数得到 y ′ {y'} y,然后计算 y ′ {y'} y与标签 y y y的距离。softmax的计算方式如下所示:

image-20240714155738479

计算分类中 y ′ {y'} y与标签 y y y的距离,可以用MSE,然而交叉熵更加常用,而最小化交叉熵其实就是最大化似然(maximize likelihood)

接下来从优化的角度来说明相较于均方误差,交叉熵则被更常用在分类上。有一个三类的分类,网络先输出 y 1 {y_1} y1 y 2 {y_2} y2 y 3 {y_3} y3,在通过 softmax 以后,产生 y ′ 1 {{y'}_1} y1 y ′ 2 {{y'}_2} y2 y ′ 3 {{y'}_3} y3。 假设正确答案是 [ 1 , 0 , 0 ] T {\left[ {1,0,0} \right]^{\rm{T}}} [1,0,0]T,要计算 [ 1 , 0 , 0 ] T {\left[ {1,0,0} \right]^{\rm{T}}} [1,0,0]T y ′ 1 {{y'}_1} y1 y ′ 2 {{y'}_2} y2 y ′ 3 {{y'}_3} y3之间的距离 e,e 可以是均方误差或交叉熵。假设 y 1 {y_1} y1的变化是从-10到10, y 2 {y_2} y2的变化也是从-10 到 10, y 3 {y_3} y3就固定设成-1000。因为 y 3 {y_3} y3的值很小,通过softmax以后, y ′ 3 {{y'}_3} y3非常趋近于 0,它跟正确答案非常接近,且它对结果影响很少。总之,我们假设 y 3 {y_3} y3设一个定值,只看 y 1 {y_1} y1 y 2 {y_2} y2有变化的时候,对损失 e 的影响。下图分别在 e 为均方误差和交叉熵时, y 1 {y_1} y1 y 2 {y_2} y2的变化对损失的影响,对误差表面的 影响,红色代表损失大,蓝色代表损失小。如果 y 1 {y_1} y1很大, y 2 {y_2} y2很小,代表 y ′ 1 {{y'}_1} y1会很接近 1, y ′ 2 {{y'}_2} y2会很接近 0。所以不管 e 取均方误差或交叉熵,如果 y 1 {y_1} y1 大、 y 2 {y_2} y2 小,损失都是小的;如果 y 1 {y_1} y1小, y 2 {y_2} y2 大, y ′ 1 {{y'}_1} y1是 0, y ′ 2 {{y'}_2} y2 是 1,这个时候损失会比较大。

image-20240714162801259

图中左上角损失大,右下角损失小,所以期待最后在训练的时候,参数可以“走” 到右下角的地方。假设参数优化开始的时候,对应的损失都是左上角。如果选择交叉熵,左上角圆圈所在的点有斜率的,所以可以通过梯度,一路往右下的地方“走”; 如果选均方误差,左上角圆圈就卡住了,均方误差在这种损失很大的地方, 它是非常平坦的,其梯度是非常小趋近于 0 的。如果初始时在圆圈的位置,离目标非常远,其 梯度又很小,无法用梯度下降顺利地“走”到右下角。 因此做分类时,选均方误差的时候,如果没有好的优化器,有非常大的可能性会训练不起 来。如果用 Adam,虽然均方误差图中圆圈的梯度很小,但 Adam 会自动调大学习率,还有机会走到右下角,不过训练的过程比较困难。总之,改变损失函数可以改变优化的难度。

总结

交叉熵的推导个人感觉比较重要,将在下周进行推导,同时下周将开启对卷积神经网络的学习。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值