back to index

ML Lecture 21-2: Recurrent Neural Network (Part II)


link |
00:00.000
讓大家久等,好,那我們就用旁邊的附木來講,因為中間的,呃,主木不知道為什麼放不出來,那我們上次呢,講到LSTM,總之就是一個複雜的東西,好,那再來的問題是,像recurrent neural network這種架構,它要如何做learning呢,我們之前有說過說,如果要做learning的話,你要定一個cost的function。
link |
00:30.000
來evaluate你的model的parameter是好還是不好,然後你選一個model的parameter,可以讓這個loss增小,那在recurrent neural network裡面,你會怎麼定這個loss呢,以下呢,我們就不寫算式,直接舉個例子,假設我們現在要做的事情呢,是slot theory,那你會有training data,
link |
00:56.600
這個training data是說,給你一些sentence,這個它是,呃,它的光是有的,要這麼近才有,好,我想放在這邊,其實是有的,好,那個,呃,
link |
01:20.600
其實我自己,我沒有辦法看到那個pointer的投影在螢幕上的光點,欸,你要嗎,如果,謝謝,謝謝,謝謝,謝謝,謝謝,太感謝了,好,呃,這個是sentence,ok,
link |
01:42.600
然後呢,你要給sentence的label告訴machine說呢,這個第一個word,它屬於other這個slot,然後台北屬於destination這個slot,它屬於other的slot,member跟second都屬於這個出發,呃,目的地,呃,要抵達時間的slot,然後接下來呢,你希望說,你的cost會怎麼定呢,
link |
02:07.600
把arrive丟到recurrent neural network的時候,recurrent neural network會得到一個output y1,接下來呢,這個y1呢,會和一個reference的vector算它的cost entropy,所以你會希望說,如果我們現在丟進去的是arrive,
link |
02:29.600
那y1,它的reference的vector呢,應該是對應到other那個slot的dimension,value是1,其他是0,這個reference的vector的長度啊,就是你slot的數目,比如說你訂了40個slot,那這個reference vector的長度呢,它的dimension就是40,
link |
02:49.600
那假設現在input的這個word呢,它應該對應到other這個slot的話,那對應到other的dimension就是1,其他的就是0,那現在你把台北丟進去的時候,因為台北屬於destination這個slot,
link |
03:08.600
所以你就希望說把x2丟進去的時候,y2它要跟reference的vector距離越近越好,那y2的reference vector是對應到destination那個slot是1,其他是0,那這邊要注意的事情是,你在丟x2之前,一定要先丟x1,
link |
03:32.600
你在把台北丟進去之前,你一定要先把arrive丟進去,不然你就會不知道存在memory裡面的是多少,所以在做training的時候呢,你也不能夠把你的alternates裡面的這些word呢,
link |
03:48.600
這個word sequence呢,打散來看,word sequence呢,仍然要當這個整體來看,同樣道理,把on丟進去,它的reference vector呢,是對應到other是1,對應到other那個dimension是1,其他是0,
link |
04:05.600
所以你的cost就是每一個時間點的on的output跟reference vector的cross-entropy的合,就是你要去minimize的對象,那現在有了這個loss function以後,training要怎麼做呢?
link |
04:27.600
training呢,其實也是用gradient descent,也就是說,如果我們現在已經定出了loss function大L,我要update這個network裡面的某一個參數w,我要怎麼做呢?
link |
04:44.600
你就計算w對大L的片尾分,這個片尾分計算出來以後,就用gradient descent的方法呢,去update每一個參數,那我們之前在講neural network的時候呢,已經講過很多次了,
link |
04:58.600
那在講這個之前的那個v-forward network的時候,我們說gradient descent用在v-forward network裡面,你要用一個比較有效的演算法叫做backpropagation,在recurrent neural network裡面,gradient descent的原理是一模一樣的,
link |
05:16.600
但是為了要計算方便,所以呢,也有開發一套演算法,這套演算法呢,是backpropagation的進階版,它叫做BPTT,那它跟backpropagation其實是很類似的,
link |
05:33.600
只是因為recurrent neural network它是在time sequence上面做運作,所以BPTT呢,它需要考慮時間的information,那我們在這邊呢,我們就不講BPTT,
link |
05:46.600
反正你只要知道說RNN就是用gradient descent train的,它是可以train的就行了。
link |
05:52.600
然而不幸的就是呢,RNN的training呢,是比較困難的。
link |
06:02.600
一般而言呢,你在做training的時候,你會期待你的這個learning curve呢,是像藍色這一條線,我這邊的這個縱軸呢,是total loss,
link |
06:27.600
這個橫軸呢,是APOC training的時候的APOC的數目,你會希望說呢,隨著APOC越來越多,隨著參數不斷的被update,
link |
06:37.600
Loss呢,應該就是慢慢慢慢的下降,最後趨向收斂。
link |
06:43.600
但是不幸的是,當你在訓練這個recurrent neural network的時候,你有時候會看到綠色這一條線,綠色這一條線。
link |
06:52.600
而這個很重要,如果你是第一次train recurrent neural network,你看到綠色的這樣子的這個learning curve,
link |
07:02.600
這個learning curve呢,非常劇烈的走動,然後走到某個地方,就突然NAN,然後你的程式就segmentation fault了。
link |
07:10.600
而這個時候,你會有什麼想法呢?我相信你的第一個想法就是,程式有bug啊,程式有bug。
link |
07:18.600
好,這個,今年的春天呢,我要那個Thomas Mikolov來台灣,Thomas Mikolov就是發明那個workback的人,
link |
07:28.600
之前說講過了,然後他跟我分享了他當時開發RNN的心得,
link |
07:34.600
他是最早開始做RNN的learning model的人,大概在09年的時候呢,就開始做了。
link |
07:44.600
而有很長一段時間呢,只有他能夠把RNN的learning modeltrain起來,其他人呢,都train不起來。
link |
07:51.600
好,那,他說他,你知道在那個年代,那個年代是沒有像現在有什麼Tensorflow啊DLL之類的,
link |
08:01.600
那個年代做什麼東西呢,都是要徒手刻的,所以他徒手刻了一個RNN,然後train完以後,就發生這樣的現象。
link |
08:09.600
他第一個想法就是,程式有bug,程式有bug,然後努力的抵了bug以後,果然有很多bug。
link |
08:17.600
然後就把所有,但是他後來就把bug修掉,修掉,他覺得應該是沒有bug,但是這個現象還是在,
link |
08:26.600
所以他就覺得很困惑,而其他人就跟他說,放棄啦,放棄啦,這不work這樣子。
link |
08:32.600
他說,嗯,可是我想要,他就想說,他要知道結果,為什麼會這樣,所以他就做分析。
link |
08:39.600
等一下這個圖是來自於他的paper,他分析了一下RNN的性質,他發現說呢,
link |
08:45.600
RNN的error surface,所謂error surface是total loss,對參數的變化是非常的陡峭,
link |
08:52.600
非常崎嶇的,所謂的崎嶇的意思是說,這個error surface,他有一些地方非常平坦,有一些地方非常的陡峭,
link |
09:03.600
就像是有懸崖峭壁一樣。
link |
09:06.600
所以,底下這是一個,這邊這個通篇上是一個示意圖,縱軸呢,是total loss。
link |
09:13.600
那這個x軸跟y軸呢,代表兩個參數,w1和w2,這個圖上顯示的就是w1、w2這兩個參數,
link |
09:24.600
對total loss的影響,發現說呢,在很多地方都是非常平坦,在某些地方呢,非常的陡峭。
link |
09:33.600
所以,這個會造成什麼樣的問題呢?
link |
09:37.600
假設你從橙色這個點,當作你的初始的點,用gradient descent開始調整你的參數,
link |
09:45.600
在橙色這個點,你算一下gradient,然後呢,update你的參數,就調到下一個橙色的點。
link |
09:52.600
再算一下gradient,再update你的參數,你可能正好就跳過一個懸崖,
link |
09:58.600
所以你的loss loss呢,就突然暴增,你會看到那個loss呢,上下非常劇烈的震盪。
link |
10:06.600
有時候可能會遇到另外一個更慘的狀況,就是你正好就踩一腳踩在這個懸崖上,正好一腳踩在懸崖上。
link |
10:17.600
那你踩在懸崖上會發生什麼事情呢?你踩在懸崖上,因為在懸崖上的gradient呢,很大。
link |
10:23.600
然後呢,之前的gradient都很小,所以你措手不及,因為之前的gradient很小,所以你可能把learning rate調得比較大。
link |
10:32.600
但是gradient突然很大,很大的gradient再乘上很大的learning rate,結果參數呢,就update很多,然後整個參數呢,就飛出去了。
link |
10:43.600
所以你就按了an,所以程式呢,就segmentation fault。
link |
10:48.600
然後Thomas de Colombe就想說,怎麼辦呢?怎麼辦?他說他不是一個數學家,所以他要用工程師的想法來解決這個問題。
link |
10:58.600
然後他就想了一招,這一招呢,應該是蠻關鍵的,讓很長一段時間,只有他的code呢,可以把RN的learning model傳出來。
link |
11:11.600
那很長一段時間呢,人們是不知道這一招的,因為這一招他覺得實在是太沒什麼,所以沒寫在paper裡面,直到他在寫那個博士論文的時候,那博士論文是比較長的。
link |
11:24.600
所以有些東西就算你覺得trivial,很可能還是會寫進去,直到他在寫博士論文的時候,大家才發現了這個秘密。
link |
11:35.600
這個秘密是什麼呢?這一招呢,說穿了就不值錢,這一招呢,叫做creeping。
link |
11:41.600
creeping的意思是說,當gradient大於某一個threshold的時候,就不要讓它超過那個threshold。
link |
11:49.600
在Thomas Percona的程式裡面,我記得就是,當gradient大於threshold的時候,就等於threshold結束。
link |
11:57.600
好,所以因為gradient現在不會太大,所以當你做creeping的時候,就算是踩在這個懸崖上,也沒有關係,你的參數呢,就不會飛出去。
link |
12:08.600
它會飛到一個比較近的地方,這樣你仍然可以繼續做RN的training。
link |
12:14.600
有人就會問這個,那在接下來的問題就是,為什麼RN會有這種奇特的特性呢?
link |
12:26.600
為什麼RN會有這種奇特的特性呢?
link |
12:36.600
有人說,有人可能會說,是不是因為來自於sigmoid function,我們之前有講過,在講IELU的exclamation function的時候呢,
link |
12:46.600
我們講過一個問題,叫做gradient vanishing的問題,然後我們說這個問題是從sigmoid function來的,
link |
12:55.600
因為sigmoid的關係,所以有gradient vanishing這個問題,就是說RN會有這種很小的,很平滑的arrow surface,
link |
13:07.600
是因為來自於gradient vanishing,是因為來自於sigmoid function。
link |
13:12.600
這件事情呢,我覺得不是真的,你想想看,如果這個問題是來自於sigmoid function,換成IELU就解決這個問題啊,
link |
13:20.600
所以不是這個問題。可以跟大家講一個秘密,如果你用IELU,你會發現說呢,一般在chain neural network的時候呢,
link |
13:28.600
很少用IELU當作exclamation function,為什麼呢?因為如果你把sigmoid換成IELU,
link |
13:35.600
其實在RN上面performance通常是比較差的,所以exclamation function並不是這個地方的關鍵點。
link |
13:45.600
並不是這個地方的關鍵點。好,那如果說我們今天有講這個backpropagation through time的話,
link |
13:53.600
從式子裡面呢,你會比較容易看出說為什麼會有這個問題。
link |
13:58.600
那我今天沒有講backpropagation through time,沒有關係,我們有一個更直觀的方法可以來知道說一個gradient的大小是什麼樣子。
link |
14:07.600
這個更直觀的方法就是你把某一個參數做小小的變化,看它對network output的變化有多大,
link |
14:14.600
你就可以測出這個參數的gradient的大小。我們這邊呢,舉一個很簡單的RN當作我們的例子。
link |
14:23.600
今天有一個全世界最簡單的RN,它只有一個neural,這個neural是linear,它只有一個input,沒有bias,
link |
14:33.600
input的weight是1,output的weight也是1,那transition的部分呢,transition的部分的weight是W,
link |
14:44.600
也就是從memory接到neural的input的weight是W。
link |
14:51.600
好,現在假設我給這個network的輸入是100000,只有第一個時間點輸入,
link |
14:59.600
1000大家都輸入0,那這個network的output會長什麼樣子呢?
link |
15:03.600
比如說這個network在最後一個時間點,1000個時間點的output,值會是多少?
link |
15:09.600
我相信大家都可以馬上回答我,它的值呢,是W的999次方,對吧?
link |
15:16.600
你把1輸進去,再乘上W,乘上W,乘上W,乘上999次W,輸出就是W的999次方,
link |
15:25.600
後面的輸入都是0嘛,非常貴,只有一開始的1有影響,但是它會通過999次的W。
link |
15:32.600
好,那我們現在來看,假設W是我們要認的參數,我們想要知道它的gradient,
link |
15:40.600
所以我們想要知道當我們改變W的值的時候,對network的output有多大的影響。
link |
15:46.600
現在我們假設W等於1,那Y1000,連我的最後時間點的output也是1。
link |
15:55.600
假設W等於1.01,那Y1000是多少呢?
link |
16:02.600
Y1000是1.01的999次方,1.01的999次方是多少呢?
link |
16:08.600
是2萬,是一個很大的值,這個就跟蝴蝶效應一樣。
link |
16:16.600
而這個W呢,有一點小小的變化,對它的output影響呢,是非常大的。
link |
16:24.600
所以,W呢,有很大的規定。
link |
16:30.600
那可能想說有很大的規定,也沒有什麼,我們只要把它的learning rate設小一點就好。
link |
16:37.600
但是事實上,如果我把W設成0.99,那Y1000呢,就等於1。
link |
16:45.600
如果我把W呢,設0.01,那Y1000還是等於1。
link |
16:51.600
也就是說,在1這個地方,有很大的gradient,但是在0.99的地方,gradient呢,就突然變得非常非常的小。
link |
17:01.600
這個時候,你又需要一個很大的learning rate,就會造成說你設learning rate很麻煩,你的error service很崎嶇。
link |
17:08.600
因為這個gradient呢,是時大時小,而且在非常短的區域之內,gradient就會有很大的變化。
link |
17:17.600
所以從這個例子,其實你可以看出來說,為什麼RNN會有問題。
link |
17:26.600
RNN的training的問題,其實是來自於它把同樣的東西呢,在transition的時候呢,在時間和時間轉換的時候呢,反覆使用。
link |
17:38.600
從memory接到neuron的那一組位,在不同的時間點,都是反覆被使用。
link |
17:44.600
所以這個W呢,只要一有變化,它有可能完全沒有造成任何影響。
link |
17:52.600
但一旦它可以造成影響,那影響都會是天崩地裂的影響。
link |
17:57.600
所以它有時候gradient很大,有時候gradient很小。
link |
18:01.600
所以這個RNN會不好訓練的原因,並不是來自於activation function,而是來自於它有time sequence,
link |
18:14.600
同樣的位在不同的時間點,是會被反覆的,不斷的被使用。
link |
18:20.600
好,那有什麼樣的技巧可以幫助我們解決這個問題呢?
link |
18:30.600
其實現在最廣泛被使用的技巧呢,就是LSTM。
link |
18:36.600
那LSTM呢,可以讓你的error surface不要那麼崎嶇。
link |
18:41.600
它可以做到的事情是,它會把那些比較平坦的地方拿掉。
link |
18:46.600
它可以解決gradient vanishing的問題,但它不會解決gradient explode的問題,
link |
18:51.600
因為你有些地方仍然是會非常的崎嶇的。
link |
18:55.600
你有些地方它仍然是變化非常劇烈的,但是呢,不會有特別平坦的地方。
link |
19:02.600
因為如果你在做LSTM的時候,大部分的地方都變化很劇烈,
link |
19:07.600
所以呢,當你在做這個LSTM的時候呢,你可以放心的把你的learning rate設的小一點。
link |
19:17.600
那它呢,要在learning rate特別小的情況下呢,進行訓練。
link |
19:22.600
那為什麼LSTM可以做到這個handle gradient vanishing的問題呢?
link |
19:32.600
為什麼它可以避免讓gradient特別小呢?
link |
19:37.600
我聽說有人在這個面試某家國際大廠的時候,就被問這個問題。
link |
19:47.600
那這個問題怎麼答比較好呢?
link |
19:50.600
如果你答一些什麼,喔,因為L...
link |
19:53.600
那個問題是這樣,為什麼我們把RNN換成LSTM?
link |
19:58.600
如果你的答案是,喔,因為LSTM比較吵,因為LSTM比較複雜,
link |
20:02.600
這個都做到太弱了這樣。
link |
20:04.600
那真正的理由就是,LSTM可以handle gradient vanishing的問題。
link |
20:10.600
但是接下來人家就會問說,為什麼LSTM可以handle gradient vanishing的問題呢?
link |
20:16.600
我在這邊呢,試著來回答看看。
link |
20:19.600
那這樣子之後如果有人,你口測的時候再問到這個問題的時候呢,
link |
20:23.600
你可以想想看你有沒有辦法回答。
link |
20:26.600
這個如果你想看RNN跟LSTM,他們在面對memory的時候,
link |
20:32.600
他們處理的operation其實是不一樣的,對不對?
link |
20:38.600
你想想看在RNN裡面,在每一個時間點,其實memory裡面的資訊都會被洗掉。
link |
20:46.600
在每一個時間點,neural的output都會被放到memory裡面去,
link |
20:51.600
所以每一個在每一個時間點memory裡面的資訊呢,都會被覆蓋掉,都會被完全洗掉。
link |
20:57.600
但是在LSTM裡面不一樣,
link |
21:02.600
它是把原來memory裡面的值乘上一個值,再把input的值呢,
link |
21:08.600
加起來放到cell裡面去。
link |
21:13.600
所以它的memory和input是相加的。
link |
21:19.600
所以今天呢,它和RNN不同的地方是,
link |
21:24.600
如果今天你的wait可以影響到memory裡面的值的話,
link |
21:31.600
一旦發生影響,這個影響會永遠都存在。
link |
21:36.600
不像RNN在每一個時間點,值都會被format掉,
link |
21:40.600
所以只要這個影響一被format掉,它就消失了。
link |
21:44.600
但是在LSTM裡面,一旦能夠對memory造成影響,
link |
21:49.600
那個影響會永遠的留著,除非forget gate被使用,
link |
21:57.600
除非forget gate決定要把memory裡面的值洗掉,
link |
22:00.600
不然一旦memory有改變的時候,每一次都只會有新的東西加進來,
link |
22:04.600
而不會把原來存在memory裡面的值洗掉。
link |
22:08.600
所以它不會有灰點vanishing的問題。
link |
22:13.600
你可能會想說,可是現在有forget gate啊,
link |
22:16.600
forget gate就是會把過去存的值洗掉啊。
link |
22:19.600
事實上在LSTM97年的時候就compose了,
link |
22:23.600
那LSTM的第一個版本,其實就是為了解決灰點vanishing的問題,
link |
22:30.600
所以它是沒有forget gate的,forget gate是後來才加上去的。
link |
22:35.600
甚至呢,現在有一個傳言是,你在訓練LSTM的時候,
link |
22:41.600
你要給forget gate特別大的byte,
link |
22:44.600
你要確保forget gate在多數的情況下都是開啟的,
link |
22:48.600
只有少數的情況它會被封閉掉。
link |
22:52.600
現在有另外一個版本用gate操控memory的Cell,
link |
23:04.600
叫做gated recurrent unit,LSTM有三個gate,
link |
23:09.600
這個gated recurrent unit它只有兩個gate,
link |
23:14.600
所以gated recurrent unit寫是GRU,
link |
23:17.600
相較於LSTM它的gate只有兩個。
link |
23:24.600
所以它需要的參數量是比較少的,
link |
23:29.600
因為它需要的參數量比較少,
link |
23:34.600
所以它在training的時候是比較robust的。
link |
23:40.600
所以如果你今天try train LSTM的時候,
link |
23:43.600
你覺得overfitting的情況很嚴重,
link |
23:45.600
你可以試一下用GRU。
link |
23:49.600
那GRU的精神就是,它怎麼拿掉一個gate呢?
link |
23:52.600
我們今天就不講GRU的詳細原理,
link |
23:55.600
它的精神就是舊的不去,新的不來。
link |
23:58.600
它會把input gate跟forget gate連動起來,
link |
24:02.600
它會把input gate跟forget gate連動起來。
link |
24:05.600
那也就是說,當input gate被打開的時候,
link |
24:09.600
forget gate就會自動的關閉,
link |
24:14.600
當input gate被打開的時候,
link |
24:16.600
forget gate就會format存在memory裡面的值。
link |
24:21.600
當forget gate沒有要format值的時候,
link |
24:24.600
input gate就會被關起來。
link |
24:26.600
也就是說你要把存在memory裡面的值清掉,
link |
24:28.600
才可以把新的值放進來。
link |
24:32.600
其實還有很多其他的technique,
link |
24:37.600
是來handle gradient vanishing這個問題。
link |
24:40.600
比如說clockwise的RNN,
link |
24:43.600
或者是structural constraint recurrent level SDRN等等。
link |
24:47.600
我就把reference留在這邊給大家參考。
link |
24:51.600
最後有一個蠻有趣的paper,
link |
24:57.600
是Hinton propose的。
link |
24:59.600
這個方法是這樣,
link |
25:01.600
他說當他用一般的RNN,
link |
25:07.600
不是用LSDN,
link |
25:09.600
他說一般的RNN,
link |
25:11.600
他用identity的matrix來initialize,
link |
25:14.600
transition的weight,
link |
25:17.600
然後再使用IOU的acclimation function的時候,
link |
25:20.600
他可以得到很好的performance。
link |
25:23.600
可能說我剛才不是說用IOU的performance會比較差嗎?
link |
25:26.600
如果你是一般的training的方法,
link |
25:29.600
你initialization的weight是random的話呢,
link |
25:32.600
那IOU跟sigmoid function來比的話,
link |
25:39.600
sigmoid function的performance會比較好。
link |
25:41.600
但是如果你今天用了identity的matrix的話,
link |
25:46.600
如果你今天用identity的matrix當做initialization的話,
link |
25:49.600
這個時候用IOU的performance就會比較好。
link |
25:53.600
這件事情真的是非常的神奇。
link |
25:59.600
當你用了這一招以後呢,
link |
26:01.600
用一般的RNN不用LSDN,
link |
26:04.600
他performance就可以屌打原來的LSDN。
link |
26:07.600
人就覺得說LSDN怎麼這麼複雜,
link |
26:11.600
結果都是白忙一場。
link |
26:13.600
這個是非常神奇的一篇文章。
link |
26:17.600
那其實RNN有很多的application,
link |
26:21.600
在我們前面舉的slot feeding的例子裡面,
link |
26:24.600
我們是假設input和output element的數目是一樣做的。
link |
26:29.600
也就是說input有幾個word,
link |
26:31.600
我們就給每一個word一個slot的label。
link |
26:37.600
但事實上RNN呢,
link |
26:39.600
他可以做到更複雜的事情。
link |
26:45.600
比如說input只是一個sequence, output只是一個vector。
link |
26:51.600
這有什麼應用呢?
link |
26:52.600
比如說你可以做sentiment analysis,
link |
26:55.600
sentiment analysis現在有很多的application,
link |
26:58.600
比喻來說,
link |
27:07.600
某家公司想要知道說,
link |
27:09.600
他們的產品在網路上的評價呢,
link |
27:12.600
是positive還是negative,
link |
27:14.600
他們可能就會寫一個puzzle,
link |
27:17.600
把跟他們網路評價有關,
link |
27:19.600
跟他們產品有關係的那些網路上的文章都爬下來。
link |
27:23.600
但是一邊邊看太累了,
link |
27:25.600
所以你可以用一個machine learning的方法,
link |
27:29.600
自動認一個classifier去分類說,
link |
27:33.600
哪些document是正向的,
link |
27:35.600
哪些document是負向的。
link |
27:39.600
或者是在電影版上呢,
link |
27:41.600
sentiment analysis做的事情,
link |
27:43.600
就是給machine看很多文章,
link |
27:45.600
然後machine要自動知道說,
link |
27:47.600
哪些文章是正類,
link |
27:49.600
哪些文章是負類。
link |
27:52.600
怎麼讓machine做到這件事情呢?
link |
27:54.600
你就是認一個recurrent neural network,
link |
27:57.600
這個input是一個character sequence,
link |
28:04.600
然後recurrent neural network把這個character sequence讀過一遍。
link |
28:12.600
然後在最後一個時間點呢,
link |
28:14.600
把hidden layer拿出來,
link |
28:16.600
可能再通過幾個transform,
link |
28:23.600
然後你就可以得到最後的sentiment analysis的prediction。
link |
28:28.600
比如說input這個document,
link |
28:30.600
它是超好雷,好雷,負雷,還是超負雷。
link |
28:34.600
它是一個分類的問題,
link |
28:35.600
但是input是一個sequence,
link |
28:37.600
所以你需要用RNN來處理這個input。
link |
28:41.600
或者是我們實驗室做過,
link |
28:43.600
用RNN來做pattern extraction,
link |
28:46.600
所謂pattern extraction的意思是說,
link |
28:51.600
給machine看一篇文章,
link |
28:52.600
然後machine要predict說,
link |
28:55.600
這篇文章裡面有哪些的關鍵詞彙,
link |
28:59.600
然後跟我們在final project裡面的第三個test,
link |
29:02.600
做的其實是非常類似的事情。
link |
29:10.600
如果你今天能夠收集到一堆training data,
link |
29:13.600
你能夠收集到一堆document,
link |
29:15.600
然後這些document都有label說,
link |
29:17.600
哪些詞彙是它對應的keyword的話,
link |
29:19.600
那你就可以直接train一個RNN。
link |
29:21.600
這個RNN把document當作input,
link |
29:26.600
把document的word sequence當作input,
link |
29:28.600
然後通過embedding layer,
link |
29:32.600
然後用RNN把這個document讀過一次,
link |
29:39.600
然後把出現在最後一個時間點的output,
link |
29:46.600
拿過來做attention,
link |
29:48.600
我們發現我們沒有講過attention是什麼,
link |
29:50.600
沒有關係,這個地方你就聽聽就好。
link |
29:53.600
用attention以後,
link |
29:54.600
你可以把重要的information抽出來,
link |
29:56.600
再丟到p4 network裡面去得到最後的output。
link |
30:05.600
那它也可以是多對多的,
link |
30:08.600
比如說當你的input和output都是sequence,
link |
30:12.600
但是output的sequence比input sequence短的時候,
link |
30:17.600
RNN可以處理這個問題。
link |
30:20.600
什麼樣的任務是input sequence長,
link |
30:23.600
output sequence短呢?
link |
30:25.600
比如說語音辨識就是這樣一個任務。
link |
30:29.600
在語音辨識這個任務裡面,
link |
30:31.600
input是一串acoustic feature sequence,
link |
30:34.600
語音是一段聲音訊號嘛,
link |
30:37.600
所以你要做語音辨識的時候,
link |
30:39.600
你就說一句話,
link |
30:40.600
而這句話是一段聲音訊號。
link |
30:42.600
我們一般處理聲音訊號的方式,
link |
30:44.600
就是在聲音訊號裡面,
link |
30:46.600
每隔一小段時間,
link |
30:48.600
就把它用一個vector來表示。
link |
30:51.600
那個一小段時間呢?
link |
30:53.600
那個一小段時間通常很短,
link |
30:55.600
比如說0.01秒之類的。
link |
30:59.600
那它的output呢?
link |
31:00.600
它的output是character的sequence。
link |
31:05.600
好,那如果你是用原來的R文,
link |
31:08.600
用我們在做slot feeding的那個R文,
link |
31:10.600
你把這一串input丟進去,
link |
31:13.600
它充其量呢?
link |
31:14.600
只能夠做到說,
link |
31:16.600
告訴你每一個vector,
link |
31:19.600
它對應到哪一個character。
link |
31:22.600
假設說中文的語音辨識的話,
link |
31:24.600
那你的output的target,
link |
31:26.600
你按output的target,
link |
31:27.600
理論上就是這個世界上,
link |
31:29.600
所有可能的中文的詞彙,
link |
31:32.600
所有可能的中文的character,
link |
31:34.600
那這個可能有,
link |
31:36.600
常用的可能就有八千個,
link |
31:38.600
可能你的這個R文的output的,
link |
31:40.600
這個target的數目呢?
link |
31:42.600
會有八千。
link |
31:43.600
雖然很大,
link |
31:44.600
但這個是有辦法做的。
link |
31:46.600
好,但是你充其量只能做到說,
link |
31:48.600
每一個vector屬於一個character,
link |
31:50.600
每一個vector屬於一個character。
link |
31:52.600
但是,
link |
31:54.600
input的這個每一個vector,
link |
31:56.600
對應到的時間是很短的,
link |
31:57.600
通常才0.01秒。
link |
31:59.600
所以通常是好多個vector,
link |
32:01.600
才對應到同一個character。
link |
32:03.600
所以你的辨識的結果就變成,
link |
32:05.600
好好好,棒棒棒棒棒,這樣。
link |
32:07.600
而且說,
link |
32:09.600
這不是語音辨識的結果啊,怎麼辦?
link |
32:11.600
你可以有一招叫做trimming,
link |
32:13.600
trimming就是把重複的東西,
link |
32:15.600
拿掉,就變成好棒。
link |
32:17.600
但是這樣會有一個很嚴重的問題,
link |
32:19.600
因為它就沒有辦法辨識好棒棒,這樣子。
link |
32:22.600
不知道的人說一下,
link |
32:23.600
好棒跟好棒棒,
link |
32:24.600
不正好是相反,這樣子。
link |
32:28.600
但是我發現很多人都不知道,
link |
32:30.600
比如說我女朋友工作的地方,
link |
32:32.600
就是有一次他們的老闆說,
link |
32:34.600
我們來編個我們公司的口號吧,
link |
32:37.600
然後就找個台大的人來編,這樣。
link |
32:39.600
然後台大的同事心懷怨恨,
link |
32:41.600
所以就在口號裡面寫著好棒棒,
link |
32:44.600
就某某公司好棒棒,
link |
32:46.600
然後主管都覺得很棒,這樣子,
link |
32:48.600
他們都不知道,
link |
32:49.600
說這個是負面的意思。
link |
32:52.600
所以,
link |
32:53.600
不把好棒跟好棒棒分開來,
link |
32:55.600
是不行的,
link |
32:56.600
所以需要把好棒跟好棒棒分開來,
link |
32:59.600
怎麼辦?
link |
33:01.600
我們要用一招叫做CTC,
link |
33:05.600
要用一招叫CTC。
link |
33:07.600
這一招也是那種說穿了不值錢的方法,
link |
33:10.600
但這一招很神妙,
link |
33:11.600
它說我們在output的時候,
link |
33:14.600
我們不要不只是output所有中文的character,
link |
33:18.600
我們還多output一個符號,
link |
33:22.600
叫做no,
link |
33:23.600
叫做沒有任何東西。
link |
33:26.600
所以今天如果我input一串
link |
33:28.600
acoustic feature sequence,
link |
33:29.600
它的output是好,
link |
33:31.600
no,
link |
33:32.600
棒,
link |
33:33.600
no,
link |
33:34.600
然後我就把no的部分拿掉,
link |
33:37.600
它就變成好棒。
link |
33:39.600
如果我們輸入另外一個sequence,
link |
33:41.600
它的output是好,
link |
33:43.600
no,
link |
33:44.600
棒,
link |
33:45.600
no,
link |
33:46.600
它的output就是好棒棒,
link |
33:48.600
這樣子。
link |
33:49.600
所以就可以解決疊字的問題了。
link |
33:53.600
那在訓練的network的時候,
link |
33:55.600
訓練的時候,
link |
33:56.600
怎麼做呢?
link |
33:57.600
CTC怎麼做訓練呢?
link |
34:00.600
這個也是可以的。
link |
34:02.600
CTC在做訓練,
link |
34:03.600
在做training的時候啊,
link |
34:05.600
你手上的training data,
link |
34:07.600
就會告訴你說,
link |
34:08.600
這一串acoustic feature,
link |
34:10.600
對應到這一串character sequence,
link |
34:13.600
這個sequence對應到這個sequence,
link |
34:16.600
但它不會告訴你說,
link |
34:17.600
好是對應第幾個friend到第幾個friend,
link |
34:20.600
棒是對應第幾個friend,
link |
34:21.600
對應到第幾個friend。
link |
34:23.600
那怎麼辦呢?
link |
34:24.600
窮取所有可能的alignment,
link |
34:27.600
簡單來說就是,
link |
34:29.600
我們不知道好對應到哪幾個friend,
link |
34:31.600
不知道棒對應到好幾個friend,
link |
34:33.600
我們就假設所有的狀況都是可能的,
link |
34:35.600
可能第一個是好,後面接no,
link |
34:37.600
棒後面再接三個no,
link |
34:39.600
可能好,後面接兩個no,
link |
34:40.600
棒後面接兩個no,
link |
34:41.600
可能好,後面接三個no,
link |
34:43.600
棒後面接一個no。
link |
34:45.600
我們不知道哪一個是對的,
link |
34:46.600
就假設全部都是對的,
link |
34:48.600
在training的時候,
link |
34:49.600
全部都當作是正確的一起去training,
link |
34:51.600
可能會想說,窮取所有的可能,
link |
34:54.600
那可能性感覺太多啦,
link |
34:56.600
這個有巧妙的演算法,
link |
34:58.600
可以解決這個問題,
link |
35:00.600
那我們今天就不細講這個部分。
link |
35:04.600
那以下呢,
link |
35:05.600
是在文獻上CDC得到的一個結果,
link |
35:08.600
這個是英文的,
link |
35:10.600
在做英文辨識的時候呢,
link |
35:12.600
你的RNN的output的target,
link |
35:14.600
就是parent,
link |
35:16.600
就是英文的字母,
link |
35:18.600
加上空白,
link |
35:19.600
空白就,你也不需要到,
link |
35:21.600
你也不需要給,
link |
35:22.600
你的RNN詞典啊,
link |
35:23.600
什麼之類的,
link |
35:24.600
它就直接output字母,
link |
35:26.600
然後,
link |
35:27.600
如果到那個字和字之間的boundary,
link |
35:29.600
它自動呢,
link |
35:30.600
就會有空白取得。
link |
35:31.600
以下是一個例子,
link |
35:32.600
第一個frame就output h,
link |
35:35.600
第二個frame就output no,
link |
35:37.600
第三個frame就output no,
link |
35:38.600
第四個frame就output i,
link |
35:40.600
第五個frame就output s,
link |
35:41.600
接下來呢,
link |
35:42.600
output這個,
link |
35:44.600
底線這個代表空白,
link |
35:45.600
output空白,
link |
35:46.600
然後一串no,
link |
35:47.600
然後s,no,no,ri,
link |
35:49.600
no,end,no,no,
link |
35:51.600
一片s,
link |
35:53.600
底線的。
link |
35:54.600
那如果你看到output是這個樣子的話,
link |
35:57.600
那最後你把no的部分拿掉,
link |
35:59.600
這句話辨識的結果,
link |
36:01.600
就是his friend,
link |
36:02.600
你不需要告訴Machine說,
link |
36:04.600
HIS是一個詞彙,
link |
36:06.600
friend是一個詞彙,
link |
36:08.600
Machine透過training data,
link |
36:10.600
它自己會學到這件事情。
link |
36:12.600
那傳說呢,
link |
36:14.600
Google現在的語音辨識系統,
link |
36:16.600
已經全面換成,
link |
36:18.600
這個CTC呢,
link |
36:20.600
來做語音辨識,
link |
36:22.600
如果你用CTC來做語音辨識的話,
link |
36:24.600
就算是有某一個詞彙,
link |
36:26.600
比如說英文的人名地名,
link |
36:28.600
從來在training data裡面沒有出現過,
link |
36:31.600
而是從來不知道這個詞彙,
link |
36:33.600
它其實也有機會把它正確的辨識出來。
link |
36:40.600
另外一個神奇的R的應用呢,
link |
36:42.600
叫做Sequence to Sequence Layer,
link |
36:44.600
在Sequence to Sequence Layer裡面,
link |
36:47.600
Rm的input和output呢,
link |
36:49.600
都是sequence,
link |
36:51.600
但這樣的sequence的長度呢,
link |
36:53.600
是不一樣的。
link |
36:54.600
剛才在講CTC的時候,
link |
36:56.600
input比較長,
link |
36:57.600
output比較短。
link |
36:58.600
在這邊,
link |
36:59.600
我們要考一個case是,
link |
37:01.600
不確定input和output,
link |
37:03.600
誰比較長,
link |
37:04.600
誰比較短。
link |
37:05.600
好,我們現在呢,
link |
37:07.600
來做machine translation,
link |
37:09.600
比如說,我們現在要做的是machine translation,
link |
37:11.600
input英文,
link |
37:13.600
the word sequence,
link |
37:14.600
要把它翻成中文的character sequence。
link |
37:24.600
我們並不知道說,
link |
37:25.600
英文跟中文呢,
link |
37:27.600
誰比較長,
link |
37:28.600
誰比較短。
link |
37:29.600
我們並不知道誰比較長,
link |
37:30.600
誰比較短。
link |
37:31.600
都有可能是output比較長,
link |
37:32.600
也有可能是output比較短。
link |
37:34.600
所以怎麼辦呢?
link |
37:36.600
現在假如input是machine learning,
link |
37:39.600
那我們就把machine learning用RNN讀過去,
link |
37:43.600
用RNN讀過去,
link |
37:45.600
然後呢,
link |
37:46.600
在最後的,
link |
37:48.600
然後呢,
link |
37:49.600
把machine learning呢,
link |
37:51.600
用RNN讀過去,
link |
37:53.600
然後在最後一個時間點呢,
link |
37:56.600
這個memory裡面呢,
link |
37:58.600
就存了所有input的整個sequence的information。
link |
38:04.600
然後接下來呢,
link |
38:05.600
你就讓machine to一個character,
link |
38:08.600
比如說就湯可熙,
link |
38:09.600
他第一個做的character呢,
link |
38:11.600
就是機。
link |
38:12.600
你把machine learning,
link |
38:13.600
讓machine讀過一遍,
link |
38:14.600
然後再讓他output character,
link |
38:16.600
他可能就會output機。
link |
38:18.600
然後接下來呢,
link |
38:19.600
再叫他output下一個character,
link |
38:21.600
你把之前output出來的character呢,
link |
38:23.600
當作input,
link |
38:24.600
再把memory裡面存的詞讀進來,
link |
38:27.600
他就會output器這樣子。
link |
38:29.600
那這個東西,
link |
38:32.600
這個機呢,
link |
38:33.600
要怎麼接到這裡,
link |
38:35.600
這個地方呢,
link |
38:36.600
有很多枝枝節節的技巧。
link |
38:39.600
如果這個太多了,
link |
38:43.600
這個以後呢,
link |
38:44.600
我們再講一下。
link |
38:45.600
這個以後,
link |
38:46.600
或許下學期在MLDS再講。
link |
38:49.600
這個其實有很多枝枝節節的地方,
link |
38:52.600
還有很多各種不同的變形。
link |
38:56.600
好,那他在下一個時間點,
link |
38:59.600
氣以後呢,
link |
39:00.600
他就output學,
link |
39:01.600
然後學呢,
link |
39:02.600
後面就output習,
link |
39:03.600
然後他就會一直output下去。
link |
39:06.600
習後面接慣,
link |
39:07.600
慣後面接習。
link |
39:08.600
永遠呢,
link |
39:09.600
都不停止。
link |
39:10.600
第一次看到這個model想說,
link |
39:12.600
哇,
link |
39:13.600
有這work嗎?
link |
39:14.600
你根本不知道什麼時候該停止。
link |
39:17.600
那怎麼辦呢?
link |
39:18.600
這就讓我想到這個,
link |
39:19.600
推文接龍。
link |
39:21.600
我不知道大家知不知道,
link |
39:22.600
推文接龍是什麼,
link |
39:24.600
也不知道要講一下。
link |
39:25.600
這個從鄉民百科上,
link |
39:26.600
抄下來的啦。
link |
39:28.600
推文接龍是,
link |
39:29.600
推文中的一種趣味的玩法,
link |
39:31.600
他推習有點類似,
link |
39:33.600
但又有所不同。
link |
39:34.600
是在推文中接去上一樓的句子,
link |
39:36.600
推出連續的意思。
link |
39:37.600
他就是起源於不可靠。
link |
39:39.600
也就是說,
link |
39:40.600
有一個人推抄以後,
link |
39:41.600
下一個人就是推人,
link |
39:42.600
然後人後面再推正,
link |
39:44.600
然後一直推推推。
link |
39:45.600
他可能推好幾個月,
link |
39:46.600
然後都不會停下來。
link |
39:47.600
我也不知道為什麼會這樣,
link |
39:48.600
他不會停下來。
link |
39:50.600
那你要怎麼讓他停下來呢?
link |
39:52.600
你要怎麼讓他停下來?
link |
39:53.600
你要有一個人冒險去推一個段,
link |
39:55.600
他就會停下來了。
link |
39:57.600
其實也不會停下來啦。
link |
40:00.600
你要推一個段,
link |
40:01.600
他就會停下來。
link |
40:03.600
所以今天讓Machine做的事情,
link |
40:04.600
也是一樣。
link |
40:05.600
要如何阻止他不斷地繼續產生智慧呢?
link |
40:08.600
你要多加一個symbol叫做段。
link |
40:11.600
所以Machine現在不只是
link |
40:12.600
output所有可能的character,
link |
40:14.600
他還有一個可能的output叫做段。
link |
40:17.600
所以如果今天期後面呢,
link |
40:19.600
他的output是段的話,
link |
40:21.600
就停下來。
link |
40:24.600
你可能覺得說,
link |
40:25.600
這個東西勸得起來嗎?
link |
40:27.600
勸得起來。
link |
40:28.600
所以神奇的就是,
link |
40:30.600
這一招是有用的。
link |
40:32.600
他也有被用在語音辨識上,
link |
40:34.600
也就直接input
link |
40:35.600
acoustic feature sequence,
link |
40:36.600
直接就output
link |
40:37.600
character sequence。
link |
40:39.600
只是這個方法還沒有CT值強,
link |
40:41.600
所以這個方法
link |
40:42.600
還不是state-of-the-art的結果。
link |
40:44.600
但讓人真的surprise的地方就是,
link |
40:46.600
這麼做,
link |
40:47.600
事情得通,
link |
40:48.600
然後他的結果
link |
40:49.600
是沒有爛掉的。
link |
40:53.600
在翻譯上呢,
link |
40:54.600
倒是據說用這個方法,
link |
40:55.600
已經可以達到state-of-the-art的結果。
link |
41:00.600
那最近呢,
link |
41:01.600
這個是,
link |
41:02.600
應該是Google Print
link |
41:03.600
在12月初的時候發的paper,
link |
41:05.600
所以是周前放在Rx上面的paper。
link |
41:08.600
他們做了一件事情,
link |
41:10.600
我相信這件事情
link |
41:11.600
很多人都想到,
link |
41:12.600
只是沒人去做。
link |
41:13.600
他的想法是這樣,
link |
41:14.600
sequence-to-sequence learning,
link |
41:16.600
我們原來是input,
link |
41:17.600
假設做翻譯的話,
link |
41:19.600
也就是input某種語言的文字,
link |
41:22.600
然後翻譯成另外一種語言的文字。
link |
41:24.600
那我們有沒有可能,
link |
41:26.600
直接input某種語言的聲音訊號,
link |
41:29.600
output另外一種語言的文字呢?
link |
41:32.600
我們完全不做語音辨識,
link |
41:35.600
你就直接,
link |
41:37.600
比如說你要把中文翻成,
link |
41:40.600
你要把英文翻成中文,
link |
41:41.600
你就蒐集一大堆英文的句子,
link |
41:44.600
看它對應的中文翻譯,
link |
41:46.600
你完全不要做語音辨識,
link |
41:47.600
直接把英文的聲音訊號,
link |
41:49.600
丟到這個model裡面去,
link |
41:51.600
看它能不能夠output正確的中文。
link |
41:53.600
結果這招居然是,
link |
41:55.600
看起來是行得通的,
link |
41:57.600
我相信很多人想過,
link |
41:58.600
這邊大家覺得做不起來,
link |
42:00.600
所以沒有人去試,
link |
42:01.600
但這招看起來是行得通的,
link |
42:03.600
可以直接input一串法文的聲音訊號,
link |
42:07.600
然後model就得到辨識的結果,
link |
42:13.600
model得到辨識的結果,
link |
42:15.600
這件事情是還蠻surprise的,
link |
42:17.600
如果這個東西能夠成功的話,
link |
42:20.600
它可以帶給我們的好處是,
link |
42:24.600
如果你今天在collect translation training data的時候,
link |
42:34.600
會比較容易,
link |
42:35.600
假設你今天要把某種方言,
link |
42:37.600
比如說台語,
link |
42:38.600
轉成英文,
link |
42:40.600
但是台語的語音辨識系統,
link |
42:43.600
其實比較不好做了,
link |
42:44.600
因為台語你可能根本就沒有,
link |
42:47.600
standard的文字的系統,
link |
42:50.600
所以你要找人來label台語的文字,
link |
42:51.600
可能也有點麻煩,
link |
42:53.600
如果這招這樣的技術是可以成功的話,
link |
42:56.600
未來你在訓練台語轉英文的語音辨識系統的時候,
link |
42:59.600
你只需要蒐集台語的聲音訊號,
link |
43:02.600
跟它的英文的翻譯就可以了,
link |
43:06.600
你就不需要台語的語音辨識的結果,
link |
43:10.600
也就不需要知道台語的文字,
link |
43:12.600
你也可以做這種翻譯,
link |
43:17.600
另外現在還可以用sequence to sequence的技術,
link |
43:22.600
甚至可以做到beyond sequence,
link |
43:33.600
比如說這個技術,
link |
43:35.600
也被用在syntactic的parsing tree裡面,
link |
43:39.600
用在產生syntactic的parsing tree上面,
link |
43:43.600
這個syntactic的parsing tree是什麼呢?
link |
43:46.600
意思就是讓machine開一個句子,
link |
43:49.600
然後它要得到這個句子的文法的結構樹,
link |
43:53.600
然後得到一個樹狀的結構,
link |
44:04.600
要怎麼讓machine得到這樣子的樹狀的結構呢?
link |
44:08.600
過去你可能要用structure learning的技術,
link |
44:12.600
才能夠解這個問題,
link |
44:18.600
但現在有了sequence to sequence learning的技術以後,
link |
44:21.600
你只要把這個樹狀圖描述成一個sequence,
link |
44:27.600
比如說樹狀圖怎麼描述成sequence,
link |
44:29.600
當然可以描述成一個sequence,
link |
44:31.600
看這個是root的地方是S,
link |
44:34.600
所以這是S的左括號,
link |
44:36.600
這是S的右括號,
link |
44:38.600
它下面有NP跟DP,
link |
44:40.600
所以有NP的左括號,NP的右括號,
link |
44:42.600
DP的左括號,DP的右括號,
link |
44:44.600
NP下面有NNP,
link |
44:46.600
DP下面有DPC,
link |
44:48.600
NP,DP下面有DPC,
link |
44:50.600
NP,NP下面有DPC跟NNP等等,
link |
44:54.600
所以它有一個sequence,
link |
45:00.600
所以如果今天是sequence to sequence learning的話,
link |
45:03.600
你就直接run一個sequence to sequence的model,
link |
45:06.600
它的output直接是syntactic的發進去,
link |
45:10.600
它直接output這個是syntactic的發進去,
link |
45:13.600
就可以了,
link |
45:15.600
就用這樣子train,
link |
45:17.600
你可能覺得說這樣真的train得起來嗎?
link |
45:19.600
可以train得起來,
link |
45:21.600
很surprise,非常surprise,
link |
45:23.600
當然你可能會想說,
link |
45:27.600
如果我們訓練今天它長出來的output sequence,
link |
45:31.600
如果它不合文法結構呢?
link |
45:33.600
如果它記得加左括號,
link |
45:35.600
卻忘了加右括號呢?
link |
45:37.600
但是神奇的地方就是,
link |
45:39.600
LSTM它有記憶力,
link |
45:41.600
所以它不會忘記加上右括號。
link |
45:45.600
好,那我們之前呢,
link |
45:47.600
講過word vector,
link |
45:49.600
那我們說,
link |
45:51.600
如果我們要把一個document,
link |
45:53.600
表示成一個vector的話,
link |
45:55.600
往往會用backword這樣的方法,
link |
45:57.600
但當我們用backword這樣的方法的時候呢,
link |
45:59.600
我們就會忽略掉這個word order的information,
link |
46:05.600
舉例來說,
link |
46:07.600
有一個word sequence是,
link |
46:09.600
white blood cell,
link |
46:11.600
destroyed an infection,
link |
46:13.600
另外一個word sequence是infection,
link |
46:15.600
destroyed white blood cell,
link |
46:17.600
這兩句話的意思完全是相反,
link |
46:19.600
但是如果你用backword來描述它的話,
link |
46:21.600
它們的這個backword呢,
link |
46:25.600
完全是一樣的,
link |
46:27.600
它裡面有一模一樣的六個詞彙,
link |
46:31.600
但是因為這個詞彙的order是不一樣的,
link |
46:33.600
所以它們的意思,
link |
46:35.600
一個變成是positive,
link |
46:37.600
另外一個變成是negative,
link |
46:39.600
它們的意思呢,
link |
46:41.600
是很不一樣的。
link |
46:43.600
那我們可以用sequence to sequence,
link |
46:45.600
open code的這種做法,
link |
46:47.600
來在有考慮word sequence的order的情況下,
link |
46:51.600
把一個document變成一個vector。
link |
46:55.600
怎麼做呢?
link |
46:57.600
怎麼做呢?
link |
46:59.600
我們就input一個word sequence,
link |
47:01.600
Mary was hungry,
link |
47:03.600
she didn't find any food,
link |
47:05.600
然後通過一個recurrent neural network,
link |
47:07.600
把它變成一個embedded vector,
link |
47:11.600
然後再把這個embedded vector,
link |
47:13.600
當作這個decoder的輸入,
link |
47:15.600
然後讓這個decoder呢,
link |
47:19.600
找回一個一模一樣的句子。
link |
47:21.600
如果今天呢,
link |
47:23.600
recurrent neural network,
link |
47:25.600
可以做到這件事情的話,
link |
47:27.600
那encoding的這個vector,
link |
47:29.600
就代表了這個input sequence裡面,
link |
47:31.600
重要的information,
link |
47:33.600
所以這個decoder呢,
link |
47:35.600
才能夠根據這個encoder的vector,
link |
47:37.600
把這個訊號呢,
link |
47:39.600
把這個decode回來。
link |
47:41.600
你train這個sequence to sequence,
link |
47:43.600
autoencoder的時候,
link |
47:45.600
你是不需要level data的,
link |
47:47.600
你只需要收集到大量的文章,
link |
47:49.600
你只需要收集到大量的文章,
link |
47:51.600
然後直接train下去,就好了。
link |
47:53.600
那這個sequence to sequence,
link |
47:55.600
autoencoder呢,
link |
47:57.600
還有另外一個版本呢,
link |
47:59.600
叫做skip soul,
link |
48:01.600
當你用skip soul的時候,
link |
48:03.600
如果是用sequence to sequence,
link |
48:05.600
autoencoder,
link |
48:07.600
input跟output都是同一個句子。
link |
48:09.600
如果你用skip soul的話,
link |
48:11.600
你output的target呢,
link |
48:13.600
會是下一個句子。
link |
48:15.600
如果你用sequence to sequence,
link |
48:17.600
autoencoder,
link |
48:19.600
用skip soul呢,
link |
48:21.600
可能會得到比較好的結果。
link |
48:23.600
這個結構呢,甚至可以是
link |
48:25.600
hierarchy,
link |
48:27.600
你可以每一個句子,
link |
48:29.600
都先得到一個vector,
link |
48:31.600
Mary was hungry得到一個vector,
link |
48:33.600
She didn't find any food得到一個vector,
link |
48:35.600
我再把這些vector呢,
link |
48:37.600
用,
link |
48:39.600
把這些vector呢,加起來,
link |
48:41.600
然後變成
link |
48:43.600
一個整個document
link |
48:45.600
high level的vector,
link |
48:47.600
去產生一串
link |
48:49.600
sentence的vector,
link |
48:51.600
再根據每一個sentence的vector,
link |
48:53.600
再去解回
link |
48:55.600
這個word sequence,
link |
48:57.600
所以這是一個四層的
link |
48:59.600
LSTM,
link |
49:01.600
你從word變成
link |
49:03.600
sentence的sequence,
link |
49:05.600
再變成document level的東西,
link |
49:07.600
再解回sentence的sequence,
link |
49:09.600
再解回word的sequence,
link |
49:11.600
這個東西呢,也是可以train的。
link |
49:13.600
那剛才的東西呢,
link |
49:15.600
也可以被用在語音上,
link |
49:17.600
sequence是sequence的auto-encoder,
link |
49:19.600
除了被用在文字上,
link |
49:21.600
可以用在語音上,
link |
49:23.600
如果在語音上的話,
link |
49:25.600
它可以做到的事情呢,
link |
49:27.600
就是它可以把一段呢,
link |
49:29.600
audio的segment,
link |
49:31.600
把它變成一個fixed length的vector,
link |
49:37.600
比如說,
link |
49:39.600
它可以把動變成,
link |
49:41.600
比如說,
link |
49:43.600
這邊有一堆聲音訊號,
link |
49:45.600
它們長長短短的都不一樣,
link |
49:47.600
那你把它們變成vector的話,
link |
49:49.600
可能動跟動的vector比較接近,
link |
49:51.600
可能never
link |
49:53.600
和ever的vector
link |
49:55.600
是比較接近的。
link |
49:57.600
那這個呢,
link |
49:59.600
我稱之為audio的word vector,
link |
50:01.600
就像一般的word vector,
link |
50:03.600
它是把一個word變成一個vector,
link |
50:05.600
也就是把一段聲音訊號,
link |
50:07.600
變成一個vector,
link |
50:11.600
那這個東西呢,
link |
50:13.600
你可以把它用在,
link |
50:15.600
有什麼用呢?
link |
50:17.600
一開始在想這個的時候,
link |
50:19.600
我覺得應該就沒有什麼用,
link |
50:21.600
但是它其實可以拿來做很多事,
link |
50:23.600
比如說,
link |
50:25.600
我們可以拿來做語音的搜尋,
link |
50:27.600
什麼是語音的搜尋呢?
link |
50:29.600
可能你有一個聲音的database,
link |
50:31.600
比如說上課的錄音,
link |
50:33.600
然後你說一句話,
link |
50:35.600
美國白宮有關的東西,
link |
50:37.600
用說的說美國白宮,
link |
50:39.600
然後不需要做語音辨識,
link |
50:41.600
直接比對聲音訊號的相似度,
link |
50:43.600
machine就可以從database裡面,
link |
50:45.600
把有提到美國白宮的部分找出來。
link |
50:47.600
那這個怎麼做呢?
link |
50:49.600
你就先把,也有一個audio的database,
link |
50:51.600
把這個database呢,
link |
50:53.600
做segmentation,切成一段一段,
link |
50:55.600
然後每一段呢,
link |
50:57.600
用剛才講的,
link |
50:59.600
這個audio segment to vector的技術呢,
link |
51:01.600
又把它們呢,
link |
51:03.600
通通變成vector。
link |
51:05.600
然後現在呢,
link |
51:07.600
使用者輸入一個query,
link |
51:09.600
這個query呢,也是語音的,
link |
51:11.600
透過audio segment to vector的技術呢,
link |
51:13.600
可以把這段聲音訊號呢,
link |
51:15.600
也變成vector。
link |
51:17.600
然後接下來呢,
link |
51:19.600
計算它們的相似程度,
link |
51:21.600
接下來呢,計算它們的相似程度,
link |
51:23.600
然後呢,
link |
51:25.600
就得到這個搜尋的結果。
link |
51:27.600
搜尋的結果。
link |
51:37.600
然後就得到搜尋的結果。
link |
51:39.600
然後呢,
link |
51:41.600
那這件事情怎麼做呢?
link |
51:43.600
怎麼把一個audio的segment,
link |
51:45.600
變成一個vector呢?
link |
51:47.600
做法是這樣,
link |
51:49.600
先把audio的segment呢,
link |
51:51.600
抽成acoustic feature sequence,
link |
51:53.600
然後呢,
link |
51:55.600
把它存在recurrent neural network裡面去,
link |
51:57.600
而這個recurrent neural network呢,
link |
51:59.600
它的角色就是一個encoder。
link |
52:01.600
而這個recurrent neural network,
link |
52:03.600
它讀過這個acoustic feature sequence以後,
link |
52:05.600
它存在memory裡面的值,
link |
52:07.600
就代表了,
link |
52:09.600
它在最後一個時間點,
link |
52:11.600
存在這個memory裡面的值,
link |
52:13.600
就代表了整個input的聲音訊號,
link |
52:15.600
它的這個information。
link |
52:17.600
那這一個,
link |
52:19.600
它存在memory裡面的值是一個vector,
link |
52:21.600
這個東西,其實就是我們要拿來
link |
52:23.600
代表是一整段聲音訊號的vector。
link |
52:25.600
但是只有這個Rn的encoder,
link |
52:27.600
我們沒有辦法train,
link |
52:29.600
你要同時呢,還要train一個Rn的decoder。
link |
52:31.600
Rn decoder它的作用呢,
link |
52:33.600
就是它把encoder存在memory裡面的值呢,
link |
52:37.600
拿進來當作input,
link |
52:39.600
然後產生一個acoustic feature sequence。
link |
52:43.600
那你會希望說,這個y1跟x1呢,
link |
52:45.600
越接近越好。
link |
52:47.600
然後根據y1,
link |
52:49.600
再產生y2,再產生y3,
link |
52:51.600
再產生y4。
link |
52:53.600
而今天訓練的target,
link |
52:55.600
就是希望y1到y4,
link |
52:57.600
跟x1到x4,
link |
52:59.600
它們呢,是越接近呢,
link |
53:01.600
越好的。
link |
53:03.600
那在訓練的時候,
link |
53:05.600
這個Rn的encoder,
link |
53:07.600
和Rn的decoder,
link |
53:09.600
它們是joining了。
link |
53:11.600
這個Rn的encoder,
link |
53:13.600
跟Rn的decoder呢,
link |
53:15.600
它們是一起train的。
link |
53:17.600
如果只有Rn的encoder,
link |
53:19.600
它們只有一個人,是沒有辦法train。
link |
53:21.600
但是把它們兩個接起來,
link |
53:23.600
你就有一個target,
link |
53:25.600
可以一路從這邊的backup給回來,
link |
53:27.600
你就可以同時trainRn的encoder,
link |
53:29.600
跟decoder。
link |
53:31.600
那這邊呢,是我們在實驗上呢,
link |
53:33.600
得到的一些有趣的結果。
link |
53:35.600
在這圖上每一個點呢,
link |
53:37.600
其實都是一段聲音訊號。
link |
53:39.600
你把聲音訊號用剛才講的,
link |
53:41.600
這個sequence to sequence encoder技術呢,
link |
53:43.600
把它變成平面上的一個vector,
link |
53:45.600
來發現說,
link |
53:47.600
near的位置在左上角,
link |
53:49.600
near的位置在右下角,
link |
53:51.600
它們中間是這樣的關係。
link |
53:53.600
fan的位置在左上角,
link |
53:55.600
fan的位置在右下角,
link |
53:57.600
它們中間有一個這樣子的關係。
link |
53:59.600
那你會發現說,
link |
54:01.600
把near的開頭的f換成n,
link |
54:03.600
跟fan開頭的f換成n,
link |
54:05.600
它們的這個word vector的變化呢,
link |
54:07.600
方向是一樣的。
link |
54:09.600
就好像我們之前看到的,
link |
54:11.600
這個vector一樣。
link |
54:13.600
就好像我們之前看到的文字的word vector一樣。
link |
54:15.600
不過這邊的這個vector,
link |
54:17.600
還沒有辦法考慮,
link |
54:19.600
考慮semantic語意的information。
link |
54:21.600
那我們下一步要做的事情呢,
link |
54:23.600
就是把語意加進去。
link |
54:25.600
但這個部分呢,現在還沒有完成。
link |
54:27.600
那接下來我有一個demo,
link |
54:29.600
這個demo呢,
link |
54:31.600
是用sequence to sequence autoencoder呢,
link |
54:33.600
來訓練一個chattbot。
link |
54:35.600
所謂chattbot就是聊天機器人。
link |
54:37.600
到現在呢,很流行的做聊天機器人。
link |
54:39.600
那怎麼用這種sequence to sequence呢?
link |
54:41.600
那怎麼用這種sequence to sequence呢?
link |
54:43.600
怎麼用這種sequence to sequence autoencoder呢?
link |
54:45.600
怎麼用這種sequence to sequence learning
link |
54:47.600
來train一個chattbot呢?
link |
54:49.600
你就收集很多的對話,
link |
54:51.600
比如說電影的台詞。
link |
54:53.600
假設電影的台詞裡面,
link |
54:55.600
有某一個人說How are you?
link |
54:57.600
然後另外一個人直接按fine。
link |
54:59.600
那就告訴我們就是說,
link |
55:01.600
這個sequence to sequence learning它的input,
link |
55:03.600
當它的input是How are you?的時候,
link |
55:05.600
這一個model的output呢,
link |
55:07.600
就要是按fine。
link |
55:09.600
那你可以收集到這種data,
link |
55:11.600
然後呢,就讓Machine去train。
link |
55:13.600
然後我們就
link |
55:15.600
收集了四萬句的電視影集,
link |
55:17.600
和美國總統大選的辯論的句子,
link |
55:19.600
然後讓Machine呢,
link |
55:21.600
去學這一個sequence to sequence的model。
link |
55:23.600
去學這一個sequence to sequence的model。
link |
55:25.600
去學這一個sequence to sequence的model。
link |
55:27.600
這個是跟中央大學蔡同漢老師的團隊一起開發的。
link |
55:29.600
是跟中央大學蔡同漢老師的團隊一起開發的。
link |
55:31.600
是跟中央大學蔡同漢老師的團隊一起開發的。
link |
55:33.600
作為同學呢,
link |
55:35.600
台大這邊就有李志偉和盧波魯。
link |
55:37.600
我們來。
link |
55:41.600
好,那其實現在除了RNN以外呢,
link |
55:43.600
好,那其實現在除了RNN以外呢,
link |
55:45.600
還有另外一種有用到memory的network,
link |
55:47.600
還有另外一種有用到memory的network,
link |
55:49.600
叫做tension-based model。
link |
55:51.600
它可以想成是RNN的一個進階的版本。
link |
55:53.600
它可以想成是RNN的一個進階的版本。
link |
55:55.600
那我們知道說呢,
link |
55:57.600
人的大腦有非常強的記憶力。
link |
55:59.600
人的大腦呢,
link |
56:01.600
有非常強的記憶力。
link |
56:03.600
所以你可以記得非常非常多的東西,
link |
56:05.600
所以你可以記得非常非常多的東西,
link |
56:07.600
比如說你現在可能同時記得早餐吃了什麼,
link |
56:09.600
比如說你現在可能同時記得早餐吃了什麼,
link |
56:11.600
可能同時記得十年前中二的夏天發生了什麼事,
link |
56:13.600
可能同時記得十年前中二的夏天發生了什麼事,
link |
56:15.600
可能同時記得在這幾門課裡面學到的東西。
link |
56:17.600
可能同時記得在這幾門課裡面學到的東西。
link |
56:19.600
那當然有人問你說什麼是deep learning的時候,
link |
56:21.600
那當然有人問你說什麼是deep learning的時候,
link |
56:23.600
那你的腦中呢,
link |
56:25.600
會去提取重要的information,
link |
56:27.600
然後再把這些information組織起來產生答案。
link |
56:29.600
然後再把這些information組織起來產生答案。
link |
56:31.600
然後再把這些information組織起來產生答案。
link |
56:33.600
但是呢,
link |
56:35.600
你的腦會自動忽略掉那些無關的事情,
link |
56:37.600
你的腦會自動忽略掉那些無關的事情,
link |
56:39.600
比如說十年前中二的夏天發生的事情,
link |
56:41.600
比如說十年前中二的夏天發生的事情,
link |
56:43.600
那其實呢,
link |
56:45.600
machine也可以做到類似的事情。
link |
56:47.600
machine也可以有很大的記憶的容量,
link |
56:49.600
machine也可以有很大的記憶的容量,
link |
56:51.600
它也可以有一個很大的database,
link |
56:53.600
它也可以有一個很大的database,
link |
56:55.600
在這個database裡面的每一個vector,
link |
56:57.600
就代表了某種information被存在machine的記憶裡面。
link |
56:59.600
就代表了某種information被存在machine的記憶裡面。
link |
57:01.600
當你輸入一個input的時候,
link |
57:03.600
這個input會被丟進一個中央處理器,
link |
57:05.600
這個中央處理器可能是一個DNN,
link |
57:07.600
或者是一個RNN。
link |
57:09.600
那這個中央處理器呢,
link |
57:11.600
會操控一個讀寫頭,
link |
57:13.600
會操控一個讀寫頭,
link |
57:15.600
會操控一個讀寫頭,
link |
57:17.600
這個reading head controller呢,
link |
57:19.600
會去決定呢,
link |
57:21.600
這個reading head放的位置。
link |
57:23.600
然後machine再從這個reading head放的位置裡面,
link |
57:25.600
去讀取information出來。
link |
57:27.600
去讀取information出來。
link |
57:29.600
然後呢,產生最後的open。
link |
57:31.600
然後呢,產生最後的open。
link |
57:33.600
那我們就不打算細講這樣的model,
link |
57:35.600
如果你有興趣的話,
link |
57:37.600
可以參考我之前上課的錄影。
link |
57:39.600
那這個model呢,
link |
57:41.600
還有一個2.0的版本。
link |
57:43.600
還有一個2.0的版本。
link |
57:45.600
這個2.0的版本呢,
link |
57:47.600
這個2.0的版本呢,
link |
57:49.600
它呢,會去操控一個writing head的controller。
link |
57:51.600
它呢,會去操控一個writing head的controller。
link |
57:53.600
這個writing head的controller呢,
link |
57:55.600
會去決定呢,writing head放的位置。
link |
57:57.600
然後呢,machine會去把它的information,
link |
57:59.600
透過這個writing head呢,
link |
58:01.600
寫進它的database裡面。
link |
58:03.600
寫進它的database裡面。
link |
58:05.600
所以它不只是有讀的功能,
link |
58:07.600
還可以把資訊呢,
link |
58:09.600
它discover出來的東西,
link |
58:11.600
寫到它的memory裡面去。
link |
58:13.600
寫到它的memory裡面去。
link |
58:15.600
這個東西呢,就是大名鼎鼎的
link |
58:17.600
neural turing machine。
link |
58:19.600
這些其實都是很新的東西,
link |
58:21.600
有些neural turing machine應該是在,
link |
58:23.600
我想想看,
link |
58:25.600
14年的年底的時候,
link |
58:27.600
14年的年底的時候,
link |
58:29.600
提出來的。
link |
58:31.600
我忘了,
link |
58:33.600
我忘了,
link |
58:35.600
不知道是15年初,
link |
58:37.600
還是14年年底的時候提出來的。
link |
58:39.600
還是14年年底的時候提出來的。
link |
58:41.600
所以都是很新的東西。
link |
58:43.600
現在這樣的attention-based model,
link |
58:45.600
常常被用在reading comprehension裡面。
link |
58:47.600
常常被用在reading comprehension裡面。
link |
58:49.600
所謂的reading comprehension呢,
link |
58:51.600
就是讓machine去讀一堆document,
link |
58:53.600
然後把這些document裡面的內容,
link |
58:55.600
每一句話呢,
link |
58:57.600
變成一個vector,
link |
58:59.600
而這句話裡面,
link |
59:01.600
每一個vector呢,
link |
59:03.600
代表了某一句話的語意,
link |
59:05.600
代表某一句話的semantics。
link |
59:07.600
而接下來呢,
link |
59:09.600
你問machine一個問題,
link |
59:11.600
比如說,日上有多高啊,什麼之類的。
link |
59:13.600
然後呢,這個問題,
link |
59:15.600
被丟進一個中央處理器裡面,
link |
59:17.600
那這個中央處理器呢,
link |
59:19.600
去控制了一個reading head controller,
link |
59:21.600
去決定說,
link |
59:23.600
現在在這個database裡面,
link |
59:25.600
哪些句子是跟
link |
59:27.600
中央處理器呢,
link |
59:29.600
有關的。
link |
59:31.600
假設呢,machine發現說這個句子,
link |
59:33.600
是跟現在的問題呢,是有關的,
link |
59:35.600
它就把reading head放在這個地方,
link |
59:37.600
把information讀到中央處理器裡面。
link |
59:39.600
這個讀取information的過程,
link |
59:41.600
它可以是incorrect,
link |
59:43.600
它可以是重複數次讀。
link |
59:45.600
也就是說,machine
link |
59:47.600
並不會只從一個地方讀取information,
link |
59:49.600
它先從這裡讀取information以後,
link |
59:51.600
它還可以換一個位置,
link |
59:53.600
從另外一個地方,
link |
59:55.600
再去讀取information。
link |
59:57.600
那它把所有它讀到的information,
link |
59:59.600
collect起來,它可以給你一個
link |
01:00:01.600
最終的答案。
link |
01:00:03.600
以下呢,是Facebook AI Research
link |
01:00:05.600
在一個,
link |
01:00:07.600
在這個Baby這個Corpus上面的一個
link |
01:00:09.600
實驗結果。
link |
01:00:11.600
它是一個實驗結果。
link |
01:00:13.600
那Baby這個Corpus呢,是一個QA
link |
01:00:15.600
question engine的test,它其實是
link |
01:00:17.600
比較簡單的一個test,
link |
01:00:19.600
那有很多用template產生的
link |
01:00:21.600
document,和一些簡單的問題,
link |
01:00:23.600
那我們需要回答這個問題。
link |
01:00:25.600
我們需要做的事情就是,讀過這五個句子,
link |
01:00:27.600
來問它說,what color is gray?
link |
01:00:29.600
那它要得到正確的答案,yes。
link |
01:00:31.600
那你可以從
link |
01:00:33.600
machine attention的位置,
link |
01:00:35.600
也就是它reading head的位置,
link |
01:00:37.600
看出machine的思路。
link |
01:00:39.600
這邊的藍色,代表了
link |
01:00:41.600
machine的reading head放著的位置。
link |
01:00:43.600
那這個,
link |
01:00:45.600
1 hop 2 hop 2,代表
link |
01:00:47.600
1 hop 2 hop 3,代表的是時間。
link |
01:00:49.600
也就是說,在第一個時間點,
link |
01:00:51.600
machine呢,先把它的reading head
link |
01:00:53.600
放在gray is a frog,
link |
01:00:55.600
所以它把這個information提取出來,
link |
01:00:57.600
它提取gray is a frog的information,
link |
01:00:59.600
而接下來呢,它再提取
link |
01:01:01.600
brown is a frog的information,
link |
01:01:03.600
那接下來它再提取
link |
01:01:05.600
brown is yellow的information,
link |
01:01:07.600
最後呢,它就得到結論說,
link |
01:01:09.600
答案呢,gray的顏色,
link |
01:01:11.600
是yellow的。
link |
01:01:13.600
那這些事情呢,是machine自動
link |
01:01:15.600
認出來的,也就是machine要attent在
link |
01:01:17.600
哪一個位置,這些
link |
01:01:19.600
是透過
link |
01:01:21.600
neural network自己去
link |
01:01:23.600
學到,知道怎麼做的。也就是說,
link |
01:01:25.600
並不是去寫程式,告訴machine說
link |
01:01:27.600
你要先看這個句子,再看
link |
01:01:29.600
這個句子,再看這個句子,不是,是machine
link |
01:01:31.600
自動去決定,你要看哪一個句子。
link |
01:01:33.600
那也可以
link |
01:01:35.600
做visual question answering,
link |
01:01:37.600
visual question answering就是
link |
01:01:39.600
讓machine看一張圖,
link |
01:01:41.600
問它一個問題,問它這是什麼。
link |
01:01:43.600
如果它可以正確回答是香蕉的話呢,
link |
01:01:45.600
它就超越部分的人類了。
link |
01:01:47.600
那這個visual
link |
01:01:49.600
question answering怎麼做呢?
link |
01:01:51.600
這個visual question answering就讓machine
link |
01:01:53.600
看一張圖,然後呢,透過
link |
01:01:55.600
CNN呢,你可以把這個圖的
link |
01:01:57.600
每一小塊region
link |
01:01:59.600
用一個vector
link |
01:02:01.600
來表示。
link |
01:02:03.600
那接下來呢,輸入一個
link |
01:02:05.600
query,然後
link |
01:02:07.600
這個query呢,被丟到
link |
01:02:09.600
中央處理器裡面,那這個
link |
01:02:11.600
中央處理器呢,去
link |
01:02:13.600
操控了reading head
link |
01:02:15.600
的controller,那這個reading head的controller呢
link |
01:02:17.600
決定了
link |
01:02:19.600
它要
link |
01:02:21.600
讀取資訊的位置,
link |
01:02:23.600
看看這個圖片的什麼位置呢,
link |
01:02:25.600
是跟現在輸入的問題呢
link |
01:02:27.600
是有關的,那把information讀到
link |
01:02:29.600
中央處理器裡面,那這個
link |
01:02:31.600
讀取的process呢,
link |
01:02:33.600
可能有好幾個步驟,我們會分好幾次呢
link |
01:02:35.600
把information讀到中央處理器裡面
link |
01:02:37.600
最後得到答案。
link |
01:02:39.600
好,那
link |
01:02:41.600
也可以做語音的
link |
01:02:43.600
這個question answer,比如說
link |
01:02:45.600
在語音處理實驗室
link |
01:02:47.600
我們讓machine做
link |
01:02:49.600
托福的聽力測驗。
link |
01:02:51.600
托福聽力測驗就是
link |
01:02:53.600
讓machine聽一段聲音,然後呢
link |
01:02:55.600
問它問題,
link |
01:02:57.600
然後從
link |
01:02:59.600
四個正確的選項裡面呢,machine
link |
01:03:01.600
要回,選出正確的選項。
link |
01:03:03.600
那machine做的事情,跟
link |
01:03:05.600
人類考生做的事情,
link |
01:03:07.600
是一模一樣。我們用來
link |
01:03:09.600
訓練和測試machine的資料,
link |
01:03:11.600
就是托福聽力測驗的資料。
link |
01:03:15.600
那用的model architecture呢,
link |
01:03:17.600
跟我們剛才看到的呢,
link |
01:03:19.600
其實就是大同小異。
link |
01:03:21.600
你讓machine呢,先
link |
01:03:23.600
讀一下question,
link |
01:03:25.600
讓machine先讀一下question,然後把這個
link |
01:03:27.600
question呢,做語音的分析,
link |
01:03:29.600
得到這個question的語意。
link |
01:03:31.600
那聲音的部分呢,
link |
01:03:33.600
用語音辨識把它轉成文字,
link |
01:03:35.600
那再把這些文字呢,
link |
01:03:37.600
做語意的分析,
link |
01:03:39.600
得到這段文字的語意。
link |
01:03:41.600
那麼machine了解了question的
link |
01:03:43.600
問題的語意和
link |
01:03:45.600
這個audio的story的語意以後,
link |
01:03:47.600
它就可以做attention,
link |
01:03:49.600
決定在這個audio story裡面,
link |
01:03:51.600
哪些部分是和回答問題有關的。
link |
01:03:53.600
那這個就好像是
link |
01:03:55.600
畫重點一樣。那machine根據它畫的
link |
01:03:57.600
重點呢,產生答案。
link |
01:03:59.600
那它甚至也可以回頭
link |
01:04:01.600
過去修正
link |
01:04:03.600
它產生出來的答案。
link |
01:04:05.600
那經過幾個process以後呢,
link |
01:04:07.600
最後machine得到它的答案,
link |
01:04:09.600
它把它的答案的其他選項呢,
link |
01:04:11.600
計算相似度,然後看
link |
01:04:13.600
哪一個選項的相似度最高,
link |
01:04:15.600
它就得到
link |
01:04:17.600
它就選哪一個選項。
link |
01:04:19.600
那這整個task
link |
01:04:21.600
其實就是一個大的
link |
01:04:23.600
neural network。
link |
01:04:25.600
除了語音辨識以外,
link |
01:04:27.600
這個question semantic的
link |
01:04:29.600
部分,還有
link |
01:04:31.600
audio story semantic的部分
link |
01:04:33.600
都是neural network,所以它們就是
link |
01:04:35.600
jointly trained。
link |
01:04:37.600
你就只要給machine呢,託普聽一聲的考古題,
link |
01:04:39.600
然後machine就自己會去學了。
link |
01:04:41.600
那這個
link |
01:04:43.600
底下呢,是一些
link |
01:04:45.600
實驗結果啦。
link |
01:04:47.600
底下是一些實驗結果。
link |
01:04:49.600
這個實驗結果是這樣的。
link |
01:04:51.600
random猜啊,正確率是
link |
01:04:53.600
25%。
link |
01:04:55.600
那你會發現說,有兩個方法
link |
01:04:57.600
是遠比25%強的。
link |
01:04:59.600
這個是很重要的一方面。
link |
01:05:01.600
這邊這五個方法呢,都是
link |
01:05:03.600
拿一和方法,也就是完全
link |
01:05:05.600
不管
link |
01:05:07.600
那個文章的內容,
link |
01:05:09.600
就直接看問題跟選項,
link |
01:05:11.600
就猜答案。
link |
01:05:13.600
然後我們發現說,如果你選
link |
01:05:15.600
最短的那個選項,你就可以得到
link |
01:05:17.600
35%的正確率了。
link |
01:05:19.600
所以這個是
link |
01:05:21.600
計中計啦,你可能會覺得應該要選最長的,
link |
01:05:23.600
但其實是要選最短的。
link |
01:05:25.600
還有另外一個是這樣子。
link |
01:05:27.600
如果你分析四個選項的
link |
01:05:29.600
semantic,你做那個sequence to sequence
link |
01:05:31.600
autoencoder,去把
link |
01:05:33.600
每一個選項的semantic
link |
01:05:35.600
找出來,然後你再去看說
link |
01:05:37.600
某一個選項跟
link |
01:05:39.600
另外三個選項,與以上的相似度。
link |
01:05:41.600
你會發現說,
link |
01:05:43.600
如果某一個選項
link |
01:05:45.600
和另外三個選項的相似度
link |
01:05:47.600
比較高的話,
link |
01:05:49.600
然後你就把它選出來,那你有35%的正確率啊。
link |
01:05:51.600
這跟你的直覺是相反的。
link |
01:05:53.600
我們直覺通常會覺得說
link |
01:05:55.600
我們應該選一個選項,它的語意
link |
01:05:57.600
和另外三個選項是不像的。
link |
01:05:59.600
但是人家早就計算到
link |
01:06:01.600
你會這麼做了,所以這是個計中計。
link |
01:06:03.600
如果你要選
link |
01:06:05.600
你要選某一個
link |
01:06:07.600
選項的它的語意跟另外三個選項
link |
01:06:09.600
最像的話,你反而可以得到
link |
01:06:11.600
超過random的答案。如果你今天
link |
01:06:13.600
是選最不像的,
link |
01:06:15.600
語意最不像的那個選項,
link |
01:06:17.600
你得到的答案就會接近random,
link |
01:06:19.600
它都是設計好的。
link |
01:06:21.600
那這個呢,都是一些
link |
01:06:23.600
trivial的方法。
link |
01:06:25.600
那你可以用一些machine learning的方法,比如說用
link |
01:06:27.600
memory level,
link |
01:06:29.600
memory level可以得到39%的正確率,
link |
01:06:31.600
是比隨機弄一下的
link |
01:06:33.600
還要好一些。
link |
01:06:35.600
如果用我們剛才講的
link |
01:06:37.600
model的話呢,我們現在
link |
01:06:39.600
在有語音辨識錯的
link |
01:06:41.600
情況下,最好可以做到
link |
01:06:43.600
將近50%的正確率啦。
link |
01:06:45.600
其實50%的正確率是沒有很高,
link |
01:06:47.600
我覺得這樣應該是
link |
01:06:49.600
去不了什麼美國學校了啦。
link |
01:06:51.600
但是就是
link |
01:06:53.600
兩題可以答對一題,所以如果你沒辦法
link |
01:06:55.600
兩題答對一題的話,你其實就沒有
link |
01:06:57.600
machine learning了。
link |
01:06:59.600
好,那以下是一些
link |
01:07:01.600
reference給大家參考。
link |
01:07:03.600
那最後,
link |
01:07:05.600
我這邊其實
link |
01:07:07.600
有一個問題。
link |
01:07:09.600
我們講了thick learning,
link |
01:07:11.600
也講了structured learning,
link |
01:07:13.600
它們中間有什麼樣的
link |
01:07:15.600
關係呢?你想想看,
link |
01:07:17.600
我們上周
link |
01:07:19.600
講了HAM,
link |
01:07:21.600
講了CRM,
link |
01:07:23.600
講了structured perceptron和structured SVM,
link |
01:07:25.600
它們可以做的事情是
link |
01:07:27.600
比如說做POS tagging,
link |
01:07:29.600
inputting a sequence, outputting another sequence,
link |
01:07:31.600
RNN,
link |
01:07:33.600
LSTM,也可以做到
link |
01:07:35.600
一樣的事情。
link |
01:07:37.600
當我們使用
link |
01:07:39.600
deep learning的技術,
link |
01:07:41.600
跟使用structured learning的技術,
link |
01:07:43.600
有什麼不同呢?
link |
01:07:45.600
咳咳咳
link |
01:07:59.600
有什麼不同?
link |
01:08:01.600
有什麼不同?
link |
01:08:05.600
首先,
link |
01:08:07.600
假如我們
link |
01:08:09.600
現在用的是
link |
01:08:11.600
unidirectional的RNN或LSTM,
link |
01:08:13.600
當你在
link |
01:08:15.600
make decision的時候,
link |
01:08:17.600
你只看了sentence的一半,
link |
01:08:19.600
而如果你是
link |
01:08:21.600
用structured learning的話,
link |
01:08:23.600
透過Viterbi的algorithm,
link |
01:08:25.600
你考慮的是
link |
01:08:27.600
整個句子。
link |
01:08:29.600
如果你是用Viterbi的algorithm的話,
link |
01:08:31.600
Machine會讀過整個句子以後,
link |
01:08:33.600
才下決定。
link |
01:08:35.600
所以從這個角度來看,也許
link |
01:08:37.600
HAM,CRM,
link |
01:08:39.600
structured SVM等等,還是有
link |
01:08:41.600
佔到一些優勢。
link |
01:08:43.600
但是這個優勢並沒有很明顯,
link |
01:08:45.600
因為RNN,
link |
01:08:47.600
LSTM等等,
link |
01:08:49.600
他們可以做bi-directional,
link |
01:08:51.600
所以他們也有辦法考慮
link |
01:08:53.600
一整個句子的information。
link |
01:08:55.600
咳咳
link |
01:08:59.600
link |
01:09:01.600
在這個
link |
01:09:03.600
HAM,CRM
link |
01:09:05.600
裡面,你可以
link |
01:09:07.600
很explicit地
link |
01:09:09.600
去考慮你的
link |
01:09:11.600
label和label之間的
link |
01:09:13.600
關係。
link |
01:09:15.600
什麼意思呢?
link |
01:09:17.600
舉例來說,你今天在做inference的時候,
link |
01:09:19.600
你在用Viterbi
link |
01:09:21.600
algorithm求解的時候,
link |
01:09:23.600
假設你可以
link |
01:09:25.600
直接把你要的content
link |
01:09:27.600
下到那個Viterbi的algorithm
link |
01:09:29.600
裡面去,你了解我的意思嗎?
link |
01:09:31.600
你可以直接說,我希望
link |
01:09:33.600
每一個label出現的時候,都要連續進行五次。
link |
01:09:35.600
這件事情,
link |
01:09:37.600
你可以輕易地用Viterbi algorithm
link |
01:09:39.600
做到,因為你可以修改Viterbi algorithm,
link |
01:09:41.600
讓Machine Learning在選擇
link |
01:09:43.600
分數最高的句子的時候,
link |
01:09:45.600
排除掉不符合你要的content
link |
01:09:47.600
的那些結果。
link |
01:09:49.600
但是,如果是RNN
link |
01:09:51.600
或LSTM的話,
link |
01:09:53.600
你要直接下一個content進去,
link |
01:09:55.600
是比較難的。
link |
01:09:57.600
你沒有辦法要求RNN說,
link |
01:09:59.600
你一定要連續突出
link |
01:10:01.600
某一個label五次才是正確的。
link |
01:10:03.600
你很難讓RNN,
link |
01:10:05.600
給他看這種training data,
link |
01:10:07.600
但是你叫他去學,
link |
01:10:09.600
這樣是比較麻煩的。
link |
01:10:11.600
Viterbi可以直接告訴
link |
01:10:13.600
你的Machine,要他做什麼事。
link |
01:10:15.600
所以在這點上,
link |
01:10:17.600
Structure Learning似乎
link |
01:10:19.600
是有一些優勢的。
link |
01:10:21.600
如果是RNN
link |
01:10:23.600
或LSTM,你的cost function
link |
01:10:25.600
跟你實際上
link |
01:10:27.600
最後要考慮的error,
link |
01:10:29.600
往往是沒有關係的。
link |
01:10:31.600
你想想看,當你在做RNN
link |
01:10:33.600
或LSTM的時候,你在考慮的
link |
01:10:35.600
cost是比如說
link |
01:10:37.600
每一個時間點的
link |
01:10:39.600
cross entropy,每一個時間點
link |
01:10:41.600
你的RNN的output跟reference
link |
01:10:43.600
的cross entropy,
link |
01:10:45.600
他跟你的error往往不見得是
link |
01:10:47.600
直接相關。
link |
01:10:49.600
因為你的error可能是,比如說
link |
01:10:51.600
兩個sequence
link |
01:10:53.600
之間的meta distance,
link |
01:10:55.600
但是如果你
link |
01:10:57.600
是用Structure Learning的話,
link |
01:10:59.600
Structure Learning的cost會是
link |
01:11:01.600
error的一個upper bound。
link |
01:11:03.600
所以從這個角度來看,Structure Learning
link |
01:11:05.600
也是有一些優勢的。
link |
01:11:07.600
但是最後最困難,
link |
01:11:09.600
但是最後最重要的,
link |
01:11:11.600
RNN跟LSTM
link |
01:11:13.600
可以是定核。
link |
01:11:15.600
而HLMCRF,Structure Perceptron,
link |
01:11:17.600
他們其實也可以是定核,
link |
01:11:19.600
但是他們拿來做定核的
link |
01:11:21.600
learning其實比較困難。
link |
01:11:23.600
在我們上一堂課講的
link |
01:11:25.600
內容裡面,他們都是
link |
01:11:27.600
linear。
link |
01:11:29.600
為什麼他們是linear?
link |
01:11:31.600
因為我們定的evaluation function
link |
01:11:33.600
是linear。
link |
01:11:35.600
如果他不是linear的話,你會很麻煩。
link |
01:11:37.600
你在training的時候會有很多麻煩。
link |
01:11:39.600
所以他要是linear的,我們才能夠套用
link |
01:11:41.600
我們在上一堂課教的那些方法
link |
01:11:43.600
來做influence跟training。
link |
01:11:47.600
在這個比較上,
link |
01:11:49.600
deep learning會佔到很大的優勢。
link |
01:11:51.600
最後整體說起來,
link |
01:11:53.600
其實如果你要
link |
01:11:55.600
得到一些state of the art的結果,
link |
01:11:57.600
這種secret laboring的test
link |
01:11:59.600
要得到state of the art的結果,
link |
01:12:01.600
RLLSTM是不可或缺的。
link |
01:12:03.600
所以整體說來,
link |
01:12:05.600
RLLSTM這種secret laboring
link |
01:12:07.600
的test上面的表現
link |
01:12:09.600
其實會是比較好。
link |
01:12:11.600
定核這件事情是比較強的,
link |
01:12:13.600
他非常的重要。
link |
01:12:17.600
如果你今天用的只是
link |
01:12:19.600
linear的model,
link |
01:12:21.600
如果你的model是linear,你的function space就這麼大,
link |
01:12:23.600
就算你可以
link |
01:12:25.600
直接minimize
link |
01:12:27.600
一個arrow的upper bound,那又怎樣?
link |
01:12:29.600
因為你所有的function都是壞的,
link |
01:12:31.600
所以相比之下,
link |
01:12:33.600
deep learning可以
link |
01:12:35.600
佔到很大的優勢。
link |
01:12:37.600
但是其實deep learning
link |
01:12:39.600
跟structured learning,
link |
01:12:41.600
他們是可以被結合起來,
link |
01:12:43.600
而且有非常非常多的先例,
link |
01:12:45.600
有很多成功的
link |
01:12:47.600
結合的先例。
link |
01:12:51.600
你可以說,
link |
01:12:53.600
底部就是
link |
01:12:55.600
input的feature,
link |
01:12:57.600
先通過
link |
01:12:59.600
RNN跟
link |
01:13:01.600
LSTM,
link |
01:13:03.600
然後先通過RNN LSTM,
link |
01:13:05.600
RNN LSTM的output,再作為
link |
01:13:07.600
HNSCRF structured SVM
link |
01:13:09.600
等等的input,
link |
01:13:11.600
你用RNN LSTM的output
link |
01:13:13.600
來定義
link |
01:13:15.600
HNSCRF structured SVM的
link |
01:13:17.600
evaluation function。
link |
01:13:19.600
如此,
link |
01:13:21.600
你就可以同時又享有
link |
01:13:23.600
deep的好處,同時又享有
link |
01:13:25.600
structured learning的
link |
01:13:27.600
好處。
link |
01:13:29.600
那這個呢,在過去已經有很多先例,
link |
01:13:31.600
比如說呢,在
link |
01:13:33.600
最後,你現在這邊有
link |
01:13:35.600
deep,這邊有structured,
link |
01:13:37.600
這兩個是可以jointly
link |
01:13:39.600
一起learn的,你可以想想看,
link |
01:13:41.600
SCRF可以用gradient descent train,
link |
01:13:43.600
那其實structured SVM,我們好像
link |
01:13:45.600
沒有講,但是它也可以用gradient descent train。
link |
01:13:47.600
所以你可以
link |
01:13:49.600
把deep learning的部分和
link |
01:13:51.600
structured learning的部分jointly合起來,
link |
01:13:53.600
一起用gradient descent
link |
01:13:55.600
來做成立。
link |
01:13:59.600
那在語音上呢,
link |
01:14:01.600
我們常常會把
link |
01:14:03.600
deep learning和structured learning合起來,
link |
01:14:05.600
你可以常常見到的組合是
link |
01:14:07.600
deep learning的model
link |
01:14:09.600
CNN LSTM DNN
link |
01:14:11.600
加上HNSCRF的組合。
link |
01:14:13.600
所以我們常常說
link |
01:14:15.600
我們把過去我們所做的東西
link |
01:14:17.600
通通丟掉了,其實不是,
link |
01:14:19.600
HNN呢,往往都還在,
link |
01:14:21.600
往往都還在。
link |
01:14:23.600
如果呢,你要得到最state of the art
link |
01:14:25.600
的結果,現在
link |
01:14:27.600
還是用這樣子hybrid system
link |
01:14:29.600
得到的結果,往往是最好的。
link |
01:14:31.600
而這種hybrid system
link |
01:14:33.600
怎麼work呢?我們說在
link |
01:14:35.600
HNN裡面,我們
link |
01:14:37.600
必須要去計算
link |
01:14:39.600
X跟Y的
link |
01:14:41.600
joint probability,或是在structured learning
link |
01:14:43.600
裡面,我們要計算
link |
01:14:45.600
X跟Y的evaluation function,
link |
01:14:47.600
在語音辨識裡面,X是
link |
01:14:49.600
聲音訊號,Y是語音
link |
01:14:51.600
辨識的結果。
link |
01:14:53.600
在HNN裡面,我們有
link |
01:14:55.600
transition的部分,
link |
01:14:57.600
我們有
link |
01:14:59.600
emission的部分。
link |
01:15:01.600
DNN做的事情
link |
01:15:03.600
其實就是
link |
01:15:05.600
去取代了emission的部分。
link |
01:15:07.600
原來在HNN裡面,
link |
01:15:09.600
這個emission就是
link |
01:15:11.600
簡單的統計,就是統計一個
link |
01:15:13.600
emission model,但是把它換成
link |
01:15:15.600
DNN以後,你會得到
link |
01:15:17.600
很好的performance。
link |
01:15:19.600
怎麼換呢?
link |
01:15:21.600
一般RNN
link |
01:15:23.600
它可以給我們的offer是invalid
link |
01:15:25.600
occlusive feature,它告訴你說這個
link |
01:15:27.600
occlusive feature屬於每一個state
link |
01:15:29.600
的幾率。你可能想說,
link |
01:15:31.600
這跟我們要的東西不一樣啊,我們要的是
link |
01:15:33.600
P of X
link |
01:15:35.600
given Y,這邊給我們的是
link |
01:15:37.600
P of Y given X,
link |
01:15:39.600
怎麼辦呢?做一下轉換。
link |
01:15:41.600
RNN可以給我們P of X
link |
01:15:43.600
given Y,然後你可以把它
link |
01:15:45.600
分解成P of XY
link |
01:15:47.600
除以P of Y,再把它分解成
link |
01:15:49.600
P of Y given X
link |
01:15:51.600
乘以P of X,除以P of Y。
link |
01:15:53.600
那前面這個P of Y
link |
01:15:55.600
given X,它可以從RNN來,
link |
01:15:57.600
那P of Y
link |
01:15:59.600
可以從,你就直接
link |
01:16:01.600
看,你就可以直接從你的converse
link |
01:16:03.600
裡面,統計P of Y
link |
01:16:05.600
出現的幾率。這個P of X
link |
01:16:07.600
你可以直接無視它。
link |
01:16:09.600
為什麼P of X可以直接無視它呢?
link |
01:16:11.600
你想想看,最後你得到這個
link |
01:16:13.600
幾率的時候,在influence的時候,
link |
01:16:15.600
X是input,是send
link |
01:16:17.600
訊號,是值的。你是窮於
link |
01:16:19.600
所有的Y,看哪一個Y可以讓
link |
01:16:21.600
P of XY最大。所以跟
link |
01:16:23.600
X有關的項,最後不會
link |
01:16:25.600
影響
link |
01:16:27.600
influence的結果,所以我們
link |
01:16:29.600
不需要把X的考慮進來。
link |
01:16:31.600
那其實
link |
01:16:33.600
加上HNN,在語音
link |
01:16:35.600
辨識裡面,是蠻有
link |
01:16:37.600
道理的。就算是
link |
01:16:39.600
你用RNN,你在做辨識
link |
01:16:41.600
的時候,常常會
link |
01:16:43.600
遇到一個問題,假設我們是
link |
01:16:45.600
一個thread,每一個thread
link |
01:16:47.600
丟到RNN,然後問它說,這個thread
link |
01:16:49.600
這個thread,屬於哪一個form
link |
01:16:51.600
它往往會產生一些
link |
01:16:53.600
怪怪的結果,比如說
link |
01:16:55.600
因為一個form往往是
link |
01:16:57.600
蔓延好多個thread嘛,所以
link |
01:16:59.600
本來理論上你應該會看到說
link |
01:17:01.600
比如說,第一個thread是A
link |
01:17:03.600
第二個thread是A,第三個是A,第四個是A
link |
01:17:05.600
第五個是A,然後接下來換成B
link |
01:17:07.600
但是如果你用
link |
01:17:09.600
RNN在做的時候
link |
01:17:11.600
你知道,RNN它每一個
link |
01:17:13.600
產生的
link |
01:17:15.600
這個label,它都是dependent
link |
01:17:17.600
所以它可能會
link |
01:17:19.600
突然發狂,在
link |
01:17:21.600
這個地方就突然若無其事地改成B
link |
01:17:23.600
然後又改回來
link |
01:17:27.600
你會發現,它很容易出現
link |
01:17:29.600
這個現象,然後如果今天
link |
01:17:31.600
這是一個比賽的話,你就會
link |
01:17:33.600
發現說,RNN有點弱
link |
01:17:35.600
它會發生這種現象,我手動
link |
01:17:37.600
只要,比如說,某一個
link |
01:17:39.600
某一個output前後不一樣
link |
01:17:41.600
我就手動把它改掉
link |
01:17:43.600
然後你就可以得到再2%的進步
link |
01:17:45.600
就可以屌打其他同學
link |
01:17:47.600
link |
01:17:49.600
如果你加上HNN的話
link |
01:17:51.600
就不會有這個情形
link |
01:17:53.600
HNN會幫你把這種狀況
link |
01:17:55.600
自動就把它
link |
01:17:57.600
修掉
link |
01:17:59.600
所以,加上HNN
link |
01:18:01.600
其實是
link |
01:18:03.600
還蠻有幫助的
link |
01:18:05.600
對RNN來說,因為它在training的時候
link |
01:18:07.600
它是一個一個frame
link |
01:18:09.600
分開考慮的
link |
01:18:11.600
所以其實今天
link |
01:18:13.600
假如這個不同的錯誤
link |
01:18:15.600
對語音辨識結果的影響很大
link |
01:18:17.600
但是RNN不知道
link |
01:18:19.600
如果我們今天把這個B改成錯在這個地方
link |
01:18:21.600
改成錯在這個地方
link |
01:18:23.600
對最後語音辨識
link |
01:18:25.600
錯誤的影響其實就很小
link |
01:18:27.600
但是RNN不知道這件事情
link |
01:18:29.600
所以對它來說
link |
01:18:31.600
在這邊犯一個錯誤和這邊犯一個錯誤是一樣
link |
01:18:33.600
但是RNN認不出
link |
01:18:35.600
這件事情來
link |
01:18:37.600
你要讓RNN認出這件事情來
link |
01:18:39.600
你需要加上一些
link |
01:18:41.600
structure learning的概念才能夠
link |
01:18:43.600
做到
link |
01:18:45.600
那在做這個
link |
01:18:47.600
slot filling的時候呢
link |
01:18:49.600
現在也很流行
link |
01:18:51.600
用bi-directional的LSDN
link |
01:18:53.600
再加上CRF
link |
01:18:55.600
或者是structure的SVN
link |
01:18:57.600
也就是說
link |
01:18:59.600
先用bi-directional的LSDN抽出feature
link |
01:19:01.600
再把這些feature
link |
01:19:03.600
再拿這些feature來定義
link |
01:19:05.600
CRF或者是structure SVN
link |
01:19:07.600
裡面我們需要用到的feature
link |
01:19:09.600
CRF跟structure SVN都是linear的model
link |
01:19:11.600
你都要先抽一個feature
link |
01:19:13.600
final of SY
link |
01:19:15.600
然後認一個weight的W
link |
01:19:17.600
那這個final of SY的feature
link |
01:19:19.600
你不要直接從row的feature來
link |
01:19:21.600
你直接從bi-directional的RNN的output
link |
01:19:23.600
可以得到比較好的結果
link |
01:19:27.600
link |
01:19:29.600
那有人會說structure learning
link |
01:19:31.600
到底
link |
01:19:33.600
是否是practical
link |
01:19:35.600
我們知道structure learning
link |
01:19:37.600
你需要解三個問題
link |
01:19:39.600
那其中inference那個問題
link |
01:19:41.600
往往是很困難
link |
01:19:43.600
你想想看inference那個問題
link |
01:19:45.600
你要ARG
link |
01:19:47.600
你要窮取所有的y
link |
01:19:49.600
看哪一個y可以讓你的值最大
link |
01:19:51.600
那這個optimization
link |
01:19:53.600
那這個optimization
link |
01:19:55.600
並不是所有的狀況都有好的解
link |
01:19:57.600
應該說大部分的狀況
link |
01:19:59.600
都沒有好的solution
link |
01:20:01.600
sequence labeling是少數有好的solution的狀況
link |
01:20:03.600
但其他狀況
link |
01:20:05.600
都沒有什麼好的solution
link |
01:20:07.600
所以好像會讓人覺得說
link |
01:20:09.600
structure learning
link |
01:20:11.600
它的用途並沒有那麼廣泛
link |
01:20:13.600
但實際上呢
link |
01:20:15.600
未來未必是這個樣子
link |
01:20:23.600
事實上你想想看
link |
01:20:25.600
我們之前講過的game
link |
01:20:27.600
我認為game就是一種
link |
01:20:29.600
structure learning
link |
01:20:31.600
如果你把discriminator
link |
01:20:33.600
看作是
link |
01:20:35.600
evaluation function
link |
01:20:37.600
就是我們之前講的
link |
01:20:39.600
在structure learning裡面
link |
01:20:41.600
你有一個powerpoint
link |
01:20:43.600
evaluation function
link |
01:20:45.600
如果這個discriminator
link |
01:20:47.600
我們就可以把它看作是evaluation function
link |
01:20:49.600
所以呢
link |
01:20:51.600
我們就知道problem 1
link |
01:20:53.600
怎麼做
link |
01:20:55.600
那最困難的problem 2
link |
01:20:57.600
要解一個inference的問題
link |
01:20:59.600
我們要窮取所有我們未知的東西
link |
01:21:01.600
看看誰可以讓我們的evaluation function
link |
01:21:03.600
最大
link |
01:21:05.600
這一步往往很困難
link |
01:21:07.600
因為x的可能性太多了
link |
01:21:09.600
未知的東西的可能性太多了
link |
01:21:11.600
但事實上這個東西
link |
01:21:13.600
它可以就是generator
link |
01:21:15.600
我們可以想成generator
link |
01:21:17.600
它不是就是
link |
01:21:19.600
給一個noise
link |
01:21:21.600
給一個從Gaussian裡面sample出來的noise
link |
01:21:23.600
它就output一個x嗎
link |
01:21:25.600
它就output一個object出來嗎
link |
01:21:27.600
它output的這個object
link |
01:21:29.600
不是就是可以讓discriminator
link |
01:21:31.600
分辨不出來的那個object嗎
link |
01:21:33.600
不是就可以
link |
01:21:35.600
如果discriminator就是evaluation function的話
link |
01:21:37.600
它output的那個object
link |
01:21:39.600
就是可以讓evaluation function的值
link |
01:21:41.600
很大的那個object
link |
01:21:43.600
所以這個generator
link |
01:21:45.600
它其實就是在解這個問題
link |
01:21:47.600
那這個generator的output
link |
01:21:49.600
其實就是這個ARGBmax的
link |
01:21:51.600
的output
link |
01:21:53.600
你可以把generator
link |
01:21:55.600
當作是在解inference的這個問題
link |
01:21:57.600
那problem 3呢
link |
01:21:59.600
你已經知道了我們怎麼train GAN
link |
01:22:01.600
就是problem 3的這部分
link |
01:22:03.600
事實上GAN的training
link |
01:22:05.600
它的structure SVM
link |
01:22:07.600
你不覺得其實也是有異曲同工之妙嗎
link |
01:22:09.600
link |
01:22:11.600
大家還記得structure SVM是什麼training嗎
link |
01:22:13.600
在structure SVM的training裡面
link |
01:22:15.600
我們每次找出
link |
01:22:17.600
最competitive的那些
link |
01:22:19.600
example
link |
01:22:21.600
然後我們希望正確的
link |
01:22:23.600
然後我們希望正確的example
link |
01:22:25.600
它的evaluation function的分數
link |
01:22:27.600
大過competitive的example
link |
01:22:29.600
然後update我們的model
link |
01:22:31.600
然後再重新選competitive的example
link |
01:22:33.600
然後再讓正確的
link |
01:22:35.600
double competitive的
link |
01:22:37.600
比較iterative的去做
link |
01:22:39.600
你不覺得GAN也是在做一樣的事情嗎
link |
01:22:41.600
GAN的training
link |
01:22:43.600
link |
01:22:45.600
我們有正確的example
link |
01:22:47.600
就是這邊的x
link |
01:22:49.600
它應該要讓evaluation function
link |
01:22:51.600
就是discriminator的值大
link |
01:22:53.600
然後我們每次用這個generator
link |
01:22:55.600
generate出
link |
01:22:57.600
最competitive的那些x
link |
01:22:59.600
也就是可以讓discriminator的值最大的那些x
link |
01:23:01.600
然後再去train discriminator
link |
01:23:03.600
discriminator要分辨
link |
01:23:05.600
正確的,real的,跟generated
link |
01:23:07.600
也就是discriminator
link |
01:23:09.600
要給real的example比較大的值
link |
01:23:11.600
給那些most competitive的x
link |
01:23:13.600
比較小的值
link |
01:23:15.600
所以,然後這個process
link |
01:23:17.600
就不斷的iterative的進行下去
link |
01:23:19.600
你會update你的discriminator
link |
01:23:21.600
然後update你的generator
link |
01:23:23.600
然後再update你的discriminator
link |
01:23:25.600
其實這個跟
link |
01:23:27.600
跟那個
link |
01:23:29.600
這個structure SEM的training
link |
01:23:31.600
其實是有異曲同工之妙的
link |
01:23:35.600
那你可不可以想說在GAN裡面
link |
01:23:37.600
我們之前在講structure SEM的時候
link |
01:23:39.600
都是有一個input,有一個output
link |
01:23:41.600
有一個x,有一個y
link |
01:23:43.600
那我們之前講的GAN
link |
01:23:45.600
只有x
link |
01:23:47.600
聽起來好像不太像
link |
01:23:49.600
那我們就另外講一個像的
link |
01:23:51.600
給你聽看看
link |
01:23:53.600
其實GAN也可以是
link |
01:23:55.600
conditional的GAN
link |
01:23:57.600
什麼是conditional的GAN呢
link |
01:23:59.600
今天的example都是
link |
01:24:01.600
xy的pair
link |
01:24:03.600
我要解的任務是given x
link |
01:24:05.600
找出最有可能的y
link |
01:24:07.600
比如說它可以,就想成是做語音辨識
link |
01:24:09.600
x是聲音訊號
link |
01:24:11.600
y是
link |
01:24:13.600
顯示出來的文字
link |
01:24:15.600
那如果是用conditionalGAN的概念
link |
01:24:17.600
怎麼做呢
link |
01:24:19.600
你的generator
link |
01:24:21.600
input一個x
link |
01:24:23.600
它就會output一個y
link |
01:24:25.600
discriminator呢
link |
01:24:27.600
它就會有一個xy的pair
link |
01:24:29.600
是不是對
link |
01:24:31.600
如果你給它一個真正的xy的pair
link |
01:24:33.600
它會給它比較高的分數
link |
01:24:35.600
你給它一個generator
link |
01:24:37.600
output出來的y
link |
01:24:39.600
配上它的input x
link |
01:24:41.600
所產生的一個假的xy的pair
link |
01:24:43.600
它會給它比較低的分數
link |
01:24:45.600
所以你的process就跟原來的GAN
link |
01:24:47.600
是一樣
link |
01:24:49.600
這個東西已經被成功應用在
link |
01:24:51.600
用文字產生image的這個test上面
link |
01:24:53.600
在用文字產生image的這個test
link |
01:24:55.600
你根本去說一句話說
link |
01:24:57.600
有一隻藍色的鳥
link |
01:24:59.600
它就畫一張藍色的鳥
link |
01:25:01.600
那這個test呢
link |
01:25:03.600
你的input x
link |
01:25:05.600
就是一句話
link |
01:25:07.600
output y就是一張image
link |
01:25:09.600
那generator做的事情
link |
01:25:11.600
就是給它一句話
link |
01:25:13.600
在這邊
link |
01:25:15.600
this flower has small brown flowers
link |
01:25:17.600
and
link |
01:25:19.600
petals with a bright purple center
link |
01:25:21.600
給它一句話
link |
01:25:23.600
然後呢它就產生一張image
link |
01:25:25.600
那discriminator
link |
01:25:27.600
做的事情就是
link |
01:25:29.600
discriminator給它看一張image
link |
01:25:31.600
那一句話它判斷說
link |
01:25:33.600
這個xy的pair
link |
01:25:35.600
這個image跟sentence pair
link |
01:25:37.600
它們是真的還是不是真的
link |
01:25:39.600
那如果你把discriminator
link |
01:25:41.600
換成
link |
01:25:43.600
就是evaluation function
link |
01:25:45.600
把generator換成就是
link |
01:25:47.600
解inference的network algorithm
link |
01:25:49.600
其實conditional GAN跟structure learning
link |
01:25:51.600
它們是可以類比的
link |
01:25:53.600
或者是你可以說GAN
link |
01:25:55.600
就是train structure learning的
link |
01:25:57.600
model的一種方法
link |
01:25:59.600
你可能覺得
link |
01:26:01.600
這聽起來
link |
01:26:03.600
或許你沒有聽得很懂其實就算了
link |
01:26:05.600
你可能覺得這可能是我隨便講講的
link |
01:26:07.600
但是我就想說
link |
01:26:09.600
其他人也一定就想到了
link |
01:26:11.600
所以我就google了一下
link |
01:26:13.600
其他人的publication
link |
01:26:15.600
果然其實很多很多人都有類似的
link |
01:26:17.600
很多人都有類似的想法
link |
01:26:19.600
GAN可以跟energy-based model
link |
01:26:21.600
做connection
link |
01:26:23.600
GAN可以被視為train energy-based model
link |
01:26:25.600
的一種方法
link |
01:26:27.600
所謂的energy-based model其實我們之前有講過
link |
01:26:29.600
它就是structure learning的
link |
01:26:31.600
可以說是另外一種稱呼
link |
01:26:33.600
是亞馬遜提出來
link |
01:26:35.600
這邊有一系列的paper在講這件事
link |
01:26:37.600
那你可能覺得說
link |
01:26:39.600
把generator視作是在
link |
01:26:41.600
做inference這件事情
link |
01:26:43.600
是在解這個argmax
link |
01:26:45.600
那個problem聽起來感覺很荒謬
link |
01:26:47.600
其實也有人就是這麼想
link |
01:26:49.600
也有人想說
link |
01:26:51.600
這邊也列一些reference給大家參考
link |
01:26:53.600
也有人覺得說
link |
01:26:55.600
一個neural network
link |
01:26:57.600
有可能就是在做
link |
01:26:59.600
解argmax這個problem
link |
01:27:01.600
所以也許
link |
01:27:03.600
deep and structure
link |
01:27:05.600
就是未來一個研究的重點
link |
01:27:07.600
的方向
link |
01:27:09.600
link |
01:27:11.600
那說到
link |
01:27:13.600
deep and structure
link |
01:27:15.600
我就想到我的另外一門課
link |
01:27:17.600
machine learning and heavy lift
link |
01:27:19.600
deep and structure
link |
01:27:21.600
那因為有同學寄信問我一些問題
link |
01:27:23.600
有關下學期開課的問題
link |
01:27:25.600
所以我或許可以在這邊
link |
01:27:27.600
就有一次統一的回答
link |
01:27:29.600
首先呢
link |
01:27:31.600
下學期ML跟
link |
01:27:33.600
machine learning and heavy lift
link |
01:27:35.600
這題課的名字太長了
link |
01:27:37.600
所以我就縮寫成MLDS
link |
01:27:39.600
那ML跟MLDS
link |
01:27:41.600
下學期會同時存在
link |
01:27:43.600
那MLDS跟ML
link |
01:27:45.600
有什麼不同呢
link |
01:27:47.600
過去的
link |
01:27:49.600
MLDS的一些內容
link |
01:27:51.600
已經被拿到
link |
01:27:53.600
ML裡面教
link |
01:27:55.600
所以在這學期的ML
link |
01:27:57.600
中有提到的內容
link |
01:27:59.600
比如說DN或CNN
link |
01:28:01.600
在MLDS中就
link |
01:28:03.600
不再傾覆
link |
01:28:05.600
如果有需要的話只做一些複習
link |
01:28:07.600
另外呢
link |
01:28:09.600
我們現在終於有教科書了
link |
01:28:11.600
這個Ian Goodfellow
link |
01:28:13.600
他寫了一個教科書就叫做
link |
01:28:15.600
Deep Learning
link |
01:28:17.600
我們可以用Deep Learning這個書來當作教科書
link |
01:28:19.600
那神奇的就是
link |
01:28:21.600
這本教科書的編排
link |
01:28:23.600
他所講的內容其實跟
link |
01:28:25.600
Machine Learning and Heavy Lift
link |
01:28:27.600
link |
01:28:29.600
還蠻match的
link |
01:28:31.600
真是
link |
01:28:33.600
英雄所見略同
link |
01:28:35.600
我等下把這字眼也剪掉
link |
01:28:37.600
link |
01:28:41.600
link |
01:28:43.600
這個Deep Learning這本教科書
link |
01:28:45.600
它有三個part
link |
01:28:47.600
一個part講linear algebra
link |
01:28:49.600
那我們就不管它了
link |
01:28:51.600
part 2是講deep learning
link |
01:28:53.600
part 3的內容雖然它的title叫做Deep Learning Research
link |
01:28:55.600
但你會發現大部分的內容
link |
01:28:57.600
講的其實就是structure
link |
01:28:59.600
part 3講linear vector model
link |
01:29:01.600
這個structure
link |
01:29:03.600
or dirty model
link |
01:29:05.600
這個NCNC
link |
01:29:07.600
partition function
link |
01:29:09.600
這個其實都是structure learning的內容
link |
01:29:11.600
所以有人可能覺得說
link |
01:29:13.600
怎麼我為什麼把deep和structure
link |
01:29:15.600
湊在一起
link |
01:29:17.600
這個把deep跟structure湊在一起
link |
01:29:19.600
其實就是未來的趨勢
link |
01:29:21.600
然後
link |
01:29:23.600
回答一些同學的問題
link |
01:29:25.600
所有的作業
link |
01:29:27.600
我們從開學的時候就是2到4人一組
link |
01:29:29.600
你可以組好隊以後呢
link |
01:29:31.600
一起來修
link |
01:29:33.600
我發現有些人
link |
01:29:35.600
把過去開課的作業已經做完了
link |
01:29:37.600
太厲害了
link |
01:29:39.600
但是這個下學期課程的作業
link |
01:29:41.600
跟之前的作業是不一樣
link |
01:29:43.600
我們就把之前的三個作業
link |
01:29:45.600
合成一個
link |
01:29:47.600
當作作業
link |
01:29:49.600
然後我們之後可以再加別的作業
link |
01:29:51.600
詳細的細節呢
link |
01:29:53.600
我們以下學期
link |
01:29:55.600
公告的為準
link |
01:29:57.600
那我的規劃是可以加
link |
01:29:59.600
attention based model
link |
01:30:01.600
還可以出蠻多東西
link |
01:30:03.600
比如說
link |
01:30:05.600
有可能可以當作作業用
link |
01:30:07.600
或者是
link |
01:30:09.600
都是可能的作業
link |
01:30:11.600
reinforcement learning
link |
01:30:13.600
也要出一個作業
link |
01:30:15.600
deep generative model也要出一個作業
link |
01:30:17.600
sequence to sequence learning也應該出一個作業
link |
01:30:19.600
sequence to sequence learning可以做的東西太多
link |
01:30:21.600
比如可以做一個check bar
link |
01:30:23.600
可以做一個video的caption generation
link |
01:30:25.600
等等都是有可能的
link |
01:30:27.600
然後
link |
01:30:29.600
另外就是說明一下
link |
01:30:31.600
NLDS的初選就不開放加簽
link |
01:30:33.600
就以主為單位加簽
link |
01:30:35.600
會出一個作業領
link |
01:30:37.600
作業領就是很簡單
link |
01:30:39.600
做一個V4W的neural network
link |
01:30:41.600
然後你可以用現成的套件
link |
01:30:43.600
比如說Keras
link |
01:30:45.600
對大家來說應該就非常的簡單吧
link |
01:30:47.600