1 梯度下降 Gradient Descent
梯度下降 沿着导数的负方向更新参数。 批量梯度下降法(Batch Gradient Descent):在更新参数时使用所有的样本来进行更新。 随机梯度下降法(Stochastic Gradient Descent):每次仅仅随机选取一个样本j来求梯度。 小批量梯度下降法(Mini-batch Gradient Descent):小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷。
2 带momentum梯度下降
考虑上一次的权重和偏差,并取一个固定数值0.8作为上一次的权重影响。
plt_x = []
plt_y = []
for epoch in range(1500):
i = np.random.randint(N)
gradient_w, gradient_b = get_gradient(x[i], y[i])
momentum_w = 0.8 * momentum_w + gradient_w
momentum_b = 0.8 * momentum_b + gradient_b
w -= momentum_w * 1e-3
b -= momentum_b * 1e-3
plt_x.append(epoch)
plt_y.append(total_loss())
if epoch % 150 == 0:
print(epoch, momentum_w, momentum_b, total_loss())
3 ada_grad
(1)AdaGrad是一种优化方法,它可以为不同的变量提供不同的学习率。需要多一个参数; (2)每epoch的学习率 = 1 / 累计权重平方和的开方 。 1可以是别的数值。 (3)在adagrad中lr是单调递减的。因为累加权重会越来越大,分母是越来越大的。
plt_x = []
plt_y = []
for epoch in range(2500):
i = np.random.randint(N)
gradient_w, gradient_b = get_gradient(x[i], y[i])
S_w = S_w + gradient_w**2
S_b = S_b + gradient_b**2
lr_w = 1e-1 / ((S_w + 1e-6)**0.5)
lr_b = 1e-1 / ((S_b + 1e-6)**0.5)
w -= gradient_w * lr_w
b -= gradient_b * lr_b
plt_x.append(epoch)
plt_y.append(total_loss())
if epoch % 150 == 0:
print(epoch, lr_w, lr_b, total_loss())
4 RMS Prop
(1)和adagrad唯一的区别,就是多了两个系数,也就是0.2和0.8。rmsprop中lr可能上升。
plt_x = []
plt_y = []
for epoch in range(2500):
i = np.random.randint(N)
gradient_w, gradient_b = get_gradient(x[i], y[i])
S_w = 0.2 * S_w + 0.8 * gradient_w**2
S_b = 0.2 * S_b + 0.8 * gradient_b**2
lr_w = 1e-2 / ((S_w + 1e-6)**0.5)
lr_b = 1e-2 / ((S_b + 1e-6)**0.5)
w -= gradient_w * lr_w
b -= gradient_b * lr_b
plt_x.append(epoch)
plt_y.append(total_loss())
if epoch % 150 == 0:
print(epoch, lr_w, lr_b, total_loss())
5 Ada delta
()和rmsprop的学习率计算方式不同;
plt_x = []
plt_y = []
for epoch in range(5500):
i = np.random.randint(N)
gradient_w, gradient_b = get_gradient(x[i], y[i])
S_w = 0.2 * S_w + 0.8 * gradient_w**2
S_b = 0.2 * S_b + 0.8 * gradient_b**2
lr = (delta_w + 1e-6) / (S_w + 1e-6)
gradient_w = lr**0.5 * gradient_w
lr = (delta_b + 1e-6) / (S_b + 1e-6)
gradient_b = lr**0.5 * gradient_b
w -= gradient_w
b -= gradient_b
delta_w = 0.2 * delta_w + 0.8 * gradient_w**2
delta_b = 0.2 * delta_b + 0.8 * gradient_b**2
plt_x.append(epoch)
plt_y.append(total_loss())
if epoch % 500 == 0:
print(epoch, delta_w[:2], delta_b, total_loss())
6 Adam
plt_x = []
plt_y = []
for t in range(1, 5500):
i = np.random.randint(N)
gradient_w, gradient_b = get_gradient(x[i], y[i])
v_w = 0.9 * v_w + 0.1 * gradient_w
v_b = 0.9 * v_b + 0.1 * gradient_b
S_w = 0.999 * S_w + 0.001 * gradient_w**2
S_b = 0.999 * S_b + 0.001 * gradient_b**2
v_hat_w = v_w / (1 - 0.9**t)
v_hat_b = v_b / (1 - 0.9**t)
S_hat_w = S_w / (1 - 0.999**t)
S_hat_b = S_b / (1 - 0.999**t)
gradient_w = (1e-2 * v_hat_w) / (S_hat_w**0.5 + 1e-6)
gradient_b = (1e-2 * v_hat_b) / (S_hat_b**0.5 + 1e-6)
w -= gradient_w
b -= gradient_b
plt_x.append(t)
plt_y.append(total_loss())
if t % 500 == 0:
print(t, v_hat_w[:2], S_hat_w[:2], total_loss())
参考: 代码:https://github.com/lansinuote/Optimization_In_Numpy/blob/master/1.%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D.ipynb 视频:https://www.bilibili.com/video/BV1M64y187qX?spm_id_from=333.999.0.0 博客:https://www.cnblogs.com/pinard/p/5970503.html
|