1. 程式人生 > >無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習

無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習

深度學習訓練一個模型需要很多的人工標註的資料。例如在圖象識別裡面,經常我們可能需要上百萬的人工標註的資料,在語音識別裡面,我們可能需要成千上萬小時的人工標註的資料,機器翻譯更是需要數千萬的雙語句對做訓練。
看看標註資料的代價有多高。比如說對機器翻譯而言,現在如果我們請人工來翻譯,一個單詞的費用差不多是5—10美分之間,一個句子平均長度差不多是30個單詞,如果我們需要標註一千萬個雙語句對,也就是我們需要找專家翻譯一千萬句話,這個標註的費用差不多是2200萬美元。

一、GAN在NLP中遇到瓶頸

GAN
自從被提出以來,就廣受大家的關注,尤其是在計算機視覺領域引起了很大的反響,但是這麼好的理論是否可以成功地被應用到自然語言處理(NLP)任務呢?

Ian Goodfellow 博士

一年前,網友在 reddit 上提問道,生成式對抗網路 GAN 是否可以應用到自然語言處理上。GAN 理論的提出者,OpenAI 的科學家,深度學習理論奠基人之一 Yoshua Bengio 的得意門生 Ian Goodfellow 博士回答了這個問題:

GANs 目前並沒有應用到自然語言處理(NLP)中,因為 GANs 僅僅定義在真值資料中,GANs 通過訓練出的生成器來產生合成數據,然後在合成數據上執行判別器,判別器的輸出梯度將會告訴你,如何通過略微改變合成數據而使其更加現實。

只有在資料連續的情況下,你才可以略微改變合成的資料,而如果資料是離散的,絕對不可以改變合成數據,一點都不可以

例如,如果你輸出了一張圖片,其畫素值是1.0,那麼接下來你可以將這個值改為1.0001。如果你輸出了一個單詞“penguin”,那麼接下來就不能將其改變為“penguin + .001”,因為沒有“penguin +.001”這個單詞。如果想改的話,你必須將“penguin”變為“ostrich”或其他。因為所有的自然語言處理(NLP)的基礎都是離散值,如“單詞”、“字母”或者“音節”,沒有人真正知道怎樣才能在 NLP 中應用 GANs。

一般而言,我們會想到採用增強學習演算法,但是增強演算法的執行效果並不十分理想。目前據我所知,還沒有人真正的開始研究利用增強演算法解決 NLP 問題。

我看到有人說, GANs 在遞迴神經網路(RNN)方面並不奏效。這是不對的。從理論上來看,GANs 和 RNN 的生成器或判別器之間,並沒有什麼矛盾。但是,對於這一點,目前並沒有人嚴肅而又認真的測試過。因此,在實際應用中還是存在一定的困難的。

順便說一下,VAEs 對可見的離散單元是有效的,但是對隱藏的離散單元卻並不奏效(除非你在運用增強演算法,比如 DARN 或者 NVIL)。而另一方面,GANs 對隱藏的離散單元奏效,對可見的離散單元卻並不奏效(從理論上來講,除非是運用增強演算法)。因此,這兩種方法可以說是各有利弊,相輔相成。

2016年的 NIPS GAN Workshop 中,來自杜克大學的 Zhang、Gan 和 Carin 發表了一篇題為 GeneratingText via Adversarial Training 的論文,嘗試將 GAN 理論應用到了文字生成任務上,他們的工作非常有特色,具體可以總結為:

用到的判別器(Discriminator)是卷積神經網路(CNN),而不是遞迴神經網路(RNN),這可能是一個不錯的選擇,因為Tong Zhang 就曾經使用CNN 做文字分類任務,相比 RNN,CNN 更好訓練一些,最終訓練得到的判別器非常有效,與之相關的問題優化起來也相對容易些。

在生成器(generator)中用光滑近似(smoothapproximation)的思路來逼近 LSTM 的輸出,但實際上,這種思想比較常見,並沒有什麼不同尋常的地方。

在鞍點優化問題上,採用的是純矩匹配(moment matching)作為優化準則。早期的生成式對抗網路(GANs)都是用逐點判別損失(pointwise discrimination loss)作為優化目標的,而最近的工作都是用類矩匹配的思路來加強優化目標,這裡的優化是用矩匹配來做。

本文的初始化非常有意思,特別是在判別器的預訓練方面,利用原始的句子和該句子中交換兩個詞的位置後得到的新句子進行判別訓練。(在初始化的過程中,運用逐點分類損失函式對判別器進行優化)。這非常有意思,因為將兩個單詞互換位置,輸入的資料資訊實際上是基本相同的。比如,大多數卷積計算最終會得出完全相同的值。

更新生成器的頻率遙遠高於判別器,這與大家之前的設想正好相反。或許這是因為,相比 LSTM 來說, CNN 的問題優化要容易的多。同時,這可能也和純矩匹配損失的應用有關。

.
.

知乎大神的經驗

知乎上大家對這個問題的看法有很多,下面列出兩個比較有代表性的:

Xun Huang PhD Student in CS, Cornell

其實本來寫了一大段後來還是刪了…. 因為這個問題其實非常前沿,在知乎上要講清楚的話感覺太難了。

所以還是就列一些 paper 吧:

SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient
GANS for Sequences of Discrete Elements with the Gumbel-softmax Distribution
Generating Text via Adversarial Training

以上 paper 是直接用 GAN 做 text generation 的,但是其實都暫時沒有啥正經的實驗結果。

Modeling documents with Generative Adversarial Networks

這個是用 GAN 生成一個 document 中詞的分佈(不是真正 generate document),然後希望 discriminator 能學到好的 feature without supervision。

Professor Forcing: A New Algorithm for Training Recurrent Networks

這個是用 discriminator 來 encourage 一個 RNN 在 training 和 testing 的時候 hidden state 的分佈一致,藉此解決 exposure bias 的問題(即 RNN 在 training 時接受 ground truth input,但 testing 時卻接受自己之前的 output,這兩個 setting不一致會導致 error accumulate)。

同時還有一系列 paper 用 reinforcement learning 來直接 optimize evaluation metric(例如BLEU),同時解決 exposure bias,這些 paper 其實和 GAN 有內在的聯絡(參考 Connecting Generative Adversarial Networks andActor-Critic Methods):

Sequence Level Training with Recurrent Neural Networks
An Actor-Critic Algorithm for Sequence Prediction
Optimization of image description metrics using policy gradient methods

最後個人不認為 discrete data space 是 GAN 在 NLP上難 work 的本質原因…這裡不展開了。

王亭午 U of T ML group

這裡寫圖片描述

補充幾點,題主也許會好奇:為什麼 Ian 在 reddit 上說 GAN 做不了是因為 word embedding 加減無意義就做不了呢?既然這樣,我在 latentvector 上做加減不就行了嗎?這個方法看上去可以,實際上很難 work。

使用 generative model 解決 language generation 最大的問題在於 latent space 存在非常多的 desert hole。在 training 的時候,text 的 latent vector 有聚攏的傾向( citation needed,感謝評論。評論裡面也提到了desert hole 這個詞並不是一個學術上的詞彙。David Duvenaud 和我們聊這個問題的時候,用了這個說法,這裡沿用,感覺還是滿形象的哈哈)。

因此直接上 GAN model 存在一些問題。圖中是[1] 裡面的一個例子。在 latent space 遨遊的時候,中間的句子不 make sense。

不過解決的方法也是有很多的。最簡單的方法是用 VAE 而不是用 GAN。GAN 本身的訓練方式是非常依賴連續空間的。在訓練的時候,我們的目標就是連續空間上的 pixel 值。在這一點上,VAE 就沒有這個假設。因此 VAE 是自然的選擇。

實際上用的時候有很多 tricks,[1] 裡面感覺就有很多工程上的東西來減少 desert hole 的問題。

這裡寫圖片描述

另外一個方法是結合 policy gradient,把它做成一個 R L的問題。[2] 是一篇非常有意思的文章。通過把 word 選擇由 softmax output 選擇變成 policy 選擇,作者巧妙的避開了 GAN 和 word embedding 不相容的問題。當然實際上,結合 GAN 和 RL 需要更加多的思考和技巧。[2]不一定是最好的方法,但是無疑證明了GAN是可以用在 sentence generation 這個問題上的。

我之前也很關注 GAN 和 text 的結合,也可以算是利益相關吧。此外有另外一個工作[3] (出自我們組去年剛剛招來的青年才俊Prof. David Duvenaud),可能可以帶來更加多的啟示。

如果我們考慮化學物質的預測呢?假設我們知道化學式A,B,C並且知道他們的性質,我們能不能預測 A-B+C 的化學性質呢?我們能不能得到類似 queen-woman+man=king 的結果呢?

這個時候,使用 generative model 解決化學分子生成會遇見和 sentence generation 一樣的問題。我們會發現,化學分子的 latentspace,一樣存在 desert holes。推薦你看一下[3],我覺得它很有意思,能給我們考慮的問題帶來許多思考 。

.
.

參考文獻

[1] Generating Sentences froma Continuous Space.

Samuel R. Bowman, Luke Vilnis, Oriol Vinyals, Andrew M. Dai, Rafal Jozefowicz,Samy Bengio
https://arxiv.org/abs/1511.06349v4

[2] SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient.

[3] Automatic chemical design using a data-driven continuous representation ofmolecules.

Rafael Gómez-Bombarelli, David Duvenaud, José Miguel Hernández-Lobato, JorgeAguilera-Iparraguirre, Timothy D. Hirzel, Ryan P. Adams, Alán Aspuru-Guzik
https://arxiv.org/abs/1610.02415v1

.

二、稀疏編碼自學習——SelfTaughtLearning

我們發現許多從網上隨機下載的影象也包含與大象和犀牛類似的基本視覺模式(如邊緣)。利用無標記資料的方法來提高監督學習的效能。

半監督學習(Nigam et al.2000),本文演算法也使用標記和未標記資料,但是和典型文獻中的半監督學習方法不同,我們並不假設無標記資料能夠分配到監督學習的類別標籤。為了區別於這種半監督學習,我們稱我們的任務為自學習。

自學習方法主要包括以下兩個階段:

  • 首先使用無標記資料來學習一種表達,然後將此種表達應用於標記的資料以及分類任務中。
  • 一旦在第一階段學習到這種表達,它也可以重複應用於不同的分類任務。例如在上例中,一旦從網際網路圖片學習到這種表達,則不僅能夠將其應用在大象和犀牛的影象中,也可以應用在其他影象分類任務。
    實驗證明稀疏編碼特徵,或許與原始特徵相結合,在大部分領域中都比只使用原始特徵和PCA特徵效果要好得多。

稀疏編碼基向量從隨機自然灰度影象塊(14×14畫素)學習得到。在方格里面的每個正方形表達一個基向量。

這裡寫圖片描述

下面兩個表格展示了不同應用領域上的實驗結果。
這裡寫圖片描述
.

三、對偶學習 Dual learning

對偶學習的思路和前面生成式對抗學習會非常不一樣。對偶學習的提出是受到一個現象的啟發:我們發現很多人工智慧的任務在結構上有對偶屬性。比如說在機器翻譯裡面,我們把中文翻譯成英文,這是一個任務,但是我們同樣也需要把英文翻譯成中文,這是一個對偶的任務。這種原任務和對偶任務之間,他們的輸入和輸出正好是反著來的。在語音處理裡面,語音識別是把語音轉化成文字,語音合成是把文字轉化成語音,也是互為對偶的兩個任務。在影象理解裡面,看圖說話,也就是給一張圖生成一句描述性的語句,它的對偶任務是給一句話生成一張圖,這兩個任務一個是從影象到文字,另外一個是從文字到影象。
在機器翻譯裡面做了一些實驗,發現通過對偶學習的過程,我們只需要用10%標註的資料(大概100萬英法雙語句對),再加上很多沒有標註的資料,達到用100%標註資料(1200萬英法雙語句對)訓練的模型的準確度。

偶學習這個新正規化去年掀起了一個小波瀾,去年11月微軟亞研院發的NIPS,原文連結:https://arxiv.org/pdf/1611.00179.pdf
但是慢慢沉寂了,方法的idea不錯,但沒有得到大規模推廣。去年的是在文字翻譯這塊,影象去年的熱門是GAN網路。好了,今天這文章把對偶學習滲透到了影象了。
看論文我喜歡把一些來龍去脈搞清楚。每一個idea都不是憑空而來的,追本溯源,我們看看去年秦濤博士他們文章的主要精髓。一句話說:一個英語句子A,首先用一個網路n1翻譯成法語w,然後將翻譯好法語w用另一個網路n2翻譯成英語句子B。兩個網絡合在一起成為一個對偶網路。損失函式就是A與B之間的差值。文章說英語翻譯成法語的精度可以匹敵neural machine translation (NMT)的精度。我想說,首先英語跟法語比較像,這個問題相對簡單一些;其實我的擔心是,這個loss不太好學,很有可能不收斂。文章說他們的學習方法是網路n1教網路n2,網路n2教網路n1,使用一種增強學習的方法。這個是可以的,但這個老師感覺是變化的哦。
今天的這篇文章名字是:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks。使用有迴路的對抗網路來做未配對的圖片-圖片的翻譯。首先來談談對抗網路。深度生成對抗網路是給一批圖片,如貓的圖片,一個網路學習這些圖片用於生成貓,一個已有的判別網路,判斷生成的貓是不是真。

我們一起來解開她的扣子。所有網路,不管多深,展開拉直了都是一個方程。方程G將X轉變成Y,方程F將Y轉變成X1。它搞了兩個loss來訓練兩個網路,一個loss是x-F(G(x)),一個loss是y-G(F(y))。怎麼樣?其實就是對偶學習。
文章中講了如何實現這樣的網路的,並做了不少對比實驗。
文章的原始碼地址:https://junyanz.github.io/CycleGAN/
對比網路CoGAN的原始碼:https://github.com/mingyuliutw/CoGAN
這些原始碼我還沒來的及看。
最後這個方法的用處很廣,可以將油畫變成照片,可以將普通照片變成單反相機的大光圈一樣的北京虛化,可以只改變圖片中的物體,如把馬變成斑馬,可以進行季節變更。
看看作者到底幹了什麼事情。附上效果圖:
這裡寫圖片描述

延伸一:VAE for NLP

GANs在影象中作用比較強,但是在NLP不行,NLP裡面VAE則是”霸主“,本節來源於paperweekly分享:PaperWeekly 第二十七期 | VAE for NLP

VAE 的核心:

1) 如上圖所示,VAE 可以看做是 Standard autoencoder 的 regularized version(在 autoencoder 的架構上引入隨機 latent variable)

2) VAE 從 data 學到的是在 latent space 的 region,而不是單個點。換句話說是 encode 學到了一個概率分佈 q(z|x)

3) 引入 KL divergence 讓後驗 q(z|x)接近先驗 p(z)。這裡的 motivation 在於如果僅用 reconstruction loss,q(z|x)的 variances 還是會很小(又和原有的單個點差不多了)

VAE 詳細推導這裡就不展開,各種 tutorial 也非常多。只要掌握變分推斷和理解 reparametrization trick 就基本 ok 了。

.

該程式碼是對論文《用條件對抗式自動編碼器進行人臉老化、退齡》中演算法的Tensorflow實現
資料庫

· UTKFace (可以從Github 或維基百科獲得)

準備訓練資料

你可以使用任何帶年齡標籤和性別標籤的資料庫。在該demo中,我們使用了UTF人臉資料庫,因為用這種標定並裁剪過的人臉照片更好一些。請儲存並解壓UTKFace.tar.gz到資料夾data下。

訓練

$ python main.py

訓練過程在NVIDIA TITAN X (12GB)上進行了測試。在UTK人臉資料庫(23,708張影象,大小為128x128x3)上進行50次epoch的訓練時間是兩個半小時。

在訓練過程中,會建立一個新資料夾save,包括四個子資料夾:summary, samples, test,和checkpoint

· samples :儲存每個epoch之後重建的人臉。
· test :儲存每個epoch之後的測試結果(基於輸入人臉生成的不同年齡的人臉)。
· checkpoint :儲存模型。
· summary :儲存批損失和中間輸出。

用以下命令來視覺化summary:

cdsave/summary tensorboard –logdir .

訓練之後,可以檢查資料夾samples和test來分別視覺化重建和測試效能。下圖展示了重建(左)和測試(右)的結果。重建結果(左)的第一行是測試樣例,他們分別對應的測試結果(右)由上到下,按年齡增長順序排列。
這裡寫圖片描述