一個樣本也能準確學習,OpenAI 最新元學習算法邀你體驗

雷鋒網 AI 科技評論按:OpenAI 今天發表了一篇博客介紹了自己新設計的元學習算法「Reptile」。算法的結構簡單,但卻可以同時兼顧單個樣本和大規模樣本的精確學習。OpenAI 甚至還在博客頁面上做了一個互動界面,可以直接在四個方框里畫出訓練樣本和要分類的樣本,算法可以立即學習、實時更新分類結果。

用 Reptile 實時小樣本學習,分類手繪圖案。訓練數據和要分類的圖案都可以任意繪製。歡迎到博客頁面 https://blog.openai.com/reptile/ 自行嘗試一下。

根據 OpenAI 的介紹,這個新的元學習(meta-learning)算法 Reptile 的運作原理是反覆對任務採樣、在其上運用梯度下降,並從初始參數開始持續地向著任務上學到的參數更新。Reptile 可以和應用廣泛的元學習算法 MAML (model-agnostic meta-learning)達到同樣的表現,同時還更易於實現、計算效率更高。雷鋒網 AI 科技評論把這篇介紹博客全文翻譯如下。

元學習是一個學習「如何學習」的過程。一個元學習算法要面對一組任務,其中每一個任務都是一個學習問題;然後算法會產生一個快速學習器,這個學習器有能力從很小數目的一組樣本中泛化。小樣本分類(few-shot classification)就是一個得到了充分研究的元學習問題,其中的每個任務都是一個分類問題,這裡的學習器只能看到每個類別的 1 個到 5 個輸入-輸出樣本,然後它就要開始對新的輸入樣本進行分類。

Reptile 的工作方式

和 MAML 類似,Reptile 首先會為神經網絡尋找一組初始參數,以便網絡稍後可以根據來自新任務的數量不多的幾個樣本進行精細調節(fine-tune)。不過,相比於 MAML 需要在梯度下降算法的計算圖中展開並求導,Reptile 只需要簡單地在每個任務中以標準方法執行隨機梯度下降(SGD),並不需要展開一個計算圖以及計算任何二階導數。這樣的設計讓 Reptile 所需的計算資源和存儲資源都比 MAML 更小。Reptile 的偽碼如下所示:

這裡的最後一步也有另一種做法,可以把 Φ−W 整體作為梯度,然後把它嵌入進 Adam 之類的更複雜的優化器中。

OpenAI 的研究人員們從一開始就感到驚訝,驚訝的是這個算法居然能運行出結果。當 k =1 的時候,這個算法就相當於是「聯合訓練」,在所有任務的混合體中做隨機梯度下降。雖然聯合訓練在某些狀況下可以作為一種有用的初始化手段,但是零樣本學習(zero-shot learning)不可用的時候(比如當輸出標籤被隨機替換了),它所能學到的東西就非常有限。Reptile 算法中需要 k >1,也就是說,參數更新依靠的是損失函數的更高階導數。正如論文中所示的,此時算法的表現和 k =1 時相比有很大不同。

為了分析為什麼 Reptile 會奏效,OpenAI 的研究人員們用泰勒級數逼近了參數更新。他們發現 Reptile 的更新可以讓在同一個任務中不同 minibatch 的梯度的內積最大化,這就對應了模型的更強的泛化能力。這一發現也有超出了元學習研究領域的指導意義,可能可以用來解釋隨機梯度下降的泛化性質。OpenAI 的研究表明 Reptile 和 MAML 執行的參數更新非常詳細,包括其中有兩個相同的項,不過權重不一樣。

在 OpenAI 的實驗中,Reptile 和 MAML 在 Omniglot 和 Mini-ImageNet 的兩項小樣本學習 benchmark 中取得了近似的表現。Reptile 收斂到最終解決方案的速度也更快,因為它的更新的方差更小。

OpenAI 對 Reptile 的分析也表明,通過對隨機梯度下降的梯度做不同的組合,我們可以得到許多中不同的算法。假設每個任務中使用不同的 minibatch 進行 k 步隨機梯度下降,得到的梯度分別為 g1、g2、……、gk。下圖就展示了在 Omniglot benchmark 中把每種不同的梯度和作為元學習的梯度的算法的學習曲線。g2 對應的是一階 MAML,也就是最初的 MAML 論文中表述的算法。包括的梯度越多,算法學習得就越快,因為其中的方差會隨之減小。可以注意到僅僅使用 g1(也就是 k =1 時)並不會給這個任務帶來什麼改進,因為零樣本學習無法被改進。

算法實現

OpenAI 已經把 Reptile 的算法實現開源在了 GitHub 上。它的計算藉助 TensorFlow 完成,而且開源中也包括了復現 Omniglot 和 Mini-ImageNet 的兩項小樣本學習 benchmark 的代碼。他們也編寫了一個 JavaScript 的實現,模型預訓練仍然由 TensorFlow 完成,然後 JavaScript 根據樣本做精細調節。OpenAI 博客中的算法樣例(也就是本文的開頭動圖)就是藉助  JavaScript 實現完成的。PyTorch 實現的完整代碼也一併在博客頁面上給出。

論文地址:https://d4mucfpksywv.cloudfront.net/research-covers/reptile/reptile_update.pdf 

開源地址:https://github.com/openai/supervised-reptile 

via OpenAI Blog,雷鋒網 AI 科技評論編譯


想在手機閱讀更多博客及網站收入資訊?下載【香港矽谷】Android應用
分享到Facebook
技術平台: Nasthon Systems