RoBERTa 是一种基于 Transformer 的模型,它通过自监督学习的方式在大规模英文语料库上进行预训练。这意味着它仅使用原始文本进行预训练,无需人工对文本进行任何形式的标注(这也是它能够利用大量公开可用数据的原因),并通过自动流程从这些文本中生成输入和标签。
更准确地说,它是通过掩码语言模型(MLM)目标进行预训练的。对于一个句子,模型会随机掩码输入中 15% 的词语,然后将整个掩码后的句子输入模型,模型需要预测出这些被掩码的词语。这与传统的循环神经网络(RNNs)通常逐个处理词语的方式不同,也与像 GPT 这样的自回归模型在内部对未来标记进行掩码的方式不同。这种方式使模型能够学习句子的双向表示。
通过这种方式,模型学习到英语语言的内部表示,该表示可用于提取对下游任务有用的特征:例如,如果你有一个带标签的句子数据集,你可以使用 BERT 模型生成的特征作为输入来训练一个标准分类器。
这种偏差也会影响该模型的所有微调版本。
RoBERTa 模型的预训练数据是五个数据集的集合:
这些数据集的总大小为 160GB 文本。
# source environment variable
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export OPENMIND_FRAMEWORK=ptOpenMind 库可通过 pip 进行安装,请根据实际环境选择相应命令进行安装。
需要注意的是,由于 torch npu 依赖于 torch,在 aarch64 环境下可通过 pip 直接安装,而在 x86 环境下则需要通过特定 URL 下载 CPU 版本,因此两种环境下的安装命令有所不同。具体安装代码已在下文进行区分呈现。
# aarch64
pip install openmind[all]
# x86
pip install openmind[all] --extra-index-url https://download.pytorch.org/whl/cpufrom openmind import AutoTokenizer, AutoModelForCausalLM
import torch
import torch_npu
model_dir = "HangZhou_Ascend/roberta_large"
tokenizer = AutoTokenizer.from_pretrained(model_dir, device_map="auto", trust_remote_code=True)
# Set `torch_dtype=torch.float16` to load model in float16, otherwise it will be loaded as float32 and might cause OOM Error.
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, torch_dtype=torch.float16)
model = model.eval()
response, history = model.chat(tokenizer, "1+1=", history=[], meta_instruction="")
print(response)文本使用字节级别的字节对编码(BPE)进行分词,词汇表大小为50,000。模型的输入采用512个连续的token片段,这些片段可能跨越多个文档。新文档的开头用 <s> 标记,结尾用 </s> 标记。
每个句子的掩码处理细节如下:
<mask>。与BERT不同,掩码是在预训练过程中动态进行的(例如,在每个epoch都会变化,并非固定不变)。
该模型在1024块V100 GPU上进行训练,共训练500K步,批处理大小为8K,序列长度为512。使用的优化器是Adam,学习率为4e-4,$\beta_{1} = 0.9$,$\beta_{2} = 0.98$,$\epsilon = 1e-6$,权重衰减为0.01,学习率预热30,000步,之后学习率线性衰减。
在下游任务上进行微调后,该模型取得了以下结果:
GLUE测试结果:
| 任务 | MNLI | QQP | QNLI | SST-2 | CoLA | STS-B | MRPC | RTE |
|---|---|---|---|---|---|---|---|---|
| 90.2 | 92.2 | 94.7 | 96.4 | 68.0 | 96.4 | 90.9 | 86.6 |