目录
BERT-based Models
BertForPreTraining
预训练包括以下两个任务:
- Masked Language Model(MLM):训练模型根据上下文理解单词的意思
- Next Sentence Prediction(NSP):训练模型理解预测句子间的关系。
对应的类:
- BertForMaskedLM:基于BertOnlyMLMHead,只进行 MLM 任务的预训练;
- BertLMHeadModel:基于BertOnlyMLMHead,这一模型是作为 decoder 运行的版本;
- BertForNextSentencePrediction: 基于BertOnlyNSPHead,只进行 NSP 任务的预训练。
Fine-tune模型
BertForSequenceClassification
- 作用:句子分类(也可以是回归)任务
- 输入:句子对
- 输出:句子标签
- 结构:BERT(有pooling层)+dropout+线性输出层
- num_labels=1,默认为回归任务,使用 MSELoss;否则认为是分类任务
BertForMultipleChoice
- 作用:多项选择
- 输入:一组分次输入的句子
- 输出:选择某一句子的单个标签
- 结构:BERT(有pooling层)+dropout+一维线性输出层
- 输入量为[batch_size, num_choices]数量的句子
BertForTokenClassification
- 作用:序列标注(词分类)
- 输入:单个句子文本
- 输出:每个 token 对应的类别标签
- 结构:BERT(无pooling层)+dropout+线性输出层
BertForQuestionAnswering
- 作用:做问答
- 输入:1v1问答
- 输出:预测答案的起始位置和结束位置
- 结构:BERT(无pooling层)+ 线性输出层
- 对超出句子长度的非法 label,会将其压缩(torch.clamp_)到合理范围
BERT训练与优化
AdamW
BERT的优化器,出自论文《Fixing Weight Decay Regularization in Adam》,用于修复Adam的权重衰减错误。论文指出,L2正则化和权重衰减在大部分情况下并不等价,只在 SGD 优化的情况下是等价的;而大多数框架中对于 Adam+L2正则使用的是权重衰减的方式,两者不能混为一谈。
Warmup
Warmup是指
- 在训练初期,使用较小的学习率(从 0 开始),在一定步数(比如 1000 步)内逐渐提高到正常大小(比如 2e-5),避免模型过早进入局部最优而过拟合;
- 在训练后期,再慢慢将学习率降低到 0,避免后期训练还出现较大的参数变化。
在Huggingface的实现中,可以使用多种 warmup 策略:
TYPE_TO_SCHEDULER_FUNCTION = {
SchedulerType.LINEAR: get_linear_schedule_with_warmup,
SchedulerType.COSINE: get_cosine_schedule_with_warmup,
SchedulerType.COSINE_WITH_RESTARTS: get_cosine_with_hard_restarts_schedule_with_warmup,
SchedulerType.POLYNOMIAL: get_polynomial_decay_schedule_with_warmup,
SchedulerType.CONSTANT: get_constant_schedule,
SchedulerType.CONSTANT_WITH_WARMUP: get_constant_schedule_with_warmup,
}
- CONSTANT:保持固定学习率不变;
- CONSTANT_WITH_WARMUP:在每一个 step 中线性调整学习率;
- LINEAR:上文提到的两段式调整(最常用);
- COSINE:和两段式调整类似,只不过采用的是三角函数式的曲线调整;
- COSINE_WITH_RESTARTS:训练中将上面 COSINE 的调整重复 n 次;
- POLYNOMIAL:按指数曲线进行两段式调整。
具体使用参考transformers/optimization.py