)
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本篇文章是 AI-For-Beginners 课程体系中「生成式网络Generative Networks」一节的配套 Lab 指南。该 Lab 要求读者自选一本公版书作为数据集训练一个词级word-level文本生成器用 RNN 学会词序并逐词产出新文本。读完本文你将掌握如何获取与预处理文本语料、如何把词序列构造成训练样本、如何用 LSTM 训练语言模型、如何用贪心解码与温度采样两种方式生成文本以及如何结合本仓库的 GenerativePyTorch.ipynb 与 GenerativeTF.ipynb 把词级生成直接落地为可运行代码。本 Lab 是上一课 16-RNN 中字符级生成实验的自然进阶课程正文 17-GenerativeNetworks/README.md 明确说明「In the lab, you will explore word-level text generation」即训练时把整本书按词切分、以词为最小单位建模而不是逐字符生成。任务总览用一本书训练词级生成器Lab 的核心任务只有一句话选取任意一本书作为数据集训练一个词级文本生成器Lab 说明。对比字符级生成词级生成的关键差异体现在三处切分粒度字符级把文本拆成单个字符例如a、 、e词级则用空格/标点感知的分词器切出单词词汇表规模字符级词汇表通常只有几十到上百个 tokenGenerativePyTorch.ipynb 中 AG_NEWS 语料的字符词汇表仅为 82而词级词汇表通常有数千到数万词往往需要min_freq之类的低频词过滤输出单元模型每一步预测的不再是下一个字符而是下一个单词因此生成文本的可读性更高、长度以词为单位统计。在动手前请先通过课程前置测验与配套 notebook 热身课程正文17-GenerativeNetworks/README.mdPyTorch 版本GenerativePyTorch.ipynbTensorFlow 版本GenerativeTF.ipynb公共工具模块torchnlp.py数据集从 Project Gutenberg 获取公版书你可以使用任意一本书作为数据集。公版书Public Domain文本可以合法自由使用其中最方便的免费文本来源是 Project Gutenberg——例如 Lab 中给出的路易斯·卡罗尔的《爱丽丝梦游仙境》直链文本Lab 说明。建议按以下顺序准备数据下载纯文本版在 Project Gutenberg 页面选择Plain Text UTF-8文件避免 HTML 标签混入语料。清理头尾冗余Gutenberg 文本头部通常带项目声明如 The Project Gutenberg eBook...、版权页结尾带许可声明。建议裁剪到正文范围否则模型会学到大量噪声模板。统一换行与空白把多个连续空白符/换行折叠为单个空格保证分词一致性。确定语言如果你的分词器面向英文如torchtext的basic_english请使用英文书籍选用其他语言时需换成对应分词器。注意课程正文与两个 notebook 使用的演示语料是 AG_NEWS 新闻数据集训练时从torchtext.datasets.AG_NEWS(root./data)加载见 torchnlp.py 的load_dataset。Lab 要求你换成一本书核心的建模与训练代码可以完全复用。从字符级到词级改造分词与词汇表字符级怎么做的在 GenerativePyTorch.ipynb 中字符级生成通过自定义分词器把文本切成字符def char_tokenizer(words): return list(words) counter collections.Counter() for (label, line) in train_dataset: counter.update(char_tokenizer(line)) vocab torchtext.vocab.vocab(counter)字符词汇表通常很小示例输出Vocabulary size 82。把文本编码为字符索引后用滑动窗口切出输入-输出对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每个训练样本由nchars个输入 token 与nchars个输出 token 组成输出是输入序列左移一位即用前 n 个字符预测第 2 到第 n1 个字符。词级改造点做词级生成时把上述逻辑做三处替换即可分词器换成词级torchtext内置get_tokenizer(basic_english)或直接用split()按空白切分见 torchnlp.py 的默认 tokenizer。词汇表加低频过滤词级词汇表巨大建议torchtext.vocab.vocab(counter, min_freq2)丢弃只出现 1 次的词并把未知词映射到unk索引torchnlp.py 的encode函数对词典外的词返回unk0。窗口长度以词计把nchars改为nwords如 20~50 个词滑动窗口的步长仍为 1但切分对象是词列表。torchnlp.py 中的encode可以直接复用def encode(x, vocNone, unk0, tokenizertokenizer): v vocab if voc is None else voc if hasattr(v, get_stoi): stoi v.get_stoi() else: stoi v.stoi return [stoi.get(s, unk) for s in tokenizer(x)]模型架构LSTM 生成器GenerativePyTorch.ipynb 给出的生成网络非常简洁class 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 编码喂给 LSTM课程正文 17-GenerativeNetworks/README.md。forward中先one_hot再进 LSTM。输出层Linear(hidden_dim, vocab_size)把 LSTM 每步的隐状态映射回词汇表大小的 logits未归一化分数配合CrossEntropyLoss使用。循环单元可替换课程正文指出生成网络可以基于 simple RNN、LSTM 或 GRU 任一种循环单元本示例选用 LSTMGenerativePyTorch.ipynb。TensorFlow 版本GenerativeTF.ipynb用 Keras Sequential API 表达同一架构model keras.models.Sequential([ keras.layers.Masking(input_shape(None, vocab_size)), keras.layers.LSTM(128, return_sequencesTrue), keras.layers.Dense(vocab_size, activationsoftmax) ]) model.compile(losscategorical_crossentropy)该模型同样以 one-hot 词序列为输入、以「下一词」one-hot 为目标title_batch函数把输入序列整体左移一位并追加eos_token作为目标序列LSTM 隐层维度为 128。训练循环损失计算与采样监视GenerativePyTorch.ipynb 的训练循环与课程此前所有示例几乎相同但用「每 1000 步打印一段生成文本」来代替准确率监控net LSTMGenerator(vocab_size, 64).to(device) samples_to_train 10000 optimizer torch.optim.Adam(net.parameters(), 0.01) loss_fn torch.nn.CrossEntropyLoss() net.train() for i, x in enumerate(train_dataset): # x[0] 是类别标签x[1] 是文本 if len(x[1]) - nchars 10: continue samples_to_train - 1 if not samples_to_train: break text_in, text_out get_batch(x[1]) optimizer.zero_grad() out, s net(text_in) loss torch.nn.functional.cross_entropy(out.view(-1, vocab_size), text_out.flatten()) loss.backward() optimizer.step() if i % 1000 0: print(fCurrent loss {loss.item()}) print(generate(net))训练中的关键细节损失计算cross_entropy的第一个参数是未归一化的网络输出logits第二个参数是目标类别索引out.view(-1, vocab_size)把每个时间步的输出摊平与text_out.flatten()对齐损失自动在 minibatch 内取平均。训练量控制samples_to_train 10000用于限制样本数避免等待过久课程鼓励你把samples_to_train调大或外层套多轮 epoch 以获得更高质量文本。词级 Lab 的调整把输入文本替换为整本书后用上面改造过的词级get_batch生成输入-输出对其余逻辑不变。生成策略一贪心解码Greedy Generation训练完毕后用「提示词 逐词循环」生成文本。PyTorch 的generate函数如下GenerativePyTorch.ipynbdef 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)流程拆解课程正文 17-GenerativeNetworks/README.md把整段start提示词一次性送入网络得到中间状态s与末位的预测分布out用argmax取概率最高的 token 索引nc通过itosindex-to-string映射回词/字符并追加到结果把新 token 作为下一步输入与状态s一起再次送入网络重复size次直到生成足够长度的文本。TensorFlow 版GenerativeTF.ipynb逻辑一致另有一个细节如果预测到eos_token结束符则提前停止生成。贪心解码的问题在课程正文中被明确点出由于每一步都取最高概率生成文本容易在同一段序列上循环例如today of the second the company and a second the company ...原因是概率分布中最高几项差异可能很小——比如预测play后的下一个词时空格与eplayer的开头概率接近——硬取最大值会丢失这些合理的备选。生成策略二温度采样Temperature Sampling / Soft Generation为解决循环问题课程引入温度temperature参数与软生成不取 argmax而是从网络输出的概率分布中采样。温度用于调节分布的「陡峭程度」温度升高使分布趋于平坦更随机温度降低使分布更陡更贴近最高概率词。PyTorch 版实现GenerativePyTorch.ipynbdef 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] # 按概率采样一个 token chars.append(vocab.get_itos()[nc]) out, s net(nc.view(1, -1), s) return .join(chars) for i in [0.3, 0.8, 1.0, 1.3, 1.8]: print(f--- Temperature {i}\n{generate_soft(net, size300, startToday , temperaturei)}\n)TensorFlow 版GenerativeTF.ipynb先对 logits 除以温度再归一化为概率然后用np.random.multinomial采样def generate_soft(model, size100, startToday , temperature1.0): inp tokenizer.texts_to_sequences([start])[0] chars inp for i in range(size): out model(tf.expand_dims(tf.one_hot(inp, vocab_size), 0))[0][-1] probs tf.exp(tf.math.log(out) / temperature).numpy().astype(np.float64) probs probs / np.sum(probs) nc np.argmax(np.random.multinomial(1, probs, 1)) if nc eos_token: break chars.append(nc) inp inp [nc] return decode(chars)温度取值的直觉课程正文对温度的语义作了精确解释17-GenerativeNetworks/README.md温度 T分布形态生成效果T 1.0原始概率分布公平的多项式采样基线随机性词序基本合理T → 0如 0.3分布更陡几乎总是取最高概率接近贪心文本容易循环重复T → ∞如 1.8各 token 概率趋同接近均匀随机文本趋于无意义notebook 中的演示对同一模型分别用 0.3、0.8、1.0、1.3、1.8 采样印证了这一点温度过高时文本失去语义过低时退化为「循环式」硬生成。实践建议词级生成通常从 T0.8~1.2 起步根据可读性与多样性需求微调。课程建议的改进方向课程正文17-GenerativeNetworks/README.md与 notebook 给出了若干可直接用于词级 Lab 的进阶思路更好的 minibatch 构造notebook 指出「一个样本生成一个 minibatch」不理想——各 minibatch 大小不一、短文本可能凑不够nchars个样本、小 batch 也无法充分利用 GPU。更优做法是从所有样本中拼接一大段文本生成全部输入-输出对后洗牌再切成等尺寸的 minibatch。多层 LSTM尝试 2~3 层 LSTM。课程推断字符级生成中低层 LSTM 负责提取音节级模式、高层负责更长程的语义结构词级生成中低层可对应短语/句法局部模式高层对应篇章级主题连贯性。加入eos结束符如果希望生成「有始有终」的文本而非无限生成可以在每个样本末尾追加结束符训练时将其作为目标的一部分TensorFlow 版 notebook 即用eos_token拼在目标序列尾部。更长的训练把samples_to_train上限调大或在最外层套多轮 epoch 循环。环境与依赖运行本 Lab 的两个 notebook 依赖课程 NLP 模块的环境配置PyTorch 路线requirements-pytorch.txt包含torch、torchtext0.9.1、torchinfo、numpy等TensorFlow 路线requirements-tf.txt包含TensorFlow、TensorFlow_datasets、TensorFlow_text等。torchtext在演示中通过torchtext.datasets.AG_NEWS(root./data)自动下载语料到本地./data目录torchnlp.pyLab 只需把这一行替换为读取你本地书籍文本的代码。设备选择由 torchnlp.py 统一处理torch.device(cuda if torch.cuda.is_available() else cpu)无 GPU 时自动回退 CPU 训练此时建议减小nchars/nwords与samples_to_train。小结与延伸阅读本 Lab 把课程中的字符级生成升级为词级生成让你完整走通「语料获取 → 词级切分 → LSTM 语言模型训练 → 贪心/温度采样生成」的全流程。词级生成的意义不止于文本创作课程正文17-GenerativeNetworks/README.md强调从初始特征向量出发生成文本的能力正是机器翻译sequence-to-sequence——编码器状态向量用于解码翻译结果——和图像描述image captioning——CNN 提取的特征向量驱动词序列生成——的底层机制。想要继续深入可以在本仓库中对照上一课 16-RNN 理解 RNN/LSTM/GRU 的单元原理完成 Lab 后自行尝试课程挑战17-GenerativeNetworks/README.md 的 Challenge 与课后测验参考 torchnlp.py 中train_epoch、train_epoch_emb等通用训练工具把 Lab 代码沉淀为可复用模块。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐用 RNN 构建字符级文本生成器AI-For-Beginners 生成式网络Generative Networks实战指南用 RNN 构建字符级文本生成器AI For Beginners 生成式网络Generative Networks实战指南 导读 本文是 AI For B教程人工智能机器学习深度学习Biome Markdown 格式化器列表与缩进代码块组合的稳定性机制与源码解析Biome Markdown 格式化器列表与缩进代码块组合的稳定性机制与源码解析 本篇文章以 Biome 仓库中 Markdown 格式化器的专项回归测试 l教程人工智能机器学习深度学习AI-For-Beginners 实战用 RNN/LSTM 实现字符级文本生成Generative Networks 全解析AI For Beginners 实战用 RNN/LSTM 实现字符级文本生成Generative Networks 全解析 在 AI For Begin教程人工智能机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考