摘要
本文提供并介紹一個(gè)NLP模型工具箱初澎,能夠完成“分類”屹逛,“序列標(biāo)注”疾渣,“文本匹配”和“文本生成”這四種常見(jiàn)的NLP任務(wù),每類任務(wù)都提供多種模型供用戶進(jìn)行使用冗茸,用戶只需要按照規(guī)范準(zhǔn)備訓(xùn)練數(shù)據(jù)席镀,使用本工具箱就可以訓(xùn)練得到模型,并且可以直接使用本框架提供的java客戶端調(diào)用wpai平臺(tái)獲取預(yù)測(cè)結(jié)果(離線訓(xùn)練和在線預(yù)測(cè)需要用戶手工執(zhí)行夏漱,本框架會(huì)提供“在線預(yù)測(cè)”中預(yù)測(cè)文件的解析代碼)豪诲,用戶無(wú)需任何編碼工作。
前言
NLP有四類常見(jiàn)的任務(wù)挂绰,分別是分類屎篱,序列標(biāo)注,文本匹配和文本生成葵蒂,在實(shí)際應(yīng)用中交播,這四類任務(wù)能夠解決大多數(shù)場(chǎng)景的問(wèn)題。
目前為止深度學(xué)習(xí)模型的構(gòu)建還是基于一些基礎(chǔ)的模塊践付,比如rnn秦士,cnn,transformer等永高。上述四類常見(jiàn)的任務(wù)隧土,底層都需要對(duì)輸入進(jìn)行編碼,并且這些任務(wù)的底層編碼器基本都可以共用命爬。因此曹傀,我們提供了一套工具,對(duì)這四類任務(wù)常用到的模型進(jìn)行拆解饲宛,把相同的模塊進(jìn)行了封裝皆愉,抽象成了一個(gè)統(tǒng)一的框架,對(duì)外提供統(tǒng)一的接口艇抠。
NLP-Tools具有如下的特點(diǎn):
- 用戶無(wú)需編碼幕庐。對(duì)每種任務(wù),我們定義了標(biāo)準(zhǔn)的輸入文件格式练链,并提供標(biāo)準(zhǔn)的輸出格式翔脱,用戶只需要按照規(guī)范準(zhǔn)備訓(xùn)練數(shù)據(jù),就可以直接使用本框架提供的java客戶端調(diào)用wpai平臺(tái)獲取預(yù)測(cè)結(jié)果媒鼓,用戶不需要任何編碼工作届吁。
- 模型訓(xùn)練簡(jiǎn)單。使用者只需要改變配置即可改變模型結(jié)構(gòu)和訓(xùn)練方式绿鸣,不需要改變代碼疚沐。
- 多種模型可選。每個(gè)任務(wù)潮模,我們都提供了多種業(yè)界最常見(jiàn)的模型亮蛔,對(duì)于同一個(gè)任務(wù),同一份數(shù)據(jù)集擎厢,用戶可以跑多個(gè)模型比較效果究流,然后選擇最好的模型辣吃。
- 簡(jiǎn)單使用wpai平臺(tái)。 NLP-Tools提供導(dǎo)出saved_model的功能芬探,“離線訓(xùn)練”后可以直接在wpai平臺(tái)進(jìn)行部署(提供“在線預(yù)測(cè)”中預(yù)測(cè)文件的解析代碼神得,用戶不用自己編寫),并且提供java客戶端調(diào)用wpai平臺(tái)獲取預(yù)測(cè)結(jié)果偷仿。
- 可以進(jìn)行單條數(shù)據(jù)測(cè)試哩簿。提供單條數(shù)據(jù)測(cè)試的功能,讓使用者更直觀地感受模型的訓(xùn)練效果酝静。
下面會(huì)分別介紹每種基本任務(wù)节榜,最后介紹NLP-Tools工具的架構(gòu)和使用方式。
文本分類任務(wù)
文本分類任務(wù)是NLP中最常見(jiàn)也最實(shí)用的任務(wù):對(duì)于給出的文本别智,我們來(lái)判斷這條文本所屬的類別宗苍。
文本分類任務(wù)架構(gòu)如下:
其中encoder是對(duì)輸入text進(jìn)行編碼,生成表示text的vec亿遂,然后接一層全連接層浓若,最后跟一層softmax,計(jì)算出每個(gè)label的概率蛇数。本工具集成的模型有cnn挪钓,rnn,transformer耳舅,bert和albert(后續(xù)會(huì)集成進(jìn)更多的分類模型)碌上。bert在各種NLP任務(wù)中都表現(xiàn)得非常出色,但是由于模型結(jié)構(gòu)復(fù)雜浦徊,線上推理耗時(shí)較長(zhǎng)馏予。albert使用了參數(shù)共享的方法,但是在bert的基礎(chǔ)上減少了隱藏層維度盔性,并減少了層數(shù)霞丧,使得推理速度加快。
序列標(biāo)注任務(wù)
常用的序列標(biāo)注任務(wù)包括:分詞冕香,命名實(shí)體識(shí)別和詞性標(biāo)注蛹尝。其中命名實(shí)體識(shí)別最為常用,指的是識(shí)別出文本中具有特定意義的實(shí)體悉尾,比如人名突那,地名或者專有名詞。
序列標(biāo)注任務(wù)架構(gòu)如下:
其中encoder是對(duì)輸入text進(jìn)行編碼构眯,生成表示text的vec愕难,然后對(duì)vec使用crf進(jìn)行解碼,生成解碼序列。對(duì)于序列標(biāo)注任務(wù)來(lái)說(shuō)猫缭,深度學(xué)習(xí)里常用的模型有bilstm+crf葱弟,idcnn+crf,transformer+crf饵骨,bert+crf翘悉,本框架均有集成。
語(yǔ)義匹配任務(wù)
文本匹配任務(wù)居触,即對(duì)于用戶輸入的query,找到與query語(yǔ)義上最匹配的doc老赤。比如對(duì)于網(wǎng)頁(yè)搜索轮洋,query是用戶輸入,doc是所有的網(wǎng)頁(yè)抬旺;對(duì)于智能客服來(lái)說(shuō)弊予,query是用戶輸入的問(wèn)題,doc是所有的標(biāo)準(zhǔn)問(wèn)題开财。對(duì)于文本匹配任務(wù)汉柒,通常會(huì)抽象為:判斷兩個(gè)輸入text1和text2是否相似(0表示不相似,1表示相似)责鳍。
序列標(biāo)注任務(wù)架構(gòu)如下:
語(yǔ)義匹配任務(wù)目前有三種常用的模型架構(gòu):
- representation-based 類模型碾褂,思路是基于 Siamese 網(wǎng)絡(luò),提取文本整體語(yǔ)義再進(jìn)行匹配历葛。上圖中表示為encoder->matching正塌,不需要interaction。
- interaction-based 類模型恤溶,思路是捕捉直接的匹配信號(hào)(模式)乓诽,將詞間的匹配信號(hào)作為灰度圖,再進(jìn)行后續(xù)建模抽象咒程。上圖中表示為encoder->interaction->matching鸠天。
- bert類模型,思路是對(duì)text1和text2直接建模帐姻,進(jìn)行分類稠集。上圖中表示為Bert-2->matching,其中Bert-2表示Bert的第二種訓(xùn)練任務(wù)卖宠。
本框架目前只集成了representation-based類和bert類模型巍杈,后續(xù)會(huì)集成進(jìn)來(lái)interaction-based 類模型。
文本生成
序列生成是自然語(yǔ)言處理里面很重要的一個(gè)任務(wù):對(duì)于特定的輸入扛伍,生成自然語(yǔ)言筷畦。比如,輸入可以是圖片時(shí),輸出是對(duì)圖片的描述鳖宾;輸入是一句話時(shí)吼砂,輸出是這句話的回應(yīng)。本項(xiàng)目中的文本生成鼎文,輸入和輸出都是文本膳凝。目前常見(jiàn)的序列生成任務(wù)模型基本都是encoder-decoder結(jié)構(gòu)的網(wǎng)絡(luò),比如rnn化借,transformer和GPT陶舞。
序列標(biāo)注任務(wù)架構(gòu)如下:
目前本工具只集成了rnn模型做文本生成,后續(xù)會(huì)集成進(jìn)來(lái)transformer和GPT撑帖。
NLP-Tools介紹
1. 整體架構(gòu)介紹
通過(guò)上述對(duì)四種任務(wù)的介紹蓉坎,我們可以看出四種任務(wù)的encoder層可以共用,只是每種任務(wù)的decoder層各有不同胡嘿,結(jié)構(gòu)如下:
2. 使用方式
在深度學(xué)習(xí)中蛉艾,訓(xùn)練一個(gè)模型一般需要兩類參數(shù),一類是模型參數(shù)衷敌,用來(lái)設(shè)置模型的結(jié)構(gòu)勿侯,比如lstm有多少層,cnn卷積核的大小等缴罗;另一類是訓(xùn)練參數(shù)助琐,比如學(xué)習(xí)率,訓(xùn)練集路徑瞒爬,訓(xùn)練的epoch數(shù)量等弓柱。在本工具中,模型參數(shù)我們使用配置文件侧但,訓(xùn)練參數(shù)我們使用命令行矢空。用戶只需要對(duì)兩類參數(shù)進(jìn)行配置就可以直接訓(xùn)練,不需要修改任何代碼禀横。
下面定義了四種任務(wù)訓(xùn)練數(shù)據(jù)的輸入格式屁药,用戶只需要按照要求提供訓(xùn)練數(shù)據(jù),借助NLP-TOOLS工具柏锄,就可以在wpai平臺(tái)直接進(jìn)行離線訓(xùn)練酿箭,訓(xùn)練完之后在wpai平臺(tái)進(jìn)行“在線預(yù)測(cè)”部署,NLP-TOOLS工具提供了java版的scf客戶端趾娃,可以讓用戶直接調(diào)用“在線預(yù)測(cè)”部署的模型缭嫡,獲取輸出。
下面會(huì)分別介紹輸入文件格式定義抬闷,模型輸出定義妇蛀,然后介紹下wpai平臺(tái)詳細(xì)操作流程耕突。
2.1 輸入輸出
classification任務(wù):
輸入文件格式定義:
sentence[SEP]label
labeling任務(wù)輸入文件格式定義:
其中char1-char3是sentence1的字,label1-label3是char1-char3對(duì)應(yīng)的BIO標(biāo)注评架,char和label之間用空格分隔眷茁;其中char4-char7是sentence2的字,label4-label7是char4-char7對(duì)應(yīng)的BIO標(biāo)注纵诞。sentence1和sentence2之間用\n 分隔上祈。
# sentence1
char1 label1
char2 label2
char3 label3
# sentence2
char4 label4
char5 label5
char6 label6
char7 label7
matching任務(wù)輸入文件格式定義:
sentence1[SEP]sentence2[SEP]label
seq2seq任務(wù)輸入文件格式定義:
sentence1[SEP]sentence2
2.2 詳細(xì)操作
(1) 離線訓(xùn)練
按照如下方式配置wpai就可以直接進(jìn)行訓(xùn)練。
mkdir -p /workspace/model && hadoop fs -get /home/hdp_teu_dia/guesslike/user/chenlu17/wpai/nlp-tools/python-core . && cd python-core &&
python run.py --task_name=classification
--model_name=transformer
--config_file=grocery/config/transformer_config.json
--do_train=true
--do_eval=true
--do_export=true
--do_predict_single=false
--data_dir=grocery/jd_comments_emotions.out
--middle_dir=grocery/data
--vocab_file=grocery/vocab.txt
--max_seq_length=40
--train_batch_size=32
--learning_rate=5e-4
--num_train_epochs=5.0
--output_dir=/workspace/model
--config_labels=grocery/labels.yml
--init_checkpoint_path=
--re_convert_tfrecord=true
- task_name:從classification浙芙,labeling登刺,matching和seq2seq四種模型中選一個(gè)
- config_file:模型配置文件路徑
- do_export:是否導(dǎo)出pb文件
- init_checkpoint_path:預(yù)訓(xùn)練文件的路徑
(2) 在線預(yù)測(cè)
本項(xiàng)目提供了wpai在線預(yù)測(cè)解析的jar包,并提供客戶端scf的調(diào)用代碼茁裙。
客戶端scf調(diào)用的輸入輸出定義如下:
client目錄下的文件是客戶端調(diào)用文件塘砸,每個(gè)文件提供main函數(shù)提供直接調(diào)用,只需要java文件中的
TASK_ID
即可晤锥。impl目錄下的文件是預(yù)測(cè)解析文件,用戶只需要把PredictiOnline后面的任務(wù)改為自己的taskid廊宪,并打成jar包即可使用矾瘾。
3. demo頁(yè)面
對(duì)于每個(gè)任務(wù)本文都訓(xùn)練了一個(gè)模型,然后提供web頁(yè)面來(lái)調(diào)用箭启。
3.1 classification任務(wù)
- 測(cè)試地址:http://10.126.86.69:9966/ailab/classification?text=剛買來(lái)就壞了壕翩,再也不想要了
- 數(shù)據(jù)集:京東商品評(píng)論情感分類
- 模型:transformer
- result中的
NEG
表示負(fù)情感的概率,POS
表示正情感的概率
3.2 labeling任務(wù)
- 測(cè)試地址:http://10.126.86.69:9966/ailab/labeling?text=我在去年七月份曾經(jīng)去過(guò)中國(guó)的北京
- 數(shù)據(jù)集:98年人民日的命名實(shí)體數(shù)據(jù)集傅寡,標(biāo)注了時(shí)間(TIM)放妈,地點(diǎn)(LOC),人物(PER)和機(jī)構(gòu)(ORG)
- 模型:transformer+crf
- result表示輸入text的字對(duì)應(yīng)的BIO序列荐操,從中我們看到識(shí)別出來(lái)了時(shí)間
去年七月份
芜抒,地點(diǎn)中國(guó)
和北京
3.3 matching任務(wù)
- 測(cè)試地址:http://10.126.86.69:9966/ailab/matching?text1=找工作網(wǎng)站哪個(gè)好?&text2=用哪個(gè)網(wǎng)站找工作比較好啊
- 數(shù)據(jù)集:LCQMC(大規(guī)模中文問(wèn)題匹配)數(shù)據(jù)集
- 模型:雙transformer(representation-based結(jié)構(gòu))
- result中的
NEG
表示text1和text2不相似的概率托启,POS
表示相似的概率
3.4 seq2seq任務(wù)
- 測(cè)試地址:http://10.126.86.69:9966/ailab/seq2seq?text=半夜空庭明月色
- 10w對(duì)對(duì)聯(lián)
- rnn結(jié)構(gòu)的seq2seq
- result中是seq2seq給出的下聯(lián)
后續(xù)計(jì)劃
- 分別詳細(xì)介紹每種任務(wù)宅倒,包括常用模型,評(píng)測(cè)指標(biāo)屯耸,常用數(shù)據(jù)集等拐迁。并且會(huì)挑選一種數(shù)據(jù)集,使用NLP-Tools工具評(píng)測(cè)該數(shù)據(jù)集在多種模型上的效果對(duì)比疗绣。
- 完善每種任務(wù)的模型類別线召,跟進(jìn)業(yè)界最新的模型。