0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Google提出間接卷積算法,未來(lái)可會(huì)有突破?

WpOh_rgznai100 ? 來(lái)源:YXQ ? 2019-07-15 16:24 ? 次閱讀

本文介紹的內(nèi)容主要聚焦Google 的一項(xiàng)最新工作:改變基于 GEMM 實(shí)現(xiàn)的 CNN底層算法提出的新方法。通用矩陣乘法(General Matrix Multiply, GEMM)是廣泛用于線性代數(shù)、機(jī)器學(xué)習(xí)、統(tǒng)計(jì)學(xué)等各個(gè)領(lǐng)域的常見(jiàn)底層算法,其實(shí)現(xiàn)了基本的矩陣與矩陣相乘的功能,因此算法效率直接決定了所有上層模型性能,目前主流的卷積算法都是基于GEMM來(lái)實(shí)現(xiàn)的。來(lái)自谷歌的Peter Vajda在ECV2019中提出了一種全新的間接卷積算法,用于改進(jìn)GEMM在實(shí)現(xiàn)卷積操作時(shí)存在的一些缺點(diǎn),進(jìn)而提升計(jì)算效率。

通用矩陣乘法

GEMM是基礎(chǔ)線性代數(shù)子程序庫(kù)(Basic Linear Algebra Subprograms, BLAS)中的一個(gè)函數(shù)。BLAS提供了實(shí)現(xiàn)矩陣和向量基本運(yùn)算的函數(shù),最早于1979年由C.L.LAWSON提出。BLAS的發(fā)展大致可以分為三個(gè)階段(levels)的歷程,這和函數(shù)定義,出版順序,以及算法中多項(xiàng)式的階數(shù)以及復(fù)雜性有關(guān),第一階段只包含與向量(vector)有關(guān)的運(yùn)算,第二階段添加了向量與矩陣進(jìn)行運(yùn)算的操作,第三階段添加了矩陣與矩陣之間的運(yùn)算,前兩個(gè)階段的BLAS都是用于向量處理器的,而第三階段適用于矩陣處理器,所以BLAS的發(fā)展和硬件的發(fā)展密不可分。GEMM屬于第三階段的算法,正式公布于1990年,其迭代更新形式為:

其中A和B可以進(jìn)行轉(zhuǎn)置或hermitian共軛轉(zhuǎn)置,而A、B和C都可以被忽略(be strided),因此實(shí)際上這個(gè)公式就表示了任意矩陣之間所有可能的加法和乘法組合,例如最基本的A*B,可以將α置1,C置為全0矩陣即可,這也是其通用性的表現(xiàn)。

由于矩陣乘法相對(duì)于向量-向量乘法以及向量-矩陣乘法,有更低的時(shí)間復(fù)雜度,效率更高,因此其廣泛用于許多科學(xué)任務(wù)中,與之相關(guān)的GEMM算法成為了目前BLAS設(shè)計(jì)者的主要優(yōu)化對(duì)象。例如可以將A和B分解為分塊矩陣,使得GEMM可以遞歸實(shí)現(xiàn)。有關(guān)GEMM的詳細(xì)信息可以參見(jiàn)[1][2][3]。如何對(duì)GEMM進(jìn)行優(yōu)化,是BLAS相關(guān)工作的研究熱點(diǎn)。

基于 GEMM 的卷積算法及其缺點(diǎn)

卷積神經(jīng)網(wǎng)絡(luò)(CNN)在CV問(wèn)題中的表現(xiàn)很出色,有多種在算法層面對(duì)齊進(jìn)行實(shí)現(xiàn)的方法:直接卷積算法,采用7層循環(huán),快速卷積算法,利用傅里葉變換來(lái)進(jìn)行卷積,以及基于GEMM的卷積算法。

通過(guò)將卷積操作用矩陣乘法來(lái)代替,進(jìn)而使用GEMM算法來(lái)間接進(jìn)行卷積操作,這使得卷積操作可以在任何包含GEMM的平臺(tái)上進(jìn)行,并且受益于矩陣乘法的高效性,任何針對(duì)GEMM的改進(jìn)和研究都能有助于卷積運(yùn)算效率的提升,從而提高模型的運(yùn)算速度,因此目前大部分主流的神經(jīng)網(wǎng)絡(luò)框架,例如Tensorflow、Pytorch和Caffe都使用基于GEMM的方法來(lái)在底層代碼中實(shí)現(xiàn)卷積。

具體的,基于GEMM的卷積方法需要借助于 im2col或im2row buffer來(lái)內(nèi)存轉(zhuǎn)換,使得數(shù)據(jù)格式滿足GEMM算法的輸入要求,從而將卷積操作轉(zhuǎn)化為GEMM操作,然而這個(gè)轉(zhuǎn)換過(guò)程是一個(gè)計(jì)算開(kāi)銷和內(nèi)存開(kāi)銷都比較大的過(guò)程,特別是在輸入channel數(shù)較小時(shí),這個(gè)過(guò)程會(huì)在整個(gè)卷積過(guò)程中占有很大的比例。簡(jiǎn)言之,就是在卷積過(guò)程中,每個(gè)pixel都會(huì)被多次重復(fù)的轉(zhuǎn)換,這是不必要的計(jì)算開(kāi)銷。因此有許多工作都在對(duì)這一過(guò)程進(jìn)行改進(jìn),本文工作提出了一種改進(jìn)算法——間接卷積算法(Indirect Convolution algorithm),主要有以下兩個(gè)優(yōu)點(diǎn):

1、去掉了im2row的轉(zhuǎn)換過(guò)程,這使得算法性能有了巨大的提升(up to 62%)。

2、用了一個(gè)更小的indirection buffer來(lái)代替原來(lái)的im2row buffer。不同于im2row buffer的大小隨著輸入channel數(shù)線性增加,indirection buffer沒(méi)有這個(gè)特性,因此indirection buffer的內(nèi)存占用特性非常有利于輸入channel數(shù)較多時(shí)的卷積操作。

間接卷積算法

原始的GEMM通過(guò)如下計(jì)算來(lái)不斷迭代進(jìn)行矩陣運(yùn)算操作并輸出矩陣:

其中A是輸入張量,B是一個(gè)常量濾波器,C是輸出矩陣,在傳統(tǒng)的im2col+GEMM算法中,通常α=1而β=0,原始GEMM操作示意圖如下:

圖1 原始GEMM操作

其中 im2col buffer 代表矩陣A,filter tensor 代表矩陣B,A和B的乘積就是輸出copy表示將輸入的張量展開(kāi)為一個(gè)二維矩陣,也就是im2col buffer??梢钥吹絙uffer的每一行則是由固定個(gè)數(shù)(步長(zhǎng))的pixel展開(kāi)成一維的向量組成的,這些pixel都在原始tensor中的一個(gè)patch內(nèi),在經(jīng)過(guò)和filter tensor相乘后,由于矩陣行列相乘得到一個(gè)元素,因此這幾個(gè)pixel的信息都被整合成了一個(gè)值,也就是對(duì)他們進(jìn)行了卷積操作。最后在輸出矩陣C中,行數(shù)rows代表輸出的像素點(diǎn)個(gè)數(shù),columns代表輸出的channel數(shù)??梢钥吹絙uffer的columns是和輸入channel數(shù)有關(guān)的。

為了降低buffer帶來(lái)的開(kāi)銷,作者提出了一種間接矩陣乘法的思想,不把輸入的tensor直接展開(kāi)并存儲(chǔ)在buffer中,而只是在buffer中存放每個(gè)pixel在input tensor的坐標(biāo),也就是從存數(shù)據(jù)變成了存地址(類似于指針pointer思想),這樣不管channel數(shù)有多少,存的地址信息始終只有二維,極大的降低了buffer的計(jì)算和存儲(chǔ)開(kāi)銷,如下圖:

圖2 indirect convolution

當(dāng)然,由于buffer中存的是地址信息,因此不能直接和filter做矩陣乘法,所以就只能通過(guò)在buffer的行間進(jìn)行循環(huán),根據(jù)該行的pointer找到對(duì)應(yīng)的輸入數(shù)據(jù),再將輸入數(shù)據(jù)與kernel相乘,并與之前循環(huán)的結(jié)果拼接起來(lái),從而間接的實(shí)現(xiàn)矩陣乘法,因此叫做indirection buffer。

對(duì)于不同的卷積步長(zhǎng),只需要將不同步長(zhǎng)對(duì)應(yīng)的卷積patch位置確定即可。而對(duì)于padding策略,將指向填充位置的pointer對(duì)應(yīng)的輸入pixel的向量值全部設(shè)置為0。

間接卷積算法的缺點(diǎn)

間接卷積算法作為GEMM-BASED CNN算法的一種改進(jìn),能極大的提升計(jì)算效率,但是存在以下幾個(gè)限制:

1. 這個(gè)算法是為NHWC layout設(shè)計(jì)的,也就是說(shuō)應(yīng)用范圍比較窄,不能和目前的主流方法相比。

2. 算法適用于前向傳播中的卷積操作,而在反向傳播中作用不大,不及基于col2im和row2im的算法。

3. 具有和GEMM相同的缺點(diǎn),在深度小卷積核的卷積操作中效率并不好。

實(shí)驗(yàn)測(cè)試結(jié)果

Efficient Deep Learning for Computer Vision主要聚焦于如何將深度學(xué)習(xí)部署到移動(dòng)設(shè)備上,因此本文的工作主要在移動(dòng)設(shè)備和移動(dòng)芯片上進(jìn)行測(cè)試,結(jié)果如下:

可以看到一旦步長(zhǎng)增加,那么Indirect convolution帶來(lái)的性能提升就會(huì)明顯下降,這是因?yàn)椴介L(zhǎng)越大,在原始的GEMM算法中重復(fù)計(jì)算的量就會(huì)減小,因此原始GEMM的性能本身就會(huì)提升,而indirect convolution并不受益于步長(zhǎng)增加。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Google
    +關(guān)注

    關(guān)注

    5

    文章

    1752

    瀏覽量

    57335
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4581

    瀏覽量

    92379

原文標(biāo)題:基于GEMM實(shí)現(xiàn)的CNN底層算法被改?Google提出全新間接卷積算法

文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    高斯濾波的卷積核怎么確定

    高斯濾波的卷積核確定主要依賴于高斯函數(shù)的特性以及圖像處理的具體需求。以下是確定高斯濾波卷積核的幾個(gè)關(guān)鍵步驟: 一、確定卷積核的大小 卷積核形狀 :高斯濾波的
    的頭像 發(fā)表于 09-29 09:29 ?183次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的基本概念、原理及特點(diǎn)

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,簡(jiǎn)稱CNN)是一種深度學(xué)習(xí)算法,它在圖像識(shí)別、視頻分析、自然語(yǔ)言處理等領(lǐng)域有著廣泛的應(yīng)用。本文將詳細(xì)介紹卷積神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-11 14:38 ?576次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)在視頻處理中的應(yīng)用

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)作為深度學(xué)習(xí)的代表算法之一,在計(jì)算機(jī)視覺(jué)領(lǐng)域取得了顯著成就,特別是在視頻處理方面。本文將深入探討卷積神經(jīng)網(wǎng)絡(luò)在視頻處理中的核心應(yīng)用、技術(shù)原理、優(yōu)化
    的頭像 發(fā)表于 07-09 15:53 ?446次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)在人臉識(shí)別中的應(yīng)用

    (Convolutional Neural Networks, CNN)的廣泛應(yīng)用,人臉識(shí)別技術(shù)不僅在準(zhǔn)確性上有了大幅提升,還在應(yīng)用范圍和場(chǎng)景上得到了極大的拓展。本文將從卷積神經(jīng)網(wǎng)絡(luò)的基本原理出發(fā),詳細(xì)探討其在人臉識(shí)別中的應(yīng)用,包括技術(shù)背景、核心算法、實(shí)現(xiàn)步驟、應(yīng)用場(chǎng)景以
    的頭像 發(fā)表于 07-08 10:48 ?464次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的卷積操作

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)中的卷積操作是其核心組成部分,對(duì)于圖像識(shí)別、語(yǔ)音識(shí)別、自然語(yǔ)言處理等領(lǐng)域具有重要意義。本文將從卷積操作的基本概念、原理、過(guò)程、特點(diǎn)及其在CNN中的
    的頭像 發(fā)表于 07-04 16:10 ?854次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)示例

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,簡(jiǎn)稱CNN)是一種深度學(xué)習(xí)模型,主要用于處理具有網(wǎng)格結(jié)構(gòu)的數(shù)據(jù),如圖像。CNN通過(guò)卷積層自動(dòng)提取圖像特征,然后通過(guò)全連接層進(jìn)行
    的頭像 發(fā)表于 07-03 10:51 ?315次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)原理

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,簡(jiǎn)稱CNN)是一種深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像識(shí)別、視頻分析、自然語(yǔ)言處理等領(lǐng)域。本文將詳細(xì)介紹卷積神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)原理、結(jié)構(gòu)
    的頭像 發(fā)表于 07-03 10:49 ?457次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的組成部分有哪些

    卷積層、池化層、激活函數(shù)、全連接層、損失函數(shù)、優(yōu)化算法等,并探討它們?cè)贑NN中的作用和應(yīng)用。 卷積層(Convolutional Layer) 卷積層是CNN中的核心組成部分,它通過(guò)
    的頭像 發(fā)表于 07-03 09:31 ?496次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的原理與實(shí)現(xiàn)

    1.卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,簡(jiǎn)稱CNN)是一種深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像識(shí)別、視頻分析、自然語(yǔ)言處理等領(lǐng)域。 卷積神經(jīng)網(wǎng)絡(luò)是一種前饋神經(jīng)網(wǎng)絡(luò),其
    的頭像 發(fā)表于 07-02 16:47 ?397次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的基本原理、結(jié)構(gòu)及訓(xùn)練過(guò)程

    卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,簡(jiǎn)稱CNN)是一種深度學(xué)習(xí)算法,廣泛應(yīng)用于圖像識(shí)別、視頻分析、自然語(yǔ)言處理等領(lǐng)域。本文將詳細(xì)介紹卷積神經(jīng)網(wǎng)絡(luò)的基本原理、結(jié)構(gòu)
    的頭像 發(fā)表于 07-02 14:21 ?1560次閱讀

    使用google-translate和wwe合并后無(wú)法使用google-tts怎么解決?

    我打算使用lyrat-mini做一個(gè)使用喚醒詞喚醒然后后續(xù)通過(guò)google-sr和google-tts進(jìn)行交流的聊天機(jī)器人,但是當(dāng)我合并了adf的例子中的wwe和google-translate之后
    發(fā)表于 06-28 06:05

    verilog實(shí)現(xiàn)卷積運(yùn)算

    在Verilog中實(shí)現(xiàn)卷積運(yùn)算,你可以使用以下示例代碼。這里假設(shè)輸入數(shù)據(jù)是有符號(hào)8位數(shù),輸出數(shù)據(jù)也是有符號(hào)8位數(shù)。卷積在數(shù)字信號(hào)處理中通常指的是兩個(gè)序列的逐元素乘積的和,也就是點(diǎn)乘。 module
    發(fā)表于 03-26 07:51

    AURIX TC397是否可以搭配Google TensorFlow的演算法去運(yùn)算?

    請(qǐng)問(wèn)各位大神,AURIX TC397 是否可以搭配 Google TensorFlow 的演算法 去運(yùn)算??
    發(fā)表于 02-18 06:05

    三角脈沖信號(hào)的卷積

    簡(jiǎn) 介: 根據(jù)信號(hào)與系統(tǒng)答疑過(guò)程中,學(xué)生對(duì)于三角形信號(hào)卷積結(jié)果的疑惑,給出了相應(yīng)的數(shù)值、理論、以及頻譜分析的解答。特別是后面頻譜分析部分也是由另外參加答疑的同學(xué)提出的。之所以這個(gè)題目會(huì)產(chǎn)生
    的頭像 發(fā)表于 12-18 16:19 ?1890次閱讀
    三角脈沖信號(hào)的<b class='flag-5'>卷積</b>

    卷積神經(jīng)網(wǎng)絡(luò)通俗理解

    學(xué)習(xí)(deeplearning)的代表算法之一 ,卷積神經(jīng)網(wǎng)絡(luò)具有表征學(xué)習(xí)(representation learning)能力,能夠按其階層結(jié)構(gòu)對(duì)輸入信息進(jìn)行平移不變分類
    的頭像 發(fā)表于 11-26 16:26 ?971次閱讀