深度学习-反向传播Back Propagation-自用笔记2
一个两层的线性模型
A two layer neural network
𝑦 = 𝑊2 (𝑊1 ∙ 𝑋 + 𝑏1) + 𝑏2
如下图所示为第一层的输入X、权重W1、偏置b1的维度。
同样的方法可以将两个层的线性模型写出来如下:
First Layer、Second Layer
如下图两个线性层进行得加没有任何意义,因为经过变换之后又成了一个线性层,线性层进行权重得加完全没有意义,因此需要解决线性层叠加的问题。
给出的解决方法是给每一层的输出都增加一个非线性函数做变换,非线性函数即激活函数在后面会单独介绍。
反向求导
如g(x)作为第一层的输出,即第二层的输入;
f(g(x))作为第二层的输出,也可写成f*g(x);
没有激活函数的线性模型反向传播过程
举例
在pytorch中的代码实现
首先先说一下pytorch最基本的数据类型Tensor,Tensor张量是构建动态计算图的重要组成部分,可以存标量、变量、一维的、多维的,它包含数据和梯度,分别存储结点和梯度损失的值。
线性模型程序如下
w = torch.Tensor([1.0]) //w的数据类型是Tensor,1.0代表w只有一个值;
w.requires_grad = True//这条语句代表会自动计算w的梯度;
return x * w //因为w为Tensor类型,所以当 x 也自动转换为Tensor类型,并且得到的 y^ = 𝑥 ∗ 𝜔,y^ 也能自动计算梯度,同理loss可自动计算梯度
看到这些代码实际上是在构建动态计算图,如下图红笔
训练过程
l = loss(x, y) ,其中l也为一个张量Tensor;
l.backward() 这个语句就会把计算图上的每一个需要计算梯度的地方,把梯度都会自动地求出来。此例子就是把变量权重w来进行求梯度,把梯度存到变量权重w中,计算完梯度后计算图就会释放了。
计算图如下图,计算完梯度后计算图就会释放了。因为每一层的计算图可能不一样,所以每进行一次反向传播就把计算图释放。
权重w更新
注意:权重w是一个tensor有data和grad, w.grad也是一个tensor,也有data和grad,所以采用梯度数据采用w.grad.data,构建计算图如前向计算,计算损失函数的时候都采用张量w直接计算,然而在计算权重更新的时候采用w.data、w.grad.data来计算
注意:当我们求损失值求和的时候一定用l.item而不是l
因为l是tensor类型,如果用l的计算会建立一个计算图,如果数据过大,计算图会一直保留下去慢慢就把内存吃光,所以采用l.item的形式不会构建计算图,只会把其中的l的data拿出来进行累加。
梯度清零
如果不进行梯度清零,下一次进行计算梯度的时候梯度就会累加在一起
这里要注意不是所有的模型都是进行梯度清零的,有的一些模型就是需要梯度进行累加。
程序运行结果
打印出来的是 第几代epoch、每一代的损失函数loss