一、引入
首先我们看一下一个线性拟合的例子:
如图所示,x经过一个线性方程得到y,其中y=wx+b,我们用最小二乘法作为优化的损失函数 。其中,y_gt为基准数值(真实值)。
我们做如下假设:
x:1.5 w:0.8 b:0.2 y_gt:0.8 可以计算得到y=1.4,L=0.18
如何优化w和b这两个参数?
使用梯度下降算法:
在对w,b求偏导可以通过y这个中间量,利用链式法则进行从后向前的求导。
假设学习率为ε=0.1,经计算可得此时的w=0.71,b=0.14,y=1.205,L=0.082。y更加靠近真实值y_gt:0.8。
这种从后向前计算参数梯度的方法:反向传播算法。
二、多个线性变换
如图所示经过y1,y2两个线性变换的过程,这是一个正向传播的过程。
为了得到w1,b1,w2,b2四个参数的梯度值,我们可以从后向前依次计算出损失函数。
反向传播算法就是神经网络中加速计算参数梯度值的方法。
思考计算机中真实的计算过程:是一个模块化的过程。
三、计算图
计算机中的计算图如下图所示:
四、乘法模块实现
在深度学习框架中,计算图中的元素的定义和使用是很便捷的。比如乘法运算:
class Multiply(torch.autograd.Function):
@staticmethod
def forward(ctx,x,y):
ctx.save_for_backward(x,y)
z=x*y
return z
@staticmethod
def forward(ctx,grad_z):
x,y=ctx.saved_tensors
grad_x=grad_z*y
grad_y=grad_z*x
return grad_x,grad_y
五、总结
*反向传播算法(Back-Propagation,BP),深度学习核心之一
*利用反向传播快速计算梯度值,然后利用梯度下降算法训练整个神经网络。
*在计算机中反向传播算法一般使用计算图(Computation Graphs)的方式进行模块化的运算。