丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能 正文
發(fā)私信給AI研習(xí)社-譯站
發(fā)送

0

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

本文作者: AI研習(xí)社-譯站 2018-03-08 11:39
導(dǎo)語:我用Pytorch在卷積層上實(shí)現(xiàn)了張量分解的方法

本文為雷鋒字幕組編譯的技術(shù)博客,原標(biāo)題Accelerating deep neural networks with tensor decompositions,作者為Jacob。

翻譯 |  林立宏    整理 |  凡江

背景

在這篇文章中,我將介紹幾種低秩張量分解方法,用于在現(xiàn)有的深度學(xué)習(xí)模型中進(jìn)行分層并使其更緊湊。我也將分享PyTorch代碼,它使用Tensorly來進(jìn)行在卷積層上的CP分解和Tucker分解。

盡管希望大部分帖子都是可以獨(dú)立閱讀的,關(guān)于張量分解的回顧可以在這里找到。Tensorly的作者也寫了于Tensor的基礎(chǔ)內(nèi)容非常棒的notebook。這幫助我很好的開始學(xué)習(xí)這塊內(nèi)容,建議你閱讀一下這些內(nèi)容。

加上裁剪(pruning),張量分解是加快現(xiàn)有深度神經(jīng)網(wǎng)絡(luò)的實(shí)用工具,我希望這篇文章能讓這些內(nèi)容更加容易理解。

這些方法需要將一個(gè)層分解成幾個(gè)更小的層。盡管在分解后會(huì)有更多的層,但是浮點(diǎn)運(yùn)算次數(shù)和權(quán)重的總數(shù)會(huì)變小。一些報(bào)告的結(jié)果是整個(gè)網(wǎng)絡(luò)的x8倍的速度提升(不針對(duì)像imagenet這樣的大型任務(wù)),或者imagenet中的特定層中x4倍的提升。我的結(jié)論是用這些分解方式,我能夠獲得x2到x4倍的加速,這取決于我愿意犧牲多少的精度。

這篇文章中我介紹了一些稱為裁剪(pruning)的技術(shù)以減少模型中的參數(shù)數(shù)量。在一個(gè)數(shù)據(jù)集上正向傳遞(有時(shí)是反向傳遞)裁剪(pruning),然后根據(jù)網(wǎng)絡(luò)中激活的一些標(biāo)準(zhǔn)對(duì)神經(jīng)元進(jìn)行排序。

完全不同的是,張量分解的辦法只用到層的權(quán)重,假設(shè)網(wǎng)絡(luò)層是參數(shù)化的,它的權(quán)重能夠用一個(gè)矩陣或者是一個(gè)低秩的張量來表示。這意味這個(gè)它們?cè)趨?shù)化的網(wǎng)絡(luò)下效果最佳。像VGG神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)為完全參數(shù)化的。另外一個(gè)關(guān)于參數(shù)化模型的例子是使用更少的類別對(duì)網(wǎng)絡(luò)進(jìn)行微調(diào)以實(shí)現(xiàn)更簡(jiǎn)單的任務(wù)。

和裁剪(pruning)相似,分解之后通過模型需要微調(diào)來恢復(fù)準(zhǔn)確性。

在我們會(huì)深入討論細(xì)節(jié)之前,最后一件要說明的事是,雖然這些方法是實(shí)用的,并給出了很好的結(jié)果,但它們有一些缺點(diǎn):

  • 它們能夠在一個(gè)線性權(quán)重上執(zhí)行(比如一個(gè)卷積或者一個(gè)全連接的層),忽略了任何非線性的內(nèi)容。

  • 它們是貪婪,自認(rèn)為聰明地分解層,忽略了不同層之間的相互作用。

目前還要試圖解決這些問題,而且它仍然是一個(gè)活躍的研究領(lǐng)域。


截?cái)郤VD用于分解完全連接的層

第一份我能找到的使用這個(gè)來加速深度神經(jīng)網(wǎng)絡(luò)的是在Fast-RNN論文中,Ross Girshick使用它來加速用于檢測(cè)的全連接層。代碼可以在這里找到:pyfaster-rcnn implementation。


SVD概況

奇異值分解使我們能夠分解任何具有n行和m列的矩陣A:

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

S是一個(gè)對(duì)角矩陣,其對(duì)角線上有非負(fù)值(奇異值),并且通常被構(gòu)造成奇異值按降序排列的。U和V是正交矩陣:如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

如果我們?nèi)∽畲蟮钠娈愔挡⑵溆嗟臍w零,我們得到A的近似值:如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)具有作為Frobenius范數(shù)最接近于A的秩t矩陣的性質(zhì),所以如果t足夠大,如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)是A的良好近似。


在全連接層上的SVD

一個(gè)全連接層通常是做了矩陣乘法,輸入一個(gè)矩陣A然后增加一個(gè)偏差b:

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

我們可以取A的SVD,只保留第一個(gè)奇異值。

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

這不是一個(gè)完全連接的層,而是指導(dǎo)我們?nèi)绾螌?shí)現(xiàn)它作為兩個(gè)較小的:

  • 第一個(gè)將有一個(gè)mxt的形狀,將沒有偏差,其權(quán)重將取自如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

  • 第二個(gè)將有一個(gè)txn的形狀,將有一個(gè)等于b的偏差,其權(quán)重將取自如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)。

權(quán)重總數(shù)從nxm下降到t(n + m)。


在卷積層上張量分解

二維卷積層是一個(gè)多維矩陣(后面用-張量),有四個(gè)維度:

cols x rows x input_channels x output_channels.

遵循SVD的例子,我們想要以某種方式將張量分解成幾個(gè)更小的張量。卷積層轉(zhuǎn)換為幾個(gè)較小近似的卷積層。

為此,我們將使用兩種流行的(至少在Tensor算法的世界中)張量分解:CP分解和Tucker分解(也稱為高階SVD或其他名稱)。


1412.6553 使用微調(diào)CP分解加速卷積神經(jīng)網(wǎng)絡(luò)

1412.6553 Speeding-up Convolutional Neural Networks Using Fine-tuned CP-Decomposition 這篇論文說明了如果CP分解能夠用于卷積層的加速,正如我們會(huì)看到的,這將卷積層納入類似移動(dòng)網(wǎng)絡(luò)的東西。

他們使用它來加速網(wǎng)絡(luò)的速度,而不會(huì)明顯降低精度。在我自己的實(shí)驗(yàn)中,我可以使用這個(gè)在基于VGG16的網(wǎng)絡(luò)上獲得x2加速,而不會(huì)降低準(zhǔn)確度。

我使用這種方法的經(jīng)驗(yàn)是,需要非常仔細(xì)地選擇學(xué)習(xí)率,微調(diào)以使其工作,學(xué)習(xí)率通常應(yīng)該非常?。ù蠹s如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼))。

一個(gè)秩R矩陣可以被視為R秩和1矩陣的和,每個(gè)秩1矩陣是一個(gè)列向量乘以一個(gè)行向量:如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

SVD為我們提供了使用SVD中的U和V列來寫矩陣和的方法:如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

如果我們選擇一個(gè)小于矩陣滿秩的R,那么這個(gè)和就是一個(gè)近似值,就像截?cái)郤VD的情況一樣。

CP分解讓我們推廣了張量。

使用CP分解,我們的卷積核,一個(gè)四維張量公式,可以近似為一個(gè)選定的R:如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

我們希望R對(duì)于有效的分解是小的,但是對(duì)保持近似高精度是足夠大的。


帶CP分解的卷積正向傳遞

為了傳遞圖層,我們使用輸入如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)進(jìn)行卷積:

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

這給了我們一個(gè)辦法來解決這個(gè)問題:

1.首先做一個(gè)wise(1x1xS)與如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)卷積。這減少了從S到R輸入通道的數(shù)量。下一步將在較少數(shù)量的通道上完成卷積,使其更快。

2.用如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)在空間維度上執(zhí)行分離的卷積。就像在移動(dòng)網(wǎng)絡(luò)中一樣,卷積是深度可分的,分別在每個(gè)通道中完成。與mobilenets不同,卷積在空間維度上也是可分的

3.做另一個(gè)逐點(diǎn)卷積來改變從R到T的通道數(shù)量如果原始卷積層有一個(gè)偏差,在這一點(diǎn)上加上它。

注意像在移動(dòng)網(wǎng)中的逐點(diǎn)和深度卷積的組合。在使用mobilenets的時(shí)候,你必須從頭開始訓(xùn)練一個(gè)網(wǎng)絡(luò)來獲得這個(gè)結(jié)構(gòu),在這里我們可以把現(xiàn)有的圖層分解成這種形式。

與移動(dòng)網(wǎng)絡(luò)一樣,為了獲得最快的速度,需要一個(gè)有效實(shí)現(xiàn)深度可分離卷積的平臺(tái)。


用PyTorch和Tensorly卷積層CP分解

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)


1511.06530 用于快速和低功率移動(dòng)應(yīng)用的深度卷積神經(jīng)網(wǎng)絡(luò)的壓縮

1511.06530 Compression of Deep Convolutional Neural Networks for Fast and Low Power Mobile Applications 這一篇非??岬恼撐模f明了如何使用Tucker分解來加速卷積層來得到更好的結(jié)果。我也在基于VGG的參數(shù)化網(wǎng)絡(luò)用了這種加速,比CP分解的精度要好。作者在論文中指出,它可以讓我們使用更高的學(xué)習(xí)率(我用如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼))進(jìn)行微調(diào)。

Tucker分解也稱為高階奇異值分解(HOSVD)或者其他名稱,是對(duì)張量進(jìn)行奇異值分解的一種推廣。

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

它認(rèn)為SVD的推廣的原因是如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)的分量通常是正交的,但這對(duì)于我們的目的并不重要。如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)被稱為核心矩陣,并定義不同的軸如何相互作用。

在上面描述的CP分解中,沿著空間維度如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)的分解導(dǎo)致空間上可分離的卷積。無論如何,過濾器是非常小的,通常是3x3或5x5,所以可分離的卷積并不節(jié)省我們大量的計(jì)算,而且是一個(gè)積極的近似。

Trucker分解有用的性質(zhì)是,它不必沿著所有的軸(模式)分解。我們可以沿著輸入和輸出通道進(jìn)行分解(模式2分解):

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)


卷積正向傳遞與塔克分解

像CP分解一樣,寫一下卷積公式并插入內(nèi)核分解:

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

這給了我們以下用Tucker分解進(jìn)行卷積的配方:

1.與如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)進(jìn)行點(diǎn)對(duì)點(diǎn)卷積,信道從S減少到如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)的數(shù)量。

2.用如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)進(jìn)行正則(不可分)卷積。這個(gè)卷積代替了原始層的S輸入通道和T輸出通道,具有如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)輸入通道和如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)輸出通道。如果這些等級(jí)小于S和T,這就是減少的原因。

3.用如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)進(jìn)行點(diǎn)對(duì)點(diǎn)卷積以回到原始卷積的T個(gè)輸出通道。由于這是最后一次卷積,所以在這一點(diǎn)上,如果有偏差就加上偏差。


我們?nèi)绾芜x擇分解行列

一種方法是嘗試不同的值并檢查準(zhǔn)確性。嘗試后的啟發(fā)是如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼),效果很好。

理想情況下,選擇行列應(yīng)該是自動(dòng)的。

作者提出使用變分貝葉斯矩陣分解(VBMF)(Nakajima等,2013)作為估計(jì)等級(jí)的方法。

VBMF很復(fù)雜,不在本文的討論范圍內(nèi),但是在一個(gè)非常高層次的總結(jié)中,他們所做的是將矩陣如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)近似為低秩矩陣如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)和高斯噪聲之和。在找到A和B之后,H是等級(jí)的上限。

為了將其用于Tucker分解,我們可以展開原始權(quán)重張量的s和t分量來創(chuàng)建矩陣。然后我們可以使用VBMF估計(jì)如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)作為矩陣的秩。

我用這個(gè)在Python上實(shí)現(xiàn)的VBMF,相信它可以工作。

VBMF通常返回的秩,非常接近我之前,仔細(xì)和乏味的手動(dòng)調(diào)整得到的結(jié)果。

這也可以用于估計(jì)完全連接層的截?cái)郤VD加速的等級(jí)。


用PyTorch和Tensorly卷積層Tucker分解

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

總結(jié)

在這篇文章中,我們討論了幾個(gè)張量分解的方法來加速深度神經(jīng)網(wǎng)絡(luò)。

  • 截?cái)嗟腟VD可用于加速完全連接的層。

  • CP分解將卷積層分解成類似移動(dòng)網(wǎng)絡(luò)的東西,盡管它更具侵略性,因?yàn)樗诳臻g維度上也是可分的。

  • Tucker分解減少了二維卷積層操作的輸入和輸出通道的數(shù)量,并且使用逐點(diǎn)卷積來切換2D卷積之前和之后的通道數(shù)量。

我覺得有趣的是網(wǎng)絡(luò)設(shè)計(jì)中的常見模式,逐點(diǎn)和深度卷積,自然而然出現(xiàn)在這些分解中!



博客原址 https://jacobgil.github.io/deeplearning/tensor-decompositions-deep-learning

更多文章,關(guān)注雷鋒網(wǎng),添加雷鋒字幕組微信號(hào)(leiphonefansub)為好友

備注「我要加入」,To be a  AI  Volunteer !

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

雷鋒網(wǎng)雷鋒網(wǎng)

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

如何用張量分解加速深層神經(jīng)網(wǎng)絡(luò)?(附代碼)

分享:

知情人士

AI研習(xí)社(yanxishe.com)譯站頻道,傳播前沿人工智能知識(shí),讓語言不再成為學(xué)習(xí)知識(shí)的門檻。(原雷鋒字幕組)
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說