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

?

淺析基于FPGA的Mish函數(shù)實現(xiàn)

2021-02-03 08:40肖祥位蔡敬菊徐智勇
科學(xué)與信息化 2021年3期
關(guān)鍵詞:折線分段區(qū)間

肖祥位 蔡敬菊 徐智勇

1. 中國科學(xué)院光電技術(shù)研究所國家光束控制重點實驗室 四川 成都 610209;2. 中國科學(xué)院光電技術(shù)研究所 四川 成都 610209;3. 中國科學(xué)院大學(xué) 北京 100049

引言

隨著計算機(jī)處理能力的提高,神經(jīng)網(wǎng)絡(luò)再次成為人工智能領(lǐng)域的研究熱點。目前主流的方式仍然是基于CPU/GPU對算法進(jìn)行實現(xiàn),但由于神經(jīng)網(wǎng)絡(luò)算法具有龐大的計算量,使得在傳統(tǒng)平臺上實現(xiàn)存在實時性不強(qiáng)、功耗過高、體積較大等缺陷,極大地限制了神經(jīng)網(wǎng)絡(luò)算法的落地應(yīng)用。因此目前該方向的理論研究和實際應(yīng)用方面存在著較大的脫節(jié)?,F(xiàn)場可編程門陣列(FPGA)可以通過硬件描述語言對電路進(jìn)行描述,可以構(gòu)建大型電路實現(xiàn)并行計算。使用FPGA實現(xiàn)AI算法,極大地加快了計算速度,提高實時性,降低系統(tǒng)功耗。為AI算法落地提供強(qiáng)有力的支撐。

Mish函數(shù)是YOLOv4及其衍生版本里面用得較多的一個激活函數(shù),是整個網(wǎng)絡(luò)中實現(xiàn)非線性運(yùn)算的關(guān)鍵。Mish函數(shù)的使用使得整個網(wǎng)絡(luò)檢測效果得到了很大程度的提升,它的非單調(diào)平滑性相比于其他激活函數(shù)有著更好的表現(xiàn)。想使用FPGA對YOLOv4及其衍生網(wǎng)絡(luò)加速則不可避免地要在FPGA上實現(xiàn)Mish函數(shù)。本文首先對Mish函數(shù)進(jìn)行介紹,提出幾種不同的實現(xiàn)方案,通過對不同方案的對比分析,最終確定以多折線擬合與查找表組合的方式進(jìn)行實現(xiàn)。并通過對硬件的實現(xiàn)分析,確定其誤差在較小的范圍,為使用FPGA加速YOLOv4及其衍生網(wǎng)絡(luò)奠定基礎(chǔ)[1]。

1 Mish函數(shù)簡介

卷積神經(jīng)網(wǎng)絡(luò)中激活函數(shù)是對線性卷積輸出的結(jié)果進(jìn)行非線性計算 以此來模擬神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元模型。Mish函數(shù)則是對卷積層的輸出進(jìn)行非線性激活,以此實現(xiàn)非線性計算。Mish函數(shù)的表達(dá)式如下:

Mish函數(shù)是一個非單調(diào)函數(shù),其函數(shù)圖像如圖1所示??梢钥闯鯩ish函數(shù)在輸入值小于-10的時候函數(shù)值非常接近于0,我們在誤差可以接受的范圍內(nèi)認(rèn)為該函數(shù)值等于0。在輸入值大于4.7的時候我們可以近似的認(rèn)為該輸出的值和輸入的值是相同的。我們可以看出輸入值從-10到4.7的過程中,輸出是先減小然后逐漸增大的過程。如果是在FPGA上直接實現(xiàn)Mish函數(shù),則會涉及指數(shù)運(yùn)算、反正切運(yùn)算以及對數(shù)運(yùn)算。我們都知道這些計算在硬件上實現(xiàn)是非常困難的而且還會消耗大量的計算資源。這在硬件上實現(xiàn)整個YOLOv4算法時完整的實現(xiàn)Mish函數(shù)是不可能的。因此我們需要考慮一種簡單、高效的方式來近似Mish的非線性功能。本文通過分析最終采用多折線擬合的形式在硬件上實現(xiàn)Mish函數(shù)[2]。

圖1 Mish函數(shù)圖像

2 方案選擇

FPGA實現(xiàn)復(fù)雜函數(shù)常用的方法有:泰勒展開法、查表法、多項式擬合法、分段擬合法、CORDIC算法等。泰勒展開法對于復(fù)雜函數(shù)時,要保證精度的前提下往往需要展開成多階函數(shù)才可以進(jìn)行擬合,但是在FPGA中展開階數(shù)越高實現(xiàn)起來所需要花費(fèi)的乘法器資源也就越多,在神經(jīng)網(wǎng)絡(luò)中Mish函數(shù)的使用往往是并行執(zhí)行多個相同的乘法,所以在片上DSP資源有限的情況下,我們希望盡可能少的使用DSP,因此使用泰勒展開在實現(xiàn)Mish函數(shù)來說耗費(fèi)乘法器資源過多?;诓楸矸ǖ腇PGA實現(xiàn)是實現(xiàn)復(fù)雜算法最方便最快捷的方式,同時查表法還可以達(dá)到較高的工作頻率,但是在實現(xiàn)精度要求較高的場合需要較大位寬才能表示,所以需要耗費(fèi)較大的邏輯資源?;诙囗検綌M合的方式實現(xiàn)復(fù)雜算法,是將算法分成若干段,然后用多項式分別進(jìn)行擬合,擬合的效果較好可以達(dá)到較高的精度,但是仍然存在使用乘法器資源較多的不足?;贑ORDIC算法的實現(xiàn)所消耗的資源較少但是耗時較多而且精度不高。基于分段擬合的方式,采用最小二乘法進(jìn)行擬合,可以將函數(shù)分成較多的小區(qū)間,在每個區(qū)間分別進(jìn)行擬合,這樣可以保證精度的同時保證使用乘法器資源較少[5]。

本文則是使用分段擬合的方式將函數(shù)區(qū)間分成若干子區(qū)間進(jìn)行分段擬合,由于保證擬合精度因此分段區(qū)間較多,在硬件實現(xiàn)上我們將查找表考慮進(jìn)來,使用查找表的方式將每個擬合函數(shù)的系數(shù)存放在查找表中,實現(xiàn)較高頻率的讀取,然后在使用一個乘加器將數(shù)據(jù)進(jìn)行計算輸出,保證了較高精度的同時提高了頻率,提升了整體的性能。

3 Mish函數(shù)設(shè)計

3.1 Matlab擬合

使用matlab對Mish函數(shù)進(jìn)行分段擬合,每段采用最小二乘法進(jìn)行擬合,使得擬合誤差控制在0.001以下。在誤差允許范圍內(nèi)當(dāng)輸入大于4.7時輸出和輸入相等,當(dāng)輸入在小于-10時我們可以接受輸出等于零,因此只需擬合[-10,4.7]之間的函數(shù)值。本文將整個區(qū)間分為43個小區(qū)間,采用最小二乘法進(jìn)行分段線性擬合[6]。各區(qū)間的擬合如下表所示:

表1 Matlab分段擬合Mish函數(shù)

圖2表示的是輸入?yún)^(qū)間在[-10,10]內(nèi),取點間隔為0.01。采用分段擬合的方式將真實值與擬合值做差取得擬合誤差,可以看出本文設(shè)計的分段擬合方案與真實的Mish函數(shù)非常接近,誤差控制在0.001以下,不會對結(jié)果產(chǎn)生誤差[7]。

圖2 Mish函數(shù)Matlab擬合誤差曲線

在區(qū)間[-10,10]內(nèi)隨機(jī)取點15個,得到擬合誤差最大在0.0006,低于0.001。符合我們上面的分析。具體擬合誤差如下表2:

表2 Mish函數(shù)隨機(jī)取點擬合結(jié)果

3.2 FPGA實現(xiàn)

本文采用AC620平臺進(jìn)行設(shè)計實現(xiàn),一般而言在軟件層面實現(xiàn)Mish函數(shù)往往采用32位浮點的形式,但是在FPGA中如果采用浮點計算則會消耗大量的浮點乘法器以及大量的邏輯資源,考慮資源使用率以及運(yùn)算速度等因素我們將在FPGA上定點小數(shù)對Mish函數(shù)進(jìn)行實現(xiàn),有效的兼顧了資源使用、運(yùn)行速度。同時我們仿真分析采用16位定點小數(shù)的形式實現(xiàn)Mish函數(shù)不會對網(wǎng)絡(luò)最終分類結(jié)果產(chǎn)生誤差。因此我們在FPGA上采用16位定點小數(shù)對Mish函數(shù)進(jìn)行實現(xiàn)[8]。

本文采用有符號數(shù)的數(shù)據(jù)進(jìn)行計算,因此輸入輸出數(shù)據(jù)第一位為符號位。輸入數(shù)據(jù)進(jìn)行量化的過程中將輸入數(shù)據(jù)同時擴(kuò)大2048倍,將所有的輸入值進(jìn)行量化取整以便作為FPGA的輸入。同時也將擬合的所有折線進(jìn)行擴(kuò)大2048倍并將所有系數(shù)通過四舍五入的形式取整。將這些系數(shù)通過建表的方式預(yù)先存儲在FPGA內(nèi)部,當(dāng)不同輸入進(jìn)來的時候,對應(yīng)輸出相應(yīng)的系數(shù)參與計算。這樣極大地保證了系統(tǒng)運(yùn)行的速度與穩(wěn)定性。量化以及誤差修正處理后Mish函數(shù)在FPGA平臺的擬合函數(shù)表達(dá)式如下表3:

表3 FPGA擬合Mish函數(shù)

運(yùn)算過程中使用的是有符號數(shù),因此在輸入值進(jìn)行量化時,將負(fù)數(shù)的輸入值以補(bǔ)碼的形式進(jìn)行表示。而在擬合折線的函數(shù)表達(dá)式中,對輸入值擴(kuò)大了2048倍,因此需要對其進(jìn)行右移11位還原為原輸入大小才不會對輸出結(jié)果產(chǎn)生影響[3]。

圖3 FPGA擬合Mish函數(shù)誤差曲線

如圖3所示,表示了在FPGA上實現(xiàn)Mish函數(shù)的誤差,這跟圖2相比有一定的差距,差距主要來源于量化過程中的四舍五入以及對輸入數(shù)據(jù)的截位處理所產(chǎn)生的誤差。但根據(jù)圖3所示的誤差中可以看出,用FPGA擬合后的Mish函數(shù)絕對誤差仍然低于0.002。這對我們進(jìn)行神經(jīng)網(wǎng)絡(luò)的分類精度不會帶來太大的差別。這與表3隨機(jī)抽取的15個數(shù)據(jù)表示結(jié)果一致,從表3我們可以看出只有少數(shù)點誤差在0.0013左右,但是總體都低于0.002。綜合分析對Mish函數(shù)采用上述擬合方案,總體誤差較小均控制在0.002以下,對神經(jīng)網(wǎng)絡(luò)輸出結(jié)果無影響[4]。

表4 Mish函數(shù)隨機(jī)取點FPGA擬合結(jié)果

具體實現(xiàn)流程框圖如下圖3:

圖4 Mish函數(shù)流程框圖

由上圖可以看出我們在卷積層輸出特征后需要經(jīng)過Mish激活函數(shù),而激活函數(shù)具體實現(xiàn)是將擬合的多段折線系數(shù)存在查找表中,依據(jù)輸入數(shù)據(jù)的大小,自動匹配對應(yīng)的系數(shù)進(jìn)行輸出,輸出查找表數(shù)據(jù)送入乘加器中實現(xiàn)激活函數(shù)擬合,最終輸出結(jié)果。modulsim仿真結(jié)果如圖4所示,我們可以看出完成一次擬合只需要三個時鐘周期,第一個時鐘通過查表取出對應(yīng)的系數(shù),第二個時鐘周期用于系數(shù)與輸入之間的乘法,第三個時鐘則進(jìn)行常數(shù)相加。因此在這種設(shè)計模式下只需要三個時鐘周期即可完成一次輸入輸出。整體資源使用情況如圖5所示,我們可以看到整體使用邏輯資源較少,而且每次激活運(yùn)算只使用一個DSP資源。這對于神經(jīng)網(wǎng)絡(luò)加速來說是非常有利的。采用本文的設(shè)計方案在消耗較少資源的情況下可以實現(xiàn)較高的并行度,能更好地提升整體運(yùn)算速度[9]。

圖4 modulsim仿真結(jié)果

圖5 FPGA實現(xiàn)Mish函數(shù)整體資源利用

4 結(jié)束語

YOLOv4及其衍生版本中,Mish作為激活函數(shù)是至關(guān)重要的一步,它的優(yōu)異性能是其他激活函數(shù)無法替代的。欲使用FPGA加速YOLOv4及其衍生版本,則不可避免地要在FPGA上實現(xiàn)Mish函數(shù)。本文簡單介紹了神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)Mish,采用分段擬合的方式對該函數(shù)進(jìn)行擬合并在FPGA平臺上對其進(jìn)行實現(xiàn)。對實現(xiàn)結(jié)果與實際結(jié)果進(jìn)行誤差分析,絕對誤差控制在0.002以內(nèi),對神經(jīng)網(wǎng)絡(luò)輸出結(jié)果不會產(chǎn)生影響。提出一種多折線擬合的方式實現(xiàn)Mish函數(shù),所使用邏輯資源較少,運(yùn)算速度快,適合在高并行度的神經(jīng)網(wǎng)絡(luò)中使用。對使用FPGA加速YOLOv4以及其他使用Mish函數(shù)作為激活函數(shù)的網(wǎng)絡(luò)有一定的參考價值。

猜你喜歡
折線分段區(qū)間
解信賴域子問題的多折線算法
區(qū)間值序列與區(qū)間值函數(shù)列的收斂性
全球經(jīng)濟(jì)將繼續(xù)處于低速增長區(qū)間
分段計算時間
折線
折線圖案
尋求分段函數(shù)問題的類型及解法
3米2分段大力士“大”在哪兒?
區(qū)間對象族的可鎮(zhèn)定性分析
《折線統(tǒng)計圖》教學(xué)設(shè)計