Skip to content

张量与核心概念

这一页专门解释训练过程中最容易混的几个词。

tensor 和 shape

张量可以先理解成多维数组。

python
[
  [11, 12, 13],
  [21, 22, 0],
]

它的 shape 是:

python
[2, 3]

含义是:

text
2 行,每行 3 个数

在文本分类里,常见 shape 是:

python
input_ids.shape = [batch_size, seq_len]

比如:

python
input_ids.shape = [4, 18]

含义是:

text
一个 batch 有 4 条文本,每条文本被处理成 18 个 token

input_ids

input_ids 是文本 token 对应的词表编号。

例如:

text
男士运动鞋

经过 BERT tokenizer 后,可能变成:

text
[CLS] 男 士 运 动 鞋 [SEP]

再映射成数字:

python
[101, 4511, 1894, 6817, 1220, 7894, 102]

数字大小本身不代表语义强弱,它只是词表里的 ID。

attention_mask

attention_mask 告诉模型哪些位置是真实 token,哪些位置是 padding。

python
input_ids      = [101, 4511, 1894, 102, 0, 0]
attention_mask = [1,   1,    1,    1,   0, 0]

含义是:

text
1 = 真实 token
0 = padding,模型应该忽略

labels

labels 是真实类别编号。

如果一个 batch 有 4 条商品标题:

python
labels.shape = [4]

因为商品分类是一条标题对应一个类别,不是每个 token 一个类别。

例如:

python
labels = [3, 12, 0, 25]

表示 4 条标题各自的真实类别。

logits

logits 是模型最后一层输出的“各类别原始分数”。

如果有 30 个类别,一个 batch 有 4 条标题:

python
logits.shape = [4, 30]

含义是:

text
4 条标题,每条标题对 30 个类别各打一个分数

例如只有 4 个类别时:

python
logits = [-1.2, 4.8, 0.3, -0.7]

最大值在索引 1,所以预测类别编号是:

python
pred = 1

注意:logits 不是概率。它是 softmax 之前的原始分数。

argmax

argmax 取的是最大值的位置,不是最大值本身。

python
logits = [0.5, 4.1, 2.0, -1.0]

最大值是 4.1,位置是 1

python
logits.argmax(dim=-1) = 1

对于二维 logits:

python
logits.shape = [batch_size, num_labels]

执行:

python
preds = logits.argmax(dim=-1)

得到:

python
preds.shape = [batch_size]

loss

loss 是模型这一次错得有多离谱。

训练时:

python
logits + labels -> CrossEntropyLoss -> loss

默认 CrossEntropyLoss 会把一个 batch 里每条样本的 loss 求平均,所以输出是一个标量:

python
loss.shape = []

它不是 [1]

区别是:

python
tensor(0.83).shape   # []
tensor([0.83]).shape # [1]

CLS 和 SEP

[CLS] 可以理解为 classification token。

它放在文本最前面:

text
[CLS] 男 士 运 动 鞋 [SEP]

BERT 分类任务经常取最后一层中 [CLS] 位置的向量作为整句话表示。

不是“最后一个 CLS”,而是:

python
last_hidden_state[:, 0, :]

如果:

python
last_hidden_state.shape = [4, 18, 768]

那么:

python
last_hidden_state[:, 0, :].shape = [4, 768]

这个 [4, 768] 再送进分类头:

python
Linear(768, 30)

得到:

python
logits.shape = [4, 30]

[SEP]separator,表示句子边界。单句分类通常是:

text
[CLS] 商品标题 [SEP]