文本生成:从 RNN 到 GPT 的创作
文本生成:从 RNN 到 GPT 的创作
本教程带你走进文本生成的核心技术演进,从最基础的循环神经网络出发,逐步理解注意力机制、Transformer 架构,直至掌握 GPT 系列模型如何完成现代文本创作。无需深厚数学背景,适合所有对 AI 写作感兴趣的技术爱好者。
1. 什么是文本生成
文本生成是指让计算机自动产生自然语言文本的任务,例如写作故事、回答问题、翻译语言、生成代码等。其本质是学习大量文本中的统计规律,预测下一个词或下一段文字。按照工作方式可分为两类:
- 自回归生成:逐词预测,当前输出依赖之前生成的全部内容(如 GPT)。
- 非自回归生成:一次性输出全部序列(如某些翻译模型),速度更快但连贯性略低。
本教程重点关注自回归方式,这也是现今主流生成模型的核心思路。
2. 循环神经网络(RNN):处理序列的第一步
2.1 为什么需要 RNN
传统前馈神经网络要求固定大小的输入,但文本是变长序列。RNN 引入隐藏状态,在时间步之间传递信息,天然适合序列建模。
2.2 基本结构
在时间步 t,RNN 接收当前输入词向量 x_t 和上一步隐藏状态 h_{t-1},计算新隐藏状态 h_t:
h_t = tanh(W_x * x_t + W_h * h_{t-1} + b)
然后,通过 h_t 预测下一个词的概率分布。这种循环连接使网络拥有“记忆”,可以捕捉短程依赖。
2.3 训练与局限
训练时使用时间反向传播(BPTT),将误差沿时间展开回传。然而,朴素 RNN 面临两大难题:
- 梯度消失:长序列中早期信息的梯度接近零,无法学习长程依赖;
- 梯度爆炸:梯度呈指数增长,导致训练不稳定。
实用中,我们通常使用梯度裁剪应对爆炸,但消失问题催生了更强大的变体——LSTM 和 GRU。
3. 长短期记忆网络(LSTM)与门控循环单元(GRU)
3.1 LSTM 的设计哲学
LSTM 引入单元状态(cell state)作为贯穿时间的“信息高速路”,并通过三个门控机制控制信息的流入、保留和流出:
- 遗忘门:决定从单元状态中丢弃哪些旧信息;
- 输入门:决定哪些新信息存入单元状态;
- 输出门:决定基于单元状态输出什么内容。
这种结构能有效保留长距离信息,缓解梯度消失。
3.2 GRU 的简化
GRU 将遗忘门和输入门合并成“更新门”,并将单元状态与隐藏状态融合,参数更少、计算更快,在许多任务上效果与 LSTM 相当。它同样解决了长程依赖问题。
3.3 应用与局限
LSTM/GRU 支撑了早期的机器翻译、文本摘要和对话系统。但当序列超过几十个词时,仍然难以完美捕捉全局关系,并且顺序计算导致训练无法并行,速度慢。
4. 序列到序列(Seq2Seq)与注意力机制
4.1 编码器-解码器框架
Seq2Seq 模型由两个 RNN 组成:
- 编码器:读取源序列,总结成最后一个隐藏状态(上下文向量);
- 解码器:从上下文向量生成目标序列。
然而,固定长度的上下文向量成为信息瓶颈,长输入时表现骤降。
4.2 注意力机制的诞生
注意力机制让解码器能够直接“回看”编码器的所有隐藏状态,并动态计算权重——即每一步应该重点关注源序列的哪些位置。这极大提升了长文本生成的质量。
核心公式(缩放点积注意力):
Attention(Q, K, V) = softmax(QK^T / √d_k) * V
在 Seq2Seq 中,查询(Q)来自解码器状态,键(K)和值(V)来自编码器输出。加权求和后,解码器获得融合上下文信息的向量。
4.3 注意力发展
随后出现的自注意力(Self-Attention)、多头注意力(Multi-Head Attention)不再依赖循环结构,直接计算序列内任意两词之间的关联,为 Transformer 铺平道路。
5. Transformer:开创并行生成新时代
2017 年《Attention Is All You Need》论文彻底抛弃 RNN,提出基于纯注意力机制的 Transformer 模型。
5.1 核心组成
- 多头自注意力:同时使用多个注意力头,从不同表示子空间捕捉信息;
- 位置编码:由于无循环结构,必须通过正弦函数或可学习参数注入词序信息;
- 前馈网络与残差连接:增强非线性表达能力并加速训练;
- 层归一化:稳定深层网络的训练。
5.2 编码器和解码器
Transformer 原始架构包含编码器(双向处理)和解码器(带掩码的自注意力,保持自回归特性),但文本生成通常只用其解码器部分。
5.3 为什么 Transformer 适合生成
- 并行计算:训练时所有时间步同时计算,速度远超 RNN;
- 长程依赖:自注意力直接连通序列中任意位置,距离不再是瓶颈;
- 可扩展性:参数量可从数百万轻松扩展到数千亿。
6. GPT 系列:从预训练到提示工程
GPT(Generative Pre-trained Transformer)将 Transformer 解码器缩放,通过大规模无监督预训练实现强大的语言建模能力。
6.1 GPT 的关键思想
- 自回归语言模型:给定前文
w_1, w_2, ..., w_{t-1},预测下一个词w_t的概率,训练目标是最大化整个语料的似然函数。 - 单向性:只看到左侧上下文,与 BERT 的双向编码形成对比,天生适合生成任务。
- 大容量预训练:在海量文本上训练,模型学会语法、事实、推理等能力。
6.2 演进之路
- GPT (2018):1.17 亿参数,验证了预训练+微调范式;
- GPT-2 (2019):15 亿参数,展现出强大的零样本生成能力,甚至能写出连贯文章;
- GPT-3 (2020):1750 亿参数,不再需微调,通过上下文学习(In-context Learning)适应新任务,大幅降低使用门槛;
- GPT-4 (2023):多模态模型,理解能力、推理深度和可控性进一步提升。
6.3 提示工程(Prompt Engineering)
大规模模型时代,用户与模型的交互方式转为设计精巧的提示词:
- 零样本提示:直接描述任务,如“将以下文本翻译成英文:...”;
- 少样本提示:提供几个示例,模型从示例中学会模式;
- 思维链(Chain-of-Thought):引导模型展示中间推理步骤,提升复杂问题的准确性。
良好的提示能让通用模型化身专属作家、程序员或数据分析师。
6.4 生成策略与可控性
生成时需选择合适的解码方法:
- 贪心搜索:每步选概率最高的词,但可能陷入重复;
- 束搜索:保留多个候选序列,平衡质量与多样性;
- Top-k / Top-p 采样:限制候选词数量,提升创作惊喜感;
- 温度系数:调节概率分布的尖锐程度,高温度增加随机性。
现代模型还支持通过系统指令、角色设定等方式精细控制风格、语气和内容安全边界。
7. 实战:十分钟构建一个故事生成器
我们使用 Hugging Face 的 transformers 库调用 GPT-2 模型,快速体验文本生成。
7.1 环境准备
pip install transformers torch
7.2 代码示例
from transformers import GPT2LMHeadModel, GPT2Tokenizer
model_name = "gpt2" # 可在 Hugging Face 上选择更大模型
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)
# 设置起始文本
prompt = "在一个遥远的星系,一艘孤独的飞船"
input_ids = tokenizer.encode(prompt, return_tensors='pt')
# 生成
output = model.generate(
input_ids,
max_length=150,
do_sample=True,
top_k=50,
top_p=0.95,
temperature=0.8,
pad_token_id=tokenizer.eos_token_id
)
story = tokenizer.decode(output[0], skip_special_tokens=True)
print(story)
运行后,你将看到模型根据提示续写的科幻故事。调整 temperature 和 top_p 即可控制创造性。
7.3 进阶方向
- 使用更大模型(如 GPT-Neo、GPT-J)获取更好效果;
- 加载 DialoGPT 构建聊天机器人;
- 通过 LoRA 等适配器高效微调,定制专属写作风格。
8. 总结与展望
从 RNN 的循环记忆,到 Transformer 的自注意力,再到 GPT 的预测式生成,文本生成技术已从只能拼凑短语发展到能进行长篇创作、逻辑推理和多轮对话。其核心始终是:学会在词的海洋中预测下一个词,而在这个过程中,意外地涌现出理解世界的能力。
当前,我们正迈向可控生成、多模态融合与个性化创作的新阶段。理解其底层原理,能帮助你更好地驾驭这一强大工具,无论是创作内容、开发应用,还是探索人机协作的无限可能。
持续学习建议:亲手运行代码,对比不同解码参数的效果;跟踪最新论文(如 RLHF 对齐技术);深入体验 ChatGPT 和开源模型,实践提示工程。