目录标题
一、测试代码及效果
需要的引入代码在
深度学习15:深度神经网络:存在的问题和参数优化(Momentum和学习衰减率)
深度学习16:深度神经网络:参数优化(AdaGrad,RMSProp,Adam)
python
import numpy as np
import matplotlib.pyplot as plt
from collections import OrderedDict # 有序字典
from blog:深度学习15:深度神经网络:存在的问题和参数优化(Momentum和学习衰减率) import SGD,Momentum
from blog:深度学习16:深度神经网络:参数优化(AdaGrad,RMSProp,Adam) import AdaGrad,Adam
# 定义目标函数: f(x, y) = 1/20 x^2 + y^2
def f(x, y):
return x ** 2 / 20 + y ** 2
# 定义梯度计算方法,得到一个长度为2的向量
def f_grad(x, y):
return x / 10, 2 * y
# 定义初始点位置
init_pos = (-7.0, 2.0)
# 定义参数和梯度
params = {}
grads = {}
# 定义优化器,指定学习率
optimizers = OrderedDict()
optimizers['SGD'] = SGD(lr=0.1)
optimizers['Momentum'] = Momentum(lr=0.1)
optimizers['AdaGrad'] = AdaGrad(lr=0.1)
optimizers['Adam'] = Adam(lr=0.1)
idx = 1 # 子图序号
# 遍历优化器,用优化器更新参数求解最小值点
for key in optimizers:
optimizer = optimizers[key]
# 记录参数点更新的历史
x_history = []
y_history = []
# 参数初始化
params['x'], params['y'] = init_pos[0], init_pos[1]
# 指定迭代 30 次
for i in range(30):
# 先保存当前点坐标
x_history.append(params['x'])
y_history.append(params['y'])
# 1. 计算梯度
grads['x'], grads['y'] = f_grad(params['x'], params['y'])
# 2. 更新参数
optimizer.update(params, grads)
# 画图
x = np.arange(-10, 10, 0.01)
y = np.arange(-5, 5, 0.01)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
Z[Z > 7] = 0 # Z高度大于7的部分不画
# 定义子图
plt.subplot(2, 2, idx)
idx += 1
# 绘制等高线
plt.contour(X, Y, Z)
# 单独画出最小值点
plt.plot(0, 0, '+')
# 画出点轨迹曲线
plt.plot(x_history, y_history, 'o-', color='red', markersize=2, label=key)
plt.xlim(-10, 10)
plt.ylim(-5, 5)
plt.legend(loc='best')
plt.show()
学习率小(0.1),循环次数少(30次),导致大部分参数优化器都没到最优参数点,但是Momentum都冲过了


学习率小(0.1),循环次数多点(50次),导致大部分参数优化器都没到最优参数点,但是Momentum都冲过了,发现冲过了,在最优参数点来回震荡

学习率变大为(1),循环次数多点(50次),学习率大,AdaGrad表现最好,SGD都来回震荡无法收敛了,momentum和Adam可以收敛。可见Adam是momentum和AdaGrad融合技

下面参数(目前为止只是修改循环次数和学习率大小,但是每个参数优化器还有别的参数可以配置), 问题:Adam没到(要不加循环次数,要不加学习率),Adam 训练过了(让冲的小点),momentum冲还是过了(让冲的小点)
学习率 SDG 为0.9
学习率 Momentum 为0.08
学习率 AdaGrad 为1
学习率 Adam 为0.5
循环次数(30次)

利用别的参数解决问题:
让momentum 动量系数衰减,Adam加大学习率,Adam也减小冲量


二、总结
nothing