区别于传统低效标注,两种基于自然语言解释的数据增强方法
本文內容整理自 PaperWeekly 和 biendata 在 B 站組織的直播回顧,點擊文末閱讀原文即可跳轉至 B 站收看本次分享完整視頻錄像,如需嘉賓課件,請在?PaperWeekly?公眾號回復關鍵詞課件下載獲取下載鏈接。
作者簡介:秦禹嘉,清華大學電子工程系本科生,大二開始在清華大學自然語言處理實驗室學習。導師劉知遠副教授。主要研究方向為義原知識體系的完善與應用。
盡管深度學習模型已經在許多自然語言處理任務上取得了非常好的效果,它們通常依賴于大量的訓練數據;然而在實際應用場景下,標注能力、訓練數據并不充足的情況經常出現,因此如何讓標注者高效率地標注是一個十分有意義的問題。
傳統給出標簽的標注方式在一定程度上限制了標注者能夠提供的信息量,很多情況下我們不僅關注標注者打出的標簽,更加關注于其打出該標簽的理由。因此一種更加高效的做法是讓標注者在給出標簽的同時給出相應的自然語言解釋來解釋其做出該決定的原因。
本文將分享應用自然語言解釋的一些挑戰,并介紹目前應對這些挑戰做出的探索和最新工作。
自然語言解釋的概念與背景
如開篇所講,深度學習的技術已經在許多自然語言處理的任務上取得了很好的效果,但是仍然還有兩個問題沒有解決。第一個是模型通常需要大量的數據。第二個是模型缺乏可解釋性。
先看 data hungry 的問題,很多情況下我們并沒有那么多的數據能夠喂給模型,那么這個模型的魯棒性就會受到一定的影響。同時即使模型能夠達到非常高的準確率,我們也不能 100% 確定它就是在以正確的方式來做出判斷。
比如說它很可能完全不是按照我們設想的、它應該這么做的方式去給出了一個正確的答案。我們更期待的是模型能夠在給出一個標簽的同時,能夠提供一個模型的可解釋性。
我們先看一下傳統的標注方式的整體的流程:首先讓標注者看一個例子,對例子徹底分析后,他就可以給出一個標簽。這樣一個流程看似簡單,但暗藏很多的問題,如果一個標注者看完一個例子,他只能給出標簽的話,他提供的信息是非常少的。這也就是為什么我們常常會覺得標注者的效率非常低。
我們如何能讓標注者對每一個例子提供更多的信息?我們認為鑒于他已經對這個例子有了一個透徹的理解與分析,在允許標注者在提供標簽之后,再給出一段自然語言的解釋,去解釋是如何做出這樣一個標簽的決定的。
基于自然語言解釋的數據增強兩大方向
目前來說基于自然語言解釋的數據增強,總共有兩個大的方向。第一個方向我歸納為隱式方法 implicit way,這類方法通常需要大量地去標注一個非常大的自然語言解釋的數據集,用比如說 language model 的方式去進行一個大規模的訓練,從而讓模型能夠在分類的同時,解碼出自然語言的解釋。
第二類是直接方法 explicit way,這一類方法它就不需要大量的自然語言解釋,它更加強調數據標注的效率。這一類方法通常會用 semantic parsing 也就是語義解析,將無結構的自然語言解釋轉換成結構化的可標注函數,再利用這些可標注函數應用到下游任務上。
這兩個方法我會分別介紹幾篇最近的工作,其中前三篇我會簡單介紹一下他們的思路,我會詳細的介紹第四篇文章 Learning from Explanations with Neural Execution Tree 。這篇是我們在 ICLR 上發表的一篇工作,是南加州大學 INK 實驗室與清華大學自然語言處理實驗室合作完成的一篇工作。
首先我們來介紹隱式方法,來看第一篇文章,也就是 e-SNLI: Natural Language Inference with Natural Language Explanations。
我們知道人類不僅僅從老師提供的帶有標簽的例子中去學習,相反他們通過演示和解釋去尋求對任務的概念性理解、簡單的訓練以獲得高精度的機器學習模型,但這通常會嚴重依賴淺層輸入統計信息,從而使模型的魯棒性不好。
為了使機器學習獲得更加廣泛的應用,模型必須能夠為他們的決策提供強大的可解釋性,并在訓練時從人類的提供的解釋中去學習。
自然語言解釋在這樣的任務下,我認為有三大優勢。首先自然語言對于需要維護模型可靠性的最終用戶來說是非常容易理解的。其次,對人類而言,提供自由形式的語言也是最容易的,從而省去了去學習一個正式的語言所需要的額外工作。
所謂正式語言,比如說它可以是一種類似編程性的語言,如果我們只是一個普通老百姓,其實我們很難人人都能掌握一套編程語言。最后自然語言解釋最終可能會從現有的大規模的自由格式的文本中挖掘出來。
來看第一篇論文。在上圖這項工作中,作者對斯坦福自然語言推斷數據集也就是 SNLI 的每一個例子,去標注了一個自然語言的解釋,相當于在原來的 SNLI(Natural Language Inference)的基礎上發布了一個新的數據集。自然語言推斷是一項至關重要的自然語言理解的任務。
它的任務大概是這樣的:我們給定兩個句子,這個任務需要判斷這兩個句子之間的關系,而這個關系總共有三種,第一種是 contradiction,表示這兩個句子是有矛盾的。第二個關系是 entailment,也就是說往往是第一個句子表述的信息能夠推出第二個句子。第三種情況是 neutral 中立的,也就是說這兩個句子其實沒有什么關系,它們既不是互相矛盾的,也沒有任何能夠推出的關系。
看上圖第一個例子。Premise 是第一個句子,Hypothesis 是第二個句子。他說 An adult dressed in black holds a stick。第二句說 An adult is walking away, empty-handed。這兩個句子明顯是互相矛盾的,第一句話說人拿著根棍子。
第二個說他手里是沒有東西的,所以他們就是矛盾的。看 Explanation,就是作者給它標注的一個解釋,說 Holds a stick implies using hands so it is not empty-handed。很好地解釋為什么這兩句話是一個矛盾的關系。
我們再去看第三個例子,第一句話說? A man in an orange vest leans over a pickup truck。第二句說? A man is touching a truck。leans over 和 touching,某種程度上可以勉勉強強說它們是在形容同一件事情,所以我們的標簽可以給出一個 entailment 的關系。
我們看它所標注的一個解釋,Man leans over a pickup truck implies that he is touching it。那么解釋的核心思路是想指出 Premise 中的某一個短語或者說某一個詞語,以及 Hypothesis 中的某一個短語或者詞語之間存在什么關系,比如 holds a stick implies using hands so it is not empty-handed。這里的? implies,相當于構建了一個從 Premise 到 Hypothesis 一個橋梁。
再看 SNLI 數據集,作者如果能給 57 萬個例子全部標一個自然語言的解釋,那么我們很容易就可以用 language model 去訓練,從自然語言的解釋中找到? Premise 對應的、highlight 強調性的短語,以及 Hypothesis 中對應的一個強調性的短語,然后再從 Explanation 中去學他們到底是不是在說同一件事情,還是說有 contradiction, neutral 或者 entailment。
這篇工作的數據集是在一個叫 Amazon Mechanical Turk 的工具平臺上標的,標完之后,作者做了一些實驗去論證了他的五個觀點。
第一個觀點是他證明了依靠 SNLI 中的淺層信息提供正確標簽的模型,將無法輕易地去提供正確的解釋。這個什么意思呢?
作者之前有一篇論文,證明了如果有一個模型,不給它喂這兩個句子,只喂給它第一個句子 Premise 讓它去做分類,它一樣能夠達到將近 67% 的準確率。這個是一個非常奇怪的數字,因為像這樣一個任務,如果你不能看到這兩個句子,完全就只能瞎猜,因為這個任務是說這兩個句子有什么關系。
為什么會有這樣的一個實驗結果?準確地說就是數據集標得不夠好,比如,有可能所有 Premise 中含有 holds a stick 這樣的短語,全部都是 contradiction。這就是所謂表層的信息,這些 Premise 中的一些特定的詞語,往往被認為是某些標簽的有利指標。
因此,他們對經過 SNLI 訓練的模型是否是真正的學習理解自然語言是表示懷疑的。這篇文章作者其實想說即使有一個模型能夠從這些淺層信息中學到一個正確標簽,但是它不能提供一個正確的解釋,這是一個非常自然而然的想法,畢竟我只看一個句子,確實沒有辦法說出它到底為什么有這個標簽,因為我要得到這樣一個標簽,一定是要用兩句話。
第二個實驗證明了先讓這個模型去預測一個標簽,然后讓它去生成對這個標簽的解釋,這一套是可行的。怎么去評測這個解釋符不符合呢?他找人去評測,找了另一批標注者去看生成的這一段解釋,看這段解釋有沒有語法錯誤,連不連貫,以及能不能夠正確地解釋這個標簽的原因。
第三個實驗其實是一個更加自然的想法,就是我們去做出這樣一個判斷,通常不是先給出一個標簽再去給出一段解釋,而是心里先有一段解釋以后,再根據這個解釋去生成一個標簽。他發現先生成解釋再得到標簽,加上這個數據集的結果,可以比原來的那個效果好一些。
第四個實驗用一個模型,在一個 BiLSTM 之上加一個 max pooling 的 encoder,在這樣的一個 SNLI 以及它標注的這些解釋上,可以學習到更好的句子表示。之前有一篇工作,用了 BiLSTM+max pooling 這樣一個模型,只在 SNLI 上這么大的數據做一個 pretrain,然后 fine-tune 到其他的一些句子分類的任務上,可以得到一個非常好的效果。
pretrain+fine-tune其實是最近幾年 NLP 的一個老套路了,這篇其實做的也比較早。這篇 ELCLR 作者想說明的是,現在不止在 SNLI 上 pretrain,還在我的 Explanation 上 pretrain 可以得到更好的句子表示。
第五個實驗是在 SNLI 上以及我的這個數據上做,可以傳 transfer 到其他的 SNLI 數據集當中去。它這個模型大概是怎么設計的呢?如下面圖表 9 所示,這是它主要的模型,可以看到它是把這兩個句子分別用一個 share 的 encoder 去把它 encode,得到了一段句子表示。
這兩段句子表示去分類,就可以得到一個標簽。因為標簽總共只有三個,是 contradiction、neutral,以及 entailment,它可以把這三個標簽都給一段 embedding,隨機初始化,在訓練中自己 fine-tune,然后它會把這樣的一個標簽的 embedding,傳遞給它這邊的另一個模型。
這個模型其實就是一個解碼的模型。模型輸入來自于兩個,一個是上文說的 label embedding,另一個是 encode,這兩個句子得到一段表示。這里所有的東西都非常像我們說的 machine translation,也就是它一個詞一個詞地解碼,Explanation 中的每一個詞,然后得到一段 Explanation。這個 f 是 encoder,右邊是一個 BiLSTM,它把第一個句子、第二個句子全部變成 U 和 V 這樣兩個句子表示。
如上圖,第一個是 U 的表示,第二個是 V 的表示,第三個是 U 和 V 的差的絕對值element wise,第四個是 U 和 V 的點擊也是 element wise,這樣就得到四段 embedding,把它這四段 concat 起來,送到一個 fully-connected 和 layers。如果需要分類,它就送給一個 softmax,如果不需要分類就是送給 decoding。
第二篇工作是 Explain Yourself! Leveraging Language Models for Commonsense Reasoning。和第一篇工作總體思路非常相似,差別在于本篇作者關注的是常識推理任務。常識推理涉及模擬人類,對人類每天遇到的普通情況的類型和本質進行推測。
常識推理實際上是比較艱巨的任務,盡管已經有很多工作在 commonsense reasoning 上取得了非常好的進展,但是我們仍不清楚這些模型到底是如何進行推理的,以及在多大程度上是基于世界知識進行推理的,這點和第一篇工作非常相似。
作者也針對一個常識推理的數據集收集了大量的自然語言的解釋,我們可以來看這樣一個例子,比如說他的問題是 While eating a hamburger with friends,what are people trying to do?備選項有三個,第一個是 have fun,第二個是 tasty or indigestion。
這樣一個問題,其實我們人類看來就很容易得出答案是 have fun,因為你和朋友吃漢堡其實都是挺開心的一件事情。
CoS-E 就是給它標注的一個解釋:Usually a hamburger with friends indicates a good time。其實你可以看到它在這邊標解釋的套路跟之前那篇文章是非常相似的,它會從 question 里面找一個關鍵詞或者關鍵的短語。怎么把 choices 中的某一個答案去連接起來,比如說 a hamburger with friends indicate 或者 implies 都可以 a good time。
因為 a good time 其實和 have fun一樣。如之前所說,如果我們能夠標一個大量的數據集,讓 language model 去訓練,他就是可以從這樣的一個解析中學到怎么去 highlight,怎么去把兩個 highlight 的東西連接起來。
模型設計其實跟第一篇工作也非常像,比如說這是一個 language model,它怎么訓練呢?它把 question 和三個 answer 全部先 concat 起來,比如說我已經解碼出了自然語言解釋中的前 i 個詞,我要解碼第 i 個詞?,我就以它們作為先驗去解碼出它,這里的訓練方式就是一個 language model,解碼都是老套路了。
比如說在測試的時候,我已知 Q、、、,我先用我的 language model 去做一個解碼,得到一段自然語言的解釋。我把 Q、A,以及這樣自然語言解釋,同時送到一個模型中去分類,得到一個結果,就是其中之一。其實我們可以看到,如果我們在這里把這一部分去掉,其實它就是一個普通的 Q、A 的分類模型了,這是第二篇論文工作的主要內容。
前兩篇工作總的來說是自然語言解釋隱式的應用方法,需要標注一個足夠大的自然語言解釋的數據集,用 language model 進行大規模的訓練。
自然語言解釋和自然語言理解不是同一個意思,自然語言理解是偏向一種任務式的定義,自然語言解釋就是主要討論的一個類似于額外的監督性的信息來源。剛才說的是前兩篇工作方法,需要標注一個足夠大的自然語言解釋的數據集,用 language model 進行大規模的訓練。第二種方法就是直接的方法,它不需要大量的標注自然語言來解釋。
我們看第三篇文章,Training Classifiers with Natural Language Explanations,之前已經提到過,我們標注的做法通常是讓標注者先看一個例子,讓他評估例子的相關性,最后再提供標簽,但是這樣標只能提供很少的信息,所以就引出這樣一個問題:如果標注者已經花了很多力氣閱讀和理解的一個例子,我們如何才能從每個例子中去獲得更多的信息?
作者在這篇文章中提出了一個框架,標注者為每個例子的標簽提供一個自然語言的解釋,這些解釋會被解析用 semantic parsing 變成解析函數和注釋標注函數,這些標注函數可以在許多其他還沒有經過標注的數據上去執行一個標注功能,從而就能整體生成一個大型的弱監督的數據集。
當然這個大的數據集就可以用來訓練分類器。比如說我們看上圖的例子,做的是一個 relation extraction,也就是關系抽取的一個任務,要判斷某個化學物質是不是能夠導致一種疾病。
首先標注者會選一個 yes or no,選完之后去給解釋,如果我們看到這兩個中間有一個 due to,明顯就是因果關系,是因果式的。words “due to” 出現在這兩個東西中間,這樣一種解釋,我們怎么去把它變成一個標注函數呢?
我們是用 semantic parsing 的方式,大家可以看出標注函數大概長什么樣。其實這是一個很 python 的一個寫法,他說如果 due to 出現在 chemical 和 disease 中間,它就返回 1,其實我們可以直接拿來在其他的一些 dataset 上進行標注。
例如我們還有一個例子,也是兩個 due to 出現在 chemical 和 disease 中間。但它跟這個例子不一樣,對于這樣的一個例子,我們就完全不需要再找人標注,我們有了這樣一個labeling function,就可以把所有的這些例子全部標注得到。
這里簡單講一下是怎么把 Explanation 變成 labeling function 的。作者在這里用的是一個基于規則的 semantic parsing,也就是語義解析的一個工具。比如說對于這樣一個句子,label false because x and y are the same person。他首先把這樣每一個詞去映射到一個他預先設定好的 predicate 謂語。
這些謂語,我第一遍全部映射好了,因為他是一個基于規則的,他就人為先驗地去定義許多的規則,比如說 ARG、AND、ARG 這三個謂語可以組合成一個新的謂語 ARGLIST,is equal 可以組合成一個新的謂語 ISEQUAL,一步一步組合,直到組合到一個頂節點,這樣它就變成了一個 parsing tree。
這個 parsing tree 其實和這樣一個 labeling function 是等價的。我們可以直接把它轉化成上面這樣的一個形式。
看一下上圖中整體的框架。對于這樣一個任務,我們要標注是否第一個人嫁給了第二個人。對這樣的例子,標注者先標是的,然后給出一段自然語言的解釋,我們用這邊用 semantic parsing,把所有這樣的東西都變成可標注的函數 labeling functions。
然而得到這些函數后并不是說 100% 都是有效的,一方面它可能標的就有問題,另一方面這個 rule based parser 也不是說它 100% 就能把我所有的自然語言解釋都轉化成正確的 labeling function,所以他這里做一個 filter,把那些明顯錯誤的 labeling function 也去掉。
去掉之后,剩下的 labeling function,我就可以在其他那些大量的去進行標注,在那些沒有標注過的數據上,比如說 X1、X2、X3、X4,都是未經標注的一些數據,我的這些 labeling function 能給它打出 1 或者 -1,1 代表確實是,-1 代表不是,這樣可以看出一個簡單的矩陣,它就直接拿這個信息去進行訓練。
可以看到它送到一個下游的分類器當中的時候,這個分類器簡單到你只要用一個 logistic regression 就可以去實現。它就可以達到一個非常好的效果。
上圖給出了主要實驗的結果,做了三個數據集,這是一個平均的結果。BL 代表的是用這種標注方式先給標簽,再給自然語言解釋得到的效果,這里只用了 30 個,就達到了 F1 是 46.6。TS 代表的是傳統的只給標簽的方式,比如說可以看到 30 個自然語言解釋的,46.6 已經接近 3000 個傳統標簽的效果了。
假設我們標注一個自然語言解釋的時間是標注一個標簽的兩倍,我們這邊標注效率的提升就起碼是 3000÷30÷2,就 50 倍的效率提升了,46.6 差不多這兩個中間。所以總的來說,我們用這種方式可以大大的提高我們的一個標注效率。
來看最后一篇 Learning from Explanations with Neural Execution Tree。也是今年發表在 ICLR 上的一篇工作,由是南加州大學任翔老師的 INK 實驗室和清華大學自然語言處理實驗室合作。
我們可以看一個簡單的例子:對于一個情感分析的任務來說,我們要標一個 term 是積極的還是消極的。我們可以給出一個解釋,積極的,因為有 very nice 這樣一個詞出現在 term 后面,不超過三個詞,這是對情感分析來說。
對于關系抽取任務來說,他想去標注這兩個是什么關系。比如說標注的結果是他們有雇傭的關系,因為他說主語和賓語之間只有一個詞“coach”,就是教練,這樣一個詞在中間,所以他們有一個雇員的關系。
看到這樣一個例子,包括當時我們在進行數據收集的過程中,會發現我們直接去利用自然語言的解釋的話,有兩個困難。
第一個困難,自然語言解釋本身是無結構的,我們需要預先將其轉換成可執行的標注函數,才可以將它作用到大量的無標簽的數據上,但是這一點其實已經被之前的工作也給解決了。第二點是我們在實驗中發現,標注者通常會給每一個例子去給出一個過分細致的解釋,這就使得自然語言解釋的泛化能力會受到限制。
什么叫泛化能力呢?比如說標注者給出的一個自然語言解釋,有這樣一個非常嚴格的限定,某一個特定的詞組,出現在句子的某一個特定的位置,這樣它確實符合他目前要標的這個例子,但是我們能不能把它利用到其他的數據上呢?其實就很困難,因為能符合這么嚴格限定的句子非常少。
針對這兩個問題,我們就提出了這樣一套框架。首先我們也是用 semantic parsing 去解決第一個問題,自然語言無結構的問題。對于第二個問題,我們提出了一個叫 Neural Execution Tree 的執行框架,大大提升自然語言解釋的泛化能力。這個思路就是將原先的嚴格匹配,放寬它的限制,變成一個模糊匹配。
如上圖,我們用 hard matching 來代稱嚴格匹配,也就是直接匹配。用 soft matching 來代稱模糊匹配。什么是直接 hard matching?比如我們可以看到上圖這個例子,對于這樣一個例子,以及我們得到了一個解釋,說只要 fair 這個詞直接在 price 這個詞之前出現。
注意,是 directly preceded by,它一定要就在這個詞之前。如果說我看到了另一個句子里面 fair 和 price 中間還有一個詞,它就不滿足 directly 的要求。
還有一種情況,比如說我看到的不是 fair price,我看到的是 cheap price,它也沒有辦法匹配到。但是剛才我講的這兩種情況,其實總體來說,都是可以被自然語言解釋所囊括的。不管是 fair price 也好,還是 cheap price 也好,因為 fair 和 cheap 在語義空間上也是非常像的。
另外,fair 如果和 price 中間還有一個詞的間隔,那跟它直接連接起來其實也差不太多。所以我們就想能不能把這樣一個嚴格的限制,在某種程度上稍微放寬一點,讓這樣的例子也能得到匹配?匹配以后,我們就可以繼續把它送給一個下游的模型來進行訓練。這就是我們要做的一個整體思路。
來看一下任務概覽,我們任務的輸入是一個非常大的數據集,且是沒有經過任何標注的。開始只從里面隨機去選一小部分進行標注,也是既標注標簽,也標注一個自然語言的解釋,目的是想輸出一個分類器,可以看到我們的目標是想用自然語言解釋去提高標注的效率。
像之前一樣,我們可能只需要 50 個自然語言的解釋,就可以擊敗 2000 個傳統的標簽的方式。同時,因為我們的工作是基于自然語言解釋,我們是得到也是自然語言解釋,再把它去利用到無標簽的數據上。這樣的流程先天的、自然而然的就具有模型的可解釋性。
我們再看一下 related work,也就是之前我前文提到的第三篇工作。它其實某種程度上也是先標注的解釋,但只做了一個 hard matching。我們和實驗中會發現 hard matching 能夠匹配的那部分數據集的總數是非常非常小的。所以即使把這些東西送給下游分類集去訓練效果也不會太好。
這篇論文中看起來效果很好,但其實所用的這幾個數據集非常非常的簡單。沒有用一些常見的比如說 relation extraction 之類比較難的數據集。我們工作的區別在于也用 semantic parsing,但是我們會走兩步。
第一步是 hard matching,第二步是 soft matching。Hard matching 其實跟之前工作非常像,也是 hard matching 得到的,我們就把得到一個標簽送給下游任務,我們下游的一個模型,也是讓它進行一個純 supervise 的訓練。當然,從這一步過來是沒有辦法進行 hard matching 的,我們用 soft matching 來進行處理。
對于上圖的例子,我們可以給出一個偽標簽,什么叫偽標簽?因為畢竟它不是匹配到了,所以我們不能夠完全確信它就是一個正確的標簽。在經過對每一個例子給出一個偽標簽的過程之后,我們還會給所打標簽一個置信度。
把這部分數據送給下游的模型的目標是學到一個偽標簽,前面會加一個權重,代表著置信度。如果我們非常自信說就是一個正確的標簽,那他就會多學一點。如果相反不太自信,那我們就少學一點。
再看我們的 semantic parsing,用的 semantic parsing 方式叫 Combinatory Categorial Grammar,我們之后簡稱 CCG。基于 CCG 語法的語義解析,整體思路也是把一個類似于無結構的自然語言的解釋去 parsing 得到一個這樣的 logical form,logical form 等價于前文的 labeling function,也就是標注函數變成這樣一個形式。
怎么做的呢?我們可以看到我們得到了一個 Explanation,首先把自然語言解釋中的每個詞語或者詞組映射到一個預先確定的位置上。每一個謂語會有一個特定的語法 syntax,得到了每個謂語的 syntax 之后,可以直接利用 CCG 的語法作為輸入,輸出就是許多的可能的、謂語的組合形式。
用 CCG 的 parsing 可以得到非常多的 logical form,也就是可能的一個謂語組合形式,但是并不是所有的謂語組合形式都是正確的,怎么從中去選出一個正確的呢?我們對每一個謂語組合都會給一段 feature,叫 ?(f),它是根據它的 syntax 以及其一些組合的方式來定的 ?(f)。我們引入一個可訓練的 θ,θ 是一個可訓練的一段權重,對于???這樣一個解釋,我們得到f這樣一個 logical form 的概率。
用最大化的、所有執行結果正確的謂語組合的概率之和來訓練模型。什么叫執行結果正確?就是這些 logical form 可以看成 labeling function,也就是標注函數,它本身可以直接在原來例子上進行作用。比如說它作用的結果,按道理你既然是解釋,作用在原來的例子上肯定要跟原來例子的結果標簽是一模一樣的。
如果你連這都做不到我們就不會用。我們簡單地把所有那些能夠在原來的例子上標注得到正確結果的概率全部最大化。在推斷的時候,就從這里面選取? argmax,得到的這樣一個可標注的函數。
我們主要 contribution 后面的 Neural Execution Tree,我們把它叫做神經元執行樹,輸入是一個自然語言被解析后得到的謂語組合,以及一個沒有辦法被直接嚴格匹配的句子,想輸出二者匹配的概率。
因為語義分析已經將自然語言解析成了樹的形式,樹中的節點都代表著相應的謂語,比如說上圖這樣一個解釋,它已經把它解析成了這樣一個樹的形式,每個節點都是一個謂語,那這樣一個謂語代表什么?代表著不同的執行方式,比如這些執行方式里面有字符串匹配、有距離計算等等,比如說 The words “who died” 出現,其實就有潛在的一個字符串匹配。
occur between 是一個位置的關系,然后 no more than three,是一個數字的比較,放在那棵樹里每一個節點都是在做一部分細小的工作,這些節點按樹的形式組織起來,就可以得到原先的一個標注函數的形式。
我們總共定義了 4 個模塊,分別是:
String matching module,字符串匹配模塊;
Soft counting module,也軟化技術的模塊;
Deterministic function module,決定性的函數模塊;
Logic calculation module,邏輯組合的計算模塊。
4 個模塊會對應到樹節點,涵蓋了所有可能出現的謂語,不同的模塊會作用在不同的謂語上形成不同的效果,輸出結果都會在這個節點上,要么輸出一個概率,要么輸出一個概率的序列。這些概率會沿著這棵樹進行組合,一直組合到頂節點,直到輸出一個概率,就代表著這樣一個句子和我這邊的自然語言的解釋兩者之間的匹配概率。
如前文所述,我們就是要把一個嚴格匹配的方式變成一個模糊匹配的方式。接下來我就詳細的介紹我們的這 4 個模塊。
構建四種模塊,幫助提升泛化能力
第一個模塊 String matching module,也就是字符串匹配模塊,核心想法是我們即使要求某一個特定詞語出現,我們現在其實不完全要求它嚴格出現,如果是語義空間上相近的一段詞組出現的話,那它其實表達的意思也差不太多。
比如說在上圖這個問題里面,query 要求 chief executive of 出現在某個地方,那我在這樣一個句子里看不到這樣一個詞語,但是 Executive director of 出現了,它們兩二者其實是在語義空間上是接近的,那我們怎么輸出一個高的匹配概率呢?
我們的模型是這么設計的:對 director 這個詞我們會編碼三樣東西,第一個是 director 詞本身,第二個是 executive director,第三個是 director of,然后我們把這三樣東西送給 child encoder。encoder 我們用的是一個 BiLSTM,上面加了一個 attention and ?layer,然后這樣就可以得到一段詞組的表示,比如說??。
第一個 3 代表它是這句話里的第三個詞。0 就代表說這其實是一個 sliding window 了。可以看到我們用這三段東西得到了三段表示。同樣,因為這是一個 share 的 encoder,我們對這個 query 也可以把它進行 encoder。得到一個?,也是一段表示。然后我們分別去計算它們三組之間的一個相似度。
相似度是怎么計算的呢?比如說??和??之間的相似度,我們不僅是直接去算一個 cos 相似度,而是先把它去乘以一個 D,這個 D 是一個可訓練的對角矩陣。也就是說它會控制這兩個向量每一維的權重,然后再去算一個 cos 相似度。比如說得到了這樣三個相似度,。
每一位其實都會有這樣三個相似度,我們之后再用矩陣方式去乘以一個 1×3 的 B 的向量,這個向量也是需要訓練的。也就是說,把這三個相似度給線性組合起來,得到一個最終的相似度,也就是?。這個? 就代表著這樣一段 query,在我這一句話里的第 3 個位置出現的一個概率。
其實有一些是需要訓練的。比如說我們 encoder 就有大量需要訓練的東西。包括我們這邊的對角矩陣,以及這個 v,都是需要訓練的。我們怎么去訓練呢?
如上圖,我們給出一個 loss?,是總體的一個訓練的 loss。它是由兩部分組成的,第一部分是?,第二部分是? ss。是指用??來教這個模型,去學會如何定位一個 query。比如說 query 出現在某個位置,如果 sentence 有一模一樣的出現,它就是希望 query 在這邊嚴格找到它。
再比如說我有這樣一個句子,abcdefg,我的 query 是 bcd,其實我期望它說出了一個標簽,就是 0111000,1 代表 query 在這個地方確實出現過,0 代表著說 query 在這個地方沒有出現過。我怎么去得到這樣的一個訓練的數據呢?其實很容易么,我們有大量的未標注的數據集,根本不需要標簽就能把這樣一個句子拿出來,在里面隨機去找 span。
比如我們可以找長度為 3 的 span,我們隨機找到了 bcd,它訓練的標簽就是 0111000,我們用這個模型去 encoder 得到一段相似度,比如說得到了這樣一段相似度。我們的訓練的 loss,就是二者的 binary cross entropy,這樣他就可以學會如何去準確定位這樣一個 query,這就是我們的第一個 loss,教它去準確的定位 query。
但是這樣一個 loss 并沒有實現我們所追求的泛化能力,仍然沒有辦法學會怎么去把兩個語義相似的東西組合,也給出一個非常高的概率。比如說 chief executive of,它跟 executive director of 不是完全一樣的,但它們語義空間上相似,我們怎么去做呢?
我們引入了第二個 loss?,核心思想是說,我們把一些語義相近的東西在表示空間上把看成一個聚類。當然,與它不相似的,不是一類的那些詞語解釋可以把它給分開。
比如說對于 sentiment analysis 這樣的任務,它有兩個內容,一個是 positive 類,一個是 negative 類。Positive 類比如說有的自然語言解釋說,good 這個詞出現在某個位置,有的說 great,有的說 cheap。對于這樣一個任務,這三個詞就其實是在同一個空間,就是一個正向空間。
有可能對 negative 這樣一個類,它有 bad,有 awful。我們這邊就是想把這樣三個詞語的空間聚到一起,這兩個聚到一起之間會有一個 margin,其實就是一個聚類的 loss。我們這邊其實可以簡單看成就是一個聚類的 loss,這是對于 sentiment analysis 來說的。
如果我們對于 relation extraction 這樣的任務,比如說某一個數據有 42 個類,每一個類之間其實都可以標注到很多可以用的東西。再比如說因果關系的這樣一個類。它可以把 is caused by 和 resulted from 這兩個東西在語義空間上把它拉近。
比如說對于 city-of-death 這樣一個類,可以把 was killed on 和 was murdered in 給拉近距離。核心思想就是我們要從已經得到那些自然語言解釋中,找到一些關鍵詞,完全來自于自然語言解釋。所以我們這邊說的兩個 loss,一個?,一個?。我們就可以隨機從未標注的數據中隨便找詞向量讓??去訓練,只要基于那些已經得到的自然語言的解釋就可以了。
第二個模塊,軟化的一個技術模塊,作用就是用來軟化一些技術的限制,這些限制是被自然語言解釋給限定了。比如說我們看到有這樣一個限定。The word ‘glad’ precedes OBJECT by no more than 2 words。之前,如果沒有進行轉化,它比如說小于等于兩個詞,它就輸出 1 的概率。大于兩個詞,它輸出 0 的概率,就是非 1 則 0。
我們現在把它轉化成什么樣?我們給了一個新的函數,這其實可以看成反向的一個接入。也就是說,2 現在是第 4 個詞,我依然可以給一個概率,當然這個概率不可能還是 1。但比如超過 8 個字,就可能太離譜,因此不給概率了,而是軟化成上圖的形式。這樣的函數到底用什么?嚴格來講完全看實驗結果。你可以找自己覺得還不錯的,只要是遞減的函數都可以。
第三個模塊——Deterministic function module,是決定性的函數模塊,用來作用在不能被軟化的詞語上,比如說它有限定,the subject is a person,對于這樣一個限定,主語要么就是 person,要么不是 person,只有 1 和 0 這兩種非對即錯的這樣一種選擇。
或者說這個詞出現在 A 和 B 中間,它沒有辦法來出現在其他地方,要么在中間,要么不在中間,也是 1 和 0。對于所有不能被軟化的操作,用這個模塊來替代。這樣,這個節點它輸出概率要么是 1,要么是 0。
既然每一個節點都會輸出概率,概率和概率怎么組合?畢竟要把每個節點的概率組合起來,才從頂節點輸出。這里會采用第 4 個模塊:Logic calculation module,它的作用就是把節點和節點之間的概率給組合起來。
比如有節點 1,概率是?,節點 2 概率是?。用的是一個 Probabilistic soft logic,一個概率軟邏輯的結構。比如??和??它們是一個與的關系,就用 max(?+-1,0) 來表示,如果是或關系,就是 min(?+,1)。如果是否定關系法就是 1-p,這完全就是 probabilistic soft logic。
當然,它不僅可以對兩個數值的概率進行處理,還可以對兩段概率序列進行處理。比如第一段概率,第一個節點輸出一個概率序列,第二個節點輸出一個概率,它可以把它拼成一個新的概率序列,然后每一個節點做的事情就是一個 element wise 的一個 soft logic。
給出一個 Gif 來比較生動地看一下整個執行過程。我們會看到,對于上圖這樣一個自然語言的解釋,把它用 semantic parsing 變成了 logical form 之后,需要去匹配所有潛在的一些句子。
匹配第一個句子的時候,subject was murdered on object。把這兩樣東西——一個是 logical form,一個是 sentence——送到 Neural Execution Tree的模塊中,這個模塊會輸出一個匹配概率,它是怎么做的?
首先,既然得到了 logic form,就已經看到了這個樹,先從樹的葉子節點入手,因為我之前說了每個葉子節點,都對應著某一個 predicate,也就對應著某一個 module。這些 module 輸出的都是概率,或者做概率的組合。每一個節點其實都可以先對句子作用,然后得到一段概率。
比如說這 4 個節點都得到了一段概率事件,它們會進行組合,往上傳。比如說葉子結點再往上走,得到另一個節點。這個節點它的作用正好是把這兩方概率給組合起來我就得到了一個新的概率。
之后再往上走,又走到一個節點,還會繼續把這兩段概率給組合起來,得到一個新的概率。直到到了頂節點。這個頂節點輸出的這一段概率就是我的自然語言解釋和句子的一個匹配概率。大概整體的框架就是這樣。
那怎么去訓練這樣一個模型?比如說對于得到一個 label data 的??和 unlabeled data 的?, label 的能夠被直接 hard matching,所有能被直接匹配的,稱之為 label data,那些不能被匹配的,需要用 soft matching 來匹配的,稱之為 unlabel data。我們目標是輸出一個分類器。每次都從 label data 里面選一小部分來,也會從 unlabel 中選一小部分。
對于這些 label data,用純 supervise 方式去訓練。而對于 unlabel data,只能用一些 semi-supervised 方式去訓練。首先,比如說有 50 個自然語言解釋,每個解釋對當前句子都會有匹配概率,取一個 argmax,找到最匹配的概率、最匹配的自然語言的解釋,并且當前這個句子的標簽就是這個解釋所對應的標簽,然后我就以它為目標進行訓練。
當然,還有置信度的問題,如果匹配概率很高,那我可以相信它很可能接近 label data 了,如果匹配概率很低的話,我可能不太容易去相信它。
那如何實現置信度?需要進行規范化 normalization。?就是所謂的匹配概率,?是一個超參數,用這樣的方式就可以在一 個batch 之內做一個 normalization,置信度是 0~1,而且所有的例子加起來是 1,總體的訓練 loss 就是?、 以及?,這個??即 string matching 的 loss,這樣可以勉強稱它是一個 joint、 training 的 algorithm。
我們做了兩個實驗,第一個實驗是關系抽取,在 TACRED 和 SemEval 上進行。第二個實驗是 sentiment analysis,也就是情感分析,在 SemEval2014 進行 task 4 的實驗,其中有兩個數據集,第一個是 Restaurant,第二個是 Laptop,是我們收集到數據集,和之前一樣,也是在 Amazon mechanical turk 上收集的。
上圖右邊是整個數據集的數量,左邊是利用這些解釋直接進行 hard matching 得到的數量,可以看到其實 hard matching 得到的數量是非常少的,只占整個數據集非常少的一部分,有大量的未標注的數據可為我們所利用。
再簡單看一個例子。比如對于 TACRED 這樣一個數據集來說,得到的解釋大概長這樣,The term “then known as” occurs between ?SUBJ-PERSON and OBJ-PERSON and there are no more than six words between SUBJ-PERSON and OBJ-PERSON。
同樣,對于 SemEval 數據集,我們也可以得到很多的解釋,比如說 the phrase is caused by the ”occurs between SUBJ and OBJ follows SUBJ。
上文提到,得到一個標注的結果,然后把這些標注的東西同時送給下游的一個分類器,對于不同任務來說,完全可以換一個分類器,所以可以看到這是非常階段性的工作,先 semantic ?parsing,parsing 完之后再去做標注,標注完之后把標注的結果送給一個下游的模型。
對于 relation extraction 我們用的模型是 BiLSTM+attention,即上圖最下面的詞語,然后用 BiLSTM 去 encode,得到 Attention layer,代表每一段它的權重是多少,最后把它帶權的組合一下,再送給一個 SoftMax。
另外,對于 sentiment analysis 任務來說,我們用的是 ATAE 的 LSTM,這篇是 2016 年的黃民烈老師做的工作,發表在 EMNLP,是對于 aspect term level 的? sentiment analysis 任務,每一個句子都有一個所屬 aspect,把這一段 embedding 和這樣一個 hidden layer 去 contact 起來,然后再去做一個attention,得到一段帶權的表示和原來 LSTM 最后一個詞的表示同時組合到一起,然后拿到這段 embedding 再去分類。
效果如上表所示。LF 代表只用 logical form,即 labeling function 在整個數據集上作用得到的效果,可以看到 recall 非常低,代表自然語言解釋的泛化能力非常差,它只能匹配到非常少的一些句子。這些模型是在 level data 上,是直接 hard matching 到的 data 上訓練得到的結果,效果并不是很好。
其實我們還有一系列的 baseline,屬于 supervise,我先拿一個模型在 label data 上訓練,對于 unlabeled data,可以拿這個模型去打標簽,打出來一些 label,再去訓練,這樣做成 sentiment analysis 的東西。可以看到我們的模型相對于所有這些 baseline 都有非常好的效果。
這是 relation extraction,對于 sentiment analysis 來說,可以看到我們的效果也是非常好的,相對 baseline 都有比較高的提升。
來看幾個有趣的 Ablation studies,這個是我們的一個模型的效果,我們想證明,那些提升泛化能力的模塊確實是有用的,如果把技術模塊的軟化去掉,你會發現效果是有下降的。
如果把 string matching 給去掉,原來不是說要做一個模糊匹配,現在就做直接匹配、嚴格匹配,找詞語到底有沒有出現,這樣它的效果下降是非常明顯的,也就是說,對于文本的任務來說,string matching 其實是最重要的。當然 string matching 它其實有兩個 loss,一個是?,一個是?,可以發現如果任意去掉一個,它的效果都不會好。
其實我們這個工作還在 QA 上做了實驗,因為你會發現之前我們做的兩個實驗,無論是 relation extraction 還是 sentiment analysis,都是偏文本分類的任務,與 QA 任務有非常大的區別。這里做了一個 additional experiments,當然我們并沒有聲明也在 QA 上做了完整實驗,因為它與之前的文本分類還有挺大區別。但從實驗結果上來看,效果也還不錯。
上圖是其他的一些 Ablation studies,不同數量的一個自然語言的解釋,它的效果會不會有變化,如果隨機取 100 個,或者說最多用了 230 個自然語言解釋它的效果,上圖藍線是用我們的模型達到的效果,剩下的線是一些 baseline 的效果。可以看到,不管是什么數量的自然語言的解釋,我們模型的效果永遠是最好的。
對 sentiment analysis 數據集也是這樣的結果。1000 條虛線代表是 1000 個傳統的標簽,能夠達到這樣的效果。你會看到我們達到 2500 個標簽,差不多有 170 個左右的 explanation。這個標注效率已經算挺高的了。? ?
還有一些 Ablation studies,我們想看一下 unlabel data 的效果到底怎么樣?如果 unlabel data 原來有 100%,現在砍掉 60%,它的效果會有一定下降。
上圖藍線趨勢不太明顯,是因為整個標簽的跨度實在太大了。如果把紅線給去掉,單看這條線,它的跨度就會稍微好看一點。當然我們非常關注標注效率問題, ?在不同時間的不同標注時間下,紅色實線代表是可以標注的傳統標簽的數量,藍色虛線代表是可以標注的自然語言解釋的數量。
藍色實線代表利用這些自然語言解釋可以達到的效果。紅色虛線代表是只利用標簽的那些 baseline 最好能夠達到的效果。不管在任何時間下,我們的模型相對于這些 baseline,效果都是最好的,效果和標注效率有非常高的提升。
還有一些 Ablation studies,比如說,上圖是一個 string matching 的,顏色越深,代表匹配度越高。比如說對上圖這樣一個句子,要去匹配 chief executive of,可以看到顏色最深的確實就是在這個詞周圍,說明確實能夠找到它的匹配。
上文提到,我們下游的模型是可以直接替換的。其實現在 NLP 的老套路,就是用 RNN 做實驗,再把 Bert based 做實驗,比如現在最好的是 ALBERT 。我們拿 Bert 做了一下實驗,效果也有提升。當然提升沒有之前那么明顯,因為 Bert 其實已經對這樣的任務來說,都已經非常簡單了,有一點提升也是很難的了。
之前講過,我們主要做的是一個文本分類的任務,其實在 QA 上是大有可為的。
比如說對于上圖 QA 的任務來說,Question: How is packet switching characterized 和 How is the evacuation tube sealed是非常像的,包括在 Context 里面也是非常像的。總結起來差不多是這樣:How is NP VP by…
最后,如果我們能夠標注上面這樣的一個自然語言的解釋,也可以很好對它進行匹配,這也是很有潛力的。我們這項工作之后還有幾個可能的方向,一方面是 semantic parser 還有提升的空間,另外之后希望可以做成 cross domain 的 semantic parser。
關于數據實戰派
數據實戰派希望用真實數據和行業實戰案例,幫助讀者提升業務能力,共建有趣的大數據社區。
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的区别于传统低效标注,两种基于自然语言解释的数据增强方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重做系统怎么进去PE 如何进入PE系统进
- 下一篇: HMD“诺基亚 Lumia 1020 复