PyTorch深度学习教程:理解卷积与自动微分引擎

PyTorch深度学习教程:理解卷积与自动微分引擎

NYU-DLSP20 NYU Deep Learning Spring 2020 NYU-DLSP20 项目地址: https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning

一维卷积原理与应用

卷积操作是深度学习中处理数据稀疏性、平稳性和组合性的核心工具。让我们从一个简单的一维卷积开始理解其工作原理。

基本概念

假设我们有一个大小为n的输入向量,使用大小为k的卷积核进行处理。不同于传统全连接层的矩阵乘法,卷积操作通过以下方式实现:

  1. 将卷积核作为滑动窗口在输入上移动
  2. 每个位置计算点积
  3. 使用m个不同的卷积核会生成m个输出通道

这种操作会产生m个大小为n-k+1的输出向量。对于单通道输入(如单声道音频信号),我们可以将其视为一个从自然数到实数的映射函数。

数学表示

输入信号x可以表示为: $$ x:\Omega\rightarrow\mathbb{R}^{c} $$ 其中$\Omega$是1维自然数集,c表示通道数(c=1为单声道,c=2为立体声)。

实际计算过程

每个卷积核与输入信号的局部区域进行点积运算,通过滑动窗口方式覆盖整个输入。这种计算方式具有以下特点:

  • 参数共享:同一个卷积核在不同位置重复使用
  • 局部连接:每个输出只与局部输入相关
  • 平移不变性:相同模式在不同位置会被相同检测

PyTorch中的卷积维度详解

一维卷积实现

在PyTorch中,nn.Conv1d实现一维卷积,关键参数包括:

  • in_channels:输入通道数
  • out_channels:输出通道数(卷积核数量)
  • kernel_size:卷积核大小
  • stride:滑动步长
  • padding:边界填充

示例代码:

conv = nn.Conv1d(2, 16, 3)  # 2输入通道,16个卷积核,大小3
x = torch.rand(1, 2, 64)     # 批量1,2通道,64长度
conv(x).size()               # 输出[1, 16, 62]

二维卷积扩展

二维卷积处理如图像数据,增加了高度和宽度维度。关键区别在于:

  • 卷积核变为二维(如3×5)
  • 输出尺寸计算考虑两个维度

示例代码:

x = torch.rand(1, 20, 64, 128)    # 1样本,20通道,64高,128宽
conv = nn.Conv2d(20, 16, (3,5))   # 20输入通道,16卷积核,3×5大小
conv(x).size()                    # 输出[1, 16, 62, 124]

使用padding可以保持输入输出尺寸一致:

conv = nn.Conv2d(20, 16, (3,5), padding=(1,2))
conv(x).size()  # 输出[1, 16, 64, 128] 保持原尺寸

自动微分引擎原理

PyTorch的自动微分是其核心特性,理解其工作原理对调试和自定义操作至关重要。

基本示例

考虑一个简单计算图:

  1. 创建2×2张量x,启用梯度追踪
  2. 计算y = x - 2
  3. 计算z = 3y²
  4. 计算a = mean(z)

反向传播时,PyTorch会自动计算梯度da/dx。手动验证这一过程:

$$ \frac{da}{dx_i} = \frac{3}{2}x_i - 3 $$

计算结果与PyTorch的自动微分结果一致。

动态计算图

PyTorch支持动态计算图,即使在循环和条件语句中也能正确计算梯度:

x = torch.randn(3, requires_grad=True)
y = x * 2
i = 0
while y.data.norm() < 1000:
    y = y * 2
    i += 1

即使迭代次数不确定,仍能正确计算梯度。

梯度控制

  • requires_grad=True:启用梯度追踪
  • torch.no_grad():临时禁用梯度计算
  • detach():从计算图中分离张量

自定义梯度函数

PyTorch允许创建自定义操作并定义其梯度计算规则,这对于实现特殊层或研究新算法非常有用。

基本结构

自定义函数需要继承torch.autograd.Function并实现两个静态方法:

class MyAdd(torch.autograd.Function):
    @staticmethod
    def forward(ctx, x1, x2):
        ctx.save_for_backward(x1, x2)
        return x1 + x2
        
    @staticmethod
    def backward(ctx, grad_output):
        x1, x2 = ctx.saved_tensors
        return grad_output * torch.ones_like(x1), grad_output * torch.ones_like(x2)

设计要点

  1. forward:执行前向计算,可保存计算图信息
  2. backward:定义梯度计算规则
  3. 梯度一致性:确保梯度与输入维度匹配
  4. 特殊操作:如split操作需要在反向时相加梯度,max操作需要构造one-hot梯度

应用场景

  • 实现特殊数学运算
  • 优化内存使用的自定义操作
  • 研究新型神经网络组件
  • 部署特定硬件加速操作

理解这些核心概念将帮助您更有效地使用PyTorch构建和调试深度学习模型。

NYU-DLSP20 NYU Deep Learning Spring 2020 NYU-DLSP20 项目地址: https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔祯拓Belinda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值