更好的閱讀體驗(yàn)請(qǐng)?zhí)D(zhuǎn)至模型增強(qiáng)(1)利用NLG 增強(qiáng)QA 任務(wù)性能
背景
上周打算把UniLM在toolkit4nlp的基礎(chǔ)上實(shí)現(xiàn)一下,又刷了一遍論文,發(fā)現(xiàn)作者提到用UniLM做問(wèn)題生成,來(lái)增強(qiáng)QA任務(wù)的性能,覺(jué)得很有意思,所以想嘗試一下。
UniLM
因?yàn)檫@篇 UniLM 是主角,所以簡(jiǎn)單介紹一下該模型。該模型是通過(guò)靈活使用 attention mask ,將 NLG 與 NLU 任務(wù)統(tǒng)一在來(lái)一起,所以叫 unified LM,
他的做法是將 left-to-right/right-to-left/masked lm/seq2seq lm/放在一個(gè)框架里訓(xùn)練,從而讓模型兼具 NLU 與 NLG 的能力。

而為了達(dá)到這個(gè)訓(xùn)練,只需要在 bert 的基礎(chǔ)上根據(jù)不同的 lm 調(diào)整 attention mask 即可。所以利用 bert 做 NLG 時(shí),只需要調(diào)整 attention mask
為 seq2seq lm 對(duì)應(yīng)mask即可。
數(shù)據(jù)增強(qiáng)
通常增強(qiáng)都是同義詞/近義詞替換,subsequence的隨機(jī)刪除/重復(fù)/互換等,我之前在做百度比賽時(shí)嘗試過(guò)隨機(jī)刪除和隨機(jī)兩個(gè)片段互換位置,提升不是
非常大而論文里大問(wèn)題生成帶來(lái)大提升還是相當(dāng)大的:

仔細(xì)想一下,由于attention機(jī)制,互換只是改變了position embedding部分內(nèi)容,而這部分的互換對(duì)模型的影響是很弱的;隨機(jī)刪除可能會(huì)破壞語(yǔ)義,
所以增加模型robust的同時(shí)可能會(huì)降低模型性能。而問(wèn)題生成,則可以看作是同義詞/近義詞替換的句子級(jí)別替換,所以理論上能帶來(lái)不錯(cuò)的提升。
從對(duì)抗的角度來(lái)看,生成的問(wèn)題在語(yǔ)義上與原問(wèn)題基本一致,這也正好符合<code>輸入的微小改變</code>,從而讓模型在這種帶有微小擾動(dòng)的前提下仍然能很好的預(yù)測(cè)。
實(shí)驗(yàn)
既然UniLM具有很強(qiáng)的NLG能力能力,那就有很多不同的玩法。首先,可以訓(xùn)練一個(gè)模型,來(lái)針對(duì) context 和 answer 生成對(duì)應(yīng)的問(wèn)題,來(lái)對(duì)問(wèn)題進(jìn)行
<code>"換個(gè)問(wèn)法"</code>,其次,既然可以對(duì)問(wèn)題<cdoe>"換個(gè)問(wèn)法"</code>,自然也可以<code>"換個(gè)問(wèn)題"</code>,也就是根據(jù) context 生成新的問(wèn)題
和答案。另外,由于是擴(kuò)增訓(xùn)練數(shù)據(jù),所以有一個(gè)技巧是做生成是將 train data 與 dev data 互換,不過(guò)由于我用的是百度比賽數(shù)據(jù),dev data 太少,
所以我是 train + dev。
問(wèn)題生成
問(wèn)題生成時(shí),就是將 context 與 answer 拼接,然后生成對(duì)應(yīng)的question。具體樣本形如:<code> [CLS] answer + context [SEP] question [SEP]</code> .
模型直接用bert base權(quán)重按UniLM的seq2seq方式來(lái)構(gòu)建,可以看到效果還是很不錯(cuò)的,比如:
<blockquote>
context:報(bào)雅思或者托付培訓(xùn)班,一般情況下要900元左右。 雅思和托??荚嚳梢宰詫W(xué): 一、基礎(chǔ)知識(shí)準(zhǔn)備:單詞、基本語(yǔ)法、長(zhǎng)難句分析; 二、板塊訓(xùn)練:聽(tīng)說(shuō)讀寫(xiě),四個(gè)板塊; 三、合理備考計(jì)劃,可以參見(jiàn)中國(guó)上別人經(jīng)驗(yàn)結(jié)合自己的自身?xiàng)l件; 四、效果強(qiáng)化跟蹤,使用合理的備考軟件或者是自測(cè)題目隨時(shí)跟蹤自己的學(xué)習(xí)狀態(tài)
question:雅思班價(jià)格
answer: ['900元', '900元左右']
generate question: 雅思班報(bào)名多少錢(qián)
</blockquote>
<blockquote>context:USB電壓有5伏 USB一般4根線, 中間兩根是數(shù)據(jù)線, 左右各為 +- 線 只要不短路是不會(huì)燒主板該插口的 ,我想你應(yīng)該這樣做,手機(jī)的線的一端直接插入手提電腦,另一頭剪掉頭子,從線中分離出四根線, 用萬(wàn)用表測(cè)出(紅色+和其它色如黑-)剩下兩根用膠布包扎(不用)然后 在這兩根線上(正電極中最好串一50到100歐電阻)后接入一支高亮度發(fā)光二極管就成功了.
question:usb線電壓
answer: ['5伏']
generate question: usb線電壓 </blockquote>
解碼時(shí),有兩種選擇:隨機(jī)抽樣與 beam search 。隨機(jī)抽樣可以增加問(wèn)題的多樣性,并且可以生成多個(gè)問(wèn)題;beam search近似最優(yōu),得到一個(gè)最優(yōu)的
問(wèn)題。由于我們是使用 train data 訓(xùn)練模型,在對(duì) train data 生成新的問(wèn)題時(shí),beam search 將可能產(chǎn)生很多一摸一樣的問(wèn)題,這樣將降低新增
數(shù)據(jù)的量;而隨機(jī)抽樣能產(chǎn)生很多新的問(wèn)題,但可能新生成的問(wèn)題與答案并不配套,還需要一些后處理之后才能真正拿來(lái)用。這里兩種方式都拿來(lái)做實(shí)驗(yàn),
并對(duì)生成的問(wèn)題做一個(gè)簡(jiǎn)單的過(guò)濾:新生成的問(wèn)題與原問(wèn)題中有70%以上的字是重合的。
random sample的樣本經(jīng)過(guò)了很多次過(guò)濾之后才能基本達(dá)到baseline的效果,所以生成的問(wèn)題如果"問(wèn)非所答",對(duì)最終的效果反而是不好的,這也符合預(yù)期。
問(wèn)題答案對(duì)生成
問(wèn)題答案對(duì)生成時(shí),由于答案是在 context 內(nèi)的,相對(duì)問(wèn)題生成簡(jiǎn)單一些,所以我們先生成答案,再根據(jù) context 和生成的 answer 來(lái)生成對(duì)應(yīng)的
question。不過(guò)為了讓問(wèn)題答案對(duì)更豐富多樣,解碼答案時(shí)我們采用隨機(jī)抽樣,而生成問(wèn)題時(shí),為了讓問(wèn)題盡量準(zhǔn)確,我們采用 beam search。
樣本形如 <code>[CLS]context[SEP]answer[SEP][question][SEP]</code>,生成的效果如下:
<blockquote>
context:您好,孕婦整個(gè)孕期體重增加12.5公斤左右,在增加的這12.5公斤中,胎兒的體重占3公斤左右,胎盤(pán)和羊水約是2公斤左右。在孕早期(懷孕3個(gè)月以?xún)?nèi))增加2公斤,中期(懷孕3-6個(gè)月)以及末期(懷孕7-9個(gè)月)各增加5公斤左右。所以懷孕6個(gè)月體重增加7公斤左右比較正常。希望我的回答對(duì)你有所幫助。
question:孕婦6個(gè)月體重增加多少
answer: 7公斤左右
generate question: 孕婦6個(gè)月體重增加多少
generate answer: 12.5公斤左右
</blockquote>
不過(guò)也由于train data 參與訓(xùn)練,所以很多生成的問(wèn)題答案對(duì)與原始問(wèn)題答案對(duì)一致,如果有更多的外部數(shù)據(jù),可以利用外部數(shù)據(jù)來(lái)訓(xùn)練。
總結(jié)
通過(guò)生成新的問(wèn)題與新的問(wèn)題答案對(duì)能在一定程度上提高qa 任務(wù)的性能,在生成問(wèn)題時(shí),用beam search 得到的新問(wèn)題雖然量少但由于更準(zhǔn)確,所以
能帶來(lái)一定的提升;用隨機(jī)采樣生成的問(wèn)題會(huì)有部分與答案無(wú)關(guān)的或者語(yǔ)義有點(diǎn)不通順的問(wèn)題,所以可能反而會(huì)導(dǎo)致性能降低;問(wèn)題答案對(duì)的生成時(shí),
先生成相對(duì)簡(jiǎn)單的回答再生成對(duì)應(yīng)問(wèn)題,能對(duì)性能帶來(lái)不錯(cuò)的提升,在做qa相關(guān)任務(wù)時(shí),可以嘗試使用一下。
實(shí)驗(yàn)代碼:
qa_baseline
qa_question_generation_seq2seq
qa_question_answer_generation_seq2seq