☰
AI-For-Beginners 实战指南:基于 Hugging Face Transformers 的实验、文本生成与 Notebook 整理
2026/10/11 18:11:38 网站建设 项目流程
  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

本指南围绕课程《AI-For-Beginners》第 18 课的课后任务(assignment.md)展开,讲解如何上手 Hugging Face 的 Transformers 库:运行官方示例脚本、调用预训练模型与数据集,并把课程自带数据集或 Kaggle 数据导入实验,最终完成"生成有趣文本"的实验并整理成可复现的 Notebook。读完本文,你将掌握一条完整的动手路径:从加载 BERT 等预训练模型、微调文本分类,到尝试文本生成脚本与数据导入,再到用 Notebook 沉淀实验结论。

一、任务全景:本次实验到底要做什么

课程第 18 课《Attention Mechanisms and Transformers》(见 README.md)布置的实验任务(原文见 assignment.md)可以拆解为五个核心步骤:

  1. 体验 Transformers 库:使用 Hugging Face 的transformers库,运行其官方文档中提供的 run_scripts 系列示例脚本,与站点上发布的各类预训练模型进行交互。
  2. 试用官方数据集:从 Hugging Face Datasets 中挑一个数据集完成一个实验(如文本分类、文本生成前的数据准备)。
  3. 导入自有数据:把本课程中用过的数据集(例如 AG News)或从 Kaggle 下载的数据集引入实验。
  4. 尝试文本生成:在自有数据基础上,观察能否通过预训练语言模型(或微调后的模型)生成出有趣、连贯的文本。
  5. 沉淀 Notebook:把数据准备、模型加载、训练/推理与生成结果整理成一个 Notebook,记录发现与结论。

这一任务的设计意图是:先"站在巨人的肩膀上"用现成脚本快速跑通,再逐步替换数据源、深入生成任务,最终把整个实验过程变成可复现、可分享的研究记录。

二、实验前置知识:Transformer 为什么值得"玩"

实验依赖的课程背景知识(详见 README.md)包含几个关键概念,理解它们才能解释实验中观察到的现象:

  • 从 RNN 到注意力机制:传统的 sequence-to-sequence 模型由编码器(encoder)与解码器(decoder)两个循环网络构成,编码器把输入序列压缩成一个隐藏状态,解码器再把它展开为翻译结果。这种方式有两个缺陷:编码器末端的隐藏状态难以记住长句的开头;且序列中所有词对结果的影响被一视同仁。**注意力机制(Attention)**通过在输入 RNN 的中间状态与输出 RNN 之间建立"捷径",让生成第 t 个输出符号时,以权重系数 α_{t,i} 综合参考所有输入隐藏状态 h_i。
  • 位置编码(Positional Encoding/Embedding):注意力不再像 RNN 那样按时间步逐步推进,因此必须显式地把 token 在序列中的相对位置注入模型。方法是对 token 序列附加 0, 1, 2, … 的位置序列,再通过可训练的 Embedding 层(或原论文中固定的位置编码函数)把位置整数变成向量,与 token 嵌入向量相加,从而同时表达"是什么词"和"在哪个位置"。
  • 多头自注意力(Multi-Head Self-Attention):自注意力把注意力作用在"输入序列与输出序列相同"的序列上,从而捕捉句内上下文,比如指代关系(coreference,如 it 指代谁)。多头机制让网络同时学习多种依赖关系(长期 vs 短期词依赖、指代关系等)。
  • BERT 与迁移学习:BERT(Bidirectional Encoder Representations from Transformers)是超大规模多层 Transformer 网络,BERT-base 12 层、BERT-large 24 层。它先在 Wikipedia 与图书等大规模语料上以无监督方式预训练(预测句中被掩码的词),再把学到的语言理解通过微调(fine-tuning)迁移到下游任务,即所谓的迁移学习(transfer learning)。

Transformer 因每个输入位置可独立映射到输出位置,训练时比 RNN 更容易并行化,这也是它能支撑 BERT、GPT 等大规模语言模型的关键。理解了以上原理,实验中诸如"为什么微调只需要很小的学习率""为什么生成时要关注位置与注意力"等问题就有了答案。

三、环境准备与 Transformers 库的两种加载方式

3.1 安装与导入

transformers库可与 PyTorch、TensorFlow 搭配使用,课程分别提供了两份可直接运行的 Notebook:TransformersPyTorch.ipynb 与 TransformersTF.ipynb。两份 Notebook 的第一步都是:

import transformers

3.2from_pretrained的两种加载方式

Notebook 中明确说明(见 TransformersPyTorch.ipynb):Hugging Face 库内含预训练模型仓库,只要把模型名作为参数传给from_pretrained函数,模型所需的全部二进制文件就会自动下载;如果加载自己的模型,则可以指定一个本地目录,目录中包含 tokenizer 参数、config.json模型配置与二进制权重等文件。两种方式在代码上的区别如下:

# 方式一:从互联网模型仓库按名称加载(推荐在自有 Notebook 环境使用) bert_model = 'bert-base-uncased' # 方式二:从磁盘目录加载(适用于已经准备好全部模型文件的离线环境) # bert_model = './bert' tokenizer = transformers.BertTokenizer.from_pretrained(bert_model)

配套的 tokenizer 同样通过from_pretrained加载。PyTorch 版 Notebook 还展示了 tokenizer 的基本用法:

MAX_SEQ_LEN = 128 PAD_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.pad_token) UNK_INDEX = tokenizer.convert_tokens_to_ids(tokenizer.unk_token) tokenizer.encode('PyTorch is a great framework for NLP') # 输出示例:[101, 1052, 22123, 2953, ..., 102] # 其中 101 对应 [CLS] 起始符,102 对应 [SEP] 分隔符,中间为子词 ID 序列

TensorFlow 版 Notebook 还演示了用return_tensors='tf'直接得到可直接喂给模型的张量字典(TransformersTF.ipynb):

tokenizer(['Hello, there'], return_tensors='tf') # 返回 {'input_ids': ..., 'token_type_ids': ..., 'attention_mask': ...}

attention_mask用于区分真实 token 与 padding token,是后续实验中理解输入格式的重要字段。

四、复现课程 Notebook:PyTorch 版 BERT 文本分类微调

这是任务中"运行官方脚本、熟悉库"的最佳起点——课程已把完整流程封装在 Notebook 与辅助脚本中,可先跑通再替换数据。

4.1 数据加载与编码

PyTorch 版依赖同目录下的 torchnlp.py 工具模块。其中load_dataset()使用torchtext.datasets.AG_NEWS加载 AG News 新闻分类数据集(类别为 World、Sports、Business、Sci/Tech),并用collections.Counter统计词频构建词表;encode()把文本行转换为词表 ID 序列。Notebook 中直接调用:

import torch import torchtext from torchnlp import * import transformers train_dataset, test_dataset, classes, vocab = load_dataset() vocab_len = len(vocab)

由于 BERT 使用自己的分词器,Notebook 重新定义了类似padify的填充函数pad_bert,把 batch 内序列统一填充到同一长度,再用DataLoader组织批次:

def pad_bert(b): # b 是长度为 batch_size 的元组列表: # 元组第一个元素是标签,第二个元素是文本序列 v = [tokenizer.encode(x[1]) for x in b] l = max(map(len, v)) return ( torch.LongTensor([t[0] for t in b]), torch.stack([torch.nn.functional.pad(torch.tensor(t), (0, l - len(t)), mode='constant', value=0) for t in v]) ) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=8, collate_fn=pad_bert, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=8, collate_fn=pad_bert)

4.2 加载分类模型并微调

加载BertForSequenceClassification时,Notebook 特别说明:加载日志会提示最终分类器权重未初始化、需要重新训练——这完全正常,因为我们要做的正是针对 4 分类任务微调这个头部:

model = transformers.BertForSequenceClassification.from_pretrained(bert_model, num_labels=4).to(device)

微调阶段的关键细节是:BERT 已经预训练过,必须用小学习率(lr=2e-5)以免破坏初始权重。训练循环中,模型一次返回(loss, out),loss 用于反向传播,out通过argmax得到预测标签用于计算准确率:

optimizer = torch.optim.Adam(model.parameters(), lr=2e-5) report_freq = 50 iterations = 500 # 想训练更久就调大这个值 model.train() i, c = 0, 0 acc_loss = 0 acc_acc = 0 for labels, texts in train_loader: labels = labels.to(device) - 1 # 将标签归一化到 0-3 texts = texts.to(device) loss, out = model(texts, labels=labels)[:2] labs = out.argmax(dim=1) acc = torch.mean((labs == labels).type(torch.float32)) optimizer.zero_grad() loss.backward() optimizer.step() acc_loss += loss acc_acc += acc i += 1 c += 1 if i % report_freq == 0: print(f"Loss = {acc_loss.item()/c}, Accuracy = {acc_acc.item()/c}") c = 0 acc_loss = 0 acc_acc = 0 iterations -= 1 if not iterations: break

4.3 评估与结论

评估循环与训练循环类似,但必须用model.eval()切换到评估模式。Notebook 中 100 个 batch 的评估结果约为Final accuracy: 0.9047。Notebook 的总结(见 TransformersPyTorch.ipynb)给出了两个对实验设计很有价值的结论:

  • BERT 已经较好理解语言结构,只需微调最终分类器就能取得不错准确率;但因为模型很大,完整训练耗时且需要较强算力(GPU,最好多卡)。
  • 本实验用的是最小的预训练 BERT 之一,更大的模型通常效果更好——这为任务中"尝试不同模型"留下了探索空间。

五、TensorFlow 版对照实验:自建 Transformer 层与冻结微调

TransformersTF.ipynb 提供了两个层次的实验,可作为任务中"尝试脚本"的素材。

5.1 自建简单 Transformer 模型

Keras 没有内置 Transformer 层,Notebook 用子类化Layer的方式实现两个核心组件:

  • TokenAndPositionEmbedding:内含 token Embedding 与位置 Embedding 两个层,用tf.range生成 0 到maxlen的位置序列,两个嵌入向量相加得到带位置信息的表示。
  • TransformerBlock:对输入施加MultiHeadAttention(以输入自身作为 query/key/value,即自注意力),经 Dropout 后与输入残差相加并做LayerNormalization,再通过两层的 FFN(Dense-relu-Dense)并再次残差+归一化。Notebook 注释指出LayerNormalization与视觉课程中的BatchNormalization相似,但它是按每个训练样本独立归一化输出。

完整模型把 TextVectorization → TokenAndPositionEmbedding → TransformerBlock → GlobalAveragePooling1D → Dense 头串起来(embed_dim=32、num_heads=2、ff_dim=32、maxlen=256、vocab_size=20000),在 AG News 上训练即可看到验证准确率接近 0.91。这段代码正是理解"Transformers 如何吃文本"的最小实现,也印证了任务前置知识中"位置编码 + 自注意力"两个核心思想。

5.2 用 TF-BERT 做微调并冻结骨干

Notebook 还演示了TFBertForSequenceClassification.from_pretrained(bert_model, num_labels=4, output_attentions=False)加载 BERT 分类器。model.summary()显示模型总参数量约109,485,316(接近 1.1 亿);如果只希望在相对小的数据集上做简单分类,可以冻结 BERT 主干、只训练分类头:

model.layers[0].trainable = False model.summary() # Trainable params 降为 3,076

随后用model.compile('adam', 'sparse_categorical_crossentropy', ['acc'])编译,并通过tf.py_function把tokenizer.encode包装进 TensorFlow 数据管道(process_fn中拼接 title 与 description,按MAX_SEQ_LEN填充与截断)。Notebook 提示:完整训练 BERT 非常耗时,示例中只训练前 32 个 batch 用于演示;如要完整训练,去掉steps_per_epoch与validation_steps参数即可。PyTorch 与 TF 两个 Notebook 的结论一致:Transformer 模型是目前 NLP 的主流方案,实现自定义 NLP 解决方案时应首先考虑。

六、任务第二站:跑通 run_scripts 示例脚本与文本生成

任务要求"尝试 Hugging Face 官方文档中的 run_scripts 示例脚本"。该页面汇集了针对各类模型任务的现成脚本(文本分类、问答、文本生成、翻译等),它们通常遵循同一套模式,与课程 Notebook 展示的 API 风格一致:

  1. 用AutoTokenizer.from_pretrained(...)或具体分词器类加载 tokenizer;
  2. 用AutoModelForXxx.from_pretrained(...)(或 BERT 等具体类)加载模型;
  3. 对输入文本编码后前向推理,解码输出。

针对"生成有趣文本"这一目标,典型的生成实验脚本骨架如下(这是任务要求的通用 API 用法模板,可参照 run_scripts 页面调整参数):

from transformers import AutoTokenizer, AutoModelForCausalLM model_name = 'gpt2' # 或任何可用的因果语言模型 tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) prompt = 'The future of artificial intelligence is' inputs = tokenizer(prompt, return_tensors='pt') outputs = model.generate( **inputs, max_new_tokens=50, do_sample=True, # 采样式生成,而非贪心 temperature=0.9, # 控制随机性 top_p=0.95, # 核采样 num_return_sequences=3 # 生成多条候选 ) for seq in outputs: print(tokenizer.decode(seq, skip_special_tokens=True))

也可以先用pipeline('text-generation', model=model_name)快速体验,再切换到脚本式写法以精确控制采样参数。实验记录时应重点观察:不同temperature/top_p下文本的多样性与连贯性变化,以及换用不同规模模型(如从 base 到更大模型)时生成质量的变化——这与课程 README 中"更大模型通常效果更好"的提示相呼应。

七、任务第三站:导入课程数据集或 Kaggle 数据

任务要求"使用官方数据集之后,再导入一个自己的数据集(来自本课程或 Kaggle)",并尝试用其生成文本。数据来源可以这样选:

  • 课程自带数据:
    • AG News 新闻语料(torchnlp.py 中通过torchtext.datasets.AG_NEWS加载,也可在 TensorFlow 版用tensorflow_datasets的ag_news_subset);
    • 仓库 data/mnist.pkl.gz 中的 MNIST 数据集(更适用于图像任务,若做纯文本生成可优先选文本类数据)。
  • Kaggle 数据:下载 CSV/JSON 格式的文本语料(如新闻、对话、影评、推文等),用 pandas 读取后按"文本列 → 字符串序列"处理即可接入与上面相同的数据管道。

以文本生成为目标的实验,建议把数据整理为纯文本序列(按行或按段落切分),然后按"训练集微调语言模型 → 用前缀提示生成续写"的流程执行。课程 Notebook 中pad_bert/process_fn这类"文本 → 定长 ID 张量"的处理逻辑,可以原样复用到生成任务的数据准备阶段;唯一的差别是生成任务通常不需要标签列。

八、任务收尾:用 Notebook 沉淀实验发现

任务要求"撰写一份记录发现的 Notebook",建议按以下结构组织,确保他人可复现、可引用:

  1. 实验目标:一句话说明要验证的问题(例如"预训练 GPT 模型在课程新闻语料上微调后,能否生成风格相近的新闻文本")。
  2. 环境与依赖:列出transformers、torch/tensorflow及数据集加载方式,参考 requirements.txt 与 environment.yml 中的依赖组织。
  3. 数据准备:官方数据集与自有数据各自的加载、清洗、编码代码,以及样本展示。
  4. 模型加载与微调/推理:from_pretrained加载、微调训练循环(可复用第 4、5 节的代码骨架)、评估结果。
  5. 生成实验:不同采样参数(temperature、top_p、max_new_tokens)下生成的文本对照,截图或文本块记录。
  6. 结论与反思:回答任务原问题"能否生成有趣文本",总结哪些设置有效、哪些失败,并给出下一步改进方向(换更大模型、增加微调数据、调整超参数)。

Notebook 中尤其值得记录三类"发现":模型加载时输出的权重初始化警告及其含义、微调学习率对结果的影响、采样参数与生成质量的关系。这些都是任务评分与后续深入研究中最有价值的内容。

九、常见问题与资源索引

  • 模型加载失败:检查模型名是否正确、网络是否可达;离线环境改用本地目录方式(bert_model = './bert'),目录内需包含 tokenizer 文件、config.json与权重文件(见 TransformersPyTorch.ipynb 中的说明)。
  • 训练太慢:BERT 参数量大,课程 Notebook 均提示训练耗时与算力需求;TF 版可通过model.layers[0].trainable = False冻结骨干,PyTorch 版可减小iterations。
  • 加载时出现"分类器权重未初始化"警告:这是BertForSequenceClassification的预期行为,微调正是为了训练这部分权重,无需担心。
  • 想深入学习原理:课程 README(lessons/5-NLP/18-Transformers/README.md)整理了注意力与 Transformer 的完整讲解及复习资料;两份 Notebook 分别给出了 PyTorch 与 TensorFlow 的完整实现,可对照阅读。

通过"官方脚本快速上手 → 课程 Notebook 复现 → 自有数据生成实验 → Notebook 沉淀结论"这条路径,你既能完成课程任务,也掌握了后续独立开展 NLP 实验的完整工作流。

  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询