back to index
GAN (Quick Review)

link |
第一堂課,我們幫大家複習一下GEM。為什麼要複習一下GEM呢?我們上課的錄影裡面,有非常多的內容是跟GEM有關的,我有放在我們的課程網頁上。
link |
這個內容大概長達十小時,我想應該沒有人要看吧。假設你對GEM其實也沒那麼有興趣的話,我們就是用一堂課把你需要知道的東西告訴你。如果你聽完以後覺得這個東西很棒的話,你再去把錄影看完。
link |
第二堂課,我們要講一個東西叫做transformer。講這個很抱歉,我今天等一下有事情,所以我不得不在11點的時候離開,這就是我們今天的規劃。
link |
我們先講GEM是什麼。我簡單地把GEM分成三種型態,我們先從第一種型態開始講起。第一種型態要做的事情是,我們要找一個generator,generator它就是一個function。
link |
這個function的輸入是一個random的vector,吃這個random的vector當作輸入,輸出就是我們要這個generator,要這個生成器生成出來的東西。
link |
舉例來說,假設你今天要讓機器做一個動畫的generator的話,那你要做的事情就是,收集很多動畫人物的頭像,然後把這些頭像餵給generator。等一下我們會講說,generator怎麼吃這些頭像,學會產生出新的二次元人物的頭像。
link |
好,那我們就先從最基本的GEM開始講起。我們剛才講說最基本的GEM就是一個generator,輸入一個random的vector,輸出就是我們要它生成的東西。
link |
那這邊我們以二次元人物為例,假設你要讓機器畫二次元人物的話,那你的輸出就是一張圖片,那一張圖片可以想成就是一個高維度的像量。所以現在你的generator就是吃一個低維度的像量,比如說10維,比如說100維,它輸出一個高維度的像量。
link |
假設你這張圖片是96乘96的,那一張96乘96的圖片,它有96乘96的pixel,每一個pixel分成RGB三個顏色,所以一個96乘96的圖片可以想成是一個96乘96乘以3維的像量。
link |
那這個generator吃一個低維的像量產生一個高維的像量。那GEM,Generative Adversarial Network,它一個有趣的地方是,我們不只訓練了一個generator,同時我們在訓練的過程中還會需要一個discriminator,等一下我們會講說generator跟discriminator是怎麼互動的。
link |
我們還需要一個discriminator,這個discriminator的輸入是一張圖片,輸出是一個分數,這個分數代表的含義是,現在輸入的這張圖片像不像是我們要generator產生出來的二次元人物的頭像,如果像的話,discriminator就給它高分,如果不像的話,discriminator覺得輸入的東西不像是二次元人物的頭像的話,就給它低分。
link |
好,那接下來就是要講generator跟discriminator它們是怎麼被訓練出來的。那generator跟discriminator它們都是neural network,至於它們的架構長什麼樣子,那就取決於你要做的任務是什麼。
link |
舉例來說,假設你要generator產生出來的東西是一張圖片,那你顯然你的generator裡面會有很多deconvolution的layer,那你的discriminator數字是一張圖片,那你的discriminator裡面可能就會有convolutional的layer。
link |
那假設你要generator生出的東西不是圖片,舉例來說你要它產生一篇文章,產生一個句子,那也許你的generator用的就是RNN,用RNN來產生句子。我們今天不會講generator跟discriminator的架構是什麼,因為這取決於你今天要用的應用是什麼。
link |
那我們以下要講的那個algorithm跟generator、discriminator的network架構是完全沒有任何關係的。那generator跟discriminator它們都是某種neural network,你知道選neural network的時候,你就是要random initialize它們的參數。
link |
在random initialize generator跟discriminator的參數以後,在每一個圈裡的iteration,你要做兩件事。第一件事情是固定住你的generator,然後只訓練你的discriminator。
link |
我們剛才有說過,我們要教discriminator什麼?我們要教discriminator的東西就是,看到好的圖片就給它高分,看到不好的圖片就給它低分。那怎麼訓練這樣的discriminator呢?你要給它很多好的圖片。
link |
好的圖片哪來?你會有一個資料庫,裡面都是二次元人物的頭像,從裡面sample,從裡面隨機取樣一些圖片出來,這些圖片對discriminator來說就是好的圖片。
link |
那不好的圖片哪裡來?你把你的generator拿出來,一開始generator的參數幾乎是隨機的,所以你給generator一些向量,它輸出來的東西根本不像是二次元人物的圖案,這些對discriminator來說就是不好的圖片。
link |
接下來就要教discriminator說,看到下面這些圖片你就輸出1,看到上面這些圖片你就輸出1,看到下面這些圖片你就輸出0。
link |
Trend discriminator的方式跟我們一般trend neural network的方式是一樣的。有的人會把discriminator當作一個regression的方法來做,看到上面的圖片就輸出1,下面的圖片就輸出0,這樣可以。
link |
你把上面這些好的圖片當作一類,下面這些不好的圖片當作一類,這樣也可以。trend discriminator的部分,沒有什麼特別的地方跟你一般trend一個neural network,比如說跟你一般trend binary classifier是一樣的。
link |
唯一不同的地方就是,假如我們是用trend binary classifier的方式來trend discriminator的話,不一樣的地方是,現在binary classifier的其中一個class的資料不是人標的,而是GT,也就是generator自己生成的。
link |
好,那這樣我們就trend了discriminator,接下來我們再來trend generator。那generator它學習的目標是什麼呢?一般我們trend neural都是定一個objective function,然後讓generator去optimize that objective function,或minimize一個我們人定好的loss function。
link |
這邊在訓練generator的時候,generator學習的對象不是人定的objective function,而是discriminator。那你也可以想像說discriminator它就定義了某一種loss function,某一種objective function,它等於是GT自己學出來的loss function或objective function。
link |
那講的通俗一點,generator它的學習的目標,大家可能在報章雜誌上看過很多這種說法,generator學習的目標就是為了要去騙過discriminator。好,那更具體而言,generator怎麼騙過discriminator呢?
link |
我們讓generator產生一些圖片,再把這些圖片丟進discriminator,然後discriminator丟給這個圖片一些分數。好,那接下來我們把generator,在真正訓練的時候我們把generator跟discriminator串在一起,視為一個巨大的內窩。
link |
就假設generator有五維,discriminator,不是五維,說錯,generator有五層,discriminator也有五層,那合起來就是一個巨大的十層的內窩。
link |
這個巨大的內窩,它裡面的輸入是一個向量,輸出就是一個分數。在這個巨大的內窩的中間的某一維,你把它的heater layer的output拿出來,可以看作是一張圖片。
link |
好,接下來我們在訓練的時候,我們訓練的目標,這個整個內窩,他們的目標就是要讓輸出越大越好。
link |
那在訓練的時候,你一樣是用backpropagation,只是你會固定住對應到discriminator的那幾個維度,只調整對應generator的維度。
link |
那你調完generator以後,generator的輸出就變了,generator這個新的輸出可以讓discriminator給它比較高的分數。
link |
那我們前面有講過,discriminator它會做的事情就是看到好的圖片就給它高分。
link |
今天既然generator新產生出來的圖片是discriminator給它高分的,那意味著generator現在產生出來的圖片是比較好的。
link |
好,那這個是第二步。實際在訓練的時候,你就是訓練discriminator一下,然後再訓練一下generator,這時候會固定discriminator。
link |
然後呢,接下來有新的generator以後,generator產生更多需要被標為0的圖片,然後你再去調discriminator,然後再去調generator。
link |
所以generator跟discriminator就是交替訓練,然後這個技術就可以做二次元人物的生成。
link |
那二次元人物的生成呢,是我們另外一門課的作業啦。那我目前看到在網絡上最好的二次元人物生成的結果,我看到的是這個樣子。
link |
這個真的還蠻驚人的。但是呢,這個game是以很難被學起來而聞名的,所以就有一個俗話是怎麼說的呢,就是no pain no gain這樣子。
link |
所以就有很多人提出了種種讓game可以訓練更好的方法。舉例來說,其中最知名的就是一個叫做wgame的東西。
link |
然後後來有了wgame以後,就有了improve wgame,後來還有了improve的improve wgame這樣子,所以有各式各樣的技術想辦法讓game變得更好。
link |
那這個我們就不細講,你有興趣的話,你就可以看一下我們上課的錄影。
link |
好,那接下來進入第二步。剛才在前一步裡面,我們是讓機器隨機的產生一些東西,那這個不見得是我們要的,我們更多的時候,我們想要的是要控制機器產生出來的東西。
link |
舉例來說,我們能不能夠訓練一個generator,這個generator的輸入是一段文字,輸出就是這段文字對應的影像。
link |
舉例來說,我們輸入這個紅頭髮紅眼睛的女孩,他就畫一個左眼的夏娜。
link |
好,那這種東西呢,叫做這種根據某一個輸入來產生對應的輸出的generator,叫做conditional的game。
link |
好,那我們這邊用文字產生影像做為例子。
link |
好,那怎麼訓練一個network可以看文字產生影像呢?最直覺的方法也許是直接用supervised learning。
link |
假設你今天可以收集到文字跟影像之間的對應關係,你收集一大堆圖片,這些圖片,又有人去標說每張圖片對應的文字是什麼。
link |
接下來,你就可以完全套用傳統的supervised learning的方法,直接訓練一個network,它的輸入是一段文字,輸出是一張影像。
link |
那你希望它輸出的影像跟現在的quantum,跟現在的正確答案,越接近越好。
link |
那你確實可以用這種方法,直接就訓練機器看到文字產生影像,但是過去用這種方法訓練機器看到文字產生影像,你會發現說你做菜的結果並不太好。
link |
為什麼呢?我們舉一個直觀的例子。假設你現在要機器學會畫火車,但是你的訓練資料裡面有很多不同型態的火車,正面的火車也是火車,側面的火車也是火車。
link |
所以對機器來說,當這個network輸入火車的時候,它的正確答案有好多個。對network來說,如果正確答案有好多個的話,它會怎麼產生它的輸入呢?它會產生正確答案的平均。
link |
因為它產生出來的東西正確答案的平均,所以如果你用supervised的方法去教機器產生圖片的話,這時候你會發現,往往你產生出來的圖片是特別模糊的,因為你產生出來的圖片是諸多圖片的平均,就是模糊的。
link |
就如果今天機器可以產生正面的火車也是對的,可以產生側面的火車也是對的,但是產生正面的火車跟側面的火車的平均就是一個四不像,這樣結果就不是我們要的。
link |
所以我們這邊需要有新的技術。舉例來說,我們會用conditional game來做文字的對應,來進行根據文字的影像生成。
link |
今天其實在做conditional game的時候,一般我們也需要clear的data,也就是我們也需要image跟文字的對應關係,所以這個訓練是supervised的,但是它跟一般的supervised learning的訓練目標是不太一樣的。
link |
事實上conditional game也可以在unsupervised的情況下進行訓練,這個等一下我們會再講到。我們這邊訓練一個generator,這個generator輸入文字,輸出對應的影像。
link |
這個generator它不去看光處,它看的是什麼?它看的是discriminator,它是跟著discriminator學的。
link |
我們剛才有講過說,generator學習的目標就是跟著discriminator學的。但是這邊要注意一下,在做conditional game的時候,它跟一般的game是不一樣的。
link |
一般我們訓練,也在我們剛才在第一個部分,我們講一般的game的時候,我們說discriminator就是吃一張圖片,判斷它是好還是不好。
link |
今天在conditional的狀況下,discriminator如果只吃一張圖片的話,會遇到什麼樣的問題呢?會遇到的問題是說,對generator來說,要騙過discriminator太容易了。
link |
它只要永遠產生好的圖片,比喻來說,永遠產生某一隻很可愛的貓就可以騙過discriminator,對discriminator來說,那隻貓是好的圖片,然後就結束了。
link |
那generator就會學到說,今天不管輸入什麼樣的文字,我們就一律無視它,都產生好的圖片,我想要產生的就好了。
link |
所以如果你的discriminator它只看產生出來的image的quality,那generator是很懶惰的,你只看產生出來的image的quality,那我就產生出好的image給你看,產生好的image騙過你,但是輸入的文字我們就一律無視它,這個顯然不是我們要的。
link |
所以如果你在做conditional game,這邊有一件事情非常重要,多數人假設你對game不熟的話,你往往自己第一次使用conditional game的時候,你都會忘記這件事。
link |
在做conditional game的時候,你的discriminator應該要有兩個輸入,你的discriminator應該要同時看generator的input跟output,它同時看文字跟影像,然後輸出一個分數,這個分數同時代表有兩個含義。
link |
第一個含義是輸入的這個pair它們有多match,第二個是輸入的這個圖片它有多好,discriminator會看兩件事,它會同時看文字跟影像,它會看說這張影像它的quality有多高,然後它又會看說這個文字跟這張影像,如果把它們放在一起,它們有多match。
link |
那你要怎麼訓練discriminator呢?我們說訓練discriminator的時候,你要給它一些好的東西,好的輸入,告訴它說這些是要給它高分的。
link |
那今天在conditional game的case,因為我們是有level data的,我們有文字跟影像之間的對應關係,你就可以從你的database裡面sample出文字跟影像的pair,告訴你的discriminator說,看到這些文字和影像的pair,你應該給它高分。
link |
那就另外一個case而言,什麼樣的情況給它低分呢?按照我們在第一個部分講一般的game的想法,我們可能就是把一段文字輸入給generator,讓它產生一些generator產生出來的圖片,那這些文字跟generator產生出來的圖片,應該是要給它低分。
link |
但是如果光是這麼做是不夠的,光是這麼做discriminator只會學到說,我要判斷現在的輸入是好是不好,我不要管文字的部分,只要管影像的部分就好,這顯然不是我們要的。
link |
所以怎麼辦呢?今天在做conditional game的時候,你要注意你的next example,要給低分的case有兩種,一個是跟一般的game一樣,是用generator生成圖片,另外一個case是,你從你的資料庫裡面sample出一些好的圖片,但給這些好的圖片一些錯誤的文字,一些無關的文字。
link |
這樣discriminator就會學到說,並不是所有好的圖片都是對的,如果好的圖片對應到錯的文字,它也是不好的。這樣discriminator就會學到說,影像跟文字間應該要有什麼樣的關係。
link |
很多第一次做conditional game的人,其實也會忽略這樣子的next example。那同樣像這樣的技術有什麼樣的應用呢?除了看文字生成影像以外,現在這種例子已經滿坑滿谷了,除了看文字生成影像以外,其實只要什麼東西,你有pair的data,你都可以拿來用conditional game做做看。
link |
我們這邊就訓練了一個generator,輸入聲音,然後希望可以輸出對應的畫面。
link |
那我們說要訓練conditional game,你必須要有pair data,這個是影像跟聲音的對應關係,其實今天並不難收集,你可以找到很多的video,video裡面你把audio部分拿出來,那就是聲音,你把image的frame,影像裡面一幀一幀拿出來,它們就是image。
link |
然後你就知道說這一小段聲音訊號對應到這張圖片,你就有pair的data,你就有這個聲音跟影像間的對應關係,你就可以訓練你的network,叫它聽到一段聲音,舉例來說聽到狗叫聲,就發一隻狗出來。
link |
那訓練的方法就跟我們剛才講的conditional game是一樣的。這個東西可以做起來嗎?以下是一些真正的實驗結果。
link |
我們看看大家聽不聽得到這個聲音,大家聽得到嗎?這個有點像是電視機壞掉的聲音,那機器覺得它看到什麼呢?它覺得它看到一條小溪,大家聽聽看另外一個東西,大家覺得這個是什麼?聽起來像是直升機對不對?
link |
機器覺得它聽到一個在海上奔馳的快艇,但是我其實有點擔心說機器會不會只是背了一些資料庫裡面的圖片,它根本就沒有學會這個聲音跟影像間的關係,所以我們把聲音調大。
link |
然後就產生了一條瀑布,或者是說我們把快艇的聲音調大,
link |
然後快艇就在海上高速的奔馳,然後旁邊接觸的水花就越來越多,但是這個其實是稍微cherry pick一下的結果,很多時候機器產生出來的結果是整個都爛掉了,比如說就像是這個樣子,這個是讓它聽狗叫聲,其實也沒有產生一隻狗。
link |
對,讓它聽鋼琴的聲音,它好像想畫一台鋼琴,但是並沒有特別的成功就是了,這個真的是不知道在畫些什麼。
link |
好,那我們也嘗試了,剛才是用文字產生影像,那這邊反過來想,我們用影像來產生文字,我們把gain用在multilabel的image classifier上面,那所謂multilabel的image classification,那這個大家應該都不難想像,就是要機器開一張圖片,然後現在它告訴我們說圖片裡面有哪些物件,
link |
比如說有球、有球棒、有手套等等,好,那現在正確答案不止一個,到目前為止我們在課堂裡面講的分類的問題,每一個輸入都只屬於一樣東西,每張圖片它都只屬於一個類別。
link |
那在multilabel的classification的情況下,同一張圖片它可以同時屬於多個不同的類別,那一張圖片同時屬於多個不同的類別這件事,我們把它想成是一個生成的問題。
link |
然後我們就說現在multilabel的image classifier是一個conditional的generator,它的輸入是一張圖片,圖片是我們的condition,label是我們的generator輸出的output。
link |
接下來呢,接下來就直接當作conditional game train下去就結束了,一般的conditional game怎麼做,我們就怎麼做。好,那這個是一些實驗的結果啦,那試了兩個不同的code,這邊是用F1 score當作measure,總之就是分數越高代表現在分類的越正確。
link |
那我們也試了不同的network architecture,那這邊從VGG一直試到了resnet152,有各種不同的network architecture。
link |
然後你會發現說呢,現在假設你training的時候不是用一般的train法,所以一般的train法就是你現在你希望network的輸出跟你的光tube越接近越好,那如果你今天用一般的train法希望network輸出跟光tube越接近越好,這是你可以得到的結果。
link |
但是如果你用conditional game的方法再加一個discriminator去訓練你的generator的話,你會發現在各種不同的case,在各種不同的network架構之下,結果都是有比較好的。
link |
那為什麼加上game的結果會比較好呢?因為加上game的話,我們可以考慮level和level之間的dependency,一般你在做training的時候,一般你希望你network的輸出跟光tube越接近越好的時候,每一個level你都是分開考慮的,所以不太容易考慮level之間的dependency,但是你加game的時候,你比較容易考慮level之間的dependency。
link |
總之conditional game有種種不同的。
link |
就前幾天我看到一個特別厲害的,它是根據一張圖片跟人臉的landmark去產生另外一張人臉,也就是說你現在可以做的事情是什麼呢?
link |
你給他一張蒙娜麗莎的臉,然後再畫一些人臉的landmark,你就可以讓蒙娜麗莎開始講話,你就可以讓他的頭擺出你要的樣子,就跟哈利波特裡面畫像會講話一樣。
link |
這個是Sanson做的結果,大家有興趣的話可以看一下右下角的論文,我看他做出來大概是這個樣子,這是他放的demo,我覺得這個結果還蠻驚人的,這也是一個game的應用。
link |
最後我要跟大家講的是unsupervised conditional game,在我們剛才講conditional game的時候,我們說我們需要輸入跟輸出之間的對應關係,但事實上今天我們有機會在不知道輸入和輸出之間的對應關係的情況下,教機器怎麼把輸入的東西轉成輸出的東西。
link |
這個技術最常見到的應用是image style的conformation,影片的影像的風格轉換,就是你有一堆X-domain的影像,假設X-domain的影像都是真實的照片,
link |
有Y-domain的影像,假設Y-domain的影像都是梵谷的畫作,那真實的照片跟梵谷的畫作間沒有任何的對應關係,因為假設你說我有一張日月潭的照片,那梵谷沒有去過日月潭,它畫作裡面沒有日月潭的照片,所以你根本找不出它們之間的對應關係。
link |
但是我們可以訓練一個generator,它直接輸入真實的照片,輸出就是梵谷的畫作,而我們不需要告訴它真實的照片跟梵谷的畫作間有什麼樣的對應關係。
link |
這邊我們要介紹的技術是Psychogam,Psychogam它想要做的事情是訓練一個generator,這個generator輸出X-domain的圖,我們現在X-domain的圖是真實的畫作和真實的照片,Y-domain的圖是梵谷的畫作。
link |
然後我們除了訓練一個generator以外,我們還需要訓練一個discriminator,discriminator做的事情是給它看很多梵谷的畫作,它知道看到梵谷的畫作就要給它高分,看到不是梵谷的畫作就要給它低分。
link |
那generator它為了要騙過discriminator,我們剛才講過很多次,generator它學習的目標就是為了要去騙過discriminator,generator它為了要騙過discriminator,我們期待它產生出來的圖片就像是梵谷的畫作。
link |
光是這麼做是不夠的,因為generator可能很快就會發現discriminator看的就是它的輸出,discriminator看到梵谷的自畫像會覺得很像梵谷的畫作,generator就永遠都產生梵谷的自畫像就好了,完全無視輸入。
link |
generator會學到完全無視輸入,永遠產生梵谷的自畫像,反正這樣可以騙過discriminator,整個訓練就結束了,但這顯然不是我們要的。
link |
所以怎麼辦呢?為了解決這個問題,我們需要再加上一個generator,第二個generator它做的事情是看這一張圖片,然後試著還原原來的輸入,也就是說你輸入一張X-domain的圖片,第一個generator把它轉成Y-domain的圖,然後第二個generator再把它還原回X-domain的圖,你希望輸入跟輸出越接近越好。
link |
因為現在加上了這個限制,第一個generator它就不能夠盡情的騙過你的discriminator,它必須有所節制,它不可以產生梵谷的自畫像,因為如果它把這張圖片轉成梵谷的自畫像,第二個generator根本無法把梵谷的自畫像還原。
link |
所以第一個generator它可能就會想辦法把這張圖片改成有梵谷的畫風,但是原來第一張圖片裡面最大的資訊仍然應該被保留下來,這樣第二個generator才有辦法把圖片還原。
link |
讓輸入跟輸出越接近越好,這件事在這邊叫做cycle consistency,所以這個技術就被叫做cycle game。那cycle game其實它可以是雙向的,我們剛才講的是先把X轉Y,再把Y轉回X,那現在反過來我們可以把Y先轉成X,
link |
但你一樣要一個X-domain的discriminator,看說現在Y轉X的結果,這個輸出來的圖片像不像是真實的照片,然後你再用你另外一個藍色的generator把X轉回Y,同樣要讓輸入和輸出越接近越好。
link |
那這個技術就叫做cycle game,在文獻上可能會看到很多其他的技術跟cycle game有點像,比如說discogame,比如說duogame,它們跟cycle game有什麼不同呢?就是沒什麼不同,不同的人在同一個時間提出了幾乎一模一樣的做法。
link |
那同樣的技術不是只能用在影像上,我們可以把它用在其他的應用上。舉例來說,假設你現在X-domain跟Y-domain是語音,分別是不同人講的話,那你就可以做語音的風格轉換,就可以把某個人的聲音轉成另外一個人的聲音。
link |
舉例來說,你現在X-domain跟Y-domain是兩種不同風格的文字,那你就可以做文字的風格轉換。舉例來說,我們現在把X-domain替換成負面的句子,把Y-domain換成一堆正面的句子。
link |
我們就可以用一模一樣的技術,我們只是換了這個資料而已,我們可以用一樣的訓練的架構,我們用一樣的訓練的想法,只是換了這個輸入和輸出的資料而已,我們就可以訓練一個generator,它可以把負面的句子轉成正面的句子。
link |
但是我們今天如果要直接把影像的技術套用到文字上,其實是會有一些問題的,會有什麼樣的問題呢?今天我們的generator如果在用文字相關的,在做文字風格轉換的時候,它的輸入是一個句子,它的輸出是一個句子。
link |
如果你要輸入輸出分別是一個句子的話,這個時候你會用什麼樣的network架構呢?你可能會選擇sequence-to-sequence model作為你的network的架構。
link |
你在訓練的時候,你仍然期待你用backpropagation的技術,把你的sequence-to-sequence model跟discriminator串在一起,用backpropagation的技術固定discriminator,只勸generator希望讓輸出的分數越高越好。
link |
但在文字的case,你會發現你沒辦法直接跑backpropagation,為什麼沒辦法直接跑backpropagation呢?你想想看,sequence-to-sequence model它輸出的是discrete sequence,是一串token。
link |
我們原來說generator的輸出可以看都是一個巨大network的hidden layer,那是因為在影像上,generator的輸出是一個連續的東西。在文字上,現在你的generator的輸出是文字,是token,它是discrete的。
link |
你今天如果一個network裡面有discrete的東西當你的later representation,你會發現說你是不能微分的。就你一個network,中間hidden layer的輸出是discrete的東西,是文字,你會發現整個network是沒有辦法微分的,它根本沒有辦法把微分算出來。
link |
所以怎麼辦?在文件上就有各式各樣的做法。如果你有興趣,再去仔細看一下我們上課的錄影,假設你要把game直接套用到文字上的話,是沒有那麼容易的,不能夠直接套用文字的訓練方式,你必須要有其他方法來訓練你的generator系列。
link |
就請參看上課的錄影。這邊是做了一下文字風格的轉換,我們把負面的句子轉成正面的句子,就我們剛才講的cyclopedia的技術。
link |
所以現在你跟機器說I miss you,它就會說I love you,你跟它說I don't love you,它就會說I love you,你跟它說I cannot do that,它就會說I can do that。
link |
這邊有一個強的,你跟它說sorry for doing such a horrible thing,它就會說thanks for doing the great thing。不過因為它是自動學的,所以有時候也會產生荒謬的結果,你跟它說my dog is sick,它就說my dog is my dog,也不知道在做些什麼。
link |
這個是英文的例子,中文的例子也是一樣的,你跟它說未曾沒睡醒,各種不舒服,它就說生日快樂睡醒,超級舒服。
link |
你跟它說我都想去上班了,真夠賤的,它就說我都想去睡了,真帥的,上班的相反就是去睡了。
link |
你跟它說竟然遇到一個變態狂,它就說竟然遇到一個帥狂,不知道在說什麼這樣子。
link |
你跟它說我肚子痛得厲害,這個很奇怪,它就說我生日快樂厲害,顯然機器覺得說胃部有毛病的相反就是生日快樂,它就是學到這樣,我也不知道為什麼。
link |
你就給它一堆正面句、一堆負面句,它就學到這樣。那可能問說這個系統有什麼用呢?基本上就是沒有什麼用處這樣子。
link |
但是你想想看,如果你的老闆說話特別機的話,你就可以把這個東西裝在你的耳機裡,這樣你的人生就會過得特別開心這樣子。
link |
我們剛才講的都是風格轉換,這種unsupervised conditional game其實除了風格轉換以外,其實還可以做其他的事情。
link |
舉例來說,我們試著拿這種unsupervised conditional game來做unsupervised的語音辨識,什麼叫做unsupervised的語音辨識呢?
link |
今天我們做語音辨識的時候,通常是supervised的,也就是說我們要給機器一大堆的句子,還要告訴它說每一個句子對應的文字是什麼。
link |
這樣的句子收集個上萬個小時,每一個句子都有對應的文字,期待機器就可以自動學會做語音辨識。
link |
但世界上有七千多種語言,你其實不太可能為每一種語言都收集這樣的訓練資料。所以這邊的想法是,語音辨識能不能是unsupervised?
link |
也就是說,我們收集一大堆語音,我們收集一大堆文字,但是我們沒有語音跟文字之間的對應關係。
link |
機器就是在路邊聽一大堆人講話,然後上網自己讀一些文章,期待它就自己學會語音辨識了。
link |
那怎麼做這個技術呢?其實這個技術的細節,我們今天就略豐的實行,其實還蠻複雜的。
link |
你可以想像說就打概念而言,其實就是conditional的game,就是conditional generator。
link |
只是剛才我們的一個domain是比如說風景照,另外一個domain是梵谷的畫作,現在換成一個domain就是語音,另外一個domain就是文字。
link |
看看機器可不可以自動學會把語音轉成文字,如果可以的話,它就學會了unsupervised的語音辨識。
link |
好,那到底可以做到什麼樣的成果呢?最近我們實驗室做出來的成果大概是這樣,我要強調一下這個是non-match的case。
link |
所以non-match的case就是說,這些語音跟文字它們並沒有對應的關係,就並不是說這些文字就是這些語音的人工寫的manual transcription,不是,就是一堆語音一堆文字,它們的內容是不一樣的。
link |
在這個情況下,Full error rate,Full error rate是什麼呢?Full error rate是這個因素的辨識錯誤率,因素是什麼呢?假設你不知道因素是什麼的話,你就想成是KK音標,你就想成KK音標。
link |
好,那機器的因素辨識錯誤率在一個叫做Timmy的Benchmark Open上面,它已經可以做到33%左右的錯誤率,也就是說對的東西是比錯的東西還要多了。
link |
那你可能問說,到底33%左右的錯誤率叫做好還是不好的?其實今天很多人很籠統地問一個問題說,語音辨識現在可以做到什麼樣的錯誤率或正確率?這個問題我都是沒有辦法回答的,為什麼?
link |
這個問題就好像是,你數學都會考幾分一樣,那你要問說是考哪樣的數學,是微積分還是國小數學,對不對?
link |
所以今天你要問說一個語音辨識系統的正確率有多少,你要問說你拿什麼樣的資料去測試它。
link |
那我們這邊用的是Benchmark Open,用的是基準語料庫,世界上很多人都會拿這一個資料庫來評比他們的語音辨識系統可以訓練出來的結果。
link |
所以我們其實是有辦法跟過去其他方法比較的,這個是我在文件上找到的一張圖,這個圖上講的是過去supervised learning的變化的情形,就是縱軸是正確率,橫軸是時間。
link |
從1990年代用H&M,Hidden Markov Model,如果你有學過數位語音處理的話,你一定聽過Hidden Markov Model開始做起,然後後來有了Deep Learning就可以做得越來越好,但這些都是supervised。
link |
那unsupervised learning今天可以做到哪裡呢? unsupervised learning今天已經在這裡了。
link |
也就是說,今天在unsupervised的情況下,我們沒有提供給機器任何的label,沒有提供給它文字跟語音之間的對應關係,它其實已經可以跟三十年前的supervised learning做得一樣好。
link |
這就讓我想到一個故事,就是星際大戰裡面不是有一個機器人叫做CGPO,CGPO它其實會講六百萬種銀河系的不同民族的語言。
link |
但是就算它會講六百萬種不同的語言,在銀河系中有更多的種族,所以很多種族的語言它是不會講的。
link |
有一次它碰到伊沃克人,它就聽不懂伊沃克語,伊沃克人就要把它殺了。
link |
但是它聽了伊沃克人的對話以後,突然間它就會說伊沃克語了,這就是因為它用了GAM的技術。
link |
那我今天要講的大概就是這個樣子,更多相關的GAM的資訊就請見上課錄影,QR code在這邊啦,那我們就在這邊休息十分鐘,等下我們回來講transformer。