back to index
【機器學習2021】機器終身學習 (Life Long Learning, LL) (一) - 為什麼今日的人工智慧無法成為天網?災難性遺忘(Catastrophic Forgetting)

link |
好,那接下來的課程呢,要跟大家講Lifelong Learning,那什麼是Lifelong Learning呢?
link |
如果你GoogleLifelong Learning這個東西啊,你最有可能找到的,不是跟Machine Learning相關的內容。
link |
Lifelong Learning,從它字面上的翻譯,你可以知道Lifelong Learning指的就是終身學習,也就是活到老學到老。
link |
所以如果你用Lifelong Learning做關鍵字去Google的話,你通常找到的都是有關人類的Lifelong Learning,人類怎麼活到老學到老。
link |
那雖然今天大家關注的主題比較偏向人類怎麼做Lifelong Learning,但是其實機器也需要做Lifelong Learning。
link |
機器可以做Lifelong Learning這件事情非常接近人類對AI的想像。在還沒有修這門課之前,在還沒有接觸任何Machine Learning的內容之前,也許你對AI的想像是這個樣子的。
link |
我們先教機器做某一件事情,比如說學會做語音辨識,它就會做語音辨識了。接下來你再教它第二個任務,教它做影像辨識,它就會做影像辨識了。
link |
接下來你再教它做第三個任務,也許是翻譯,它就會做影像辨識加語音辨識加翻譯了。
link |
你不斷教它新的技能,等它學會上百萬、上千萬的技能以後,它就變成天王,然後就可以統治人類。
link |
我們一般人對AI的想像是,AI可以不斷地學習新的任務,最終越來越厲害,直到人類不能氣急的程度。
link |
這個構想、這個目標就是Lifelong Learning。Lifelong Learning常常縮寫成三個L,LLL,Triple L,不是LOL,是LLL。
link |
Lifelong Learning也有很多其他很潮的名字,比如說有的人叫它Continuous Learning,有人叫它Never Ending Learning,聽起來都很潮。
link |
有一個比較不潮的名字是Incremental Learning。但是你可能會想說,Lifelong Learning這個目標太過遠大,我今天又沒有要做天王,那Lifelong Learning對我有什麼意義呢?
link |
在真實的application裡面,Lifelong Learning也是派得上用場的。
link |
舉例來說,今天你在實驗室裡面開發出某一個模型,你在實驗室裡面收集一些資料,把這些資料進行訓練,訓練出一個模型,模型上線以後,它會取得來自使用者的feedback。
link |
這時候我們都希望收集資料這件事情可以變成一個循環,我們模型上線以後收集到新的資料,新的資料就可以讓我們來更新我們模型的參數。
link |
模型的參數更新以後又可以收集更多的資料,收集更多的資料,模型的參數又可以再次更新,不斷更新模型的參數,最終我們的系統就會越來越厲害。
link |
你可以把舊有的資料想成是過去的任務,把新的資料來自於使用者feedback的資料想成是新的任務。
link |
所以,這樣子的情境也可以看作是lifelong learning的問題。機器不斷地在線上收集資料,用線上收集的資料來更新模型,這本質上就是一個lifelong learning的問題。
link |
那lifelong learning有什麼樣的難點呢?我們不就是讓機器不斷地看新的資料,不斷地去update它的參數,就做到lifelong learning了嗎?
link |
那為什麼lifelong learning會是一個值得研究的問題呢?以下舉一個簡單的例子,告訴你說lifelong learning的難點出在什麼樣的地方。
link |
假設我們現在有兩個任務,第一個任務是要做手寫數字辨識,給它一張非常noisy的image,機器要判斷說這裡面是圖片裡。
link |
任務二也是手寫數字辨識,只是現在是比較簡單的任務,你的圖片裡面是沒有任何雜訊的,我們要讓機器學會這兩個任務。
link |
那講到這邊,有人可能會說,啊,老師,這不算是兩個任務了,這個算是同一個任務,不同的domain。
link |
你要這樣想也沒問題,你也可以想成是同一個任務,不同的domain。我知道當我說我們要讓機器學一連串的任務的時候,
link |
在你心裡的想像也許是機器先學個語音辨識,再學個影像辨識,再學個翻譯,但其實今天lifelong learning都還沒有做到那個程度。
link |
一般在lifelong learning的文獻上,所謂的不同任務指的差不多就是我這邊這種等級,通常比較像是不同的domain而不是不同的任務,
link |
只是我們在這邊把它當作不同的任務來看待。但就算是非常類似的任務,你在做lifelong learning的時候也會有以下的問題,等一下就是來看看有什麼樣的問題。
link |
好,那我這邊我就訓練一個非常簡單的network,它只有三層,每層50個neural。
link |
先在任務一上學一下,在任務一上學完以後,我們得到的結果是這個樣子的,任務一正確率90%。
link |
就算還沒有看過任務二,任務二也已經得到96%的正確率了,這個transfer的結果非常的好,能夠解任務一其實就能夠解任務二了。
link |
任務一學完之後,我們再讓同一個模型繼續去學任務二。
link |
所謂同一個模型繼續去學任務二的意思就是,我們在學任務二的時候,並不是讓機器從頭學起,並不是讓機器從一組random initialize的參數學起,
link |
而是用任務一的資料更新完模型之後,同一個模型接下來繼續用任務二的資料來更新。所以聽清楚哦,是同一個模型繼續用任務二的資料來更新。
link |
好,那所以同一個已經學完任務一的模型,在學任務二會發生什麼事呢?這是我們得到的結果。
link |
任務二正確率變更高了,因為之前根本沒看過任務二的資料就有96%,看過任務二的資料當然更厲害,變成97%。
link |
但糟糕的事情是,機器忘了怎麼做任務一了。它本來任務一有90%的正確率,在它學會任務二以後,任務一變成只有80%的正確率,它忘記了它過去已經學到的技能。
link |
有人看到這邊可能會覺得說,老師,這有什麼好奇怪的呢?你這個network就是一個小小的network啊,那你叫它學任務二嘛,那任務一是之前學的嘛,
link |
那它當然就,它的能力有限啊,它腦容量有限啊,學完任務二以後當然就忘了任務一嘛。
link |
但是我接下來告訴你另外一個實驗,假設我們把任務一跟任務二的資料直接倒在一起會發生什麼事呢?
link |
假設我們把任務一跟任務二的資料倒在一起,同時去訓練這個network,我們得到的結果是這樣子的。
link |
任務一可以得到89%的正確率,任務二可以得到98%的正確率。
link |
也就是對這個network而言,要同時學好任務一跟任務二,它是辦得到的。
link |
雖然它每一層只有50個neuron,但50個neuron已經足以讓它同時在任務一上、任務二上得到這樣子的正確率。
link |
但不知道為什麼,如果不是同時學任務一、任務二,而是先學任務一再學任務二的話,它在學任務二的時候就會忘記任務一學過的東西了。
link |
它有足夠的能力把兩個任務都學好,但是當你讓它依序學習的時候,它沒辦法記住舊的任務。
link |
我剛才舉的例子是影像辨識的例子。我接下來再舉一個自然語言處理的例子,告訴你說,剛才看到的那個狀況不是一個特例,它是一個非常一般、非常常見的現象。
link |
這邊要舉的例子是QA question answering,也就是我們的作業期。在作業期裡面,你知道你可以讓機器讀一篇文章,問它一個問題,然後它可以回答你的問題。
link |
我們在這邊用的並不是作業期的資料,而是更簡單的QA的任務。這個QA的任務叫做BABI,通常就念成baby。baby是一個非常早的QA的任務。
link |
在人們剛開始研究QA,在人類剛開始想要用deep learning的技術解QA的問題的時候,一開始人們覺得QA的問題太難了,我們要用neural network,用deep learning的技術解它,感覺非常困難。
link |
所以Facebook就先定義了二十個簡單的QA的任務,它們叫做BABI。這些QA的任務不是真實的QA的任務。你如果打開你的作業期的資料,跟BABI的資料進行比較的話,你會發現你作業期的資料是遠比BABI難得多的。
link |
BABI裡面的文章都是用某種規則生成的,用某種template固定的句型生成的,問題也是用固定的句型生成的。所以BABI是一個非常簡單的任務,它裡面看起來就像這樣。
link |
Mary把蛋糕給了Fred,Fred把蛋糕給了Bill,Bill把牛奶給了Jeff,然後問你說,誰把蛋糕給了Fred?答案是Mary,就這麼簡單。或者是第十五個任務裡面是,羊會怕狼,貓會怕狗,老鼠會怕貓,然後Gertrude是一個羊,那她怕什麼?她怕狼。
link |
都是這麼簡單的問題。今天你一定會覺得說,這個問題對Neo來說不是問題,作業期都學得起來,這麼簡單的問題沒有學不起來的道理。
link |
不過在當年,能夠讓機器學會這麼簡單的問題,人們已經覺得非常震驚了。
link |
接下來我們要做的事情是讓機器依序學過這二十個QA的任務。一般BABI的使用方法是把二十個任務統統倒在一起,讓機器一次學二十個任務。
link |
或者是二十個任務就圈二十個模型,二十個模型各自有不同的技能。我這邊想要做的事情是把二十個任務一字排開,讓機器從第一個任務學起學到第二十個任務,看看它能不能夠把二十個任務都學會。
link |
結果是這個樣子,我們這邊只看任務五的正確率。縱軸是任務五的正確率,橫軸是依序學二十個任務的過程。
link |
任務五就是這麼簡單,就是我們剛才看過的蛋糕的例子。先讓機器學任務一,再學任務二,再學任務三,再學任務四。
link |
把這四個任務依序學完,你發現說任務五正確率都是零,把任務一到四都學完,任務五正確率都是零。
link |
這件事沒什麼好驚訝的,因為它還沒學到任務五,所以它當然不知道要怎麼解任務五的問題,不教而殺為之虐嘛,所以它不會解任務五的問題得到正確率0%。不能怪你的model。
link |
接下來學完任務五以後會發生什麼事呢?學完任務五以後,正確率直接暴衝變成100%,因為看過任務五的訓練資料了嘛,機器知道怎麼解任務五,所以任務五正確率變100%。
link |
但是當我們繼續學剩下的任務的時候會發生什麼事呢?你發現正確率一陣暴跌,當機器學完任務六之後,任務五的正確率就變0%了。
link |
學完任務七再去測試任務五就變0%了,機器只要一學新的任務、舊的任務,馬上就忘得精光。
link |
那你可能會以為說,會不會是因為機器就是沒有能力多學好幾個任務呢?其實不是的。
link |
剛才在左邊這個圖是任務五的正確率,讓機器依序學20個任務。如果我們把20個任務的資料通通倒在一起,讓機器同時學20個任務的話,會發生什麼事呢?
link |
右邊這張圖是機器同時學20個任務的結果。這邊的縱軸並不是某一個任務的正確率,而是對應到1的正確率,對應到1這個座標的正確率,就代表第一個任務的正確率、第二個任務的正確率、第三個任務的正確率,一直到第20個任務的正確率,以此類推。
link |
你發現,讓機器同時學20個任務的時候,當然有些任務很難,比如說任務19,機器學不會,但是機器是可以同時學會多個任務的。有好幾個任務,機器都可以得到非常高的正確率,但是這是同時學的狀況。
link |
但你讓機器依序學的時候,它就是學了新的東西,就忘了舊的東西。而右邊這個實驗告訴我們說,機器明明有能力學多個任務,但是你讓它依序學一個一個任務的時候,它就是不肯把多個任務都學會。
link |
所以它明明可以精通多個任務,卻不肯做到。它不是做不到,它是事不為也,非不能也。所以你會發現說,當機器依序學多個任務的時候,它就好像是一個腦袋有洞的人,它就像左邊這個人一樣。
link |
新的任務進來,舊的東西就掉出去了,它永遠學不會多個技能。而這個狀況叫做catastrophic forgetting。在forgetting前面,特別加上catastrophic這個形容詞。
link |
人類也會遺忘,所以機器會遺忘也許不是什麼特別驚人的事。但是機器遺忘的程度也未免太過分了,基本上它根本就學不會新的技能。所以這種遺忘前面加上了一個形容詞叫catastrophic災難性的,告訴我們說這個遺忘不是一般的遺忘,它是災難性的遺忘。
link |
怎麼讓機器有辦法依序學習多個任務?但在我們繼續討論技術之前,也許你會有一個問題,也許你會問說,等一下,剛才我們不是看到說只要把多個任務的資料統統倒在一起,機器就可以學多個任務了嗎?
link |
把多個任務的資料倒在一起同時學,這個叫做multitasked training。multitasked training就可以讓機器學會多個任務了,那這個life-long learning的問題有什麼好研究的?
link |
但是你想想看,假設現在我們要讓機器學第1000個任務,你要讓機器避免遺忘前面999個任務,你必須要把前面999個任務的資料統統都拿出來。
link |
然後把它跟第1000個任務倒在一起,把這1000個任務所有的資料統統倒在一起一起做訓練,機器才能同時學會同時具有這1000個任務我們要它學的技能。
link |
但是在實務上,這可能會是有問題的,因為如果我們要讓機器學第1000個技能,需要前面999個任務的資料,那意味著機器需要把它一輩子看過的資料統統都背在身上。
link |
它必須要把一輩子看過的資料統統都存下來,你可能根本沒有那麼大的空間可以儲存所有的資料。
link |
而另外一方面呢,computation也是一個問題,如果我們今天需要把1000個任務的資料統統倒在一起才能進行訓練,那這個訓練的時間可能太長了,1000個任務的資料全部倒在一起可能太多了,那你訓練的時間可能會太長,那就沒有辦法讓機器學習多個任務。
link |
所以假設今天機器一定要做multitask learning才能夠學習多個任務的話,那就好像是說有一個人,假設我們要教他上一門新的課,他必須要把他這輩子所有學過的課所有讀過的教材統統都再讀一遍,他才有辦法學習新的任務。
link |
那這樣顯然非常沒有效率嘛,而且隨著你要學的任務越來越多,你訓練的時間就會越來越長,你需要儲存的資料也會越來越多。
link |
所以multitask training雖然可以讓機器學習多個任務,但是它不是解決lifelong learning最終的solution。
link |
那在文獻上,通常會把multitask training看作是lifelong learning的upper bound,就是如果我們把所有的資料統統倒在一起,雖然當任務多的時候這是一個不切實際的做法,但是它可以讓機器學會多個任務。
link |
所以把所有的任務倒在一起一次做訓練,multitask learning往往視為是lifelong learning的upper bound,是lifelong learning沒有辦法超越的結果。
link |
那所以你在做lifelong learning的研究的時候,你往往會比如說先跑個multitask training的結果,告訴我們說upper bound在哪裡,然後再看看你的lifelong learning的技術能不能夠逼近這個upper bound的結果。
link |
我們來看一下有沒有同學有問題。有同學說,multitask learning等於是讓機器做複習,performance當然比較好。
link |
對,我們現在要問的就是,在不准複習的前提之下,可不可以不要忘記之前看過的東西,不要每次學新的東西都一定要複習舊的東西。
link |
有同學問說,會有這種catatrophic forgetting的現象,是因為他的loss是根據多個task做調整的嗎?可以說是,等一下我們其實會解釋catatrophic forgetting的現象是怎麼來的。
link |
分別學再做ensemble。等一下下一頁的投影片會告訴你說,分別學會有什麼樣的問題。有同學說,如果是接著學把舊的parameter改成不好的方向,卻沒有用原本的loss把它校正回來,是這樣嗎?
link |
對,沒錯,等一下我們就會解釋catatrophic forgetting為什麼會發生。這位同學的名字是日文的,講的是蠻類似的。
link |
如果我們只讓每一個任務都分開學一個模型,確實就沒有catatrophic forgetting的問題,但是我們會遇到的第一個問題是,假設我們要叫機器學的技能非常非常的多,我們要學個天網,天網總是要會上億個技能吧,我們總不能每個技能都有一個模型吧,這樣子你可能沒有辦法把所有的模型儲存下來。
link |
另外一方面,如果我們是不同的任務就用不同的模型,不同任務的資料間就不能夠互通有無,它沒有辦法從其他的任務裡面汲取單一個任務所沒有辦法學到的資訊。
link |
而且你想想看,對人類來說,我們只有一個腦,但這個腦卻可以學會多種不同的任務,不斷學會新的技能。我們並不需要每一個任務都用一個獨立的腦來儲存,但是為什麼機器不能夠做到一樣的事情呢?
link |
這個就是Lifelong Learning想要探討的問題,能不能一個模型學多個任務。講到這邊,有同學可能會說,這個聽起來跟Transfer Learning挺像的。
link |
Transfer Learning就是讓機器在任務一上學習,希望任務一上學到的技能可以transfer到任務二上面去。但是Lifelong Learning跟Transfer Learning,雖然它們都是叫機器學多個任務,但它們的關注點是不一樣的。
link |
在Transfer Learning裡面,我們在意的事情是,機器在第一個任務上面學到的技能能不能夠對第二個任務有幫助,所以我們只在意在第二個任務上機器做得好不好。
link |
但Lifelong Learning的關注點是不一樣的。Lifelong Learning的關注點是,當機器學完第二個任務的時候,回過頭去再看第一個任務,它到底還能不能夠解第一個任務。
link |
所以雖然Lifelong Learning跟Transfer Learning都會involve兩個任務,都要考慮兩個任務,但Transfer Learning在意的是新的任務做得怎麼樣,而Lifelong Learning它是在意舊的那個任務做得怎麼樣。
link |
在講Lifelong Learning的技術之前,我們來講一下怎麼評估一個Lifelong Learning的技術做得好不好。當然要做Lifelong Learning之前,你得先有一把任務讓機器可以依序做學習。
link |
但是其實今天,如果你看那些Lifelong Learning的文獻的話,所謂的一把任務往往都是比較簡單的一些任務。一個常見的setting是這個樣子,你的任務一是做手寫數字辨識,任務二其實還是手寫數字辨識。
link |
但是這些點點看起來像是星星的圖,到底是在做什麼呢?這些是我們把每一個數字用某一種固定的規則把它打亂。每一個任務就是把數字做不同的打亂,就成為不同的任務。
link |
Permutation還算是比較難的,還有看過更簡單的是把所有的數字往右轉15度算是新的任務,往左轉15度也算是新的任務。所以每一個任務都還是數字,只是圖片的角度不太一樣而已。這樣你也可以來研究Lifelong Learning。
link |
或者是另外一種狀況是,你的任務一是要讓機器分辨0跟1,任務二是要讓機器分辨2跟3,任務三是要讓機器分辨4跟5,以此類推。但是對機器來說,0就是第一個class,1就是第一個class,2就是第一個class,3就是第二個class,4就是第一個class,5就是第二個class。
link |
所以今天你給它一張5,它是要判斷5屬於第二個class,判斷3屬於第二個class,判斷1屬於第二個class,判斷0、2、4屬於第一個class,然後依序進行訓練。
link |
Lifelong Learning這個作業是選擇題,助教也有提供一些程式,但是這些程式你能夠跑過是最好,但我們要的就不是程式的結果,而是根據程式的內容問大家一些問題。
link |
其中一個送分的問題就是會問你說,在助教程式裡面,所謂的不同的任務是怎麼樣定義的?
link |
那這邊是有關任務sequence的定義。再來要講,我們如果有一堆任務的話,我們怎麼評估一個Lifelong Learning的演算法做得好不好呢?
link |
你評估的方法是這個樣子的。你有一排任務,然後你先有一個隨機初始化的參數,把這隨機初始化的參數用在這大T一個任務上,得到大T一個正確率。
link |
你有這大T一個任務的testing set,把隨機初始化的參數用在這大T一個任務上,得到大T一個accuracy。
link |
接下來,你讓model先學第一個任務,學完第一個任務,拿第一個任務的訓練資料出來,學完第一個任務以後,在這T一個任務上,再去量一次正確率。
link |
學完第二個任務以後,再去這T一個任務上,再量一次正確率。學到底T減一個任務以後,在這T一個任務上,再學一次正確率。
link |
學完最後一個任務以後,在這T一個任務上,再算一次正確率。你會得到這樣一個表格。接下來,你會用這個表格來判斷一個Lifelong Learning的model做的怎麼樣。
link |
在這個表格裡面,每一個數值指的就是某一個任務它的測試資料的正確率。
link |
這個表格裡面的每一個數值都有兩個下標,I跟J。第一個下標代表說,這個是訓練完第一個任務以後的正確率。
link |
第二個下標指的是,這是在這一個任務上的正確率。比如說R21的意思就是說,現在你的model剛學完任務2,它在任務1的正確率上怎麼樣。
link |
R大T減一2的意思就是說,你的模型剛學完大T減一這個任務,它在任務2上表現的怎麼樣。
link |
如果我們今天看的是I大於J的那一些正確率的話,那意味著什麼呢?I是比較後面的任務,J是比較前面的任務。
link |
也就是我們想要知道的事情是,今天讓模型訓練完任務I以後,它在過去已經訓練過的任務J上到底表現的怎麼樣。
link |
它有沒有忘記任務J過去學過的東西。如果今天我們看的是I小於J的那些R的話,那代表什麼?
link |
代表是說,我們剛學完任務I,還沒去學任務J,但機器會不會就無私自通,已經匯解任務J了呢?
link |
這邊要看的是機器transfer的能力,在新的沒有看過的任務上transfer的能力怎麼樣。
link |
最常見的評估一個life-long learning系統的方法,就是把最後這個role的正確率加起來,就結束了。
link |
你就讓你的模型依序學過所有的任務,到最後一個任務都學完以後,去之前所有的任務上面都算一遍正確率,平均起來,就代表你的life-long learning的方法的好壞。
link |
當然這個值可能會是最高的,因為剛學完任務D大T,在任務大T上當然表現最好。
link |
那在前面的任務,你的模型就會逐漸忘記,第一個任務可能就是忘記得很慘的,完全忘記了可能正確率是趨近於0的,第二個任務可能稍微好一點,正確率1-2%等等。
link |
那把這些所有的正確率平均起來,就是評估一個life-long learning系統的好壞,常見的用法。
link |
那其實還有其他的評估方法,有一個評估的方法叫做backward transfer。
link |
這個backward transfer是拿兩個數值出來相減,它是拿RT-1去減掉R11,拿RT-2去減掉R22,以此類推,然後把所有的任務都加起來做平均,那這個值就是backward transfer。
link |
那這個RT-1-R11,這邊是拿RT-1-R11,或者是RT-2-R22,RT-2-R22,它們到底是什麼意思呢?
link |
它們的意思是說,當你的模型先學完任務1的時候,在任務1上的正確率,跟學到大T的任務完以後,在任務1上的正確率差多少?
link |
當學完任務1的時候記憶猶新,這個時候正確率是最高的。那隨著學的任務越來越多,那你的正確率就會不斷地遞減。
link |
那到底會減少多少呢?所以我們把這兩個R進行相減,可以評估說現在遺忘的程度有多嚴重。
link |
那因為機器每次看到新的任務以後,舊的任務就會不斷遺忘,所以你可以想見說RT-1通常是比R11小的啦,RT-2通常是比R22小的啦。
link |
所以如果你是拿RT-1-R11,RT-2-R22的話,你通常得到的值是負的,所以backward transfer通常算出來的值是負的,是小於0的。
link |
如果你今天可以提出一個life-long learning的方法,它很厲害,它的backward transfer算出來是正的,那你就很厲害了,因為通常backward transfer都是負的。
link |
如果你說機器學了新的任務以後,它還可以畜類旁通把原來的任務1做得更好,它學完新的任務以後畜類旁通把原來的任務2做得更好,那你提出來的life-long learning就很厲害了。
link |
一般life-long learning做不到這件事,通常只要這個指標負得太嚴重就已經很厲害了。
link |
那還有一種評估方式叫做forward transfer,forward transfer通常就比較不是life-long learning的重點。
link |
forward transfer想要問的問題是說,今天在看過一系列的任務,我這個有點卡頓,我也不知道為什麼,這個滑鼠有點卡頓。
link |
不過沒關係,我現在看看同學有沒有問題,好,大家沒有問題,我們繼續講。
link |
好,今天這個forward transfer要問的問題是說,在還沒有看過某個任務,只看過其他任務的時候,機器到底已經學到什麼樣的程度?
link |
所以你在做forward transfer的時候,你就是拿Rt-Et去減R0t。
link |
這個Rt-Et去減R0t,它的意思是說,今天在還沒有看到任務大T的時候,只看到任務T1到T-1的時候,你的模型到底可以學出什麼樣程度的結果?
link |
這個是forward transfer。
link |
好,那接下來就是準備要進入life-long learning的解法了。