PyTorch入门实战教程笔记(十二):梯度相关操作3

PyTorch入门实战教程笔记(十二):梯度相关操作3

感知机的梯度推导

  1. 单层感知机
    y = ΣxiWi + b,结合下图简化结构,我们讲一下命名规则。
    在这里插入图片描述
    我们把输入层即第0层编号为x00-n; 上图横线部分为第一层,包含W1ij, 1代表第一层的参数W,i表示连接上一层的神经元的序号,j代表连接这一层的神经元的序号;激活函数用Sigmoid激活函数,用δ表示,经过激活函数的输出用O10表示,代表第一层的输出,第0号节点。E代表error,t代表target。
    详细求导过程如下图:
    在这里插入图片描述
    即最终结果为下式,也就是Wj0的梯度只与输出O0, x0j有关。
    在这里插入图片描述
    pytorch例子,定义一个输入x,其shape为[1, 10], 参数W,其shape为[1, 10], 然后通过x @ W.t(), 即[1, 10] @ [1,10]T得 [1, 1]. 通过F.mse_loss(torch.ones(1,1), o) 来计算标签[1, 1]和输出[1, 1]之间的mse均方差。然后利用loss.backward(),即可计算出所有Wj0的梯度,然后利用W = W - 0.001
    ▽W来更新W,直到x*W接近真实值y,完成梯度更新。代码如下:
    在这里插入图片描述
  2. 多层感知机
    多层感知机的结构如下图:一共有N×M个连接
    在这里插入图片描述
    详细求导过程如下图(可以发现形式基本和单层感知机一样):
    在这里插入图片描述
    pytorch例子,定义一个输入x,其shape为[1, 10], 参数W,其shape为[2, 10], 然后通过x @ W.t(), 即[1, 10] @ [2, 10]T得 [1, 2]. 通过F.mse_loss(torch.ones(1,2), o) 来计算标签[1, 1]和输出[1, 1]之间的mse均方差。然后利用loss.backward(),即可计算出所有Wj,0-1的梯度,然后利用W = W - 0.001▽W来更新W,直到xW接近真实值y,完成梯度更新。代码如下:
    在这里插入图片描述

链式法则

通过链式法则,将最后一层的误差,一层一层的输出到中间层的权值上面去,从而得到中间层的一个梯度信息,来更新权值,达到最优化的效果。表达式及运算举例如下图;
在这里插入图片描述
现在我们拿一个两层的神经元来举例,输入x,中间层为O1,输出层为O2,误差E对W2的偏导直接能求(就是单层感知机),误差E对W1求解需要通过链式法则,具体如下式,这样E对O2k的偏导,O2k对O1k的偏导,O1k
输入x的偏导,都比较好求,进而求得误差E对W1的梯度。
在这里插入图片描述
pythorch代码实现,y1 = xw1 + b1, y2 = xw2 + b2, dy2_dy1为y2对y1的求导,dy1_dw1为y1对w1的求导,dy2_dw1为y2对w1的求导,可以验证链式法则,dy2_dy1*dy1_dw1 = dy2_dw1是成立的。注意到,pytorch一个语句即可实现对所有w的自动求导,大大减少了人为的运算和代码的繁琐度。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值