本文简单介绍了CNN,RNN和LSTM相关内容。Transformer在序列任务中逐渐取代RNN(因并行计算优势),但RNN/LSTM在资源受限场景仍有价值。
CNN ——人类的视觉总是会关注视线内特征最明显的点。
RNN 的假设——事物的发展是按照时间序列展开的(前一刻发生的事物会对未来的事情的发展产生影响)。
组件 | CNN | RNN |
---|---|---|
核心操作 | 卷积(空间局部连接 + 权值共享) | 循环(时间步间连接 + 隐藏状态传递) |
参数规模 | 与输入尺寸无关(权值共享减少参数) | 参数量随隐藏层维度平方增长(易参数爆炸) |
输入输出 | 固定尺寸输入(如图像) | 可变长度序列(如文本、时间序列) |
CNN vs RNN的本质区别
维度 | CNN | RNN |
---|---|---|
数据特性 | 空间局部相关性(如图像像素) | 时间/顺序相关性(如句子中的词语) |
信息流动 | 前馈传播(无记忆) | 循环传播(隐藏状态记忆历史信息) |
并行性 | 高度并行(卷积核独立计算) | 串行计算(依赖前一时刻结果) |
import torch.nn as nn
class CNNModel(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc = nn.Linear(16 * 16 * 16, 10) # 假设输入为32x32图像
def forward(self, x):
x = self.pool(nn.ReLU()(self.conv1(x)))
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
```
class RNNModel(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super().__init__()
self.rnn = nn.RNN(input_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
out, h_n = self.rnn(x) # out: (batch, seq_len, hidden_dim)
out = self.fc(out[:, -1, :]) # 取最后一个时间步输出
return out
```
文本生成是 RNN 的一个重要应用,能够根据前面的字或词来预测后面的字或词,从而生成连贯的文本。在语音识别中,RNN 可以处理语音信号,将其转化为文字。同时在自然语言处理中的情感分析、语言翻译等任务也广泛应用 RNN。
LSTM,全称为 Long Short-Term Memory。它旨在解决传统RNN的两大核心问题:
LSTM通过引入门控机制和细胞状态(Cell State),实现了对信息的长期记忆和选择性遗忘。LSTM 的基本单元包括输入门、输出门、遗忘门以及细胞状态。输入门控制新信息是否进入细胞状态;输出门控制细胞状态中的信息是否输出;遗忘门则控制遗忘细胞状态中的旧信息。
yuxi:选择性遗忘是否可以改进?遗忘无效信息会更好。