李宏毅机器学习笔记—第二节—When gradient is small

1.局部最小值和鞍点(Local Minimum And Saddle Point)

这一小节的部分属于Optimization,因此只讨论对于gradient descent的情况。

我们在Optimization的时候,总会发现一个问题,就是说随着你的数据的updata,loss并没有达到你的预期。通俗的来说就是loss的降不下去。过去常见的一个猜想,是因为我们现在走到了一个地方,这个地方参数对loss的微分为零,当你的参数对loss微分为零的时候,gradient descent就没有办法再update参数了,这个时候training就停下来了,loss当然就不会再下降了。我们将这些gradient为零的点统称为critical point。而在critical point中又有许多的点,例如local minima,local maxima,以及saddle point。

那么如何鉴别所谓的local minima,local maxima,以及saddle point呢?

首先我们将loss函数利用泰勒公式展开。

李宏毅机器学习笔记—第二节—When gradient is small_第1张图片

对比原版的泰勒公式,我们可以将g理解为对loss一次求导的一个向量。李宏毅机器学习笔记—第二节—When gradient is small_第2张图片 

而在H则是loss的二次求导的向量。(通常我们将H成为Hessian)

李宏毅机器学习笔记—第二节—When gradient is small_第3张图片

因此当一次求导为0,及g为0时,我们将通过H来进行判断。

结论:

        1.当H>0时,为local minima

        2.当H<0时,为local maxima

        3.当H>0H<0或者时,为saddle point

当然我们也可以通过计算H向量的特征值来判断。

结论:

        1.当特征值都大于0时,为local minima

        2.当特征值都小于0时,为local maxima

        3.当特征值既大于0也小于0时,为saddle point

而当我们判断以后,如何逃离这个saddle point呢?

结论:只要找出负的特征值,再找出它对应的特征值,用这个特征值去加θ',就可以找到一个新的点,这个点的loss比原来还要低。(顺着负数特征值的特征向量方向即可)

但是,在实际的操作中,我们不会去利用这个方法~

方法以后讲~

总结:gradient为0的点不一定是local minima(是critical point)。

要学会如何区分local minima,local maxima,以及saddle point。

2.批次与动量(Batch and Momentum)

Batch

在我们在实际做微分时,并不是将所有的数据直接算出数据的微分,而是将其分成一个一个的batch来进行计算。先把Batch中的资料拿出来,算个 Loss,算个Gradient,Update 参数,拿另外Batch资料,再算个 Loss,再算个 Gradient,再 Update 参数,以此类推,所以我们不会拿所有的资料一起去算出 Loss,我们只会拿一个 Batch 的资料,拿出来算 Loss。

李宏毅机器学习笔记—第二节—When gradient is small_第4张图片

而对于batch的设定,对于training来说也是十分的重要的。因为batch_size是一个Hyperparametric。

李宏毅机器学习笔记—第二节—When gradient is small_第5张图片

我们通过比较上面的图片可以知道,batch_size越大它的update就稳定,而batch_size为一的update的update就比较的不规则。

接下来我们会对batch_size的大小的优劣势做出一定的分析。

1.更大的批量不需要更长的时间来计算梯度

李宏毅机器学习笔记—第二节—When gradient is small_第6张图片

结合上图以及日常我们所了解到的,在计算时,gpu一般都是并行计算,因此对于不是很大的batch_size来说,它的计算时间也不是需要很多的时间。举例来说,如果一个Dateset有6000个,那么batch_size为1则需要update6000次,而batch_size为1000则只需要update6次。很显然,大一点的batch_size完成一个epoch所需要的update的时间更短。 

2.更小的批量更适合训练(优化)

李宏毅机器学习笔记—第二节—When gradient is small_第7张图片

比较上面的图片我们可以知道更大的batch_size的Validation Acc反而更小,其实这个是Optimization的问题。也就是说,你的batch_size越大,你的Optimization可能就会越差。

那至于为什么小的 Batch Size,在 Training Set 上会得到比较好的结果呢?

李宏毅机器学习笔记—第二节—When gradient is small_第8张图片

通过上图我们可以知道,假设你是 Full Batch,那你今天在 Update 你的参数的时候,你就是沿著一个 Loss Function 来 Update 参数,今天 Update 参数的时候走到一个 Local Minima,走到一个 Saddle Point,显然就停下来了,Gradient 是零,如果你不特别去看Hession的话,那你用 Gradient Descent 的方法,你就没有办法再更新你的参数了。但是假如是 Small Batch 的话,因为我们每次是挑一个 Batch 出来,算它的 Loss,等与你每一次 Update 你的参数的时候,你用的 Loss Function 都是有差异的,你选到第一个 Batch 的时候,你是用 L1 来算你的 Gradient,你选到第二个 Batch 的时候,你是用 L2 来算你的 Gradient,假设你用 L1 算 Gradient 的时候,发现 Gradient 是零,卡住了,但 L2 它的 Function 跟 L1 又不一样,L2 就不一定会卡住,所以 L1 卡住了 没关系,换下一个 Batch 来,L2 再算 Gradient。 

3.更小的批量更适合测试

这边还有另外一个更神奇的事情,其实小的 Batch 也对 Testing 有帮助。假设你有一些方法,你努力的调大的 Batch 的 Learning Rate,然后想办法把大的 Batch,跟小的 Batch Training 得一样好,结果你会发现小的 Batch,在 Testing 的时候会是比较好的。(实验数据如下图)

李宏毅机器学习笔记—第二节—When gradient is small_第9张图片

  那至于为什么会比较好呢,这个问题还在研究·~

总结:

李宏毅机器学习笔记—第二节—When gradient is small_第10张图片

 Momentum

1.Vanilla Gradient Descent(普通的梯度下降)

李宏毅机器学习笔记—第二节—When gradient is small_第11张图片

从上图我们可以知道,对于普通的Gradient Descent,首先是初始一个点,算出g0,按照g0的反方向进行update,以此类推。

2.Gradient Descent + Momentum

加上 Momentum 以后,每一次我们在移动我们的参数的时候,我们不是只往 Gradient Descent,我们不是只往 Gradient 的反方向来移动参数,我们是 Gradient 的反方向,加上前一步移动的方向,两者加起来的结果,去调整去到我们的参数,

李宏毅机器学习笔记—第二节—When gradient is small_第12张图片

从上图我们可以知道, Gradient Descent + Momentum的方法首先也是确定一个初始点以及初始运动点m0,计算这个点的g0,而update方向而是初始运动点加上g0的反方向,以此类推。

李宏毅机器学习笔记—第二节—When gradient is small_第13张图片

具体步骤如上图所示。

3.自动调整学习率(Learning rate)

1.即使没有关键点,训练也很困难

   Adaptive Learning Rate的技术是要给每一个参数不同的learning rate。

当我们的loss在不断的变小到几乎不怎么变化的时候,我们往往会认为这是我们已经快接近critical point,或者说此时的gradient非常的小。但其实不然。

李宏毅机器学习笔记—第二节—When gradient is small_第14张图片

从上图我们可以看出来,当数据update到300-700这个范围的时候,loss已经很小了,但是你的 gradient并没有很小,现在的gradient,在error surface山谷的两个谷壁间,不断的来回的震荡。所以我们可以知道,利用一般的gradient descend其实并不一定能遇到所谓的critical point,但是你的loss确已经降不下去了。所以,到底是什么原因导致了这个问题?

问题的核心其实在于我们一开始设定的学习率(learning rate),在一开始我们对于learning rate的设定一直是一个常数。这就导致了,当我们需要一小步一小步的update是,却会因为我们的gradient过大而导致update不合理。因此既然我们不能改变update的值,那么我们就试图对每个数据的learning rate进行客制化。 

2.不同的参数需要不同的学习速率

2.1Adagrad

在以前的update中,我们通常是这里的lr是一个常数,因此我们需要对其进行一个修改,除以一个σ。   

σ的求解如下图所示。

李宏毅机器学习笔记—第二节—When gradient is small_第15张图片

我们将以上的方法成为Adagrad,我么可以知道,当我们遇到一个坡度比较大的时候,这个是的g的值会比较的大,而我们所得到的1/σi的值会比较的小,因此便可以让update的步伐变得小一点。 

2.2RMSProp

那当我们遇到同一个方向同一个参数的时候,我们希望的lr也是可以进行一个动态的调整,因此我们这里引入一个新的方法叫做RMSProp。

RMSProp的求解如下图所示。

李宏毅机器学习笔记—第二节—When gradient is small_第16张图片

我们可以看到,在 RMSProp中我们添加了一个α的变量,这个变量其实是对g的进行·一个控制,来实现一个“迈大步”或者“迈小步”的结果。

李宏毅机器学习笔记—第二节—When gradient is small_第17张图片

从上面的图我们可以知道,当我们处在的error surface比较平缓时,我们就可以增加α的值,实现“迈大步”。同理当error surface比较陡峭时,我们则是减少α的值。

2.3Adam

 目前最常用的optimization的策略,就是Adam,Adam就是RMS Prop加上Momentum。而在pytorch里面也是帮我们写好的,且不用去更改其他的参数。

2.4learning rate的scheduling

虽然通过上面的方法我们已经成功将lr变成一个随时变换的值,但是这个η是一个固定的值,learning rate scheduling的意思就是说,我们不要把η当一个常数,我们把它跟时间有关。

2.4.1Learning Rate Decay

Learning Rate Decay:随著时间的不断地进行,随著参数不断的update,我们这个η让它越来越小。那这个也就合理了,因为一开始我们距离终点很远,随著参数不断update,我们距离终点越来越近,所以我们把learning rate减小,让我们参数的更新踩了一个煞车,让我们参数的更新能够慢慢地慢下来。这样也就避免在终点前的过程中出现突然爆炸的情况。

李宏毅机器学习笔记—第二节—When gradient is small_第18张图片

ps:在这个y轴的方向,看到很多很小的gradient,所以我们就累积了很小的σ,累积到一个地步以后,这个step就变很大,然后就爆走就喷出去了。

2.4.2Warm Up

Warm Up是另外一个经典,常用的Learning Rate Scheduling的方式。李宏毅机器学习笔记—第二节—When gradient is small_第19张图片

Warm Up这个方法,听起来有点匪夷所思,这Warm Up的方法是让learning rate,要先变大后变小,你会问说 变大要变到多大呢,变大速度要多快呢 ,小速度要多快呢,这个也是hyperparameter,你要自己用手调的,但是大方向的大策略就是,learning rate要先变大后变小。

使用Warm Up的原因:这边有一个可能的解释是说,你想想看当我们在用Adam RMS Prop,或Adagrad的时候,我们会需要计算σ,它是一个统计的结果,σ告诉我们,某一个方向它到底有多陡,或者是多平滑,那这个统计的结果,要看得够多笔数据以后,这个统计才精准,所以一开始我们的统计是不精准的。一开始我们的σ是不精准的,所以我们一开始不要让我们的参数,走离初始的地方太远,先让它在初始的地方呢,做一些像是探索这样,所以一开始learning rate比较小,是让它探索 收集一些有关error surface的情报,先收集有关σ的统计数据,等σ统计得比较精準以后,在让learning rate呢慢慢地爬升。

 总结:

李宏毅机器学习笔记—第二节—When gradient is small_第20张图片

4.损失函数也可能有影响(Loss)

~

5.批次标准化(Batch Normalization)

1.error surface“表面”崎岖的原因

Batch Normalization的主要功能就是将error surface的表面变得平整,达到一个更好的trian的效果。

在了解Batch Normalization之前,我们先要弄清为什么error surface会有这么多的崎岖不平的“表面”。

假设我现在有一个非常非常非常简单的 model,它的输入是x1和x2,它对应的参数就是w1和w2,它是一个 linear 的 model,没有 activation function。

李宏毅机器学习笔记—第二节—When gradient is small_第21张图片

w1乘x1 ,w2 乘x2 加上 b 以后就得到 y,然后会计算 y 跟 y(hat)之间的差距当做 e,把所有 training data e 加起来就是你的 Loss,然后去 minimize 你的 Loss。

而当我们稍微改变一下w的值时,即我们加上一个w1,此时我们可以知道,当我们再次输入一个x的值时,其L的值也会做一定的改变。当x的值很小时,对应的L的改变也很小,而当x的值很大时,对应的L的改变则会变得很大。

李宏毅机器学习笔记—第二节—When gradient is small_第22张图片

李宏毅机器学习笔记—第二节—When gradient is small_第23张图片

所以你发现说,既然在这个 linear 的 model 里面,当我们 input 的 feature,每一个 dimension 的值,它的 scale 差距很大的时候,我们就可能产生像这样子的 error surface,就可能产生不同方向,斜率非常不同,坡度非常不同的 error surface。

2.Feature Normalization

Feature Normalization的作用在于给让eature 里面不同的 dimension,让它有同样的数值的范围,其实有很多不同的方法,这些不同的方法,往往就合起来统称为Feature Normalization。以下讲的是Feature Normalization的一种情况。

李宏毅机器学习笔记—第二节—When gradient is small_第24张图片

我们把所有训练资料的 feature vector ,统统都集合起来,不同笔资料即不同 feature vector,同一个 dimension 里面的数值,把它取出来,然后去计算某一个 dimension 的 mean,以及计算第 i 个 dimension 的,standard deviation,之后我们再对其进行标准化计算。

                ​​​​​​​        ​​​​​​​        ​​​​​​​       

然后得到新的数值以后,再把新的数值把它塞回去,以下都用这个tilde来代表有被 normalize 后的数值。

原因:
1.做完 normalize 以后啊,这个 dimension 上面的数值就会平均是 0,然后它的 variance就会是 1,所以这一排数值的分布就都会在 0 上下。

2.对每一个 dimension都做一样的 normalization,就会发现所有 feature 不同 dimension 的数值都在 0 上下,那你可能就可以製造一个,比较好的 error surface。

3.Feature Normalization and Deep Learning

李宏毅机器学习笔记—第二节—When gradient is small_第25张图片

当我们做完Feature Normalization,将得到的新数据放进deep learning以后,通过w1这一层获得了z,。再由激活函数得到了a,在经过别的层后最后获得了w。那么相对于w来说,其实x,z,a都算是w的input。考虑到经过w以后z之间不同的 dimension 间,它的数值的分布仍然有很大的差异,因此我们要对z或者a也要做Feature Normalization又因为在internal里面,对z和对a做Feature Normalization效果是差不多的,因此我们这里对z做Feature Normalization。

李宏毅机器学习笔记—第二节—When gradient is small_第26张图片

 

从上图我们可知

1.首先我们要计算一下它的 mean。

2.其次,我们也算一个 standard deviation。(这边的平方就是指,对每一个 element 都去做平方,然后再开根号,这边开根号指的是对每一个 element,向量里面的每一个 element,都去做开根号) 

李宏毅机器学习笔记—第二节—When gradient is small_第27张图片

算出mean和 standard deviation以后的步骤和对x做Feature Normalization的步骤是一致的。

那么我就可以知道,现在的network里面,不再是一个input对应一个output。当你改变任意一个x的值,对应的z,mean,standard deviation,a也会随之改变。

而在实际的时候,我们不会将所有的dataset放进我们的network里面,我们往往放进去的一个batch,我们在实作的时候,我们只对一个 batch 里面的 data,做 normalization,所以这招叫做 Batch Normalization。

那这个 Batch Normalization,显然有一个问题 就是,你一定要有一个够大的 batch,你才算得出 mean跟 standard deviation,假设你今天,你 batch size 设 1,那你就没有什么mean 或 standard deviation可以算,所以这个 Batch Normalization,是适用于 batch size 比较大的时候,因為 batch size 如果比较大,也许这个 batch size 里面的 data,就足以表示,整个 corpus 的分布。

而当我们对z做完Batch Normalization以后,我们对z还要进行一定的调整,具体调整如下图所示。

李宏毅机器学习笔记—第二节—When gradient is small_第28张图片

那为什么一定要加呢?

一句话,就是对你的Batch Normalization是有帮助的。至于为什么,理由如下图~~(我也看不懂)

李宏毅机器学习笔记—第二节—When gradient is small_第29张图片

 4.Testing

而在实际的应用中,因为可能并不是每一个batch的数据都是足够的,因此这里会用一个叫做moving average的方法来计算mean和standard deviation。

李宏毅机器学习笔记—第二节—When gradient is small_第30张图片

 具体操作如上图所示。(这些都是pytorch中已经集成好了的)

 

 

 

 

你可能感兴趣的:(机器学习)