合集请查看:深度学习入门合集
参考书籍:深度学习入门 基于Python的理论与实现 作者:斋藤康毅
参数的更新
SGD
![[SGD]]
class SGD:
def __init__(self, lr=0.01):
self.lr = lr
def update(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]
进行初始化时的参数lr表示learning rate(学习率)
Momentum
![[Momentum]]
class Momentum:
def __init__(self, lr=0.01, momentum=0.9):
self.lr = lr
self.momentum = momentum
self.v = None
def update(self, params, grads):
if self.v is None:
self.v = {}
for key, val in params.items():
self.v[key] = np.zeros_like(val)
for key in params.keys():
self.v[key] = self.momentum*self.v[key] - self.lr*grads[key]
params[key] += self.v[key]
AdaGrad
在关于学习率的有效技巧中,有一种被称为学习率衰减(learning ratedecay)的方法,即随着学习的进行,使学习率逐渐减小。实际上,一开始“多”学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。
逐渐减小学习率的想法,相当于将“全体”参数的学习率值一起降低。而AdaGrad进一步发展了这个想法,针对“一个一个”的参数,赋予其“定制”的值
![[AdaGrad]]
class AdaGrad:
def __init__(self, lr=0.01):
self.lr = lr
self.h = None
def update(self, params, grads):
if self.h is None:
self.h = {}
for key, val in params.items():
self.h[key] = np.zeros_like(val)
for key in params.keys():
self.h[key] += grads[key] * grads[key]
params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)
这里需要注意的是,最后一行加上了微小值1e-7。这是为了防止当self.h[key]中有0时,将0用作除数的情况。在很多深度学习的框架中,这个微小值也可以设定为参数,但这里我们用的是1e-7这个固定值。
Adam
[[Momentum]]参照小球在碗中滚动的物理规则进行移动,[[AdaGrad]]为参数的每个元素适当地调整更新步伐。如果将这两个方法融合在一起会怎么样呢?这就是Adam方法的基本思路 。
![[Adam]]
summary
权重的初始值
初始值设置不恰当,会产生权重均一化、梯度消失、表现力受限等问题
我们尝试使用
![[Xavier初始值]]
ReLU的权重初始值
当激活函数使用ReLU时,一般推荐使用ReLU专用的初始值,也就是Kaiming He等人推荐的初始值,也称为
![[He初始值]]
summary
当激活函数使用ReLU时,权重初始值使用He初始值,当激活函数为sigmoid或tanh等S型曲线函数时,初始值使用Xavier初始值。这是目前的最佳实践。
Batch Normalization
![[Batch Normalization]]
正则化
机器学习的问题中,[[过拟合]]是一个很常见的问题。
权值衰减
[[权值衰减]]是一直以来经常被使用的一种抑制过拟合的方法。
若为损失函数加上权重的平方范数([[L2范数]])。这样一来,就可以抑制权重变大。
用符号表示的话,如果将权重记为W,L2范数的权值衰减就是$\frac{1}{2}\lambda W^2$,然后将这个$\frac{1}{2}\lambda W^2$加到损失函数上。这里,λ是控制正则化强度的超参数。λ设置得越大,对大的权重施加的惩罚就越重。此外,$\frac{1}{2}\lambda W^2$开头的$\frac{1}{2}$是用于将的求导结果变成λW的调整用常量。
对于所有权重,权值衰减方法都会为损失函数加上$\frac{1}{2}\lambda W^2$。因此,在求权重梯度的计算中,要为之前的误差反向传播法的结果加上正则化项的导数λW。
Dropout
如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情况下,我们经常会使用[[Dropout]]方法。
超参数的验证
![[超参数]]
验证数据
调整超参数时,必须使用超参数专用的确认数据。用于调整超参数的数据,一般称为验证数据(validation data)。
注意:不能使用测试数据去评估超参数的性能,容易发生过拟合
超参数的最优化
步骤0中所谓“范围”,是指像0.001($10^{-3}$ )到1000($10^3$ )这样,以“10的阶乘”的尺度指定范围(也表述为“用对数尺度(log scale)指定”)。