for i in range(epchos):
copmute dw,db
update w=w-αdw,b=b-αdb
如上,是普通梯度下降所需,每次需要计算所有样本
对于SGD,每次取一个样本,计算梯度,更新,代码如下
for i in range(epchos):
for j in num_examples:
compute dw db
update w,b = w,b-α(w,b)
对一个样本计算梯度,很可能不是全局最优的,因此在收敛过程中多次振荡,但是优点之一是有可能在跳跃过程中找到更好的局部最优点,甚至是全局最优点。
Mini_batch GD:顾名思义,每次更新,选择的既不是一整个训练集,也不是一个样本,而是一个训练集的子集,一个小小的batch,然后每次进行更新计算这一个batch中的梯度。
for i in range (epchos):
for j in range(num_batch):
#每一个batch的size是一个超参数,自己设定,介于1到样本总数N之间,若batch_size去1则为SGD,取N则为批量梯度下降
compute dw,db
update dw,db
比较:mini_batch更为稳定和方便,相比sgd,减少了波动性。相比于批量梯度下降,提高了更新速度,并且不用担心内存瓶颈,从而更加高效。
对于学习率的优化方法:
动量 momentum:
顾名思义,给学习率一个动量,使其在收敛过程中更快
for i in iteration t:
compute dw,db on mini_batch
Vdw = βVdw+(1-β)dw
w = w - αVdw
#同理可得db
实际上,队友这种指数加权平均,计算的是前1/(1-β) 次的指数平均
因为梯度积累了之前多次的梯度,所以之前的变化会影响现在的变化,加入之前是一直下降,那么加快下降,之前下降方向相反的话,那么会减慢梯度传递
均方根传递RMSprop:
for i in range(iteration t):
compute dw,db on current min_batch
Sdw = βSdw+(1-β)dW²
W = W - α*dW/√Sdw
#同理得db
在震荡大的方向会得到更大的Sdw或者Sdb,因此除以的数更大,抑制了震荡。
Adam:
adam是对动量和均方根传递的结合
for i in range(iteration t):
compute dw,db on current min_batch
Vdw = β1Vdw+(1-β1)dw
Sdw = βSdw+(1-β2)dw²
#对 S,V进行修正,因为在β接近1的时候,他们趋向于0向量。
Vdw# = Vdw/(1-β1的t次方)
Sdw# = Sdw/(1-β2的t次方)
W = W - α*Vdw#/√Sdw#
#同理得db