為什么GEMM是深度學習的核心


前言: 

在之前寫的一篇計算機視覺入門路線文章中,我推薦大家在不用任何框架、只使用numpy這種包的情況下,從零實現一個卷積神經網絡。其中一個很重要的因素就是在這個過程中大家會了解到卷積過程在底層中是如何優化實現的,其主流的方法就是GEMM。這篇博客比較細致地介紹了什么是GEMM,以及它的優缺點。

我大部分時間都在考慮如何讓神經網絡的深度學習更快、更高效。在實踐中,這意味着要關注一個名為GEMM的函數。它是1979年首次創建的BLAS(基本線性代數子程序)庫的一部分,直到我開始嘗試優化神經網絡之前,我從未聽說過它。為了解釋為什么它如此重要,這是我朋友楊慶嘉論文的圖表

所有以fc(完全連接)或卷積)開頭的層都使用GEMM實現,幾乎所有時間(95%的GPU版本,89%的CPU)都花在這些層上。

那么什么是GEMM呢?它代表全局矩陣到矩陣的乘法,它本質上完全按照它在tins上所說的那樣,將兩個輸入矩陣乘法在一起,得到一個輸出矩陣。它和我在三維圖形世界中使用的矩陣操作類型之間的區別在於,它所工作的矩陣通常非常大。

例如,典型網絡中的單個層可能需要將256行、1152列矩陣乘以1152行、192列矩陣,以產生256行、192列的結果。天真地說,這需要5700萬層(256x1152x192)浮點操作,在現代架構中可以有幾十個這樣的層,所以我經常看到網絡需要幾十億FLOP來計算一幀。下面是我繪制的一個關系圖,以幫助我可視化它的工作原理:

關注公眾號CV技術指南,及時獲取更多計算機視覺的內容。

 

完全連接的圖層

全連接層是已經存在了幾十年的經典神經網絡,並且可以最簡單地從如何使用GEMM開始。FC層的每個輸出值查看輸入層中的每個值,將它們全部乘以該輸入索引的相應權重,並將結果相加以得到其輸出。根據上圖的說明,具體情況如下:

 

有“k”輸入值,也有“n”神經元,每個輸入值都有自己的學習權值集。有“n”輸出值,每個神經元都有一個輸出值,通過做其權值和輸入值的點積來計算。

 

 

卷積圖層

使用GEMM進行卷積層並不是一個明顯的選擇。卷積層將其輸入視為二維圖像,每個像素都有多個通道,很像具有寬度、高度和深度的經典圖像。與我習慣處理的圖像不同,通道的數量可以是數百個,而不僅僅是RGB或RGBA!

卷積操作通過獲取一些“核”的權重來產生其輸出。並在圖像中應用它們。下面是輸入映像和單個內核的外觀:

 

每個卷積核都是一個三維數組,其深度與輸入圖像相同,但其寬度和高度要小得多,通常就像7×7一樣。為了產生結果,卷積核將應用到輸入圖像的點網格。在應用它的每個點,所有相應的輸入值和權重相乘,然后在該點相加產生單個輸出值。以下是視覺效果:

 

您可以將這個操作看作是一個邊緣檢測器。卷積核包含一個權重模式,並且當它所查看的輸入圖像的部分具有類似的模式時,它會輸出一個高值。當輸入與模式不匹配時,結果是該位置的數較低。以下是一些典型的模式,它們是由網絡的第一層學習的。

因為第一層的輸入是RGB圖像,所有這些核也可以可視化為RGB,它們顯示網絡正在尋找的原始模式。這些96個內核中的每一個在輸入上以網格模式應用,結果是一系列96個二維數組,它們被視為具有96個通道深度的輸出圖像。如果您習慣了像Sobel操作符這樣的圖像處理操作,您可以想象它們都有點像針對圖像中不同重要模式優化的邊緣檢測器,因此每個通道都是輸入中這些模式發生位置的映射。

您可能已經注意到,我對內核應用的網格類型很模糊。它的關鍵控制因素是一個稱為“步幅”的參數,它定義了內核應用程序之間的間距。例如,隨着步幅為1,256×256輸入圖像將在每個像素處應用一個內核,並且輸出將是與輸入圖像相同的寬度和高度。只要邁出4步,相同的輸入圖像就只能每四個像素應用一次內核,因此輸出將只有64×64。典型的步幅值小於內核的大小,這意味着在可視化內核應用程序的圖表中,其中很多值實際上會在邊緣重疊。

 

GEMM如何處理卷積解決方案

這似乎是一個相當專門的操作。它涉及大量的乘法和求和,比如完全連接層,但不清楚如何或為什么要將其變成GEMM的矩陣乘法。最后我將討論動機,但這個操作是如何用矩陣乘法表示的

第一步是將來自一個實際上是一個三維數組的圖像的輸入變成一個二維數組,我們可以像一個矩陣一樣處理。應用每個內核的地方是圖像中的一個小三維多維方體,因此我們提取每個輸入值的多維方體,並將它們作為一列復制到一個矩陣中。這被稱為im2col,對於圖像到列,我相信從一個原始的Matlab函數,下面是我如何可視化它的:

如果步幅小於內核大小,你可能會對我們進行此轉換時發生的內存大小的擴展感到震驚。這意味着包含在重疊核站點中的像素將在矩陣中被復制,這看起來效率低下,但實際上利大於弊。

現在您有了矩陣形式的輸入圖像,您可以對每個內核的權重執行同樣的操作,將三維多維數據集序列化為行,作為乘法的第二個矩陣。以下是最終的GEMM的外觀:

這里的“k”是每個補丁和內核中的值數,因此它是內核寬度*內核高度”深度。結果矩陣是“patches數”列高,按“kernels數”行寬計算。這個矩陣實際上被隨后的操作視為一個三維數組,以內核維數作為深度,然后根據它們在輸入圖像中的原始位置將斑塊分割回行和列。

 

為什么GEMM適用於卷積

希望您現在可以看到如何將卷積層表示為矩陣乘法,但仍然不清楚您為什么要這么做。簡而言之,答案是,科學程序員的格式世界已經花了幾十年時間優化代碼來執行大矩陣到矩陣乘法,而非常規則的內存訪問模式的好處超過了浪費的存儲成本。這篇來自Nvidia的論文(文末附下載方式)很好地介紹了一些不同的方法,但他們也描述了為什么他們最終以一個修改版本的GEMM作為他們最喜歡的方法。同時對相同的內核批處理大量輸入圖像還有很多優點,本文關於《Caffe con troll》的論文(文末附下載方式)使用了非常好的效果。GEMM方法的主要競爭對手是使用傅里葉變換在頻率空間中進行操作,但在卷積中使用步進使其難以如此有效。

好消息是,擁有一個單一的、被充分理解的算法(即GEMM)占據了我們的大部分時間,這為優化速度和功率的使用提供了一條非常清晰的路徑,無論是通過更好的軟件實現,還是通過定制硬件來很好地運行操作。因為深度網絡已被證明對跨語音、NLP和計算機視覺的大量應用程序有用,所以我期待看到未來幾年的巨大改進,就像對3D游戲的廣泛需求通過迫使頂點和像素處理操作的革命,推動了GPU的革命。

 

論文:cuDNN: Efficient Primitives for Deep Learning

地址:https://arxiv.org/pdf/1410.0759.pdf

論文:Caffe con Troll: Shallow Ideas to Speed Up Deep Learning

地址:https://arxiv.org/pdf/1504.04343v1.pdf

獲取方式:公眾號中回復“0002”可獲取

 

原文鏈接:

https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/

 

本文來源於公眾號 CV技術指南 的論文分享系列。

歡迎關注公眾號 CV技術指南 ,專注於計算機視覺的技術總結、最新技術跟蹤、經典論文解讀。

在公眾號中回復關鍵字 “技術總結” 可獲取以下文章的匯總pdf。

 

其它文章

使用深度神經網絡為什么8位足夠?

經典論文系列 | 目標檢測--CornerNet & 又名 anchor boxes的缺陷

如何看待人工智能的泡沫

使用Dice loss實現清晰的邊界檢測

PVT--無卷積密集預測的多功能backbone

CVPR2021 | 開放世界的目標檢測

Siamese network總結

視覺目標檢測和識別之過去,現在及可能

在做算法工程師的道路上,你掌握了什么概念或技術使你感覺自我提升突飛猛進?

計算機視覺專業術語總結(一)構建計算機視覺的知識體系

欠擬合與過擬合技術總結

歸一化方法總結

論文創新的常見思路總結

CV方向的高效閱讀英文文獻方法總結

計算機視覺中的小樣本學習綜述   

知識蒸餾的簡要概述   

優化OpenCV視頻的讀取速度

NMS總結   

損失函數技術總結

注意力機制技術總結   

特征金字塔技術總結   

池化技術總結

數據增強方法總結   

CNN結構演變總結(一)經典模型

CNN結構演變總結(二)輕量化模型 

CNN結構演變總結(三)設計原則

如何看待計算機視覺未來的走向   

CNN可視化技術總結(一)特征圖可視化

CNN可視化技術總結(二)卷積核可視化

CNN可視化技術總結(三)類可視化

CNN可視化技術總結(四)可視化工具與項目


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM