从为什么需要序列模型讲起,把 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 阶段别急着追复杂架构
我现在回头看,这一阶段最应该建立的是:
- 为什么序列不能像普通表格特征那样粗暴拼接
- 隐状态在序列传播里扮演什么角色
- one-hot 和 embedding 的区别
- 什么时候该取每个时间步输出,什么时候只看最终 hidden
如果这些没通,后面看 GRU、Attention、Transformer 也会很容易失去主线。
7. 这一阶段该记住什么
如果只留最核心的几句:
- RNN 处理的是有顺序依赖的数据。
- 同一个 RNN Cell 会沿时间步重复使用。
- one-hot 是起点,但 embedding 更适合真实任务。
- LSTM 是在解决长期依赖和信息保留问题。
有了这些直觉,再去看更现代的序列模型,就会顺很多。
专题阅读
Pytorch
这篇文章属于同一条阅读链。你可以直接在这里切换,不用再回到列表页重新找。
部分信息可能已经过时
留言区
留言
欢迎纠错、补充、交流。昵称和评论内容必填;如果你愿意,也可以留下联系方式,仅站主可见。