back to index
GAN Lecture 3 (2017): Improving Sequence Generation by GAN

link |
整理&字幕由Amara.org社区提供
link |
接下來這一堂課呢,剩下的時間我們要講
link |
怎麼用GAME來improve sequence generation
link |
那sequence generation
link |
就是讓機器產生一個sequence,它有非常多的應用
link |
如果你要做的是跟,你要讓機器產生一段文章
link |
這個你都需要用到sequence generation的技術
link |
那GAME現在也在文獻上看到最多的應用
link |
圖片不是一個sequence,它是拿來產生圖片
link |
比較少看到sequence generation的應用
link |
但是我相信sequence generation
link |
用GAME來做sequence generation
link |
未來會有很多的發展,特別來跟大家講一下
link |
怎麼用GAME的軟管跟GAME的技術用在sequence generation上面
link |
學過sequence-to-sequence model
link |
那我們都知道sequence-to-sequence model就是supervised train
link |
怎麼improve這個supervised train的sequence-to-sequence model
link |
我們會先講說用RL怎麼improve
link |
sequence-to-sequence的model
link |
接下來再講用GAME怎麼improve
link |
sequence-to-sequence的model,之所以要先講RL
link |
是因為用RL的技術跟用GAME的技術其實是
link |
非常像的,等下你會發現他們的formulation
link |
現在在用GAME來improve sequence-to-sequence
link |
model的時候,你不是人去給feedback,而是用
link |
另外一個model,用另外一個machine,也就是
link |
discriminator來給generator feedback
link |
unsupervised sequence-to-sequence model
link |
有了GAME的技術以後,我們如何可能做到
link |
unsupervised sequence-to-sequence learning
link |
最後會講test style transfer
link |
style transfer你在影像上已經看到
link |
大家已經看得都不稀奇了,你比較少看到的是
link |
sequence-to-sequence model,這個大家都已經很熟悉了
link |
在這邊再強調一下sequence-to-sequence model的
link |
先看看你的問題能不能封了一個sequence-to-sequence learning
link |
你有沒有data,如果沒有的話也放棄
link |
你input的sequence-length是大於10
link |
如果大於10的話就加attention,小於10就不用attention
link |
我們都會用champart來當作例子
link |
現在假如你要訓練一個champart的話
link |
常用的一個技術就是sequence-to-sequence learning
link |
你就去收集很多人類的對話,從電影的台詞
link |
電視劇的台詞裡面,收集很多人類的對話
link |
接下來就是訓練你的sequence-to-sequence model
link |
那sequence-to-sequence model的encoder
link |
有一個decoder或是有一個generator
link |
根據training data,B說完○○○以後
link |
A會說△,所以現在假設我input一個sequence
link |
generator的輸出就必須要是△
link |
你用generator的輸出跟△,越近越好
link |
那有人可能會覺得說,如果只考慮一個句子
link |
只有考慮現在輸入的句子,沒有考慮過去的teaching
link |
那當然可以把過去的teaching也加進來
link |
舉例來說training data裡面,我們知道說
link |
那你在訓練encoder decoder的時候
link |
你就教machine說,現在encoder的輸入是○○○
link |
encoder長什麼樣子,這也是一個很快的複習
link |
input的句子假如是我很好,比如說○○○
link |
會把我很好這個sequence用一個vector來描述它
link |
那假設你今天要考慮的不是一個input的句子
link |
那假設每一個句子,包括現在使用者輸入的句子
link |
還有現在你要缺乏考慮的context都已經被表示成一個vector
link |
那你可以用一個hierarchical的encoder
link |
它會把每一個小的encoder的輸出
link |
反正你就是把你的現在使用者輸入的句子
link |
然後把這個vector就丟給generator
link |
然後希望generator可以做decoding
link |
那generator怎麼產生這個句子呢
link |
你就把這個從encoder丟進來的這個information
link |
就會產生一個word distribution
link |
根據這個word distribution去做一個sample
link |
舉例來說,現在sample出來是要產生B
link |
那machine產生的句子第一個詞彙第一個word呢
link |
那把B再加一個context再丟進來
link |
然後再產生另外一個distribution
link |
然後根據這個distribution再做sample
link |
當然我們之前也有講過現在input的這個紅色的vector
link |
在每個timestamp都可以是不同的
link |
那實際上怎麼訓練這個generator呢
link |
到時候我們去說,看到這個紅色的input
link |
會希望跟A的one-hot vector
link |
那在第二個timestamp也希望跟B的one-hot vector越近越好
link |
在第三個timestamp也希望跟B的one-hot vector
link |
你會minimize每一個timestamp的cross entropy
link |
這一個one-hot vector跟machine output
link |
這個distribution他們之間的cross entropy
link |
那你會把整個sequence,這邊有三個timestamp
link |
C1,C2,C3的cross entropy
link |
統統加起來,那你要minimize cross entropy的總和
link |
好,那下一頁推片要跟大家講的事情是說
link |
這個minimize cross entropy
link |
likelihood,所以在我們現場常常有人會說
link |
看到有人寫說,我這個sequence to sequence model
link |
他訓練的criterion是maximum likelihood
link |
當他說他在maximum likelihood的時候,其實他就是
link |
minimize cross entropy
link |
你就記得說,有一個人說他在maximum likelihood的時候
link |
每一個time state的cross entropy的總和
link |
為什麼maximum likelihood就等於minimize cross entropy
link |
假設現在我們的training data,我們等一下就寫
link |
現在是check bar的input,那可能是
link |
其他各式各樣context的information
link |
來代表x hat這個sequence裡面的
link |
第七個word,x hat是一個sequence
link |
我們x這邊是一個sequence,x下標t代表
link |
x這個sequence裡面的第七個word
link |
那x1冒號t代表x這個sequence裡面的
link |
那這個都很直覺,應該大家一看就可以懂了
link |
cross entropy的總和,舉例來說在第七個time state
link |
我們知道第七個time state,他的word
link |
這個distribution跟x t hat
link |
他的one-hot encoding
link |
這個one-hot encoding也可以想成
link |
是一個distribution,只是在某一位的機率是1
link |
其他位的機率是0,然後generator output
link |
是一個distribution,那你會希望這兩個distribution
link |
他們的cross entropy越精越好
link |
那cross entropy長什麼樣子呢
link |
你可以回去自己查一下cross entropy的定義
link |
這個item跟這個distribution
link |
跟這個distribution的cross entropy
link |
-log p log x t hat
link |
去看你的正確答案,x t hat是哪一個word
link |
就是-log p zeta,現在第七個
link |
他是dependent,現在輸入的context h
link |
s 1到t-1,我們知道在train那個generator
link |
的時候,你每次都會把你output的word在下一個time state
link |
第七個時間點的輸出其實是dependent之前的
link |
你其實會做那個teacher forcing
link |
對不對,我們在訓練的時候,我們會把正確的答案
link |
丟給generator,現在大家都做作業
link |
應該都非常熟悉,在訓練的時候,我們其實會把正確的答案
link |
丟給generator,所以其實generator是根據
link |
正確的word,去決定第七個word的
link |
cross entropy,那我們要submission over
link |
每一個time state的cross entropy,然後去minimize它
link |
submission over每一個time state的cross entropy,什麼意思呢
link |
我們在前面這邊,加上一個submission
link |
over所有的time state,然後再把
link |
每一個time state的log的
link |
就對每一個time state的機率,通通把它乘起來
link |
given h的機率,乘上p of x2 hat
link |
given x1 hat h的機率,一直乘到
link |
p of x大D hat,而句子的末尾的
link |
最後一個word,given s1到大D
link |
減低h的機率,然後你把這些機率通通乘起來
link |
p of x hat,given它的content h
link |
given h,乘上x2 given
link |
就是given h,x hat出現的
link |
這個c,minimize每一個content的false entropy的總和
link |
這個正確的sequence x hat
link |
我們就是在maximize,given context h的時候
link |
正確的sequence x hat呢,它出現的
link |
讓你知道maximum likelihood跟minimize
link |
false entropy其實是同一件事情,那之前有一個同學
link |
是什麼我們就不要講,但是跨國的大家都知道的
link |
人家問他說,maximum likelihood
link |
跟minimize cross entropy有什麼不同
link |
那整個就很low這樣子,你就這樣暫定階梯
link |
他們就是一樣的東西,讓人家就知道你是真的懂的
link |
假設大家都會train sequence to sequence model,相信大家都會
link |
RL的技術來improve sequence to sequence
link |
那我們知道說在RL的技術裡面,在RL的scenario裡面
link |
那今天如果是一個chain bar的話,我們可以想像
link |
這個reward,這個RL的scenario的情境
link |
說how are you,然後機器就說bye bye
link |
好,今天在另外一個情境呢,人說hello
link |
然後機器說hi,然後人覺得不錯就給他三分
link |
可以得到一大堆的feedback,那這些feedback都是數值化的
link |
你這個回答得到負十分,你這個回答得到三分
link |
maximize他的expected reward
link |
那就是要maximize他的expected reward
link |
我們有一個encounter,一個generator
link |
input h,最終的output是x
link |
那這邊要注意的是,人看的不是只有chain bar的
link |
輸出,他不是只有看x,因為今天機器說
link |
bye bye,那他可能是好的也可能是不好的
link |
所以今天人在evaluate一個dialogue的好壞
link |
一個dialogue,一個這個句子的pair的好壞的時候
link |
那這個是不是就很像我們之前講的,在講conditional gain的時候
link |
discriminator不是只有看generator的
link |
輸出,他要同時看generator的
link |
人不是只看你的chain bar的輸出
link |
而是同時看你的這個sequence to sequence model
link |
sequence to sequence model裡面的參數
link |
當然他同時包含了encoder和generator
link |
我們把encoder和generator的參數合在一起
link |
用theta來表示他,那現在我們要做的事情就是
link |
從人這邊可以得到output r of hx
link |
調整這個sequence to sequence model的參數
link |
使得最後,根據人的這個evaluation
link |
輸出來的這個r of h這個value
link |
我們先把reward的期望值把它寫出來
link |
那given一個theta,reward的期望值
link |
假設我們可以寫出reward的期望值的式子的話
link |
接下來我們就可以把reward的期望值對theta做
link |
gradient,然後我們就可以用gradient descent
link |
或gradient add,因為我們現在要maximize的東西是gradient ascent
link |
我們就用gradient ascent的方法去調theta
link |
去maximize reward的期望值,所以第一件事最重要的就是
link |
那reward的期望值長什麼樣子呢?
link |
首先它是summation over
link |
這個h就是那個check bar的輸入嘛
link |
我們等一下雖然舉例都是用check bar,但是你在
link |
看這個問題的時候,你在學的時候,你不要想說
link |
它只能夠用在check bar上面,其實
link |
所有的sequence to sequence的model
link |
那其實在文獻上已經有人做了translation
link |
translation可以用sequence to sequence的model解嘛,所以等一下剛才講的技術
link |
已經有被用在translation上,不管是RL還是GAN都有人用過了
link |
那也有人用在summation上,summation也是
link |
sequence to sequence嘛,你也可以用這套RL,LDL
link |
GAN的技術,那還有caption generation
link |
大家不是都說caption generation,也是sequence to sequence
link |
那也有人用RL的技術來improve這個sequence to sequence
link |
的generation,所以雖然等一下我講的時候我都是用check bar
link |
做例子,但它不是只能夠用在check bar上面
link |
只要是你想得到的sequence to sequence的model
link |
比如說你在做作業2的時候,大家都抱怨說
link |
blue scope不是一個好的evaluation的方式
link |
它確實不是一個好的evaluation的方式,所以我們在作業評比
link |
的時候是human的evaluation是比較重要的
link |
那blue scope反正就過那個baseline就好
link |
不要求你做得比較高,做得比較高其實也不見得有什麼好
link |
那但是今天假設你要讓人真的覺得你的那個
link |
作業2的那個video caption generation的結果很好,怎麼辦
link |
caption generation的系統輸出評價,那就可以用
link |
summation over所有的輸入
link |
那每個輸入出現的機率是不一樣的,這要乘上
link |
p of h,代表輸入,這個h這個輸入它出現的機率
link |
有一個h以後,把這個h丟到generator裡面
link |
而丟到這個sequence to sequence model裡面
link |
根據sequence to sequence model的參數setup
link |
輸出x這件事情用一個機率來表示它,我們寫說
link |
p set up of x given h
link |
為什麼用一個機率來表示它呢?你想想看在generation的時候
link |
在做sequence to sequence model的時候
link |
generator的那個process是有output sample的
link |
同樣的h,每次的輸出通通都是不一樣的
link |
對不對?因為有一個sampling的process嘛
link |
那假設你說我在implement的時候其實不是sampling
link |
我是取argmax,那也行,我們就說
link |
好,那今天given一個h以後,我們會產生一個x
link |
有這個h跟這個x會得到多少reward
link |
summation over所有可能的x
link |
就是expected reward,這件事情呢
link |
你做了這個expected reward式子以後,你就可以用
link |
gradient of set去調你的setup,去找一個最好setup
link |
去maximize這個expected reward
link |
怎麼做呢?你可以把這個summation over h
link |
好,這個expectation呢,它是從
link |
p of h這個distribution裡面
link |
那你可以把這個summation over x換成一個expectation
link |
那這個expectation機率是什麼呢?
link |
好,那這個expectation是對out of hx
link |
或者是呢,如果我們把這兩個expectation合起來
link |
reward的期望值是什麼?我們知道reward就是out of hx
link |
你從p of h裡面去sample h
link |
你sample到h以後,再丟到p zeta of x given h
link |
這個function去sample出x
link |
然後你再把h跟x丟到out of hx這個function裡面
link |
given你的sequence to sequence的model參數zeta
link |
你要在實作上怎麼孵出這個reward期望值呢?
link |
然後看machine output的x1到x大n是什麼
link |
讓人去幫你evaluate,把evaluate的分數再做平均
link |
如果我們現在要maximize這個rbar
link |
我們要maximize這個reward expectation
link |
但是這個reward expectation的式子
link |
寫著寫著,這個式子裡面完全沒有出現theta
link |
前面都有theta,但theta寫著寫著
link |
其實theta藏在這個sampling的process裡面
link |
這個sampling的process表面上看起來沒有theta
link |
改變你的modeltheta,你輸出的x就會變了
link |
改變你的theta,你sample到的東西就會變
link |
你算出來的expected reward就會變
link |
所以theta還是在,它只是被藏到sampling的process裡面去
link |
這個R的期望值,reward的期望值
link |
只有ptheta是跟theta有關的
link |
只有ptheta是跟theta有關的
link |
所以我們就是只需要把這個歸零的三角形
link |
所以我想對大家來說,應該都不是太大的問題
link |
好,那接下來呢,接下來做一件什麼都沒有做
link |
等於e除以f of x,dx分之df of x
link |
這一項呢,就是ptheta分之gradient ptheta
link |
右上角這個式子,它就是gradient log ptheta
link |
expectation的規點寫成下面這個式子
link |
上面這個expectation的規點
link |
其實就是從ptheta裡面sample一個h
link |
ptheta xgiven h sample出一個x
link |
ptheta xgiven h的規點
link |
所以你要算gradient的時候怎麼做呢
link |
實作戰的做法就是,我們剛才說如果你要估這個
link |
expectation的proximation,就是sample n比data
link |
如果你要估測這個gradient的expectation
link |
怎麼做,你一樣去sample n比data
link |
對,那n比data你都去算它的reward
link |
那這個reward會weighted by
link |
我仔細想想,我覺得這個x跟h應該有上標i
link |
我們把n比data的reward都算出來
link |
每一餘reward都weighted by
link |
gradient log d theta x given h
link |
expected reward gradient的estimation
link |
你會算expected reward的歸點
link |
你就可以拿這個東西去更新你的參數theta
link |
就把theta0有歸點asset的方法
link |
那我告訴大家,直覺上我們做的事情是什麼呢
link |
是讓ptheta x given h的值越大越好
link |
會讓我們得到negative reward的x
link |
回去仔細check一下update的方向
link |
我們來比較一下maximum likelihood
link |
跟reinforcement learning之間的差別
link |
reinforcement learning實際上在做的事情到底是怎樣
link |
我們先來看一下maximum likelihood
link |
如果你用maximum likelihood來訓練你的checkbox
link |
來訓練你的sequence,不一定是checkbox
link |
他可以任何sequence to sequence的model
link |
假設你用maximum likelihood來訓練你的sequence to sequence的model的話
link |
那你的training data長什麼樣
link |
你就收集大NB training data
link |
有h1 x1 hat到hn xn hat
link |
那在算這個maximum likelihood的時候
link |
你的objective function長什麼樣子呢
link |
也就是submission over所有的training data
link |
然後對每一筆training data
link |
你都去計算他的log likelihood
link |
t log xi hat even hi
link |
你用maximum likelihood把他們通通都加起來
link |
這就是你的objective function
link |
這是要去maximize,你要maximize你的likelihood
link |
那怎麼maximumize likelihood呢
link |
你要用gradient ascent,要計算一下gradient
link |
那計算gradient很簡單,就把log p set到前面
link |
加上一個三角形,你得到的就是你的gradient了
link |
那這個是maximum likelihood
link |
那接下來我把maximum likelihood跟reinforcement learning
link |
做一下比較,讓我們看一下他們有什麼樣的差異
link |
我們看一下這個reinforcement learning
link |
那在reinforcement learning的部分呢
link |
在reinforcement learning的部分
link |
剛才reinforcement learning有告訴你說要估測
link |
reinforcement learning的gradient
link |
在剛剛那個case我們要估測gradient,我們要做的事情呢
link |
只是我們現在的n比training data
link |
並不是正確的n比training data
link |
我們去做sample,我們讓機器跟人互動大n次
link |
我們去做sample,我們讓機器跟人互動大n次
link |
這大n比data就是大n比sample data
link |
那我們把這大n比sample data
link |
那這gradient看起來像什麼樣子呢,我們說那大n比data
link |
然後乘上gradient log ptheta
link |
x1p分h1,那這邊就把x1h1寫上去
link |
你會發現說如果你比到這兩個式子的差別的話
link |
那如果我們要從這個gradient去反推
link |
objective function長什麼樣子,什麼樣的objective function
link |
會得到這個gradient呢,這個objective function長的是
link |
reinforcement learning的方法來optimize
link |
你的sequence to sequence model,實際上你的
link |
objective function就是submission over r log hx
link |
他們就是直接加起來,那在右邊所有的xi
link |
weight out of hi xi
link |
maximum likelihood的差別的話,唯一的差別
link |
就是今天在maximum likelihood裡面
link |
你有n筆data,這n筆data因為都是人給的
link |
所以你相信每一筆都是正確的,你可以想像說
link |
每一筆training data它的分數
link |
但是在reinforcement learning裡面
link |
你sample到大n筆data,有些h跟x的pair
link |
你會得到positive的reward,有些h跟x的pair
link |
你會得到negative的reward,每個h跟x的pair
link |
你會得到的reward都是不一樣的,每一個h跟x的pair
link |
gradient跟算objective function的時候
link |
你就會在你的gradient跟objective function前面
link |
如果從這個objective function來看的話
link |
你就會發現說,在maximum likelihood裡面
link |
你就會希望所有x跟h的likelihood
link |
但是如果我們看右邊這個reinforcement learning
link |
objective function,你就會發現說
link |
實際上當你在apply reinforcement learning的時候,我們要做的事情是
link |
假如有一個h跟x的pair,他們的reward是正的
link |
我們就要maximize他的likelihood
link |
但假設反過來說,有一個h跟x的pair
link |
他們的reward是負的,我們要做的事情
link |
就是要minimize這個likelihood
link |
那今天假設有一個pair,他的reward比較大,比較正
link |
就會對整個objective function的影響最大
link |
他們的reward越positive
link |
最終objective function的值
link |
這個是比較maximum likelihood跟reinforcement learning的做法
link |
你的sequence-to-sequence的model
link |
那整個流程是這樣,假設你有一個sequence-to-sequence的model
link |
那不一定要是一個缺霸,他也可以是任何其他的sequence-to-sequence的model
link |
Rbar的Gradient,那我們剛才告訴你說
link |
Rbar的Gradient就是長這個樣子
link |
那有了這個Rbar的Gradient以後
link |
就可以得到新的sequence-to-sequence的參數
link |
就是自己算Gradient好像有點麻煩
link |
因為我們一般譬如說在TensorFlow裡面
link |
或者是其他的deep learning的framework裡面
link |
你通常是定義出你的objective function
link |
然後直接apply一個函式就可以幫你把Gradient算出來
link |
那你自己算Gradient對你來說可能是有點痛苦的
link |
那如果你今天用的是framework
link |
你要怎麼define你的objective function呢
link |
你就是定義出這個objective function
link |
然後你就可以計算出你的Gradient
link |
那這個objective function是什麼樣子呢
link |
這個objective function是對你在reinforcement learning的過程中
link |
在跟人互動的過程中,收集得到的這n-data的
link |
你先計算這n-data的log-likelihood
link |
再把這n-data的log-likelihood
link |
weighted by他們的reward
link |
然後你就寫出這個objective function
link |
那你就可以去update你的sequence-to-sequence model
link |
好那你update完你的sequence-to-sequence model以後呢
link |
再重新跑這個setting的發生,為什麼
link |
這個跟做一般的supervised learning不一樣
link |
一般supervised learning裡面,你collect到n-data
link |
以後,你就可以一直去算Gradient,一直去update
link |
你不會需要你收集到n-dataupdate參數以後
link |
需要另外收集n-data再update參數,你不是這麼做的
link |
但是在reinforcement learning裡面
link |
就再重新去sample n-data
link |
因為我們之前有講過說,這個sampling的process
link |
其實是depend on你的sequence-to-sequence model的參數的
link |
所以你之前sampled到的東西就不適用了
link |
你的參數變了,所以你sampled到的東西就不適用了
link |
那你的參數變了,你應該要得到新的sample
link |
所以你今天有了新的參數,你會再重新去做sample
link |
得到新的training data,然後再去調你的objective function
link |
你每次update完參數以後,你都要重新去收集data
link |
用interaction的方法收集data,然後呢
link |
所以你可以想像說每一次update參數的時候
link |
你都要先收集data,所以每一次update參數都非常的珍貴
link |
supervised learning裡面,你可能learning rate就隨便設一個
link |
反正你learning rate如果設太大,走太遠
link |
之後再走回來就好了,那在Io裡面你就會發現說
link |
有很多的技術,比如說trust region的技術
link |
比如說PBO的技術,他們本質上想要解的問題就是
link |
希望在這個update參數的state
link |
給他一個比較好的learning rate
link |
因為每一次update參數的時候都非常的珍貴
link |
透過了n次interaction收到了n比dataupdate一次參數
link |
結果update那一次的參數結果,比如說learning rate設太大
link |
所以trust region這種做法,雖然他在算learning rate的時候
link |
你會有很大的effort,要花很大的力量
link |
才能夠把今天參數update的方向計算出來
link |
去找一個比較好的learning rate,其實是比
link |
有一大堆的方法,是試著在右邊這個update參數的時候
link |
試圖讓參數的update的process
link |
所以今天你這個seedai,這個sequence to sequence model
link |
應該是從random開始學,通常從random開始學
link |
應該是學不起來的,所以比較常見的做法是
link |
你先用maximum likelihood的方法,先train一個比較好的model
link |
seedai,你有一個比較好的modelseedai
link |
人去做interaction,去收集data,這樣Io的方法
link |
就好了,Io的方法有點難,learning from scratch
link |
需要通常是拿來微調maximum likelihood
link |
不知道什麼是AMP的baseline的同學舉手一下
link |
我以為大家知道,大家不知道我們就講一下
link |
好,那這個AMP的baseline是什麼意思呢
link |
這個意思是這樣,我們在做這個Io的時候
link |
我們剛才告訴你說objective function
link |
那gradient的式子就長這個樣子
link |
那objective function就只是把這個三角形
link |
你不覺得這個事,你有發現,好,那我新鮮發現了
link |
希望這筆H跟X的pair,他們的分數呢
link |
越大越好,只要是正的他都會希望他的分數增加
link |
因為你想要做的事情是讓每一個不同的H跟X的pair
link |
所以如果增加多的,他就會實際上有增加
link |
如果給全班同學都加分,那加分少的人呢
link |
會讓machine在learning的時候
link |
但是今天如果有人的reward是比較大的
link |
那machine就會傾向於先讓reward大的那些人上升
link |
但是在實際上呢,實際上如果你的reward都是正的
link |
這樣子在training的時候是會有問題的
link |
因為假設你在training的時候你是sample
link |
你是sample一些data再來做training
link |
你只是sample一些data再來做training
link |
那假設你現在只sample到X2,X3
link |
他們的reward都是正的,所以在training的時候
link |
那沒有被sample到,其他人的分數都是上升的
link |
他到底是好的還是不好的,我們其實是不知道的
link |
在實作上,假設你的reward都是正的
link |
那你會把你的reward減掉一個baseline
link |
會導致說你現在得到一個新的reward
link |
那如果你的reward有時候是正的,有時候是負的
link |
那被sample到的人,如果他本來的reward
link |
那假設另外一個case,他的reward是大的
link |
減掉B以後,他仍然是正的,那他的reward就要上升
link |
實作上我們要怎麼得到這個baseline B呢
link |
可以幫助我們得到這個baseline B
link |
那通常都是用一個比較eurasian的方法
link |
來train一個sequence to sequence model
link |
就要讓你的model去跟使用者互動N次
link |
又要再互動N次才能再update參數
link |
是alpha go style的train
link |
怎麼用alpha go的方法來train兩個agent呢
link |
來train這個train bar呢
link |
就train兩個train bar讓他們互聊
link |
一個train bar說how old are you
link |
然後另外一個bar就說CU就陷入無窮迴圈
link |
那今天這個sequence to sequence的model
link |
舉例來說,藍色的bar還是說how old are you
link |
然後藍色的bar就回答說I'm so you were too
link |
那紅色的bar就說1 and 2, 3 so
link |
但是我們說在reinforcement learning裡面
link |
我們還要去evaluate說這個h跟x的pair
link |
他們有多好,這個r of hs有多好
link |
r of h of x的function
link |
然後用這個r of h of x的function去evaluate說
link |
看到一個how old are you如果回答see you的話有多好
link |
看到how old are you如果回答I'm 60的話有多好
link |
因為你可以想像說人的對話是非常的複雜的
link |
人自己很難去定出一個很好的evaluation function
link |
第一個function,這個function裡面有三個component
link |
這三個component分別要evaluate
link |
現在的x他的information flow對不對
link |
現在的x他的semantic coherence對不對
link |
那今天information flow是希望Chema
link |
有人說今天天氣很好,Chema就回答說今天天氣很好
link |
不是你要的,希望Chema講一些不一樣的東西
link |
第三個是希望Chema不要前言不對後語
link |
我上週去ASRU餐廳的一個keynote speech
link |
那keynote speaker就要跟我們說
link |
這個demo是如何讓機器人在完全聽不懂人說話的情況下
link |
但是那兩個機器人都沒有語音辨識的功能
link |
接下來機器人A就回過頭來對旁邊的另一個人說
link |
那你喜歡吃什麼呢,旁邊的人就說我喜歡吃天婦羅
link |
機器人A就換個機器人B說你是什麼星座
link |
有了這些以後呢,機器人對話就可以讓他更加的自然
link |
舉例來說,在沒有用剛才的report from late的技術的時候
link |
爸的A說Where are you going
link |
爸的B就說I'm going to the restaurant
link |
爸的A就說See you later,B就說See you later
link |
A再說See you later,B再說See you later,就陷入無窮迴圈
link |
好像說不可以說See you later
link |
因為說See you later就是對話就結束了
link |
不可以回答See you later,回答See you later就得到negative reward
link |
所以加上這一項的話呢,你就可以讓爸的講得更好
link |
舉例來說,爸的A說Where are you going
link |
B就說I'm going to the police station,A說I'm coming with you
link |
B就說No no no, you're not going to anywhere,A說Why
link |
B就說I need you to stay here
link |
所以還是壞掉了,但是至少講了比較多句話才壞掉
link |
所以還是壞掉了,但是至少講了比較多句話才壞掉
link |
怎麼用Gan來improve sequence-to-sequence model呢
link |
我們有一個Chepa,他其實就是我們的
link |
conditional generator,他input
link |
history或者是使用者現在輸入的sentence
link |
當作condition,那他的輸出呢
link |
sentence的,他的輸出就是這個Chepa的
link |
response,那我們有一個discriminator
link |
這個discriminator,因為現在這是一個conditional generator
link |
所以這個discriminator他的工作是什麼呢
link |
他的工作就是要看這個爸他的input跟output
link |
如果把他看作一個pair,他有多像是
link |
你要收集一大堆human的dialogue
link |
收集一大堆human的dialogue,那這個discriminator
link |
那Chepa的工作就是,他希望他產生response
link |
丟進discriminator,discriminator覺得說
link |
假設你現在有一些training data,在training data裡面
link |
那正確的response,我們寫作X
link |
你要做什麼事情呢,你有一個generator
link |
你有一個discriminator,那你要從你的
link |
training data裡面去sample一個real
link |
的history H,和一個sentence X
link |
sample出來以後,那你丟給你的button
link |
一個history H',然後你的button
link |
就是你的Chepa,連一個generator
link |
接下來discriminator要做的事情就是,他要給
link |
好,那這個是discriminator的部分
link |
對不對,就是正確的東西discriminator給他高分
link |
錯誤的東西discriminator給他低分
link |
下一步,我們就是要train generator
link |
那怎麼train generator呢,在概念上
link |
我們要做的事情是,我們有一個discriminator
link |
這個generator,也就是那個Chepa,我們就要調整
link |
那這邊其實這個H呢,也要丟給這個discriminator
link |
這邊畫得不太精確,我們要把這個Chepa的
link |
輸入和輸出丟給discriminator,以後這個discriminator
link |
地方的,那如果今天我們沒有要深入討論
link |
sequence generation的問題,其實就可以停在這邊
link |
就告訴說,反正就是調這個Chepa的參數
link |
然後希望調這個Chepa的參數,使得
link |
discriminator的輸出呢,越大越好
link |
但是仔細想想看,這整個process
link |
generator,我們知道說現在要產生
link |
sampling process,實際上R1在每一個time
link |
在給我們的,是一個probability的distribution
link |
但是我們必須要從這個probability的distribution
link |
裡面做sample,才能夠得到一個sentence
link |
這個encoder應該是discriminator
link |
discriminator,我們把這個generator的output
link |
discriminator決定說,這個句子
link |
那我們知道說,在triggering again的時候
link |
我們為了要讓discriminator的output越大越好
link |
那我們做法就是用fabrication的方法
link |
一路把error signal從discriminator的
link |
output傳給generator,generator調整
link |
他的參數,讓discriminator的output越大越好
link |
但今天在這個case裡面,我們有辦法這麼做嗎
link |
我們根本就沒有辦法做backpropagation
link |
為什麼我們沒有辦法做backpropagation呢
link |
一個簡單的回答就是,在整個network裡面
link |
有一個sampling的process
link |
有這個sampling的process,你就沒有辦法微分
link |
你就沒有辦法做backpropagation
link |
為什麼有sampling的process,沒有辦法微分呢
link |
network裡面某一個參數如果有小小的變化
link |
但今天假如你的network裡面有一個sampling的機制
link |
你的output根本就不會有對應的變化
link |
sequence-to-sequence model稍微參數修改一下
link |
當然它output這個distribution就變了
link |
那output distribution有所改變
link |
你在做sample的時候,也許還是sample到一樣的東西
link |
有時候你的參數根本沒有變,但是因為sample的關係
link |
本來我們今天在train這個game的時候
link |
我們會希望把generator跟discriminator
link |
然後去調generator參數去maximizediscriminator的output
link |
the model當作一個generator跟discriminator串起來的時候
link |
因為中間有一個sample的process
link |
去調generator,調sequence-to-sequence model參數
link |
去maximizediscriminator的output
link |
就把這個sample的process
link |
直接拿掉,我們不要給discriminator
link |
而是直接把sequence-to-sequence model
link |
output的distribution丟給generator
link |
我們讓generator看這個sequence-to-sequence model
link |
output的distribution
link |
對discriminator來說正確的答案
link |
是一個word sequence,每一個word都是用one part encoding
link |
來標示它的,而generator的結果
link |
它是distribution,它本質上就是
link |
不一樣的東西啊,所以對discriminator來說
link |
這generator generate出來的東西跟正確的東西
link |
所以discriminator就不會學到說
link |
怎麼判斷一個東西是不是generate出來的
link |
我check它是不是一個distribution
link |
如果它是一個distribution,它就是generate出來的
link |
如果它是one part encoding,只有某一位是1
link |
所以這個discriminator就不會學到說
link |
用是不是一個distribution來決定
link |
是不是一個好的句子,是不是一個real的
link |
real的output,是不是一個real的example
link |
跟one part encoding越接近越好
link |
你會發現說,本來generator的output是一個distribution
link |
最後錯都沒有關係,把那個word的機率
link |
但是它產生出來的output是不make sense的
link |
但沒有關係,滿discriminator也不在意
link |
他只在意說你現在的output看起來像不像
link |
是一個one part的vector
link |
因為最後generator學到的就只有說
link |
output這個distribution要越尖銳越好
link |
sequence gate這個解法上
link |
sequence gate這個解法呢,跟reinforcement learning
link |
是非常有關係的,那我們前面特別講reinforcement learning
link |
來接這個sequence gate這個技術
link |
那還有其他方法,譬如說Gambello softmax還有
link |
playgame,因為時間的關係呢,我們就不細講
link |
那Gambello softmax的部分
link |
這Gambello softmax是怎麼做的呢?
link |
一般的network是像network A這個樣子
link |
就是x of set啊,然後再把x丟到
link |
f裡面得到f of x,才可以一路做application
link |
有一個sampling的process,那就知道了
link |
你本來有一個input set啊,然後這個set啊呢
link |
給你一個distribution,舉例來說,你今天input set啊以後
link |
他給你一個高懸的mean跟variant
link |
然後叫你,這個network要做的事情是根據這個高懸的
link |
mean跟variant做一個sample,然後得到x
link |
這個x是sample後的結果,把這個sample後的
link |
那你就會發現說,你在這個process裡面
link |
你是沒有辦法做application
link |
那Gambello softmax呢是,他發明了一個
link |
方法可以把這個sampling的process
link |
把sample process在network中間,就是做application
link |
的時候你走不過這個sampling的process
link |
但是如果是Gambello softmax的話,他把這個sampling的process
link |
然後再加上G,G是一個sample的process
link |
再加上這個sample的process呢
link |
然後得到你的output,在做backup application的時候
link |
走進來,那其實在train VNE的時候
link |
那這個地方呢,Gambello softmax的部分
link |
其實大家就自己看一下文獻,我們就不細講
link |
那今天要細講的部分呢,是sequence gap
link |
其實就是用reinforcement learning的方法
link |
我們剛才說,我們有一個discriminator
link |
我們希望調整這個generator的參數
link |
讓discriminator output的值呢
link |
我們把這個discriminator啊
link |
我們剛才在講reinforcement learning的時候
link |
我們說generator output一個結果
link |
那我們會把他output的結果丟給Human
link |
然後Human吐出一個reward,吐出一個分數來
link |
代表說,現在chepa的output是好還是不好
link |
那今天我們有一個discriminator
link |
這個discriminator也會吐出一個分數
link |
你就把那個discriminator想成是一個人
link |
你把他output一個response
link |
那這個discriminator去看這個response
link |
他到底根據這個response應該給多少分數
link |
就是希望這個discriminator output的分數越大越好
link |
其實就是reinforcement learning裡面的Human
link |
而discriminator output的這個值就是reward
link |
我們要怎麼調這個sequence-to-sequence model參數
link |
所以今天我們要調這個sequence-to-sequence model參數
link |
去maximizediscriminator output
link |
我們本來說如果今天有一個Human reward的話
link |
我們的gradient的式子呢,長成是這個樣子
link |
和probability的這個gradient weighted by reward
link |
現在在reinforcement learning裡面
link |
被discriminator的分數所取代
link |
所以我們唯一需要做的改變只有把人的rewardR
link |
換成discriminator的outputD
link |
discriminator就是吃一個h跟一個x
link |
其他training的方法就跟reinforcement learning
link |
你要用game的方法來train這個sequence-to-sequence model的話
link |
而是跟discriminator去做互動
link |
discriminator會給每一個example一個分數
link |
這個分數不是人給的,不是reward給的
link |
discriminator的分數,d of h1x1到d of hnx2
link |
有了這些sample到的data以後
link |
你要update你的sequence-to-sequence model
link |
參數,要update你的參數setR
link |
唯一跟剛才reinforcement learning不同的地方
link |
只有我們把R那個function換成
link |
discriminator的分數,d這個function
link |
本來會把low probability weighted by reward
link |
reward如果是正的,我們就希望那一筆example
link |
出現的機率越大越好,reward是負的
link |
那筆example出現的機率越小越好
link |
現在變成說,如果discriminator給這筆example的評價是正的
link |
如果是負的,我們就希望他的值越小越好
link |
那跟剛才講reinforcement learning的時候
link |
reinforcement learning的時候,在實作上
link |
你很難有人一直去給machine feedback
link |
然後根據這些規則,給你sample到的example評價
link |
但那些規則通常沒有辦法訂真正非常複雜的規則
link |
但是當你引入discriminator的時候
link |
現在你是用discriminator來給予評價
link |
而discriminator他本身是一個network
link |
當然他network架構長什麼樣子是可以自己設計的
link |
但discriminator他本身是一個network
link |
他可以用自己的方式去給予比較複雜的評價
link |
那當然我們也需要去訓練這個discriminator
link |
怎麼訓練這個discriminator呢
link |
我們說在訓練discriminator的時候
link |
我們就是要給他real的data跟generated data
link |
那real的data很容易收集,你就去收集很多人的對話
link |
當作real data,你就可以給discriminator看
link |
那fake的data呢,你就把你check好的這個check bar拿來
link |
告訴discriminator說這些是fake的
link |
那就可以學一個discriminator
link |
那你學了discriminator以後,discriminator變了
link |
所以這整個process呢,本來在reinforcement learning裡面
link |
你只有上半部,就sample data,update參數
link |
再sample data,再update參數
link |
但是在用game的方法train的時候,他更麻煩
link |
這一個reinforcement learning的process
link |
是包在一個更大的iteration裡面
link |
把generatortrain好,然後去train
link |
discriminator,把discriminatortrain好
link |
然後再train generator,我想這個大家都知道
link |
game的process就是這樣,但是每次在train這個
link |
他又都是一個reinforcement learning的process
link |
就每次你要train這個generator的時候
link |
你要再執行一次reinforcement learning的process
link |
把這個generatortrain出來
link |
你再traindiscriminator,遊戲的discriminator
link |
你再跑reinforcement learning的process去把generator找出來
link |
他就是大的iteration裡面,又有小的iteration
link |
前一陣子我同學試著做了一下sequence gate
link |
也不特別挑好的就是了,對不對,跟他說
link |
用maximum likelihood的sequence to sequence model的話
link |
這邊就是用不同code的train,回答都是I love you
link |
如果你今天用sequence gate的話
link |
他的回答是I love you too
link |
你才能知道說到底是比較好還是比較不好
link |
Do you like machine learning?
link |
原本maximum likelihood的方法會回答I'm sorry
link |
一般的maximum likelihood非常容易回答I'm sorry
link |
那我不知道在這邊回答I'm sorry是什麼意思,也許就是不喜歡machine learning的意思
link |
但是sequence gate的回答是I'm not going to see you
link |
你請問他喜不喜歡machine learning,他就猜一個不要見你
link |
I thought I have met you before
link |
maximum likelihood再回答I'm sorry,非常抱歉
link |
sequence gate的回答You are not going to be a good man,不知道什麼意思
link |
如果是let's go to the party
link |
maximum likelihood又回答I'm sorry,不想去的意思
link |
sequence gate的回答是let's go,他是想去的
link |
How do you feel about the president?
link |
maximum likelihood又再回答I'm sorry
link |
sequence gate的回答I'm not sure
link |
我們又請人來做human evaluation
link |
看起來sequence gate還是有比較好一些的
link |
看起來sequence gate還是有比較好一些的
link |
大家都不知道你在勸這些model的時候
link |
我們來講一下說今天在這整個process裡面
link |
你輸入了what is your name
link |
現在machine的輸出是I don't know
link |
假設你的discriminator夠厲害的話
link |
既然它得到低分,machine會做的事情
link |
就是要minimize這個h跟x的pair
link |
它會希望p set of x given h
link |
p set of x given h這個機率
link |
所以log p set of x given h
link |
加上log p x2 given h x1
link |
加上log p x3 given h x1
link |
讓它變小,那實際上我們做的事情是什麼
link |
特別prefer說哪一項應該變小比較多
link |
因為三項機率就是直接把它log相加起來
link |
一樣好的,那麼Standard的時候Model並不會
link |
特別prefer要把哪一項的機率變得特別小
link |
今天你輸入what is your name
link |
雖然機器回答I don't know是一個錯的結果
link |
但是把I當作整個sequence的第一個word
link |
output i這個word機率壓低
link |
說你今天如果輸入what is your name
link |
你不可以用i做title,這樣反而不是一件好的事情
link |
機率也是低的,回答I'm Michael機率也是低的
link |
我們希望說假設今天我們去sample到
link |
RL的process裡面sample的data是夠多的
link |
所以除了sample到what is your name
link |
回答是I don't know以外,也sample到what is your name
link |
回答是I'm Joe,而這個h跟x的pair
link |
它是正的,所以我們會想要把它的機率提升
link |
我們會想要把它裡面的每一個component機率提升
link |
所以我們有了這筆sample data以後
link |
這筆sample data告訴我們說
link |
看到input h,看到what is your name
link |
你把i當作這個word是好的,是應該把分數增加的
link |
然後我們就可以抵消,我們就其實不會把
link |
因為把i放在巨首,它是一個中性的事情
link |
它可以得到一個好的句子,也可以得到一個壞的句子
link |
只是因為sample到某一個壞的句子
link |
如果今天sample到的data夠多,不會有這個問題
link |
因為i放在巨首這件事可好可壞,所以它會被抵消掉
link |
在實作上,你每次能夠sample到的data
link |
你可能就只sample到i don't know,沒sample到i'm sure
link |
那我們現在學的時候就只知道說,i放在巨首是差的
link |
之後你的學習的process就會變得很奇怪
link |
所以我們希望說,有沒有辦法讓Machine學到
link |
Machine能不能夠知道說,given hi
link |
第一個word是i的時候,也許它是可以
link |
可以給它是好的,或至少不應該讓它的分數下降
link |
你只要壓低given i產生don't的機率
link |
跟given i don't產生don't的機率
link |
剛才gradient的formulation
link |
本來gradient的formulation是把don't的probability
link |
乘上discriminator的分數
link |
那這個discriminator的分數是一個sentence level的分數
link |
所以一個sentence裡面的每一個component
link |
你sentence裡面的每一個component,通通都給它不同的分數
link |
是submission over所有的training data
link |
現在變成不只submission over所有的training data
link |
也submission over所有的timestamp
link |
x t,given h,x 1到t-1
link |
這個Q要evaluate說,如果今天輸入是h
link |
當我們只輸出產生一部份的時候,這件事情到底有多好?
link |
所以今天假設愛其實是好的,或至少是不差的,那我們就不要讓他的分數下降。
link |
我們只壓低愛後面接動的機率,愛動後面接NO的機率。
link |
第一個方法是蒙地哈諾的方法,阿發GO裡面也有這個方法。
link |
這年頭只要跟阿發GO扯上關係,就是潮,就是人工智慧。
link |
第二個方法是叫做discriminator,就是去evaluate partial sequence。
link |
我們要怎麼去衡量given一個HI只產生愛這個word的時候,他到底有多好呢?
link |
這個sentence還沒有產生完,只產生部份的時候,他到底有多好呢?
link |
這邊用的方法就是你需要一個rollout的generator,去說現在如果產生愛以後,接下來會產生什麼word?
link |
去sample很多次,用你的generator去產生很多你愛開頭到後面不同word的sequence。
link |
舉例來說,用愛開頭可以是I'm Joe,可以是I'm Happy,可以是I don't know,可以是I'm Superman。
link |
然後你再用你原來的discriminator,你的discriminator只能evaluate一整個。
link |
你認出來的discriminator只能evaluate完整的x,他只能evaluate完整的response。
link |
你給他這種partial的response,他就可以說是錯的,因為他不知道說完整的response。
link |
他在學的時候,他只有學過說完整的response是好。
link |
如果你給他這種partial的response,他就會告訴你說是錯的。
link |
所以我們要怎麼evaluate一個partial的response是不是好的呢?
link |
我們把這個partial的response做rollout,把他後面可以接的各種可能sample出一把。
link |
比如說愛後面可以接I'm Joe,愛後面可以接I'm Happy,愛後面可以接I don't know,愛後面可以接I'm Superman。
link |
那每一個完整的結果你都可以去做evaluate。
link |
舉例來說,SA就給他1分,因為他回答I'm Joe是對的。
link |
回答I'm Happy是不對的,給他0.1分,回答I don't know給他0.1分,回答I'm Superman給他1分,其實SA是對的,所以給他0.8分。
link |
再把各個sample的結果,把這些sample到的結果,通通都平均起來,得到一個分數。
link |
那這個就是這個partial sequence會得到的分數。
link |
那當然這個multicolor search的方法最大的一個問題就是,你需要做額外的sample。
link |
你每次sample到一個I的時候,你要去把它做rollout,把後面的結果都sample出來。
link |
假設這邊你只要sample5個就好了,那你的預算量也是原來的model的5倍。
link |
所以這個方法呢,它的壞處就是它會需要增加額外的預算量。
link |
好,另外一個方法呢,是去改我們的discriminator。
link |
你發現在剛才的那個multicolor search的方法裡面,discriminator是training process是不動的。
link |
那我們可以去更動discriminator training process。
link |
我們要教discriminator怎麼去evaluate一個partial sequence。
link |
那怎麼教discriminator怎麼去evaluate a partial sequence呢?
link |
本來的discriminator的論法是告訴它說,input y is your name跟I'm Joe是對的,給它高分。
link |
input y is your name,回答I don't know是錯的,給它低分。
link |
但是我們要訓練一個新的discriminator。
link |
這個新的discriminator,當你學的時候,我們告訴它說,input y is your name,你回答I'm Joe是高分。
link |
input y is your name,你回答I am也是高分,你只是還沒有講完而已。
link |
那如果input y is your name,回答I也是高分。
link |
那如果input y is your name,回答I don't know是低分。
link |
input y is your name,回答I don't是低分。
link |
input y is your name,回答I也是低分。
link |
那I有時候是高分,有時候是低分,那它們就可以抵消掉,它可能就不是特別高分,也不是特別低分。
link |
那你就可以另外一個discriminator,這個discriminator輸出呢,就是我們剛才要找的那個function q,它可以evaluate partial sequence。
link |
好,那還有另外一個方法叫做writegame,那我們就把文獻列在這邊給大家參考。
link |
那剛才的技術不是只能夠用在java上,它可以用在各種不同的location,我在這邊列一些reference給大家參考。
link |
那我們在這邊就休息五分鐘就好,那等一下馬上就回來。
link |
剛才講的呢,都是supervised sequence-to-sequence learning,這個是大家比較熟悉的,作業2有做過了,接下來我們要講unsupervised sequence-to-sequence learning。
link |
好,這邊我第一個要舉的例子呢,是用unsupervised sequence-to-sequence learning的技術呢,來做summarization。
link |
那summarization我想這個task大家應該都很熟悉,就不需要跟大家做太多的解釋,反正就是給machine呢,看一篇文章,可能是上課的錄音,可能是新聞,然後machine用自己的話寫出一個簡短的摘要。
link |
那要怎麼訓練這種做摘要的model呢?那你就需要一個sequence-to-sequence的model,那你的輸入,假設你的輸入是語音的話,你可以先用語音辨識把它轉成文字,如果輸入是文字,那如果你的文章是文字的,那就直接把word sequence丟到sequence-to-sequence model裡面。
link |
那sequence-to-sequence model用encoder呢,去理解這個文章以後呢,把encoder的輸出丟給decoder。那今天一般的這種做summarization的sequence-to-sequence的model,它的training必須要是supervised,你必須要告訴machine說,看到這篇document,你要輸出什麼樣的summary。
link |
那你收集的data要夠多,你才能夠得到合理的結果。那舉例來說,你通常要百萬篇以上的文章跟它對應的summary,你才能夠train這種sequence-to-sequence的summarization的model。
link |
那要收集上百萬篇的training data其實是非常困難的,在某些test等可以做到,在很多test也不能夠做到。舉例來說,在新聞裡面,我們通常可以把新聞的title直接就當成是summary。那每一篇新聞本身就有title,你要收集三百萬篇新聞也不是問題,那你就可以用大量的data來train這個sequence-to-sequence的model。
link |
那在其他的application,比如說你想要摘要上課的錄音,或者是你要摘要NBA,這樣可能就比較困難一點。所以我們希望可以有unsupervised的attractive的summarization。
link |
怎麼樣做到unsupervised的summarization呢?那這邊構想是,我們先run一個sequence-to-sequence的model,這個sequence-to-sequence的model它用的是一篇文章,它的output就是短的句子,那希望它的output可以被當作summary的結果來使用。
link |
然後再run另外一個sequence-to-sequence的model,這第二個sequence-to-sequence的model,它是吃短的句子輸出原來的文章。那今天在training的時候,我們希望run這個概念就跟autoencoder是一模一樣的。
link |
就input一個文章,把它縮短,然後希望可以從這個縮短的version變回原來長的文章。在訓練的時候,你就是minimize輸入跟輸出的reconstruction的error,你希望輸入跟輸出越接近越好。
link |
那如果今天中間的這個短文,它可以reconstruct原來的長文,那代表它包含了原來的長文章裡面多塑造的字句,那你就可以把這個短的句子當作是摘要來看。
link |
那在training的時候,它就是一個autoencoder,輸入長的文章,輸出也是一模一樣長的文章。但它不是一般的autoencoder,一般的autoencoder,你得輸入一個high-dimensional的vector,把它做dimensional reduction,然後再把dimensional reduction的結果變回原來high-dimensional的vector,這是一般的autoencoder。
link |
還有另外一種autoencoder叫sequence-to-sequence的autoencoder,因為一個sequence把它變成一個code,這個code也是一個vector,再把這個vector變回原來的sequence。
link |
那這邊它是sequence-to-sequence-to-sequence autoencoder,它就是把一個長的sequence變成一個短的sequence,再把短的sequence變回長的sequence,所以它是sequence-to-sequence-to-sequence autoencoder。
link |
那在train的時候,我們知道說sequence-to-sequence-to-sequence model,它就是有sample的process,所以有sample的process,今天這兩個sequence-to-sequence-to-sequence model合起來是不能為分的。
link |
不過沒關係,反正你就用剛才講的reinforcement learning的方法,硬train就對了,硬train,你就把reconstruction error當作loss,然後train,用reinforcement learning的方法硬train下去就結束了。
link |
但是這樣可能會有一個問題,假設今天長的輸入是臺灣大學,那machine可能就會想要把它縮寫,但是machine不一定會把它縮寫成臺大,可能把它縮寫成灣學,反正只要第二個sequence-to-sequence-to-sequence model可以把灣學再解回臺灣大學就可以了。
link |
但是人看到這個東西,他就會非常的害怕,他就會非常困惑,他就不知道machine在講什麼,他就覺得說machine發明了新的語言是密謀要統治人類。
link |
大家都記得Facebook不是之前就release說什麼machine發明了新的語言是密謀要統治人類,你可能會覺得說這個這麼荒謬,真的有人相信嗎?還真有人相信!我跟很多人talk過,很多人是真的相信的,這讓我覺得非常的擔心。
link |
所以我們要避免這種狀況發生,那怎麼辦呢?我們要加一個discriminator,這個discriminator的工作就是給他一個句子,給他一個word sequence,他判斷說這個word sequence是人寫的word sequence還是機器產生的word sequence。
link |
這個discriminator他並不需要真的看過summary,只要給他大量人寫的句子,然後他說人寫的句子長什麼樣,之後他就可以去判斷說一個句子是不是人寫出來的句子。
link |
然後在training的時候,discriminator要做的事情就是要想辦法讓這個discriminator覺得他產生的句子是人寫出來的。所以在這整個model裡面要minimize的事情,對這個第一號sequence to sequence model來說,一方面要讓輸入的長文跟輸出的長文越接近越好。
link |
同時他又希望說中間的這個短文,他產生出來的這個短文是discriminator覺得是人寫的句子。
link |
那可能discriminator發現說,哦,彎學是一個很奇怪的東西,也許縮寫成什麼大字比較合理的,那第一個sequence to sequence model就會知道說台灣大學應該要縮寫成台大。
link |
好,那這邊就是一些例子,接下來就是給大家看一些Machine真正可以做出來的例子。舉例來說,你輸入的文章是澳大利亞晶片子山國家簽署了反興奮劑雙邊協議,那人寫的摘要是澳大利亞晶片子山國簽署反興奮劑協議,機器寫的摘要是澳大利亞加強體育競賽之外的藥品檢查。
link |
其實這是一個蠻typical的例子,大部分機器產生output都是可以做到這個等級的。但是你仔細想一下,其實在unsupervised case的情況下,機器它產生output的時候其實是頗為保守的。
link |
你會發現說它output的這些句子、這些詞彙通常就是原來input的document裡面有的詞彙。舉例來說,澳大利亞出現在這個地方,加強體育競賽之外的藥品檢查出現在這個地方。
link |
所以機器通常做的事情就是從原來的文章裡面選一些詞彙出來,然後把一些它覺得可能比較不重要的東西,這種詞綴字把它刪掉,然後組成新的句子。
link |
這個是一個比較typical的結果,現在有一個找到一個比較強的,輸入是中華民國2011年委員會今天接到1992年冬季奧運會邀請函。人寫的摘要是1992年冬季奧運會也邀我參加。
link |
今天機器產生的output是奧委會接獲冬季奧運會邀請函。所以機器自己學到說奧林匹克委員會的縮寫就是奧委會。
link |
可能在training data裡面有很多X委會X委會,它就學到說什麼什麼委員會就可以縮寫成什麼委會,它就自己學到這個東西。
link |
當然它有一些失敗的例子,舉例來說這個是印度尼西亞蘇門達臘島發生豪雨,人寫的句子是摘要是印尼水災造成六成死亡。
link |
機器寫的是印尼門洪水氾濫導致塌嶼,結果不管塌嶼是什麼,印尼門是什麼,印尼門就是印度尼西亞蘇門的縮寫。
link |
機器覺得說印度尼西亞蘇門的縮寫就是印尼門,可是training data裡面有很多羅森門、通俄門之類的,所以它就覺得說印度尼西亞蘇門應該縮寫成印尼門。
link |
當然也有少部分是整個就爛掉了,舉例來說這個是安徽省合肥市最近為領導幹部下基層做了新規例一律清車重檢,機器產生的output就是合肥領導幹部下基層作稿迎來送往規定一律檢。
link |
一律清車重檢就縮寫成一律檢,其實也有人用類似的技術來做video的summarization,這邊就把reference列給大家參考。
link |
還有用類似的技術,細節我們就不講了,有人做unsupervised translation,我們過去做translation當然都會用sequence-to-sequence model,比如說你要中翻譯,收集一大堆的中文,每一個中文你都找人去寫了他英文的翻譯,收集百萬句以後都要給機器去translate。
link |
但現在可以做unsupervised translation,你只要一堆中文一堆英文,然後不需要是pair的,網路上爬一堆英文的句子爬一堆中文的句子,兩堆不需要pair,然後用game的技術就可以硬train一個translator。
link |
我就把reference留在這邊給大家參考,技術的部分我們就不細講了,我唯一想要跟大家講的就是他到底可以做到什麼樣的performance,這個是文件上可以做到的成果。
link |
橫線是unsupervised translation可以做到的結果,縱軸是blue scope,用blue scope來衡量,越來越好,大家都知道blue scope是什麼了。這個曲線是supervised方法的performance,橫軸是使用的training data的量。
link |
那unsupervised的方法他用的training data量是10的7次方的句子,不過是unpair,是沒有pair的。因為是沒有pair所以你要用多少data都可以啦,在今天unsupervised的情況下collect data並不是太大的effort。
link |
而如果是supervised的情況下collect data就會是一個effort。那在supervised的情況下當你的data從10的4次方的pair的句子一直進步到10的7次方的pair的句子的時候,你的performance當然是越來越好的。
link |
但你會發現說,你用unsupervised的方法performance是可以逼近10的5次方比training data的performance。也就是說,你今天如果要跟unsupervised的方法performance比比,你要收集10的5次方,也就是1萬個pair的句子,才能夠跟unsupervised的performance一樣好。
link |
那最後呢,我要跟大家講的是文字上的text style的transfer。那我們在座位裡面有要求大家做image的style transfer。image style transfer,文件滿坑滿谷,隨便google就是一大堆,所以我們應該是很貼心的做出來。
link |
我們這邊講文字的style transfer。我這邊要舉的例子呢,是用personalized的chatbot做例子。也就是說,我們希望未來的chatbot是有個性的。舉例來說,你假設你想要做一個虛擬女友,那你會希望你的女友是有個性的,比方說她是傲嬌的個性,或者是她是病嬌的個性等等。
link |
所以你會希望你的chatbot是personalized的。那我們現在可以做到的事情,當然要做出什麼傲嬌的屬性的chatbot這個還太不困難。
link |
那現在至少可以做到說,我們希望我們的chatbot,他的回答都是正面的。你可以想像說同樣的技術你可以用在其他的地方,比如說希望chatbot的回答都是傲嬌的等等。
link |
那我們現在,什麼叫做chatbot的回答都是正面的呢?舉例來說你問他說,How was your day today?那chatbot其實可以回答各式各樣不同的回答。
link |
舉例來說他可以說,他今天過得很糟,但是我們希望他是一個樂觀開朗的chatbot,如果你問他說,今天過得怎麼樣的話,他就要回答說,我過得很好。那這個怎麼做呢?這邊有兩個不同的體系的方法。
link |
一個方法是,我們有一個sequence-to-sequence model,我們直接去改sequence-to-sequence model的參數,希望這個sequence-to-sequence model的output永遠都是正面的。
link |
那另外一個系列的方法是,我們不要去動那個sequence-to-sequence model,好不好,那個sequence-to-sequence model都不是你的,就是off the shelf的網路上載下來的,動不了他的參數。但是我們另外一個transformation的network,這個network做的事情是,不管這個chatbot回答的output是什麼,我們一定把它轉成正向的。
link |
這個chatbot我們就不要動他了,可能是別人的,我們動不了他,但是不管他說什麼,就通通把它轉成正面的句子。
link |
那有什麼樣的方法呢?我們先來講第一個,Persona-based的方法。Persona-based的方法我記得很久以前就有了,好像15年還16年就有了。而這個Persona-based的方法也是要去改這個sequence-to-sequence model的參數,希望sequence-to-sequence model的output總是正面的。
link |
Persona-based的方法是說,假設我們training data裡面有一個data的peers告訴我們,看到how is today,你就要回答today is awesome,然後你有一個sentimental classifier,那這個sentimental classifier會吃你的response的結果,你就先把response的結果丟給sentimental classifier,讓他判斷說現在要繼續output的response是正向還是負向。
link |
那這個sentimental classifier如果它是input句子越正面,它output的值就越接近1。那這個sentimental classifier你可以去另外把它check,反正你很容易可以收集到大量的data,然後有人去label說哪些句子是正面,哪些句子是負面,然後哪些大量的data你就可以訓練好那個現成的sentimental classifier。
link |
如果你有修另外一門我的ML的話,我們有機會用作業就是訓練一個sentimental classifier,你就假設你把你那個作業的結果拿來這邊用一下就是了。好,今天你的這個SQL to SQL model它在產生output的時候,它會不只是看現在input的句子,它還會看這個sentimental classifier的output,一起去產生最後的response。
link |
所以如果你今天的output是today is awesome,它就會看到這個0.9以後,它就輸入這個0.9以後輸出today is awesome。如果今天的輸出是today is bad,你就input0.1以後讓它輸出today is bad。
link |
所以Machine就會學到說,如果輸入的數字是大的,靠近1的就輸出正向的句子,靠近0的就輸出負向的句子。最後實際上呢,你在做testing的時候,你要怎麼讓它變成一個樂觀的buff呢?
link |
如果你都輸入,譬如說它input是I love you,如果你把這個黑色的數字設一個接近1的詞,它回答就會變成是正面的,就變成I love you too。如果輸入接近一個字,0.0,它就輸出I'm not ready to start a relationship。
link |
它沒有辦法跟你開始一個關係,但跟別人其實是可以的。你今天就是只要缺乏輸出off response的時候,你永遠把這個黑色的數字設成1,你就會得到一個樂觀的buff。
link |
但如果設成0,它就會變成一個悲觀的buff。那另外一個方法是用reinforcement learning的技術。那怎麼reinforcement learning的技術呢?用reinforcement learning的技術,我們就需要給Machine的response一個分數嘛。
link |
所以我們就把現在Machine的response丟給Sentimental Classifier,那Sentimental Classifier會給它一個分數,說現在這個句子有多真相。那Machine就把Sentimental Classifier的output當作report,它希望它產生的句子,Sentimental Classifier覺得它越正面越好。
link |
那用的方法跟我們今天在這份投影片一開始用reinforcement learning的方法是一模一樣的。只是現在evaluate不是人來看,是拿Sentimental Classifier來看。其他的技術,細節量,其他用的技術都是一模一樣的。
link |
好,那接下來Network就會去調整它的sequence-to-sequence model,就會調整它的參數,它希望它產生出來的句子可以讓Sentimental Classifier的output值越大越好,也就是sequence-to-sequence model可以得到的reward越大越好。
link |
好,現在已經講了兩個方法,第三個方法是trace一個transformation的network,把input,不管input是什麼樣的句子,通通改成正向的句子。
link |
那這個技術叫做ply-and-play,在文字在影像上已經有很多實作的成果,也做得非常成功。那其實這個方法跟我們剛才看到那個智能的photoshop是非常像的,我們剛才不是講了智能的photoshop嗎?這個ply-and-play的方法其實就是智能的photoshop用的方法。
link |
好,怎麼做呢?你先trace一個sequence-to-sequence的model,你可以把一個sentence變成一個code,你可以把一個code變成sentence。
link |
接下來,當你的圈碼有一個response的時候,把這個response丟到encoder裡面讓它變成一個code,然後接下來把這個code做一些修改,把原來的code變成新的code,然後再把新的code丟到encoder裡面產生新的response。
link |
然後我們希望這個新的response丟到sentence的classifier裡面,它最後的output越正面越好。那我們剛才在講那個智能photoshop的時候,我們說有好幾個constraint,一個是你現在希望你新的圖片符合使用者給你的限制,另外一方面希望新的圖片不要和舊的圖片差太多。
link |
那這邊用的技術是一模一樣的,我們希望把舊的code變成新的code,這個新的code它滿足兩個條件,一個是把新的code變成句子以後這個句子send to classifier覺得它是正向,另一方面這個新的code跟原來的code又不要差太多。
link |
第四個方法就是train一個cycle game,我們今天在這個課程一開始的時候我們就講了cycle game,你只要有兩堆netcard,比如說真實的圖片跟半圖的圖,你就沒辦法互轉。
link |
同樣的技術你可以用在各種不同的application上,不是只有影像可以用,語音也可以用,你有一堆男生的聲音,有一堆女生的聲音,用cycle game就可以男轉女,女轉男。
link |
你有一堆正面的句子,有一堆負面的句子,用cycle game就正向轉負向,負向轉正向。
link |
舉例來說這個是真的machine訓練出來的結果,把負向的句子都轉成正面的句子,你跟他說I miss you,他就說I love you,你跟他說I don't love you,他就變成I love you,你說I cannot do that,他就變成I can do that,你說It's a bad day,他就變成It's a good day。
link |
這還有一個很強的,說Sorry for doing such a horrible thing, I will get a 6 for doing a great thing。當然他其實也會犯錯,比如說我發現他沒有學到sick的相反,就是healthy,你要說My dog is sick,還是說My doggie is my doggie,也不知道在做什麼。
link |
這個東西其實還蠻有用的,比如說你覺得你的老闆講話很機的話,你就可以在你的耳機裡面裝個這個系統,他責罵你的話都會變成讚美你的話,你的日子就會過得很開心。
link |
這邊是比較一些不同的方法,我可以很快的講過去。
link |
這邊比較了不同的技術,這邊比較的方法是用人序衡量,人會給他五個等級的分數,從最差到最好,然後把這個分數normalize成0到1之間,0代表最差,1代表最好。
link |
我們這邊從三個不同的面向來evaluate一個缺霸,這三個不同的面向,第一個是coherent,希望缺霸的回覆是真的有回覆原來的輸入。
link |
你並不希望說今天不管輸入什麼,缺霸的output都是今天很好,今天很好,今天很好,根本就沒有回答到使用者輸入的問題,不是我們要的,我們希望缺霸的輸出也是要回覆使用者的輸入。
link |
第二個是今天缺霸的output有沒有正向,這個就是我們本來要做的事。
link |
最後就是我們希望缺霸的輸出的句子還是要回覆文法,我們不希望他只是輸出一大堆很正面的詞彙,原來不管說什麼他的輸出都是棒棒棒棒棒棒棒棒棒這樣子,你希望他的輸出也是一個符合文法的句子。
link |
我們先看原來的sequence-to-sequence model,如果你看原來的sequence-to-sequence model的話,它的coherence是很高的,至少比其他方法都要高。
link |
如果你看sentiment的話,它本來就不是特別正向,它就輸入一般的句子,所以不是特別正向。如果你看文法的話,最高分是1分,它的文法是0.999分,所以幾乎所有的人都覺得這個sequence-to-sequence model的output文法是完全正確的。
link |
其實今天如果你訓練的data有超過百萬句以上的話,基本上我們訓練師不太會犯文法的錯誤,所以基本上sequence-to-sequence model的output文法基本上都會是對的。
link |
接下來就是做一下textile transfer,讓缺霸用output正面的句子。
link |
第一個第一組方法是直接去改那個sequence-to-sequence model,讓它的output的句子總是正面的。
link |
我們比較persona-based的方法跟reinforced learning的方法,我們會發現說,如果在sentiment的分數上,這兩個方法其實相差不大。
link |
如果看coherence跟grammar的話,reinforced learning的方法是最強的,它在這三個不同的評比上,只有在sentiment的部分是跟persona-based的方法差不多。
link |
在coherence跟grammar上面,則是persona-based的方法會輸掉。
link |
其實persona-based的方法有一個很大的問題,就是說我們今天在產生response的時候,我們會輸入一個數字嗎?
link |
你本來期待說我現在改成輸入是1,它就是正面的句子,但事情並沒有這麼簡單。
link |
很多狀況是你改成輸入是1,那正面的句子是什麼?你沒有教過它啊,它結果就爛掉了,還是產生一個怪怪的東西,爛掉了文法的東西。
link |
所以reinforced learning比較不會這樣,所以reinforced learning看起來是persona-based的方法要強。
link |
剩下三個方法是直接去改缺碼的algorithm,缺碼講什麼就把它改成正面的。
link |
那這邊有一個transformation-level的方法沒有講過,發現不太work,所以就沒有講。
link |
那如果比較plot-and-play的方法跟cycle-game的方法,你會發現說cycle-game的方法是遠勝plot-and-play的方法。
link |
舉例來說我們看這個文法的部分,cycle-game的方法文法比較不會壞掉,plot-and-play的方法很容易你一動那個code,output的句子整個就壞掉了,整個文法就不對了。
link |
所以cycle-game是在文法上相較於plot-and-play比較強,跟reinforced learning差不多,reinforced learning跟cycle-game在文法中最強。
link |
如果比正向的程度的話,因為cycle-game這些方法都是直接改缺碼的輸出,因為它的input已經被限制住了,所以有時候它沒有辦法真的對句子做太大的更動,所以它沒有辦法像reinforced learning的方法output那麼正面的句子。
link |
如果是就上下文的關係來看的話,cycle-game其實是最強的,它產生出來的output跟輸入的句子是最能夠回答輸入的句子。
link |
這是一些分數,我們看一些真實的例子。舉例來說,假設現在輸入是,I'm just less interested in the how-to and more in what and why the feeds we build.那steeper to steeper model的回答就是,It's not a good feed.那使用者看了就會覺得說,他的想法被否定了,就被送了。
link |
那如果是persona-based的方法跟IL的方法會回答,I'm interested in this or it's a good one.而如果是plot and play它就說,It's not a wrong feed.而如果是cycle-game就說,It's a good feed.一個是把good改成wrong,一個是把not直接拿掉,都有把負面的句子轉成正面的句子。
link |
另外一個例子是,現在使用者輸入是,Always learning and still improving.It's a huge turn-on for me, so believe me, I'm the same.那steeper to steeper的model回答是,I'm not sure if I can see you in a relationship.使用者看了一定會勃然大怒。
link |
那plot and play它就爛掉了,I can see you in a special,不知道在做什麼。plot and play很容易這樣,改了一個code文法就壞了。那cycle-game它會把not去掉,變成I'm sure if I can see you in a relationship,這個句子略為怪怪的。
link |
那如果是persona-based的方法就說,You are gonna have a word with your mother.不知道為什麼要提到人家媽媽,變成奇怪。如果是IL方法的話,它回答是I love you so much,人看了就會很高興。