填充和截断
批次输入通常具有不同的长度,因此不能直接转换为固定大小的张量。填充和截断是解决此问题的策略,用于从不同长度的批次创建矩形张量。填充添加一个特殊的 **填充标记** 以确保较短的序列与批次中最长的序列或模型接受的最大长度具有相同的长度。截断则通过截断长序列以相反的方向工作。
在大多数情况下,将你的批次填充到最长序列的长度,并将长度截断到模型可以接受的最大长度,效果相当好。但是,如果你需要更多策略,API 也支持。你需要了解的三个参数是:padding
、truncation
和 max_length
。
padding
参数控制填充。它可以是布尔值或字符串
True
或'longest'
:填充到批次中最长的序列(如果你只提供一个序列,则不会应用填充)。'max_length'
:填充到由max_length
参数指定的长度,或者如果未提供max_length
(max_length=None
),则填充到模型接受的最大长度。如果你只提供一个序列,仍然会应用填充。False
或'do_not_pad'
:不应用填充。这是默认行为。
truncation
参数控制截断。它可以是布尔值或字符串
True
或'longest_first'
:截断到由max_length
参数指定的最大长度,或者如果未提供max_length
(max_length=None
),则截断到模型接受的最大长度。这将逐个标记进行截断,从最长的序列中移除标记,直到达到合适的长度。'only_second'
:截断到由max_length
参数指定的最大长度,或者如果未提供max_length
(max_length=None
),则截断到模型接受的最大长度。如果提供了一对序列(或一对序列的批次),这将只截断第二句话。'only_first'
:截断到由max_length
参数指定的最大长度,或者如果未提供max_length
(max_length=None
),则截断到模型接受的最大长度。如果提供了一对序列(或一对序列的批次),这将只截断第一句话。False
或'do_not_truncate'
:不应用截断。这是默认行为。
max_length
参数控制填充和截断的长度。它可以是整数或 None
,在这种情况下,它将默认为模型可以接受的最大长度。如果模型没有特定最大输入长度,则停用截断或填充到 max_length
。
下表总结了设置填充和截断的推荐方式。如果你在以下任何示例中使用一对输入序列,则可以使用 STRATEGY
替换 truncation=True
,该 STRATEGY
在 ['only_first', 'only_second', 'longest_first']
中选择,例如 truncation='only_second'
或 truncation='longest_first'
,以控制如何截断一对中的两个序列,如前所述。
截断 | 填充 | 说明 |
---|---|---|
不截断 | 不填充 |
|
填充到批次中的最大序列 | tokenizer(batch_sentences, padding=True) 或 | |
| ||
填充到模型最大输入长度 |
| |
填充到特定长度 |
| |
填充到值的倍数 |
| |
截断到模型最大输入长度 | 不填充 | tokenizer(batch_sentences, truncation=True) 或 |
| ||
填充到批次中的最大序列 | tokenizer(batch_sentences, padding=True, truncation=True) 或 | |
| ||
填充到模型最大输入长度 | tokenizer(batch_sentences, padding='max_length', truncation=True) 或 | |
| ||
填充到特定长度 | 不可能 | |
截断到特定长度 | 不填充 | tokenizer(batch_sentences, truncation=True, max_length=42) 或 |
| ||
填充到批次中的最大序列 | tokenizer(batch_sentences, padding=True, truncation=True, max_length=42) 或 | |
| ||
填充到模型最大输入长度 | 不可能 | |
填充到特定长度 | tokenizer(batch_sentences, padding='max_length', truncation=True, max_length=42) 或 | |
|