听说你还没读过 Bert 源码?

2019 年 8 月 7 日 AINLP

作者:老宋的茶书会

知乎专栏:NLP与深度学习

研究方向:自然语言处理




前言

前几天面试,有面试官直接拿 bert 的源码让我分析,emm, 有点厉害呀。还好老宋底子可以, 之前看过 Transformer 的实现,自己也用 Transformer 写了一下文本分类任务,没有难住我,哈哈哈哈。

不过,看来,如今,面试官们已经不满足仅仅只问原理了, 倒也是,如何看出一个人的代码能力,看看他读源码的能力就能看得出来。

因此,老宋觉得各位真的要看一看 Bert 的源码了, 于是,我花了一个下午,屡清楚各个代码,并且对关键地方做了注释, 大家可以看一看我的仓库:BERT-pytorch (https://github.com/songyingxin/BERT-pytorch)

1. 整体描述

BERT-Pytorch 在分发包时,主要设置了两大功能:

  • bert-vocab :统计词频,token2idx, idx2token 等信息。对应 bert_pytorch.dataset.vocab 中的 build 函数。

  • bert:对应 bert_pytorch.__main__ 下的 train 函数。

为了能够调试,我重新建立了两个文件来分别对这两大功能进行调试。

1. bert-vocab

python3 -m ipdb test_bert_vocab.py  # 调试 bert-vocab

其实 bert-vocab 内部并没有什么重要信息,无非就是一些自然语言处理中常见的预处理手段, 自己花个十分钟调试一下就明白了, 我加了少部分注释, 很容易就能明白。

内部继承关系为:

TorchVocab --> Vocab --> WordVocab

2. 模型架构

  • 调试命令:

python3 -m ipdb test_bert.py -c data/corpus.small -v data/vocab.small -o output/bert.model

从模型整体上看, 分为两大部分: MaskedLanguageModel 与 NextSentencePrediction ,并且二者都以 BERT 为前置模型,在分别加上一个全连接层与 softmax 层来分别获得输出。

这段代码相对很简单,十分容易理解,略过。

1. Bert Model

这部分其实就是 Transformer Encoder 部分 + BERT Embedding, 如果不熟悉 Transformer 的同学,恰好可以从此处来加深理解。

这部分源码阅读建议可先大致浏览一下整体, 有一个大致的框架,明白各个类之间的依赖关系,然后从细节到整体逐渐理解,即从上图看,从右往左读,效果会更好。

1. BERTEmbedding

分为三大部分:

  • TokenEmbedding :对 token 的编码,继承于 nn.Embedding, 默认初始化为 :N(0,1)

  • SegmentEmbedding: 对句子信息编码,继承于 nn.Embedding, 默认初始化为 :N(0,1)

  • PositionalEmbedding: 对位置信息编码, 可参见论文,生成的是一个固定的向量表示,不参与训练

这里面需要注意的就是 PositionalEmbedding, 因为有些面试官会很抠细节,而我对这些我觉得对我没有啥帮助的东西,一般了解一下就放过了,细节没有抠清楚,事实证明,吃亏了。

2. Transformer

这里面的东西十分建议对照论文一起看,当然,如果很熟的话可以略过。我在里面关键的地方都加上了注释,如果还是看不懂的话可以提 issue, 这里就不赘述了。

最后

我个人觉得 Google 这个代码写的真的是漂亮, 结构很清晰, 整个看下来不用几个小时就能明白了, 推荐采用我的那种调试方式从头到尾调试一遍,这样会更清晰。

觉得不错,点个赞可好。


原文链接:
https://zhuanlan.zhihu.com/p/76936436

本文由作者授权AINLP原创首发于公众号平台,点击'阅读原文'直达原文链接,欢迎投稿,AI、NLP均可。


登录查看更多
7

相关内容

BERT全称Bidirectional Encoder Representations from Transformers,是预训练语言表示的方法,可以在大型文本语料库(如维基百科)上训练通用的“语言理解”模型,然后将该模型用于下游NLP任务,比如机器翻译、问答。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
22+阅读 · 2019年11月7日
最新BERT相关论文清单,BERT-related Papers
专知会员服务
52+阅读 · 2019年9月29日
BERT源码分析PART I
AINLP
38+阅读 · 2019年7月12日
一大批中文(BERT等)预训练模型等你认领!
PaperWeekly
14+阅读 · 2019年6月25日
实战 | 源码入门之Faster RCNN
计算机视觉life
19+阅读 · 2019年4月16日
超强干货!TensorFlow易用代码大集合...
机器学习算法与Python学习
6+阅读 · 2019年2月20日
BERT大火却不懂Transformer?读这一篇就够了
大数据文摘
11+阅读 · 2019年1月8日
资源 | 最强预训练模型BERT的Pytorch实现(非官方)
全球人工智能
7+阅读 · 2018年10月18日
Heterogeneous Graph Transformer
Arxiv
27+阅读 · 2020年3月3日
Arxiv
5+阅读 · 2019年10月31日
Arxiv
15+阅读 · 2019年9月11日
Arxiv
5+阅读 · 2019年8月22日
Arxiv
21+阅读 · 2019年3月25日
Arxiv
8+阅读 · 2019年3月21日
Arxiv
3+阅读 · 2019年3月1日
Arxiv
7+阅读 · 2018年1月24日
Arxiv
3+阅读 · 2017年12月18日
VIP会员
相关VIP内容
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
22+阅读 · 2019年11月7日
最新BERT相关论文清单,BERT-related Papers
专知会员服务
52+阅读 · 2019年9月29日
相关资讯
BERT源码分析PART I
AINLP
38+阅读 · 2019年7月12日
一大批中文(BERT等)预训练模型等你认领!
PaperWeekly
14+阅读 · 2019年6月25日
实战 | 源码入门之Faster RCNN
计算机视觉life
19+阅读 · 2019年4月16日
超强干货!TensorFlow易用代码大集合...
机器学习算法与Python学习
6+阅读 · 2019年2月20日
BERT大火却不懂Transformer?读这一篇就够了
大数据文摘
11+阅读 · 2019年1月8日
资源 | 最强预训练模型BERT的Pytorch实现(非官方)
全球人工智能
7+阅读 · 2018年10月18日
相关论文
Heterogeneous Graph Transformer
Arxiv
27+阅读 · 2020年3月3日
Arxiv
5+阅读 · 2019年10月31日
Arxiv
15+阅读 · 2019年9月11日
Arxiv
5+阅读 · 2019年8月22日
Arxiv
21+阅读 · 2019年3月25日
Arxiv
8+阅读 · 2019年3月21日
Arxiv
3+阅读 · 2019年3月1日
Arxiv
7+阅读 · 2018年1月24日
Arxiv
3+阅读 · 2017年12月18日
Top
微信扫码咨询专知VIP会员