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