张量与核心概念
这一页专门解释训练过程中最容易混的几个词。
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 个 tokeninput_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]