1. 程式人生 > >智慧手機跑大規模神經網路的主要策略

智慧手機跑大規模神經網路的主要策略

計算機具有高儲量的硬碟和強大的CPU和GPU。但是智慧手機卻沒有,為了彌補這個缺陷,我們需要技巧來讓智慧手機高效地執行深度學習應用程式。

79ff14f053a37d198746b155b2d2e1c6fb6e674d

介紹

深度學習是一個令人難以置信的靈活且強大的技術,但執行的神經網路可以在計算方面需要非常大的電力,且對磁碟空間也有要求。這通常不是雲空間能夠解決的問題一般都需要大硬碟伺服器上執行驅動器和多個GPU模組。

不幸的是,在移動裝置上執行神經網路並不容易。事實上,即使智慧手機變得越來越強大,它們仍然具有有限的計算能力、電池壽命和可用磁碟空間,尤其是對於我們希望保持儘可能輕的應用程式這樣做可以實現更快的下載速度、更小的更新時間和更長的電池使用時間,這些都是使用者所欣賞的。

為了執行影象分類、人像模式攝影、文字預測以及其他幾十項任務,智慧手機需要使用技巧來快速,準確地執行神經網路,而無需使用太多的磁碟空間。

在這篇文章中,我們將看到一些最強大的技術,使神經網路能夠在手機上實時執行。

使神經網路變得更小更快的技術

基本上,我們對三個指標感興趣模型的準確性速度以及它在手機上佔用的空間量。由於沒有免費午餐這樣的好事,所以我們必須做出妥協。

對於大多數技術,我們會密切關注我們的指標並尋找我們稱之為飽和點的東西。這是一個指標的收益停止而其他指標損失的時刻。通過在飽和點之前保持優化值,我們可以獲得最佳值。

dbe6b3f2ba12d31c561bec7086cd7363f4a7f0b6

在這個例子中,我們可以在不增加錯誤的情況下顯著減少昂貴的操作次數。但是,在飽和點附近,錯誤變得太高而無法接受。

1.避免完全連線的層

完全連線的層是神經網路最常見的組成部分之一,它們曾經創造奇蹟。然而,由於每個神經元都連線到前一層的所有神經元,因此它們需要儲存和更新眾多引數這對速度和磁碟空間是不利的。

卷積層是利用輸入中的區域性一致性(通常是影象)的層。每個神經元不再連線到前一層的所有神經元。這有助於在保持高精度的同時減少連線/重量的數量。

56906aef61771e4043e6c061c1689cbc70356b2a

完全連線層中的連線/權重比卷積層中多得多。

使用很少或沒有完全連線的層可以減少模型的大小,同時保持高精度。這可以提高速度和磁碟使用率。

在上面的配置中,具有1024個輸入和512個輸出的完全連線層,這個完全連線層大約有500k個引數。如果是具有相同特徵和32個卷積層特徵對映,那麼它將只具有50K引數,這是一個10

倍的改進!

2.減少通道數量和核心大小

這一步代表了模型複雜性和速度之間的一個非常直接的折衷。卷積層中有許多通道允許網路提取相關資訊,但需付出代價。刪除一些這樣的功能是節省空間並使模型變得更快的簡單方法。

我們可以用卷積運算的接受域來做同樣的事情。通過減小核心大小,卷積對本地模式的瞭解較少,但涉及的引數較少。

9cfa854465925f2174c18073957bb570a65c833a

較小的接受區域/核心大小計算起來更便宜,但傳達的資訊較少。

在這兩種情況下,通過查詢飽和點來選擇地圖/核心大小的數量,以便精度不會降低太多。

3.優化縮減取樣(Optimizing the downsampling

對於固定數量的層和固定數量的池操作,神經網路可以表現得非常不同。這來自於一個事實,即表示該資料以及計算量的依賴於在池操作完成:

·當池化操作提早完成時,資料的維度會降低。越小的維度意味著網路處理速度越快,但意味著資訊量越少,準確性越差。

·當聯網操作在網路後期完成時,大部分資訊都會保留下來,從而具有很高的準確性。然而,這也意味著計算是在具有許多維度的物件上進行的,並且在計算上更昂貴。

·在整個神經網路中均勻分佈下采樣作為一個經驗有效的架構,並在準確性和速度之間提供了一個很好的平衡。

d1427fa051640395de1c6f7a8ef0a4e86905a77a

早期的池化速度很快,晚期的池化是準確的,均勻間隔的池化是有點兩者。

4.修剪重量(Pruning the weights)

在訓練完成的神經網路中,一些權重神經元的啟用起著強烈作用,而另一些權重幾乎不影響結果。儘管如此,我們仍然對這些弱權重做一些計算。

修剪是完全去除最小量級連線的過程,以便我們可以跳過計算。這可能會降低了準確性,但使網路更輕、更快。我們需要找到飽和點,以便儘可能多地刪除連線,而不會過多地損害準確性。

83c1a5b55e742fb0745470b6bbaf5b4e1963f05c

除去最薄弱的連線以節省計算時間和空間。

5.量化權重(Quantizing the weights)

為了將網路儲存在磁碟上,我們需要記錄網路中每個單一權重的值。這意味著為每個引數儲存一個浮點數,這代表了磁碟上佔用的大量空間。作為參考,在C中,一個浮點佔用4個位元組,即32個位元。一個引數在數億的網路(例如GoogLe-NetVGG-16)可以輕鬆達到數百兆這在移動裝置上是不可接受的

為了保持網路足跡儘可能小,一種方法是通過量化它們來降低權重的解析度。在這個過程中,我們改變了數字的表示形式,使其不再能夠取得任何價值,但相當受限於一部分數值。這使我們只能儲存一次量化值,然後參考網路的權重。

a484f5a40574e66411262946eced0275eb1481a7

量化權重儲存鍵而不是浮動

我們將再次通過查詢飽和點來確定要使用多少個值。更多的值意味著更高的準確性,但也是更大的儲存空間。例如,通過使用256個量化值,每個權重可以僅使用1個位元組8個位元來引用。與之前(32位)相比,我們已將大小除以4

6.編碼模型的表示

我們已經處理了關於權重的一些事情,但是我們可以進一步改進網路!這個技巧依賴於權重不均勻分佈的事實。一旦量化,我們就沒有相同數量的權值來承載每個量化值。這意味著在我們的模型表示中,一些引用會比其他引用更頻繁地出現,我們可以利用它!

霍夫曼編碼是這個問題的完美解決方案。它通過將最小佔用空間的金鑰歸屬到最常用的值以及最小佔用空間的值來實現。這有助於減小裝置上模型的誤差,最好的結果是精度沒有損失。

9ca79ae80542c22aea59445bf4fa9bad92444759

最頻繁的符號僅使用位的空間,而最不頻繁的使用位。這是由後者很少出現在表示中的事實所平衡的。

這個簡單的技巧使我們能夠進一步縮小神經網路佔用的空間,通常約為30

注意:量化和編碼對於網路中的每一層都是不同的,從而提供更大的靈活性

7.糾正準確度損失(Correctiong the accuracy loss)

使用我們的技巧,我們的神經網路已經變得非常粗糙了。我們刪除了弱連線(修剪),甚至改變了一些權重(量化)。雖然這使得網路超級輕巧,而且速度非常快,但其準確度並非如此。

為了解決這個問題,我們需要在每一步迭代地重新訓練網路。這只是意味著在修剪或量化權重後,我們需要再次訓練網路,以便它能夠適應變化並重復這個過程,直到權重停止變化太多。

結論

雖然智慧手機不具備老式桌面計算機的磁碟空間、計算能力或電池壽命,但它們仍然是深度學習應用程式非常好的目標。藉助少數技巧,並以幾個百分點的精度為代價,現在可以在這些多功能手持裝置上執行強大的神經網路。這為數以千計的激動人心的應用打開了大門。