BERT Training By Example

BERT 模型的训练主要分为三个阶段:
1. Masked Language Model,基于对自然语言的语料打标签生成训练样本,将无监督学习转换为监督学习
2. Pretraining,模型训练的核心过程,生成能理解语言的模型
3. Fine-tuning,基于对模型的理解,完成特定的任务。

Masked Language Model

Masked Language Model 的任务是将无标签的语料转换为有标签的语料,进而将无监督学习转化为监督学习。这个过程需要准备两份材料:原始语料词汇表
原始语料就是一系列符合语法的句子或段落。
词汇表维持token-id的映射,除了一门语言自身的词汇,BERT还要求词汇表包含[PAD], [UNK], [CLS], [SEP]和[MASK]。

Pretraining

Continue reading

BERT 模型参数量估计

根据BERT论文, 其12层transformer结构有110M参数, 24层更是高达340M, 虽然google公开了这两个网络的预训练模型, 用户只需在后面加一层Full-connected 但如果自己去做BERT预训练, 到底要耗费多少显存呢?

tensorflow中使用tf.variable()在模型中生成训练参数, 同时, tf.dense()内部也含有weight和bias两类参数. 比如,

tf.get_variable(shape=[vocab_size, embedding_size],initializer=…))

生成了shape是[vocab_size, embedding_size]的variable, 即 vocab_size * embedding_size 个参数,

to_tensor_2d = tf.layers.dense(from_tensor_2d, kernel_initializer=...)) 

内含 from_tensor_2d.shape[-1] * to_tensor_2d.shape[-1] 个weight 以及 to_tensor_2d.shape[-1] 个bias. 共计 (from_tensor_2d.shape[-1] + 1) * to_tensor_2d.shape[-1] 个参数, 这就是一个FC-Layer的参数量

有了上面的例子, BERT的参数量就不难分析, 整个BERT网络可以分为4个模块: embedding layer + transformer layers + pooled layer+ classifier layer

embedding-layer

Continue reading