1. UIE 介紹
信息抽燃詈簟(IE)是一個(gè)從文本到結(jié)構(gòu)的轉(zhuǎn)換過程。常見的實(shí)體蔗牡、關(guān)系颖系、事件分別采取Span、Triplet辩越、Record形式的異構(gòu)結(jié)構(gòu)嘁扼。具體表現(xiàn)為生成式統(tǒng)一建模,提出了面向信息抽取的統(tǒng)一文本到結(jié)構(gòu)生成框架 UIE黔攒。
上面包含信息抽取的四個(gè)任務(wù):實(shí)體識別趁啸、關(guān)系抽取强缘、事件抽取、觀點(diǎn)抽取不傅。
信息抽取任務(wù)可以表述為“文本到結(jié)構(gòu)”的問題欺旧,不同的 IE 任務(wù)對應(yīng)不同的結(jié)構(gòu)。UIE旨在通過單一框架統(tǒng)一建模不同IE任務(wù)的文本到結(jié)構(gòu)的轉(zhuǎn)換蛤签,也就是:不同的結(jié)構(gòu)轉(zhuǎn)換共享模型中 相同的底層操作 和 不同的轉(zhuǎn)換能力辞友。
主要有以下兩個(gè)挑戰(zhàn):
1)IE任務(wù)的多樣性,需要提取許多不同的目標(biāo)結(jié)構(gòu)震肮,如實(shí)體成榜、關(guān)系、事件等羹奉;
2)IE任務(wù)是通常是使用不同模式定義的特定需求(不同schema)笔横,需要自適應(yīng)地控制提取過程;
因此沦偎,針對上述挑戰(zhàn)疫向,需要:
1)設(shè)計(jì)結(jié)構(gòu)化抽取語言(SEL,Structured Extraction Language)來統(tǒng)一編碼異構(gòu)提取結(jié)構(gòu)豪嚎,即編碼實(shí)體搔驼、關(guān)系、事件統(tǒng)一表示侈询。
2)構(gòu)建結(jié)構(gòu)化模式提示器(SSI舌涨,Structural Schema Instructor),一個(gè)基于schema的prompt機(jī)制扔字,用于控制不同的生成需求囊嘉。
上圖展示了UIE的整體框架,整體架構(gòu)就是:SSI + Text -> SEL革为。一句話簡單概括就是:SSI就是輸入特定抽取任務(wù)的schema扭粱,SEL就是把不同任務(wù)的抽取結(jié)果統(tǒng)一用1種語言表示。
2. SEL:結(jié)構(gòu)化抽取語言
SEL:本質(zhì)上就是對輸出進(jìn)行統(tǒng)一化震檩。不同的 IE 任務(wù)可以分解為 2 個(gè)原子操作:
- Spotting:找出Spot Name對應(yīng)的Info Span琢蛤,如某個(gè)實(shí)體或Trigger觸發(fā)詞;
- Associating:找出Asso Name對應(yīng)的Info Span恳蹲,鏈接Info Span片段間的關(guān)系:如兩個(gè)實(shí)體pair的關(guān)系虐块、論元和觸發(fā)詞間的關(guān)系;
如上圖所示:
1)Spot Name:Spotting操作的Info Span的類別信息嘉蕾,如實(shí)體類型贺奠;
2)Asso Name: Associating操作的Info Span的類別信息,如關(guān)系類型错忱、關(guān)系類型儡率;
3)Info Span:Spotting或Associating操作相關(guān)的文本Span挂据;
- 藍(lán)色部分代表關(guān)系任務(wù):person為實(shí)體類型Spot Name,work for為關(guān)系類型Asso Name儿普;
- 紅色部分代表事件任務(wù):start-position為事件類型Spot Name崎逃,employee為論元類型Asso Name;
- 黑色部分代表實(shí)體任務(wù):organization和time為實(shí)體類型Spot Name眉孩;
3. SSI:結(jié)構(gòu)化模式提示器
SSI 的本質(zhì)一個(gè)基于schema的prompt機(jī)制个绍,用于控制不同的生成需求:在Text前拼接上相應(yīng)的Schema Prompt,輸出相應(yīng)的SEL結(jié)構(gòu)語言浪汪。
不同任務(wù)的的形式是:
1)實(shí)體抽劝褪痢:[spot] 實(shí)體類別 [text]
2)關(guān)系抽取:[spot] 實(shí)體類別 [asso] 關(guān)系類別 [text]
3)事件抽人涝狻:[spot] 事件類別 [asso] 論元類別 [text]
4)觀點(diǎn)抽裙慊帧:[spot] 評價(jià)維度 [asso] 觀點(diǎn)類別 [text]
不同數(shù)據(jù)集的詳細(xì)形式見論文。
形式化表示如下:用 表示 SSI呀潭,用表示需要輸入的原始句子钉迷,UIE 模型由 transformer 的 Encoder 和 Decoder 組成。
輸出 就是采用 SEL 語法描述的結(jié)構(gòu)化數(shù)據(jù)钠署,其中
UIE 模型采用 Encoder 與 Decoder 結(jié)構(gòu)進(jìn)行生成式任務(wù)糠聪。
4. 預(yù)訓(xùn)練與微調(diào)
作者采用的模型是T5-v1.1-base和T5-v1.1-large作為UIE-base和UIE-large,模型的參數(shù)初始化直接使用了T5-v1.1的參數(shù)踏幻,也就是說直接基于其進(jìn)行了二次預(yù)訓(xùn)練枷颊。
4.1 預(yù)訓(xùn)練數(shù)據(jù)
主要由Wikipedia戳杀、Wikidata和ConceptNet三部分組成该面,作者通過這三部分?jǐn)?shù)據(jù)構(gòu)造了如下三種形式的預(yù)訓(xùn)練數(shù)據(jù):
1):數(shù)據(jù)表示為(),其中 是加在輸入句子前面的prompt信卡,是輸入的原始句子隔缀,是需要生成的目標(biāo)句子。
2):只有基于 SEL 語法的結(jié)構(gòu)性 record傍菇,數(shù)據(jù)表示為()猾瘸。
3):只有無結(jié)構(gòu)的原始文本數(shù)據(jù),進(jìn)行 mask 語言模型訓(xùn)練丢习,數(shù)據(jù)表示為()牵触。
4.2 預(yù)訓(xùn)練任務(wù)
針對上述三種類型的數(shù)據(jù),分別設(shè)計(jì)了三種預(yù)訓(xùn)練任務(wù):
1)針對咐低,輸入數(shù)據(jù)為 SSI + 原始文本揽思,使其生成結(jié)構(gòu)化的數(shù)據(jù) record,不同的是作者在 record 中不僅加入了原本存在的正樣本见擦,也加入了一些負(fù)樣本作為噪音钉汗,比如羹令。
2)針對,輸入數(shù)據(jù)為 record损痰,輸入前面的部分福侈,使其生成剩余部分,并且只訓(xùn)練 UIE 的 decoder 部分卢未,使其學(xué)會 SEL 語法肪凛。
3)針對,做無監(jiān)督的 mask 語言模型訓(xùn)練辽社,在原始句子中 MASK 掉15%的 tokens显拜,然后生成 MASK 的部分。
最終 Loss 為上述三個(gè) Loss 相加爹袁。作者并不是分開做這三個(gè)預(yù)訓(xùn)練任務(wù)的远荠,而是將其統(tǒng)一化,全部表示為三元組失息,在每個(gè) batch 中隨機(jī)抽取每個(gè)任務(wù)的數(shù)據(jù)去訓(xùn)練譬淳。
4.3 微調(diào)
微調(diào)與預(yù)訓(xùn)練任務(wù)的類似,數(shù)據(jù)形式是盹兢,微調(diào)部分依然加入了負(fù)樣本邻梆。如下圖所示:表格上部分為輸入,下部分為第一行為正樣本的輸出绎秒,第二行為加入了負(fù)樣本浦妄。隨機(jī)插入一些原標(biāo)簽中沒有的信息,即(Spot Name: [NULL])或(Asso Name: [NULL])见芹,圖中輸入句子中并沒有 facility 的實(shí)體剂娄,而標(biāo)簽中插入了(facility: [NULL])。
5. 實(shí)驗(yàn)
5.1 全監(jiān)督實(shí)驗(yàn)
最右邊的 SEL 列是指基于T5-v1.1-large進(jìn)行微調(diào)得到的結(jié)果玄呛,UIE是指基于UIE-large進(jìn)行微調(diào)的結(jié)果阅懦,可以看到幾乎在全部數(shù)據(jù)集上都取得了SOTA的結(jié)果,但是通過對比SEL和UIE發(fā)現(xiàn)預(yù)訓(xùn)練部分對結(jié)果的提升并不大徘铝,通過這個(gè)可以看出作者設(shè)計(jì)的SEL語法和SSI還是很強(qiáng)大的耳胎,另一方面也說明T5本身的生成能力就很強(qiáng)大。
5.2 少樣本實(shí)驗(yàn)
結(jié)論:
1)大規(guī)模異構(gòu)監(jiān)督預(yù)訓(xùn)練可以學(xué)習(xí)通用的信息抽取能力惕它,使模型具有更好小樣本學(xué)習(xí)能力怕午。
2)當(dāng)去掉SSI結(jié)構(gòu)化模式提示器后,發(fā)現(xiàn)指標(biāo)下降淹魄,因此:SSI 具有更好的定向遷移的能力郁惜。
5.3 消融實(shí)驗(yàn)
在小樣本情景下,通過消融實(shí)驗(yàn)驗(yàn)證了插入負(fù)樣本的有效性揭北,結(jié)果如下圖所示扳炬,這種插入負(fù)樣本的方式在小樣本情況下影響顯著吏颖。
6. paddle 和 pytorch 代碼解析
6.1 paddlenlp 解析
demo 代碼:
from pprint import pprint
from paddlenlp import Taskflow
schema = [{"歌曲名稱":["歌手", "所屬專輯"]}, "人物"]
ie = Taskflow('information_extraction', schema=schema)
res = ie("告白氣球是周杰倫在專輯周杰倫的床邊故事里面的歌曲")
pprint(res)
輸出結(jié)果如下:
[{'人物': [{'end': 8,
'probability': 0.9920330175461345,
'start': 5,
'text': '周杰倫'},
{'end': 14,
'probability': 0.9563452086659794,
'start': 11,
'text': '周杰倫'}],
'歌曲名稱': [{'end': 4,
'probability': 0.9625632485885518,
'relations': {'所屬專輯': [{'end': 19,
'probability': 0.8491942125644769,
'start': 11,
'text': '周杰倫的床邊故事'}],
'歌手': [{'end': 8,
'probability': 0.9986735730139671,
'start': 5,
'text': '周杰倫'}]},
'start': 0,
'text': '告白氣球'}]}]
經(jīng)過 UIETask 類,繼承自 Task 類恨樟,查看 Task 類的 call 函數(shù):
def __call__(self, *args):
inputs = self._preprocess(*args)
outputs = self._run_model(inputs)
results = self._postprocess(outputs)
return results
查看 _run_model 方法在 UIETask 里面具體實(shí)現(xiàn)半醉。
def _run_model(self, inputs):
raw_inputs = inputs['text']
results = self._multi_stage_predict(raw_inputs)
inputs['result'] = results
return inputs
查看 _multi_stage_predict 函數(shù):遍歷每個(gè) schema,然后通過上一步的結(jié)果去進(jìn)行預(yù)測劝术。
while len(schema_list) > 0:
node = schema_list.pop(0)
...
...
if len(examples) == 0:
result_list = []
else:
result_list = self._single_stage_predict(examples)
結(jié)果如下:
[{'text': '告白氣球是周杰倫在專輯周杰倫的床邊故事里面的歌曲', 'prompt': '歌曲名稱'}]
[{'text': '告白氣球是周杰倫在專輯周杰倫的床邊故事里面的歌曲', 'prompt': '人物'}]
[{'text': '告白氣球是周杰倫在專輯周杰倫的床邊故事里面的歌曲', 'prompt': '告白氣球的歌手'}]
[{'text': '告白氣球是周杰倫在專輯周杰倫的床邊故事里面的歌曲', 'prompt': '告白氣球的所屬專輯'}]
從這些段代碼可以看到缩多,不管是訓(xùn)練還是推理,模型都未采用生成式养晋。而是將prompt+text直接送入Ernie編碼衬吆,然后編碼送入指針網(wǎng)絡(luò),也就是一個(gè)全連接層預(yù)測實(shí)體的頭绳泉,另一個(gè)預(yù)測實(shí)體的尾逊抡。
原始論文的實(shí)現(xiàn)方式,是通過生成式零酪,一次性可以生成出SEL結(jié)構(gòu)冒嫡。而百度paddlenlp的做法,則是將SSI進(jìn)行拆分四苇,進(jìn)行多步預(yù)測孝凌,需要先找出[SPOT]對應(yīng)[Info Span],然后[Info Span]與[ASSO]拼接月腋,生成新的prompt蟀架,然后再送入模型,找出[ASSO]榆骚。