sgd与momentum都是常见的梯度优化方法。本文想从代码方面对这两种方法进行总结。
关于理论。建议参考:
https://www.cnblogs.com/jungel24/p/5682612.html
这篇博文写的很好。很形象。本文也是建立在它的基础上写的,同时代码参考:
https://github.com/hsmyy/zhihuzhuanlan
?。交代完毕,开始学习之旅。
之前在学习无论是ML,DL的时候,总是理论优先,很多都是知道是那么回事,但是从没想过如何用代码实现。随着学习的深入,越来越觉得越是基础的东西,越要注意。所以这篇博客就是我的一个学习方法的改进,本文会在上面代码的基础上代码总结。
我写的和原链接不同。手法方面没有那么好看,但是更容易理解,特别是momentum部分,很不一样,很适合初学者,因为没有太多的包装。也是因为我没有养成好的coding习惯导致的。。。但是正确性是可以保证的,我都亲自运行过。
1.gd
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5,7,500)
y = (x-1)**2
#g(x)为导数
def g(x):
return 2*x-2
plt.plot(x,y)
def gradient_descent(x0,step,epoch):
x = x0
for i in range(epoch):
print('epoch:{},x= {},gradient={}'.format(i,x,g(x)))
x-=step*g(x)
if abs(g(x))<=1e-6:#注意这里别忘了取绝对值了,我一开始就忘了。
return x
return x
主体构建完毕。接下来:
gradient_descent(4,0.1,20)
初始点选为4,学习率为。0.1,迭代20次:
可以看到,最后已经十分接近于解析解1了,同时梯度也很接近于0.很棒。
倘若我们把学习率加大呢?
gradient_descent(4,5,20)
可以看到是越来越偏的。
2.momentum
为了更好的看出来sgd的问题所在,与momentum的强大之处:我们这次采用二元函数:
z=x**2 + 50*y**2
。我们现在就可以假设loss function为上面的函数,x,y则为自变量,想用梯度下降法找到最优解。显然这个函数在(0,0)处有最优解,那么来看看梯度下降如何处理:
先来看看图象长什么样:
import numpy as np
import pylab as plt
f(x)就是上面的函数,
def