ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

深度学习17:深度神经网络:测试参数优化器效果

深度学习17:深度神经网络:测试参数优化器效果

目录标题

      • 一、测试代码及效果
      • 二、总结

一、测试代码及效果

需要的引入代码在
深度学习15:深度神经网络:存在的问题和参数优化(Momentum和学习衰减率)
深度学习16:深度神经网络:参数优化(AdaGrad,RMSProp,Adam)

importnumpyasnpimportmatplotlib.pyplotaspltfromcollectionsimportOrderedDict# 有序字典fromblog:深度学习15:深度神经网络:存在的问题和参数优化(Momentum和学习衰减率)importSGD,Momentumfromblog:深度学习16:深度神经网络:参数优化(AdaGrad,RMSProp,Adam)importAdaGrad,Adam# 定义目标函数: f(x, y) = 1/20 x^2 + y^2deff(x,y):returnx**2/20+y**2# 定义梯度计算方法,得到一个长度为2的向量deff_grad(x,y):returnx/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# 子图序号# 遍历优化器,用优化器更新参数求解最小值点forkeyinoptimizers:optimizer=optimizers[key]# 记录参数点更新的历史x_history=[]y_history=[]# 参数初始化params['x'],params['y']=init_pos[0],init_pos[1]# 指定迭代 30 次foriinrange(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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进