深度学习-反向传播Back Propagation-自用笔记2

深度学习-反向传播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
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值