Uber AI 簡單方法實現大規模語言模型的精細控制

  • 2019 年 12 月 18 日
  • 筆記

作者 | 楊曉凡 編輯 | 唐里 OpenAI 的 GPT-2 曾經掀起的「大規模語言模型到底水平多高、到底有沒有危害」的口水仗慢慢冷下去了,而語言模型的實用性問題也越來越展現出來:如果很難控制一個語言模型的輸出,那可能就很難找到它的實際應用,只能淪為刷分工具。

近期,Uber AI 研究院的一篇論文《Plug and Play Language Models: A Simple Approach To Controlled Text Generation》(https://arxiv.org/abs/1912.02164)中介紹了一種簡單、高效的精細控制方法,可以輕鬆地讓大規模語言模型生成指定的主題、風格的文本,而且還有很廣泛的適用性。Uber AI 的研究人員們把它比喻為「讓小老鼠控制一隻猛獁象」。AI 科技評論把論文的解讀部落格編譯如下。

一個實際的挑戰:基於預訓練模型的條件文本生成

2017 年Google提出的基於注意力的 Transformer 網路架構為自然語言處理開闢了一個全新的時代。從此之後,基於 Transformer 改進的更大、更大的模型層出不窮,基於深度學習的自然語言處理方法也在各種各樣的任務中取得越來越好的成績。

隨著 BERT、GPT-2 之類的大規模語言模型出現,NLP 研究者們通過實驗表明了只需要用簡單的目標函數在超大規模的無標註語料上訓練,得到的語言模型就可以在語言建模任務(給定一組開頭以後向後續寫)中得到前所未有的流暢度,文本的自然、合理程度可以接近人類水平。

比如,給定一個開頭「這裡的食物不好吃」,一個語言模型(比如 GPT-2)能續寫成這樣的看上去相當合理的一段話「這裡的食物不好吃,店員又懶又粗魯。這食物真讓人喜歡不起來,即便我的要求一點也不高。」

不過,雖然這些模型生成的句子體現出了拼寫、語法、語言習慣等等複雜的語言知識,但想要具體地控制模型生成的內容仍然非常困難。換句話說,雖然模型有能力生成各種各樣不同的句子,或者為一個給定的開頭續寫出很多不同的段落,但我們很難指定讓模型生成某一種風格的、某一種話題的、某一種敘述邏輯的文字。比如,同樣是以開頭「這裡的食物不好吃」進行續寫,人類可以欲揚先抑,最後得到一個正面的結論,也可以掛羊頭賣狗肉,話說到一半慢慢從講食物變成講政治的。想讓語言模型做到這些就非常困難。

在這篇論文里,Uber AI 的研究人員們在這個問題上做出了一些突破。我們先看一個例子,他們用他們的方法要求模型生成一段正面的續寫,效果是:「這裡的食物很糟糕,但還有音樂、故事和魔力!Avenged Sevenfold 的搖滾音樂劇演得太精彩,以後在全世界都能看到。」文本表達的情感從負面轉變成了正面,但還是挺連貫自然的。

在此之前,全世界的 NLP 研究人員們提出過各種各樣的條件文本生成方式,包括,1,從一個預訓練語言模型開始,做精細調節,以便讓它始終都能生成某種特定風格的句子;2,從零開始訓練一個大型條件生成模型;3,不改變這個大的語言模型,而是通過關鍵 n 元組替換的方式,調節已經生成的句子的風格。

Uber AI 這篇論文帶來了一種全新的有控制的文本生成方式,他們稱之為「the Plug and Play Language Model」(即插即用語言模型,PPLM)。通過 PPLM,用戶可以向大型非條件性的生成模型中靈活地插入一個或多個屬性模型,這些插入的模型可以代表不同的想要控制的屬性。PPLM 的最大優點是不需要對語言模型做任何額外的改動(不需要重新訓練或者精細調節),就讓資源不足的研究人員也可以直接在預訓練語言模型的基礎上生成條件文本。

如何駕馭一頭猛獁象

NLP 研究人員們目前開發的最大的、語言能力最強的語言模型都非常大,動輒有數十億的參數,訓練它們需要大量的計算資源(從零訓練一個模型,租算力大概需要六萬美元),而且訓練這些模型還需要海量的文本數據,即便模型的程式碼是開源的,這些訓練數據也通常不是開源的。在許多意義上,大規模語言模型就像猛獁象一樣,它們聰明、有力,但是它們的行動又隨意又笨重。

這樣的語言模型帶來的結果就是,除了那些有最充沛的資源和資金的研究人員之外,其它的研究人員和開發者都只能在無論如何都不理想的情境中三選一:1,直接使用公開的預訓練模型(雖然有好的語言建模能力但無法完全匹配他們的需求);2,在小一些的數據集上對預訓練模型做精細調節(但一旦出現災難性遺忘,就會讓模型的表現大幅下降);3,需求不符只能從零訓練新模型,但預算有限,只能訓練小得多的模型(表現也自然也會有明顯差距)。

Uber AI 提出的 PPLM 就能在這樣的困境面前起到很大幫助,需要符合自己需求、且表現優秀的語言模型的研究者和開發者,不再需要想辦法訓練自己的模型,只需要用幾個小的屬性模型控制大預訓練模型的生成,就可以達到目標。一個屬性模型可以只有預訓練模型的百萬分之一大,同時仍然有很強的引導能力,就像在猛獁象的頭頂坐了一隻小老鼠,就能夠靈活地控制讓猛獁象往哪裡走。

控制一個語言模型的不成功方法

語言模型有幾類,對應幾種不同的分布。

首先有非條件性的語言模型,它的分布是 p(x),是所有文本上的一個概率分布。GPT-2 之類的非條件性的語言模型就是建模了這樣的分布。這樣的語言模型是通用的,可以為許多不同種類的話題生成流暢的文本。

其次,條件性語言模型的分布是 p(x|a),這就是我們的目標。在給定某種屬性 a 之後,這種假想模型就可以生成帶有這種屬性的文本。

接下來,屬性模型的分布是 p(a|x),它是根據給定的句子輸入 x 計算句子帶有屬性 a 的概率。比如,經過屬性模型計算,某個句子有 10% 的可能性是正面情緒的,以及有 85% 的可能性是關於政治的。屬性模型可以很小、很容易訓練,僅從直觀上來看,判斷某個句子是否含有某種屬性就是個分類任務,要比寫出這樣的句子簡單得多;尤其是,如果在語言模型學習的語言表徵上訓練這樣的屬性(識別)模型,OpenAI 的論文《Improving Language Understanding by Generative Pre-Training》就已經表明了可以輕鬆地訓練一個表現優秀的小模型。在 Uber AI 的實驗中,一個單層的、4000 個參數的屬性模型就能在屬性識別和文本生成引導中發揮很好的效果。

那麼我們想要的條件性語言模型,也就是 p(x|a) 從哪裡來呢?幸運的是,根據貝葉斯法則,這個模型可以用第一個和第三個模型表示出來,也就是:

p(x|a) ∝ p(a|x) p(x)

不過,雖然這種方式讓我們可以方便地計算概率(「這個句子符不符合我們想要的樣子」),但我們很難從這種表達中取樣。我們可以先嘗試常見的拒絕取樣或者重要性取樣,從 p(x) 分布開始逐一取樣篩選—— 這種做法理論上可行,但實際操作起來,要麼會得到有偏倚的結果,要麼運行速度非常慢。想用這種方式生成一個談政治的句子,大概會是這樣的狀況:

  1. 從 p(x) 中取樣得到一個句子 x
  2. 把句子 x 輸入 p(a|x) 計算它是否是關於政治的
  3. 如果不是,重複第一步

顯然,這就是從隨機生成的句子里把關於政治的句子挑出來而已,由於 p(x) 覆蓋了大量不同的話題,運氣不好的話可能很久都無法得到關於政治的句子。對於越長的句子,生成滿足要求的整句話也越難(需要越好的運氣),花費的時間會指數級增加。這簡直像「無數多的猴子在無數多的打字機上隨機地打字,並持續無限長的時間,那麼在某個時候他們必然會打出莎士比亞的詩集」,理論上正確,但無法用在實踐中。

用梯度控制大規模語言模型

PPLM 解決這個問題的方式是,他們用屬性模型通過梯度控制大語言模型。他們逼近實現了 1996 年的論文《Exponential convergence of Langevin distributions and their discrete approximations》中的更高效的 Metropolis-adjusted Langevin 取樣器,而且參考了 Plug-and-Play Generative Networks (PPGN,arxiv.org/abs/1612.00005)中在一對神經網路上的實現方式。這樣一來,PPLM 生成一個樣本就變成了這樣的簡單的三步:

  1. 給定一個部分生成的句子,計算 log(p(x)) 、log(p(a|x)),以及兩者關於語言模型的隱層表徵的梯度。只需要對屬性模型和語言模型都做一次高效的前饋傳播和回饋傳播,這幾個值都可以計算出來。
  2. 根據計算出的梯度,在回饋傳播中,根據屬性模型的梯度更新語言模型的隱層表徵,向著增加 log(p(a|x)) 和 log(p(x)) 的方向移動一小步,也就是增加了生成的文本帶有想要的屬性的概率
  3. 由於上一步更新,語言模型的分布被改變,然後取樣一個詞

在每個時間步中,這個過程都會進行一次,也就是說表徵了以往的值的隱層變數會被一次又一次地更新。

直觀上講,隨著 PPLM 生成一個個詞,它的文本表徵也逐漸向著更有可能符合屬性要求的方向發生變化(高 log(p(a|x)) ),同時也保持了語言模型本來的語言流暢度(在第二步中保持高 log(p(x),避免語言模型本來的表達能力被破壞)。

Uber AI 的研究人員們也對 PPLM 做了一些相關的說明:

  • 首先,PPLM 的這種控制模式是可以調節的:對隱層文本表徵的每一步變化的強度可以調節;當變化強度設為 0 的時候,這就是原本的語言模型。
  • 其次,PPLM 假設原有的基礎語言模型是自回歸的,許多現代的語言模型都符合這個要求。實際上,如果語言模型是基於 Transformer 架構的,上面的這個方法就可以有高效的實現,因為以往的預測值只能通過 Transformer 的以往的鍵和值對未來的預測產生影響,和其它的激活值都無關,所以在前向傳播中只有張量需要更新和傳遞。
  • 以及,PPLM 中的取樣器的實現,和上面提到的《Exponential convergence of Langevin distributions and their discrete approximations》以及 PPGN,arxiv.org/abs/1612.00005 中的實現有一些重要的不同,感興趣的研究人員可以閱讀論文原文具體了解
  • 最後,Uber AI 這項研究中選用的基礎語言模型是 345M 參數的 GPT-2,但對於其他的自回歸語言模型也是有效的。

不同屬性模型的不同表現

詞袋屬性模型

Uber AI 的研究人員們首先嘗試了最簡單的一類屬性模型,詞袋模型(Bag-of-words),計算方式也就是直白的「符合主題的似然度等於詞袋中每個詞單獨的似然度的和」,換句話說就是含有越多詞袋中的詞,就認為句子符合屬性的可能性越高。

在這個實驗中,他們想要生成太空主題的文本,詞袋中含有「planet、galaxy、space、universe」等等辭彙。即便給定不同的開頭,模型生成的幾組結果都達到了預期效果。

同一主題、不同開頭實驗

在下一個實驗中,他們用同樣的開頭、不同內容的詞袋模型嘗試生成不同的主題。我們可以看到,生成的文本帶有詞袋中的詞的概率提升的同時,不在詞袋中、但有相關性的辭彙的出現概率也增加了。這是因為,PPLM 中更新文本表徵的方式是向著目標方向的連貫自然的遷移,作者們也通過對照實驗說明這種做法的效果比直接提升想要的關鍵詞的出現頻率的效果更好。

同一開頭、不同主題實驗

在苛刻的條件下,PPLM 的表現如何呢?這組實驗中,給定和目標話題完全不相關的開頭,比如「以各種動物/食物開頭,主題是政治」。即便是這樣奇怪的開頭,PPLM 也能生成合理的句子。

有挑戰性的開頭和主題

判別器屬性模型

詞袋模型固然是一個簡單直觀的話題表徵方式,但對於一些更複雜、深層次的屬性,比如正面和負面情緒,我們總還是需要更複雜一些的模型的。這種時候我們就可以使用在標註數據集上訓練出的分類模型。

Uber AI 的研究人員們設計的分類模型把原本的語言模型中提取出的嵌入表徵作為輸入,用一個單層分類器結構預測類別標籤。這個模型中含有的參數可以不超過 5000 個,相比於語言模型的規模可謂不值一提。

這樣得到的 PPLM-Discrim 模型生成正面和負面情感的文本效果如下圖

多個屬性模型聯合使用

人類有能力在一段話中覆蓋多種主題,PPLM 也可以。Uber AI 的研究人員們嘗試了把多個詞袋模型和一個分類模型一起使用,可以讓一段話同時符合「冬天、政治、廚房」的主題,而且有正面情緒。圖中第二段同時符合「電腦、幻想、釣魚鏈接」主題。

多個屬性模型聯合,多主題文本生成

避免語言模型生成有害文本

在前面的敘述和例子中我們都看到了,PPLM 架構可以使用任意可微的屬性模型引導語言模型生成各種不同屬性或者主題的文本。但在應用中我們還會遇到一種問題,由於大規模語言模型都是在海量的互聯網文本上訓練的,這些文本經常含有偏見或者使用不友善的(罵人)的辭彙。論文 arxiv.org/abs/1908.07125 就展示了,如果用對抗性攻擊的思路設計文本開頭,可以讓 GPT-2 續寫出帶有種族主義的段落。這種狀況會限制語言模型的安全應用場景。

由於 PPLM 使用梯度來更新語言表徵,解決這種問題就要簡單得多,只需要訓練一個惡意文本分類器,把它作為屬性模型,然後使用負梯度更新語言表徵,也就是減小生成文本符合屬性的概率即可。研究人員們選用了能夠讓原本的 GPT-2 模型輸出惡意文本的對抗性文本開頭,在應用 PPLM 後,繼續輸出對抗性文本的概率從原來的 63.6% 降低到了 4.6%。不過,不僅確保模型的輸出完全符合設計者的意圖還需要更多後續研究,我們也需要用更多方法避免惡意的使用者反倒利用 PPLM 的特點專門生成惡意文本。

總結

在這項研究中,Uber AI 的研究人員們提出了可以在使用過程中引導大規模預訓練語言模型輸出不同主題、不同風格文本的 PPLM,而且可以靈活地搭配一個到多個詞袋模型、小型判別式模型等等作為屬性模型,在細粒度地控制生成文本內容和風格的同時,即保持了文本的合理和流暢,也避免了重新訓練或者精細調節語言模型。PPLM 中的預訓練語言模型可以使用各種自回歸語言模型,屬性模型也可以使用各種可微模型,這都意味著 PPLM 還有很大的使用空間。

閱讀論文:Plug and Play Language Models: a Simple Approach to Controlled Text Generation,https://arxiv.org/abs/1912.02164

程式碼開源:

  • https://github.com/uber-research/PPLM (單獨 PPLM)
  • https://github.com/huggingface/transformers/tree/master/examples/pplm (集成 Transformer)

Demo:https://transformer.huggingface.co/model/pplm

via https://eng.uber.com/pplm/