網(wǎng)上有很多關(guān)于pos機終端初始化異常,Nginx源碼分析之模塊初始化的知識,也有很多人為大家解答關(guān)于pos機終端初始化異常的問題,今天pos機之家(www.tjfsxbj.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
pos機終端初始化異常
機器之心編譯
參與:楊旋、袁澤林、趙華龍、吳攀
近日,來自卡內(nèi)基梅隆大學(xué)、日本奈良先端科學(xué)技術(shù)大學(xué)、Google DeepMind、以色列巴伊蘭大學(xué)、艾倫人工智能研究所、IBM T.J. Watson 研究中心、澳大利亞墨爾本大學(xué)、約翰·霍普金斯大學(xué)、谷歌、華盛頓大學(xué)、微軟和英國愛丁堡大學(xué)的研究者共同發(fā)表了一篇重磅論文《DyNet: The Dynamic Neural Network Toolkit》,正式介紹了動態(tài)神經(jīng)網(wǎng)絡(luò)工具包 DyNet;該工具包也已在 GitHub 上開源:http://github.com/clab/dynet。機器之心對這篇論文進行了摘要性的介紹,論文原文可點擊文末「閱讀原文」下載。
摘要:在本論文中,我們將介紹 DyNet——一個基于網(wǎng)絡(luò)結(jié)構(gòu)的動態(tài)聲明(dynamic declaration of network structure)的用于實現(xiàn)神經(jīng)網(wǎng)絡(luò)模型的工具包。在 Theano、CNTK 和 TensorFlow 等工具包中所用的靜態(tài)聲明策略(static declaration strategy)中,用戶需要首先定義計算圖(computation graph,即計算過程的符號表示),然后樣本會被傳遞給執(zhí)行該計算的引擎并計算其導(dǎo)數(shù)。而在 DyNet 的動態(tài)聲明策略中,計算圖的構(gòu)建(construction)基本上是透明的,通過執(zhí)行用于計算網(wǎng)絡(luò)輸出的程序代碼來隱式地構(gòu)造;對于任意一個輸入,用戶都可以自由得使用不同的網(wǎng)絡(luò)結(jié)構(gòu)。因此,動態(tài)聲明有助于實現(xiàn)更復(fù)雜的網(wǎng)絡(luò)架構(gòu);特別的,DyNet 允許用戶使用他們喜愛的編程語言(C ++ 或 Python)以一種他們慣用的方式來實現(xiàn)他們的模型。在動態(tài)聲明中,有一件充滿挑戰(zhàn)的事情:由于對于每個訓(xùn)練樣本都要重新定義符號計算圖,所以其構(gòu)建的開銷必須要低。為了實現(xiàn)這一點,DyNet 使用了一個經(jīng)過優(yōu)化的 C ++ 后端和輕量級的圖表示(graph representation)。實驗表明,DyNet 的速度與靜態(tài)聲明工具包相當甚至比其更快,并且明顯快于另一個動態(tài)聲明工具包 Chainer。DyNet 根據(jù) Apache 2.0 許可證進行了開源,可以在這里訪問:http://github.com/clab/dynet
1. 引言
深度神經(jīng)網(wǎng)絡(luò)現(xiàn)在是機器學(xué)習(xí)開發(fā)者的工具箱中不可或缺的工具,它在圖像理解 [39]、語音的識別與合成 [29,65]、游戲 [45,54]、語言建模和分析 [6, 14 ] 等領(lǐng)域中擁有重要的地位。首先,深度學(xué)習(xí)將應(yīng)用特定的特征工程(加上理解良好的模型,這是經(jīng)典的「淺度」學(xué)習(xí)的范式)替換成了應(yīng)用特定的模型工程(model engineering,通常結(jié)合了輸入的不太復(fù)雜的特征)。因此,深度學(xué)習(xí)范式在不斷發(fā)展新的模型變體。要開發(fā)有效的模型不僅僅需要洞察力和進行分析,還需要實現(xiàn)一些新模型并評估其在實際任務(wù)上的表現(xiàn)。因此,快速的原型設(shè)計、高效輕松的維護和正確的模型代碼在深度學(xué)習(xí)中至關(guān)重要。
深度學(xué)習(xí)模型以兩種模式操作:在給定輸入的情況下計算預(yù)測值(或者是預(yù)測上的分布),或者在監(jiān)督學(xué)習(xí)訓(xùn)練的時候計算相關(guān)模型參數(shù)的預(yù)測誤差「損失」的導(dǎo)數(shù),用于使用梯度下降方法的某些變體來最小化和類似輸入之間后續(xù)的誤差。因為實現(xiàn)模型需要同時實現(xiàn)模型預(yù)測的代碼和進行梯度計算和學(xué)習(xí)的代碼,所以模型開發(fā)是一個非常困難的工程挑戰(zhàn)。通過使用簡化神經(jīng)網(wǎng)絡(luò)計算的工具,可以減少這種挑戰(zhàn)的難度。這些工具包括 Theano [7]、TensorFlow [1]、Torch [13]、CNTK [64]、MxNet [10] 和 Chainer [62],它們提供了神經(jīng)網(wǎng)絡(luò)功能原語(例如線性代數(shù)運算、非線性變換等)、參數(shù)初始化和程序優(yōu)化以及表達特定任務(wù)預(yù)測和誤差的復(fù)合能力——這些預(yù)測和誤差然后會被自動微分(autodiff)以獲取驅(qū)動學(xué)習(xí)算法所需的梯度。最后的自動微分(autodiff)組件可以說是它們最重要的節(jié)省勞動的功能,因為如果要改變計算訓(xùn)練輸入損失值的函數(shù),那么其導(dǎo)數(shù)的計算過程也要做出相應(yīng)的改變。如果工程師獨立地維護這些代碼路徑,則它們很容易導(dǎo)致它們不能同步。此外,由于對復(fù)合表達式的微分的算法相對簡單 [63,31],所以使用 autodiff 算法代替手寫代碼計算導(dǎo)數(shù)是個不錯的選擇。
簡言之,由于這些工具有效地解決了一些關(guān)鍵的軟件工程問題,它們讓深度學(xué)習(xí)取得了成功。不過仍然存在一些問題:因為工程(engineering)是深度學(xué)習(xí)實踐的關(guān)鍵組成部分,什么工程問題是現(xiàn)有工具無法解決的呢?它們能讓程序員比較自然地實現(xiàn)自己的想法嗎?它們是否便于調(diào)試?它們是否方便大型項目的維護?
在本論文中,我們將推薦一個基于幾個流行工具包的編程模型——即將網(wǎng)絡(luò)架構(gòu)的聲明和執(zhí)行(我們稱為靜態(tài)聲明)進行分離,在這其中必然會存在一些嚴重的軟件工程風險,特別是在處理動態(tài)結(jié)構(gòu)化網(wǎng)絡(luò)架構(gòu)(例如,可變長度的序列和樹形結(jié)構(gòu)的遞歸神經(jīng)網(wǎng)絡(luò))的時候。作為一種替代方案,我們提出了一個替代的編程模型,它可在 autodiff 庫中進行統(tǒng)一聲明和執(zhí)行。
作為我們推薦的編程模型的概念證明,我們通過論文《DyNet: The Dynamic Neural Network Toolkit》進行了描述。DyNet 是一個基于統(tǒng)一聲明和執(zhí)行編程模型的工具包,我們稱之為動態(tài)聲明(dynamic declaration)。
在單臺機器環(huán)境(single-machine environment)中的一系列案例研究中,我們表明 DyNet 的執(zhí)行效率與標準模型架構(gòu)的靜態(tài)聲明工具包相當。和使用動態(tài)架構(gòu)(例如,其中每個訓(xùn)練實例具有不同的模型架構(gòu))的模型相比,DyNet 的實現(xiàn)得到了顯著的簡化。
2. 靜態(tài)聲明 vs. 動態(tài)聲明
在本節(jié)中,我們更具體地描述了靜態(tài)聲明(§2.1)和動態(tài)聲明(§2.2)的兩種范式。
3.范式編碼
3.1 編碼范式概述
從用戶的角度來看,使用 DyNet 編寫程序的目的是創(chuàng)建對應(yīng)于需要被執(zhí)行的計算的表達式(Expression)。這首先從基本的表達式開始,基本表達式通常是常量輸入值或模型參數(shù)(Parameters)。然后,通過進行運算(Operation)從其他表達式進一步構(gòu)建復(fù)合表達式,并且運算鏈(chain of operations)隱含地為所需的計算定義一個計算圖(ComputationGraph)。該計算圖表示了符號計算,并且計算的結(jié)果是被動的:僅當用戶顯式地請求它時(在該點觸發(fā)「前向(forward)」計算)才執(zhí)行計算。評估標量(即損失值)的表達式也可以用于觸發(fā)「后向」計算,其以參數(shù)為依據(jù)來計算計算的梯度。參數(shù)和梯度被保存在模型(Model)對象中,訓(xùn)練器(Trainer)用于根據(jù)梯度和更新規(guī)則來更新參數(shù)。
我們下面將簡要地介紹這些每種組件:
Parameter 和 LookupParameter:Parameter 是表示諸如權(quán)重矩陣和偏置向量之類的實數(shù)向量、矩陣或張量。LookupParameters 是我們想要查找的參數(shù)向量集,例如詞嵌入(word embeddings)。換句話說,如果我們有一個詞匯集 V,我們想要查找其嵌入(embeddings),那么就有一個 LookupParameters 對象定義一個 | V | ×d 矩陣,其作為一個嵌入矩陣與 0,...,| V | -1 到 d 維向量的項形成映射。Parameters 和 LookupParameters 被存儲在模型中,并可以跨越訓(xùn)練樣本(即跨不同的 ComputationGraph 樣本)進行保存。
模型(Model):模型是 Parameters 和 LookupParameters 的集合。用戶通過從模型中請求 Parameters 來獲取它們。然后模型會跟蹤這些參數(shù)(及其梯度)。模型可以保存到磁盤中也可以通過磁盤加載,也可以被下面要講到的 Trainer 對象使用。
訓(xùn)練器(Trainer):訓(xùn)練器實現(xiàn)在線更新規(guī)則,比如簡單隨機梯度下降、AdaGrad [16] 或 Adam [34]。Trainer 有指向 Model 對象的指針,所以同時也有其中的參數(shù),并且還可以根據(jù)更新規(guī)則的需要保存關(guān)于參數(shù)的其他信息。
表達式(Expression):在 DyNet 項目中,表達式是主要的可以被操作的數(shù)據(jù)類型。單個表達式代表了一個計算圖中的一個子計算。舉個例子,一個表示矩陣或者向量的參數(shù)對象可以被加進計算圖里,這就產(chǎn)生了一個表達式 W 或者 b。同樣,一個 LookupParameters 對象 E 可以通過查找操作來查詢一個專門的嵌入向量(它也是被加在計算圖里的),這就產(chǎn)生了一個表達式 E[i]。這些表達式可以被組合成更大的表達式,例如 concatenate(E[3], E[4]) 或者 softmax(tanh(W ? concatenate(E[3], E[4]) +b))。這里的 softmax、tanh、?、+、concatenate 都是運算,下面詳細介紹。
運算(Operations):運算不是對象,而是在表達式以及返回表達式上運行的函數(shù),它用來在后臺構(gòu)建計算圖。DyNet 為很多基本的算術(shù)原語(加、乘、點積、softmax、...)和常用的損失函數(shù)、激活函數(shù)等等都定義了相應(yīng)的運算。當情況適宜時,運算可以通過運算符重載來定義,這使得圖的構(gòu)建能盡可能地直觀和自然。
構(gòu)造器類(Builder Classes):Builder Classes 定義了創(chuàng)建各種「標準化」的網(wǎng)絡(luò)組件(比如循環(huán)神經(jīng)網(wǎng)絡(luò)、樹結(jié)構(gòu)網(wǎng)絡(luò)和大詞匯量 softmax)的接口。這些都工作在表達式和運算之上,并且提供了各種易用的庫。Builder Classes 為各種標準算法提供了高效便捷的實現(xiàn)。不過,從代碼層次的意義上來說,它并不是「核心」DyNet 庫的一部分,因為 Builder Classes 是更高層次的,它實現(xiàn)在 DyNet 最核心的自動微分功能之上。Builder Classes 將會在后續(xù)的§5 中深入討論。
計算圖(ComputationGraph):表達式相當于一種隱含的計算圖對象的一部分,該計算圖定義了需要進行的計算是什么。DyNet 目前假定在任意一個時刻只有一個計算圖存在。盡管計算圖是 DyNet 內(nèi)部工作的核心,但從使用者的角度來看,唯一需要負責做的是為每個訓(xùn)練樣本創(chuàng)建一個新的計算圖。
用 DyNet 中實現(xiàn)并訓(xùn)練一個模型的整體流程可描述如下:
創(chuàng)建一個模型;
向模型里增加必要的參數(shù)(Parameters)和查找表參數(shù)(LookupParameters);
創(chuàng)建一個訓(xùn)練器(Trainer)對象,并使之與模型(Model)相關(guān)聯(lián);
對每個樣本(example):
(a) 創(chuàng)建一個新的計算圖(ComputationGraph),并且建立一個表達式(Expression)來填充該計算圖,該表達式用來表示針對這個樣本想要進行的計算。
(b) 通過調(diào)用最終表達式的 value() 或者 npvalue() 函數(shù),計算整個圖前向計算的結(jié)果。
(c) 如果訓(xùn)練的話,計算損失函數(shù)的表達式,并使用它的 backward() 函數(shù)來進行反向傳播。
(d) 使用訓(xùn)練器對模型的參數(shù)進行更新。
與像 Theano 和 TensorFlow 這樣的靜態(tài)聲明庫對比可以發(fā)現(xiàn),創(chuàng)建一個圖的步驟落在每一個樣本的循環(huán)里。這有利于使用戶為每個實例(instance)靈活地創(chuàng)建新的圖結(jié)構(gòu),并使用他們掌握的編程語言中的流控句法(flow control syntax,比如迭代(iteration))來做這些。當然,它也增加了對圖結(jié)構(gòu)速度的要求,即它要足夠快,不能變成負擔,我們會在§4 中進一步闡述。
3.2 高層面的示例
為了在更高層次說明 DyNet 的編碼范式,我們用 Python 演示了一個 DyNet 程序的例子,如圖 1 所示。這個程序顯示了為一個簡單分類器進行最大似然訓(xùn)練的過程,這個分類器為每個需要它預(yù)測的類計算一個向量分數(shù),然后返回這個得分最高的類 ID 以及這個最高分。我們假定每個訓(xùn)練樣本是一個(輸入和輸出)對,其中輸入是一個二詞索引的元組,輸出是一個指示正確類的數(shù)。
圖 1:一個使用 DyNet 的 Python API 進行訓(xùn)練和測試的例子。
在頭兩行,我們導(dǎo)入(import)適當?shù)膸?。在?3 行,我們初始化 DyNet 模型,并為相關(guān)參數(shù)分配內(nèi)存空間,但是不初始化它們。在第 4—6 行,我們向模型里添加我們的參數(shù),這個過程會因為使用的模型不同而不一樣。這里我們增加一個 20 × 100 的權(quán)重矩陣、一個 20 維的偏置向量和一個查找表(嵌入表)——該查找表的詞匯量大小為 20000 項映射到 50 維向量。在第 7 行,我們初始化了一個訓(xùn)練器(在這個例子中是一個簡單的隨機梯度降(SGD)訓(xùn)練器),這個訓(xùn)練器被用來更新模型參數(shù)。在第 8 行中,我們對數(shù)據(jù)進行多次訓(xùn)練和測試。
從第 9 行開始,我們對訓(xùn)練數(shù)據(jù)進行迭代。第 10 行,清除當前計算圖的內(nèi)容,開始一個空的計算圖,為后續(xù)的計算做準備。第 11-13 行,我們創(chuàng)建一個圖,這個圖會為每個訓(xùn)練實例計算一個分數(shù)向量(這個過程會因為模型的不同而不同)。這里我們首先訪問模型中的權(quán)重矩陣和偏置向量參數(shù)(W_p 和 b_p),并把它們加到圖中,也就是這個代碼例子中用到的表達式中(W 和 b_p)。然后我們根據(jù)輸入的 id 來查找兩個向量,拼接它們,然后做一個線性變換和 softmax,這樣就創(chuàng)建了和計算相對應(yīng)的表達式。接下來,我們在第 14 行創(chuàng)建一個與損失有關(guān)的表達式——對正確記分結(jié)果做一次 softmax 后的負對數(shù)似然估計。在第 15 行,我們計算前向圖的結(jié)果,在第 16 行,我們計算后向的,并累計模型變量中參數(shù)的梯度。在第 17 行,我們根據(jù) SGD 的更新規(guī)則更新這些參數(shù),并清掉之前的累計梯度。
接下來,從第 18 和 19 行開始,我們遍歷測試數(shù)據(jù)并測量準確度。在第 20-23 行,我們又一次清除計算圖以及定義計算測試數(shù)據(jù)分數(shù)的表達式,方式和我們在訓(xùn)練數(shù)據(jù)中做的一樣。在第 24 行,我們開始計算并把結(jié)果數(shù)據(jù)放到一個 NumPy 的數(shù)組里。在第 25 和 26 行,我們檢查是否正確的數(shù)據(jù)是最高分的那個,如果是的話就把它算作是一個正確的結(jié)果。最后第 27 行,我們把本次迭代的測試準確度 print 出來。
3.3 動態(tài)圖構(gòu)建(Dynamic Graph Construction)的兩個示例
圖 2:樹結(jié)構(gòu)遞歸神經(jīng)網(wǎng)絡(luò)(tree-structured recursive neural network)的一個例子
圖 3:動態(tài)流控制的一個示例。
4 后臺工作
如上一節(jié)所述,將 DyNet 與其它神經(jīng)網(wǎng)絡(luò)工具包相區(qū)別的一個主要特性是,它能夠為每個訓(xùn)練樣本或 minibatch 有效地創(chuàng)建新的計算圖(Computation Graphs)。為了保持計算效率,DyNet 使用了細致的內(nèi)存管理策略來存儲前向傳播和反向傳播的計算過程中的值(§4.2),因此大部分時間都會用在實際的計算上(§4.3)
4.1 計算圖(Computation Graphs)
圖 4:公式 g(x, j) = tanh(W1?x+b)+tanh(W2?ej+b) 的計算圖的例子,以及相應(yīng)的代碼。
4.2 高效的圖構(gòu)建
4.3 執(zhí)行計算
5 更高級的抽象結(jié)構(gòu)
如第 3 節(jié)所述,DyNet 實現(xiàn)了在張量(tensors)上表示基本(子)可微函數(shù)的運算。這和 Theano 和 TensorFlow 庫中提供的運算是相似的。除了這些基本運算外,使用可被視為由基本運算組成的更復(fù)雜的結(jié)構(gòu)也是很常見的。常見的例子有循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)、樹結(jié)構(gòu)神經(jīng)網(wǎng)絡(luò)(tree-structured networks)和更復(fù)雜的計算 softmax 概率分布的方法。在其它庫中,這些更高級別的結(jié)構(gòu)或是通過本地提供,亦或是通過第三方庫(如 Keras)提供。在 DyNet 中,循環(huán)神經(jīng)網(wǎng)絡(luò)的本地支持、樹結(jié)構(gòu)神經(jīng)網(wǎng)絡(luò)和更復(fù)雜的 softmax 函數(shù)都是通過 Builder 提供的;具體細節(jié)會在接下來的章節(jié)描述,圖 5 中也有所總結(jié)。
圖 5:DyNet Builders 實現(xiàn)的更高級結(jié)構(gòu)的示例,以及它們的規(guī)范使用
5.1 循環(huán)神經(jīng)網(wǎng)絡(luò)的 Builders
5.2 樹結(jié)構(gòu)神經(jīng)網(wǎng)絡(luò)的 Builders
5.3 Large-Vocabulary Softmax Builders
圖 6:各種 RNN 接口
6 效率工具
DyNet 包含許多可以提高計算效率的功能,包括稀疏更新(sparse updates)、minibatching 和跨 CPU 的多處理(multi-processing across CPUs)。
7 實證比較
在本節(jié)中,我們將使用 C++ 接口和 Python 接口將 DyNet 和其他三個流行庫(Theano [7]、TensorFlow [1] 和 Chainer [62])進行對比。我們選擇這些庫是因為 Theano 和 TensorFlow 可以說是目前最受歡迎的深度學(xué)習(xí)庫,而 Chainer 的 define-by-run 哲學(xué)和 DyNet 相似。
表 1:各個任務(wù)的數(shù)據(jù)和默認設(shè)置。
表 2:每個工具箱在 CPU 上的處理速度。速度是以 RNNLM 與 Tagger 處理的詞/秒和 TreeLSTM 處理的句/秒進行衡量的。帶 +sparse 的行表示 LookupParameters 的稀疏更新(sparse updates),這是 DyNet 中的默認行為,但與其他工具包的執(zhí)行密集更新(dense updates)的實現(xiàn)不可對比。
表 3:每個工具箱在 GPU 上的處理速度。速度是以 RNNLM 與 Tagger 處理的詞/秒和 TreeLSTM 處理的句/秒進行衡量的。
表 4:從程序啟動到為每個工具包處理第一個實例的時間(秒)。
表 5:密集或稀疏更新(dense or sparse updates)10 分鐘后的處理速度和準確度。
表 6:每個工具包的實現(xiàn)的非注釋字符數(shù)。
8 使用案例
DyNet 已經(jīng)投入使用,并已被用于各種各樣的項目,主要涉及自然語言處理。DyNet 本身包含一些從最小到中等復(fù)雜度的示例(在 examples/ 目錄下)。我們還列出了一些全面的研究項目,可以讓有興趣的讀者找到匹配他們感興趣的應(yīng)用程序的參考樣例。
句法分析(Syntactic Parsing):分析是目前使用 DyNet 的最突出的場景,DyNet 是許多方法的開發(fā)背后的庫,例如 stack LSTMs [17](https://github.com/clab/lstm-parser)、用于依賴性解析的雙向 LSTM 特征提取器(https://github.com/elikip/bist-parser)、循環(huán)神經(jīng)網(wǎng)絡(luò)語法 [18](https://github.com/clab/rnng),和 LSTM 層次樹 [35](https://github.com/elikip/htparser)。
機器翻譯(Machine Translation):DyNet 幫助創(chuàng)造了包括注意偏差(biases in attention)[12](https://github.com/trevorcohn/mantis)和基于字符的 27 種翻譯方法 [42] 等方法。它還為許多機器翻譯工具包提供支持,如 Lamtram(https://github.com/neubig/lamtram)和 nmtkit(https:// github.com/odashi/nmtkit)。
語言建模(Language Modeling):DyNet 已被用于混合神經(jīng)/n 元語言模型(hybrid neural/n-gram language models)的開發(fā) [47](https://github.com/neubig/modlm)和生成語法語言模型 [18](https://github.com/clab/rnng)。
標注(Tagging):DyNet 用于命名實體識別方法的開發(fā) [47](https://github.com/clab/stack-lstm-ner)、POS 標注、語義角色標簽 [60](https://github.com/clab/joint-lstm-parser)、標點符號預(yù)測 [5](https://github.com/miguelballesteros/LSTM-punctuation)和序列處理的多任務(wù)學(xué)習(xí) [37,56] 以及創(chuàng)建新的架構(gòu),如段循環(huán)神經(jīng)網(wǎng)絡(luò)(segmental recurrent neural networks)[38](https://github.com/clab/dynet/tree/ master/examples/cpp/segrnn-sup)。
形態(tài)(Morphology):DyNet 已被用于形態(tài)變化生成 [21, 2](https://github.com/mfaruqui/morph-trans https://github.com/roeeaharoni/morphological-reinflection)。
雜項:DyNet 已被用于開發(fā)專門的用于檢測協(xié)調(diào)結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò) [22];半監(jiān)督的介詞意義消歧 [23]; 和用于識別詞匯語義關(guān)系 [53,52](https://github.com/vered1986/HypeNET)。
總結(jié)、致謝和參考文獻(略)
以上就是關(guān)于pos機終端初始化異常,Nginx源碼分析之模塊初始化的知識,后面我們會繼續(xù)為大家整理關(guān)于pos機終端初始化異常的知識,希望能夠幫助到大家!
