【优化算法】Nesterov算法
首先Nesterov动量优化算法是Momentum优化算法的一种改进。比较这两个算法的算法步骤,基本都一样,差别就在于应用临时更新这一句即先用当前的速度v先更新一遍参数,这样做后,Nesterrov算法比Momentum算法更新更快,因为在每一次更新的时候都是基于当前速度和梯度的更新,那我在求梯度之前就先进行一次对于当前速度的更新,就会加快收敛速度。# coding=utf-8"""基于小批量梯度
·
首先Nesterov动量优化算法是Momentum优化算法的一种改进。
比较这两个算法的算法步骤,基本都一样,差别就在于应用临时更新这一句即先用当前的速度v先更新一遍参数,这样做后,Nesterrov算法比Momentum算法更新更快,因为在每一次更新的时候都是基于当前速度和梯度的更新,那我在求梯度之前就先进行一次对于当前速度的更新,就会加快收敛速度。
# coding=utf-8
"""
基于小批量梯度下降来实现的Nesterov
参考:https://blog.csdn.net/bvl10101111/article/details/72615961
相比于上一篇的Momentum,不一样的地方是应用了临时更新
@author: Reynold
@date: 2018-08-21
"""
import numpy as np
import random
# 构造训练数据
x = np.arange(0., 10., 0.2)
m = len(x)
x0 = np.full(m, 1.0)
input_data = np.vstack([x0, x]).T # 将偏置b作为权向量的第一个分量
target_data = 3 * x + 8 + np.random.randn(m)
# 两种终止条件
max_iter = 10000
epsilon = 1e-5
# 初始化权值
np.random.seed(0)
w = np.random.randn(2)
v = np.zeros(2) # 更新的速度参数
alpha = 0.001 # 步长
diff = 0.
error = np.zeros(2)
count = 0 # 循环次数
eps = 0.9 # 衰减力度,可以用来调节,该值越大那么之前的梯度对现在方向的影响也越大
while count < max_iter:
count += 1
sum_m = np.zeros(2)
index = random.sample(range(m), int(np.ceil(m * 0.2)))
sample_data = input_data[index]
sample_target = target_data[index]
# 应用临时更新,先更新一下参数w的值
tmp_w = w + eps * v
for i in range(len(sample_data)):
dif = (np.dot(tmp_w, input_data[i]) - target_data[i]) * input_data[i]
sum_m = sum_m + dif
v = eps * v - alpha * sum_m # 在这里进行速度更新
w = w + v # 使用动量来更新参数
if np.linalg.norm(w - error) < epsilon:
break
else:
error = w
print ('loop count = %d' % count, '\tw:[%f, %f]' % (w[0], w[1]))
点击阅读全文
更多推荐
活动日历
查看更多
直播时间 2025-02-26 16:00:00


直播时间 2025-01-08 16:30:00


直播时间 2024-12-11 16:30:00


直播时间 2024-11-27 16:30:00


直播时间 2024-11-21 16:30:00


所有评论(0)