国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

機器學習和深度學習的并行訓(xùn)練方法

2022-09-20 02:55祝佳怡
現(xiàn)代計算機 2022年14期
關(guān)鍵詞:梯度樣本損失

祝佳怡

(西南民族大學計算機科學與工程學院,成都 610225)

0 引言

人工智能(artificial intelligence,AI)這一概念的出現(xiàn)最早可以追溯到20世紀50年代。隨著Marvin Minsky和John McCarthy于1956年共同主持的達特矛斯會議(dartmouth summer research project on artificial intelligence,DSRPAI)的舉辦,“人工智能”這一概念被正式定義。該會議的舉辦標志著人工智能進入了第一次發(fā)展期。在當今時代,因機器學習(machine learning,ML)和深度學習(deep learning,DL)方法和大數(shù)據(jù)技術(shù)的不斷發(fā)展,人工智能已經(jīng)成為必不可少的科學技術(shù)之一。如今人工智能模型的效果越來越好,這離不開高性能模型的設(shè)計,而無論是在工業(yè)界還是學術(shù)界,機器學習方法及深度學習模型都越來越傾向于向更復(fù)雜的方向發(fā)展。這一發(fā)展趨勢使得模型的訓(xùn)練成本越來越大,再加上數(shù)據(jù)量的龐大,訓(xùn)練一個效果優(yōu)秀的深度學習模型往往需要數(shù)月的時間。

在一般的計算機程序中,解決問題的算法通常是以指令序列流的形式執(zhí)行,這些指令通過中央處理器(central processing unit,CPU)來進行計算,這種方法被稱為串行計算(serial computing)。與之相對的并行計算(parallel computing)則將一個任務(wù)劃分為互不相關(guān)的多個計算部分,并使用多個計算單元對這些計算部分并行地分別進行計算,最終將結(jié)果匯總起來,實現(xiàn)了性能的提升。在理想的情況下,并行化所帶來的性能提升是指數(shù)級別的,即把問題規(guī)模劃分為一半,性能提升兩倍,以此類推。但是在更一般的情況下,并行計算的性能提升遵循Gustafson法則。消息傳遞接口(message passing interface,MPI)是實現(xiàn)并行計算的一種主流方式,各個進程間通過這一接口來進行任務(wù)的分配、消息的接收發(fā)送等機制,實現(xiàn)并行的目的。隨著目前云服務(wù)器和大數(shù)據(jù)的普及,并行計算將是解決大規(guī)模方法的最有效優(yōu)化手段之一。

傳統(tǒng)的ML、DL模型的訓(xùn)練方法是對訓(xùn)練樣本一個一個地進行計算,并根據(jù)所有樣本的結(jié)果對模型進行調(diào)整。這是一種非常典型的串行的實現(xiàn)思路。通過對該問題進行簡要分析可知,每個訓(xùn)練樣本之間的計算都是獨立的計算單元,這些樣本自身的計算之間互不相干,因此可以使用并行化的思想來解決該問題,從而大幅縮減模型的訓(xùn)練時間。多個節(jié)點并行地計算各自的樣本子集結(jié)果,并將這些結(jié)果匯總到主節(jié)點中,對模型的參數(shù)進行更新,完成了一輪的訓(xùn)練流程。在本實驗中嘗試將這一思想應(yīng)用于最簡單的機器學習模型訓(xùn)練當中。理想情況下,隨著計算節(jié)點數(shù)量的增加,訓(xùn)練所消耗的時間應(yīng)逐漸減少。實驗結(jié)果表明,在模型的規(guī)模較小時,使用MPI技術(shù)實現(xiàn)并行化方法的訓(xùn)練時間會隨著節(jié)點數(shù)的增加而增加。通過分析可知,在各節(jié)點的消息接收和發(fā)送階段也會存在一定的時間消耗。如果一個樣本計算所消耗的時間小于進程間消息接收發(fā)送的時間,則會導(dǎo)致這一與理想情況相悖的現(xiàn)象發(fā)生。本實驗中的模型是最簡單的線性回歸模型。在實際中,深度學習模型是非常龐大且復(fù)雜的。在這種常規(guī)的情況下,一個樣本計算所消耗的時間會大幅度多于進程間的通訊時間,這時并行化所帶來的計算效率的收益是巨大的。

1 數(shù)據(jù)集準備及方法介紹

1.1 數(shù)據(jù)集

本文以回歸任務(wù)作為示例,并使用其中最基礎(chǔ)的線性回歸來解釋本文闡述的ML、DL并行訓(xùn)練思想。所使用的數(shù)據(jù)集是隨機生成的用于線性回歸的數(shù)據(jù)。數(shù)據(jù)集的生成使用基于Python語言的Sci-kit Learn工具包中的make_regression()函數(shù)來實現(xiàn),代碼段如下:

其中指定了樣本數(shù)量為500,特征數(shù)量為1。生成的是一個長度為500的向量,也是一個長度為500的向量,中的每一個元素都通過一個參數(shù)與中的對應(yīng)值進行匹配。該數(shù)據(jù)集的可視化如圖1所示。需要注意的是該可視化雖然在視覺上是一條直線的形式,但實際上是由500個數(shù)據(jù)點構(gòu)成的。

圖1 隨機生成線性回歸數(shù)據(jù)集的可視化

機器學習及深度學習模型的目標就是找到最好的擬合數(shù)據(jù)的參數(shù),實現(xiàn)對訓(xùn)練集的特征學習。圖2很好地展示了不同的模型或不同的模型參數(shù)的擬合情況。

圖2 對數(shù)據(jù)集不同的擬合情況(長線段表示原始的數(shù)據(jù)集,點線表示擬合情況)

從圖2可知,(a)和(b)均沒有很好地擬合數(shù)據(jù)集;而(c)是一個擬合較好的情況,因此本文要盡可能使我們的模型達到如圖2(c)所示的效果。

1.2 串行的實現(xiàn)思路

為了更好地闡述以上的問題,在這里給出一些數(shù)學符號來對問題進行定義。設(shè)訓(xùn)練集的樣本總?cè)萘繛?,每個樣本含有個特征,則給定訓(xùn)練集∈R,其對應(yīng)的標簽∈R。在上述的數(shù)據(jù)集中,每個樣本只有一個特征,即=1;且保證了本實驗中的數(shù)據(jù)集中所有樣本的平均值為0,因此可以用一條=的直線來對數(shù)據(jù)進行擬合。

值越小,證明模型對該樣本的預(yù)測效果越好。對所有樣本都進行該運算,最后將所有樣本的值進行累加,得到模型總的損失??倱p失也被稱為模型的代價(cost value)。

一種通用的求解的方法被稱為梯度下降法。根據(jù)模型的代價,對參數(shù)求偏導(dǎo),可以使用該值對模型的參數(shù)不斷進行更新迭代,數(shù)學定義如下:

其中為學習率,可以用來調(diào)節(jié)更新迭代的步長大小。合適的學習率可以使模型的損失更快速地收斂到局部或全局最小值。迭代更新多次后,模型的損失逐漸收斂,不再減小,這時可以認為模型已經(jīng)訓(xùn)練完畢,此時的參數(shù)為模型訓(xùn)練的最終結(jié)果。

上述的步驟中,對所有的訓(xùn)練樣本是一個一個地進行計算損失,并進行累加作為模型的代價,最終使用梯度下降法進行更新。對訓(xùn)練樣本分別進行計算是一個典型的串行思維方式。該思路的偽代碼實現(xiàn)如下:

串行的梯度下降算法

假設(shè)計算每個樣本的預(yù)測和計算梯度的時間復(fù)雜度為(),則訓(xùn)練一輪需要的時間復(fù)雜度為(×),其中是訓(xùn)練樣本的數(shù)量。通常情況下()的規(guī)模是十分巨大的,又由于訓(xùn)練樣本數(shù)量通常也有很大的規(guī)模(>10),采用這種串行的計算方式會導(dǎo)致訓(xùn)練大型深度學習模型的時間開銷過于龐大。

1.3 并行思想

通過上述的訓(xùn)練過程可以知道,模型的代價計算是一個求和的過程,是對所有樣本的損失值進行累加,進而進行更新迭代。在該求和的過程中,每一項(樣本的損失值)的計算并不會相互影響,因此每個樣本計算損失的過程可以被多個進程或多個計算節(jié)點并行化。因此模型的訓(xùn)練過程與最簡單的數(shù)列求和背后的邏輯是一致的。由于進程之間沒有相互依賴,該問題可以很好地被并行化。

根據(jù)這一思想,本實驗提出的并行訓(xùn)練方法與簡單的數(shù)列求和思想非常相近??紤]一個數(shù)列求和的并行化問題:1+2+…+100,假設(shè)由四個節(jié)點來計算,一種巧妙的方法是令:

可以看到四個節(jié)點分別計算各自的和,并且能夠覆蓋1…100的所有值?;氐侥P偷挠?xùn)練問題,模型訓(xùn)練中的關(guān)鍵是進行模型的代價,而代價是所有樣本的損失值的累加和。因此:

用與數(shù)列求和相似的思路可以很好地解決該問題的求解。本實驗的機器學習及深度學習模型梯度下降的并行訓(xùn)練算法的偽代碼如下所示:

并行的梯度下降算法

2 代碼實現(xiàn)

本節(jié)闡述了上述方法的具體代碼實現(xiàn)過程。首先是MPI的初始化部分:

初始化后進行數(shù)據(jù)的讀入部分。在這里已經(jīng)將數(shù)據(jù)集分別存入X.in和y.in文件中,讀入數(shù)據(jù)的代碼如下所示:

指定一些其余的參數(shù),如訓(xùn)練樣本數(shù)量等,如下所示:

接下來是訓(xùn)練環(huán)節(jié)。判斷當前節(jié)點是否為主節(jié)點,如果不是主節(jié)點則計算后傳給主節(jié)點,如下所示:

上面的代碼中,變量predict為預(yù)測結(jié)果,loss為損失值,node_derivative為梯度信息。計算完畢后使用MPI_Send()將梯度信息和損失分別用不同的標識符發(fā)送給主節(jié)點。主節(jié)點部分的代碼如下所示:

主節(jié)點在計算完自己的部分后,接收來自其他節(jié)點的梯度信息和損失信息,并進行累加。累加后求得總損失和總梯度,然后使用weight=weight-alpha*derivative進行梯度更新。上述過程循環(huán)epoch次,循環(huán)結(jié)束后訓(xùn)練終止。在最后主節(jié)點對訓(xùn)練的結(jié)果進行輸出:

需要注意的是,在第一輪循環(huán)結(jié)束后,主節(jié)點要把更新后的weight傳給其他節(jié)點,其他節(jié)點接收更新后的weight后再進行下一輪的計算。主節(jié)點發(fā)送weight的代碼如下:

其他節(jié)點接收weight的代碼如下:

其他節(jié)點在第一輪的訓(xùn)練中,使用0作為參數(shù)進行計算,后續(xù)的迭代過程中,使用主節(jié)點發(fā)送的weight來進行計算。以上便是并行訓(xùn)練的核心代碼部分。

3 實驗結(jié)果

在本節(jié)中,為了分析并行方法在線性回歸模型中所帶來的性能提高程度,分別設(shè)置了節(jié)點數(shù)為1,2,4,8,16,32。為了得到可靠的結(jié)果,每個節(jié)點數(shù)量都分別運行了五次。對方法的性能評估主要是用以下三個指標:運行時間、計算所得的參數(shù)值、訓(xùn)練300輪后的損失值。將五次的運行結(jié)果取平均值和方差,作為最終結(jié)果。實驗結(jié)果如表1所示。

表1 不同節(jié)點數(shù)量的各個指標統(tǒng)計結(jié)果

將模型的參數(shù)進行可視化,得到如圖3所示的結(jié)果。從圖中可以看出,預(yù)測結(jié)果很好地擬合了數(shù)據(jù)集(點線表示的預(yù)測結(jié)果與數(shù)據(jù)集完全重合)。

圖3 訓(xùn)練的參數(shù)可視化結(jié)果

4 分析與討論

根據(jù)表1的結(jié)果可以了解到,不同的節(jié)點數(shù)量訓(xùn)練后最終的參數(shù)和最終的損失都保持基本一致。訓(xùn)練的最終效果是一致的,都能擬合到最優(yōu)的情況。但是訓(xùn)練的時間卻出現(xiàn)了與理想情況相悖的現(xiàn)象:隨著節(jié)點數(shù)量的增加,模型所需要的訓(xùn)練時間越來越多。然而理想情況應(yīng)該是隨著節(jié)點數(shù)量的增加,訓(xùn)練時間越來越少。

這一現(xiàn)象的產(chǎn)生可以從并行方法的時間復(fù)雜度進行考慮。在第二節(jié)中提到過,并行訓(xùn)練的時間復(fù)雜度形式為

5 結(jié)語

在本實驗中針對機器學習和深度學習模型的訓(xùn)練過程提出了一種并行化的策略,用于解決大規(guī)模的數(shù)據(jù)和大量的計算所帶來的時間消耗問題。本實驗以最基礎(chǔ)的線性回歸作為示例,展示了并行訓(xùn)練的一種思路。對實驗結(jié)果進行分析,說明基于MPI技術(shù)的并行化方法有它的適用場景,也存在不適用的情況。本實驗提出的并行化方法適用于大規(guī)模的數(shù)據(jù)集和大規(guī)模的網(wǎng)絡(luò)框架,隨著節(jié)點數(shù)量的增加,訓(xùn)練耗時將大大減少;而對于小規(guī)模數(shù)據(jù)和小規(guī)模模型的情景,隨著節(jié)點數(shù)量的增加,訓(xùn)練時間將逐漸增加,因此該并行化方法不適用于此場景。

猜你喜歡
梯度樣本損失
洪澇造成孟加拉損失25.4萬噸大米
兩敗俱傷
一個具梯度項的p-Laplace 方程弱解的存在性
內(nèi)容、形式與表達——有梯度的語言教學策略研究
航磁梯度數(shù)據(jù)實測與計算對比研究
直擊高考中的用樣本估計總體
隨機微分方程的樣本Lyapunov二次型估計
組合常見模型梯度設(shè)置問題
損失
基于支持向量機的測厚儀CS值電壓漂移故障判定及處理
石家庄市| 扶沟县| 隆尧县| 玛纳斯县| 黄大仙区| 兖州市| 都兰县| 高青县| 临沭县| 尉犁县| 平原县| 郯城县| 安岳县| 平罗县| 兴海县| 涡阳县| 连江县| 安庆市| 海门市| 宜川县| 惠来县| 宁都县| 北京市| 新邵县| 本溪市| 台南县| 安宁市| 文登市| 普安县| 霍林郭勒市| 凌源市| 沾益县| 扬州市| 高要市| 武山县| 苏州市| 桐柏县| 从化市| 正阳县| 和林格尔县| 邳州市|