back to index

GAN Lecture 2 (2018): Conditional Generation


link |
00:01.000
好,那我們這一堂課要講什麼呢?
link |
00:03.000
我們這一堂課要講作業三至二
link |
00:08.000
我們要train一個輸入文字,然後要產生對應的二次元人物的頭像
link |
00:14.000
那這個技術呢,你就要用到conditional game
link |
00:18.000
conditional game的意思是說,我們之前的game是隨機輸入一個vector
link |
00:23.000
然後就產生一張image
link |
00:25.000
那你其實根本不能夠控制說,你要output什麼樣的東西
link |
00:28.000
那我們這邊要講conditional game的意思是說
link |
00:31.000
你可以輸入一個,比如說文字
link |
00:34.000
然後呢,產生對應那個文字的圖片
link |
00:37.000
也就是你可以操控你要輸出的結果
link |
00:41.000
好,那我們今天要舉的例子呢
link |
00:43.000
在作業二裡面要做的東西呢
link |
00:45.000
就是text to image
link |
00:47.000
在作業四裡面要做的東西就是
link |
00:49.000
輸入文字,產生對應的圖片
link |
00:52.000
當然要做到這件事情
link |
00:54.000
要用輸入文字產生對應的圖片
link |
00:56.000
它其實可以被當作是一個單純的supervised learning的problem來看
link |
01:01.000
那怎麼用supervised learning的方式來learn一個text to image的model呢
link |
01:07.000
那你需要的呢,就是一大堆的圖片
link |
01:10.000
每一張圖片都需要對應的文字的描述
link |
01:13.000
然後套用一個傳統的supervised learning的方法
link |
01:16.000
你可以說我就learn一個network
link |
01:18.000
它的輸入就是一段文字
link |
01:20.000
輸出就是對應的圖片
link |
01:23.000
那你希望輸出的圖片跟你的目標越接近越好
link |
01:28.000
那比如說你會minimize你的network output的
link |
01:31.000
你的network output跟這個文字所對應的image的L1或L2的Loss
link |
01:37.000
但是光是這麼做會有什麼樣的問題呢
link |
01:41.000
你可以想像說在你的training data裡面
link |
01:44.000
火車呢,它的對應的圖片其實是有很多張的
link |
01:48.000
這些是正面的火車,它們都是火車
link |
01:51.000
這些是側面的火車,它們也通通都是火車
link |
01:56.000
那你現在如果要讓你的network output去產
link |
02:01.000
如果你用傳統的方法來learn一個network的話
link |
02:04.000
它會覺得說輸入train的時候,輸入火車的時候
link |
02:07.000
它要長得像這三張,同時也要長得像這三張
link |
02:11.000
所以到時候你的network output就會變成是
link |
02:14.000
這些一大堆image的平均
link |
02:16.000
那如果你產生這種正面的火車是好的結果
link |
02:19.000
你產生這個側面的火車是好的結果
link |
02:22.000
但是同時產生正面的火車跟側面的火車合起來
link |
02:26.000
就是錯誤的結果
link |
02:28.000
先假設你用traditional的方法來learn一個conditional的generation
link |
02:33.000
你用一般的方法來learn一個text to image的generator
link |
02:36.000
你會發現說你產生出來的image都是特別模糊的
link |
02:40.000
為什麼?那因為你產生出來的image會是多張image的平均
link |
02:44.000
你的model在學習的時候
link |
02:46.000
它想要產生的結果是多張image的平均
link |
02:50.000
所以這邊就需要用到game的技術
link |
02:55.000
那我們說在原來的game裡面
link |
02:57.000
你的generator就是吃一個從normal distribution裡面sample出來的z
link |
03:01.000
根據這個z產生一張image x
link |
03:04.000
但在conditional generation裡面
link |
03:07.000
你的generator不是只有吃z
link |
03:09.000
它同時也吃了另外一個東西
link |
03:12.000
吃了另外一個conditional的text c
link |
03:15.000
所以你的conditional game
link |
03:17.000
它就是同時吃一個normal distribution
link |
03:19.000
這sample出來的vector跟一段文字
link |
03:22.000
然後根據這段文字
link |
03:24.000
還有這個sample出來的vector
link |
03:27.000
它產生generator的結果
link |
03:31.000
接下來你要train一個discriminator
link |
03:35.000
在我們原來的game裡面
link |
03:37.000
discriminator只吃一張image x
link |
03:39.000
然後它告訴你說這個x它的quality好不好
link |
03:43.000
這個discriminator它吃一個x
link |
03:45.000
它output一個scalar
link |
03:46.000
這個scalar代表說input的x
link |
03:48.000
它到底有多好或者是多不好
link |
03:52.000
那你在train這個discriminator的時候
link |
03:54.000
你就告訴這個discriminator說
link |
03:56.000
如果是real的image就給它1分
link |
03:58.000
如果是generated的image就給它0分
link |
04:02.000
但光是這麼做是不夠的
link |
04:04.000
假設你是用我們之前看到的那種方式
link |
04:07.000
來traindiscriminator的話
link |
04:09.000
會發生什麼問題呢
link |
04:10.000
你會發現說
link |
04:11.000
今天generator在產生image的時候
link |
04:13.000
它會完全無視input的condition
link |
04:16.000
因為discriminator它是檢查說
link |
04:18.000
你現在input的image
link |
04:20.000
是不是一張high quality的image
link |
04:23.000
所以今天對generator來說
link |
04:26.000
它要騙過discriminator
link |
04:27.000
它只要產生high quality的image就好
link |
04:29.000
它只要產生清晰的圖就好了
link |
04:31.000
它可以完全無視你input的condition
link |
04:34.000
不管你輸入是貓啊狗啊還是火車啊
link |
04:36.000
它可能都輸出貓
link |
04:37.000
反正只要這個discriminator覺得
link |
04:39.000
它產生出來的貓是一隻高品質的貓
link |
04:42.000
看起來很像是真的貓
link |
04:44.000
就結束了
link |
04:46.000
但這個顯然不是我們要的
link |
04:48.000
我們希望機器是按照我們輸入的condition
link |
04:51.000
產生不同的圖片
link |
04:53.000
所以今天你要注意
link |
04:54.000
當你在做conditional game的時候
link |
04:56.000
你的discriminator
link |
04:57.000
不可以只看generator的輸出
link |
05:00.000
它要同時看generator的輸入跟輸出
link |
05:05.000
這個時候你的discriminator有兩個任務
link |
05:07.000
我們說discriminator
link |
05:08.000
它吃一個condition跟吃一個object
link |
05:11.000
然後產生一個scalar
link |
05:13.000
這個scalar它對應到兩件事情
link |
05:15.000
第一件事情是
link |
05:17.000
x是不是真實的
link |
05:19.000
第二件事情是
link |
05:20.000
你的x跟它的condition c
link |
05:22.000
它們合起來是不是應該湊成一對
link |
05:26.000
x是真的還是不是真的
link |
05:28.000
x跟c是不是應該湊成一對
link |
05:31.000
這兩個東西加起來
link |
05:33.000
就是discriminator的output
link |
05:36.000
所以你今天在train這種discriminator的時候
link |
05:38.000
這個就是我們在作業
link |
05:40.000
三之二要做的事情
link |
05:43.000
我們今天在train這種discriminator的時候
link |
05:46.000
對這種discriminator來說
link |
05:48.000
什麼樣的
link |
05:50.000
現在discriminator它不是只吃image
link |
05:52.000
它是吃一個pair
link |
05:53.000
它是吃一個image跟一段文字
link |
05:56.000
什麼樣的文字跟image的組合
link |
05:59.000
要給它高分呢
link |
06:00.000
當然是一段文字
link |
06:02.000
它對應的image
link |
06:03.000
它們合起來要給它一分
link |
06:06.000
但是什麼樣的狀況
link |
06:08.000
應該給它零分呢
link |
06:09.000
如果今天是正確的文字
link |
06:12.000
一段文字
link |
06:13.000
跟generator的輸出
link |
06:15.000
正確的文字
link |
06:16.000
跟generated image
link |
06:18.000
當然要給它低分
link |
06:20.000
但是還有另外一個case
link |
06:21.000
應該要給它低分
link |
06:23.000
因為這個discriminator
link |
06:24.000
它不是只要看你產生出來的image好不好
link |
06:27.000
它還要看你產生出來的image
link |
06:28.000
跟它input的text
link |
06:30.000
它們有沒有被match在一起
link |
06:32.000
所以今天不是只有一個case
link |
06:34.000
給它低分
link |
06:35.000
還有另外一個case
link |
06:36.000
要給它低分
link |
06:37.000
什麼樣的case
link |
06:38.000
應該要給它低分呢
link |
06:39.000
你拿一張真實的image
link |
06:42.000
但是隨便給它pair的
link |
06:44.000
隨便給它加上隨機的文字
link |
06:47.000
比如說這個是火車
link |
06:48.000
也就是說它是一隻貓
link |
06:50.000
這個case
link |
06:51.000
也要給discriminator低分
link |
06:53.000
你要告訴discriminator說
link |
06:54.000
就算是產生好的圖
link |
06:56.000
但是給它一個隨機的文字
link |
06:59.000
它們沒有辦法match在一起
link |
07:00.000
它們是不匹配的
link |
07:02.000
這個時候也應該要給它低分
link |
07:04.000
所以跟一般的generator不一樣
link |
07:07.000
跟一般的game不一樣
link |
07:08.000
當你做conditional game的時候
link |
07:09.000
你的discriminator
link |
07:10.000
它是吃一個pair當作input
link |
07:12.000
那你在train這個discriminator的時候
link |
07:14.000
它有兩種negative的example
link |
07:16.000
有兩種case
link |
07:17.000
是應該給它低分的
link |
07:18.000
一個case是
link |
07:19.000
輸入一段文字給generator
link |
07:22.000
generator產生一張模糊的圖
link |
07:24.000
這要給低分
link |
07:25.000
給一張清晰的圖
link |
07:26.000
但是隨便給它
link |
07:27.000
加上一個隨機的文字
link |
07:29.000
這個應該也要給它低分
link |
07:32.000
想要這邊大家有問題要問嗎
link |
07:35.000
覺得ok嗎
link |
07:37.000
好 那如果你比較喜歡
link |
07:39.000
看演算法的話
link |
07:40.000
這邊我就把演算法列一下
link |
07:42.000
你就照著這個code
link |
07:44.000
這樣知不知道
link |
07:45.000
就是照著這個code
link |
07:46.000
怎麼code呢
link |
07:47.000
怎麼code呢
link |
07:48.000
我們就一行一行的講給你聽啦
link |
07:50.000
這怎麼code
link |
07:51.000
我們從database裡面呢
link |
07:52.000
sample出m個example
link |
07:55.000
那注意一下
link |
07:56.000
因為今天是conditional的generation
link |
07:58.000
所以你的每一個example都是
link |
08:00.000
假設是text to image
link |
08:02.000
都是image跟文字的pair
link |
08:04.000
都是image跟文字的pair
link |
08:05.000
知道嗎
link |
08:06.000
文字是c
link |
08:07.000
image是x
link |
08:08.000
所以你的每一個sample data
link |
08:10.000
都是文字跟image的pair
link |
08:13.000
都是文字跟image的pair
link |
08:15.000
都是文字跟image的pair
link |
08:17.000
好 那這個是要給高分的
link |
08:20.000
是positive example
link |
08:22.000
對discriminator來說
link |
08:23.000
要給高分的
link |
08:24.000
前半段是在訓練discriminator
link |
08:26.000
好 那你接下來sample出m個vector
link |
08:29.000
然後呢
link |
08:30.000
把這m個vector
link |
08:32.000
每一個都去加上一個condition
link |
08:34.000
這邊有m個condition
link |
08:36.000
c1到cn對不對
link |
08:37.000
把這m個vector
link |
08:38.000
每一個都去加上condition
link |
08:40.000
產生example
link |
08:41.000
產生m張generated image
link |
08:44.000
接下來
link |
08:45.000
你再去你的database裡面
link |
08:47.000
sample出m個object
link |
08:49.000
我們這邊呢
link |
08:50.000
寫做x1hat到xnhat
link |
08:52.000
這m張image
link |
08:53.000
這個xhat呢
link |
08:54.000
它也是好的image
link |
08:55.000
它也是好的image
link |
08:57.000
這個xdelta是generated image
link |
08:59.000
這個xhat呢
link |
09:00.000
它也是real的image
link |
09:02.000
也是database裡面sample出來的image
link |
09:04.000
好 接下來
link |
09:05.000
在訓練discriminator的時候
link |
09:07.000
如果是正確的c跟x的pair
link |
09:10.000
就給它高分
link |
09:12.000
如果今天是c配上xdelta
link |
09:17.000
一段文字敘述
link |
09:19.000
配上generated出來的模糊的結果
link |
09:22.000
那應該要給它低分
link |
09:24.000
如果今天是一段文字敘述
link |
09:27.000
配上xhat
link |
09:30.000
從training data裡面
link |
09:32.000
sample出來的real的image
link |
09:34.000
從training data裡面
link |
09:35.000
sample出來的清楚的image
link |
09:37.000
但是跟這個c
link |
09:38.000
它是沒有辦法配在一起的
link |
09:41.000
這個也要給它低分
link |
09:43.000
也要給它低分
link |
09:44.000
所以今天是這個case給它高分
link |
09:46.000
這兩個case也要給它低分
link |
09:48.000
那這個實作跟
link |
09:50.000
跟之前講的那個game
link |
09:52.000
其實是沒有什麼太大的差別
link |
09:53.000
唯一差別的地方就是
link |
09:54.000
你記得你要多加這一項就是了
link |
09:56.000
之前只有一種next example
link |
09:58.000
現在變成有兩種next example
link |
10:00.000
就這樣
link |
10:02.000
接下來train generator
link |
10:06.000
train generator怎麼做
link |
10:08.000
sample出angle vector
link |
10:09.000
再sample出angle condition
link |
10:11.000
把每一個vector z
link |
10:13.000
跟每一個condition加起來
link |
10:15.000
一起丟到generator裡面
link |
10:17.000
再通過discriminator
link |
10:19.000
希望這個分數越大越好
link |
10:21.000
那這個就是在train generator
link |
10:24.000
好那這個就是大家
link |
10:26.000
作業三至二要實作的東西了
link |
10:29.000
那在discriminator
link |
10:31.000
network的架構上
link |
10:32.000
應該要怎麼設計呢
link |
10:34.000
我發現我最常看到的設計
link |
10:36.000
是這個樣子
link |
10:38.000
input一個object
link |
10:40.000
就是一張image
link |
10:42.000
然後通過一個network
link |
10:43.000
把它變成一個embedding
link |
10:45.000
然後你的condition
link |
10:46.000
condition現在是一串文字
link |
10:48.000
文字你可能也通過一個network
link |
10:50.000
把它也變成embedding
link |
10:51.000
可以把這兩種embedding
link |
10:52.000
組合起來丟到network裡面
link |
10:54.000
然後最後network
link |
10:55.000
output一個scalar
link |
10:56.000
這個scalar代表了兩件事
link |
10:58.000
一件事情是
link |
10:59.000
input的x有多好
link |
11:00.000
同時又代表了
link |
11:01.000
x跟c合起來
link |
11:02.000
他們湊成一個pair
link |
11:04.000
有多合適
link |
11:05.000
但是我發現
link |
11:06.000
有另外一種discriminator的架構
link |
11:08.000
而這種discriminator的架構
link |
11:10.000
在文件上看起來
link |
11:11.000
它的performance是不錯的
link |
11:13.000
然後我發現有三篇paper
link |
11:15.000
都是做這樣的事情
link |
11:16.000
那我個人認為
link |
11:17.000
這個架構
link |
11:18.000
其實好像是比較有道理的
link |
11:20.000
這個架構是這樣
link |
11:21.000
這個架構是說
link |
11:22.000
我們有一個object進來
link |
11:24.000
object先通過一個network
link |
11:26.000
然後呢
link |
11:27.000
就output一個分數
link |
11:29.000
接下來呢
link |
11:30.000
這個綠色的network
link |
11:31.000
它也吐出一個embedding
link |
11:33.000
這個embedding也跟你的condition
link |
11:34.000
結合起來
link |
11:35.000
丟到另外一個藍色的network裡面
link |
11:37.000
藍色的network也吐出一個分數
link |
11:39.000
所以現在你吐出兩個分數
link |
11:41.000
一個是綠色的network
link |
11:42.000
吐出來的分數
link |
11:43.000
綠色的network
link |
11:44.000
只看你的object
link |
11:45.000
它不管這個condition
link |
11:47.000
它只看你的object
link |
11:48.000
然後它去看這個object
link |
11:49.000
決定說
link |
11:50.000
現在output的結果
link |
11:51.000
是realistic的
link |
11:52.000
還是不是realistic的
link |
11:54.000
那這個藍色的network呢
link |
11:55.000
藍色的network
link |
11:56.000
它同時看了X
link |
11:58.000
也看了C
link |
11:59.000
兩個湊起來以後
link |
12:01.000
它會告訴你說
link |
12:02.000
它應該是被match在一起的
link |
12:04.000
還是不應該被match在一起的
link |
12:07.000
所以
link |
12:08.000
今天這個藍色的network
link |
12:09.000
它同時看了X
link |
12:10.000
同時看了C
link |
12:11.000
它決定說
link |
12:12.000
這兩個東西
link |
12:13.000
它到底應該是match的
link |
12:14.000
還是不是match的
link |
12:16.000
那我覺得
link |
12:17.000
把這兩種evaluation的結果
link |
12:19.000
把它拆開
link |
12:20.000
其實可能是比較合理的
link |
12:22.000
因為今天在上面這個case
link |
12:24.000
如果你給network一筆data
link |
12:27.000
一組data
link |
12:28.000
告訴它說
link |
12:29.000
這是一個壞的example
link |
12:30.000
你應該給它低分
link |
12:31.000
但是你沒有告訴它說
link |
12:32.000
為什麼是低分
link |
12:34.000
我們都講說
link |
12:35.000
我們有兩種sample嘛
link |
12:37.000
有兩種negative example
link |
12:38.000
一種negative example是
link |
12:40.000
其實你的image跟文字還是match的
link |
12:43.000
只是image的quality不好
link |
12:44.000
因為它是generator產生的
link |
12:46.000
因為case是
link |
12:47.000
你的image的quality是好的
link |
12:48.000
但是它是不match的
link |
12:50.000
這兩種case都要給它低分
link |
12:52.000
但是對這個network來說
link |
12:53.000
它就會confuse這樣
link |
12:55.000
它會不知道說
link |
12:56.000
為什麼這個東西
link |
12:57.000
是給它低分
link |
12:59.000
舉例來說
link |
13:00.000
你可能是說
link |
13:01.000
給它一個很清晰的圖片
link |
13:04.000
給它一個很清晰的火車
link |
13:05.000
但是搭配狗
link |
13:06.000
告訴它說
link |
13:07.000
這個要給低分
link |
13:08.000
也許它會覺得說
link |
13:09.000
會不會是因為這個火車
link |
13:10.000
不夠清晰
link |
13:11.000
應該要產生得更清晰一點
link |
13:13.000
所以今天對這種network來說
link |
13:15.000
兩種不同的錯誤
link |
13:17.000
就是你的X不夠realistic
link |
13:19.000
還有X跟C不夠match
link |
13:21.000
對它來說
link |
13:22.000
它不知道到底是哪一種錯誤
link |
13:24.000
你就把兩種theta都倒給它
link |
13:25.000
希望它自己可以分辨
link |
13:27.000
但是我覺得就下面這個case而言
link |
13:29.000
你就可以
link |
13:31.000
把這兩個case分開
link |
13:32.000
你就會告訴它說
link |
13:33.000
假設你今天的case是
link |
13:35.000
你的X產生出來
link |
13:37.000
不夠清晰
link |
13:38.000
那只需要
link |
13:39.000
這一個值變小就好
link |
13:41.000
如果你今天是X很清晰
link |
13:43.000
只是跟C不match
link |
13:44.000
那你只需要讓這個值變小
link |
13:46.000
那這個值就不用變小
link |
13:47.000
我覺得
link |
13:48.000
這可能是一個比較合理的設計
link |
13:50.000
不過就是給大家
link |
13:52.000
給大家參考就是了
link |
13:53.000
不過我現在看到比較多的network
link |
13:55.000
是用上面這個方式設計的
link |
13:57.000
不過也有一些paper
link |
13:58.000
用下面這個方式
link |
13:59.000
來設計它的discriminator
link |
14:01.000
我覺得下面其實是比較合理的
link |
14:03.000
也許你可以在作業裡面試試看
link |
14:04.000
然後告訴我說
link |
14:05.000
你覺得哪一個結果
link |
14:07.000
performance比較好
link |
14:09.000
那這個就是大家作業要做的事情了
link |
14:12.000
我們會給你image
link |
14:13.000
跟它對應的一些特徵的描述
link |
14:16.000
那你要做到的事情
link |
14:17.000
就是輸入一段文字
link |
14:18.000
比如說
link |
14:19.000
這個角色是什麼樣的眼睛
link |
14:21.000
什麼樣的頭髮
link |
14:22.000
得到一個結果
link |
14:23.000
那這個結果到底可以
link |
14:25.000
做的什麼樣子呢
link |
14:26.000
這個是去年
link |
14:27.000
吳宗翰 謝俊成 陳炎浩
link |
14:31.000
和錢柏君同學做的
link |
14:32.000
他們結果是這樣
link |
14:33.000
輸入紅頭髮 綠眼睛
link |
14:36.000
這產生紅頭髮 綠眼睛的角色
link |
14:38.000
理論上你也可以做到這樣子的
link |
14:41.000
然後
link |
14:42.000
對 它確實都是紅頭髮
link |
14:43.000
然後都是綠眼睛
link |
14:45.000
然後輸入藍頭髮 紅眼睛
link |
14:48.000
產生出來的結果
link |
14:49.000
是這個樣子的
link |
14:50.000
那你會發現說
link |
14:51.000
機器還是會犯錯
link |
14:52.000
比如說這個角色
link |
14:53.000
它一隻眼睛是紅的
link |
14:55.000
另外一隻眼睛卻是藍的
link |
14:58.000
顯然機器覺得說
link |
14:59.000
產生一隻紅色的眼睛
link |
15:01.000
就可以蒙混過去了
link |
15:03.000
可是它兩隻眼睛顏色是不一樣
link |
15:05.000
就是一眼白眼
link |
15:06.000
一眼血綸眼這樣子
link |
15:12.000
那還有一個技術
link |
15:13.000
你可以用在作業裡面的
link |
15:15.000
叫做State Game
link |
15:16.000
你不用State Game
link |
15:17.000
你就可以過Base Line
link |
15:18.000
那如果你想要
link |
15:20.000
登峰造極
link |
15:21.000
你就可以用一下State Game這樣子
link |
15:23.000
State Game是怎樣呢
link |
15:25.000
State Game的概念是說
link |
15:27.000
先產生小張的圖
link |
15:29.000
再產生根據小張的圖
link |
15:31.000
再產生大張的圖
link |
15:34.000
在原始的State Game的Paper裡面
link |
15:36.000
它想要產生圖的大小是256x256
link |
15:39.000
不過太大張了
link |
15:40.000
你直接產生256x256的圖
link |
15:42.000
會壞掉
link |
15:43.000
所以State Game在Train的時候
link |
15:44.000
它把整個Training的Process
link |
15:46.000
拆成兩階
link |
15:47.000
先拆成兩階
link |
15:48.000
有一個第一階的Generator
link |
15:50.000
第一階的Generator
link |
15:51.000
它的工作是說
link |
15:52.000
吃一段文字進來
link |
15:54.000
這個Label有點複雜
link |
15:55.000
詳情你再去判一下Paper
link |
15:57.000
吃一個文字敘述進來
link |
16:00.000
再吃一個動文詞
link |
16:01.000
把它們湊湊Component在一起
link |
16:03.000
然後產生一張Image
link |
16:05.000
這個Image比較小
link |
16:07.000
只有64x64
link |
16:09.000
第二個Discriminator
link |
16:10.000
check說
link |
16:11.000
這個Image
link |
16:12.000
搭配這一段文字的敘述
link |
16:15.000
是不是Match的
link |
16:17.000
接下來你有第二個Generator
link |
16:19.000
第二個Generator是什麼呢
link |
16:20.000
第二個Generator
link |
16:21.000
就吃一段文字的敘述
link |
16:23.000
跟一張64x64的Image
link |
16:25.000
然後產生一張256x256的圖
link |
16:28.000
然後第二個Discriminator
link |
16:30.000
再看說這個256x256的圖
link |
16:33.000
是不是沒有Listing的
link |
16:34.000
總之你在做的時候
link |
16:35.000
你就是分成兩階
link |
16:37.000
先產生小的
link |
16:38.000
然後再產生大的
link |
16:39.000
那你直覺就會知道說
link |
16:40.000
這樣子做
link |
16:41.000
應該Performance會比較好的
link |
16:43.000
像之前不是那個NVIDIA
link |
16:45.000
有Report說
link |
16:46.000
他們的捲片
link |
16:47.000
可以產生什麼1024x1024的超級大圖
link |
16:51.000
然後連毛細
link |
16:52.000
它們產生在人臉
link |
16:53.000
是連毛細孔都看得到的那一種
link |
16:55.000
所以這個時候
link |
16:56.000
他們做的就是用
link |
16:57.000
類似Skidcam的概念
link |
16:58.000
你要產生小張的圖
link |
16:59.000
你先產生4x4
link |
17:00.000
再產生
link |
17:01.000
根據4x4產生8x8
link |
17:03.000
再產生16x16
link |
17:04.000
最後一直到產生1024x1024
link |
17:07.000
他們實際上在Chain的時候
link |
17:08.000
這些所有疊在一起的Generator
link |
17:10.000
都是用Euclid合在一起Chain的
link |
17:12.000
它是先Chain第一個小的
link |
17:14.000
然後再疊第二個比較大的
link |
17:15.000
然後大的跟小的一起Chain
link |
17:17.000
然後再疊更大的
link |
17:18.000
然後再一起Chain這樣子
link |
17:20.000
所以如果你今天想要在
link |
17:21.000
作業32個
link |
17:22.000
或者是前面的作業31
link |
17:24.000
登峰造極的話
link |
17:25.000
你就不要用Skidcam這樣子
link |
17:27.000
你先產生一個比較小的圖
link |
17:28.000
然後再把它產生比較大的圖
link |
17:32.000
那剛才講的那個Conditioned
link |
17:34.000
應該是產生文字
link |
17:35.000
再產生對應的圖片
link |
17:37.000
那我們現在也可以產生圖片
link |
17:39.000
然後呢
link |
17:40.000
產生另外一張對應的圖片
link |
17:42.000
那這個東西
link |
17:43.000
是怎麼做的呢
link |
17:44.000
這個東西怎麼做的呢
link |
17:48.000
這邊你在文件上
link |
17:49.000
可以看到很多的例子
link |
17:50.000
比如說把黑白圖轉成彩色圖
link |
17:53.000
把白天轉成夜晚等等
link |
17:57.000
這個怎麼做的
link |
17:58.000
你要Chain這種Network
link |
18:00.000
首先當然你要有Training Data
link |
18:02.000
假設你今天是要把
link |
18:03.000
簡單的幾何圖形
link |
18:04.000
變成真實的房屋的樣子
link |
18:07.000
那你需要蒐集很多
link |
18:08.000
簡單的幾何圖形
link |
18:09.000
跟真實房屋的Pair
link |
18:11.000
這種Data蒐集個好幾萬張
link |
18:13.000
然後去Chain一個Network
link |
18:15.000
當然你可以用Supervised的方法
link |
18:17.000
來解這個問題
link |
18:18.000
但是用Supervised的方法
link |
18:20.000
問題就是
link |
18:21.000
你產生出來的圖片
link |
18:22.000
會比較模糊
link |
18:23.000
如果用Supervised的方法
link |
18:25.000
你的做法是說
link |
18:26.000
你有一個Network
link |
18:27.000
然後你Input一張圖片
link |
18:29.000
它Output一張對應的圖片
link |
18:32.000
而你希望這張對應的圖片
link |
18:34.000
跟它的目標越接近越好
link |
18:37.000
你通常會算個比如說
link |
18:38.000
L1 Loss或L2 Loss
link |
18:40.000
但你發現
link |
18:41.000
如果你只有這麼做的話
link |
18:42.000
你會遇到的問題是
link |
18:43.000
你產生出來的Output
link |
18:45.000
會是特別模糊的
link |
18:46.000
就跟我們之前講
link |
18:48.000
Text to Image的Case一樣
link |
18:50.000
你同一張Image
link |
18:51.000
它可能可以對應到
link |
18:52.000
很多不同的房子
link |
18:54.000
但今天Network在學的時候
link |
18:56.000
它就是產生一個平均的結果
link |
18:58.000
所以它產生出來的圖片
link |
18:59.000
會是比較模糊的
link |
19:02.000
這個時候
link |
19:03.000
你就可以引入Gan的概念
link |
19:05.000
在Gan裡面
link |
19:06.000
你的Generator
link |
19:07.000
它吃一個這個簡單的圖
link |
19:09.000
它吃這個Condition
link |
19:10.000
跟一個Noise Z
link |
19:11.000
產生一張對應的圖片
link |
19:14.000
那你的Discriminator
link |
19:15.000
做的事情是什麼呢
link |
19:16.000
你的Discriminator會檢查
link |
19:18.000
這個Generator的Input跟Output
link |
19:20.000
湊起來
link |
19:21.000
是不是一個Pair
link |
19:22.000
那我們之前有講過說
link |
19:23.000
你今天在Conditional Gan裡面
link |
19:26.000
在Trend Discriminator的時候
link |
19:27.000
你應該給它吃一個Pair
link |
19:30.000
你應該給它吃一個Pair
link |
19:31.000
而不是只是Generator的Output
link |
19:33.000
你應該給它
link |
19:34.000
Generator的Input跟Output的Pair
link |
19:36.000
然後它會給它一個分數
link |
19:40.000
如果你用Gan來做的話
link |
19:41.000
你會發現你產生的圖
link |
19:43.000
就清晰很多
link |
19:45.000
但它的問題是
link |
19:46.000
Gan它會產生一些
link |
19:48.000
奇奇怪怪的東西
link |
19:49.000
比如說這邊有一個
link |
19:50.000
又像是煙囪又像是窗戶的東西
link |
19:53.000
是本來Input裡面沒有的
link |
19:56.000
對這個Discriminator來說
link |
20:00.000
產生這個東西
link |
20:01.000
好像也沒有特別不對
link |
20:03.000
那如果你今天
link |
20:04.000
要給它下額外的Constraint的話
link |
20:06.000
你可以下另外一個Constraint說
link |
20:08.000
你希望Generator的Output
link |
20:10.000
跟Trending Data裡面
link |
20:12.000
目標的那個Image
link |
20:13.000
同時也要越高越近越好
link |
20:16.000
比如說對你的Generator來說
link |
20:17.000
它有兩個目標
link |
20:19.000
一個目標是
link |
20:20.000
要產生夠清晰的圖
link |
20:21.000
去騙過Discriminator
link |
20:23.000
另外一方面
link |
20:24.000
你又希望Generator
link |
20:25.000
產生出來的Output
link |
20:26.000
不要跟原來的目標相差太多
link |
20:29.000
如果你把這兩個東西
link |
20:30.000
同時一起考慮的話
link |
20:32.000
那你產生出來的結果
link |
20:33.000
就會比較好
link |
20:35.000
不只是產生清晰的圖
link |
20:37.000
這個圖上面
link |
20:38.000
也不會產生奇怪的東西
link |
20:41.000
這個是Image to Image
link |
20:43.000
那在Image to Image
link |
20:45.000
那篇Paper裡面
link |
20:46.000
它的Discriminator
link |
20:48.000
是分為經過設計
link |
20:50.000
因為如果你今天
link |
20:51.000
要產生出來的Image
link |
20:52.000
非常大張
link |
20:53.000
那你的Discriminator
link |
20:55.000
如果是吃整張Image
link |
20:57.000
當作Input的話
link |
20:58.000
你結果很容易壞掉
link |
20:59.000
為什麼
link |
21:00.000
因為你的Discriminator
link |
21:01.000
因為Image很大嘛
link |
21:02.000
所以你的Discriminator
link |
21:03.000
參數也要很多
link |
21:04.000
那你很容易Trend
link |
21:05.000
Trend就很容易Overfitting
link |
21:07.000
或你Trend的時間
link |
21:08.000
就非常的長
link |
21:09.000
所以其實在前面那張
link |
21:11.000
前面那個Image to Image
link |
21:13.000
那個Paper裡面
link |
21:14.000
它做的事情是
link |
21:15.000
它的Discriminator
link |
21:17.000
是只檢查圖片裡面的
link |
21:20.000
一小塊而已
link |
21:21.000
它不是讓Discriminator
link |
21:23.000
去檢查整張圖片
link |
21:25.000
因為這樣子
link |
21:26.000
你的Discriminator
link |
21:27.000
參數量會太多
link |
21:28.000
它只讓Discriminator
link |
21:30.000
檢查一小塊圖片
link |
21:31.000
再說這小塊圖片
link |
21:33.000
它到底是好的
link |
21:34.000
還是不好的
link |
21:36.000
當然一個Discriminator
link |
21:37.000
檢查多大的區域
link |
21:39.000
就變成是一個
link |
21:40.000
你需要去調整的參數
link |
21:42.000
但Paper裡面
link |
21:43.000
它當然有調說
link |
21:44.000
如果看整張Image會怎樣
link |
21:46.000
如果小到只看一個Pixel
link |
21:49.000
會怎樣
link |
21:50.000
如果只看一小塊
link |
21:52.000
這個叫做Patch Gap
link |
21:53.000
如果只看一個Pixel
link |
21:55.000
就叫做Pixel Gap
link |
21:56.000
你可以想像說
link |
21:57.000
只看一個Pixel
link |
21:58.000
當然是一點用都沒有
link |
21:59.000
如果只看一個Pixel
link |
22:00.000
它不是就只考慮
link |
22:01.000
那一個點的事情嗎
link |
22:03.000
所以它產生出來的Image
link |
22:05.000
就整個都糊掉這樣
link |
22:06.000
就看不出來在產生什麼東西
link |
22:08.000
所以當然只用一個Pixel
link |
22:09.000
是不行的
link |
22:10.000
但是只看整張Image
link |
22:11.000
Performance也不是最好的
link |
22:12.000
你要調一下這個Patch的Size
link |
22:14.000
看看說怎樣的Patch的Size
link |
22:16.000
可以給你最好的結果
link |
22:18.000
這個東西叫做Patch Gap
link |
22:21.000
那其實同樣的技術
link |
22:22.000
不是只能用在影像上
link |
22:24.000
到目前為止我們講Gap的時候
link |
22:26.000
都是Apply在影像上
link |
22:27.000
其實同樣的技術
link |
22:28.000
也可以用在語音上
link |
22:30.000
舉例來說
link |
22:31.000
你可以用Gap這個技術
link |
22:33.000
來做Speech Enhancement
link |
22:35.000
什麼是Speech Enhancement呢
link |
22:37.000
Speech Enhancement意思是說
link |
22:38.000
你有一段聲音訊號
link |
22:40.000
可是它被雜訊干擾
link |
22:42.000
它加了很多背景的噪音
link |
22:44.000
你希望機器可以自動
link |
22:45.000
把背景噪音去掉
link |
22:47.000
那通常有兩個作用
link |
22:48.000
一個是把背景噪音去掉以後
link |
22:49.000
再丟到語音辨識系統裡面
link |
22:51.000
也許正確率會比較高
link |
22:53.000
另外一方面
link |
22:54.000
把背景噪音去掉以後
link |
22:55.000
再播給人聽
link |
22:56.000
也許人聽得比較清楚
link |
22:59.000
好那如果今天是一般的
link |
23:01.000
Speech Enhancement
link |
23:02.000
怎麼Train的呢
link |
23:03.000
你要找很多聲音
link |
23:05.000
然後把這些聲音呢
link |
23:07.000
也都加上一些雜訊
link |
23:09.000
好接下來呢
link |
23:10.000
你就Train一個Generator
link |
23:11.000
Input一段有雜訊的聲音
link |
23:13.000
希望Output呢
link |
23:14.000
就是沒有雜訊的聲音
link |
23:16.000
Input一段有雜訊的聲音
link |
23:17.000
把沒有雜訊的聲音
link |
23:18.000
當作你的目標
link |
23:20.000
去訓練你的Generator
link |
23:22.000
那一般因為
link |
23:23.000
像這個東西叫做
link |
23:25.000
這是一段聲音訊號
link |
23:26.000
但它是用這個
link |
23:27.000
Spectrum來表示它
link |
23:28.000
它看起來就像是
link |
23:29.000
一個Image一樣
link |
23:30.000
所以這個Generator呢
link |
23:31.000
常常也就會直接套用
link |
23:33.000
你在產生Image
link |
23:35.000
在做那個
link |
23:36.000
我們剛才說
link |
23:37.000
Complete Generation
link |
23:38.000
它會做在Image上嘛
link |
23:39.000
那其實那些Image上
link |
23:40.000
常用Neural架構
link |
23:41.000
其實也可以直接套用到
link |
23:42.000
Speech Enhancement上面
link |
23:44.000
也是沒有什麼問題的
link |
23:46.000
但是我剛才有講過說
link |
23:47.000
直接Train Generator
link |
23:48.000
你產生出來的結果
link |
23:49.000
就會比較模糊
link |
23:50.000
所以你要再加上Game的概念
link |
23:52.000
不只要直接Train Generator
link |
23:55.000
你還要Train一個Discriminator
link |
23:57.000
Discriminator的工作呢
link |
23:58.000
就是看Generator的Input加Output
link |
24:01.000
這個我們今天強調很多次了
link |
24:02.000
在Conditional Game裡面
link |
24:04.000
你不可以只看
link |
24:06.000
Generator的Output
link |
24:07.000
Discriminator要同時看
link |
24:09.000
Generator的Input跟Output
link |
24:12.000
然後給它一個分數
link |
24:13.000
這個分數決定說
link |
24:14.000
現在Output的這一段聲音訊號
link |
24:16.000
是不是Clean的
link |
24:17.000
同時Output跟Input
link |
24:18.000
是不是Match的
link |
24:20.000
你並不希望你本來說
link |
24:21.000
I love you
link |
24:22.000
然後通過Generator以後
link |
24:23.000
就變成I hate you這樣子
link |
24:25.000
那樣就不行
link |
24:26.000
所以你希望這個Output跟
link |
24:27.000
這個Input呢
link |
24:28.000
它們是Match在一起的
link |
24:30.000
那同樣的技術呢
link |
24:33.000
也可以做Video的Generation
link |
24:35.000
那怎麼做Video Generation呢
link |
24:37.000
就是給Generator看一段影片
link |
24:40.000
然後讓它預測接下來
link |
24:43.000
會發生什麼樣的事情
link |
24:45.000
讓它產生影片
link |
24:46.000
接下來發生的事情
link |
24:48.000
然後怎麼做到這件事情呢
link |
24:50.000
你就需要一個Discriminator
link |
24:51.000
那我們說Discriminator
link |
24:53.000
不能夠只看Generator的Output
link |
24:55.000
它要同時看
link |
24:56.000
Generator的Input跟Output
link |
24:58.000
所以就把Generator的Input跟Output
link |
25:00.000
接在一起
link |
25:01.000
變成一段完整的影片
link |
25:02.000
然後讓Discriminator去檢查說
link |
25:04.000
這段影片到底是不是一個合理的影片
link |
25:10.000
那這邊是一個
link |
25:11.000
我在網路上找到的
link |
25:12.000
有人用Game的技術呢
link |
25:15.000
去產生小精靈的遊戲畫面的結果
link |
25:19.000
那右邊呢
link |
25:20.000
是沒有用Game的技術的結果
link |
25:23.000
那沒有用Game的技術
link |
25:24.000
會發生什麼問題呢
link |
25:25.000
你會發現說
link |
25:26.000
小精靈走著走著
link |
25:27.000
走到轉角這邊
link |
25:28.000
它就分裂了
link |
25:29.000
它就分裂了
link |
25:30.000
為什麼會分裂呢
link |
25:32.000
因為TrainingData裡面同一個轉角
link |
25:34.000
有時候小精靈會往左走
link |
25:36.000
有時候會往右走
link |
25:37.000
往左走是對的
link |
25:39.000
往右走也是對的
link |
25:40.000
但是對一個沒有Game的Generator來說
link |
25:43.000
它學起來
link |
25:44.000
它就會把往左走和往右走
link |
25:46.000
全部平均起來
link |
25:47.000
結果就壞掉
link |
25:48.000
往左走是對的
link |
25:50.000
往右走也是對的
link |
25:51.000
同時往左走跟往右走
link |
25:53.000
結果就會壞掉
link |
25:55.000
那中間呢
link |
25:56.000
就是用Game的方法來做的啦
link |
25:59.000
你就發現說
link |
26:00.000
它就比較不會有分裂的情形
link |
26:01.000
但它結果也不是perfect
link |
26:02.000
你會發現
link |
26:03.000
有些小精靈走著走著
link |
26:05.000
就不見了
link |
26:06.000
這樣子
link |
26:08.000
這邊還有一個有趣的現象
link |
26:09.000
你會發現它那個數字會跳
link |
26:11.000
不過它這個數字是隨機的跳動
link |
26:13.000
就是了
link |
26:14.000
好,那這個就是Conditional Game