天天看點

無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習一、GAN在NLP中遇到瓶頸二、稀疏編碼自學習——SelfTaughtLearning三、對偶學習 Dual learning延伸一:VAE for 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

無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習一、GAN在NLP中遇到瓶頸二、稀疏編碼自學習——SelfTaughtLearning三、對偶學習 Dual learning延伸一:VAE for NLP

補充幾點,題主也許會好奇:為什麼 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 的問題。

無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習一、GAN在NLP中遇到瓶頸二、稀疏編碼自學習——SelfTaughtLearning三、對偶學習 Dual learning延伸一:VAE for NLP

另外一個方法是結合 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.

Lantao Yu, Weinan Zhang, Jun Wang, Yong Yu

https://arxiv.org/abs/1609.05473v5

[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

翻譯自微信公衆号AI100

原文連結:http://www.machinedlearnings.com/2017/01/generating-text-via-adversarial-training.html

.

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

本文來源:譯文 |

從未标記資料中遷移學習

原文:http://robotics.stanford.edu/~rajatr/papers/icml07_SelfTaughtLearning.pdf

有點類似先把圖像向量化(邊緣特征)之後進行聚類來尋找某一類别的内容,少量标記就可以獲得更多的标記檔案了。

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

半監督學習(Nigam et al.2000),本文算法也使用标記和未标記資料,但是和典型文獻中的半監督學習方法不同,我們并不假設無标記資料能夠配置設定到監督學習的類别标簽。為了差別于這種半監督學習,我們稱我們的任務為自學習。

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

  • 首先使用無标記資料來學習一種表達,然後将此種表達應用于标記的資料以及分類任務中。
  • 一旦在第一階段學習到這種表達,它也可以重複應用于不同的分類任務。例如在上例中,一旦從網際網路圖檔學習到這種表達,則不僅能夠将其應用在大象和犀牛的圖像中,也可以應用在其他圖像分類任務。

    實驗證明稀疏編碼特征,或許與原始特征相結合,在大部分領域中都比隻使用原始特征和PCA特征效果要好得多。

稀疏編碼基向量從随機自然灰階圖像塊(14×14像素)學習得到。在方格裡面的每個正方形表達一個基向量。

無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習一、GAN在NLP中遇到瓶頸二、稀疏編碼自學習——SelfTaughtLearning三、對偶學習 Dual learning延伸一:VAE for NLP

下面兩個表格展示了不同應用領域上的實驗結果。

無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習一、GAN在NLP中遇到瓶頸二、稀疏編碼自學習——SelfTaughtLearning三、對偶學習 Dual learning延伸一:VAE for NLP

.

三、對偶學習 Dual learning

來源于微軟研究院AI頭條:秦濤:深度學習的五個挑戰和其解決方案 以及 對偶學習在行動:從文本到圖像

對偶學習的思路和前面生成式對抗學習會非常不一樣。對偶學習的提出是受到一個現象的啟發:我們發現很多人工智能的任務在結構上有對偶屬性。比如說在機器翻譯裡面,我們把中文翻譯成英文,這是一個任務,但是我們同樣也需要把英文翻譯成中文,這是一個對偶的任務。這種原任務和對偶任務之間,他們的輸入和輸出正好是反着來的。在語音處理裡面,語音識别是把語音轉化成文字,語音合成是把文字轉化成語音,也是互為對偶的兩個任務。在圖像了解裡面,看圖說話,也就是給一張圖生成一句描述性的語句,它的對偶任務是給一句話生成一張圖,這兩個任務一個是從圖像到文本,另外一個是從文本到圖像。

在機器翻譯裡面做了一些實驗,發現通過對偶學習的過程,我們隻需要用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

這些源碼我還沒來的及看。

最後這個方法的用處很廣,可以将油畫變成照片,可以将普通照片變成單反相機的大光圈一樣的北京虛化,可以隻改變圖檔中的物體,如把馬變成斑馬,可以進行季節變更。

看看作者到底幹了什麼事情。附上效果圖:

無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習一、GAN在NLP中遇到瓶頸二、稀疏編碼自學習——SelfTaughtLearning三、對偶學習 Dual learning延伸一:VAE for NLP

延伸一: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實作

資料庫

· FGNET

· MORPH

位址:https://ebill.uncw.edu/C20231_ustores/web/product_detail.jsp?PRODUCTID=8

· CACD

位址:http://bcsiriuschen.github.io/CARC/

· 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 cd save/summary tensorboard –logdir .

訓練之後,可以檢查檔案夾samples和test來分别可視化重建和測試性能。下圖展示了重建(左)和測試(右)的結果。重建結果(左)的第一行是測試樣例,他們分别對應的測試結果(右)由上到下,按年齡增長順序排列。

無監督學習︱GAN 在 NLP 中遇到瓶頸+稀疏編碼自學習+對偶學習一、GAN在NLP中遇到瓶頸二、稀疏編碼自學習——SelfTaughtLearning三、對偶學習 Dual learning延伸一:VAE for NLP