1. 程式人生 > >韓國小哥哥用Pytorch實現谷歌最強NLP預訓練模型BERT | 程式碼

韓國小哥哥用Pytorch實現谷歌最強NLP預訓練模型BERT | 程式碼

乾明 編譯整理自 GitHub 
量子位 報道 | 公眾號 QbitAI

新鮮程式碼,還熱乎著呢。

前幾天,谷歌釋出了一篇論文,介紹了一個超強的NLP預訓練模型BERT。

不僅在SQuAD中摧枯拉朽,全面超越人類表現,還在多種不同NLP測試中創出最佳成績,包括包括將GLUE基準提升7.6%,將MultiNLI的準確率提提升5.6%。

更重要的是,論文中稱,這個預訓練語言模型可用於任何NLP任務,整個過程不需要對架構進行實質性的修改。

有人說這是自然語言理解領域幾個月來最重大的事件,也有一些人認為這將改變NLP的研究模式。

當然,也有不少人心裡長滿了“草”,都想上手試試這個模型怎麼樣。

現在,方法來了。

一位名叫Junseong Kim韓國小哥哥,在GitHub上分享了自己用Pytorch實現BERT的過程與程式碼。

640?wx_fmt=jpeg

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)對話介面,回覆“招聘”兩個字。

640?wx_fmt=jpeg

量子位 QbitAI · 頭條號簽約作者

վ'ᴗ' ի 追蹤AI技術和產品新動態