1. BERT的两个任务
(1)Pre-Training 预训练
Masked LM (MLM)
- 让模型预测被隐藏(Mask)掉的token。
例如:输入"我喜欢吃[MASK]",Label是"我喜欢吃苹果",
模型需要预测出"苹果"。这种任务的设计是为了让模型学习到语言的内在结构和词汇之间的关系。通过这种方式,模型可以理解在特定的上下文中,哪些词汇是合理的、合适的。
Next Sentence Prediction (NSP)
- 让模型判断两句是否是上下文。
例如:语料是"今天天气很好,我去公园玩",判断句子A:"今天天气很好"与句子B:"我去公园玩"是否是上下文。
这个任务的目的是让模型能够理解句子之间的逻辑关系和语义连贯性。在实际的语言使用中,句子之间往往存在因果、转折、递进等各种关系,通过NSP任务,模型可以学习到这些关系,从而更好地处理文本序列。
(2)Fine-Tuning 微调
BERT经过预训练之后,根据不同的下游任务进行微调。不同的下游任务有不同的应用场景和目标,通过微调,可以将BERT模型在预训练阶段学到的知识迁移到具体的任务上,使其更好地适应特定的任务需求。例如:
-
文本分类:可以用于判断文本的类别,如新闻分类、情感分析等。通过在预训练的基础上添加一个分类层,并使用标注好的文本分类数据进行微调,模型可以学习到如何根据文本的内容将其归类到不同的类别中。
-
机器翻译:虽然BERT本身不是专门用于机器翻译的模型,但在一些情况下,也可以通过微调来辅助机器翻译任务。例如,可以将BERT作为编码器的一部分,对源语言文本进行编码,然后与解码器结合,生成目标语言的翻译结果。
-
NER(命名实体识别):用于识别文本中的命名实体,如人名、地名、组织名等。通过在预训练模型的基础上添加一个序列标注层,并使用标注好的NER数据进行微调,模型可以学习到如何识别和标注文本中的命名实体。
2. 数据集的构建
(1)MLM数据集
以15%的概率对数据进行处理,具体处理方式如下:
**- 80%的概率使用[MASK]替换token。**例如在句子"我喜欢吃苹果"中,以15%的概率选择一个词,假设选择"苹果",那么有80%的概率将其替换为[MASK],得到"我喜欢吃[MASK]"。
**- 10%的概率使用随机的token替换当前的token。**仍然以"苹果"为例,有10%的概率将其替换为其他随机的词,比如"香蕉"等。
**- 10%的概率保持不变。**也就是说,有10%的概率"苹果"仍然保持为"苹果"。
这种数据处理方式是为了让模型在学习过程中能够更好地适应各种情况,包括预测被掩盖的词、识别错误的词以及理解正常的文本序列。
(2)NSP数据集
构建一些句子对,其中:
-
50%是正样本,即正确的上下文句子。例如"今天天气很好,我去公园玩"中的两个句子就是正样本,它们之间存在逻辑上的连贯性。
-
50%是负样本,即随机组合的句子对。例如将"今天天气很好"和"我昨天去了图书馆"组合在一起作为负样本,这两个句子之间没有直接的上下文关系。通过这种方式,模型可以学习到如何区分句子之间的上下文关系。
3. Representation
BERT(Bidirectional Encoder Representations from Transformers)模型处理输入文本时的嵌入(Embedding)机制。

输入格式
BERT的输入格式是"[CLS]Sentence1[SEP]Sentence2[SEP]"。
例如对于两个句子"今天天气很好"和"我去公园玩",输入格式就是"[CLS]今天天气很好[SEP]我去公园玩[SEP]"。
各种Embedding
-
Token Embeddings:每个Token的Embedding。Token Embedding是将文本中的单词、字符等转换为向量表示的过程,这些向量能够捕捉到单词的语义信息。
-
Segment Embeddings:用于区分句子1和句子2。它的shape是(2,d_model),其中d_model是模型的维度。Segment Embedding的作用是在模型中区分不同的句子,因为BERT是基于Transformer架构的,它需要明确地知道哪些token属于同一个句子,哪些属于不同的句子。
-
Position Embeddings:Token位置的Embedding,shape是(seq_len,d_model)。Position Embedding的作用是让模型能够感知到token在句子中的位置信息,因为在自然语言中,词序对于理解句子的含义非常重要。
最终的输入向量
最终的输入向量是Token Embedding + Segment Embedding + Position Embedding。通过将这三种Embedding相加,模型可以同时获取到token的语义信息、句子的区分信息以及位置信息,从而更好地理解和处理文本。
4. 关于模型大小
以处理模型参数时使用的数值精度系数: float 16 为例
-
推理和存储时的系数为2:
-
当使用float 16精度时,每个参数占用2个字节(16位)的存储空间。
-
对于一个拥有60亿(6B,即6,000,000,000)参数的模型,如果使用float 16精度,那么总的存储空间需求为:
6,000,000,000 参数×2 字节/参数=12,000,000,000 字节=12 GB
-
这意味着在推理(模型部署和使用阶段)和存储时,模型的大小可以显著减小,从而减少内存和存储的需求。
-
-
训练时的系数为20:
-
在训练阶段,可能需要更高的数值精度来避免数值不稳定和梯度下溢的问题,因此可能会使用更高的精度,如float 32(32位浮点数)。
-
如果使用float 32精度,每个参数占用4个字节(32位)的存储空间。
-
对于同样的60亿参数模型,如果使用float 32精度,总的存储空间需求为:
6,000,000,000 参数×4 字节/参数=24,000,000,000 字节=24 GB
-
但是,由于训练过程中涉及到大量的中间计算和优化操作,实际的存储需求可能会更大。例如,如果考虑到梯度、优化器状态等额外的存储需求,总的存储空间可能会达到:
6,000,000,000 参数×20 字节/参数=120,000,000,000 字节=120 GB
-