轉載:blog.csdn.net/tiangcs/art…html
做者:田小成plusgit
論文:《Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks》github
上一篇博客是對這篇論文的純翻譯,此次來說解下這篇論文是怎麼作 meta-learning 的,這篇論文是 2017 年發表在 ICML 會議的,算是 optimization based 這個方向的開篇之做,後續的一些文章都有借鑑此論文的 idea。並且這篇論文的思想很簡單,可是看明白後會驚訝於做者的思想是如此神奇,簡單之中蘊含着大道理。算法
meta learning 俗稱元學習,目標是 learn to learn,即學會如何學習。聽起來有點繞,大白話解釋就是經過以前任務的學習使得模型具有一些先驗知識或學習技巧,從而在面對新任務的學習時,不至於一無所知。這更接近於人的學習過程,咱們人在過去的經歷中,會不斷地積累學習經驗,使本身的知識積累變得愈來愈豐富,因此在面對新問題的時候,並非一無所知的,能夠自動借鑑以前類似問題的經驗來解決新問題。因此元學習也被稱爲是機器實現通用人工智能的關鍵技術。markdown
meta-learning 學習的對象是 Tasks,而不是 Samples 樣本點,由於 meta-learning 最終要解決的問題是在新的 task 上能夠更好的學習,因此要遷移以前 task 上的學習經驗。那麼在訓練階段,輸入的就是不一樣的 tasks,以下圖所示,全部的 task 都是五分類任務,每一個 task 仍然有訓練集和測試集,訓練集是 5 類不一樣的圖片,該 task 的測試集是這 5 類中沒有出現過的樣本。不一樣的 task 對應的 5 個類別是不同的,那麼在若干個這樣的 task 上訓練以後,須要在一個新的任務上進行 meta 的測試/推理,測試任務是從未見過的 5 個類別的樣本,讓模型在這些樣本上進行微調的訓練,只不過這時候的模型在訓練時就已經具有了以前學習到的 「經驗」,從而能夠快速適應測試任務。網絡
transfer learning 遷移學習,一樣也是遷移以前學習到的 「經驗」,在新的數據上進行微調,好比用在 ImageNet 大數據集上預訓練的 VGG 等模型,在本身的圖片數據集上微調 VGG 進行特徵提取,不過這裏和 meta-learning 有本質的區別,稍後會詳細說明。oracle
multi-task learning 是多任務學習,多個任務一塊兒進行訓練,以達到相互輔助訓練的做用,這裏的多任務能夠是同一數據多個目標任務,也能夠是多個數據同一個目標任務,如在人臉識別數據集上,既進行人臉識別任務,又要預測出該人臉的性別和年齡等。app
few shot learning 少樣本學習,是指一份數據中可用來訓練的樣本不多,好比只有 10 條或者 5 條樣本,那麼這時候用常規的訓練方式,是學不出什麼的,由於可用信息太少了,那麼天然就會想到用 meta-learning 的方式來訓練,藉助以前任務的先驗經驗來學習少樣本的任務。few shot learning 能夠說是 meta learning 在監督學習中的一個典型應用,而 meta-learning 我的以爲是一個思想框架,能夠用在少樣本數據上也能夠用在多樣本數據上,只不過在 few-shot 的場景下,更能發揮出它的威力。好比一個10條樣本的分類數據,用普通的訓練方式,可能只取得 10% 的準確率,但用 meta-learning 的方式訓練能夠取得 70% 的準確率。 樣本數量比較多的時候,用普通的訓練方式就能夠取得不錯的效果,好比準確率 95%,用 meta-learning 的方式可能取得 97% 的準確率,但預訓練過程就比較麻煩了。框架
few shot learning 中還有兩個比較特殊的場景,就是 one shot 和 zero shot,即只有1個樣本,甚至是零訓練樣本的場景,不過不在此次的討論範圍以內,若是你們比較感興趣能夠自行查找這方面的論文,few shot learning 目前也是學術上的研究熱點。機器學習
文章開頭提到 meta-learning 的研究共有三個方向,第一個方向就是 optimization based meta-learning,而 MAML 是這個方向的開山之做,因此要想知道 MAML 是怎麼作的,首先要知道這個方向是如何實現 metalearning 的。
思考一下,咱們平時普通 learn 的模式是怎樣訓練模型的?以 DNN 網絡模型爲例,首先是搭建一個網絡模型,接着對模型中每層的參數進行初始化,而後不斷的進行「前向計算 loss -> 反向傳播更新參數」的過程,直到 loss 收斂。這個過程當中,模型初始時對當前數據是一無所知的,因此要經過隨機初始化的方式對參數進行賦值,儘管用多種初始化方式,但總歸都是隨機的。那麼有沒有方法可讓模型從一個給定的位置開始訓練呢,而且這個初始位置給的好的話,好比就在全局最優解附近,可能只須要迭代幾回模型就收斂了。答案是確定的,這個方向的 metaleaning 就是來作這個事情的。簡單總結下就是** optimization based meta-learning 是經過以前大量的類似任務的學習,給網絡模型學習到一組不錯的/有潛力的/比較萬金油的參數,使用這組參數做爲初始值,在特定任務上進行訓練,只須要微調幾回就能夠在當前的新任務上收斂了**,這句話有幾個值得注意的地方或者使用要求:
乍一看是否是以爲和遷移學習有點像,最終形式都是從一組已知參數開始微調,可是這兩個方式是有本質的區別的,這個後面還會再講到。
在開始講論文以前,先來看一個形象化的例子,這個例子是樓主騎車的時候無心中想到的,和論文的思想很像。這個例子就是老師教學生學習的過程,場景設定是有一個剛開始時對世界一無所知的學生,這個學生但願經過不斷的學習,具有必定的學習技巧或經驗,從而能夠在新的沒有見過的科目上,只須要簡單的學習幾天,就能夠在該科目上考出好成績。爲了達到這個目的,該學生請了一個老師,老師爲了訓練學生的學習能力,讓這個學生同時學習不一樣的科目,好比語文、數學、英語等,而後每一個科目都學習七天,七天以後進行各科的考試,老師會計算出該學生的平均考試成績,並根據此次的平均成績,對該學生的學習作出相應的指導,好比調整學習路線或者告訴他一些學習技巧等;而後讓這個學生再次學習七天並考試一次,老師仍是根據平均成績進行指導,如此不斷地執行這個過程,直到老師以爲該學生的考試成績達標了,好比最近幾回的平均成績均可以到 90 分以上,就中止對這個學生的訓練,並認爲此時的學生已經具有了很好的學習能力。那麼如何檢驗該學生的學習能力呢?方式就是找一個不曾學過的科目,好比操做系統,讓這個學生從零開始學起,七天以後來考試一次,看他在操做系統這門課上的考試成績如何,若是成績很好,說明該學生已經具有了很強的學習能力,固然不必定是學習七天就考試,也能夠學習一個月或者更久再進行考試。
這個例子中有兩個須要思考的問題:
很明顯,學的好很差就是經過當前科目上的考試成績來判斷,學習能力強不強,則是經過學習時間來判斷,好比學習七天考到90分和學習一天就考到90分,是兩種不一樣的學習能力。
重頭戲來了,先來解讀下論文標題:Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks,這個標題中透漏出三個信息:
下圖是論文中的僞算法,這裏以監督學習中少樣本分類場景爲例,總體思想都是同樣的。
先來解釋下這個僞算法:
訓練前首要先隨機初始化網絡模型全部參數
設置一個外層訓練結束條件,例如迭代 10000 步等
外層訓練就是 Meta 訓練過程,上面講過 Meta 訓練的對象是 task,因此 meta 每一次的迭代都要從任務分佈 p(T) 中隨機抽取一個 batch 的 tasks
針對 3 中的每一個 task,執行下面的過程:
在一個具體的任務 Ti 中隨機抽取包含 K 個數據點的訓練樣本集 D
使用交叉熵損失函數或者均方差損失函數,在 D 上計算出損失函 和損失函數對 的梯度
使用 6 計算出的梯度,在該任務上使用一次梯度降低更新模型參數
從該任務 Ti 中抽樣出一個測試集 D’,用於 meta 的參數更新
每一個 task 都執行 6,7,8 三步,直到這一個 batch 的 task 都執行完
這一步就是 meta 的更新過程, 雖然 7 也有更新模型參數,可是那是任務內的局部更新,並無改變外面網絡模型的參數,這一步就是要改變網絡模型的參數了,仍然是使用梯度降低法進行更新,只不過更新用到的梯度是每一個任務 Ti 在各自的測試集 D’ 上計算出的batch 個梯度的平均梯度,更新的步長是 β。能夠把這一步的更新,想象成上面例子中老師根據學生的平均考試成績來調整其學習方向的過程,考試題目天然是各科上沒見過的題目,這也就是第 8 步抽取測試集 D’ 的做用,而後每一個任務用本身更新過的模型參數 在 D',上進行前向計算獲得一個 loss,用這個 loss 再對 進行求導獲得測試集 D′上的梯度,這個梯度就至關因而該任務上的考試成績。
上面的過程當中有一個問題須要事先說明:能夠看到每一個任務內部只更新了一次參數,也就是 6,7 兩步只作了一次梯度更新,但其實也能夠進行屢次的梯度更新,就是把 6,7 兩步重複執行幾回。那做者這裏爲何只寫一次呢?這就是做者高明的地方了,那就是作了一個最大化假設。咱們的最終目的是但願 MAML 訓練出的參數,在新的任務上進行少許幾回的微調就能夠收斂,那最好的結果就是隻更新一次就收斂了,因此在 MAML 訓練過程當中,做者就特地設計每一個任務內部只更新一次參數,以此來訓練這個模型 「更新一次就能夠最大化性能」的能力。類比到上面講的例子,那就是老師但願該學生具有強大的學習能力,在新的沒有見過的科目上只學習一天就能夠考出好成績,爲了訓練該學生的這個能力,就讓他在訓練的每一個科目上都學習一自然後考試一次,老師根據平均考試成績調整學生的學習方向,不斷地重複這個過程,直到平均考試成績能夠到 90 分以上就結束訓練,此時老師就認爲這個學生具有了「在新科目上學習一天就能考出好成績」的能力。
基於上面的分析,樓主本身畫了一個流程圖來表示通用 MAML 的訓練更新過程:
這個圖中是以 task 內部更新 k 次參數爲例的,k=1 的時候就和 MAML 如出一轍了。
下面到了一個容易犯困的環節,偉大的思想背後天然要有堅實的數學理論支撐,MAML 的數學過程就是其訓練更新的過程,理解了數學過程才能更好的理解 MAML 的思想。不過在論文中,並無過多的的數學過程介紹,多是做者以爲太簡單了吧,下面的數學過程也是樓主參考一些資料總結出的。
上圖是 MAML 訓練時模型參數的更新過程,其中 是網絡模型的初始參數,也就是僞算法中的 1 那一步 是任務內部在 上更新一次後的參數,也就是僞算法的第 7 步, 是全部task 在各自測試集 D'上的 loss 和,用 對模型參數 進行求導得出梯度,來進行meta的參數更新,也就是真正更新網絡模型的參數。圖中右邊的過程就是把 meta 梯度降低更新的數學過程展開,其中最關鍵的一步是藍色彎箭頭標出的那個變換,就是第二個等號到第三個等號的那一步,其它步驟還都比較好理解,下面來詳細看下關鍵這步的變換,其中主要是 對 求導很差求,若是這個能夠算出來,剩下的步驟就好說了。
上圖就是計算 對 求導的過程,由於 是由 通過一次梯度降低更新獲得的, 實際上是一組參數向量,表明網絡模型的各個參數,因此能夠將求導展開成向量形式,向量每一個元素是 對 的求導,也就是上圖中的紅框1,那如何計算 對 求導呢?咱們知道 是由 通過梯度降低公式獲得的,那麼 和 的關係就是下面這樣:
也就是 和每一個 都是有關係的, 又是由多個 組成的,因此 對 的求導就是對上面的鏈路求導的和,每一個路徑的求導則是 對 求導結果和 對 的求導結果相乘,也就是上圖中紅框2所在的公式,其中的關鍵是紅框2的位置,也就是 對 的求導, 是 通過梯度降低公式變過來的,也就是圖中的紅色5標記的地方, 因此 對 的求導就有兩種狀況,i=j 和 i!=j, i=j時,計算結果就是紅框4所處的公式,i!=j時就是紅框3的公式,能夠看到這兩個公式中都出現了二階的偏導,二階偏導求起來比較麻煩會影響到計算速度,因此做者使用了一階近似的方法 first-order approximation,也就是把公式中的二階偏導近似爲0,這樣近似後就簡單不少,即 對 的求導在i=j時約等於1,在 i!=j 時約等於0。而後順着圖中的藍色箭頭一步步帶入,最後就會獲得 對 的求導近似等於 對 的求導,再回到更新 meta 參數的公式來看就簡單了:
上圖紅框標出的公式就是 meta 更新參數時實際作的事情,這個式子能夠這樣看 這是什麼意思呢? 是第 i 個任務在其測試集上計算出的梯度方向,從幾何上看,這個式子的更新過程是這樣的:
藍色點表示網絡模型真正的參數,綠色第一個箭頭表示在其訓練集 D 上計算的梯度,綠色第二個箭頭表示在其測試集D'上計算出的梯度,藍色箭頭表示 meta 模型網絡模型參數的方向,能夠看到它就是在每一個任務的測試集的梯度方向上不斷的去作更新。從這個過程當中能夠看出來,MAML 真正更新網絡模型參數時,關心的是測試集上的梯度,而不是每一個任務上訓練集的梯度,也就是說,它更新的每一步的目標,都是使得更新後的參數能在之後的測試集上表現的更好,正是由於這樣,才能說明 meta 中止更新時的參數具備很好的潛力/學習能力,這個能力使得這組參數在以後新的任務上微調幾回就能夠在該任務上取得很好的性能,固然理想狀況仍是微調一次就能取得不錯的成績,若是一次微調更新效果很差,那還能夠再繼續屢次的微調更新。這也與咱們最初但願的目標,即能在新任務上快速適應相吻合,即便該任務只有少許的訓練樣本,好比10條或者5條,甚至是1條樣本,也能快速的學習到一些有效特徵。
在看上面的公式的時候,樓主有一個疑問,就是紅框3和紅框4標註的位置,做者把這個式子近似等於0,並稱之爲 first-order approximation一階近似。這個二階偏導式子是 由 通過一次梯度降低更新推導過來的,若是 是通過兩次或者屢次梯度降低更新獲得,那麼這個式子會不會出現三階甚至更高階偏導,若是是的話那還能用近似的方式嗎?
帶着這個疑問,搜了搜做者 GitHub 的 issue,還真搜到了有人問相似的問題,
做者解答說,即便進行屢次梯度降低更新,這裏也只會出現二階偏導。只恨本身數學太渣,理解不了,哪位數學大佬能夠推導下的,麻煩私信我下,哈哈,在此先行謝過。
前面講過,元學習和遷移學習有類似的地方,形式上都是在以前的任務上進行預訓練,而後得到一組參數,而後用這組參數在新的任務繼續微調,但它們是有本質的區別的。想一想遷移學習的預訓練是怎麼訓練的,好比在 ImageNet 大數據集上預訓練的 RestNet、VGG 這些網絡模型,它們在訓練的時候是用在 ImageNet 訓練集上的 loss 算出來的梯度來更新模型參數的,以訓練集上的 loss 爲準,關心的是當前模型參數在訓練集上的性能如何。而元學習 MAML 在訓練期間是用測試集上的 loss 算出的梯度來更新模型參數的,以測試集上的 loss 爲準,不關心在當前訓練集上的性能,而是關心這組參數在以後的測試集上的性能如何,也就是這組參數的潛力。換句話說,在 MAML 這篇論文中,是看這組參數在更新一次後的模型參數在測試集上可以表現多好,而不是訓練期間可以多好,這種潛力也與元學習的大目標相符,即 Learn to learn 學會如何學習從而具有某種學習能力或學習技巧,能夠在新的任務上快速學習。類比到上面老師和學生的例子,也很好理解,老師每次都是以學生的平均考試成績爲方向進行調整,這個考試成績天然是每門功課上沒有見過的題目,只有這樣才能訓練出該學生的學習能力。
從幾何上來看,遷移學習預訓練模型的參數更新過程是這樣的:
這就能看出和 MAML 不同的地方了,遷移學習的預訓練每次更新參數時,都是在當前任務上訓練集的梯度方向上進行更新。
上面詳細講了論文的思想及數學過程,下面來看下論文中的一些實驗及結論。論文中的全部實驗都是少樣本學習的場景,由於少樣本學習是元學習一個典型的應用場景,元學習在少樣本上也更能發揮出它的威力。
論文中關於迴歸問題的例子是,擬合正弦函數曲線,全部任務的分佈p(T)就是正弦函數分佈 y=a*sin(x+b),不一樣的任務只須要抽樣不一樣的 a和b 便可,按照上面講的 MAML 訓練過程,在若干個不一樣 a和b 的正弦函數上進行預訓練,而後用預訓練出的網絡模型在新的正弦函數樣本上進行測試,這個新的正弦函數是訓練期間沒有見過的一組a和b,只給出少許的訓練樣本,如5個或10個。論文中對比了 MAML 模型和遷移學習預訓練模型,在這個新的正弦函數上的預測性能,注意無論是哪一種模型在這個新的任務上都仍是要進行訓練的,只不過這個訓練是在以前參數的基礎上微調,這個新任務對於 meta 來講就是推理任務,而在任務內部仍是須要微調更新的。下圖就是 MAML 模型和預訓練模型在新的正弦函數上訓練以後,在其測試集上的表現。
左邊兩個圖是 MAML 模型的結果,左邊第一個圖是用 MAML 的思路訓練出的模型,在新正弦函數的 5 個樣本上微調以後,進行預測的結果。能夠看到新的正弦函數,在訓練時只給了分佈在右半部分的 5 個點,其中紅色線是真實分佈,淺綠色線是不進行微調直接用預訓練參數進行預測的結果,能夠看出來預訓練參數跑出的結果已經有了初步的形狀。深綠色線是微調一次參數後進行預測的結果,此時預測出的曲線已經基本擬合真實的正弦函數了,在包含訓練樣本的右半側能夠徹底擬合,在左半邊的曲線,模型雖然沒有見過這部分的樣本但也能夠學習出它的週期性質,在形狀上基本擬合。左邊第二個圖不一樣的是,給出了新的正弦函數的10個訓練樣本,能夠看到 MAML 在進行一次微調後,基本就能夠擬合所有曲線了,在進行十次微調後,擬合程度更進一步。
右邊兩個圖是一樣的設置下,遷移學習預訓練模型的表現,淺藍色曲線是直接進行預測的結果,能夠看到和真實分佈相差甚遠,尤爲是波峯的位置,徹底沒對上,在微調1次和10次以後,相比於不微調,有一點進步,但和真實分佈相比,依然相差較大。而且模型發生了過擬合現象,若是樣本點只在右半部分,那模型在右半部分的擬合上表現還行,在另外一半的位置上表現更差。若是遷移學習預訓練的任務足夠多的話,它訓練出的模型對應的曲線應該是一條接近水平的直線,由於每一個任務都以訓練集上的 loss 爲主,這麼多任務的 loss 加起來更新參數時,梯度應該接近於0。從幾何上理解就是,不少個正弦函數疊加在一塊兒,其趨勢就是一個水平線,同一個點,多是波峯也多是波谷,中間水平線的位置才能讓全部任務上的 loss 最小,這就是遷移學習預訓練和元學習的質的差異。
上面的圖可能不是很明顯,有第三方的做者復現了這個迴歸實驗,而且從新繪製了這部分的圖,以下所示,這個圖看起來更明顯些。
論文中也對微調次數進行了實驗,結果以下圖:
紅色線是 oracle 設置組的結果,oracle 就是在訓練時加入了該任務真實的a和b做爲特徵,至關於提早知道了真實分佈,因此在這個設置下訓練的模型,在新任務上的 mse loss 基本爲 0 ,綠色線是 MAML 的模型,橫軸是微調次數,能夠看到微調一次的模型,就能夠獲得很低的 mse 偏差,而隨着微調次數增長,性能也逐漸提高,不過由微調1次變爲2次,提高還比較明顯,後面的提高就不明顯了,尤爲是在5次微調以後,基本就沒有提高了。藍色線是遷移學習的預訓練模型,能夠看到無論是微調幾回,其 mse 值都很大,與 MAML 的模型相比,更是相差甚遠。
分類問題場景是兩個少樣本學習中常見的基準數據集:MiniImagenet 和 Omniglot,下圖是在 Omniglot 數據集上的結果:
其中 5-way 是表示5分類,1-shot 表示訓練時每一個類別下只有一個樣本,5-shot就是每一個類別下只有5個樣本,能夠看到無論在哪一個設置下,MAML 模型的表現都是最好的。
下圖是在 MiniImagenet 數據集上的結果:
在這個數據上,做者還對比了使用一階微分近似和不使用的結果,還記得一階微分近似是啥嗎?不記得的話,請往上翻看數學公式部分😀😁😀,能夠看到使用了一階微分近似,在效果上相差不大,可是做者證實在速度上能夠提升 33% 左右,這但是一個性價比很高的改進。