吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

神经网络的权重初始化

吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
四个神经元可能有4个输入特征,从x_1到x_4,经过a=g(z)处理,最终得到y我们用x表示。
z=w_1 x_1+w_2 x_2+⋯+w_n x_n,b=0,暂时忽略b,

目的:为了预防z值过大或过小,你可以看到n越大,你希望w_i越小,因为z是w_i x_i的和,如果你把很多此类项相加,希望每项值更小
方法:设置w_i=1/n,n表示神经元的输入特征数量,实际上,你要做的就是设置某层权重矩阵
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

【我用的是n([l-1]),因为本例中,逻辑回归的特征是不变的。但一般情况下l层上的每个神经元都有n([l-1])个输入。】

对于其他**函数:
tanh:1:是√(1/n^([l-1]) ),被称为Xavier初始化。
2:Yoshua Bengio和他的同事还提出另一种方法,你可能在一些论文中看到过,它们使用的是公式√(2/(n([l-1])+n[l] ))。
Relu**函数,也就是最常用的**函数,这个公式np.sqrt(2/n^([l-1]) ),
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

Mini-batch 梯度下降

当训练巨量数据集时,我们要把训练样本放大巨大的矩阵X当中去,X=[x^((1) ) x^((2) ) x^((3) )……x^((m) ) ]。
Y也是如此,Y=[y^((1) ) y^((2) ) y^((3) )……y^((m) ) ]。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
所以X的维数是(n_x,m),Y的维数是(1,m),向量化能够让你相对较快地处理所有m个样本。
如果m很大的话,处理速度仍然缓慢。比如说,如果m是500万或5000万或者更大的一个数,在对整个训练集执行梯度下降法时,你要做的是,你必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理500万个训练样本,才能进行下一步梯度下降法。

改进:你可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本,那么把其中的x((1))到x((1000))取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从x((1001))到x((2000)),然后再取1000个样本,以此类推。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
实现过程:
1:x((1))到x((1000))称为X({1}),x((1001))到x((2000))称为X({2}),如果你的训练样本一共有500万个,每个mini-batch都有1000个样本,也就是说,你有5000个mini-batch,因为5000乘以1000就是5000万。

2:首先对输入也就是X({t}),执行前向传播,
z([1])=W([1]) X({t})+b([1]),
([1]k)=g([1]) (Z([1]))


A([L])=g1 (Z^([L]))

注意这里你需要用到一个向量化的执行命令,这个向量化的执行命令,一次性处理1000个而不是500万个样本。

接下来你要计算损失成本函数J,因为子集规模是1000,J=1/1000
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

你也会注意到,我们做的一切似曾相识,其实跟之前我们执行梯度下降法如出一辙,除了你现在的对象不是X,Y,而是X({t})和Y({t})。接下来,你执行反向传播来计算J({t})的梯度,你只是使用X({t})和Y^({t}),然后你更新加权值,
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

W实际上是W([l]),更新为W([l]):=W([l])-adW([l]),
对b做相同处理,b([l]):=b([l])-adb^([l])。

使用常规梯度下降法,一次遍历训练集只能让你做一个梯度下降
使用mini-batch梯度下降法,一次遍历训练集,能让你做5000个梯度下降。

当然正常来说你想要多次遍历训练集,还需要为另一个while循环设置另一个for循环。所以你可以一直处理遍历训练集,直到最后你能收敛到一个合适的精度。

如果你有一个丢失的训练集,mini-batch梯度下降法比batch梯度下降法运行地更快,

mini-batch梯度下降法的理解

使用batch梯度下降法:每次迭代你都需要历遍整个训练集,可以预期每次迭代成本都会下降,所以如果成本函数J是迭代次数的一个函数,它应该会随着每次迭代而减少,如果J在某次迭代中增加了,那肯定出了问题,也许你的学习率太大。

使用mini-batch梯度下降法:如果你作出成本函数在整个过程中的图,则并不是每次迭代都是下降的,特别是在每次迭代中,你要处理的是X({t})和Y({t}),如果要作出成本函数J({t})的图,而J({t})只和X({t}),Y({t})有关,也就是每次迭代下你都在训练不同的样本集或者说训练不同的mini-batch,如果你要作出成本函数J的图,你很可能会看到这样的结果,走向朝下,但有更多的噪声,

噪声产生的原因在于也许X({1})和Y({1})是比较容易计算的mini-batch,因此成本会低一些。不过也许出于偶然,X({2})和Y({2})是比较难运算的mini-batch,或许你需要一些残缺的样本,这样一来,成本会更高一些,所以才会出现这些摆动,因为你是在运行mini-batch梯度下降法作出成本函数图。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

特殊情况

如果mini-batch的大小等于m,其实就是batch梯度下降法,在这种极端情况下,你就有了mini-batch X({1})和Y({1}),并且该mini-batch等于整个训练集,所以把mini-batch大小设为m可以得到batch梯度下降法。
如果假设mini-batch大小为1,就有了新的算法,叫做随机梯度下降法

如果mini-batch的大小等于1,当你看第一个mini-batch,也就是X({1})和Y({1}),如果mini-batch大小为1,它就是你的第一个训练样本,这就是你的第一个训练样本。接着再看第二个mini-batch,也就是第二个训练样本,采取梯度下降步骤,然后是第三个训练样本,以此类推,一次只处理一个。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

两种极端下成本函数的优化情况

如果mini-batch的大小等于m:会朝着最低点,但是会波动

如果mini-batch的大小等于1:某一点开始,我们重新选取一个起始点,每次迭代,你只对一个样本进行梯度下降,大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此

两种极端下成本函数的优势

如果mini-batch的大小等于m:原因在于如果使用batch梯度下降法,mini-batch的大小为m,每个迭代需要处理大量训练样本,该算法的主要弊端在于特别是在训练样本数量巨大的时候,单次迭代耗时太长。如果训练样本不大,batch梯度下降法运行地很好。

如果mini-batch的大小等于1:相反,如果使用随机梯度下降法,如果你只要处理一个样本,那这个方法很好,这样做没有问题,通过减小学习率,噪声会被改善或有所减小,但随机梯度下降法的一大缺点是,你会失去所有向量化带给你的加速,因为一次性只处理了一个训练样本,这样效率过于低下,所以实践中最好选择不大不小的mini-batch尺寸,实际上学习率达到最快。

选择不大不小的mini-batch尺寸

一方面,你得到了大量向量化,上个笔记中我们用过的例子中,如果mini-batch大小为1000个样本,你就可以对1000个样本向量化,比你一次性处理多个样本快得多。

另一方面,你不需要等待整个训练集被处理完就可以开始进行后续工作,再用一下上个笔记的数字,每次训练集允许我们采取5000个梯度下降步骤,所以实际上一些位于中间的mini-batch大小效果最好。

指数加权平均数

统计一年的温度,看起来有些杂乱,如果要计算趋势的话,也就是温度的局部平均值,或者说移动平均值。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
首先使v_0=0,每天,需要使用0.9的加权数之前的数值加上当日温度的0.1倍,即v_1=0.9v_0+0.1θ_1,所以这里是第一天的温度值。
第二天,又可以获得一个加权平均数,0.9乘以之前的值加上当日的温度0.1倍,即v_2=0.9v_1+0.1θ_2,以此类推。
第二天值加上第三日数据的0.1,如此往下。大体公式就是某天的v等于前一天v值的0.9加上当日温度的0.1。

吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
我们来试试别的,将β设置为接近1的一个值,比如0.98,计算1/((1-0.98))=50,这就是粗略平均了一下,过去50天的温度,这时作图可以得到绿线。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
要注意几个点,你得到的曲线要平坦一些,原因在于你多平均了几天的温度,所以这个曲线,波动更小,更加平坦,缺点是曲线进一步右移,因为现在平均的温度值更多,要平均更多的值,指数加权平均公式在温度变化时,适应地更缓慢一些

我们可以再换一个值试一试,如果β是另一个极端值,比如说0.5,根据右边的公式(1/((1-β))),这是平均了两天的温度。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

所以指数加权平均数经常被使用,再说一次,它在统计学中被称为指数加权移动平均值,我们就简称为指数加权平均数。通过调整这个参数(β),或者说后面的算法学习,你会发现这是一个很重要的参数,可以取得稍微不同的效果,往往中间有某个值效果最好,β为中间值时得到的红色曲线,比起绿线和黄线更好地平均了温度。

指数加权平均数的理解

我们进一步地分析,来理解如何计算出每日温度的平均值。
同样的公式,v_t=βv_(t-1)+(1-β)θ_t

使β=0.9,写下相应的几个公式,所以在执行的时候,t从0到1到2到3,t的值在不断增加,为了更好地分析,我写的时候使得t的值不断减小,然后继续往下写。
将括号都展开,可以得到
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

我们分析v_100的组成,也就是在一年第100天计算的数据,但是这个是总和,包括100号数据,99号数据,97号数据等等。

稍后我们详细讲解,不过所有的这些系数(0.10.1×0.90.1×(0.9)^2 0.1×(0.9)^3…),相加起来为1或者逼近1,我们称之为偏差修正,下个笔记会涉及。

指数加权平均的偏差修正

吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
v_t=βv_(t-1)+(1-β)θ_t
在上一个笔记中,这个(红色)曲线对应β的值为0.9,这个(绿色)曲线对应的β=0.98,如果你执行写在这里的公式,在β等于0.98的时候,得到的并不是绿色曲线,而是紫色曲线,你可以注意到紫色曲线的起点较低,我们来看看怎么处理。

计算移动平均数的时候,初始化v_0=0,v_1=0.98 v_0+0.02 θ_1,
但是v_0=0,所以这部分没有了(0.98v_0),所以v_1=0.02θ_1,

所以如果一天温度是40华氏度,那么v_1=0.02θ_1=0.02×40=8《40,因此得到的值会小很多,所以第一天温度的估测不准。

v_2=0.98v_1+0.02θ_2,如果代入v_1,然后相乘,所以
v_2=0.98×0.02θ_1+0.02θ_2=0.0196θ_1+0.02θ_2,假设θ_1和θ_2都是正数,计算后v_2要远小于θ_1和θ_2,所以v_2不能很好估测出这一年前两天的温度。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法

有个办法可以修改这一估测,让估测变得更好,更准确,特别是在估测初期,也就是不用v_t,而是用v_t/(1-β^t ),t就是现在的天数。

举个具体例子,当t=2时,1-βt=1-〖0.98〗2=0.0396,因此对第二天温度的估测变成了v_2/0.0396=(0.0196θ_1+0.02θ_2)/0.0396,也就是θ_1和θ_2的加权平均数,并去除了偏差。

你会发现随着t增加,β^t接近于0,所以当t很大的时候,偏差修正几乎没有作用,因此当t较大的时候,紫线基本和绿线重合了。

在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人宁愿熬过初始时期,拿到具有偏差的估测,然后继续计算下去。如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能帮助你在早期获取更好的估测。

动量梯度下降法

正常情况下,我们利用DW,DB进行反向传播的优化,可以看到如图所示
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
你就无法使用更大的学习率,如果你要用较大的学习率(紫色箭头),结果可能会偏离函数的范围,为了避免摆动过大,你要用一个较小的学习率。

改进:在纵轴上,你希望学习慢一点,因为你不想要这些摆动,但是在横轴上,你希望加快学习,你希望快速从左向右移,移向最小值,移向红点。

使用动量梯度下降法,在每次计算DW,DB使用 指数加权平均

要做的是计算v_dW=βv_dW+(1-β)dW,这跟我们之前的计算相似,也就是v=βv+(1-β) θ_t,dW的移动平均数
接着同样地计算v_db,v_db=βv_db+(1-β)db,然后重新赋值权重,W:=W-av_dW,同样b:=b-av_db,这样就可以减缓梯度下降的幅度。
吴恩达神经网络 ——神经网络的权重初始化,Mini-batch 梯度下降,指数加权平均数,动量梯度下降法
DW,DB可以理解位加速度,但是因为反向不定,所以可能会导致偏差过大。
所以降低其DW,DB的比重,而增加项βVDW【是根据之前得出的】会延续之前的方向的加速度

你有一个碗,你拿一个球,微分项给了这个球一个加速度,此时球正向山下滚,球因为加速度越滚越快,而因为β 稍小于1,表现出一些摩擦力,所以球不会无限加速下去,所以不像梯度下降法,每一步都独立于之前的步骤,你的球可以向下滚,获得动量,可以从碗向下加速获得动量。我发现这个球从碗滚下的比喻,物理能力强的人接受得比较好,但不是所有人都能接受,如果球从碗中滚下这个比喻,你理解不了,别担心

所以你有两个超参数,学习率a以及参数β,β控制着指数加权平均数。
β最常用的值是0.9,我们之前平均了过去十天的温度,所以现在平均了前十次迭代的梯度。
实际上β为0.9时,效果不错,你可以尝试不同的值,可以做一些超参数的研究,不过0.9是很棒的鲁棒数(系统稳定性)。