#深度学习
参数的更新
1. SGD
神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化(optimization)。但是找到神经网络的最优化问题非常难,我们为了找到最优参数,沿梯度方向更新参数,并重复这个步骤多次,从而靠近最优参数,这个过程称为随机梯度下降法(stochastic gradient descent)简称SGD
SGD公式如下:
(1.1)
更新的权重参数记为W,把损失函数关于W的梯度记为 。表示学习率,实际上会取0.01或者0.001这些事先决定好的值。<——表示右边的值更新左边的值。如式1.1所示,SGD朝着梯度方向只前进一定距离的简单方法。
python代码如下:
class SGD:
def __init__(self, lr=0.01):
self.lr = lr
def updata(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]
SGD的缺点:
在解决某些问题时可能没有效率。
2. AdaGrad
论文地址:John Duchi, Elad Hazan, and Yoram Singer(2011):Adaptive Subgradient
Methods for Online Learning and Stochastic Optimization Journal of Machine Learning Research
12, Jul(2011), 2121-2159.
在神经网络学习中,学习率的值很重要。学习率过小,会导致学习花费时间过多;反过来,学习率越大,则会导致学习发散而不能正确进行。
在有关于学习率的有效技巧中,有一种被称为学习率衰减(learning rate decay)的方法,即随着学习的进行,使学习率逐渐减小。逐渐减小学习率的想法,相当于将“全体”参数的学习率的值一起降低。而AdaGrad进一步发展了这个想法,针对一个个的参数,赋予其定制的值。
公式为:
(1.2)
(1.3)
和1.1公式中一样,W表示权重,表示损失函数关于W的梯度, 表示学习率。这里新出现的h表示以前所有梯度值的平方和。
AdaGrad会记录过去所有的梯度平方和。因此,学习越深入,更新的幅度就越小。
实现代码:
import numpy as np
class AdaGrad:
def __init__(self, learning_rate=0.01):
self.learning_rate = learning_rate
self.eps = 1e-6
self.cache = None
def initialize(self, dim):
self.cache = np.zeros(dim)
def update(self, params, grads):
for key in params.keys():
# Update cache
self.cache += grads[key] * grads[key]
# Update parameters
params[key] -= self.learning_rate * grads[key] / (np.sqrt(self.cache) + self.eps)
# Example usage:
# Initialize parameters and gradients
params = {'W1': np.random.randn(3, 4),
'b1': np.random.randn(4),
'W2': np.random.randn(4, 1),
'b2': np.random.randn(1)}
grads = {'W1': np.random.randn(3, 4),
'b1': np.random.randn(4),
'W2': np.random.randn(4, 1),
'b2': np.random.randn(1)}
# Initialize AdaGrad
ada_grad = AdaGrad(learning_rate=0.01)
# Initialize cache
ada_grad.initialize(dim=4) # Assuming the size of the parameters is 4 for simplicity
# Perform parameter update
ada_grad.update(params, grads)
# After the update, params will be updated based on the AdaGrad algorithm.
3.Adam
Adam(Adaptive Moment Estimation)是一种用于深度学习中的优化算法,它结合了两种扩展的梯度下降算法——Momentum和RMSProp。Momentum算法通过考虑之前梯度的指数衰减平均值来加速学习,而RMSProp算法则通过梯度平方的指数衰减平均值来调整每个参数的学习率。Adam优化器将这两个概念结合起来,为每个参数计算一个自适应的学习率。
Adam算法的主要优点是它相对于其他SGD变种更加鲁棒,并且需要很少的调整。它在很多不同的深度学习问题中表现良好,并且已经成为许多深度学习框架中的默认优化器。
Adam算法的原始论文是由Diederik P. Kingma和Jimmy Ba在2014年发表的,标题为《Adam: A Method for Stochastic Optimization》。
在论文中,作者详细介绍了Adam算法的原理和实现,并通过实验验证了其在不同机器学习任务中的有效性。Adam算法通过计算梯度的一阶矩估计(即均值)和二阶矩估计(即未中心化的方差)来调整每个参数的学习率。具体来说,Adam算法为每个参数维护两个向量,分别是:
- 第一时刻估计(m_t):这是梯度的一阶矩估计,它是对过去梯度的指数衰减平均值。
- 第二时刻估计(v_t):这是梯度的二阶矩估计,它是对过去梯度平方的指数衰减平均值。
然后,这两个估计值被用来计算参数的更新:
- 一阶矩的偏差校正(m_t^):这是对m_t的偏差校正,使其更加稳定。
- 二阶矩的偏差校正(v_t^):这是对v_t的偏差校正,使其更加稳定。
最后,使用这些校正后的值来更新每个参数:
- 参数更新(θ_t):这是根据m_t^和v_t^计算出的参数更新值。
Adam算法由于其简单性和有效性,在深度学习社区中得到了广泛的应用。然而,也有一些研究指出,在某些情况下,Adam可能不会收敛到最优解,因此在实际应用中可能需要根据具体问题调整学习率或选择其他优化器。
4.如何选择更新方法
根据使用的方法不同,参数更新的路径也不同,如下图所示的话,AdaGrad似乎是最好的,不过也要注意,结果会根据要解决的问题而变。目前很多研究中仍在使用SGD,最近很多研究员和学者都喜欢用Adam。
本期结束,下期再见哦!
参考文献:Deep Learning from Scratch