当前位置: 首页 > news >正文

02 从 RNN 到 Transformer:为什么语言建模需要新结构?

在上一篇文章中,我们从整体上介绍了大语言模型的发展路线。

大语言模型并不是突然出现的,它背后经历了一个长期演进过程:

统计语言模型

神经网络语言模型

RNN / LSTM / GRU

Seq2Seq

Attention

Transformer

BERT / GPT / T5

大语言模型

如果想真正理解大语言模型,不能一上来就只看 GPT、LLaMA、Qwen 或 DeepSeek。我们需要先理解一个更基础的问题:

为什么早期的 RNN、LSTM、Seq2Seq 结构不够用了?
为什么后来 Transformer 会成为大语言模型的核心架构?

这一章我们就沿着这个问题展开。

本文不急着深入 Transformer 的完整结构,而是先从历史背景出发,理解从 RNN 到 Transformer 的技术演进逻辑。

一、语言建模最早要解决什么问题?

语言模型最基本的任务是:根据前面的词,预测下一个词。

例如给定一句话:我今天下午准备去

模型需要预测后面可能出现:

上课
吃饭
图书馆
公司

从概率角度看,语言模型要估计一个文本序列的概率:

也就是说,一个句子的整体概率,可以拆成每个 token 在前文条件下出现的概率。

对于 GPT 这类自回归语言模型来说,核心训练目标就是:

这就是 next token prediction。

问题在于:模型如何有效利用前面的上下文?

早期统计语言模型通常使用 n-gram。比如 bigram 只看前一个词,trigram 只看前两个词:

这种方法简单,但上下文窗口太短。

例如下面这个句子:我昨天在图书馆借了一本关于深度学习的书,今天终于把它看完了。

这里的“它”指的是“书”。如果模型只看前两个或前三个词,很难判断“它”到底指代什么。

所以语言建模从一开始就面对一个核心问题:如何建模长距离上下文依赖?

二、RNN:按顺序读取文本

RNN,全称是 Recurrent Neural Network,循环神经网络。

它的基本思想非常自然:既然文本是一个序列,那就按顺序一个词一个词地读。

假设输入序列为:

RNN 在第 t 个时间步读取当前输入,同时保留前一个时间步的隐藏状态,然后更新得到新的隐藏状态

其中:
是当前输入 token 的向量表示;
是上一时刻的隐藏状态;

是当前时刻的隐藏状态;
是输入权重矩阵;
是隐藏状态权重矩阵;
b 是偏置;
f 通常是 tanh 或其他非线性激活函数。

从直觉上看,RNN 的隐藏状态就像模型的“记忆”。

例如模型依次读入:

我 / 今天 / 去 / 学校 / 上课

每读一个词,隐藏状态就更新一次。理论上,最后的隐藏状态可以包含整个句子的历史信息。

RNN 的优势是明显的:

它适合处理变长序列
它可以复用同一套参数
它能够逐步积累上下文信息

所以在早期 NLP 任务中,RNN 曾经非常重要。

但是,RNN 也有一个非常关键的问题:它必须按顺序计算。

也就是说,要计算,必须先算出;要算出,必须先算出

计算链条是:

h1 → h2 → h3 → ... → hn

这导致 RNN 很难充分并行。对于短句子,这个问题不明显;但对于大规模语料和超长文本,顺序计算会严重限制训练效率。

1、RNN 的第一个问题:长距离依赖困难

RNN 理论上可以记住所有历史信息,但实际上很难。

原因在于,信息需要通过隐藏状态一步一步传递。

假设一个句子很长:

小明昨天在书店买了一本关于人工智能发展历史的书,回家之后认真读了很久,最后发现它非常有启发。

这里的“它”指的是前面的“书”。

如果模型要正确理解“它”,就需要把很早之前的信息一路传递到后面。

但是 RNN 中的信息传递路径很长:书 → ... → ... → ... → 它。

中间经过很多时间步后,早期信息可能会逐渐衰减。

这就是长距离依赖问题。

在训练时,这个问题通常和梯度消失、梯度爆炸有关。反向传播需要沿着时间步一层层传回去,如果链条太长,梯度可能越来越小,导致模型很难学习远距离关系。

可以直观理解为:

短距离依赖:模型容易记住 长距离依赖:模型容易遗忘

例如:我喜欢吃苹果,因为它很甜。

这里“它”距离“苹果”很近,比较容易处理。

但如果句子变成:

我昨天在超市买了一袋苹果,回家以后放在桌子上,晚上看电视时突然想起来,于是拿了一个出来吃,发现它很甜。

这里“它”距离“苹果”较远,RNN 就更难稳定建模。

三、LSTM:为了解决 RNN 的记忆问题

为了解决普通 RNN 难以建模长距离依赖的问题,LSTM 被提出。

LSTM 的全称是 Long Short-Term Memory。Hochreiter 和 Schmidhuber 在 1997 年提出 LSTM,用来缓解普通循环网络在长时间跨度任务中由于误差信号衰减导致学习困难的问题。

LSTM 的核心思想是:给模型增加一个更稳定的记忆单元,让信息可以更长时间地保留下来。

普通 RNN 只有隐藏状态,而 LSTM 额外引入了 cell state:

1. 遗忘门:决定忘掉什么

遗忘门决定上一时刻的记忆中哪些信息需要保留,哪些需要丢弃

其中:

是遗忘门;
σ 是 sigmoid 函数,输出范围在 0 到 1 之间;
越接近 1,表示越保留;
越接近 0,表示越遗忘。

2. 输入门:决定写入什么新信息

输入门决定当前输入中哪些信息应该写入记忆:

同时生成候选记忆:

3. 更新记忆状态

LSTM 的记忆更新为:

这个公式非常关键。

它表示:新的记忆 = 保留下来的旧记忆 + 写入的新记忆.

4. 输出门:决定输出什么

输出门决定当前隐藏状态输出哪些信息:

通过这种门控机制,LSTM 比普通 RNN 更擅长保留长期信息。

可以简单理解为:

RNN:每一步都重新混合全部信息,容易遗忘
LSTM:有专门记忆通道和门控机制,更容易保留长期依赖

因此,在 Transformer 之前,LSTM 是 NLP 中非常重要的结构。

四、GRU:更简化的门控循环网络

除了 LSTM,还有一种常见结构叫 GRU,Gated Recurrent Unit。

GRU 可以理解为 LSTM 的简化版本。

它没有单独的 cell state,而是通过更新门和重置门来控制信息流动:

更新门 update gate
重置门 reset gate

GRU 的参数通常比 LSTM 少,结构更简单,训练速度可能更快。

在很多早期 NLP 任务中,LSTM 和 GRU 都是非常常用的序列建模结构。

但是,不管是普通 RNN、LSTM,还是 GRU,它们都有一个共同特点:

计算过程仍然是按时间顺序递推的。

也就是说,它们仍然很难彻底摆脱顺序计算瓶颈。

五、Seq2Seq:从单句建模到序列转换

随着机器翻译、摘要、对话生成等任务发展,NLP 需要处理一种更复杂的问题:

输入是一个序列,输出也是一个序列。

例如机器翻译:

输入:I love machine learning.
输出:我喜欢机器学习。

文本摘要:

输入:一篇长文章
输出:一段简短摘要

对话生成:

输入:你今天感觉怎么样?
输出:我感觉还不错。

这类任务被称为 sequence-to-sequence,简称 Seq2Seq。

Seq2Seq 的基本结构是:

Encoder 读取输入序列
Decoder 生成输出序列

早期 Seq2Seq 模型通常使用 LSTM 作为 Encoder 和 Decoder。Sutskever、Vinyals 和 Le 在 2014 年提出的 Seq2Seq 方法使用多层 LSTM 将输入序列编码为固定维度向量,再用另一个 LSTM 从该向量解码目标序列,并在机器翻译任务中取得了重要结果。

基本流程如下:

输入序列 x1, x2, ..., xn

Encoder LSTM

固定长度向量 c

Decoder LSTM

输出序列 y1, y2, ..., ym

用公式表示,Encoder 将输入序列压缩成一个上下文向量:

Decoder 根据 ccc 生成输出:

这里的 ccc 非常重要。它是整个输入序列的压缩表示。

http://www.rkmt.cn/news/1391312.html

相关文章:

  • 从卡顿到流畅:Win11Debloat如何让我的Windows性能提升80%
  • NCBI基因组下载终极指南:如何快速获取高质量基因组数据
  • 终极窗口布局恢复神器:PersistentWindows让你的多屏工作永不混乱
  • 湖州黄金上门回收找哪家?福运来口碑领跑 - 黄金回收
  • WinNUT-Client完全指南:专业级Windows UPS监控解决方案
  • vue-quick-calendar实战:从零封装一个高定制化Vue日历组件(附源码解析)
  • 2026新榜单:绵阳母婴除甲醛CMA甲醛检测治理公司推荐品牌排行榜 - 金诚回收
  • 衢州黄金上门回收哪家靠谱?福运来口碑领跑 - 黄金回收
  • 能量收集网络中信息年龄优化的联合采样与调度策略
  • GitHub 6k Star,挖出49个CVE:这个国产AI代码审计工具杀疯了!
  • 1995年的5月26日:比尔·盖茨连夜敲下的“真香”认错书
  • 均值与中位数的本质区别:分布形态与分析意图决定指标选择
  • B站字幕提取终极指南:3个简单步骤实现高效下载与转换
  • AWS MSK生产实战:从网络配置到成本优化的全链路指南
  • BepInEx插件框架:让Unity游戏模组开发变得简单高效
  • 从振动数据到健康评分:我是如何用深度学习给工厂轴承做‘体检’的
  • 嵌入式开发避坑指南:LwIP内存堆管理,为什么你的FreeRTOS项目会内存泄漏?
  • 3分钟学会iOS应用签名:这个免费工具让你告别复杂命令行!
  • 从LED到数字钟:AVR动态扫描与BASCOM定时器编程实战
  • 打卡信奥刷题(3321)用C++实现信奥题 P9208 虚人「无」
  • 书匠策AI被我扒了个底朝天!原来毕业论文还能这样“无痛通关“?
  • 华硕笔记本屏幕色彩异常?G-Helper开源工具帮你完美修复
  • 汉明距离原理与工程实践:从二进制校验到DNA比对
  • 终极指南:如何零成本获取明日方舟12000+专业游戏美术资源
  • NVIDIA Profile Inspector:解锁显卡200+隐藏设置的终极解决方案
  • AWS S3与EFS混合存储实战:生产级配置、成本优化与故障排查
  • 量子噪声对傅里叶模型的影响与优化策略
  • 温州黄金上门回收测评,福运来五星推荐 - 黄金回收
  • 基于游程统计复杂度的自适应JPEG隐写方案设计与实现
  • Excel敏感性分析实战:数据表、Solver与条件格式三剑合璧