Chapter7-6_Text Style Transfer
文章目錄
- 1 什么是Text Style Transfer
- 2 Cycle GAN
- 2.1 Gumbel-softmax
- 2.2 Continuous Input for Discriminator
- 2.3 Reinforcement Learning
- 2.4 效果
- 3 Star GAN
- 4 Feature Disentangle
- 5 Unsupervised Abstractive Summarization
- 6 Unsupervised Translation
- 7 Unsupervised Speech Recognition
本文為李弘毅老師【Text Style Transfer】的課程筆記,課程視頻youtube地址,點這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權(quán),必定刪除。
文章索引:
上篇 - 7-5 Multilingual BERT
下篇 - 7-7 Deep Learning for Coreference Resolution
總目錄
1 什么是Text Style Transfer
style transfer這個概念對我們而言并不陌生,就算不是做技術(shù)的,也在日常生活中會看到過一些圖像風(fēng)格轉(zhuǎn)換的東西,比如把正常的照片變成梵高風(fēng)格的畫等等。語音上的風(fēng)格轉(zhuǎn)換我們在之前講voice conversion的時候也由講到過,比如把男聲變成女聲就是一種風(fēng)格轉(zhuǎn)換。
而文本的風(fēng)格轉(zhuǎn)換一個典型的例子就是正面情緒的語言和負面情緒語言的相互轉(zhuǎn)換。不過,文本風(fēng)格轉(zhuǎn)換的實際應(yīng)用場景要比我們想象的多得多。
2 Cycle GAN
文本風(fēng)格轉(zhuǎn)換用到的技術(shù)也是cycle gan,我們會需要一個generator(G),G會吃一個負面的句子,然后吐出一個正面的句子;我們也會需要一個discriminator(D),D已經(jīng)用一堆句子訓(xùn)練過了,知道什么是正面的句子,什么是負面的句子,把G生成的句子丟給D,D判斷G生成的句子是正面的還是負面的;同時我們還需要一個generator,這里我們可以將其稱之為reconstructor?,他就是要把G生成的句子再變回換來的句子,沒有R的話,G只要一直生成同一句話就可以騙過D了。
我們的G是一個seq2seq的模型,這個大家應(yīng)該已經(jīng)很熟悉了,它就是輸入文本的第一個token的feature和前一個token,然后RNN會輸出這個time step預(yù)測出來的token distribution,在distribution中進行sample,最后得到預(yù)測的一串tokens,把這些tokens輸入D,D就會吐出一個scalar,就表示現(xiàn)在輸出的句子,是不是有某種風(fēng)格,比如是不是正面情緒的句子。我們一般會把G和D串起來end2end這樣train,但在這里,由于sample這個過程是不可微的,所以不能串起來train。
那怎么辦呢?沒有了D這個下游任務(wù),loss怎么算?這其實是一個比較大的話題,這里我們只略講一下。解決方法目前大致可以分為三大類:Gumbel-softmax,Continuous Input for Discriminator和Reinforcement Learning。Gumbel-softmax不常用,Continuous Input for Discriminator和Reinforcement Learning孰強孰弱不好說。
2.1 Gumbel-softmax
Gumbel-softmax這一招沒有后面那兩招那么流行,它用了VAE中叫做reparameterization的trick,使得不可微分的sample變成可微分的了。具體怎么回事,李老師也沒說,想了解的小伙伴可以參考GANS for Sequences of Discrete Elements with the Gumbel-softmax Distribution和RelGAN:
Relational Generative Adversarial Networks for Text Generation。
2.2 Continuous Input for Discriminator
第二招非常直接,既然sample這個步驟不可微,那么我們就干脆跳過這個步驟,把token distribution直接塞給D,這不就可以微分了嗎?
那這樣做的問題是什么呢?問題就是,D在預(yù)訓(xùn)練是看到的數(shù)據(jù)都是one-hot的,而G生成的distribution不是one-hot的,D只需要學(xué)到說one-hot的是real的,不是one-hot的是generated的就可以了。這樣就會發(fā)現(xiàn)模型什么都沒學(xué)到。所以一般還會用WGAN中類似的技術(shù),給D加一些約束條件,讓它不那么重要,那模型也許就可以學(xué)到些東西。還有一種做法是,把distribution經(jīng)過embedding之后變成特征向量,這樣模型就沒法一下子從表面認出來了。
2.3 Reinforcement Learning
最后一招就是用RL,怎么用RL呢?我們只要把不能微分的地方用RL去做就可以了,這里的話,就是把sample出來的token當(dāng)作action,把D當(dāng)作environment,然后scalar當(dāng)作reward就可以了。
但是這里的D是在更新的,也就是environment一直在變,這會讓RL非常難train,同時GAN也是非常難train的,難上加難會讓這個訓(xùn)練非常困難。所以我們需要一些tips,這個可以參考ScratchGAN,上面羅列了一些可用的技巧。其中有一個必用的技巧叫做SeqGAN-step,這里稍微說一下。
RL之所以難train是因為當(dāng)D輸出一個低分數(shù),從G的角度來說,它并不知道為什么分數(shù)這么低,它不知道句子的哪個部分導(dǎo)致了分數(shù)低。所以我們希望每生成一個token都可以有一個評分,這樣G就知道哪里錯了。
讓D在每個generation step都做出評價的方法這里不細講,有興趣的小伙伴可自行查資料學(xué)習(xí)一下,主要有三種:
- Monte Carlo (MC) Search
- Discriminator For Partially Decoded Sequences
- Step-wise evaluation
2.4 效果
Cycle GAN產(chǎn)生的句子是長什么樣子呢?李老師的學(xué)生做了實驗之后的結(jié)果如下所示。出來的結(jié)果還是有點奇怪的,不過也有幾分道理。
3 Star GAN
當(dāng)我們需要在多種風(fēng)格之間轉(zhuǎn)換時,用Cycle GAN就需要train很多的G和D,這樣太麻煩了。圖像和語音中一般會考慮使用Star GAN。Sytle Transformer就是文字版的Star GAN。這里只是提一下多個風(fēng)格之間轉(zhuǎn)換該怎么辦,想了解詳情的小伙伴可以自行看論文。
4 Feature Disentangle
我們在做voice conversion的時候除了GAN之外,還有feature disentangle的方法。這個方法也可以同樣用在text上,我們的目標(biāo)就是train一個content encoder只抽取content的特征,同時train一個style encoder只抽取style的特征。然后要換style,只需要把style這部分的特征換掉就可以了。不過這種方法近幾年并沒有被用的很多,效果不如GAN,因為要做句子的embedding,把句子壓到一個latent space是比較困難的。
既然content encoder把句子做embedding比較困難,那不妨我們就讓content encoder輸出離散的特征,也就是句子,然后我們希望content encoder可以學(xué)會把風(fēng)格有關(guān)的一些詞匯給蓋掉。這樣再結(jié)合style的特征,decoder只需要把蓋掉的部分替換成對應(yīng)風(fēng)格的詞匯即可。
不過新的問題又來了,如何找到這個和風(fēng)格有關(guān)的詞匯并蓋掉呢?有興趣的小伙伴可以參考Delete, Retrieve, Generate: A Simple Approach to Sentiment and Style Transfer和Unpaired Sentiment-to-Sentiment Translation: A Cycled Reinforcement Learning Approach。
5 Unsupervised Abstractive Summarization
風(fēng)格轉(zhuǎn)換不光可以把正面情緒的句子轉(zhuǎn)化為負面情緒的句子,如果我們把完整的文章作為一種風(fēng)格,摘要作為一種風(fēng)格,那么我們就可以利用風(fēng)格轉(zhuǎn)換的方法來做無監(jiān)督的摘要生成。有監(jiān)督的摘要生成需要收集大堆的成對的數(shù)據(jù),成本很高,無監(jiān)督無疑是大家的福音。
做法與之前情緒轉(zhuǎn)換的做法一樣,我們需要有一個G把文章轉(zhuǎn)成摘要;然后需要一個D來判別輸入的是不是摘要;最后還需要一個R來吧G生成的摘要重新變回原來的文章。
那么,這種做法做出來的摘要效果如何呢?下面是某篇文章中的結(jié)果,用的評價指標(biāo)是ROUGE,越大表示和人寫的摘要越接近,越好。第一行是有監(jiān)督的結(jié)果,是效果最好的。第二行是取文章前幾句話的結(jié)果,相當(dāng)于是個基于規(guī)則的baseline。第三行是用同一個數(shù)據(jù)集里的文章和摘要做訓(xùn)練得到的結(jié)果,第四行是不同數(shù)據(jù)集的文章和摘要訓(xùn)練得到的結(jié)果。可見無監(jiān)督的結(jié)果,還行。
6 Unsupervised Translation
我們也可以把不同語言當(dāng)作不同的風(fēng)格,來實現(xiàn)無監(jiān)督的翻譯。
無監(jiān)督的翻譯有一種做法就是利用word embedding取逐個詞地翻譯。假設(shè)我們已經(jīng)有了中文的embedding和英文的embedding,如下圖所示,那么很有可能兩個語言的embedding之間只需要一個線性變換就可以把一種語言的embedding對應(yīng)到另一種語言上,比如下圖這樣的就只需要經(jīng)過一個逆時針的旋轉(zhuǎn)即可使得對應(yīng)意思的詞重合。
那么我們的問題就變成了如何找這個線性變換WWW。不同語言之間有一些相同token且相同意思的詞匯,比如阿拉伯?dāng)?shù)字,那我們就可以根據(jù)阿拉伯?dāng)?shù)字的embedding去學(xué)習(xí)這個WWW。我們也可以利用GAN的技術(shù),把WWW當(dāng)作一個Generator,然后再訓(xùn)練一個Discriminator來判別經(jīng)過G之后的embedding和右邊的接近程度。甚至也有人直接用PCA,這兩邊的embedding就對齊了。
下面來說一下用類似GAN的技術(shù)來做Unsupervised Translation的方法。假設(shè)我們有語言A和語言B。我們分別對語言A和語言B訓(xùn)練各自的自編碼器,得到encoder A,decoder A,encoder B和decoder B。在訓(xùn)練的時候,我們會對輸入加一些noise,防止模型變成一個只會”復(fù)制粘貼“的模型。然后,我們想要在encoder A中輸入語言A的句子之后,再經(jīng)過decoder B就得到句子在語言B中的翻譯結(jié)果。
這說起來輕松,但誰也沒法保證encoder A和encoder B是按照同樣的方式去encoder的。所以我們需要一些tricks。
第一個trick,就是加一個discriminator,用來區(qū)別encoder的輸出是encoder A的還是encoder B的。這樣一來,就可以迫使encoder A和encoder B盡可能用同樣的方式去encode。我們希望這樣做之后,decoder B不僅可以看懂encoder B的結(jié)果,也可以看懂encoder A的結(jié)果。
第二個trick是,我們把encoder A的輸出輸入到decoder B,然后把decoder B的輸出輸入到encoder B,最后把encoder B的輸出輸入到decoder A,希望這種情況下encoder A的輸入和decoder A的輸出越接近越好。但是這樣模型并不能具備翻譯的能力,它可能會把“再見”對應(yīng)成“How are you”。
所以我們需要另一個模型,這個模型是一個爛一點的模型,它可以就是剛才講到的用word embedding做mapping得到的模型,用這個模型來代替encoder A和decoder B,這樣可以在訓(xùn)練前期把結(jié)果引導(dǎo)到相對正確的句子上去訓(xùn)練encoder B和decoder A,在后期train的差不多了之后,再固定住encoder B和decoder A,來訓(xùn)練encoder A和decoder B,如此交替迭代。
這樣做出來的結(jié)果如下圖所示,有監(jiān)督的翻譯訓(xùn)練會隨著訓(xùn)練樣本的增加而越來越好,但無監(jiān)督的翻譯訓(xùn)練再剛開始就會有一個比較好的結(jié)果,隨著訓(xùn)練樣本的增加,效果提升并不明顯。這樣的結(jié)果挺奇怪的。
7 Unsupervised Speech Recognition
最后要講的是無監(jiān)督的語音辨識,也就是把語音認為是一種風(fēng)格,文字認為是一種風(fēng)格。用到的方法還是和之前一樣,只不過有語音進來所以會做一些處理,會把phoneme作為中間媒介。然后這部分就不細講了,有興趣的小伙伴去聽一下李老師的課吧,李老師講的比較簡略,我也一知半解。
總之,用這種方法可以得到還不錯的結(jié)果,接近有監(jiān)督的語音識別。
總結(jié)
以上是生活随笔為你收集整理的Chapter7-6_Text Style Transfer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 2146. 价格范围内
- 下一篇: LeetCode 2096. 从二叉树一