0
本文作者: AI科技評論 | 2016-06-27 13:56 |
今年8月,雷鋒網(wǎng)將在深圳舉辦盛況空前的“全球人工智能與機(jī)器人峰會”,屆時雷鋒網(wǎng)將發(fā)布“人工智能&機(jī)器人Top25創(chuàng)新企業(yè)榜”榜單。目前,我們正在拜訪人工智能、機(jī)器人領(lǐng)域的相關(guān)公司,從中篩選最終入選榜單的公司名單。
如果你也想加入我們的榜單之中,請聯(lián)系:2020@leiphone.com。
正在美國紐約舉行的國際機(jī)器大會(ICML)上,我們很難忽略 Facebook 研究科學(xué)家們的身影——他們呈現(xiàn)三篇論文、主導(dǎo)四場研討會、并主講兩場教程。其中包括 FB 研究科學(xué)家 Ronan Collobert、Armand Joulin 和 Laurens van der Maaten合作的論文《Torch:機(jī)器學(xué)習(xí)研究的開源平臺》。
Torch 是進(jìn)行深度機(jī)器學(xué)習(xí)研究的主要框架之一,不過研究人員必須重復(fù)實(shí)驗(yàn)邏輯,F(xiàn)acebook 推出的 Torchnet 由于鼓勵模塊化編程和代碼重用,未來可以推動機(jī)器視覺、自然語言處理和語音處理等多個機(jī)器學(xué)習(xí)領(lǐng)域的發(fā)展,并且,整個研究社區(qū)都能通過插件參與貢獻(xiàn)。
摘要
Torch 7 是一個支持 CPU 和 GPU 計(jì)算的科學(xué)計(jì)算平臺,在簡單的腳本語言中帶有輕量的包裝,可以快速執(zhí)行常見的代數(shù)運(yùn)算。它已成為(深度)機(jī)器學(xué)習(xí)研究的主要框架之一。不過,Torch 不提供機(jī)器學(xué)習(xí)實(shí)驗(yàn)的抽象和樣板代碼。因此,研究人員一次次重復(fù)完成那些并非彼此協(xié)作的實(shí)驗(yàn)邏輯。我們在此介紹 Torchnet:一個為機(jī)器學(xué)習(xí)提供抽象和樣板代碼的開源框架。它鼓勵模塊化編程和代碼重用,這減少了漏洞出現(xiàn)的幾率,并且讓不同步的數(shù)據(jù)載入和高效的多GPU計(jì)算,使用起來簡單明了。Torchnet 是用 Lua 語言編寫的,因此用 Torch 裝置在任何架構(gòu)上都很容易安裝。我們認(rèn)為未來 Torch 會成為一個平臺,外界社區(qū)可以通過插件參與貢獻(xiàn)。
1. 簡介
Torch 7 是一個針對科學(xué)計(jì)算框架的靈活計(jì)算庫,包含 CPU (通過 OpenMP / SSE)和 GPU (通過 CUDA)上、針對主要代數(shù)運(yùn)算的低等級高效執(zhí)行,以及使用 Lua 腳本語言的非常輕量的包裝(Collobert等人,2011)。Torch 有非常活躍的開發(fā)者社區(qū),已經(jīng)開發(fā)了許多程序包,包括優(yōu)化、流行學(xué)習(xí)、度量學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)等等。Torch 神經(jīng)網(wǎng)絡(luò)程序包目前是一個非常流行的深度學(xué)習(xí)框架,因?yàn)樗诤狭遂`活性和計(jì)算高效性。
Torch 神經(jīng)網(wǎng)絡(luò)程序包使得建立模型、評估模型輸出、以及基于其參數(shù)或輸入來計(jì)算模型輸出的導(dǎo)數(shù)變得很容易。但是,要實(shí)施一個完整的學(xué)習(xí)實(shí)驗(yàn)仍然需要大量開發(fā)工作,而 torch / nn 無法為之提供支持:研究人員們需要開發(fā)一個高效的數(shù)據(jù)加載器,將可用的數(shù)據(jù)區(qū)分為訓(xùn)練組和測試組,用所選的優(yōu)化器連接模型(梯度)進(jìn)行評估,進(jìn)行性能測量來監(jiān)控訓(xùn)練、評估最終模型的質(zhì)量,并且設(shè)立日志。此類樣板代碼的開發(fā)經(jīng)常包含大量代碼重復(fù),并且容易出錯,這可能會導(dǎo)致不正確的研究結(jié)果。尤其是缺少預(yù)定義的抽象和參考執(zhí)行,讓研究人員很難寫出容易為他人所采用和重用的代碼。
這篇論文中我們呈現(xiàn) Torch:一個新的開源框架,推動(深度)機(jī)器學(xué)習(xí)實(shí)驗(yàn)快速前進(jìn)。Torchnet 提供了一系列關(guān)鍵抽象、樣板代碼和參考執(zhí)行,目標(biāo)是讓代碼可以重用,并且實(shí)現(xiàn)高效。Torchnet 特別鼓勵一種模塊化設(shè)計(jì),明確區(qū)分?jǐn)?shù)據(jù)庫、數(shù)據(jù)載入過程、模型、優(yōu)化和性能測量。不同的組成部分在一個 Engine 中互相聯(lián)接,它執(zhí)行模型訓(xùn)練和評估。模塊化設(shè)計(jì)使其很容易重用代碼、并開發(fā)一系列實(shí)驗(yàn):例如,在不同的數(shù)據(jù)庫上運(yùn)行同樣的實(shí)驗(yàn),相當(dāng)于插入一個不同的數(shù)據(jù)載入器;改變評估標(biāo)準(zhǔn),相當(dāng)于插入一個不同的性能表。Torch 也不犧牲效率:它提供不同步數(shù)據(jù)載入的創(chuàng)新支持,并在多GPU上支持訓(xùn)練。
我們預(yù)見,Torchnet 未來會成為一個平臺,研究社區(qū)可以通過機(jī)器學(xué)習(xí)實(shí)驗(yàn)或工具的插件來參與貢獻(xiàn)。這會讓驗(yàn)證實(shí)驗(yàn)設(shè)置的細(xì)節(jié)(和正確度)、復(fù)制結(jié)果和重用代碼都變得更加容易。
表1:Torchnet 中所有實(shí)現(xiàn)的 Dataset 概況。
2. 抽象
Torchnet 從有所相似、但是問世更早的 Lush 框架中獲得啟發(fā),執(zhí)行五種主要類型的抽象:(1) Dataset,(2) DatasetIterator,(3) Engine,(4) Meter 和(5) Log。下面,我們分別呈現(xiàn)這五種主要的抽象:
2.1. Dataset
Dataset 抽象只提供兩種函數(shù):(1) size( ) 函數(shù),返回數(shù)據(jù)庫中樣本的數(shù)量,以及(2) get ( idx ) 函數(shù),返回數(shù)據(jù)庫中第 idx 個樣本。創(chuàng)建復(fù)雜的數(shù)據(jù)載入器可以通過將一個數(shù)據(jù)庫插入另一個數(shù)據(jù)庫,后者執(zhí)行各種操作,例如數(shù)據(jù)聯(lián)接、數(shù)據(jù)庫分割、批量數(shù)據(jù)、數(shù)據(jù)重新取樣、數(shù)據(jù)過濾和樣本轉(zhuǎn)換,這與 Torchnet 對模塊化編程的重視一致。表1展現(xiàn)了通過使用 Torchnet 在數(shù)據(jù)庫上可以運(yùn)行的所有操作。模塊化方法的主要優(yōu)勢是,它在少數(shù)幾行代碼中幫助打造復(fù)雜的數(shù)據(jù)載入器:當(dāng)你想在一個新數(shù)據(jù)庫上訓(xùn)練模型時,只要執(zhí)行一個返回數(shù)據(jù)庫中樣本數(shù)量的函數(shù)、以及一個返回某個具體樣本的函數(shù)就行。接下來,表1中的數(shù)據(jù)庫可以基于某個特定的分布用于各項(xiàng)操作,包括重新平衡類別、打造小批量進(jìn)行訓(xùn)練、將數(shù)據(jù)分割為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)等等。而且,實(shí)施模型訓(xùn)練或評估的引擎,對于其用來訓(xùn)練的數(shù)據(jù)庫基本上是不可知的:例如,當(dāng)使用 Imagenet(Deng等人,2009)、MS COCO(Lin等人,2014b) 數(shù)據(jù)庫等數(shù)據(jù)載入器的時候,在 MS COO 數(shù)據(jù)庫上重新訓(xùn)練(或測試)一個 Imagenet 卷積神經(jīng)網(wǎng)絡(luò)(He等人,2016),相當(dāng)于只要將 MS COCO 數(shù)據(jù)庫的核心數(shù)載入器插入現(xiàn)有代碼中就行了。
2.2. 數(shù)據(jù)庫迭代器
當(dāng)運(yùn)行訓(xùn)練或測試時,必須在數(shù)據(jù)庫中所有樣本上進(jìn)行迭代,并進(jìn)行參數(shù)更新或者性能測量積累(分別是 Engine 和 Meter 函數(shù)的功能)等操作。類似這樣的數(shù)據(jù)庫迭代器最簡單的形式是一個簡單的 for 循環(huán),從1運(yùn)行至數(shù)據(jù)庫大小,調(diào)用 get()函數(shù),用循環(huán)值作為輸入;DatasetIterator 執(zhí)行的就是這個迭代器,帶有一個可選的依賴數(shù)據(jù)的過濾器(可以通過 filter ( ) 閉包來實(shí)現(xiàn))。在實(shí)際情況中效率非常重要,寧可多線不同步地執(zhí)行數(shù)據(jù)載入。ParallelDatasetIterator 提供這項(xiàng)功能:其中線的數(shù)量是預(yù)定義的,都從其中的數(shù)據(jù)庫中載入數(shù)據(jù),當(dāng)?shù)髦械臉颖居龅秸埱?,會返回首個可用的樣本。如果有足夠多線,數(shù)據(jù)迭代器永遠(yuǎn)都會有可供即刻返回的可用樣本,這樣我們可以將整個針對訓(xùn)練或測試的數(shù)據(jù)載入和預(yù)處理都隱藏起來。當(dāng)數(shù)據(jù)在進(jìn)入模型前執(zhí)行復(fù)雜轉(zhuǎn)換時,這變得尤為重要,例如,在訓(xùn)練計(jì)算機(jī)視覺模型時經(jīng)常應(yīng)用在圖像上的仿射變換和色彩變換(Howard,2013)。
2.3. Engine
當(dāng)利用不同的模型和數(shù)據(jù)庫進(jìn)行實(shí)驗(yàn)時,經(jīng)常是基于相同的訓(xùn)練過程。Engine 抽象提供模型訓(xùn)練和測試必需的樣本邏輯。特別重要的是,它完成模型(默認(rèn)為 nn.Module)、DatasetIterator 和損失函數(shù)(默認(rèn)為 nn.Criterion)之間的交互。舉個例子,一個 Engine 執(zhí)行兩個說明這類互動的函數(shù):(1)一個 train( ) 函數(shù)從數(shù)據(jù)中取樣、在模型中傳輸該數(shù)據(jù)、計(jì)算損失值、在模型中傳輸損失梯度并執(zhí)行參數(shù)更新;(2)一個 test( ) 函數(shù)從數(shù)據(jù)中取樣、在模型中傳輸數(shù)據(jù)并測量最終預(yù)測的質(zhì)量。
Engine 提供了一系列鉤子,讓用戶不用編輯 Engine 的核心邏輯,就能插入針對某個具體實(shí)驗(yàn)的代碼,例如性能 Meter。這鼓勵了代碼重用,并可能預(yù)防漏洞,同時仍然為編寫訓(xùn)練和測試代碼提供了完全靈活性。鉤子有一個特別好的特點(diǎn),就是它們被打造為閉包,這樣,要在訓(xùn)練模型使用的代碼和測試模型使用的代碼之間分享邏輯(例如復(fù)制數(shù)據(jù)樣本到 GPU)就很方便。
表2:Torchnet 中實(shí)現(xiàn)的所有 Meter 的概況。
目前的 Torchnet 代碼包含兩個 Engine 操作:(1)一個 SGDEngine,通過 SGD 執(zhí)行模型的訓(xùn)練;(2)一個 OptimEngine,通過 torch / optim 程序包中的任何優(yōu)化器——包括 AdaGrad(Duchi等人,2011)、Adam(Kingma & Ba,2015)、共軛梯度法以及 L-BFGS——執(zhí)行模型的訓(xùn)練。
2.4. Meter
通常在學(xué)習(xí)模型的訓(xùn)練和測試中,我們希望測量一些特性,例如執(zhí)行訓(xùn)練階段所需要的時間、在所有樣本上平均的損失函數(shù)值、二元分類器的 ROC 曲線下的面積、多類分類器的分類錯誤、檢索模型的精度和召回、或者排名算法的歸一化衰減累積增量。Torchnet 提供了各種 Meter,能防止研究人員一遍遍重新執(zhí)行此類性能測量(此過程中還可能引入漏洞)。表2 是所有目前 Torchnet 中實(shí)現(xiàn)的所有 Meter 的概況。。大部分性能表(除了 TimeMeter 和AverageValueMeter 之外)執(zhí)行兩個主要函數(shù):(1)add(output,target)函數(shù),將模型輸出和一或多個樣本相應(yīng)目標(biāo)的值加入性能表;(2)value()函數(shù),返回目前性能表的值。
2.5. 日志
Torchnet 為記錄實(shí)驗(yàn)提供兩種 Log:一種簡單的 Log,還有一種 RemoteLog。兩者都可以以原始文本(輸入到一個文檔或者 stdout)和 JSON 的形式輸出日志信息。
3. 例子
在這個部分,我們將呈現(xiàn)一個簡單、可用的例子,說明如何在 MNIST 數(shù)據(jù)庫上使用 Torchnet 訓(xùn)練一個邏輯回歸量。代碼首先包括所需的相關(guān)性:
然后,我們定義一個函數(shù),在 MNIST 訓(xùn)練或測試庫中打造一個不同步的數(shù)據(jù)庫迭代器。數(shù)據(jù)庫迭代器收到一個閉包作為輸入,后者打造 Torchnet 數(shù)據(jù)庫目標(biāo)。這里,數(shù)據(jù)庫是一個 ListDataset,僅僅從張量返回包含圖像和目標(biāo)的行;實(shí)踐中,你會用自己的數(shù)據(jù)庫定義代替這個 ListDataset。核心的 Dataset 被包裹在一個 BatchDataset 中,用于打造大小為128的迷你批次。
然后,我們設(shè)立了一個簡單的線性模型:
接下來,我們初始化 Torchnet 引擎,實(shí)施鉤子來重設(shè)、更新和打印平均損失和平均分類錯誤。調(diào)用更新平均損失和分類錯誤的鉤子,是在 forward () 調(diào)用以下的訓(xùn)練 criterion 之后:
之后,我們使用 SGD 將邏輯損失最小化:
模型訓(xùn)練后,我們在測試組上測量平均損失和分類錯誤:
大部分高級例子可能會在 engine 中實(shí)施額外的 hooks。例如,如果你想在每一次訓(xùn)練后測量測試錯誤,這可以在 engine.hooks.onEndEpoch 鉤子中實(shí)施。讓同一個樣本運(yùn)行 GPU 需要為代碼做一些簡單的增補(bǔ),特別是將模型和數(shù)據(jù)都復(fù)制到 GPU。要復(fù)制數(shù)據(jù)樣本到 GPU 的一個緩沖器上,可以通過實(shí)施一個鉤子來實(shí)現(xiàn),鉤子在可用的樣本出現(xiàn)后執(zhí)行:
4. 與其他框架相比較
Torchnet 與其他深度學(xué)習(xí)框架都非常不同,例如 Caffe(Jia等人,2014)、Chainer、TensorFlow(Abadi等人,2016)和 Theano(Bergstra等人,2011),因?yàn)?Torchnet 不專注于在深度網(wǎng)絡(luò)中執(zhí)行有效的推理和梯度計(jì)算,而是在一個深度學(xué)習(xí)框架之上(在我們的例子中,也就是 torch / nn)提供一個框架 ,通過提供樣板代碼以及鼓勵模塊化設(shè)計(jì)——后者讓研究人員可以恨簡單地進(jìn)行代碼重用——這讓快速實(shí)驗(yàn)更加簡單。Torchnet 對于其學(xué)習(xí)框架不做什么假設(shè):Torchnet 抽象可以為例如 Caffe 和 TensorFlow 進(jìn)行直接實(shí)施。
Torchnet 與 Blocks 和 Theano 的 Fuel 類似。特別是 Torchnet 的 Dataset 類似于 Fuel 的 Transformer,但是 Torchnet 的 Dataset 更加靈活,因?yàn)樗麄冞€完成數(shù)據(jù)批量、分離和重新取樣。Torchnet 的 DatasetIterator 類似于 Fuel 的 DataStream,但是 Torchnet 對不同步、多線數(shù)據(jù)載入有更好的支持: Fuel 提供的 ServerDataStream 運(yùn)行單獨(dú)的數(shù)據(jù)載入過程,通過 TCP 插座與訓(xùn)練器聯(lián)絡(luò)——多線數(shù)據(jù)載入必須手動完成。與之相比,Torchnet 提供的插件 ParallelDatasetIterator 讓不同步的、多線數(shù)據(jù)載入變得非常簡單。Fuel 的 ServerDataStream 與 Torchnet 的 ParallelDatasetInterator 相比有一個潛在優(yōu)勢,即是數(shù)據(jù)載入過程可以在與訓(xùn)練代碼不同的機(jī)器上運(yùn)行。在 Blocks 里,Brick 類似于 torch / nn 的 Module,Blocks 里的 MainLoop 類似于 Torchnet 的 Engine。Blocks 可以實(shí)現(xiàn)一些基本的性能測試,例如分類錯誤,但是目前 Blocks 不提供 Torchnet 的 Meter 所提供的那種豐富的測量庫。
5. 展望
我們預(yù)見 Torchnet 未來會成為一個由社區(qū)擁有的平臺,在 Torchment 的核心完成之后,與 Torch 一樣提供一系列子程序包。我們認(rèn)為,最重要的子程序包未來將實(shí)施與許多機(jī)器學(xué)習(xí)問題相關(guān)的樣板代碼,例如計(jì)算機(jī)視覺(vision)、自然語言處理(text)和語音處理(speech)。不過,其他子程序包可能更小,專注于更加特定的問題、甚至特定的數(shù)據(jù)庫。舉個例子,我們認(rèn)為未來會有小的子程序包,將各種數(shù)據(jù)庫包裝入 Torchnet 的 Dataset,例如 Imagenet 和 COCO 等視覺數(shù)據(jù)庫(Deng等人,2009;Lin等人,2014a)、TIMIT 和 LibriSpeech 等語音數(shù)據(jù)庫(Garofalo等人,1993;Panayotov等人,2015)、以及“十億單詞基準(zhǔn)”和 WMT-14 等文本數(shù)據(jù)庫(Chelba等人,2013)。
VIA ICML
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。