梯度下降算法推导
假设有一个序列xn, 对应目标是yn, 通过模型预测得到的结果是, 则MSE损失函数有
优化问题变成求min(loss)
对于求min(loss), 本质是要梯度的负方向,所以更新梯度的问题变成
其中,a是学习率。
python的实现代码:
w = 1.0
def forward(x):
return x*w
# 定义MSE损失函数
def cost(xs, ys):
cost = 0
for x,y in zip(xs, ys):
y_pred = forward(x)
cost += (y_pred - y) **2
return cost / len(xs)
# 定义梯度下降算法
def gradient(xs, ys):
grad = 0
for x, y in zip(xs, ys):
grad += 2*x*(x*w -y)
return grad / len(xs)
随机梯度下降
当很长的时候,计算整个梯度需要耗时比较多,所以从N个cost中随机选择一个cost作为整体的优化,这也是随机梯度的由来。
梯度算法和随机梯度算法的比较:
- 梯度算法并行度好,时间短,但可能出现不收敛问题
- 随机梯度算法的下一个梯度,会以来上一个梯度,串行执行,但是收敛性好;
- 折中:NN中一般采用batch方式。
梯度反向传播算法
举例一个2 layer的网络
链式求导法则:
链式求导计算图: