前言
雖然早就知道Transformer酷窥、BERT吨凑、paddlepaddle贪婉,也知道它們很好用,但覺得很復(fù)雜就一直拖著沒去嘗試咒钟,在看完了ACL2018和NER相關(guān)的論文后(項目地址)吹由,我終于決定嘗試新模型了,網(wǎng)上現(xiàn)在做NER的模型大多是BiLSTM+CRF盯腌,區(qū)別就在于對字/詞向量的提取溉知、處理等。ACL這篇論文是將字向量與詞向量融合起來當(dāng)作網(wǎng)絡(luò)的輸入,但和BERT比起來级乍,它對向量的處理還是略顯幼稚舌劳,雖然BERT是基于字符的,并沒有融入詞語信息玫荣,但我覺得BERT中的自注意力機(jī)制讓它可以捕獲上下文意思甚淡,但還沒經(jīng)過實驗,我也不知道哪個比較好用捅厂,但BERT已經(jīng)在眾多數(shù)據(jù)集上達(dá)到了sota水準(zhǔn)贯卦,所以我要開始深入BERT了。
先驗知識
博客
從Word Embedding到Bert模型—自然語言處理中的預(yù)訓(xùn)練技術(shù)發(fā)展史BERT發(fā)展史
The Illustrated Transformer【譯】詳細(xì)解釋了Transformer
論文
Attention Is All You Need解釋了Transformer中的注意力機(jī)制
FAQ(frequently asked questions)
Q:到底是直接用BERT做NER還是BERT只用來生成字向量焙贷,再將字向量置于其它模型中撵割?
A: 我傾向于后者,BERT是用來捕捉字/句子之間深度關(guān)系的辙芍,然后輸出是向量啡彬,這大概就是BERT的作用了,之后再將字/句子向量輸入到其它模型中故硅。但是想得到字向量庶灿,得先把輸入改造成BERT需要的樣子。
Q:對于NER而言吃衅,如何預(yù)處理數(shù)據(jù)呢往踢?
A: unknown for now
Q:BERT源碼解讀
A:
- modeling.py
-
tokenization.py
tokenization是對原始句子內(nèi)容的解析,分為BasicTokenizer和WordpieceTokenizer兩個徘层。- BasicTokenizer的主要是進(jìn)行unicode轉(zhuǎn)換峻呕、標(biāo)點符號分割、小寫轉(zhuǎn)換惑灵、中文字符分割山上、去除重音符號等操作,最后返回的是關(guān)于詞的數(shù)組(中文是字的數(shù)組)英支。
- WordpieceTokenizer的目的是將合成詞分解成類似詞根一樣的詞片佩憾。例如將"unwanted"分解成["un", "##want", "##ed"]這么做的目的是防止因為詞的過于生僻沒有被收錄進(jìn)詞典最后只能以[UNK]代替的局面,因為英語當(dāng)中這樣的合成詞非常多干花,詞典不可能全部收錄妄帘。
- FullTokenizer的作用就很顯而易見了,對一個文本段進(jìn)行以上兩種解析池凄,最后返回詞(字)的數(shù)組抡驼,同時還提供token到id的索引以及id到token的索引。這里的token可以理解為文本段處理過后的最小單元肿仑。
-
create_pretraining_data.py
對原始數(shù)據(jù)進(jìn)行轉(zhuǎn)換致盟,原始數(shù)據(jù)本是無標(biāo)簽的數(shù)據(jù)碎税,通過句子的拼接可以產(chǎn)生句子關(guān)系的標(biāo)簽,通過MASK可以產(chǎn)生標(biāo)注的標(biāo)簽馏锡,其本質(zhì)是語言模型的應(yīng)用 -
run_pretraining.py
在執(zhí)行預(yù)訓(xùn)練的時候針對以上兩種標(biāo)簽分別利用bert模型的不同輸出部件雷蹂,計算loss,然后進(jìn)行梯度下降優(yōu)化杯道。 - run_squad.py(run_squad.py和run_classifier.py是bert中fine-tune的例子)
- run_classifier.py(講的很好匪煌,還涉及了如何把代碼改造成自己需要的樣子)
代碼
- bert-as-service 可以生成字/詞/句子向量,但維度相同党巾,不知道這有何意義萎庭,但字向量至少是可以用的,而且極其簡單齿拂。
- 另一個基于Keras的代碼驳规,也可以用,用起來也很簡單创肥。 作者還寫了一個實例
- 使用預(yù)訓(xùn)練語言模型BERT做中文NER(bert-chinese-ner-master),這個代碼沒有加入BiLSTM和CRF达舒,但是它是最基礎(chǔ)的值朋,之后的都在這上面改叹侄。 (代碼解讀見另一篇博客)
- BERT-BiLSTM-CRF-NER,這個代碼加入了BiLSTM和CRF,路徑:F:\google下載\BERT相關(guān)\Name-Entity-Recognition-master\BERT-BiLSTM-CRF-NER昨登。
-
BERT-BiLSTM-CRF-NER-master,這個代碼也加入了BiLSTM和CRF趾代,但是和上面的相比功能好像更全,作者還生成了軟件包丰辣,里面集成了bert-as-service撒强。(用不起來,已放棄)
注意事項:
這里面的代碼一般都不能直接用笙什,都需要按照README.md中進(jìn)行配置飘哨,就是加個文件夾之類的。
我的理解
參考BERT中自帶的fine-tune的實例(run_squad.py和run_classifier.py)可以發(fā)現(xiàn)琐凭,想把BERT用于NER芽隆,首先得把自己的輸入改造成BERT所需的格式,然后寫一個Processor類统屈,這個類就和run_classifier.py中的Processor結(jié)構(gòu)相同胚吁,但是里面的方法要重寫。除此之外愁憔,還可以加上自己的損失函數(shù)(在create_model中)腕扶,還可以加入CRF層等。
參考博客
http://www.reibang.com/p/22e462f01d8c
https://blog.csdn.net/u014108004/article/details/84142035#commentBox