深入淺出Meta Learning - 讓機器學會如何去學習

深入淺出Meta Learning - 讓機器學會如何去學習

歡迎關注 公眾號「貪心科技」獲得更多的有關AI的乾貨內容及活動信息

主要看點

這篇文章力求將我們從那些對AI空洞的幻想以及抽象的預測中帶回到這片領域現在的真實情景中:在這裡我們將分享這片領域的輝煌之處, 探討其局限性, 並分析我們離魯棒的多任務智能還有多遠。

Meta學習的初衷十分令人著迷:不僅僅構建能夠學習的機器, 更重要的是讓它學會如何去學習。這也就意味著Meta學習得到的演算法能夠依據自己表現的反饋信號及時地調整其結構和參數空間, 進而能夠在新環境中通過累計經驗提升表現性能。 其實, 當未來學家用通用性的魯棒人工智慧編織我們對未來的憧憬時, 這些夢想的細節無不是上述思路的體現。

為什麼人類可以表現出較高的智能行為?

具體來說: 很多的強化學習演算法需要多於人類學習時間的很多倍才能完成學習任務; 例如在Atari遊戲中, 近期的演算法需要花費約83小時(1800萬幀)才能達到人類玩家的中等水平, 而這種水平人類僅需要玩幾小時遊戲就能達到。

這種差距就讓很多機器學習學者將問題歸納為: 人類大腦在面對類似任務的時候究竟使用了哪些手段或者能力, 以及我們怎樣才能用統計和資訊理論的方法對之建模? 具體來說, Meta學習有兩種策略,分別對應於大腦能力的兩種理論:

1. 學習到的先驗知識: 從這個角度看, 人類之所以能夠快速學習的原因是我們可以對過去學到的知識迅速重用, 就像是物體在空間中移動的直觀物理, 或是在電子遊戲中失去生命會導致低獎賞的元知識。

2. 學習策略: 這個想法是, 在我們的生活中 (也許是在進化的時間尺度上), 我們不僅收集了關於世界的物質級知識, 而且還創造了一種神經結構: 即使是在嶄新的環境中, 它能更有效地接受輸入, 並將其轉化為輸出或策略。

顯然, 這兩種想法並不互相排斥甚至兩者之間沒有一個明確的界限: 我們寫的一些與環境交互的策略是以對環境的深層感知為基礎的, 就像我們常說的 (至少是這篇文章中提到的演算法體現的) 環境也是有結構的。儘管如此, 我依舊認為這兩個想法是可以互相區分的, 可以將它們理解為一個軸的兩個極點。

One Shot學習

在深入了解Meta學習之前,了解一些One Shot學習的概念性知識是很有必要的。如果Meta學習的問題是「我如何建立一個快速學習新任務的模型」, 那麼One Shot學習的問題是:「我怎樣才能建立一個模型, 在只看到某類的一個例子後, 就可以學習如何該類進行分類」。

下面我們在概念層次上思考為什麼One Shot學習會這麼難。如果我們想基於某一類訓練一個不錯的模型, 那麼我們必然會面對過擬合的問題。如果一個模型只看到一幅圖, 比如數字3, 它就不知道圖像可以經歷什麼樣的像素變化但仍然基本上保持3。 例如, 如果這個模型只顯示了這個集合中的第一個3, 那麼如何知道第二個3是相同類的一個例子呢? 我們在網路學習時所關心的類標籤與字體的粗細在理論上有關係嗎? 在我們看來這很簡單, 但是只有一個3的例子對網路來說並不是一個容易的任務。

如果我們可以拿到多一點的3的樣本, 那麼這個問題解決起來就輕鬆多了, 因為我們可以學到3這個類別的主要特徵——兩處凸出的筆觸, 大體呈垂直方向; 另外還能學到什麼是與類別無關的——線條的粗細, 筆鋒的角度。為了提升OneShot學習的性能, 我們必須促使網路能夠學習那些能夠區分不同數字的一般特徵, 尤其是在無法得到每種數字的準確方差的條件下。

在OneShot學習中一項常見的技術就是學習一個嵌入的空間, 並在這個空間中計算兩個樣本的歐氏距離以確定其相似性進而判斷二者是否屬於同一個類別。直觀地說, 這需要學習在這個分布中最能夠區分這個類的內部維度 (在例子中:數字的分布), 並學習如何將輸入壓縮和轉換到那些最相關的維度上去。

我們可以發現:將這個問題牢記是一個必要的基礎, 不是試圖學習如何總結某個類的分布中存在的共享信息和模式, 而是試圖學習存在於任務分布上的規律, 因為每一個任務都有自己的內部結構或目標。

如果需要給出一個Meta學習的從最具體到最抽象的過程排序, 那麼應該是這樣的:

  • 一個能夠通過帶有超參的梯度下降法學習關於任務的完整分布的表示信息。 MAML以及Reptile就是兩個典型的例子, 而共享層次結構的Meta學習則是一個更為複雜的方法: 它將學到的表示全部當作直接子策略並由一個主策略控制。
  • 一個學習優化自己梯度下降參數的網路。 這些參數有: 學習速率, 慣性, 自適應學習演算法的權值。 在這裡, 我們將沿著用一種有限的, 參數化的修正演算法的方向進行學習。這就如何用梯度下降的方法進行以梯度下降為基礎的學習, 也就是本文的標題。
  • 一個學習內部循環優化器的網路, 這個優化器本身就是一個網路。 也就是說, 梯度下降是用來更新神經優化器的網路參數, 使它們在各個任務上執行得很好, 但是在單個任務中輸入數據到輸出預測的映射完全由一個網路進行, 沒有任何明確的損失或梯度計算。 這就是RL2和A Simple Neural Attentive Meta Learner 的工作原理。

為了使這篇文章詳略得當, 我們主要集中在1和3, 並闡釋兩個關於人類智能的概念性問題。

一場關於「任務」的糾結

在此, 我們需要提到另一個問題。通常, 在討論Meta學習時, 我們都會看到一種「任務分布」的概念。我們知道這是個並沒有被詳細定義的概念。 我們沒有一個標準來判斷什麼情況下我們面對的是單任務的問題, 或者是多個任務的分布。 比如: 我們是不是應該認為ImageNet是一個物體識別的單任務問題? 又或者我們是否應該認為它是個多任務問題, 因為有時需要識別出狗有時卻要識別出貓? 為什麼Atari遊戲就是個單任務問題而不是幾個不同任務組成的單機遊戲呢?

我能從這一切中提煉出的是:

  • 「任務」這個詞是需要跟被構造的數據集聯合考慮的, 畢竟我們當學習的過程僅僅局限於一個數據集時我們便會很自然的認為這個學習是單任務的。
  • 對於任一給定的任務分布來說, 任務之間的差異可真是大相徑庭(例如: 學習正弦波的不同振幅和學習不同的Atari遊戲就大不一樣)。
  • 因此我們不能僅僅說「這個方法可以在<這個樣本的分布>上泛化」, 更應該去追求能在幾個不同的分布上均有不錯的表現。 從方法效用的角度上看, 這固然不錯,但確實需要批判性思維來考慮網路真正需要表現出多大的靈活性才能在所有任務中表現出色。

那些以動物為名的無法言喻

在2017年初,Chelsea Finn等人提出了 MAML: ModelAgnostic Meta Learning。在學習策略和學習先驗之間的關係上, 這種方法傾向於後者。 該網路的目標是訓練一個模型, 如果給定一個新任務的一步梯度更新, 那麼它便可以很好地在該任務泛化。演算法思路如下:

  • 隨機初始化網路的參數。
  • 從任務分布中選取一些任務t, 從訓練集中選k個 (約為10個) 樣本進行一步梯度更新。
  • 在測試集上評價更新後的網路。
  • 對任務t的測試表現求初始化網路時的參數的梯度, 然後依據這些梯度更新網路參數然後用更新後的參數返回第一步。

從一個抽象的層次來說, 這個演算法是在參數空間中找最接近一個好的泛化解的期望。 簡單說: MAML會更激勵找到附近地區多山谷的峰頂, 它們都包含合理的低於所有任務期望的損失。 正是這種激勵, 有助於幫助MAML走出過擬合。

最新的一種叫做Reptile的文獻是在2018年初問世的。 它從MAML處的借鑒問題的設定, 但是找到一個計算效率更高方法進行初始參數的更新循環。 MAML明確以測試集的損失相對初始參數求梯度, Reptile只是執行每個任務的SGD更新的幾步, 然後用現在與初始的參數差異為「梯度」來更新初始權值。

這麼做能work其實真有點奇怪, 因為這似乎與將所有混合在一起的任務作為一個任務進行訓練沒有什麼不同。然而, 作者認為, 由於每個任務採取了多個SGD步驟, 因此每個任務的損失函數的二階導都會受到影響。為此, 他們將更新分解為兩部分:

  • 將結果推向「聯合訓練損失」, 例如訓練一些列任務後的結果;
  • 將初始化推向後續SGD相似的位置, 因為小批次之間的梯度方差較小。 因此作者推斷這個技巧會提高學習速率, 並使得每個任務維持在一個更穩定和低方差的訓練區域。

選擇MAML/Reptile 來討論的原因在於, 從理論上說, 通過學習內部表示或者那些在參數空間相近的可泛化的表示可以使神經網路work起來。

為了說明這一點, 請看一下上圖。 它將MAML與預訓練的網路進行比較, 兩者都在一系列由相位和振幅不同的正弦波組成的回歸任務上做了訓練。 紅色曲線代表了兩者經過調參後的結果。紫色三角形表示經過少量梯度更新的結果。 可見, 與預訓練網路相比, MAML已經學到了正弦波具有周期性結構: 在k = 5時, 能夠更快地將左側峰值移動到正確的位置, 而實際上沒有從該空間區域觀察到數據。 雖然很難說我們的解釋是否與現實情景完全匹配, 但我們可以推斷MAML在計算正弦波彼此不同的兩種相關方式 (相位和振幅) 以及如何從它給出的數據中學習表示這些方面做得更好。

將網路進行到底

對於一些人來說, 即使是有了使用梯度下降等演算法來學習全局先驗知識的思路, 也不免產生疑問: 誰能保證我們設計的學習演算法是最有效的? 難道我們不能學得更好了嗎?

這是RL2所採用的方法。該模型的基本結構是RNN。 由於RNN具有存儲狀態信息的能力, 並根據狀態給出不同的輸出, 所以理論上他們可以學習任意可計算的演算法: 換句話說, 它們可能是圖靈完備 (Turing complete) 的。以此為基礎, RL2的作者構建了一個RNN, 使得它所訓練的每個「序列」實際上是一系列具有給定MDP (馬爾可夫決策過程) 的經驗集, 為此可以只需將每個MDP視為定義了一組可能的行為和這些行為在環境中產生的潛在回報。 然後對RNN進行訓練, 如同一般的RNN一樣對許多序列進行訓練, 在這種情況下對應於許多不同的MDP, 並且對RNN的參數進行優化以得到所有序列總體產生較低的regret。 Regret是一個指標, 對應訓練中的總獎賞, 因此除了鼓勵網路在訓練結束時產生一個好的策略之外, 它還可以激勵更快的學習, 以便減少由一個不好的策略指導的行為探索。

在試驗中的每一步, 網路採取的行動都是由多個任務學習的權重矩陣和隱藏狀態的內容而參數化的函數。而隱藏狀態的內容根據數據進行更新, 還可以作為一種的動態參數集。因此, RNN會學習如何更新其隱藏狀態的權重, 以及控制如何利用它的權重以完成多個任務。 然後, 在一個給定的任務中, 隱藏狀態可以捕獲有關網路是如何確定的信息, 無論是探索利用等的時間, 都是它在特定任務上看到的數據的函數。 從這個意義上說, RNN可以學習一種如何確定最佳地探索空間並更新其最佳策略的演算法,並使其在任務分布上表現良好。作者比較了RL2和能夠達到某些任務上接近最優的演算法, RL2並不遜色。

我們能總結出什麼?

這只是一個非常濃縮的領域介紹, 我相信有一些遺漏或者理解不到位的地方。如果您想更深入了解這個領域, 那麼您可以閱讀這個文章。

在整理這篇文章之後, 我還有一些問題想跟大家一起探討: 這些方法如何擴展到更高多樣性任務中? 大多數文獻都是在較低多樣性任務的分布上進行驗證測試: 不同參數的正弦曲線, 不同參數的bandit實驗等。其實, 在這些任務分布上做得很好, 並不能保證在不同複雜程度的任務, 以及不同的模式上能夠很好的泛化;

這些演算法對高強度的計算需求到底有多少? 近期很多工作都在較小且較簡單的數據集上訓練的原因也包括: 當需要在內部循環中更新模型參數時, 在測試過程將昂貴的計算開銷。 鑒於近期摩爾定律似乎正在放緩,如若每個內部循環在較複雜的問題上進行迭代可能需要數百小時的GPU時間, 我們將如何研究這些演算法並使其真正發揮作用?

這些方法如何與直接想辦法將先驗知識寫成代碼相比較? 在人類的寶庫中一個非常有價值的工具就是語言。在機器學習方面, 這就變成了一種高度壓縮的嵌入在我們知道如何在概念上變換使用的空間中的信息, 我們可以將它在人與人之間進行轉換。沒有人能夠自己從經驗中提煉出所有這些知識,所以我懷疑我們是否真的會解決可以整合有關世界的知識的模型問題,除非我們知道如何去做一些類似於學習演算法的事情。


推薦閱讀:

機器學習演算法系列--生成模型與判別模型
入門教程 | 使用 Colab,玩轉谷歌深度學習全家桶!
BP神經網路演算法:將參數矩陣向量化
如何評價周志華深度森林模型
Tensorflow入門教程(6)

TAG:計算機科學 | 科技 | 機器學習 |