Bret介紹
Bret是Google2018年推出的最新的詞向量訓練工具,在nlp領域各個問題的性能上均有大幅提升,是nlp領域具有變革型的一項工作。已經有大量介紹Bret原理的博客,感興趣的可以取看一下。本文主要介紹如何使用Bret獲取到中文的詞向量,用於後續的諸如文本分類、命名實體識別、情感分類等工作。
下載代碼和模型
Google 的工作處處體現着 Money的重要性,畢竟 **All you need is money ** ,Bret 在編碼器和解碼器分別疊加的6層 Transformer,訓練過程及其複雜,需要很高的配置,並且需要大量的訓練時間。但是,Google 人性化的是 公佈了多個預訓練好的模型,我們可以直接使用這些預訓練好的模型進行微調(fine-trun)。這也是nlp領域發展的趨勢——遷移學習
BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters
BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters
BERT-Base, Cased: 12-layer, 768-hidden, 12-heads , 110M parameters
BERT-Large, Cased: 24-layer, 1024-hidden, 16-heads, 340M parameters
BERT-Base, Multilingual Cased (New, recommended): 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters
BERT-Base, Multilingual Uncased (Orig, not recommended) (Not recommended, use Multilingual Cased instead): 102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters
BERT-Base, Chinese: Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters
上面是Google訓練好的一些模型,可以在 項目中下載:https://github.com/google-research/bert
我們使用的是:BERT-Base, Chinese: Chinese Simplified and Traditional 使用簡體和繁體中文訓練的一箇中文字符的模型,
下載地址:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
下載好模型之後,需要將 google 的Bert項目 複製下來:
git clone https://github.com/google-research/bert
要提取文本的詞向量,需要使用項目中的 extract_features.py腳本,官方給出的範例:
python extract_features.py \
--input_file=/tmp/input.txt \
--output_file=/tmp/output.jsonl \
--vocab_file=$BERT_BASE_DIR/vocab.txt \
--bert_config_file=$BERT_BASE_DIR/bert_config.json \
--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
--layers=-1,-2,-3,-4 \
--max_seq_length=128 \
--batch_size=8
其中參數:
**input_file:**是要提取特徵的文件,其格式爲:
# Sentence A and Sentence B are separated by the ||| delimiter for sentence pair tasks like question answering and entailment.
# For single sentence inputs, put one sentence per line and DON'T use the delimiter.
echo 'Who was Jim Henson ? ||| Jim Henson was a puppeteer' > /tmp/input.txt
如果要訓練 sentense pair 則寫成:
吃了嗎? ||| 吃過了
其中 ||| 是sentense A 和sentence B的分隔符
如果只訓練單個句子,則不需要||| 分割:
訓練單個句子的詞向量
**vocab_file:**是詞典的路徑 BERT_BASE_DIR 是解壓下載 預訓練模型BERT-Base, Chinese: Chinese Simplified and Traditional 的路徑 (下同)
**bert_config_file:**是網絡配置文件的路徑
**init_checkpoint:**是網絡模型文件的路徑
layers: 是輸出那些層的參數,-1就是最後一層,-2是倒數第二層,一次類推
max_seq_length: 是最大句子長度,根據自己的任務配置。如果你的GPU內存比較小,可以減小這個值,節省存儲
batch_size: 不解釋
**output_file:**輸出的結果的路徑,Bert將結果輸出到一個json文件中,具體格式如下:
{
"linex_index": 0,
"features": [
{ "token": "[CLS]",//句子開始標誌
"layers": [{ "index": -1, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -2, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -3, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -4, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },]
},
{ "token": ""token": "\u769f"",//句子中第一個字
"layers": [{ "index": -1, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },//第一個詞的最後一層(-1)網絡的參數
{ "index": -2, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },//第一個詞的倒數二層(-2)網絡的參數
{ "index": -3, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },//第一個詞的倒數三層(-3)網絡的參數
{ "index": -4, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },]/
},
{ "token": ""token": "\u45ef"",//句子中第2個字
"layers": [{ "index": -1, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -2, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -3, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -4, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },]
......
{ "token": ""token": "\SEP"",//句子結束標誌
"layers": [{ "index": -1, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -2, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -3, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },
{ "index": -4, "values": [0.402158, -7.281092, -0.351869, -0.432365, -0.453649 ...(dim=768)] },]
}]}
可以根據需要設置layers參數,獲取到需要層數中的網絡參數(詞向量)
PS:爲了方便,上面詞向量我是直接複製一行,粘貼若干次,真實的詞向量是不同的。