[Pytorch] 学习记录(三)反向传播

反向传播是神经网络中非常重要的一个算法,它可以在图上进行梯度传播。如图1是最简单的神经网络,ω为权重存在于模型中,是我们要训练的目标。y为最终的输出,*为进行计算的地方。在训练的时候实际上就是对ω权重进行更新,更新的时候是在计算\omega = \omega-\alpha\frac{\partial loss}{\partial \omega},我们的目标就是让损失值取最小

图1 最简单的神经网络

 梯度下降的完整公式中包含一个求偏导,而导数部分经推导可得\frac{\partial loss}{\partial \omega}=2x_n(x_n\omega-y_n)。对于简单的模型我们可以用上面的解析式方法去做,但是对于复杂的模型就不能再这样做了。

图2 复杂的模型

如图2,每一个圆圈里都有一个自己的ω,权重数量非常多。在第二列的隐藏层h1中共有6个元素,所以h1属于六维向量,x作为输入是一个五维向量。如果想通过h=ωx的形式得到h,那需要进行矩阵的乘法。从矩阵的形状可知ω需要是一个6×5的矩阵,总共有30个不同权重。同理,第三层有7个元素,他们的ω有6×7=42个,合起来有好几百个,非常之多。如果要挨个写解析式就几乎是一个不可能的事情了。

因此我们需要一种算法,将复杂的网络看成一个图,让梯度在图上传播,最终根据链式法则将梯度求出来,这种算法就叫做反向传播算法。

比如,有一个两层神经网络\hat{y}=W_2(W_1\cdot X+b_1)+b_2,输入的X先经过与W1相乘在+b,得到一个里层输出。再与外面的W2相乘与b2相加,得到最终的y输出。这就是一个计算图的过程,不同绿色的框(计算模块)求局部偏导的时候采用的方法都是不一样的。

对于多层神经网络,如果仅仅这样是不合适的,因为y可以展开化简,最终不论是多少层的神经网络都可以展成y=WX+b的形式(如图3)。为了解决这一问题,我们对每一层的输出加一个非线性变化函数。比方说,对第一层的三个输出,我们让x1 x2 x3分别代入1+e^{-x},将这个结果再代入到下一层中,以此类推。

图3 多层神经网络的合并

图4  Backward 从 z 向前反馈


下面将讲解在Pytorch中如何实现数据的前馈反馈。首先,pytorch中的基本数据类型是Tensor型,所有的数据数值都要存在Tensor中。Tensor可以存向量、矩阵、标量等。tensor中包含有data和grad两部分,分别用来保存ω本身的值和loss函数对ω的导数。在构建模型的时候实际上就是在构建一个计算图

总结:反向传播算法的步骤,第一步算损失,第二步做backward,第三步做\omega = \omega-\alpha\frac{\partial loss}{\partial \omega},第四步清空grad,外套循环即可。

扫描二维码关注公众号,回复: 16468512 查看本文章

猜你喜欢

转载自blog.csdn.net/m0_55080712/article/details/122837290