AI-For-Beginners 第17课实验:基于 RNN 的词级文本生成实战指南

发布时间:2026/10/3 13:43:29
AI-For-Beginners 第17课实验:基于 RNN 的词级文本生成实战指南 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载导读本文面向正在学习 AI-For-Beginners 课程第 17 课生成式网络 / Generative Networks的读者完整展开课程实验Lab任选一本书作为数据集训练一个词级word-level文本生成器。你将掌握从字符级生成升级到词级生成的完整思路包括语料获取、词级分词与词汇表构建、训练样本滑动窗口序列构造、LSTM 生成网络搭建、训练与采样评估以及用 temperature 参数控制文本生成软硬程度的实用技巧。实验背景从 RNN 到生成式任务本实验对应的讲义是 lessons/5-NLP/17-GenerativeNetworks/README.md。在上一课 lessons/5-NLP/16-RNN/README.md 中我们已经学习了循环神经网络RNN及其门控变体 LSTM、GRU它们能学习词的顺序信息并为序列中的下一个元素给出预测。这正是生成式任务的基石。RNN 之所以能做生成关键在于让每个循环单元除了输出隐状态外再输出一个序列元素从而形成四种典型架构见讲义 images/unreasonable-effectiveness-of-rnn.jpgone-to-one经典的单输入单输出神经网络one-to-many输入一个值生成一串输出例如图像描述image captioning——图片经 CNN 得到隐状态后由循环链逐词生成描述文字many-to-one上一课讲过的文本分类等序列分类任务many-to-many / sequence-to-sequence例如机器翻译前一个 RNN 把输入序列的全部信息压缩进隐状态后一个 RNN 链把它展开成输出序列。本课聚焦最朴素的生成式模型——文本生成。为了简单起见讲义与配套笔记本首先实现了**字符级character-level**生成把文本按单个字符切分在每个训练步取长度为nchars的字符序列输入网络并要求网络为每个输入字符预测下一个输出字符。在推断生成阶段先从一个prompt起始串出发让 prompt 依次通过 RNN 单元得到中间状态然后从该状态开始逐字符自回归生成每生成一个字符就把该字符与当前状态一起喂回 RNN 单元得到下一个字符如此反复直到生成足够长的文本。本实验正是在字符级生成的基础上把 token 粒度从字符换成单词训练一个词级文本生成器。实验任务实验任务原文见 lessons/5-NLP/17-GenerativeNetworks/lab/README.md在本实验中你需要任选一本书将其作为数据集训练一个词级文本生成器。任务的本质是把课程中学到的 RNN 生成机制应用到词级粒度上词汇表由单词而非字符构成模型学习的是给定前面若干个词下一个最可能出现的词是什么。数据集任选一本书实验中明确说明数据集可以自由选择你可以使用任何一本书。你可以在 Project Gutenberg 找到大量免费文本例如这里有一个刘易斯·卡罗尔《爱丽丝梦游仙境》的直接链接。实操建议到 Project Gutenberg 选择任意一本公版书例如《爱丽丝梦游仙境》的纯文本文件11-0.txt下载纯文本后阅读、清洗文本去除卷首目录、卷尾版权声明等非正文内容将文本按段落或句子整理为若干行作为后续分词与建词汇表的输入。选择文本时需要注意词级模型的学习目标比字符级模型更稀疏——每个 token 是一个完整的词因此语料长度直接决定词汇覆盖率和生成质量建议选择篇幅足够长的书籍。构建词级词汇表课程在字符级生成中用list(words)把文本切分成单字符见 GenerativePyTorch.ipynb 中的char_tokenizer。而本实验要做词级生成需要把切分粒度换成单词。仓库中的 torchnlp.py 为我们展示了词级处理的标准做法该文件本是课程用于文本分类的辅助模块但其分词与建词表思路可直接复用到本实验import torchtext import collections # 使用 torchtext 自带的英文基础分词器 tokenizer torchtext.data.utils.get_tokenizer(basic_english) counter collections.Counter() for line in corpus_lines: counter.update(tokenizer(line)) # 用 min_freq 过滤低频词控制词汇表规模 vocab torchtext.vocab.vocab(counter, min_freqmin_freq)关键点basic_english分词器会把句子拆成小写单词序列天然适合英文书籍语料min_freq参数用于过滤出现次数过少的单词防止词汇表被拼写错误、罕见专有名词撑爆同时把低频噪声排除在训练目标之外在 GenerativePyTorch.ipynb 的字符级示例中语料构建出的字符词汇表大小只有 82Vocabulary size 82而词级词汇表通常有数万个词这是词级模型与字符级模型最大的差异之一也解释了为什么需要min_freq这类剪枝手段用vocab.get_stoi()词 → 索引与vocab.get_itos()索引 → 词即可完成编码与解码字符级例子中的encode逻辑把 token 映射为索引、未知 token 映射为unk0在词级同样适用。构造训练样本滑动窗口与右移一位目标无论字符级还是词级训练数据构造的核心方法完全一致对每段文本取固定长度nchars的窗口输入序列为s[i:inchars]目标输出为右移一位的s[i1:inchars1]。字符级笔记本中的实现如下词级只需把字符换成词索引nchars 100 def get_batch(s, ncharsnchars): ins torch.zeros(len(s)-nchars, nchars, dtypetorch.long, devicedevice) outs torch.zeros(len(s)-nchars, nchars, dtypetorch.long, devicedevice) for i in range(len(s)-nchars): ins[i] enc(s[i:inchars]) outs[i] enc(s[i1:inchars1]) return ins, outs要点一段长度为l的文本能切出l-nchars个输入-输出对它们共同构成一个 minibatch因此不同 minibatch 的大小天然不同词级实验中nchars的含义从字符数变为词数通常取 50~100 个词即可不必像字符级那样取几百也可参考 TensorFlow 笔记本 GenerativeTF.ipynb 的title_batch先texts_to_sequences编码再pad_sequences对齐长度最后 one-hot 编码输入、对目标做右移 末尾补eos处理。TF 版本还演示了用tf.py_function包装 Pythonic 转换逻辑使其能在Dataset.map中以 TensorFlow 计算图方式执行从而利用 GPU 加速数据管线。搭建生成网络LSTM 生成器因为 token 索引不能直接送入 RNN所以输入要先经 one-hot 编码输出侧用一个线性层把隐状态映射回词汇表大小的概率分布。PyTorch 版本GenerativePyTorch.ipynb的LSTMGeneratorclass LSTMGenerator(torch.nn.Module): def __init__(self, vocab_size, hidden_dim): super().__init__() self.rnn torch.nn.LSTM(vocab_size, hidden_dim, batch_firstTrue) self.fc torch.nn.Linear(hidden_dim, vocab_size) def forward(self, x, sNone): x torch.nn.functional.one_hot(x, vocab_size).to(torch.float32) x, s self.rnn(x, s) return self.fc(x), s设计说明字符/词级任务词汇表相对可控不需要 embedding 层one-hot 输入可直接进 LSTMfc输出的 logits 之后交给CrossEntropyLoss它在内部完成 softmax 与损失计算换成多层 LSTM只需给torch.nn.LSTM(..., num_layers2)传参换成 GRU 只需替换torch.nn.GRU这是课程明确建议的实验方向。TensorFlow 版本GenerativeTF.ipynb的模型model keras.models.Sequential([ keras.layers.Masking(input_shape(None, vocab_size)), keras.layers.LSTM(128, return_sequencesTrue), keras.layers.Dense(vocab_size, activationsoftmax) ])其中return_sequencesTrue让 LSTM 输出每个时间步的结果而不仅是最后一步这是生成网络与分类网络的关键区别Masking层用于屏蔽 padding 部分避免其对损失产生影响。笔记本中训练出的模型约 12 万参数loss: 1.5385说明词字符级生成模型体量并不大。训练循环与采样评估训练时没有准确率这类直观指标最好的观察手段是周期性采样生成的文本PyTorch 版本中训练循环主体为取一批输入 → 前向传播 → 用cross_entropy(out.view(-1, vocab_size), text_out.flatten())计算损失 → 反向传播 → 每 1000 步打印当前 loss 并调用generate(net)展示采样结果。训练早期生成文本会退化为重复字符如sr sr sr sr...随后逐渐出现可读的词串如today and the company to the company...这是梯度下降正在学到词序规律的直接证据。实验中用samples_to_train限制训练样本数以缩短等待时间并鼓励读者多跑几个 epoch。硬生成贪心解码的实现PyTorchdef generate(net, size100, starttoday ): chars list(start) out, s net(enc(chars).view(1, -1).to(device)) for i in range(size): nc torch.argmax(out[0][-1]) chars.append(vocab.get_itos()[nc]) out, s net(nc.view(1, -1), s) return .join(chars)TF 版本则在训练时通过keras.callbacks.LambdaCallback(on_epoch_end...)注册采样回调并在generate中检测到eostoken 时提前终止生成。软文本生成与 temperature让生成文本更活讲义与两个笔记本共同强调了一个关键痛点如果每次都取概率最高的 token贪心生成文本会陷入循环例如today of the second the company and a second the company ...原因在于多个候选 token 的概率往往非常接近例如在play之后空格和e都可能是合理的下一个字符。因此更明智的做法是按网络输出的概率分布采样并引入一个超参数temperature温度来控制采样的软硬程度。PyTorch 的软生成实现def generate_soft(net, size100, starttoday , temperature1.0): chars list(start) out, s net(enc(chars).view(1, -1).to(device)) for i in range(size): out_dist out[0][-1].div(temperature).exp() nc torch.multinomial(out_dist, 1)[0] chars.append(vocab.get_itos()[nc]) out, s net(nc.view(1, -1), s) return .join(chars)原理与效果temperature 1.0等价于公平的 multinomial 采样temperature → ∞所有 token 概率趋于相等退化为完全随机选字符temperature → 0分布越来越陡逼近贪心解码文本重新变得循环化。笔记本中的实际采样对比generate_soft(net, size300, startToday , temperaturei)i 取 0.3、0.8、1.0、1.3、1.8清晰展示了这一规律temperature 0.3时文本高度重复、接近循环temperature 1.0左右文本连贯性与创造性平衡最佳temperature 1.8时文本明显失去语义、变得混乱。TF 版本用probs tf.exp(tf.math.log(out)/temperature)归一化后配合np.random.multinomial(1, probs, 1)完成同样的采样。实验建议读者在词级生成器上同样实现generate_soft并扫描多组 temperature 值对比输出质量。进阶优化方向课程在两个笔记本的结尾给出了明确的改进清单本实验的完成度可以据此衡量更好的 minibatch 构造目前一个样本只产出一个大小不固定的 minibatch且短文本甚至无法切出足够样本。更优做法是从所有样本拼出一大块文本切出全部输入-输出对后打乱再生成大小一致的 minibatch以充分利用 GPU多层 LSTM2~3 层 LSTM 可分层提取模式——底层负责音节/词形高层负责词与词组搭配直接给 LSTM 构造器传num_layers即可RNN 单元与隐藏层大小实验比较 LSTM 与 GRU 的效果隐藏层过大易过拟合网络直接背下原文过小则生成质量不足TF 版本特有使用更长的正文标题语料过短可改用全书文本并把序列切分为固定长度如 256的子段。运行环境与动手路径本实验对应的两个课程笔记本可直接运行GenerativePyTorch.ipynbPyTorch与 GenerativeTF.ipynbTensorFlow建议先在笔记本中跑通字符级流程再替换为词级 tokenizer 与书籍语料完成本实验词级分词、词表构建可复用 torchnlp.py 中的tokenizer、vocab、encode等工具其中min_freq参数对控制词级词汇表规模至关重要环境依赖见仓库根目录的 requirements.txt 与 environment.yml可用 Binder 在线启动见 binder/postBuild.sh 配置推荐的完整实验路径下载书籍 → 清洗语料 → 词级分词建词表 → 滑动窗口构造训练对 → 搭建 LSTM 生成器 → 训练并周期性采样 → 实现generate_soft调 temperature → 对照改进清单迭代。结语词级文本生成是理解现代语言模型生成机制的重要一步它和字符级生成共享滑动窗口 右移目标 自回归解码 温度采样这套完整范式区别仅在于 token 粒度与词汇表规模。完成本实验后你便掌握了文本生成任务从数据准备、模型训练到可控解码的端到端能力这也为你进一步理解机器翻译sequence-to-sequence与图像描述等更复杂的生成式任务打下了基础。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI-For-Beginners 第 17 课基于 RNN/LSTM 的生成式网络——字符级文本生成与温度采样实战AI For Beginners 第 17 课基于 RNN/LSTM 的生成式网络——字符级文本生成与温度采样实战 本课是 AI For Beginners教程人工智能机器学习深度学习Biome Markdown 格式化器列表与缩进代码块组合的稳定性机制与源码解析Biome Markdown 格式化器列表与缩进代码块组合的稳定性机制与源码解析 本篇文章以 Biome 仓库中 Markdown 格式化器的专项回归测试 l教程人工智能机器学习深度学习AI-For-Beginners 第 18 课实战基于 Hugging Face Transformers 的微调与文本生成实验AI For Beginners 第 18 课实战基于 Hugging Face Transformers 的微调与文本生成实验 本任务隶属于 AI For教程人工智能机器学习深度学习上一篇OpenArm 单边遥操作Unilateral Control实战指南多线程架构、摩擦补偿模型与 launch_unilateral.sh 运行详解下一篇rsuite Heading 标题组HeadingGroup实战使用 Heading Text 构建带副标题的文档标题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询