AI技术总监级拆解大模型|第09讲
RNN、LSTM、Seq2Seq 到底解决了什么?为什么最后还是走向了 Transformer
AI 学习系列|第09讲 / 共26讲
前面第08讲讲清楚了 CNN:
图片 ↓ 局部窗口 ↓ 卷积核 ↓ 特征图这一讲换一个问题:
如果数据本身有顺序,模型怎么处理?
例如:
文本 语音 时间序列 传感器数据 网络流量 日志这一讲只抓住一条技术主线:
序列问题 ↓ RNN ↓ LSTM ↓ Seq2Seq ↓ 固定 Context 瓶颈 ↓ Attention ↓ Transformer
01|为什么序列数据难?
看两个句子:
狗咬人 人咬狗词差不多。
但顺序变了,意思也可能完全不同。
所以模型不能只知道:
有哪些词还必须知道:
谁在前面 谁在后面 前面的信息怎样影响后面这就是序列建模。
02|RNN:让模型带着“记忆”往前走
RNN 最核心的一条公式:
[
h_t=f(x_t,h_{t-1})
]
翻成人话:
当前输入 + 上一时刻状态 ↓ 当前状态其中:
- (x_t):当前输入
- (h_{t-1}):上一时刻的隐藏状态
- (h_t):当前隐藏状态
一个经典形式:
[
h_t=
\tanh(W_xx_t+W_hh_{t-1}+b)
]
程序员可以把它直接想成:
state=init();for(intt=0;t<T;++t){state=f(input[t],state);}所以 RNN 的本质其实很朴素:
每读一个 Token,就更新一次内部状态。
它不会把历史原文完整存起来,而是把历史信息压缩进隐藏状态 (h_t)。
03|RNN 为什么曾经很重要?
因为它第一次非常自然地解决了一个问题:
怎么让模型知道“前面发生过什么”?
例如:
我今天去了一趟北京, 所以晚上准备……当模型处理最后几个词时,它不能只看当前 Token。
RNN 让:
前面的信息 ↓ 隐藏状态 ↓ 继续传到后面于是模型具备了最基本的上下文记忆能力。
04|但 RNN 有两个大问题
问题一:它天然串行
h1 → h2 → h3 → h4 → h5想算:
h5通常得先算:
h4而 h4 又依赖 h3。
所以:
RNN 的时间维存在强依赖,难以像大规模矩阵运算那样充分并行。
这对 GPU 很关键。
GPU 喜欢:
很多相似计算 同时做而 RNN 更像:
先做1 ↓ 再做2 ↓ 再做3 ↓ 再做4所以 RNN 不是不能上 GPU,而是沿着时间维的并行度受到限制。
问题二:长距离依赖
假设:
Token1 Token2 Token3 …… Token100如果 Token1 的信息要影响 Token100,就必须经过:
h1 → h2 → h3 → …… → h100训练时,梯度也要经过很多步。
因此:
[
\frac{\partial L}{\partial h_t}
\frac{\partial L}{\partial h_T}
\prod_{k=t+1}^{T}
\frac{\partial h_k}{\partial h_{k-1}}
]
关键就在:
[
\prod
]
也就是很多项连续相乘。
如果长期接近:
[
0.8
]
那么:
[
0.8^{10}\approx0.107
]
[
0.8{50}\approx1.43\times10{-5}
]
梯度越来越小。
这就是:
梯度消失。
反过来,长期大于 1,则可能:
梯度爆炸。
所以 RNN 的真正问题不是简单一句“记不住长文本”。
更准确地说:
远处的信息需要经过很多次递归状态传递,训练时很难稳定地把它传到很远的位置。
05|LSTM:给 RNN 加一个“记忆管理系统”
RNN 的问题很自然:
能不能让网络自己决定,什么应该忘掉,什么应该留下?
于是有了 LSTM。
LSTM:
Long Short-Term Memory核心组件:
Forget Gate Input Gate Output Gate Cell State不要先背四个名字。
先把它理解成:
旧信息 ↓ 要不要忘? 新信息 ↓ 要不要写? 最后 ↓ 哪些信息要输出?06|LSTM 的数学核心
Forget Gate
决定旧信息保留多少:
[
f_t=
\sigma(W_f[x_t,h_{t-1}]+b_f)
]
sigmoid 的输出在:
[
0\sim1
]
所以可以理解成:
0 → 基本忘掉 0.5 → 留一部分 1 → 基本保留Input Gate
决定新信息写入多少:
[
i_t=
\sigma(W_i[x_t,h_{t-1}]+b_i)
]
Candidate Memory
准备写进去的新信息:
[
\tilde C_t=
\tanh(W_c[x_t,h_{t-1}]+b_c)
]
Cell State
真正关键的一条:
[
C_t=
f_t\odot C_{t-1}
+
i_t\odot\tilde C_t
]
翻成人话:
旧记忆 × 保留多少 + 新信息 × 写入多少 = 新记忆这就是 LSTM 最值得记住的公式。
Output Gate
决定当前输出多少:
[
o_t=
\sigma(W_o[x_t,h_{t-1}]+b_o)
]
最终:
[
h_t=
o_t\odot\tanh(C_t)
]
所以:
LSTM 的核心,本质上是让记忆流动变得可控制。
07|LSTM 比 RNN 改进了什么?
可以直接记:
RNN = 当前输入 + 上一状态 ↓ 新状态而:
LSTM = 当前输入 + 上一状态 ↓ 决定: 忘多少 写多少 写什么 输出多少 ↓ 新记忆所以:
RNN 是“有记忆”,LSTM 是“管理记忆”。
但是有一件事没有改变:
h1 → h2 → h3 → h4LSTM 仍然需要按时间顺序递归。
所以它改善了长期依赖,却没有消灭串行计算。
08|Seq2Seq:从“理解一个序列”到“生成另一个序列”
很多任务是:
输入序列 ↓ 输出序列比如:
英文 ↓ 中文于是出现:
Sequence-to-Sequence
也就是:
Seq2Seq
经典结构:
输入序列 ↓ Encoder ↓ Context ↓ Decoder ↓ 输出序列09|Encoder 和 Decoder 各干什么?
Encoder
负责:
读取输入。
可以理解成:
state=init();for(intt=0;t<input_len;++t){state=encoder(input[t],state);}context=state;最终得到:
输入序列 ↓ ContextDecoder
负责:
根据 Context 生成输出。
Context ↓ 输出第1个 Token ↓ 输出第2个 Token ↓ 输出第3个 Token ↓ ……所以:
Encoder = 读 Decoder = 写10|Seq2Seq 又遇到一个大问题
假设输入特别长:
Token1 Token2 Token3 …… Token100最后:
100个Token ↓ Encoder ↓ 一个固定长度 Context ↓ Decoder这相当于:
把大量信息强行压进一个固定大小的瓶子。
输入越长,需要保留的信息越多。
但 Context:
大小固定于是就出现:
信息瓶颈。
11|这就是 Attention 出现的原因
以前:
整句话 ↓ 一个 Context ↓ DecoderAttention 改变思路:
当前计算 ↓ 去已有信息里找 ↓ 哪些内容与我现在最相关? ↓ 取这些信息 ↓ 继续计算例如当前正在生成某个词:
Token1 0.03 Token2 0.05 Token3 0.72 Token4 0.15 Token5 0.05说明当前计算更关注 Token3。
所以 Attention 的核心思想不是:
“给重点打分。”
而是:
当前计算需要什么信息,就动态访问什么信息。
这一步非常关键。
因为它改变了:
信息必须被压缩成一个状态这个限制。
12|从 RNN 一直走到 Transformer
现在把整条技术路线串起来:
序列问题 ↓ RNN ↓ 用 Hidden State 保存过去 ↓ 发现: ① 时间维串行 ② 长距离依赖困难 ↓ LSTM ↓ 用 Gate + Cell State 管理记忆 ↓ 长期依赖得到改善 ↓ 但仍然需要递归 ↓ Seq2Seq ↓ Encoder → Context → Decoder ↓ 固定 Context 成为信息瓶颈 ↓ Attention ↓ 动态访问已有信息 ↓ Transformer所以:
Transformer 并不是凭空出现的。它是在解决一连串前代模型暴露出来的问题。
13|为什么这与 GPT 有直接关系?
后面的 GPT 基于 Transformer。
而 Transformer 的核心计算大量采用:
矩阵乘法 + Tensor 运算 + 大规模并行这些计算非常适合 GPU。
于是形成:
Transformer ↓ GPU 并行 ↓ 更大的模型 ↓ 更多数据 ↓ 更长训练 ↓ 更强能力所以如果没有理解:
RNN ↓ LSTM ↓ Seq2Seq ↓ Attention直接去学 GPT,很容易只记住:
“GPT 使用 Transformer”却不知道:
Transformer 到底解决了什么问题。
14|本讲最该记住的几个公式
RNN:
[
h_t=f(x_t,h_{t-1})
]
经典形式:
[
h_t=
\tanh(W_xx_t+W_hh_{t-1}+b)
]
长距离梯度:
[
\frac{\partial L}{\partial h_t}
\frac{\partial L}{\partial h_T}
\prod
\frac{\partial h_k}{\partial h_{k-1}}
]
LSTM:
[
C_t=
f_t\odot C_{t-1}
+
i_t\odot\tilde C_t
]
记住这些公式,不是为了考试。
而是为了真正知道:
RNN 为什么叫递归状态 LSTM 为什么叫记忆管理 梯度消失 为什么会出现15|一句话吃透第09讲
RNN 用状态保存过去,LSTM 用门控管理记忆,Seq2Seq 用 Encoder-Decoder 完成序列到序列,但固定长度 Context 又产生信息瓶颈,最终把技术推向 Attention 和 Transformer。
16|下一讲
第10讲|Attention 与 Transformer:Q、K、V 到底在算什么?
下一讲正式开始算:
[
Q=XW_Q
]
[
K=XW_K
]
[
V=XW_V
]
然后一步一步算:
[
QK^T
]
[
\frac{QK^T}{\sqrt{d_k}}
]
[
\operatorname{softmax}
]
最后:
[
\operatorname{softmax}
\left(
\frac{QK^T}{\sqrt{d_k}}
\right)V
]
并进一步理解:
Self-Attention ↓ Multi-Head Attention ↓ Residual ↓ LayerNorm ↓ Feed Forward ↓ Transformer Block这一讲开始,真正进入现代大模型的核心计算。