之前兩天也寫(xiě)了word2vec和Transformer肝谭,其實(shí)都是在為今天的內(nèi)容做鋪墊。最近正好使用bert做了命名實(shí)體識(shí)別項(xiàng)目,借這個(gè)契機(jī)分享出來(lái)墩蔓,希望能幫到有需要的人。
自然語(yǔ)言的表示
之所以之前自然語(yǔ)言處理的發(fā)展沒(méi)有達(dá)到CV領(lǐng)域萧豆,很大一部分原因是很難把抽象的語(yǔ)言用準(zhǔn)確的數(shù)學(xué)方式表示奸披。
one-hot 只能說(shuō)對(duì)詞進(jìn)行編碼,毫無(wú)“相似度”的概念涮雷,例如【川老師】和【特朗普】的距離與【川老師】和【蒼老師】的距離是一模一樣的
word2vec 將高維的one-hot“嵌入”到低維空間阵面,使得向量更加稠密,這樣做的好處是可以很方便的計(jì)算相似度洪鸭,但是最大的缺點(diǎn)是無(wú)法解決一詞多義的問(wèn)題样刷。
張三說(shuō)的【川普】真可愛(ài)
【川普】在地球和太陽(yáng)之間反復(fù)橫跳
-
ELMO
ELMO是“Embedding from Language Models”的簡(jiǎn)稱(chēng)。從下圖可以看到览爵,ELMO是一個(gè)多層雙向LSTM架構(gòu)置鼻,但是雙向并不是真正意義上的雙向拾枣,而是兩個(gè)單向的LSTM作為特征提取器。ELMO不僅學(xué)到了單詞特征司蔬,還學(xué)習(xí)到了句法特征以及語(yǔ)義特征俊啼,這就能較好地解決單詞在不同的上下文有不同的含義左医。
image.png -
GPT
GPT是“Generative Pre-Training”的簡(jiǎn)稱(chēng)。這個(gè)模型最大的特點(diǎn)是使用了多層單向Transformer的結(jié)構(gòu)彤路,Transformer的特征提取能力要遠(yuǎn)遠(yuǎn)的優(yōu)于LSTM芥映,且Transformer易于并行計(jì)算奈偏,能夠很好地捕獲長(zhǎng)距離的信息。
image.png -
BERT
image.png
BERT的paper標(biāo)題叫Pre-training of Deep Bidirectional Transformers for Language Understanding,人工發(fā)動(dòng)self-attention,這個(gè)模型的重點(diǎn)在“Deep”,“Bidirectional”矢渊。沒(méi)錯(cuò)!就是深層雙向Transformer昆淡。這個(gè)模型真的是一個(gè)很大很重的模型刽严,base版本的參數(shù)里有1.1億,Large版本的有3.4億(突然想起最近的GPT3的1700億參數(shù)眨补,可怕!5古А!)
其實(shí)這些模型都是為了能獲得更好的語(yǔ)言表示甘晤,有了好的原材料饲做,才能應(yīng)用到下游的各項(xiàng)工作中發(fā)揮出好的效果盆均。
簡(jiǎn)述BERT原理
BERT是一個(gè)兩階段模型,包括pre-training(預(yù)訓(xùn)練)和Fine-tuning(微調(diào))游沿。
預(yù)訓(xùn)練階段BERT模型有兩個(gè)任務(wù)
- Masked LM
對(duì)15%的詞挖坑做完形填空诀黍。這15%的詞中有80%被替換為[mask],有10%被隨機(jī)替換成其他單詞,還有10%保持不變咒彤。 - Next Sentence Prediction (NSP)
根據(jù)上文預(yù)測(cè)下文,其中有50%是正確的旷档,另外50%從預(yù)料中隨機(jī)找出來(lái)鞋屈。這個(gè)任務(wù)為了更好的學(xué)習(xí)到句法
BERT模型在微調(diào)階段也要按照BERT要求的形式進(jìn)行輸入,包括Token Embeddings渠啊,Segment Embeddings Position Embeddings
對(duì)于下游的任務(wù),只需要按照論文中的方式進(jìn)行改造即可权旷。對(duì)于我項(xiàng)目中的命名實(shí)體識(shí)別屬于文本分類(lèi)任務(wù)替蛉,按照第四種方式進(jìn)行改造即可。
項(xiàng)目背景
簡(jiǎn)單聊下我們的項(xiàng)目躲查,通過(guò)爬蟲(chóng)將一批非結(jié)構(gòu)化的房源文本數(shù)據(jù)抓取下來(lái),然后將其解析成的結(jié)構(gòu)化數(shù)據(jù)方便下游業(yè)務(wù)線(xiàn)使用译柏。
項(xiàng)目實(shí)戰(zhàn)總結(jié)
網(wǎng)上已經(jīng)有很多教程了,我就不在代碼層面寫(xiě)太多了鄙麦,主要把開(kāi)發(fā)流程中的經(jīng)驗(yàn)梳理一下供大家參考
打標(biāo)簽
對(duì)于NER任務(wù)任務(wù)來(lái)講典唇,需要對(duì)每個(gè)字進(jìn)行BIO標(biāo)注,不知道其他同學(xué)用的是什么工具胯府,我很想安利一個(gè)工具叫doccano,安裝賊麻煩,但是用起來(lái)真香盟劫。-
總體流程
開(kāi)發(fā)自己的數(shù)據(jù)處理類(lèi)夜牡,這個(gè)類(lèi)要繼承DataProcessor類(lèi),將訓(xùn)練集,驗(yàn)證集急迂,測(cè)試集轉(zhuǎn)換為example。example包含- guid
數(shù)據(jù)的編號(hào) - tokens
[cls]是文本的開(kāi)頭標(biāo)識(shí)蹦肴,[sep]是每句話(huà)的結(jié)尾 - input_ids
input_ids是字典中該字對(duì)應(yīng)的index - input_mask
1代表真實(shí)輸入阴幌,0代表padding的內(nèi)容 - segment_id
BERT允許輸入兩句話(huà)矛双,第一句話(huà)用0表示议忽,第二句話(huà)用1表示懒闷,由于NER任務(wù)只需要1句話(huà)愤估,所以都是0. - label_id
與input_ids類(lèi)似速址,label的編碼
- guid
將example轉(zhuǎn)為feature然后存入到tf-record落地玩焰,后續(xù)訓(xùn)練和預(yù)測(cè)都是用tf-record作為輸入
-
OOM的解決
- 減少max_seq_length
- 減小train_batch_size
- 使用合適的預(yù)訓(xùn)練模型,如果Large不行就換base
預(yù)測(cè)效率
預(yù)測(cè)1條數(shù)據(jù)需要15秒左右的時(shí)間芍锚,批量預(yù)測(cè)6000條左右的數(shù)據(jù)大概在90秒左右昔园。