1. 主要区别
BERT |
Roberta | |
模型结构 |
一样都是transformer的encoder部分 |
一样都是transformer的encoder部分 |
数据集 |
16G |
160G |
训练步长 |
125K(Base模型)-500K步(Large模型) |
500K |
训练batchsize |
256 |
2K, 8K, 甚至32K) |
训练目标 |
Next Sentence Prediction + Masked Language Modeling |
Masked Language Modeling |
文本编码 |
字符级别BPE,有OOV的问题 |
字节级别BPE,没有OOV的问题 |
动态掩码 |
否。BERT在数据预处理阶段为每个训练实例静态地生成一次Masked LM任务的掩码模式。这意味着在整个训练过程中,同一个句子每次出现时被掩盖的词是相同的。 |
是 |
注意:哈工大的hfl/chinese-roberta-wwm-ext 虽然名称包含"RoBERTa",但其底层实现延续了中文BERT-wwm的设计,采用基于字符(汉字)的WordPiece分词,而非字节级BPE(Byte-level BPE)。具体表现为:
中文文本以单字为最小单位切分(如"语言"拆分为"语"和"言")。
词表(vocab.txt)包含独立的汉字和常见符号,而非字节组合。
官方文档明确说明,加载该模型需使用BertTokenizer而非RobertaTokenizer,因后者默认支持字节级BPE。
该模型的核心创新是全词掩码(Whole Word Masking):若一个词由多个汉字组成(如"模型"),则掩码时对整个词的全部汉字进行遮盖(如"[MASK][MASK]")。但掩码策略依赖的分词基础仍是字符级WordPiece,即先按字切分后再根据分词结果合并掩码单位。
2. 重要概念——BPE算法
讲在前面的一些重要概念:utf-8编码格式,可以利用256个字节表示任意一个字符,正式基于这一基本前提,字节级别的BPE才没有OOV的问题。常见的中文、英文、生僻字、emoji表情所占字节数如下:
英文字母字符:1个字节
常见中文字符:3个字节
生僻字、emoji表情:4个字节
BPE是一种数据压缩算法,后被广泛应用于NLP的子词分词(Subword Tokenization)。它的核心思想是:将频繁出现的相邻符号(字符/字节)合并成新的符号,逐步构建词汇表。
1. 初始化词汇表 - 英文:将所有单词拆分为字符(如 "low" -> ["l", "o", "w"])+ 特殊符号(如 [UNK], [CLS]) - 中文:将所有汉字单独作为符号(如 `"模型" -> ["模", "型"]`) |
2. 统计相邻符号对的频率 统计语料库中所有相邻符号对的出现频率。 *例:在 ["l", "o", "w", "e", "r"] 中,("l", "o")出现1次,("o", "w")出现1次...* |
3. 合并最高频符号对 找到频率最高的符号对(如 ("e", "s"),将其合并为新符号(如 "es"),加入词汇表。 |
4. 重复合并 重复步骤2-3,直到达到预设的词汇表大小(如30K)或无法继续合并。 |
字节级别的BPE解决OOV问题的原理是:256个基础字节和所有BPE合并符号,在嵌入层(Embedding Layer)中都拥有自己的可训练向量!任何一个字符都可以拆解为1~4个基础字节,如果字符不在词汇表中,就用拆解出来的基础字节的embedding来表示,因此就没有OOV的问题了。
概念 |
是否参与BPE合并 |
是否有嵌入向量 |
用途 |
基础字节 (0-255) |
❌ 不参与合并 |
✅ 有向量 |
处理生僻字/符号的“原子” |
BPE合并符号 |
✅ 参与合并 |
✅ 有向量 |
表示高频组合 |
3. 碎碎念的概念
batch_size : 单词输入的样本量
step:一次参数迭代交一个步长,一般情况下一个batch迭代一次
epoch:在全量数据集完成一次训练叫一个epoch
三者之间的关系:
概念 |
定义 |
计算关系 |
例子(1000样本,batch_size=100) |
Batch Size |
单次输入的样本量 |
超参数(人为设定) |
100 |
Step |
一次参数更新(处理1个batch) |
总步数 = (总样本数 / batch_size) × epochs |
1 epoch = 10步 |
Epoch |
完整遍历整个训练集一次 |
超参数(训练轮数) |
训练5轮 = 50步 |