back to index

GAN Lecture 3 (2017): Improving Sequence Generation by GAN


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