Bert-mini
bert base用我2G的vps会out of memory,跑bert mini还是可以的。
跑下sentence classifier,总共花费6分半钟:


squad花了两个小时:



为了支持更大的batch,做了改进,可惜没有发布出来:

(有时间仔细研究下Gradient checkpointing)
4秒钟时间导出feature:


两分钟时间完成简单的bert mini预训练:

看预训练的代码,主要是run_pretraining.py、modeling.py和optimization.py三个代码,大约1000行左右的代码。
注意run_pretraining.py中是以tf.app.run方式调用main函数的。
关键函数:model_fn_builder、input_fn_builder。

tf.layers.dense就是个定义全连接层的函数。
看代码模型主体结构分为embeddings\encoder\pooler:

embedding阶段主要是embedding_lookup和embedding_postprocessor,看代码embedding_lookup有两种实现:one_hot后做matmul和tf.gather,不清楚具体差别是什么(注释说前者速度更快)。
embedding_postprocessor中看起来是简单地把token embedding,token type embedding,position embedding加在一起。

create_attention_mask_from_input_mask只是简单地将seq_length长度的mask,再重复seq_length次。
pooler中将seq_length长度的embedding输出为一个embedding,这样就可以生成一段话的embedding。
注意get_shape_list返回的是【2,3】,即batch_size和sequence_length。



transformer部分不到100行的代码,刚好复习下transformer结构:


从attention_layer的实现看,多头注意力的不同head是一起产生的。mask则和q,k点积直接加上。
多任务训练时total_loss=get_masked_lm_output + get_next_sentence_output,argmax。
输入的是sentence pair,next sentence prediction输出1代表next,0代表random。
next sentence prediction输入的是pooler,而lmasked lm output输入的是sequence output,相当于加了一层解码器。