back to index
ELMO, BERT, GPT

link |
接下來這堂課,我們要講機器怎麼看懂人類的文字,或者是換句話說,我們怎麼把文字輸入到電腦裡面去,讓電腦可以看懂人類的文字。
link |
今天要講的是在這個方向上最新的技術,包括BERT,還有跟BERT很相似的其他也非常知名的模型,包括ELMO還有GPT。
link |
那這個第一頁投影片呢,是先跟大家非常概略的複習一下,過去在有BERT在有ELMO之前,是怎麼讓電腦去讀人類的文字的。
link |
最早最早的做法是說,每一個人類的詞彙就當作是一個不同的符號,每一個符號都用一個它獨特的編碼來表示這個符號。
link |
那最常見的做法叫做one-of-n encoding,假設說現在世界上就只有五個詞彙,這五個詞彙就是apple, bag, cat, dog, elephant,那我們把每一個詞彙都用一個項量來描述它,在這個項量裡面都只有一維是1,其他維度是0,每一個詞彙都有不同的項量。
link |
那用這個方法顯然是非常不足的,因為假設對機器來說,每一個文字都有一個獨一無二的編碼的話,對它來說,詞彙和詞彙之間是完全沒有任何關聯的。
link |
它不知道說cat跟dog都是動物,也許它們相較於這個cat跟bag的關係,cat跟dog是比較近的,而cat跟bag是比較遠的,這個是我們從這個符號上面,從one-of-n encoding這種編碼上是沒有辦法看出來的。
link |
所以後來,因為如果把每一個詞彙都當作是一個完全獨立的東西來看的話,顯然是不夠的,所以後來就有了word class的概念,也就是我們必須要對這些詞彙做分類,我們要說,有些詞彙它們應該算是同一類。
link |
舉例來說,dog、cat跟bird它們都是動物,所以它們應該算是同一類的,或者flower、tree跟apple它們都是植物,所以它們應該算是同一類的。
link |
但這種用word class的方法顯然太粗糙了,因為雖然dog跟cat都是動物,但是相較於鳥類,它們都是哺乳類動物,所以它跟鳥類又是有點不同的,但是如果我們把dog、cat跟bird同樣歸類成同一類的話,這樣顯然太粗了,你沒有辦法看出哺乳類動物和鳥類之間的差別。
link |
所以怎麼辦呢?後來有了更進階的想法,叫做word embedding。word embedding這個技術,我們過去上課的時候已經講過了,上課錄影裡面是有這一段的,所以我們就不重複過去已經講過的內容,就把上課錄影放在這邊給大家參考。
link |
word embedding可以想成是一個soft的word class。word embedding的意思是說,每一個詞彙我們現在都用一個向量來表示它,每一個詞彙都用一個向量來表示它,這個向量的每一個維度可能就表示了這個詞彙的某種意思。
link |
語意比較相近的詞彙,它們的向量會比較接近,比如說dog跟cat跟rabbit,它們都哺乳類動物,它們的向量會比較接近,相較於bird或者是tree和flower,這個哺乳類動物的向量跟bird就比較有距離,跟flower跟tree就比較有距離等等。
link |
所以從一個詞彙的向量,從一個詞彙的word embedding,我們就可以知道這個詞彙有什麼樣的語意。
link |
至於word embedding是怎麼訓練出來的,我們之前在上課錄影也講過,是根據每一個詞彙的上下文所找到的。
link |
這個都只是簡短的複習而已,在RM的作業裡面,我們要做一個sentiment analysis的classifier,讓我們知道在表示每一個詞彙的時候,也許你不是用one-time coding來描述每一個詞彙的,你會把每一個詞彙用它的word embedding來表示。
link |
可以想成說word embedding就是某種從feature的方法,我們用word embedding來當作某一個詞彙的feature。
link |
word embedding已經被廣泛的應用在NLP自然語言處理各式各樣的任務上,而且很多自然語言處理的任務都不是用one-time coding來表示一個詞彙,而是用embedding來表示一個詞彙。
link |
接下來就進入我們過去沒有講過的主題。一個詞彙是可能有不同的意思的,同一個詞彙可能有不同的意思。
link |
舉例來說,今天在這張抽影片上面,我們有四個句子,每個句子裡面都有出現bank這個詞彙。這邊要跟大家先定義一下,這邊這四個bank,這四個bank這個詞彙,它們是不同的token,但同樣的type。
link |
大家聽得懂嗎?這邊有四個bank,這四個bank,它們是不同的token,但是它們是同樣的type,它們的type就是bank。
link |
過去在做過embedding的時候,我們是每一個word的type有一個embedding,所以如果不同的token它屬於同樣的type,它的embedding,它所對應的那個vector就會是一模一樣的。
link |
換句話說,過去我們假設所有不同的token,只要它們的type是一樣的,它們的語意就是一樣的。事實上並不是如此,不同的token,就算它們是同樣的type,比如說這邊的銀行,它們是同樣的type,不同的token,它們也有可能有不同的語意。
link |
舉例來說,在這個例子裡面,前兩個句子的bank,它們的意思指的是銀行。從它的上下,我們可以看出來說,前兩個句子的bank附近都有money這個詞彙,它們指的是銀行。
link |
後面這兩個bank,第三跟第四個bank,它們指的是合體的意思,它們前面都有river這個詞彙。
link |
過去一般傳統的embedding是每一個type都有一個embedding,這四個bank它們會有一模一樣的embedding,我們假設這四個bank有一模一樣的語意,但事實上並不是如此。
link |
我們希望機器可以給不同意思的token,就算它們是同樣的type,也要給它們不同的embedding。
link |
那過去是怎麼做的呢?過去的做法可能是說,你去查個詞典,查個詞典告訴你說,bank這個type有兩種不同的意思,有兩種不同的sense。
link |
那你就說,所以bank這個type應該要有兩種不同的embedding。
link |
我們在training的時候,我們會給bank這個type兩種不同的embedding,我們最後訓練出來,希望可以做到說,第一個token跟第二個token,第一個跟第二個type是bank的token,它們有一種embedding,而第三個跟第四個token,它們有另外一種embedding,這是過去的做法。
link |
那這麼做顯然是不夠的,為什麼是不夠的呢?因為人類的語言是非常微妙的。如果你查bank這個詞彙,有些字典會告訴你說就是兩個意思,有些字典會告訴你說,bank可以說是有三個意思。
link |
舉例來說,bank會被用在血庫裡面,就是說醫院會有blood bank,那blood bank這個bank,它跟銀行的意思有點像,因為它也有儲存的意思,但有些詞典會告訴你說,這算是bank的第三個意思,它被用在血庫的時候,你會用blood bank這個詞彙。
link |
所以今天人質語意這個東西是很微妙的,到底blood bank的bank,我們應該說它就是銀行的意思,還是應該說是第三種意思,每個人都會有不同的講法。
link |
所以這樣的東西其實是非常常發生的。舉例來說,這個人是尼祿,這個人其實他也是尼祿。但是我們會說他是羅馬帝國的第五任皇帝,他也是羅馬帝國的第五任皇帝,他是一個暴君,他其實也是一個暴君。
link |
所以他們好像是同一個人,你也可以說他們是同一個人,但是其實他們又不是同一個人,我也不知道該怎麼解釋比較好。或者是說,這個是加賀號護衛艦,這個也是加賀號護衛艦。
link |
他們是一樣的嗎?他們是一樣的,但是他們又是不一樣的。你可能說,這個是人,這個不是人,但他真的是加賀號護衛艦,我也不知道該怎麼跟你解釋比較好。
link |
所以就是這麼神奇,人類語言就是這麼神奇。很多詞彙,你可以說它是一樣的東西,也可以說它是不一樣的東西。
link |
所以我們期待的,今天機器可以更進一步做到說,每一個word的token都有一個embedding。我們之前是每一個type有一個embedding,或者是一個type有固定多個embedding,現在是每一個token都有一個embedding。
link |
那怎麼知道一個token應該要有什麼樣的embedding呢?它的精神跟過去的word embedding的意思是差不多的。怎麼跟每一個token有一個embedding呢?你看這個token的上下文,上下文越相近的token,它們就會有越相近的embedding。
link |
那我剛才說,這邊有三個不同的句子,裡面都有bank這個word type,但這三個bank是不同的token,今後這些不同的token都會有不同的embedding,就像這個type是一樣的。這個技術叫做contextualized word embedding。
link |
但是這個flat bank跟money in the bank這兩個bank,它們的語意可能還是比較接近的。所以到時候你認出contextualized word embedding的時候,這兩個vector,每一個word type都有一個vector,但是每一個word的token都有一個vector,但這兩個token、這兩個bank、這兩個token,它們的vector可能是比較近的,這兩個bank、這兩個token,它們的vector可能是距離比較遠的。
link |
我們現在要給每一個word的token都給它不同的embedding。
link |
怎麼做到這件事呢?有一個技術可以做到這件事,這個技術叫做Elmo,它是embedding from language model的縮寫。Elmo就是右上角這隻紅色的怪物,它是一個芝麻街的角色。
link |
Elmo它是一個RNN-based的language model,什麼是RNN-based的language model呢?你要訓練一個RNN-based的language model,你其實不需要做什麼labeling,你只要收集一大堆一大堆的句子,那些句子不需要做任何的標註,你就去ppt上排一大堆句子下來,然後你就可以訓練一個RNN-based的language model。
link |
舉例來說,現在ppt上有一個句子,就是潮水退了就知道誰沒穿褲子,那你就教你的RNN-based的language model說,如果看到一個叫做begin of sentence的符號,那你就要輸出潮水。
link |
接下來再給你潮水這個符號,你就要輸出退了,然後給你潮水跟退了這兩個符號,你就要輸出舊的,就這樣子訓練下去。
link |
RNN-based language model它訓練的過程,訓練的時候它做的事情,它所學習到的技能就是去預測下一個token會是什麼,那就給它很多句子,讓它去學怎麼預測下一個token。
link |
學完以後,你就有contextualized word embedding,因為我們可以把RNN的hidden layer拿出來,說它就是現在輸入的那個詞彙的contextualized word embedding。
link |
假設你把退了輸進去,然後RNN會凸一個embedding出來給你,那這個embedding就是我們現在退了這個詞彙的embedding。
link |
那為什麼它是contextualized呢?你可以想像說,同樣的詞彙,同樣都是退了這個詞彙,它的上下文如果不同的話,現在RNN凸出來的embedding就會不一樣。
link |
你輸入高燒退了給RNN,或者是沉退了給RNN,這個同樣的詞彙輸進去,它的embedding都會是不一樣的。
link |
就假設說大家對RNN都已經很熟了,這個對你來說都不難理解,我們知道說,RNN在輸出這個vector的時候,在輸出這個embedding的時候,它會參考這整個句子。
link |
所以輸出這個embedding的時候,它是讀了高燒退了才輸出這個embedding,讀了沉退了輸出這個embedding,讀了潮水退了輸出這個embedding。
link |
雖然現在讀進來的詞彙都是退了,但是之前讀過不同的詞彙,所以它output的東西會是不一樣的。
link |
這個是AOMO的基本概念,就是你怎麼用一個RNN的language model,就抽出contextualized的文語embedding。
link |
有人可能會問說,那這樣子好像只有考慮到每一個詞彙的前文,沒有考慮到後半段。
link |
那怎麼辦呢?你再train一個反向的RNN,它從句子的尾巴讀過來。這個反向RNN它做的事情是,你給它吃知道,它就要預測舊,給它吃舊,就要預測退了,給它退了,就要預測潮水。
link |
所以你現在就不只考慮每一個詞彙的前文,你也會考慮它的下文。我們今天如果要得到退了這個詞彙的contextualized文語embedding,我們就把退了這個詞彙,在正向的RNN的embedding跟逆向的RNN的embedding都拿出來接起來。
link |
同一個詞彙,它的上下文不一樣,你得到的embedding就會不同。這個概念是非常直覺的。
link |
那我們今天知道說,我們train什麼network都是要deep,所以這個RNN它可以是deep。當我們train deep的時候,我們就會遇到問題了。我們會遇到什麼樣的問題呢?因為它有很多層,每一層都有embedding,那到底應該要用哪一層呢?同一個詞彙,到底應該要用哪一個embedding呢?
link |
Elmo這篇paper,它的solution就是我全都要。它是怎麼做的呢?Elmo的做法是說,現在每一層都會給我們一個contextualized的embedding。
link |
今天如果你在講這個contextualized的embedding的model的時候,你就想,你要知道說,每一個詞彙丟進去都會有一個embedding吐出來。Elmo它每一個詞彙丟進去都會吐出不止一個embedding,每一層的RNN都會給你一個embedding。怎麼辦呢?把這些embedding通通都加起來,一起用。
link |
但是怎麼把它加起來呢?最簡單的方法是把它平均起來之類的。但是Elmo是會做weighted sum的。假設現在我們的RNN有兩層,它會吐出兩個embedding,一個叫做H1,一個叫做H2。
link |
Elmo做的事情是,它會把第一層吐出來的embedding乘上Alpha1,第二層吐出來的embedding乘上Alpha2,通通加起來得到藍色的embedding,然後再把藍色的embedding做接下來你要做的downstream的test,做你接下來你要拿這個embedding做的各種不同的application。
link |
但是這個Alpha1跟Alpha2是怎麼來的呢?這個Alpha1跟Alpha2它們是認出來的。怎麼認出來呢?在你還沒有接downstream的test之前,在你還沒有使用Elmo抽出來的embedding之前,你是不知道這些Alpha的值應該是多少的。
link |
你要先設定好你接下來要做什麼application,比如說你接下來要做QA,你接下來要做POS tagging,你接下來要做syntactic parsing等等,你要先決定你要做什麼test,然後再把這些參數Alpha1跟Alpha2跟接下來的test一起去認出來。
link |
舉例來說,你等一下要做QA,QA的model裡面也有一些參數,那你會把Alpha1跟Alpha2視為QA model要學的參數的一部分,跟著network的其他部分一起被學出來。
link |
所以今天不同的任務,它們要用的這個Alpha1跟Alpha2就不一樣。在原始的Elmo那個paper裡面,它有給出以下這個實驗的結果。
link |
這個實驗的結果是什麼呢?這個實驗的結果是說,它現在用在接下來的downstream的test,用在接下來downstream的application的embedding,其實有三個來源。
link |
第一個是原來沒有contextualized的embedding,這個是這邊所謂的token,接下來每一個token通過Elmo的第一層以後會抽出一個embedding,通過第二層以後會抽出第二個embedding。
link |
現在這三種embedding,我們要從VT上得到藍色的這個embedding,那所以位核是多少?根據不同的任務學出不同的位核。
link |
舉例來說,在Semantic Row Labeling的時候學出來的位核是這個樣子,這邊是用顏色的深淺來代表位核的元素。
link |
這邊有Semantic Row Labeling,有correctance,correctance的這個text就是說要把那個代名詞所指涉的那個名詞把它找出來,比如說它指涉哪一個人物要把它所指涉的人物找出來,或者是squat,squat是QA的問題。
link |
這個SST就是Semantic Translocation,就是大家作業裡面有做的問題。學完以後,我們這邊就會發現說correctance這個text跟squat,就QA這個text,它們特別需要第一層的contextualized way embedding。
link |
而其他的任務好像就沒有那麼需要,其他任務看起來每一種不同的embedding的位核是比較平均的,所以不同的text,你要抽ELMO裡面,也就是RNN裡面不同層的contextualized embedding。
link |
那這個是ELMO的部分,BERT是Bidirectional Encoder Representation for Transformer的縮寫,因為這沒有BERT縮寫,BERT就是右上角這個黃色的動物。
link |
而且BERT也是芝麻街的角色,跟ELMO一樣,我就想問說這些人是有多喜歡芝麻街就是了。BERT是Transformer的encoder,所以我們必須要講過Transformer以後才能講BERT,我們上週已經講過Transformer了,右邊這個就是Transformer的圖,大家應該都已經非常熟悉了。
link |
好,那這個Transformer的encoder其實就是BERT的Navigator,那在BERT裡面,你只需要收集一大堆的句子,這些句子不需要有annotation,就可以把這個encoder把它train出來。
link |
原來如果你要train一個Transformer的時候,你需要有一些task,比如說summarization,比如說translation,給Transformer input,然後告訴它正確的output是什麼,你才能夠train這個Transformer。那BERT它只要trainTransformer裡面的encoder就好了,所以它在train這個encoder的時候,它是不需要有label的資料的,你只要收集一大堆的句子,你就可以訓練一個BERT。
link |
好,那如果等一下講的東西你聽不太懂的話,你就記得說BERT是一個什麼樣的東西呢?因為BERT很潮,今天隨便路邊拉一個人,我覺得不知道怎麼回事,都知道BERT,我就說真的,路邊不知道誰,隨便每一個人都知道BERT。
link |
但是假設有人問你說,那BERT實際上在做什麼的呢?那等一下講的東西如果你聽不懂的話,你就記得說BERT做的事情就是給一個句子進去,把一個句子丟進去給BERT,然後每一個句子都會吐一個embedding出來給你,就結束了。
link |
好,那至於BERT裡面的network架構長什麼樣子呢?它裡面的network架構就跟transformer的encoder是一樣的,那transformer的encoder裡面有什麼東西呢?transformer的encoder裡面有這個self-attention的layer,那我們之前有講過說self-attention的layer就是input一個sequence,那也會output一個sequence給你。
link |
那今天整個BERT的network架構就是,input一個word sequence,然後它給你一串embedding,那每一個embedding就對應到某一個word,就對應到某一個input的word,那BERT就是這樣。
link |
那這邊呢,我想提醒大家說,雖然在投影片上的例子,我們是用中文的詞來當作單位,但實際上,假如你今天要處理的是中文,也許在訓練BERT的時候,用字來當作單位是更為恰當的。
link |
我不知道大家知不知道中文的詞跟字有什麼樣的差別,舉例來說,這邊的潮水是一個中文的詞,而潮跟水分別是中文的字,分別是中文的character。
link |
好,那這個如果使用中文的詞,用中文的word來當作單位的話,因為我們現在input給BERT的這些詞彙啊,input給BERT的這些token啊,你也要把它表示成,舉例來說,one hard的encoding,才能夠輸給BERT的這個network。
link |
那如果你今天用的unit,你今天你的token的這個unit是詞的話,那中文的詞是很多的,中文的詞是幾乎無法窮舉的,那你input的那個one hard的vector,它的維度會太大。
link |
那如果用字的話,中文的character的數目是有限的,常用的character不過四千多個而已。
link |
所以因為常用的character是有限的,中文的character可以說是可以窮舉的,所以如果你用中文的character來當作輸入的單位的話,那你在描述一個中文的character,你用一個one hard encoding的vector來描述中文的character的時候,那個one hard encoding的vector就不會太長,那這樣子在實作上會方便許多。
link |
所以這邊就提醒大家一下,雖然在投影片上是用中文的word當作例子,但是在實作上,如果你要處理的是中文,也許這邊用character,用中文的字是更為合適的。
link |
好,那接下來要講的事情就是,那怎麼訓練這個BERT呢?假設我們沒有label data,只有收集一大堆沒有做任何annotation的句子,那這個BERT這個network是怎麼被訓練出來的呢?
link |
好,那在文件上呢,BERT這個network它有兩個訓練的方法,那第一個訓練的方法是mask LN,mask LN的意思是說,我們現在要交給BERT的任務是,我們把所有的句子隨機有15%的詞彙會被置換成一個特殊的token,這個token叫做mask,也就是說你會蓋掉一個句子裡面15%的詞彙。
link |
然後BERT要做的事情就是,去猜測這些有蓋住的地方到底應該是哪一個詞彙,所以BERT在訓練的時候,你是叫它去做一個刻漏字的問題,你把input的句子裡面15%的地方挖空,要BERT把它填回來。
link |
那BERT是怎麼填回來的呢?BERT填回來的方法是,假設現在在所有的句子裡面的第2個詞彙是挖空的,接下來我們把這些東西都通過BERT,每一個input的token都會得到一個embedding。
link |
接下來,把挖空的地方的那個embedding丟到一個linear的multi-class的classifier裡面,反正就是把現在input是mask的部分,BERT抽出來的這個vector丟進去一個linear的classifier裡面,
link |
要求這個classifier預測說,現在被mask掉的那個詞彙是哪一個詞彙。
link |
因為這個classifier是一個linear的classifier,所以它能力非常非常弱,所以今天如果要能夠成功預測出被mask掉的那個詞彙是哪一個,
link |
BERT這個model它可能很深,比如說有24層、有48層,BERT這個model它這邊一定要抽出一個非常好的representation,
link |
可以從這個representation輕易地知道說,現在被mask掉的這個詞彙是哪一個詞彙。
link |
所以我們把這個representation丟到一個簡單的classifier裡面,就可以預測出被mask掉的詞彙是哪一個。
link |
好,那因為我們現在要BERT做的事情是預測被mask掉的詞彙,那你可以想見BERT到時候抽出來的representation會是什麼樣的representation呢?
link |
BERT抽出來的embedding會是什麼樣的embedding呢?
link |
因為如果兩個詞彙填在同一個地方沒有違和感,那它們就會有類似的embedding。
link |
舉例來說,如果說潮水退了就知道誰沒穿褲子,跟潮水落了就知道誰沒穿褲子,那退了跟落了填在這個同樣的位置都沒有違和感的話,
link |
那它們就會有比較類似的embedding,到時候BERT就會學會抽出來這樣的embedding。
link |
同樣填在同一個地方沒有違和感,代表它們的語意可能是很類似的,BERT就會知道說它們應該要有類似的embedding。
link |
那第二種方法呢,是要BERT去做next sentence prediction,就給它兩個句子,然後BERT預測說這兩個句子是接在一起的還是不是接在一起的。
link |
舉例來說,給BERT兩個句子,一個是醒醒吧,一個是你沒有妹妹,你都知道說這兩個句子應該是要被接在一起的,你希望BERT也可以準確的預測說這兩個句子應該要被接在一起。
link |
那這邊需要引入一個特別的token,特別的符號,這個符號代表兩個句子之間的boundary。
link |
你在輸入給BERT兩個句子的時候,你會在中間加這個特別的符號,告訴BERT說兩個句子中間的交界在哪裡。
link |
但是BERT怎麼預測這兩個句子是不是相接的呢?你還要再給它輸入一個特殊的token。
link |
這個特殊的token,我們在文件上通常是放在句子的開頭,這個特殊的token代表說我們在這個位置要做classification,要做分類這件事。
link |
你用一個特殊的token代表要做分類這件事情。
link |
然後從這個特殊的token輸入的位置,輸出來的這個embedded,你把它丟到一個linear的binary classifier裡面,要這個linear的binary classifier去output說現在輸的這兩個句子,它們是應該被接在一起的還是不應該被接在一起的。
link |
那講到這邊可能有人會問說,為什麼是放在句子的開頭呢?為什麼不放在句子的結尾呢?
link |
放在句子的結尾,讓Bird讀過整個句子,然後才決定說這兩個句子應不應該是被接在一起的,不是比較合理的嗎?
link |
但是如果你仔細想想Bird的架構,如果今天Bird裡面放的是RN,那classify這個token放在句子的尾端比較合理。
link |
假設你是一個正向的RN,由左讀到右的RN,那它應該要把這兩個句子讀完以後,才有能力做分類這件事。
link |
但不要忘了,Bird的內部並不是RN,Bird的內部是一個transformer,是一個transformer的encoder,也就是它的內部是self-attention。
link |
我們上週有講過self-attention有什麼特色,self-attention它的特色就是天涯若必離,兩個相鄰的word跟兩個距離很遠的word對它來說是一樣的。
link |
對self-attention來說,假設不考慮positional encoding所造成的影響的話,一個token放在句子的開頭、放在句子的結尾,對它來說是沒有差別的。
link |
所以今天我們把一個transformer的token,不管是放在句子的開頭還是放在句子的結尾,對Bird,也就是對self-attention來說,其實是沒有差別的。
link |
那我覺得放在其他的位置,放在句子的中間、放在句子的結尾,可能影響也是不大。
link |
好,那現在Bird要做的事情就是,給它兩個句子,然後它要output說這兩個句子到底應不應該被接在一起。
link |
那你在訓練的時候,你就是要訓練它說,因為你在訓練資料裡面有非常非常多的句子,那你在爬把那些句子爬下來的時候,你會知道說這兩個句子是不是相接的。
link |
所以你就可以訓練Bird,你就可以告訴它說,看到這兩個句子,你就要output yes,看到另外兩個句子,比如說醒醒把眼睛貼上的時候,它們是不該被接在一起的,那你就要被output no。
link |
然後今天這個linear classifier跟整個Bird的neural架構是一起被訓練的,那你希望說透過解這個預測另外一個sentence的這個任務,我們就可以把Bird的部分的參數把它學出來。
link |
好,那現在有兩個方法,approach1跟approach2,那這兩個方法在文獻上是要同時使用的,當你同時使用mask跟predict下一個sentence,叫你叫Bird同時去解這兩個任務的時候,它會學得最好。
link |
接下來問題就是,好,怎麼用這個Bird呢?現在可以input一串character,我投影片上的例子是用word,實際上是character,那你知道我的意思就好。
link |
現在可以input一串word sequence,每一個word都有一個contextualized word embedding,那怎麼用它呢?最簡單的做法是,把Bird當作一個抽feature的工具,就像Elmo一樣,它就拖一種新的embedding出來給你,你要這種新的embedding,可以去做你想做的任務。
link |
但是在Bird那篇paper裡面,它不是只有做這樣子的事情,它說它是把Bird的model跟接下來你要解的任務一起做訓練,那它裡面舉了四種不同的例子,說怎麼把它的Bird跟接下來的downstream的任務把它結合在一起。
link |
第一個例子是,假設你現在要解的任務是input一個sentence,output一個class,要怎麼做?好,什麼樣的任務?input一個sentence,output一個class呢?
link |
舉例來說,在我們的作業裡面,在RM的那個作業裡面,不是要input一個句子,然後告訴我們說這個句子是正面的還是負面的,這就是一個例子。
link |
或者是文章的分類,你想要把文章分成這是體育新聞、這是政治新聞、這是財經新聞等等,對,文章做分類,那也是input一個句子,output一個class。
link |
如果是這種input一個句子,output一個class的任務,怎麼使用Bird呢?你就把你現在要做分類的這個句子丟給Bird,但開頭的地方再加一個代表分類的符號。
link |
接下來,你把代表分類的符號這個位置所output的這個embedding丟給一個linear classifier,去預測說,去predict說,現在input的這個sentence,它的class是什麼。
link |
如果用在你的作業裡面,那我想作業裡面大概沒有人用Bird吧?有人用Bird嗎?沒有,有人用Bird可以舉手一下嗎?
link |
Bird是有中文版的,所以要用你其實是可以用的。有用嗎?你有用是嗎?沒有用,好。
link |
Final讓Bird這樣是不是,好啊。Bird是有中文版的,還是Bird是有中文版的?而且人家已經幫你訓練好,你其實只是把它載下來用而已。
link |
好,所以如果在你的作業裡面就是input一個句子,把這個句子丟給那個Bird,然後它就算算算,裡面有很多層,裡面小的Bird有24層,大的Bird有48層這樣,算算算,很多層。
link |
然後在開頭的地方給它一個代表分類的符號,然後在同樣的位置output這個embedding,把它丟進一個linear classifier,然後output說這個句子是正面的還是負面的。
link |
好,那今天實際上在train的時候,linear classifier的參數是隨機初始化的,所以linear classifier它是train from scratch,它是從頭開始訓練的。
link |
那Bird的部分你也可以跟著fine-tune,也就是說你把Bird的參數跟這個linear classifier的參數是一起學的,你告訴Bird加這個linear classifier說,input這個句子你要output正面,input另外一個句子你要output負面,然後讓linear classifier跟Bird一起去做學習。
link |
linear classifier從頭學,Bird它只要微調就好,它只要微調它裡面的參數就好。
link |
好,所以你可以想像說實際上就要從頭學的參數是非常少的,因為多數的參數在Bird裡面可能都已經學得很好了,這是第一個例子。
link |
好,第二個例子是,假設我們今天要解的任務是input一個句子,然後這個input的句子裡面的每一個詞彙我們都要決定它屬於哪一個class。
link |
舉例來說,我們在講RNN的時候,我們有舉slot feeling這個test,slot feeling這個test就是我們case 2要解的任務之一。
link |
好,那在slot feeling裡面呢,你就要input一個句子,那你的machine要決定說input的句子裡面的每一個詞彙它是屬於哪一個slot。
link |
那每一個slot如果是一個class的話,那就是input的句子裡面每一個詞彙屬於哪一個class。
link |
好,那如果是第二個case的話,用Bird要怎麼解呢?如果第二個case的話,就是你現在input一個句子,每個句子現在都會output一個embedding出來。
link |
你input一個句子,現在每個詞彙都會output一個embedding出來,把每一個embedding都丟到linear classifier裡面,讓這個linear classifier去決定說這個embedding應該屬於哪一個class,然後就結束了。
link |
train的時候,也是end-to-end的train,你告訴Bird說你的input要什麼,比如說你的input要是arrived Taipei on November 2nd,那你的output要什麼,你的output是第一個word要分類成other,第二個word要分類成destination,第三個也是other,第四個是time等等,然後把linear classifier跟Bird end-to-end一起去做學習,Bird只要find two,linear classifier要從頭開始學,這是Bird的第二個應用的例子。
link |
好,第三個case是說,假設我們現在要解的任務是input兩個句子,output是一個class,那什麼時候我們要input兩個句子,output一個class呢?比如說有一種任務叫做natural language inference,natural language inference要機器學會推論這句話,你給機器一個前提,再給它一個假設,然後問它說,根據這個前提,這個假設到底是對還是錯?
link |
好,那怎麼解這種natural language inference的問題呢?那你就是給你的model兩個句子,那你的model的output就是,現在這兩個句子是根據這個前提,這個假設它是對的還是錯的還是無法判斷,那它其實是一個只有三個類別的分類問題。
link |
那如果你要用Bird來解這種natural language inference的問題的話,你就把第一個句子丟給Bird,然後再給它一個句子之間的這個分格的符號,再把第二個句子也丟給Bird。
link |
然後接下來在開頭的地方,你放一個代表分類的符號,然後在開頭的地方所輸出的這個embedding,那就拿它去做分類,把這個embedding丟到linear classifier裡面,然後讓它決定說,現在應該是true或false或者是unknown。
link |
第四個例子是要拿Bird解question answering的問題,而且是某一種叫做extraction based question answering的問題。extraction based question answering是什麼呢?extraction based question answering就是說,給你的model讀一篇文章,然後問他一個問題,希望他可以正確的得到答案。
link |
但是我們這邊放了一個水,就是說今天這個答案一定有出現在文章裡面。比如說第一題的答案是privacy,那你一定在文章裡面找得到privacy這個詞彙。最後一題的答案是within the cloud,那你一定在文章裡面可以找得到within the cloud這個詞彙。這種QA的任務叫做extraction based的QA。
link |
怎麼解這種extraction based QA的問題呢?你給他文章,你給他問題,文章跟問題都是用一個token的sequence來表示,假設現在這個文章D有n個token,文章Q有n個token。
link |
那你有一個QA的model,這個QA的model就是吃一篇文章,吃一個問題,接下來他output兩個整數。那這邊用S1來分別代表這兩個整數。這兩個整數是什麼意思呢?這兩個整數的意思是說,現在你的答案落在文章裡面的第S個token到第E個token。
link |
也就是說,你的答案就是文章裡面的第S一直到第E這一串token。
link |
好,如果這邊你沒有聽得很懂的話,我們來舉一個具體的例子。在這篇文章裡面,gravity這個詞彙是p17個word,所以今天假設你問machine這個問題,他要怎麼輸出gravity這個答案呢?
link |
如果他輸出S等於17,E等於17,那他輸出的答案就是gravity。或者再舉一個例子,這邊within the cloud是,假設是第77到第79個詞彙。
link |
好,那問這個問題,機器要怎麼輸出within the cloud呢?如果他今天輸出S等於77,E等於79,他就會輸出正確答案。
link |
好,那怎麼用press來解剛才的問題呢?怎麼用press來input問題跟文章,然後output兩個integer代表你的答案在文章裡面出現的位置呢?
link |
好,你就把問題輸進去,然後給一個分隔的符號,然後再把文章輸進去。那現在文章裡面的每一個詞彙都會有一個integer。
link |
接下來,你讓machine去learn另外兩個vector,一個紅色的vector,一個藍色的vector。這兩個vector的dimension跟這些黃色的vector的dimension是一樣的。
link |
好,那這個紅色的vector拿去跟這邊文章裡面的每一個詞彙的黃色的vector做搭發打,就是做類似attention這樣的動作,做搭發打。
link |
所以文章裡面的每一個詞彙都跟紅色的vector搭發打以後,都會算出一個scalar,把這個scalar通過softmax,有點像是分類的問題。
link |
現在每一個文章裡面的詞彙都會得到一個分數,接下來看哪一個詞彙得到的分數最高。
link |
舉例來說,在這個例子裡面,文章裡面第二個詞彙得到的分數是最高的,那我們就說s等於2。
link |
所以紅色的這個vector決定了s等於多少,接下來想必藍色的vector就是決定1等於多少。
link |
你把藍色的vector去跟每一個文章裡面的黃色的vector做搭發打,算出一個分數,再通過softmax,然後看看誰算出來的分數最高。現在第三個詞彙算出來的分數最高,那1就等於3。
link |
s等於2,1等於3,那答案就是文章的第二個word跟第三個word,也就是d2d3,就這樣。
link |
那這邊有幾個問題,第一個問題是有人會問說,假設現在s跟1矛盾了怎麼辦?
link |
就如果現在s等於2,1等於3,所以輸出第二個跟第三個詞彙當作答案,如果s等於3,1等於2,這不是沒有答案了嗎?
link |
對,就是沒有答案,這個時候你的model就output此題無解。在SQUAD 2.0裡面,有一些問題是沒有答案的,你要回答此題無解才是對的,給一個答案反而是錯的。
link |
所以如果今天output的是矛盾的case,就是1落在s的前面,你的model答案就是此題無解,而且搞不好是對的,因為那一題搞不好根本就是沒有答案,而你的model知道這件事,所以他output一個自相矛盾的結果,告訴你說他無法回答這個問題。
link |
那在這邊呢,這個紅色的vector跟藍色的vector是學出來的,在訓練的時候,你就是要給機器很多訓練資料,你要給他很多問題、文章跟答案是落在文章的第幾個詞彙到第幾個詞彙,然後給機器去學,然後希望他看到新的文章、新的問題,就可以告訴你說答案落在文章裡面的第幾個詞彙到第幾個詞彙。
link |
實際上訓練的時候,bird只要find you就好,然後這兩個vector是從render從頭開始學出來的。
link |
那在bird就是到處圖榜,你會發現說每一個NLP的任務都有人用bird幫你洗過了這樣子,如果現在網路上有一個leaderboard的話,比如網路上有排行榜,像咖啡那種排行榜的話,前幾名大概都是用bird做的。
link |
好,這個是SQUAD2.0,就我們剛才講的QA的任務,SQUAD2.0,你會發現說第一名是用bird做的,第二名也是用bird做的,第三名也是用bird做的。
link |
好,那後來還有一個東西叫做Ernie,Ernie是enhanced representation through knowledge integration,然後他根本就不應該被縮寫成Ernie,縮寫成Ernie真的是非常的牽強。
link |
因為Ernie也是一個芝麻街的人物,為了硬湊可能所以把他,Ernie是bird的好朋友這樣子。
link |
好,反正就是這樣,Ernie是bird的朋友,所以這邊有一個model就硬湊說他的名字就叫做Ernie,那他是特別為了中文而設計的。
link |
那簡單來講,他的概念就是說,現在做bird的時候不是要做mask lm嗎?那實際上bird的input是用中文的字為單位,那如果你隨機蓋掉一些字,那這些被蓋掉的地方其實非常容易被拆出來啊,所以怎麼辦?
link |
一次要蓋一個詞彙比較合理吧?所以就有了Ernie這個想法,那細節大家再看一下文章。
link |
好,那也可以分析一下說,bird究竟他每一層學到了什麼呢?舉例來說,bird有24層,那每一層做了什麼樣的事情呢?
link |
那你可以在文件上找到一些跟bird有關的分析,那我這邊就列了兩個reference給大家參考。
link |
就是bird的這麼多layer的每一層,他做的事情就像是一個NLP的pipeline,就是一般在做這個NLP的任務的時候,你可以想像說我們最初階的任務是決定每一個詞彙的詞性,接下來我們會決定這整個句子的文法剖析術是什麼。
link |
然後再接下來,你知道這整個句子的文法長什麼樣子以後,你可以做co-reference,也就是找出每一個代名詞它實際上指涉的名詞是什麼,或做semantic role labeling,或者是做relation detection,知道詞彙跟詞彙之間有什麼關係。
link |
所以這中間,NLP的任務中間是一個階層式的關係,從比較簡單的,只跟文法有關的,到比較複雜的,跟語意有關的。
link |
BERT的每一層比較接近input的層,它可能就是做比較跟文法有關的任務,而比較接近輸出的層就是做比較困難的任務。
link |
舉例來說,這篇paper裡面做的事情是說,它把BERT每一個layer抽出來的contextualized feature,抽出來把它加起來,就跟Elmo做的事情一樣。我剛才不是講說Elmo會把每一層的embedding抽出來,然後做weighted sum,然後weight是跟著任務一起學出來的嗎?
link |
這邊做的事情是一樣的,BERT有24層,所以每一個實惠可以抽出24個vector,把這24個vector做weighted sum,然後那個weight是根據任務認出來的,那看那個任務認出來的weight怎麼樣,我們就可以知道那個任務特別需要BERT的哪些層。
link |
那些weight就是這個圖上的深藍色的方塊,方塊越長就代表說那一層的embedding,它層上的weight越大。
link |
那每一個row代表了一個NLP裡面的任務,那如果那個NLP的任務的某一層的值越大,就代表說現在在解那個NLP的任務的時候,越需要BERT的某一層。
link |
舉例來說,今天如果你要解POS tagging這個任務,POS tagging任務是什麼?它是磁性標記,就是你機器要告訴你說每一個實惠,它是什麼磁性,比如某個實惠是名詞,某個實惠是動詞等等。
link |
如果是磁性標記這個任務裡面,大概你最需要的是BERT的第十一層到第十三層這個地方,你把第十一層到第十三層這個地方的weight embedding抽出來,做weighty sum,那解POS tagging這個任務是特別合適的。
link |
如果你要解的是更複雜的任務,比如說coreference這個任務的話,那你會發現說你最需要的是BERT的,舉例來說,第十七層到第十九層。
link |
所以這邊就可以發現說,如果你要解的是比如說POS tagging,或者是這邊的第二個任務跟第三個任務都是跟文法剖析有關的,你要叫機器標詞性,你要叫它幫你做文法剖析,那也許BERT的前面幾層是比較適合的。
link |
如果你要解的任務是更困難的,比如說coreference,比如說semantic role labeling,比如說relation extraction,那你通常會需要的是比較後面的、比較深的、比較多層的BERT所抽出來的latent representation。
link |
BERT也有multilingual的版本。有一個BERT,它用一百零四種語言去進行了訓練,就是Google從維基百科上爬了一百零四種語言的維基百科,然後統統丟給同一個BERT去訓練。
link |
它在看過了多種語言以後,雖然它沒有看過這些語言之間的翻譯,但它在讀過一百零四種語言的文章以後,它似乎自動學到了不同語言間的對應關係。
link |
你可以看一下右上角這篇文章,所以這個神奇的BERT它可以做到說,如果你今天要叫這個BERT去做文章的分類,你只需要給它英文的文章,讓它去學做文章的分類,它自動可以學會做中文文章的分類,就是這麼神奇。
link |
它可以做到zero-shot的能力,它看過中文,但從來沒有人教它中文文章要怎麼分類,但它只有人教它英文文章要怎麼分類,不知道怎麼回事,它自動就學會中文文章的分類。
link |
好,那接下來我們要講另外一個model,這個model叫做Generative Retraining,叫做GPT。GPT是什麼呢?它其實就是一個塑打不同的language model,它有多巨大呢?
link |
這是ELMO,ELMO有94M的參數,但是它只有這麼小而已。這個是BERT,它有340M的參數,BERT大概是ELMO的三倍到四倍高,所以我把BERT畫高一點。
link |
這個是GPT,它有1542M的參數,可能是至今有史以來最大的language model。它的賣點是什麼?它的賣點就是巨大。
link |
然後GPT它其實有兩個版本,一個是本來的GPT,那就沒有很引人注目,因為它沒有很大,然後GPTQ就非常非常大。但是這邊的問題就是,它不是芝麻街的人物,所以它就沒有形象。那等一下會跟你解釋說為什麼它是一隻獨角獸。
link |
那GPT是什麼呢?GPT其實就是transformer的decoder,我們剛剛講說BERT是transformer的encoder,GPT其實是transformer的decoder。
link |
那這個transformer的decoder它是怎麼運作的呢?我們就再跟大家很簡要的解釋一下這個transformer的decoder,這個GPT是怎麼運作的。那GPT要做的事情跟一般的language model一樣,你給它一些詞彙,它要解的任務是預測接下來應該要放哪一個詞彙。
link |
舉例來說,你給它begin of sentence這個token,再跟它輸入潮水這個詞彙,希望它可以output退了這個詞彙。那它怎麼output退了這個詞彙呢?它一樣會做self-attention,就把潮水input進去,一樣產生query,key跟value,你把潮水的key拿出來做self-attention。
link |
要跟之前已經輸入過的詞彙begin of sentence這個token的key算一個attention,也要跟自己算一個attention。然後接下來把算出來的attention跟v1還有v2做weighted sum得到v2,然後這個self-attention有很多層,這個有很多層,然後通過很多層以後最後要預測退了這個詞彙。
link |
預測出退了這個詞彙以後,就把退了拿下來,然後再問說在退了之後應該要接哪一個詞彙。那把退了這個詞彙一樣讓它輸出q跟k跟b,而你把退了的q去跟已經產生出來的詞彙,包括自己去做self-attention。
link |
所以你把q3跟begin of sentence的k1去算attention,你把q3跟潮水的k2去算attention,你把q3跟k3自己跟自己去做attention。
link |
然後算出attention以後,再跟每一個已經產生出來的詞彙的v去做weighted sum,去做weighted sum,去做weighted sum,然後就得到一個embedded,然後把這個embedded再通過很多層,最後你要預測舊這個詞彙。
link |
那這個process就反覆繼續下去,你有了舊這個詞彙以後,你要輸出舊的query跟key跟value,一樣跟之前已經輸出的東西要算做self-attention,然後再預測舊後面應該要接哪一個詞彙。
link |
這個就是GPT跟GPT-2,它們做的事情一樣就是訓練一個language model,只是這個language model非常的巨大,然後它的neural架構是conformer的decoder。
link |
因為GPT-2它非常的巨大,所以它就展現了種種的神蹟,在我看來,GPT-2它做到了很多神奇的事情。舉例來說,它可以在完全沒有訓練資料的情況下,就自動做到reading comprehension, summarization跟translation,它可以做到zero-shot learning。
link |
一般我們要叫機器做這些任務,你需要有一些訓練資料。像我們剛才在講BERT的時候,我們說BERT也可以做reading comprehension,這邊reading comprehension就是指的,就是我們剛才講的QA。
link |
BERT也可以做reading comprehension,但是你需要給它一些訓練資料。而GPT-2嘗試在完全沒有跟QA有關的訓練資料的情況下,就嘗試去硬做reading comprehension。
link |
怎麼做呢?你直接給GPT-2一篇文章,再給它一個問題,接下來你輸入A冒號,它就會自己吐出答案。
link |
摘要也是,給GPT-2一篇文章,接下來你輸入一個特殊的符號,你輸入TLDR,就too long don't read的縮寫,接下來GPT-2自動就寫出前面這篇文章的摘要。
link |
或者是有一個讓我覺得最匪夷所思的是,它居然還可以做翻譯,你就輸入給它很多英文的句子,然後跟它說,你輸入給它一個英文的句子,然後再給它一個等號,後面接法文的句子。
link |
再輸入另外一個英文的句子,再給它一個等號,後面接法文的句子,再給它一個英文的句子,再後面再輸入等號,接下來它就會輸出這個第三個英文句子的法文翻譯。
link |
好,那GPT-2它做得怎麼樣呢?那GPT-2它做得怎麼樣呢?在Reading Comprehension的結果,我覺得是蠻驚人的,在QA上,這個是GPT-2可以達成的結果。
link |
縱軸是F1 score,這個分數越高代表這個正確率越高,橫軸是GPT-2所使用的參數,那最大的那個model有1500個million,最大的那個model它的performance居然跟Dr.QA可以相提並論。
link |
不要忘了,GPT-2是zero-shot learning,從來沒有人教它任何跟Reading Comprehension有關的事,它自動在看到A冒號以後就可以輸出答案。
link |
那可能在訓練資料裡面,這個GPT-2是用40Giga的文章所訓練出來的,那可能在這些文章裡面,常常出現A冒號,後面就接問題的答案。
link |
那GPT-2它自動學到說讀一篇文章讀一個問題看到A冒號,接下來就輸出問題的答案,這是Reading Comprehension的結果。
link |
不過GPT-2在summarization跟translation上的結果很差,在summarization上的結果大概跟random差不多,所以還好它其實還沒有那麼神奇。
link |
有人分析了一下GPT-2的attention做的事情是什麼,那你可以看一下相關的文章。
link |
舉例來說,在GPT-2裡面,左邊是下一層的結果,這個是前一層要被attention的對象。
link |
比如說他要輸出,他在she這個位置,他會attent到nurse,在he這個位置,他會attent到the doctor,所以性別的bias讓他覺得說某些職位就跟某些性別是有關係的。
link |
那這個是,如果你做visualization的話,你就可以對你的model做一些分析。
link |
左邊是對不同層的不同的head做一下分析,這邊是從第0層到第5層,這邊是從第1個head到第6個head。
link |
那你分析以後就會發現一個非常神奇的現象,就是很多詞彙他不知道怎麼回事,他都要attent到第一個詞彙。
link |
你有沒有發現說,這邊很多不同的詞彙,他們都要看第1個詞彙,很多不同的詞彙都要看第1個詞彙,很多不同的詞彙都要看第1個詞彙。
link |
第1個詞彙有什麼特別的地方呢?可能沒有什麼特別的地方。
link |
所以一個可能就是,當今天不知道要attent到什麼地方的時候,就今天我們不需要做attention這件事情的時候,
link |
因為我自己學到說不知道要attent在哪裡,我不需要做attention的時候,就attent在第1個詞彙。
link |
所以這告訴我們說,也許未來在做這種model的時候,我們可以在句子裡面再加一個特別的token,
link |
這個特別的token叫做,你不知道attent在哪裡,就attent到這裡的樣子。
link |
然後Machine就會知道說,今天不知道attent在哪裡的時候,就attent到那個特別的token。
link |
那這個是Visualization可以告訴我們的事情。
link |
那這個GPT-2它真正展現龐大力量的是,它可以自己做寫作。
link |
我剛才說它是一個language model,它可以predict下一個詞彙,所以你可以給它幾個詞彙以後,它就自己幫你把整篇文章完成。
link |
那以下這一則的例子是來自於,這個GPT-2是OpenAI做的,以下這個例子是來自於OpenAI的Blog。
link |
它們就給GPT-2一篇文章的前半段,這篇文章是跟獨角獸有關係的,它就是說,"In a shocking finding, scientists discovered a herd of unicorns living in a remote, previously unexplored valley in the Andes Mountains."
link |
然後接下來,Machine就自己把這篇新聞完成,它就開始幻想,"The scientists named the population after their distinctive horn, Obelisk Unicorn."
link |
它們是有名字的,叫做Obelisk Unicorn。
link |
This four-horned, silver-white unicorn were previously unknown to science,然後就自己寫完整篇文章。所以為什麼講到GPT-2的時候,它的形象就是一堆獨角獸在遙遠的Andes山上。
link |
其實後來OpenAI它們沒有release最大的GPT-2的model,它們沒有release有1500個million參數的那個GPT-2 model,它們的理由是因為它們覺得這個model的力量太過強大,它沒有辦法控制,它會拿來產生很多假新聞。
link |
所以它們居然沒有release那個model,它們只release了一個比較小的版本,而那個比較小的版本是有人拿那個比較小的版本做了一個demo。
link |
這邊有一個Transformer的demo網頁,那這個demo網頁是一個叫Adam King的人做的,那他應該不是OpenAI的成員,所以他用的並不是最大的那個GPT-2,他用的是public available的GPT-2,那這個GPT-2的大小大概跟Bert差不多。
link |
好,那你就輸入一個句子,它就會把那個句子完成,我們剛才不是說GPT-2可以做到zero-shot的reading comprehension嗎?那我們現在就來試試它的能力,舉例來說,我們問它What is machine learning?
link |
好,那加個A貌號,它就會告訴我們什麼是machine learning。好,什麼是machine learning呢?Machine learning refers to a technique aimed at detecting patterns in data where a person does not actually have any information needed to make those inferences.
link |
A computer learns how to learn by performing this technique. Examples of machine learning techniques are classification and signal-to-noise ratio analysis, 等等。雖然講得很奇怪,怎麼突然講到SNR,但至少它是還是蠻像個樣子的。
link |
不過我們這個machine learning,應該是在這個GPT-2看過的data裡面,我們故意問它一些奇奇怪怪的東西,看它會怎麼回答。舉例來說,我們問它什麼是lualu learning。
link |
它說,What is lualu learning? Lualu is simply a name of the most popular means on the internet, based on the name of the site it originated from. 不知道在說些什麼,不過看起來還蠻像個樣子的。
link |
那這個GPT-2它甚至可以寫個劇本。舉例來說,今天June碰到Mary,June說Hello,然後Mary說Good morning,然後June就告白這樣子。
link |
然後Mary就說你是個好人。好,那我們就讓GPT-2幫我們把這個故事完成。接下來June會說什麼呢?
link |
Oh,她就說Goodbye這樣子。好,我這個故事太短了,重新再產生一個。Oh, Mary, you are wonderful, even though they are both crazy about each other. I'm really sorry. Mary, I'm sorry you love her so much, but she's always doing something.
link |
它就可以自動幫你寫一個劇本。好,那如果你想要有比較多人的對話的話,你就把這邊的句子弄少一點。
link |
那這邊就會出現Johnny。其實它也會寫程式啦,所以我們可以這樣子import numpy snp import tensorflowstf。
link |
好,來寫個程式。它現在是在寫Python的程式。其實它也會寫C語言啦,我們就include stdio.h。
link |
好,然後我們要intmat。好,那會不會幫我們把argc argv寫出來呢?
link |
argc argv,你看它就寫了另外一種程式語言。