916 字
2 分钟
Pytorchpytorch
PyTorch RNN:序列建模与 LSTM 入门

从为什么需要序列模型讲起,把 one-hot、embedding、RNN、LSTM 和一个名字-国家分类任务串起来。

这一篇主要整理自 liuer_pytorch/14-15.ipynb。在前面几篇里,输入大多可以看成"彼此独立的特征向量";到了序列建模,这个假设就不成立了。

1. 为什么会需要 RNN#

课程里给出的切入点很朴素:
如果要根据前几天的天气预测今天的天气,把所有天直接拼成一个长向量喂进全连接层当然可以,但参数会很大,也不自然。

序列任务更在意的是:

  • 前后顺序
  • 上下文依赖
  • 可变长度

这就是 RNN 这类模型出现的原因。

2. RNN 的最小心智#

我自己记 RNN,不是先记公式,而是先记这件事:

RNN 不是把整段序列一次性塞进一个全连接层,而是让同一个 Cell 沿时间步重复处理信息。

所以图里那些同色的 RNN Cell,本质上共享的是同一组参数。
时间在往前走,隐藏状态在传递。

3. one-hot 的问题,和 embedding 为什么重要#

课程在字符级示例里先用了 one-hot 编码,比如学 "hello" -> "ohlol" 这种简单序列。
然后很快指出 one-hot 的三个问题:

  • 高维(high-dimension)
  • 稀疏(sparse)
  • 硬编码(hardcoded)

这正好引出 embedding。

embedding 的意义不是"把离散 token 变成稠密向量"这么简单,
更关键的是:它允许模型去学习"词和词之间的相对关系"。

4. LSTM 是在解决什么#

当序列变长,普通 RNN 很容易碰到长期依赖问题。
课程在这一节里把 LSTM 作为升级版介绍,我觉得最重要的不是立刻背门结构,而是先知道:

  • 普通 RNN 容易遗忘长距离信息
  • LSTM 引入了更强的记忆与控制机制
  • 它的目的就是让信息保存和遗忘变得更可控

5. 一个完整的小任务:名字-国家分类#

15.ipynb 里,这个任务很适合做入门示例:

  • 输入是一串字符
  • 输出是一个国家类别
  • 它不是每个时间步都分类,而是整段序列最终分类

所以课程里特别提醒了一点:

因为任务是一句话/一段话之分一个类别,而不是每个词都分一个类别,所以不用保留每个时间步的 outputs,而是使用最终状态 hidden。

这句话非常重要。它让我们知道:

  • 序列任务不一定都是 token-level 任务
  • 有些任务只关心最终整体表示

6. 学 RNN 阶段别急着追复杂架构#

我现在回头看,这一阶段最应该建立的是:

  1. 为什么序列不能像普通表格特征那样粗暴拼接
  2. 隐状态在序列传播里扮演什么角色
  3. one-hot 和 embedding 的区别
  4. 什么时候该取每个时间步输出,什么时候只看最终 hidden

如果这些没通,后面看 GRU、Attention、Transformer 也会很容易失去主线。

7. 这一阶段该记住什么#

如果只留最核心的几句:

  1. RNN 处理的是有顺序依赖的数据。
  2. 同一个 RNN Cell 会沿时间步重复使用。
  3. one-hot 是起点,但 embedding 更适合真实任务。
  4. LSTM 是在解决长期依赖和信息保留问题。

有了这些直觉,再去看更现代的序列模型,就会顺很多。

专题阅读

Pytorch

这篇文章属于同一条阅读链。你可以直接在这里切换,不用再回到列表页重新找。

当前进度7 / 8

留言区

留言

欢迎纠错、补充、交流。昵称和评论内容必填;如果你愿意,也可以留下联系方式,仅站主可见。

0

正在加载评论...

0 / 2000

阅读导航

文章目录

当前阅读位置将在这里显示

0 节