diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 091f099..f500977 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,10 +2,9 @@ - - + @@ -26,7 +25,7 @@ - + @@ -41,8 +40,8 @@ - - + + @@ -50,7 +49,7 @@ - + @@ -65,32 +64,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -140,8 +115,8 @@ @@ -259,7 +234,7 @@ - + @@ -557,7 +532,7 @@ - + @@ -1148,15 +1123,15 @@ - - + + - + @@ -1170,15 +1145,15 @@ - - + + - + @@ -1192,8 +1167,8 @@ - - + + diff --git a/README.md b/README.md index f889498..cf7317e 100644 --- a/README.md +++ b/README.md @@ -300,6 +300,8 @@ - [在数据中随机选择 15% 的标记,其中80%被换位\[mask\],10%不变、10%随机替换其他单词,原因是什么](自然语言处理/Bert.md#L164) - [elmo、GPT、bert三者之间有什么区别?](自然语言处理/Bert.md#L164) - [长文本预测如何构造Tokens](自然语言处理/Bert.md#L164) + - [读过源码么?能大概讲讲源码么](自然语言处理/Bert.md#L164) + - [你平时怎么用Bert](自然语言处理/Bert.md#L164) - Transfer # 推荐 diff --git "a/\350\207\252\347\204\266\350\257\255\350\250\200\345\244\204\347\220\206/Bert.md" "b/\350\207\252\347\204\266\350\257\255\350\250\200\345\244\204\347\220\206/Bert.md" index 3693d8d..76ed3e0 100644 --- "a/\350\207\252\347\204\266\350\257\255\350\250\200\345\244\204\347\220\206/Bert.md" +++ "b/\350\207\252\347\204\266\350\257\255\350\250\200\345\244\204\347\220\206/Bert.md" @@ -1,7 +1,7 @@ # Bert的双向体现在什么地方? mask+attention,mask的word结合全部其他encoder word的信息 -# Bert的是怎样预训练的? +# Bert的是怎样实现mask构造的? - MLM:将完整句子中的部分字mask,预测该mask词 - NSP:为每个训练前的例子选择句子 A 和 B 时,50% 的情况下 B 是真的在 A 后面的下一个句子, 50% 的情况下是来自语料库的随机句子,进行二分预测是否为真实下一句 @@ -19,4 +19,32 @@ mask+attention,mask的word结合全部其他encoder word的信息 - tail-only:保存最后 510 个token - head + tail :选择前128个 token 和最后382个 token(文本在800以内)或者前256个token+后254个token(文本大于800tokens) -# \ No newline at end of file +# 你用过什么模块?bert流程是怎么样的? +- modeling.py +- 首先定义处理好输入的tokens的对应的id作为input_id,因为不是训练所以input_mask和segment_id都是采取默认的1即可 +- 在通过embedding_lookup把input_id向量化,如果存在句子之间的位置差异则需要对segment_id进行处理,否则无操作;再进行position_embedding操作 +- 进入Transform模块,后循环调用transformer的前向过程,次数为隐藏层个数,每次前向过程都包含self_attention_layer、add_and_norm、feed_forward和add_and_norm四个步骤 +- 输出结果为句向量则取\[cls]对应的向量(需要处理成embedding_size),否则也可以取最后一层的输出作为每个词的向量组合all_encoder_layers\[-1] + +# 知道分词模块:FullTokenizer做了哪些事情么? +- BasicTokenizer:根据空格等进行普通的分词 + - 包括了一些预处理的方法:去除无意义词,跳过'\t'这些词,unicode变换,中文字符筛选等等 +- WordpieceTokenizer:前者的结果再细粒度的切分为WordPiece + - 中文不处理,因为有词缀一说:解决OOV + +# Bert中如何获得词意和句意? +- get_pooled_out代表了涵盖了整条语句的信息 +- get_sentence_out代表了这个获取每个token的output 输出,用的是cls向量 + +# 源码中Attention后实际的流程是如何的? +- Transform模块中:在残差连接之前,对output_layer进行了dense+dropout后再合并input_layer进行的layer_norm得到的attention_output +- 所有attention_output得到并合并后,也是先进行了全连接,而后再进行了dense+dropout再合并的attention_output之后才进行layer_norm得到最终的layer_output + +# 为什么要在Attention后使用残差结构? +残差结构能够很好的消除层数加深所带来的信息损失问题 + +# 平时用官方Bert包么?耗时怎么样? +- 第三方:bert_serving +- 官方:bert_base +- 耗时:64GTesla,64max_seq_length,80-90doc/s + - 在线预测只能一条一条的入参,实际上在可承受的计算量内batch越大整体的计算性能性价比越高 \ No newline at end of file