韩国小哥哥用Pytorch实现谷歌最强NLP预训练模型BERT | 代码

2018 年 10 月 19 日 量子位
乾明 编译整理自 GitHub 
量子位 报道 | 公众号 QbitAI

新鲜代码,还热乎着呢。

前几天,谷歌发布了一篇论文,介绍了一个超强的NLP预训练模型BERT。

不仅在SQuAD中摧枯拉朽,全面超越人类表现,还在多种不同NLP测试中创出最佳成绩,包括包括将GLUE基准提升7.6%,将MultiNLI的准确率提提升5.6%。

更重要的是,论文中称,这个预训练语言模型可用于任何NLP任务,整个过程不需要对架构进行实质性的修改。

有人说这是自然语言理解领域几个月来最重大的事件,也有一些人认为这将改变NLP的研究模式。

当然,也有不少人心里长满了“草”,都想上手试试这个模型怎么样。

现在,方法来了。

一位名叫Junseong Kim韩国小哥哥,在GitHub上分享了自己用Pytorch实现BERT的过程与代码。

Junseong Kim表示,代码很简单,而且也易于理解,其中一些代码基于The Annotated Transformer,但尚未得到验证

The Annotated Transformer来自“Attention is All You Need”,是哈佛大学的一个研究团队对后者的解读与实现,链接在文末。

语言模型预训练

在谷歌的论文中,作者给出了两种针对语言模型进行预训练的任务,分别是Masked Language Model(论文中简称Masked LM)和预测下一句。

Masked LM

Input Sequence  : The man went to [MASK] store with [MASK] dog
Target Sequence :                  the                his

规则:

根据下面的子规则,随机改变15%的输入token:

1、80%的 token 将成为 [MASK] token。

2、10% 的 token 将成为 [RANDOM] token(另一个单词)。

3、10% 的 token 将维持不变,但是需要预测。

预测下一句

Input : [CLS] the man went to the store [SEP] he bought a gallon of milk [SEP]
Label : Is Next

Input = [CLS] the man heading to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext

“当前的这个句子能够和下一句联系起来吗?”

理解两个文本句子之间的关系,这无法通过语言建模直接获取。

规则:

1、下一句有 50% 的概率是连续的句子。

2、下一句有 50% 的概率是无关的句子。

使用

注意:你的语料库中,一行中要准备两个句子,中间用 (\t) 分隔符隔开。

Welcome to the \t the jungle \n
I can stay \t here all night \n

1、根据自己的语料库构建vocab

python build_vocab.py -c data/corpus.small -o data/corpus.small.vocab
usage: build_vocab.py [-h] -c CORPUS_PATH -o OUTPUT_PATH [-s VOCAB_SIZE]
                      [-e ENCODING] [-m MIN_FREQ]

optional arguments:
  -h, --help            show this help message and exit
  -c CORPUS_PATH, --corpus_path CORPUS_PATH
  -o OUTPUT_PATH, --output_path OUTPUT_PATH
  -s VOCAB_SIZE, --vocab_size VOCAB_SIZE
  -e ENCODING, --encoding ENCODING
  -m MIN_FREQ, --min_freq MIN_FREQ

2、用自己的语料库构建BERT训练数据集

python build_dataset.py -d data/corpus.small -v data/corpus.small.vocab -o data/dataset.small
usage: build_dataset.py [-h] -v VOCAB_PATH -c CORPUS_PATH [-e ENCODING] -o
                        OUTPUT_PATH

optional arguments:
  -h, --help            show this help message and exit
  -v VOCAB_PATH, --vocab_path VOCAB_PATH
  -c CORPUS_PATH, --corpus_path CORPUS_PATH
  -e ENCODING, --encoding ENCODING
  -o OUTPUT_PATH, --output_path OUTPUT_PATH

3训练你自己的BERT模型

python train.py -d data/dataset.small -v data/corpus.small.vocab -o output/
usage: train.py [-h] -d TRAIN_DATASET [-t TEST_DATASET] -v VOCAB_PATH -o
                OUTPUT_DIR [-hs HIDDEN] [-n LAYERS] [-a ATTN_HEADS]
                [-s SEQ_LEN] [-b BATCH_SIZE] [-e EPOCHS]

optional arguments:
  -h, --help            show this help message and exit
  -d TRAIN_DATASET, --train_dataset TRAIN_DATASET
  -t TEST_DATASET, --test_dataset TEST_DATASET
  -v VOCAB_PATH, --vocab_path VOCAB_PATH
  -o OUTPUT_DIR, --output_dir OUTPUT_DIR
  -hs HIDDEN, --hidden HIDDEN
  -n LAYERS, --layers LAYERS
  -a ATTN_HEADS, --attn_heads ATTN_HEADS
  -s SEQ_LEN, --seq_len SEQ_LEN
  -b BATCH_SIZE, --batch_size BATCH_SIZE
  -e EPOCHS, --epochs EPOCHS

GitHub传送门:

https://github.com/codertimo/BERT-pytorch

The Annotated Transformer传送门:

http://nlp.seas.harvard.edu/2018/04/03/attention.html

加入社群

量子位AI社群开始招募啦,欢迎对AI感兴趣的同学,在量子位公众号(QbitAI)对话界面回复关键字“交流群”,获取入群方式;


此外,量子位专业细分群(自动驾驶、CV、NLP、机器学习等)正在招募,面向正在从事相关领域的工程师及研究人员。


进专业群请在量子位公众号(QbitAI)对话界面回复关键字“专业群”,获取入群方式。(专业群审核较严,敬请谅解)

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态


登录查看更多
8

相关内容

在搭建网络模型时,需要随机初始化参数,然后开始训练网络,不断调整直到网络的损失越来越小。在训练的过程中,一开始初始化的参数会不断变化。当参数训练到比较好的时候就可以将训练模型的参数保存下来,以便训练好的模型可以在下次执行类似任务时获得较好的结果。
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
BERT进展2019四篇必读论文
专知会员服务
64+阅读 · 2020年1月2日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
【机器学习课程】Google机器学习速成课程
专知会员服务
161+阅读 · 2019年12月2日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
开源书:PyTorch深度学习起步
专知会员服务
49+阅读 · 2019年10月11日
多项NLP任务新SOTA,Facebook提出预训练模型BART
机器之心
22+阅读 · 2019年11月4日
GitHub超9千星:一个API调用27个NLP预训练模型
新智元
17+阅读 · 2019年7月22日
资源 | 最强预训练模型BERT的Pytorch实现(非官方)
全球人工智能
7+阅读 · 2018年10月18日
Revealing the Dark Secrets of BERT
Arxiv
4+阅读 · 2019年9月11日
Arxiv
3+阅读 · 2019年9月5日
Arxiv
6+阅读 · 2019年7月11日
How to Fine-Tune BERT for Text Classification?
Arxiv
13+阅读 · 2019年5月14日
Universal Transformers
Arxiv
5+阅读 · 2019年3月5日
VIP会员
相关VIP内容
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
BERT进展2019四篇必读论文
专知会员服务
64+阅读 · 2020年1月2日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
【机器学习课程】Google机器学习速成课程
专知会员服务
161+阅读 · 2019年12月2日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
开源书:PyTorch深度学习起步
专知会员服务
49+阅读 · 2019年10月11日
相关论文
Top
微信扫码咨询专知VIP会员