手把手 | OpenAI開發可拓展元學習算法Reptile,能快速學習

2020-12-24 大數據文摘

大數據文摘作品

編譯:Zoe Zuo、丁慧、Aileen

本文來自OpenAI博客,介紹一種新的元學習算法Retile。

在OpenAI, 我們開發了一種簡易的元學習算法,稱為Reptile。它通過對任務進行重複採樣,利用隨機梯度下降法,並將初始參數更新為在該任務上學習的最終參數。

其性能可以和MAML(model-agnostic meta-learning,由伯克利AI研究所研發的一種應用廣泛的元學習算法)相媲美,操作簡便且計算效率更高。

MAML元學習算法:

http://bair.berkeley.edu/blog/2017/07/18/learning-to-learn/

元學習是學習如何學習的過程。此算法接受大量各種的任務進行訓練,每項任務都是一個學習問題,然後產生一個快速的學習器,並且能夠通過少量的樣本進行泛化。

一個深入研究的元學習問題是小樣本分類(few-shot classification),其中每項任務都是一個分類問題,學習器在每個類別下只能看到1到5個輸入-輸出樣本(input-output examples),然後就要給新輸入的樣本進行分類。

下面是應用了Reptile算法的單樣本分類(1-shot classification)的互動演示,大家可以嘗試一下。

嘗試單擊「Edit All」按鈕,繪製三個不同的形狀或符號,然後在右側的輸入區中繪製其中一個,並查看Reptile如何對它進行分類。前三張圖是標記樣本,每圖定義一個類別。最後一張圖代表未知樣本,Reptile要輸出此圖屬於每個類別的概率。

Reptile的工作原理

像MAML一樣,Reptile試圖初始化神經網絡的參數,以便通過新任務產生的少量數據來對網絡進行微調。

但是,當MAML藉助梯度下降算法的計算圖來展開和區分時,Reptile只是以標準方法在每個任務中執行隨機梯度下降(stochastic gradient descent, SGD)算法,並不展開計算圖或者計算二階導數。這使得Reptile比MAML需要更少的計算和內存。示例代碼如下:

初始化Φ,初始參數向量對於迭代1,2,3……執行隨機抽樣任務T 在任務T上執行k>1步的SGD,輸入參數Φ,輸出參數w 更新:Φ←Φ+(wΦ)結束返回Φ

最後一步中,我們可以將ΦW作為梯度,並將其插入像這篇論文裡(https://arxiv.org/abs/1412.6980)Adam這樣更為先進的優化器中作為替代方案。

首先令人驚訝的是,這種方法完全有效。如果k=1,這個算法就相當於 「聯合訓練」(joint training)——對多項任務的混合體執行SGD。雖然在某些情況下,聯合訓練可以學習到有用的初始化,但當零樣本學習(zero-shot learning)不可能實現時(比如,當輸出標籤是隨機排列時),聯合訓練就幾乎無法學習得到結果。

Reptile要求k>1,也就是說,參數更新要依賴於損失函數的高階導數實現,此時算法的表現和k=1(聯合訓練)時是完全不同的。

為了分析Reptile的工作原理,我們使用泰勒級數(Taylor series)來逼近參數更新。Reptile的更新將同一任務中不同小批量的梯度內積(inner product)最大化,從而提高了的泛化能力。

這一發現可能超出了元學習領域的指導意義,比如可以用來解釋SGD的泛化性質。進一步分析表明,Reptile和MAML的更新過程很相近,都包括兩個不同權重的項。

泰勒級數:

https://en.wikipedia.org/wiki/Taylor_series

在我們的實驗中,展示了Reptile和MAML在Omniglot和Mini-ImageNet基準測試中對少量樣本分類時產生相似的性能,由於更新具有較小的方差,因此Reptile也可以更快的收斂到解決方案。

Omniglot:

https://github.com/brendenlake/omniglot

Mini-ImageNet:

https://arxiv.org/abs/1606.04080

我們對Reptile的分析表明,通過不同的SGD梯度組合,可以獲得大量不同的算法。在下圖中,假設針對每一任務中不同小批量執行k步SGD,得出的梯度分別為g1,g2,…,gk。

下圖顯示了在 Omniglot 上由梯度之和作為元梯度而繪製出的學習曲線。g2對應一階MAML,也就是原先MAML論文中提出的算法。由於方差縮減,納入更多梯度明顯會加速學習過程。需要注意的是,僅僅使用g1(對應k=1)並不會給這個任務帶來改進,因為零樣本學習的性能無法得到改善。

X坐標:外循環迭代次數

Y坐標:Omniglot對比5種方式的

5次分類的準確度

算法實現

我們在GitHub上提供了Reptile的算法實現,它使用TensorFlow來完成相關計算,並包含用於在Omniglot和Mini-ImageNet上小樣本分類實驗的代碼。我們還發布了一個較小的JavaScript實現,對TensorFlow預先訓練好的模型進行了微調。文章開頭的互動演示也是藉助JavaScript完成的。

GitHub:

https://github.com/openai/supervised-reptile

較小的JavaScript實現:

https://github.com/openai/supervised-reptile/tree/master/web

最後,展示一個小樣本回歸(few-shot regression)的簡單示例,用以預測10(x,y)對的隨機正弦波。該示例基於PyTorch實現,代碼如下:

import numpy as npimport torchfrom torch import nn, autograd as agimport matplotlib.pyplot as pltfrom copy import deepcopyseed = 0plot = Trueinnerstepsize = 0.02 # stepsize in inner SGDinnerepochs = 1 # number of epochs of each inner SGDouterstepsize0 = 0.1 # stepsize of outer optimization, i.e., meta-optimizationniterations = 30000 # number of outer updates; each iteration we sample one task and update on itrng = np.random.RandomState(seed)torch.manual_seed(seed)# Define task distributionx_all = np.linspace(-5, 5, 50)[:,None] # All of the x pointsntrain = 10 # Size of training minibatchesdef gen_task():"Generate classification problem" phase = rng.uniform(low=0, high=2*np.pi) ampl = rng.uniform(0.1, 5) f_randomsine = lambda x : np.sin(x + phase) * ampl return f_randomsine# Define model. Reptile paper uses ReLU, but Tanh gives slightly better resultsmodel = nn.Sequential( nn.Linear(1, 64), nn.Tanh(), nn.Linear(64, 64), nn.Tanh(), nn.Linear(64, 1),)def totorch(x): return ag.Variable(torch.Tensor(x))def train_on_batch(x, y): x = totorch(x) y = totorch(y) model.zero_grad() ypred = model(x) loss = (ypred - y).pow(2).mean() loss.backward() for param in model.parameters(): param.data -= innerstepsize * param.grad.datadef predict(x): x = totorch(x) return model(x).data.numpy()# Choose a fixed task and minibatch for visualizationf_plot = gen_task()xtrain_plot = x_all[rng.choice(len(x_all), size=ntrain)]# Reptile training loopfor iteration in range(niterations): weights_before = deepcopy(model.state_dict()) # Generate task f = gen_task() y_all = f(x_all) # Do SGD on this task inds = rng.permutation(len(x_all)) for _ in range(innerepochs): for start in range(0, len(x_all), ntrain): mbinds = inds[start:start+ntrain] train_on_batch(x_all[mbinds], y_all[mbinds]) # Interpolate between current weights and trained weights from this task # I.e. (weights_before - weights_after) is the meta-gradient weights_after = model.state_dict() outerstepsize = outerstepsize0 * (1 - iteration / niterations) # linear schedule model.load_state_dict({name : weights_before[name] + (weights_after[name] - weights_before[name]) * outerstepsize for name in weights_before}) # Periodically plot the results on a particular task and minibatch if plot and iteration==0 or (iteration+1) % 1000 == 0: plt.cla() f = f_plot weights_before = deepcopy(model.state_dict()) # save snapshot before evaluation plt.plot(x_all, predict(x_all), label="pred after 0", color=(0,0,1)) for inneriter in range(32): train_on_batch(xtrain_plot, f(xtrain_plot)) if (inneriter+1) % 8 == 0: frac = (inneriter+1) / 32 plt.plot(x_all, predict(x_all), label="pred after %i"%(inneriter+1), color=(frac, 0, 1-frac)) plt.plot(x_all, f(x_all), label="true", color=(0,1,0)) lossval = np.square(predict(x_all) - f(x_all)).mean() plt.plot(xtrain_plot, f(xtrain_plot), "x", label="train", color="k") plt.ylim(-4,4) plt.legend(loc="lower right") plt.pause(0.01) model.load_state_dict(weights_before) # restore from snapshot print(f"-----------------------------") print(f"iteration {iteration+1}") print(f"loss on plotted curve {lossval:.3f}") # would be better to average loss over a set of examples, but this is optimized for brevity

論文連結:

https://arxiv.org/abs/1803.02999

代碼連結:

https://github.com/openai/supervised-reptile

原文連結:

https://blog.openai.com/reptile/

相關焦點

  • OpenAI提出Reptile:可擴展的元學習算法
    近日,OpenAI發布了簡單元學習算法Reptile,該算法對一項任務進行重複採樣,執行隨機梯度下降,更新初始參數直到習得最終參數。該方法的性能可與MAML(一種廣泛應用的元學習算法)媲美,且比後者更易實現,計算效率更高。
  • 一個樣本也能準確學習,OpenAI 最新元學習算法邀你體驗
    雷鋒網 AI 科技評論按:OpenAI 今天發表了一篇博客介紹了自己新設計的元學習算法「Reptile」。算法的結構簡單,但卻可以同時兼顧單個樣本和大規模樣本的精確學習。根據 OpenAI 的介紹,這個新的元學習(meta-learning)算法 Reptile 的運作原理是反覆對任務採樣、在其上運用梯度下降,並從初始參數開始持續地向著任務上學到的參數更新。Reptile 可以和應用廣泛的元學習算法 MAML (model-agnostic meta-learning)達到同樣的表現,同時還更易於實現、計算效率更高。
  • OpenAI開課了!深度強化學習最全課程包,教程、代碼一網打盡
    >GitHub地址:https://github.com/openai/spinningup/blob/master/docs/user/running.rst由OpenAI來上強化學習這門課再合適不過了。
  • 從星際2深度學習環境到神經機器翻譯,上手機器學習這些開源項目必...
    機器學習是用數據來學習、概括、預測的研究。近幾年,隨著數據的開發、算法的改進以及硬體計算能力的提升,機器學習技術得以快速發展,不斷延伸至新的領域。由於我們需要這些數據來訓練機器學習算法,所以獲取高質量的數據集是如今機器學習領域的最大挑戰之一。算法:如何處理和分析數據機器學習算法可利用數據執行特定的任務,最常見的機器學習算法有如下幾種:1.監督學習。
  • Socionext聯手大阪大學合作開發新型深度學習算法
    (以下「Socionext」,或「公司」)宣布,聯合大阪大學數據能力科學研究所長原教授研究小組共同開發新型深度學習算法,該算法無需製作龐大的數據集,只需通過融合多個模型便可在極度弱光的條件下進行精準檢測物體及圖像識別。Socionext笹川幸宏先生和大阪大學長原教授在8月23日至28日(英國夏令時間)舉辦的歐洲計算機視覺國際會議(ECCV 2020)上報告了這一研究成果。
  • 聽說你了解深度學習最常用的學習算法:Adam優化算法?
    By蔣思源2017年7月12日  深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習算法開發的重大原因。雖然我們可以採用分布式並行訓練加速模型的學習,但所需的計算資源並沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化算法,才能從根本上加速機器的學習速度和效果,Adam算法正為此而生!
  • 蘇黎世大學研發深度學習算法:無人機可學習交通法規 安全穿越城市...
    據外媒報導,蘇黎世大學(University of Zurich,UZH)研發了DroNet算法,使無人機能夠沿著城市街道或在建築物內飛行,該算法還需要通過騎行者及汽車駕駛員學習駕駛用例及相關的交通法規。
  • 學習軟體開發要從哪裡開始?
    首先,要重視編程的基礎課程的學習,儘管計算機是高科技的象徵,但它也受到其他專業發展的制約,計算機專業知識的學習也應加強,尤其是對一些相關知識的學習,計算機軟體開發通常涉及算法,並且語言結構中使用了數學知識,因此對於學習諸如高級數學,離散數學和線性代數之類的數學知識有一定的需求,特別是對於軟體開發高手,開發過程將涉及更多的數學,並且往往涉及更多的數學,一些專家表示
  • OpenAI聯合DeepMind發布全新研究:根據人類反饋進行強化學習
    作者:Shane Legg等機器之心編譯參與:吳攀、黃小天、李亞洲DeepMind 和 OpenAI 是現在人工智慧研究界最重要的兩大研究機構,當其聯手時,我們能看到什麼樣的成果誕生呢?更多詳情請參考以下連結:原論文:https://arxiv.org/abs/1706.03741DeepMind 博客:https://deepmind.com/blog/learning-through-human-feedback/OpenAI 博客:https://blog.openai.com/deep-reinforcement-learning-from-human-preferences
  • IEEE預發:DeepMind主攻的深度強化學習3大核心算法及7大挑戰
    對於這種由經驗驅動的自主學習,一個主要的數學框架是強化學習(RL)。雖然RL在過去有一些成功,但以前的方法缺乏可擴展性,而且固有地局限於相當低維度的問題。這些限制之所以存在,是因為RL算法也有其他算法那樣的複雜性問題:內存複雜度、計算量複雜度,具體到機器學習算法,還有樣本複雜度。
  • 你做我評——OpenAI和DeepMind全新的強化學習方法,根據人類反饋...
    OpenAI跟DeepMind的安全團隊一起協作開發了一種算法,只需要人類逐步告訴它兩種它推薦的動作中哪一種更好,它就可以由此推測人類的需求進行學習。方法介紹這篇論文中介紹了一種算法,它可以用相對少量的人類反饋解決現代的強化學習問題。
  • 聯邦學習:深度學習之後,AI 安防的第二落腳點
    基於安防場景的不斷變化,其對算法迭代的要求一定是非常嚴苛且上升的。在這個市場中,誰能夠看到算法精度提升解鎖的更多場景,並根據場景的變化做到最為快速且精準的反應,誰就能在未來競比中走得更遠。從業務層面出發,A、B、C這三家廠商便直接獲得了兩種能力:1、最快速地優化自身業務;2、最快速地拓展新業務。最快速地優化自身業務表現在,平臺每天會有若干個類似A廠商的企業向平臺輸入加密後的數據模型,而這些數據模型中有A廠商非常缺乏的其他數據信息,而A廠商便可根據這些數據去更新自己的算法模型。
  • 浪潮升級AI開發平臺AIStation:無縫對接100+算法、工具與數據集
    北京2020年12月21日 /美通社/ -- 近日,浪潮重磅升級人工智慧開發平臺AIStation3.0,打造更加完善和快捷的生態夥伴產品對接能力,實現與元腦生態夥伴的多元化AI開發工具、模型算法與解決方案無縫對接、融合,推動AI應用在實際生產環境中的敏捷開發、快速部署與持續創新。
  • 維基百科和谷歌聯合開發機器學習算法
    針對該問題,研究人員開發機器學習算法,分析維基百科在 2015 年收到的的海量評論。這一年,維基百科討論頁面共收到 6300 萬條評論。這些評論存在的本意,是討論如何改進維基百科收錄的各條文章。這些算法使用 10 萬條包含侮辱性言辭的評論以進行訓練,當然,這樣的樣本規模只能算是偏小的。起初,十名人類員工對這些評論進行分類,以明確用戶評論中都出現了哪些人身攻擊語言方式。
  • 馬斯克的OpenAI:全新方案有望取代強化學習,通用人工智慧並非不現實
    Sutskever表示,在標準基準測試中,這種方法能夠與今天的強化學習相競爭。另人驚訝的是,這種方法有時更簡單。Sutskever認為,找到讓軟體學會玩電腦遊戲或引導機器人等任務的新方法對於開發執行更加複雜任務的機器學習軟體具有重大意義,人們需要的不僅僅是識別圖像和語音翻譯。
  • 算法庫開源講座第一講:港中文MMLab博士詹曉航帶你實踐自監督學習...
    「算法庫開源講座」,是智東西公開課繼前沿講座之後,面向開發者和科研人員策劃推出的、專注於講解不同開源算法庫及其開發實踐的一檔開源講座。第一季推出三講,將分別針對開源算法庫OpenSelfSup、OpenPCDet和OpenUnReID的框架組成及開發實踐進行深度講解。
  • 帶你從不同角度了解強化學習算法的分類
    :unsplash本文將介紹強化學習算法的分類法,從多種不同角度學習幾種分類法。話不多說,大家深呼吸,一起來學習RL算法的分類吧!Model-Based)無模型VS模型分類法 [圖源:作者,OpenAISpinning Up再創作]RL算法的一種分類方法是詢問代理是否能訪問環境模型
  • 適合新手:手把手教你用Go快速搭建高性能、可擴展的IM系統
    手把手教你自擼一個Andriod版簡易IM (有源碼)》《拿起鍵盤就是幹:跟我一起徒手開發一套分布式IM系統》《適合新手:從零開發一個IM服務端(基於Netty,有完整源碼)》另外:本文作者的另一篇文章,有興趣也可以關注一下:《12306搶票帶來的啟示:看我如何用Go實現百萬
  • 插花藝術視頻學習,花店技術學習,花藝師手把手教你學插花!
    插花藝術視頻學習,花店技術學習,花藝師手把手教你學插花!57 來源:花藝插花知識分享 原標題:插花藝術視頻學習
  • 神經網絡讓計算機自我進化,自我探索,超越深度學習算法
    神經進化是一個元算法,一個設計算法的算法。最終,這些算法很好地完成了它們的工作。為了測試踏腳石原理,斯坦利和他的學生Joel Lehman調整了選擇過程。新穎性的搜索並沒有選擇那些在一項任務中表現最好的網絡,而是根據它們與行為最相似的網絡之間的差異來選擇它們。在Picbreeder中,人們會獎勵有趣的人。在這裡,作為興趣度的代理,新奇搜索將獎勵新奇。