自动模型方式 - 完形填空任务
1 课程概览
本课讲解自动模型方式进行完形填空。完形填空也叫遮蔽语言建模任务。使用中括号 <tool_call> 占位符填词。优化:定义变量记录模型名,避免写两次路径。使用 Chinese BERT WWM 模型。encode_plus() 是增强编码,参数更少。
2 核心概念与定义
- 完形填空(Fill-Mask):遮蔽语言建模任务,预测 <tool_call> 位置的词。
- encode_plus():增强编码,参数更少。
- model_name:定义变量记录模型名,避免写两次路径。
3 模型与算法详解
优化:定义变量记录模型名
避免写两次路径,方便切换模型。
model_name = "chinese-bert-wwm"
my_tokenizer = AutoTokenizer.from_pretrained(model_name)
my_model = AutoModel.from_pretrained(model_name)
完形填空流程
0. 定义变量记录模型名
1. 加载 Tokenizer(分词器)
2. 加载模型
3. 文本转张量
4. 送给模型
5. 输出结果
模型选择
使用 Chinese BERT WWM 模型。
| 任务 | 模型 |
|---|---|
| 完形填空 | chinese-bert-wwm |
encode_plus() vs encode()
| 函数 | 说明 |
|---|---|
encode_plus() | 增强编码,参数更少 |
encode() | 基本编码 |
<tool_call> 占位符
<tool_call> 是一个 token,不会被拆成多个。
- 101:开始标志
- 102:结束标志
- <tool_call>:一个 token(不会被拆成六个)
4 数学原理与推导
完形填空
$$P(w_{\text{mask}}) = \text{model}(\text{input_ids}, \text{attention_mask})$$
其中:
- $\text{input_ids}$ 包含 <tool_call> 的 id
- $w_{\text{mask}}$ 是预测的词
文本转张量
$$\text{input} = \text{tokenizer}.\text{encode_plus}(\text{text}, \text{return_tensors}='pt')$$
5 代码示例
import torch
from transformers import AutoModel, AutoTokenizer
def dm03_fill_mask():
"""自动模型方式:完形填空"""
# 0. 定义变量记录模型名(避免写两次路径)
model_name = "C:/software/softwallg/pretrained_model/chinese-bert-wwm"
# 1. 加载 Tokenizer(分词器)
my_tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2. 加载模型
my_model = AutoModel.from_pretrained(model_name)
# 3. 文本转张量
text = "我想明天去<tool_call>家吃饭"
input_data = my_tokenizer.encode_plus(
text, # 待处理的文本
return_tensors='pt' # 返回二维张量
)
print(f"输入文本: {text}")
print(f"输入张量: {input_data}")
# 4. 送给模型
my_model.eval()
with torch.no_grad():
output = my_model(**input_data)
print(f"输出结果: {output}")
return my_model
# 测试
if __name__ == "__main__":
print("=== 自动模型方式:完形填空 ===")
model = dm03_fill_mask()
代码说明
| 代码 | 说明 |
|---|---|
model_name | 定义变量记录模型名 |
AutoTokenizer.from_pretrained(model_name) | 加载分词器 |
AutoModel.from_pretrained(model_name) | 加载模型 |
encode_plus(text, return_tensors='pt') | 增强编码 |
my_model(**input_data) | 送给模型 |
6 重难点与易错提醒
- ❗重点:定义变量记录模型名,避免写两次路径。
- ❗重点:encode_plus() 是增强编码,参数更少。
- ❗重点:<tool_call> 是一个 token,不会被拆成多个。
- ⚠️易错:101 是开始标志,102 是结束标志。
7 课堂问答精选
Q1:为什么要定义变量记录模型名?
A:避免写两次路径,方便切换模型。只需修改一处,上下都生效。
Q2:encode_plus() 和 encode() 有什么区别?
A:encode_plus() 是增强编码,参数更少,使用更方便。本质上都是做编码。
Q3:<tool_call> 会被拆成多个 token 吗?
A:不会。<tool_call> 是一个 token,不会被拆成多个。
Q4:101 和 102 分别代表什么?
A:101 是开始标志,102 是结束标志。
8 本课小结
- 完形填空:遮蔽语言建模任务。
- 优化:定义变量记录模型名,避免写两次路径。
- 使用 encode_plus() 增强编码。
- 使用 Chinese BERT WWM 模型。
- <tool_call> 是一个 token,不会被拆成多个。
9 延伸思考
- 自动模型方式如何进行阅读理解?
- 阅读理解任务有什么细节?