(pytorch-深度学习系列)正向传播与反向传播-学习笔记

正向传播与反向传播

1. 正向传播

正向传播是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。
假设输入是一个特征为x∈Rd\boldsymbol{x} \in \mathbb{R}^dxRd的样本,且不考虑偏差项,那么中间变量

z=W(1)x,\boldsymbol{z} = \boldsymbol{W}^{(1)} \boldsymbol{x},z=W(1)x,
(矩阵相乘)

其中W(1)∈Rh×d\boldsymbol{W}^{(1)} \in \mathbb{R}^{h \times d}W(1)Rh×d是隐藏层的权重参数。把中间变量z∈Rh\boldsymbol{z} \in \mathbb{R}^hzRh输入按元素运算的激活函数ϕ\phiϕ后,将得到向量长度为hhh的隐藏层变量

h=ϕ(z).\boldsymbol{h} = \phi (\boldsymbol{z}).h=ϕ(z).

隐藏层变量h\boldsymbol{h}h也是一个中间变量。假设输出层参数只有权重W(2)∈Rq×h\boldsymbol{W}^{(2)} \in \mathbb{R}^{q \times h}W(2)Rq×h,可以得到向量长度为qqq的输出层变量

o=W(2)h.\boldsymbol{o} = \boldsymbol{W}^{(2)} \boldsymbol{h}.o=W(2)h.

假设损失函数为ℓ\ell,且样本标签为yyy,可以计算出单个数据样本的损失项

L=ℓ(o,y).L = \ell(\boldsymbol{o}, y).L=(o,y).

根据L2L_2L2范数正则化的定义,给定超参数λ\lambdaλ,正则化项即(超参数λ\lambdaλ即表示惩罚的力度)

s=λ2(∣W(1)∣F2+∣W(2)∣F2),s = \frac{\lambda}{2} \left(|\boldsymbol{W}^{(1)}|_F^2 + |\boldsymbol{W}^{(2)}|_F^2\right),s=2λ(W(1)F2+W(2)F2),

其中矩阵的Frobenius范数等价于将矩阵变平为向量后计算L2L_2L2范数。最终,模型在给定的数据样本上带正则化的损失为

J=L+s.J = L + s.J=L+s.

我们将JJJ称为有关给定数据样本的目标函数。

2. 反向传播

反向传播用于计算神经网络中的参数梯度。反向传播利用微积分中的链式法则,沿着从输出层到输入层的顺序进行依次计算目标函数有关神经网络各层的中间变量以及参数的梯度。
依据链式法则,我们可以知道:
∂J∂o=prod(∂J∂L,∂L∂o)=∂L∂o.\frac{\partial J}{\partial \boldsymbol{o}} = \text{prod}\left(\frac{\partial J}{\partial L}, \frac{\partial L}{\partial \boldsymbol{o}}\right) = \frac{\partial L}{\partial \boldsymbol{o}}. oJ=prod(LJ,oL)=oL.
(∂J∂L=1,∂J∂s=1)\left( \frac{\partial J}{\partial L} = 1, \quad \frac{\partial J}{\partial s} = 1\right)(LJ=1,sJ=1)
其中prod\text{prod}prod运算符将根据两个输入的形状,在必要的操作(如转置和互换输入位置)后对两个输入做乘法。
∂J∂W(2)=prod(∂J∂o,∂o∂W(2))+prod(∂J∂s,∂s∂W(2))=∂J∂oh⊤+λW(2)\frac{\partial J}{\partial \boldsymbol{W}^{(2)}} = \text{prod}\left(\frac{\partial J}{\partial \boldsymbol{o}}, \frac{\partial \boldsymbol{o}}{\partial \boldsymbol{W}^{(2)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \boldsymbol{W}^{(2)}}\right) = \frac{\partial J}{\partial \boldsymbol{o}} \boldsymbol{h}^\top + \lambda \boldsymbol{W}^{(2)} W(2)J=prod(oJ,W(2)o)+prod(sJ,W(2)s)=oJh+λW(2)
其中:
(∂s∂W(1)=λW(1),∂s∂W(2)=λW(2))\left(\frac{\partial s}{\partial \boldsymbol{W}^{(1)}} = \lambda \boldsymbol{W}^{(1)},\quad\frac{\partial s}{\partial \boldsymbol{W}^{(2)}} = \lambda \boldsymbol{W}^{(2)}\right)(W(1)s=λW(1),W(2)s=λW(2))
还有:
∂J∂W(2)=prod(∂J∂o,∂o∂W(2))+prod(∂J∂s,∂s∂W(2))=∂J∂oh⊤+λW(2)\frac{\partial J}{\partial \boldsymbol{W}^{(2)}} = \text{prod}\left(\frac{\partial J}{\partial \boldsymbol{o}}, \frac{\partial \boldsymbol{o}}{\partial \boldsymbol{W}^{(2)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \boldsymbol{W}^{(2)}}\right) = \frac{\partial J}{\partial \boldsymbol{o}} \boldsymbol{h}^\top + \lambda \boldsymbol{W}^{(2)} W(2)J=prod(oJ,W(2)o)+prod(sJ,W(2)s)=oJh+λW(2)

∂J∂h=prod(∂J∂o,∂o∂h)=W(2)⊤∂J∂o\frac{\partial J}{\partial \boldsymbol{h}} = \text{prod}\left(\frac{\partial J}{\partial \boldsymbol{o}}, \frac{\partial \boldsymbol{o}}{\partial \boldsymbol{h}}\right) = {\boldsymbol{W}^{(2)}}^\top \frac{\partial J}{\partial \boldsymbol{o}} hJ=prod(oJ,ho)=W(2)oJ
∂J∂z=prod(∂J∂h,∂h∂z)=∂J∂h⊙ϕ′(z)\frac{\partial J}{\partial \boldsymbol{z}} = \text{prod}\left(\frac{\partial J}{\partial \boldsymbol{h}}, \frac{\partial \boldsymbol{h}}{\partial \boldsymbol{z}}\right) = \frac{\partial J}{\partial \boldsymbol{h}} \odot \phi'\left(\boldsymbol{z}\right) zJ=prod(hJ,zh)=hJϕ(z)
所以,可以得到:
∂J∂W(1)=prod(∂J∂z,∂z∂W(1))+prod(∂J∂s,∂s∂W(1))=∂J∂zx⊤+λW(1)\frac{\partial J}{\partial \boldsymbol{W}^{(1)}} = \text{prod}\left(\frac{\partial J}{\partial \boldsymbol{z}}, \frac{\partial \boldsymbol{z}}{\partial \boldsymbol{W}^{(1)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \boldsymbol{W}^{(1)}}\right) = \frac{\partial J}{\partial \boldsymbol{z}} \boldsymbol{x}^\top + \lambda \boldsymbol{W}^{(1)}W(1)J=prod(zJ,W(1)z)+prod(sJ,W(1)s)=zJx+λW(1)

  • 在模型参数初始化完成后,需要交替地进行正向传播和反向传播,并根据反向传播计算的梯度迭代模型参数。
  • 在反向传播中使用了正向传播中计算得到的中间变量来避免重复计算,同时这个复用也导致正向传播结束后不能立即释放中间变量内存。这也是训练要比预测占用更多内存的一个重要原因。
  • 这些中间变量的个数大体上与网络层数线性相关,每个变量的大小跟批量大小和输入个数也是线性相关的,这是导致较深的神经网络使用较大批量训练时更容易超内存的主要原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(pytorch-深度学习系列)简单实现kaggle房价预测-学习笔记

实现kaggle房价预测 导入所需模块: %matplotlib inline import torch import torch.nn as nn import numpy as np import pandas as pdprint(torch.__version__) torch.set_default_tensor_type(torch.FloatTensor)读取数据集: (具体以自己…

(pytorch-深度学习系列)ResNet残差网络的理解-学习笔记

ResNet残差网络的理解 ResNet伴随文章 Deep Residual Learning for Image Recognition 诞生,该文章是MSRA何凯明团队在2015年ImageNet上使用的网络,在当年的classification、detection等比赛中,ResNet均获了第一名,这也导致了Res…

(pytorch-深度学习系列)pytorch构造深度学习模型-学习笔记

pytorch构造深度学习模型 1. 通过继承module类的方式来构造模型 Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类。 可以继承基类并重构 __init()__函数和forward()forward()forward()函数的方式来构造模型。 以下是一个构造一个模型的例子&am…

(pytorch-深度学习系列)模型参数的初始化与访问操作-学习笔记

模型参数的初始化与访问操作 学习 如何初始化以及访问模型参数,以及如何在多层之间共享模型参数 首先定义一个含有单个隐藏层的多层感知机,使用默认方式初始化该模型的参数,并且进行一次前向计算: import torch from torch impo…

(pytorch-深度学习系列)pytorch实现自定义网络层,并自设定前向传播路径-学习笔记

pytorch实现自定义网络层,并自设定前向传播路径-学习笔记 1. 不包含模型参数的自定义网络层 首先我们自定义一个网络层, 定义一个网络层,使其不包含模型参数,并在forward()函数中进行运算: import torch from torc…

(pytorch-深度学习系列)读取和存储数据-学习笔记

读取和存储数据 我们可以使用pt文件存储Tensor数据: import torch from torch import nnx torch.ones(3) torch.save(x, x.pt)这样我们就将数据存储在名为x.pt的文件中了 我们可以从文件中将该数据读入内存: x2 torch.load(x.pt) print(x2)还可以存…

(pytorch-深度学习系列)pytorch使用GPU计算-学习笔记

pytorch使用GPU计算 在之前的blog中早已经讲过如何配置pytorch的GPU加速环境 查看GPU加速是否可用: import torch from torch import nnprint(torch.cuda.is_available()) # true 查看GPU是否可用print(torch.cuda.device_count()) #GPU数量, 1torch.…

(pytorch-深度学习系列)CNN二维卷积层-学习笔记

二维卷积层 在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应…

(pytorch-深度学习系列)卷积神经网络中的填充(padding)和步幅(stride)

卷积神经网络中的填充(padding)和步幅(stride) 之前写过一篇blog,描述CNN网络层的输入和输入尺寸的计算关系,但是并没有描述的很全面,这里全面描述了影响输出尺寸的两个超参数padding和stride,查阅了相关资料,编码理解…

(pytorch-深度学习系列)CNN的多输入通道和多输出通道

CNN的多输入通道和多输出通道 之前的输入都视为二维数组,但是真实数据往往具有更高的维度,彩色图像有RGB三个颜色通道,那么这个图像(高为h,宽为w)可以表示为3∗h∗w3*h*w3∗h∗w的多维数组,一般…

(pytorch-深度学习系列)CNN中的池化层-学习笔记

CNN中的池化层 首先,池化(pooling)层的提出是为了缓解卷积层对位置的过度敏感性。 什么意思? 比如在图像边缘检测问题中,实际图像里,我们的目标物体不会总出现在固定位置,即使我们连续拍摄同…

(pytorch-深度学习系列)卷积神经网络LeNet-学习笔记

卷积神经网络LeNet 先上图:LeNet的网络结构 卷积(6个5∗5的核)→降采样(池化)(2∗2的核,步长2)→卷积(16个5∗5的核)→降采样(池化)(2∗2的核,步长2)→全连接16∗5∗5→120→全连接120→84→全连接84→10\begin{matrix}卷积 \\ (6个5*5的核…

(pytorch-深度学习系列)深度卷积神经网络AlexNet

深度卷积神经网络AlexNet 文字过多,但是重点已经标出来了 背景 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并…

(pytorch-深度学习系列)使用重复元素的网络(VGG)

使用重复元素的网络(VGG) VGG的名字来源于论文作者所在的实验室Visual Geometry Group,VGG提出了可以通过重复使用简单的基础块来构建深度模型的思路。 VGG Block(VGG 块) VGG块的组成规律是:连续使用数个相同的填充为1、窗口形…

(pytorch-深度学习系列)网络中的网络(NiN)

网络中的网络(NiN) LeNet、AlexNet和VGG在设计上的共同之处是:先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。其中,AlexNet和VGG对LeNet的改进主要在于如何对这两个模块加宽&…

(pytorch-深度学习)包含并行连结的网络(GoogLeNet)

包含并行连结的网络(GoogLeNet) 在2014年的ImageNet图像识别挑战赛中,一个名叫GoogLeNet的网络结构大放异彩。它虽然在名字上向LeNet致敬,但在网络结构上已经很难看到LeNet的影子。GoogLeNet吸收了NiN中网络串联网络的思想&#…

(pytorch-深度学习)批量归一化

批量归一化 批量归一化(batch normalization)层能让较深的神经网络的训练变得更加容易 通常来说,数据标准化预处理对于浅层模型就足够有效了。随着模型训练的进行,当每层中参数更新时,靠近输出层的输出较难出现剧烈变…

(pytorch-深度学习)实现残差网络(ResNet)

实现残差网络(ResNet) 我们一般认为,增加神经网络模型的层数,充分训练后的模型理论上能更有效地降低训练误差。理论上,原模型解的空间只是新模型解的空间的子空间。也就是说,如果我们能将新添加的层训练成恒等映射f(x)xf(x) xf(…

(pytorch-深度学习)实现稠密连接网络(DenseNet)

稠密连接网络(DenseNet) ResNet中的跨层连接设计引申出了数个后续工作。稠密连接网络(DenseNet)与ResNet的主要区别在于在跨层连接上的主要区别: ResNet使用相加DenseNet使用连结 ResNet(左)…

(pytorch-深度学习)语言模型-学习笔记

语言模型 自然语言处理中最常见的数据是文本数据。我们可以把一段自然语言文本看作一段离散的时间序列。 假设一段长度为TTT的文本中的词依次为w1,w2,…,wTw_1, w_2, \ldots, w_Tw1​,w2​,…,wT​,那么在离散的时间序列中: wtw_twt​(1≤t…