用一个形象的例子来解释 input_ids
、attention_mask
和 labels
在训练过程中的作用和数据流动变化。
场景示例:机器翻译任务
假设我们正在训练一个机器翻译模型,将英文句子翻译成法文。我们有一个句子对:
- 英文(输入): “How are you?”
- 法文(输出): “Comment ça va?”
数据处理和流动
1. 原始数据
我们有如下的原始数据对:
- 输入句子(英文): “How are you?”
- 输出句子(法文): “Comment ça va?”
2. 标记化(Tokenization)
使用 tokenizer 将句子转换为标记(token),并分配唯一的 ID。
英文: "How are you?"
标记化: ["How", "are", "you", "?"]
input_ids: [101, 2026, 2003, 2073, 102]
法文: "Comment ça va?"
标记化: ["Comment", "ça", "va", "?"]
labels: [1055, 3791, 3651, 102]
3. 生成 input_ids
input_ids
是输入序列的标记 ID 列表,用于模型输入。
input_ids: [101, 2026, 2003, 2073, 102]
4. 生成 attention_mask
attention_mask
用于指示模型在处理输入序列时应关注哪些标记。非填充标记的位置为 1,填充标记的位置为 0。
attention_mask: [1, 1, 1, 1, 1]
5. 生成 labels
labels
是目标序列的标记 ID 列表。为了在计算损失时忽略填充标记,填充标记位置的标签被设置为 -100。
labels: [1055, 3791, 3651, 102]
在实际操作中,如果输出序列被填充(padding),则填充标记的位置在 labels
中会被设置为 -100:
假设最大序列长度为 6, 并对输出序列进行填充
填充后的 labels: [1055, 3791, 3651, 102, -100, -100]
6. 数据流动
在训练过程中,数据从原始输入到模型输出的变化流程如下:
- 输入:
- 原始输入(英文): “How are you?”
- 标记化后生成
input_ids
和attention_mask
。
input_ids: [101, 2026, 2003, 2073, 102]
attention_mask: [1, 1, 1, 1, 1]
-
模型处理:
- 模型接收
input_ids
和attention_mask
,并基于这些输入进行前向传播,生成预测的输出序列(法文)。
- 模型接收
-
目标输出:
- 原始输出(法文): “Comment ça va?”
- 标记化后生成
labels
。
labels: [1055, 3791, 3651, 102, -100, -100]
-
损失计算:
- 模型根据预测的输出序列和实际的
labels
计算损失。损失函数会忽略labels
中值为 -100 的位置。
- 模型根据预测的输出序列和实际的
-
反向传播和更新:
- 根据损失值进行反向传播,更新模型参数。
7. 示意图
原始输入(英文): "How are you?" -> 标记化 -> input_ids: [101, 2026, 2003, 2073, 102]
原始输出(法文): "Comment ça va?" -> 标记化 -> labels: [1055, 3791, 3651, 102]
模型输入:
input_ids: [101, 2026, 2003, 2073, 102]
attention_mask: [1, 1, 1, 1, 1]
模型预测: [1055, 3791, 3651, 102] (与 labels 比较)
损失计算:
labels: [1055, 3791, 3651, 102, -100, -100]
忽略 -100 部分,计算损失
反向传播: 根据损失更新模型参数
通过这个形象的例子,可以更清楚地了解 input_ids
、attention_mask
和 labels
在训练过程中的作用和数据流动变化。这些元素共同作用,使得模型能够在训练过程中学习输入和输出之间的映射关系。