SGD中有两个概念,第一个是步长
l
r
(
l
e
a
r
n
i
n
g
r
a
t
e
)
lr(learning\ rate)
lr(learningrate)第二个是梯度
(
g
r
a
d
i
e
n
t
)
(gradient)
(gradient)一个决定试探的长度,一个指导试探的方向。 所以SGD的数学表达式便是:
W
←
W
−
η
∂
L
∂
W
W\leftarrow W-\eta\frac{\partial L}{\partial W}
W←W−η∂W∂L 在梯度和步长的共同作用下,当前的
W
W
W会逐渐的逼近期望值。
3.SGD的实现
classSGD:def__init__(self, lr=0.01):
self.lr = lr
defupdate(self, params, grads):for key in params.keys():
params[key]-= self.lr * grads[key]
4.SGD的缺陷
在上一章节中,我们使用SGD在
f
(
x
0
,
x
1
)
=
x
0
2
+
x
1
2
f(x_0,x_1)=x_0^2+x_1^2
f(x0,x1)=x02+x12中进行梯度下降,似乎表现良好,那是因为
f
(
x
0
,
x
1
)
=
x
0
2
+
x
1
2
f(x_0,x_1)=x_0^2+x_1^2
f(x0,x1)=x02+x12是均向的,而什么是均向呢?我们来看
f
(
x
0
,
x
1
)
=
x
0
2
+
x
1
2
f(x_0,x_1)=x_0^2+x_1^2
f(x0,x1)=x02+x12的梯度图:
所有的梯度不仅指向下降的方向,同时指向最低处,那这种图像我们便称之为均向的。可能有些同学很费解,指向下降的方向不就是指向最低处?那非均向的图像是什么样的呢?我们对
f
(
x
0
,
x
1
)
=
x
0
2
+
x
1
2
f(x_0,x_1)=x_0^2+x_1^2
f(x0,x1)=x02+x12进行一个简单的修改可得到:
f
(
x
0
,
x
1
)
=
x
0
2
20
+
x
1
2
f(x_0,x_1)=\frac{x_0^2}{20}+x_1^2
f(x0,x1)=20x02+x12 那他的图像可以相应的画出:
那他的梯度图也可以相应的画出:
这里我们就能很形象的发现,两边的梯度虽然也在下降但他并不是指向最低的位置,但这个函数其实是有最小值的,那就是
f
(
x
0
,
x
1
)
m
i
n
=
f
(
0
,
0
)
=
0
f(x_0,x_1)_{min}=f(0,0)=0
f(x0,x1)min=f(0,0)=0。那么他的移动轨迹会是什么样呢?因为这个函数是没有其他极值点的,所以用SGD是一定能得走到最低处的,我们可以用python来进行简单的描绘他的运行轨迹。
M
o
m
e
n
t
u
m
Momentum
Momentum本身的意思是“动量”,其实是一个物理种的概念,描述的是物体运动趋势的变化,其实也很形象的能比喻我们在寻找最低点的过程中来回折返的一个过程。动量是存在于万物之间的,有运动就有动量,他是平滑变化的,但SGD的折返是僵硬的,也可以简单的说是直线的,我们希望能引入自然界的动量来让我们的折返变的更加平滑,从而达到优化的过程。
2.Momentum的数学原理
M
o
m
e
n
t
u
m
Momentum
Momentum指的是运动物体的作用效果,表示为物体的质量和速度的乘积,所以我们需要引入新的变量——
v
、
α
v、\alpha
v、α。于是动量在我们的梯度下降中,用数学的描述方法便为:
v
←
α
v
−
η
∂
L
∂
W
v\leftarrow \alpha v-\eta\frac{\partial L}{\partial W}
v←αv−η∂W∂L
W
←
W
+
v
W\leftarrow W+v
W←W+v
3.Momentum的实现
classMomentum:def__init__(self, lr=0.01, momentum=0.9):
self.lr = lr
self.momentum = momentum
self.v =Nonedefupdate(self, params, grads):if self.v isNone:
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]
4.Momentum的优势
这个新变量
v
v
v的意义表示了物体在这个梯度方向上受的力,在这个力的作用下,物体表现出相应的速度,并更新相应的梯度,这个梯度的更新路径就像小球在光滑的碗底滚动一样,和SGD相比,“之”字形的程度大大的降低了。这是因为
x
x
x轴方向的力小,但一直是同一个方向的力,所以会有一定的加速,但
y
y
y方向是在谷底两侧反复变化的,两个方向的力相互抵消,但又不均匀,速度就会变缓,那么“之”字的幅度就会变小,拐角就会变圆。 让我们来看看Momentum的实际效果:
和SGD的对比之下确实达到了我们需要的效果。
四、AdaGrad优化方法
1.AdaGrad是什么
在前面的几种方法里,我们做的优化都是争对
W
W
W的,那我们还有什么能值得优化的方向吗?想一下我们最基础的模型里还有哪个参数?那就是我们的 学习率
η
\eta
η。所以AdaGrad就是一种针对
η
\eta
η的优化方法。 在有关学习率的优化中,其中一种就是学习率衰减
(
l
e
a
r
n
i
n
g
r
a
t
e
d
e
c
a
y
)
(learning\ rate\ decay)
(learningratedecay)。他的思路是一开始训练的时候因为离“山谷”较远,所以迈的步子可以大一点,扩张点说,可以适当的跑一下,而不用担心过头。但随着向山谷的前进后,离山谷越来越近,那步子就要越来越小,谨防越过山谷了。
2.AdaGrad的数学原理
AdaGrad会为每一个权重
W
W
W适当的调整学习率,而调整的依据就是我们离山谷还有多远,当然由于我们目前不知道准确的山谷位置,所以我们猜测离山谷的距离肯定不能用
当
前
位
置
−
谷
底
{ 当前位置}-谷底
当前位置−谷底 所以我们只能记住以前走过的距离,假设我们是正确的向着谷底走的,那我们走的距离和越大,那就离谷底越近。 这就需要我们又引入一个新的变量
h
h
h来登记我们走过的路程。于是AdaGrad的数学表述为:
h
←
h
+
∂
L
∂
W
⊙
∂
L
∂
W
h\leftarrow h+\frac{\partial L}{\partial W}\odot \frac{\partial L}{\partial W}
h←h+∂W∂L⊙∂W∂L
W
←
W
−
η
1
h
+
1
0
−
7
∂
L
∂
W
W\leftarrow W-\eta\frac1{\sqrt h+10^{-7}}\frac{\partial L}{\partial W}
W←W−ηh+10−71∂W∂L
h
h
h中保留了以往全部权重的一个平方和,在更新权重时,步伐大小取决于学习率
η
\eta
η和
1
h
\frac1{\sqrt h}
h1。这就意味着在权重的更新中,变动大的权重就会有较大的
h
h
h而较大的
h
h
h就会使
η
1
h
∂
L
∂
W
\eta\frac1{\sqrt h}\frac{\partial L}{\partial W}
ηh1∂W∂L变小,也就相当于减小了学习率。
3.AdaGrad的实现
classAdaGrad:def__init__(self, lr=0.01):
self.lr = lr
self.h =Nonedefupdate(self, params, grads):if self.h isNone:
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)
4.AdaGrad的优势
让我们来看一下我们的AdaGrad的实际效果:
由图可知,函数的取值高效的向着最小值移动。由于
y
y
y轴方向上的梯度较大,因此第一次的梯度变动较大,但他很快就收到了来自
h
h
h的制约,接下来在
y
y
y上的变动越来越小。
因为我们已经在上面详细的介绍了AdaGrad和Momentum,所以这里就不再赘述直接描述Adam的数学表达形式:
i
t
e
r
=
i
t
e
r
+
1
,
l
r
t
=
l
r
t
∗
1
−
β
2
i
t
e
r
1
−
β
1
i
t
e
r
iter=iter+1,lr_t = lr_t*\frac{\sqrt {1-\beta_2^{iter}}}{1-\beta_1^{iter}}
iter=iter+1,lrt=lrt∗1−β1iter1−β2iter
m
=
m
+
(
1
−
β
1
)
∗
(
∂
L
∂
W
−
m
)
m = m+(1-\beta_1)*(\frac{\partial L}{\partial W}-m)
m=m+(1−β1)∗(∂W∂L−m)
v
=
v
+
(
1
−
β
2
)
∗
(
∂
L
∂
W
⊙
∂
L
∂
W
−
v
)
v = v+(1-\beta_2)*(\frac{\partial L}{\partial W}\odot\frac{\partial L}{\partial W}-v)
v=v+(1−β2)∗(∂W∂L⊙∂W∂L−v)
W
←
W
−
l
r
t
m
v
+
1
0
−
7
W\leftarrow W-lr_t\frac{m}{\sqrt v+10^{-7}}\
W←W−lrtv+10−7m
{
β
2
=
0.999
β
1
=
0.9
\bigg\{^{\beta_1=0.9}_{\beta_2=0.999}
{β2=0.999β1=0.9