0%

前向传播

一、Learning rate

前言

顾名思义,就是要给每个参数不同的learning rate,上一篇笔记中,我们提到了在沿着Loss函数我们可能会陷入local minima等一些gradient为零从而导致参数无法更新,Loss也就不再下降。但事实是当Loss不再下降的时候,gradient不一定很小,如下图在这里插入图片描述
当Loss很小时,gradient仍有在某时候是很大的,我们可以想象下面这样的情形导致的在这里插入图片描述
由图知道Loss不再下降并不是因为卡在local minima或者saddle point,而是因为此时的learning rate太大导致点更新的步伐过大使gradient在“山谷”两侧“反复横跳”导致Loss不再下降。再如下面这个例子:假设只有两个参数不断计算gradient来降低Loss在这里插入图片描述
我们的目的就是能够使黑点到达黄色点的地方,此时Loss最小,设黄色点为山谷最低端,两旁是山壁,前文有说到当Loss不再下降时可能是因为“反复横跳”:在这里插入图片描述
接下来可能就有一个疑问就是,为什么不把learning rate设低一点让黑点跨的步伐小一点进入中间地区呢?嗯,是个好疑问,我们把learning rate设为10e-7看看在这里插入图片描述
从图可以看出,虽然黑点不再反复横跳,但他仍然不能到达黄点,这是因为此时的Loss函数已经十分平缓,而learning rate又太小而导致他不能继续再往前,所以我们需要更加特殊的gradient descent

1.1 不同的参数需要不同的learning rate

当在某个地方的方向十分陡峭时我们就需要小的learning rate,反之需要大的learning rate在这里插入图片描述
按照普通的gradient descent,我们更新参数的方法是这样的在这里插入图片描述
而现在我们因为需要同时更新learning rate,所以将learning rate除以依赖于某个对应参数的未知参数δ在这里插入图片描述
下面来计算δ的值

1.1.1 Root Mean Square计算δ

在这里插入图片描述
依照刚刚的δ的计算方法,当在Loss函数曲线较平缓的地方的gradient较小,因为δ跟gradient是呈正比关系,则算出来的δ也小,则learning rate较大,那便可以跨的步伐更大使Loss变化大一点在这里插入图片描述
在较陡的地方则相反在这里插入图片描述
但是的话上面的方法还是不够好的,从上面的图中gradient的值都是差不多,都是朝着一个方向呈单调性变化的,但是在现实实验中我们可能会遇到的gradient在一个方向变化的程度可以是很大的在这里插入图片描述
所以我们就需要能够动态改变learning rate的值

1.1.2 RMSProp计算δ

在这里插入图片描述
δ的值取决于gradient的大小,当gradient比较大的时候说明loss很陡峭需要刹车,所以δ的值也会变大,使得learning rate变小,达到一个刹车的目的,否则反之
在这里插入图片描述
我们结合RMSProp和Momentum就可以构成最常用的优化器:Adam

1.2 检验结果

没有动态调整learning rate
在这里插入图片描述
之所以 出现红色圆圈里的现象是因为,随着gradient在y轴方向积累了很多小的值,使得δ在y轴方向很小导致learning rate太大出现井喷现象,但不会永远做简谐运动,因为随着learning rate还在不断更新黑点又会重新回到中间,我们有一种方法可以解决这个问题,就是Learning Rate Scheduling在这里插入图片描述
使随着时间的增加让learning rate变的小一些在这里插入图片描述

二、Classification

在第一篇的笔记中有写过Regression的output是一个数值,Classification的output是一个类别,如果结合起来看,我们是否可以将Classification当作Regression去训练呢?
这期间要求我们做得变化是将类别变成one-hot vector(独热向量):
Class 1 = [1 0 0]T
Class 2 = [0 1 0]T
Class 3 = [0 0 1]T
所以我们就能像做Regression一样得到三组数据
在这里插入图片描述
最后将得到的y值经过softmax函数得到y’再计算与y^的距离在这里插入图片描述
因为经过神经网络我们得到的y值可能是任何值,但是我们的target只有0和1,所以需要做normalization(归一化)将y值限制到0-1之间,softmax的工作就是这个,具体过程如下:
在这里插入图片描述
当我们在做两个类别分类时,可以直接使用sigmoid函数,因为sigmoid函数的取值范围是在0-1之间。
对于Classification时我们常用的Loss函数是Cross-entropy,表达式为:Error = -∑y^i*lny’i,在pytorch中,Cross-entropy常常是与softmax结合在一起的。

Batch Normalization

首先我们先来看两个参数w1、w2对Loss的影响:
在这里插入图片描述
且对应的神经网络是十分简单的:
在这里插入图片描述
x1改变一点后,最终L值会改变,但是由于x1的输入都很小时,其实对L的影响变不大。但是如果w2的输入很大,虽然w2只是改变一点点,最终也会对L造成很大影响在这里插入图片描述
所以我们应该让不同维度的数值都有一个相同范围。
假设R笔数据分布是这样的
在这里插入图片描述
我们先把同一维不同笔资料的mean计算出来,用那一维的数减去mean,再除以standard deviation(标准偏差)得到新的x’再放回原来位置,最终feature值都在0左右。考虑深度学习神经网络做normalization
在这里插入图片描述
开始时我们对input vector做了normalization之后得到z1,z2,z3,而他们又是后一层网络的输入,但是我们得到z值的时候他们的分布并不是分布在0和1之间的,这样会导致第二层训练起来比较困难。所以我们要对z做normalization,一样的步骤,计算mean,std:
在这里插入图片描述
在这里插入图片描述
上面这一大部分我们可以看成一层网络,这一层网络时是十分复杂的,因为里面有多个input和output,假如我们一次性把全部的资料读进去的话,计算量十分大,所以我们要考虑每次只对一部分的资料normalization,这就是Batch Normalization。值得注意的是Batch要足够多才行,只有这样才能算出u和δ的值
上面都是训练过程,现在来看一下testing:
上面我们知道u和 δ只能从比较大的Batch算出来,但是testing时,我们的数据量是不一定能够达到所需Batch值,在这里插入图片描述
这里有一个解决方法是,在训练时会把我们每次normalization得到的u1,u2,u3……拿出来计算得到平均值:
在这里插入图片描述
所以我们在testing时就不用计算u和δ的值,直接拿平均值即可

三、结语

以上是我本人学习机器学习的学习笔记的第三篇,有错误的地方还望指出,共勉!