线性回归模型
参考链接: PyTorch: 梯度下降及反向传播.
以一个最简单的线性回归模型为例:
损失函数
在模型训练中,损失函数用来衡量预测值与真实值之间的误差,数值越小表示误差越小。一个常见的选择是平方函数。 它在评估索引为 i 的样本误差的表达式为
可能有人想问这里为什么要除以1/2,其实有没有1/2对于损失函数来说效果是一样的,加上1/2是为了求导方便(把平方求导的系数变成1)。
批量样本的损失函数是单个样本损失函数的均值。假设批量大小为 n,则:
权重w的大小直接影响损失函数值的大小。假设准确的回归模型为
则权重w越接近2损失函数越小,当w=2时损失函数值为0。二者关系如下图。
那么在实际情况中,如何选取合适的w呢?一般来说,我们都是随机初始化w的值,然后根据loss函数对w求梯度。通过不断减小梯度的值,最终达到损失函数最小化,这就是梯度下降法的思想。
梯度下降法
梯度下降法在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,它通过不断迭代更新w的参数,从而使损失函数最小化。梯度更新公式如下:
这里的η是学习率,表示每次优化中能够学习的步长大小。
反向传播
在pytorch框架中,反向传播是利用backward方法实现的。官网上对于这个方法的解释比较晦涩难懂,这里我们举例说明一下反向传播的过程。
通俗来说,前向传播和反向传播就是正推和逆推。
前向传播求损失函数
依然是y=w*x+b,假设 x=1,w=1,y=2(实际值),b=0,则
反向传播更新梯度
假设学习率η=0.03,则由上文梯度更新公式可得,权重w=1-0.03*(-2)=1.006,一次迭代结束。
可以推测,在后续的梯度下降过程中,w会不断接近准确的权重值2,适当增加学习率可以加快这一过程。
在pytorch中,反向传播的过程用loss.backward()方法完成。该函数可以自动计算反向传播阶段的各个梯度。w的梯度用w.grad.data获取。则梯度更新的代码为:
就这样。