# 模型壓縮的技術 ## 前言 在詳細介紹模型的壓縮之前,我想先用『圖片』來開場。  觀察上面這兩張照片,大家應該會毫不猶豫的說: * 右邊照出來的向日葵比較清晰。 * 左邊照出來的向日葵很模糊。 1. 首先我們要知道圖片是由很多很多的小格子所組成的,而每一個小格子我們稱做像素或畫素(pixel)。 2. 如果想要圖片越清楚(不考慮每個格子的顏色),我們要讓圖片用更多格子來呈現,也就是格子數越多越好。 :::info 所以假設問你上面哪一張圖片是由1600萬畫素的手機拍的?哪一張是由4800萬畫素的手機拍的? * 很明顯右邊圖片比較清楚,也就是用比較多的小格子組成圖片,所以是由4800萬畫素的手機所拍攝,或者可以說圖片是由4800萬個小格子所構成。 * 而左邊模糊的照片是用比較少小格子所構成,所以是使用1600萬畫素所拍的。 ::: 所以根據上面的結論,照片畫素越高越好是嗎?🧐 當然不是啊,最明顯的問題就是: :::danger 高畫質的照片表示用了更多的小格子來呈現圖片,因此當要儲存圖片時,為了不要漏掉細節,所以每個格子的資訊都要儲存起來,那這樣不就造成: * 存一張照片要佔用更多記憶體空間。 * 傳送圖片資料時,用更久的時間。 ::: :::success 所以從上面的問題我們開始思考是不是可以『用更少的儲存空間,但依舊保持圖片的高畫質』。 這個概念跟接下來要介紹的模型壓縮很有關係,先簡單讓大家有個感覺😗 ::: ## 模型的量化(Quantization) ### 為什麼模型要量化呢? 我們知道一個模型裡面可能有很多層的神經網路。當模型在運作時,就表示內部的數值已經開始一層一層計算。 但是這裡的數值可不是簡單的整數而已,通常是很多bits的浮點數,例如32個bits浮點數的數值(FP32)。 所以要計算這麼多且這麼長位數的數值,在計算上除了很費力外也特別佔用記憶體空間。 :::info 因此是不是有方法可以減少數值的長度(也就是精準度),但依舊能保持模型的精度呢? 還真有方法,這種方法就叫量化(Quantization)。也就是直接對模型進行壓縮使內部數值的運算都用整數來處理。 而量化又分成2種: 1. Post-training Quantization 2. Quantization aware training :::warning 為什麼會想要轉成整數呢? 因為整數的儲存相較於浮點數使用更少的記憶體,而且整數的運算也比浮點數快很多。 ::: 講到這裡好像很合理但又感覺怪怪的,沒錯我一開始讀到這裡也有這種感覺。怪怪的點是: * 將浮點數直接轉成整數進行運算的話,例如原本是123.456789轉成整數123之後,在經過模型一層一層的運算後,誤差可能會隨之變大,進一步導致模型在預測結果時出現錯誤,儘管轉成整數後的誤差只有0.456789這麼小的數值。 :::success 也就是如何確保從浮點數轉成整數,使用整數進行運算,運算完後依然保持模型的精度。 ::: ## Post-training Quantization * Definition: 簡單說就是模型的權重(也就是上面說的『數值』)訓練好之後,直接將模型權重轉換成整數。 * [AI模型壓縮技術-量化(Quantization)](https://chih-sheng-huang821.medium.com/ai%E6%A8%A1%E5%9E%8B%E5%A3%93%E7%B8%AE%E6%8A%80%E8%A1%93-%E9%87%8F%E5%8C%96-quantization-966505128365) ## [Quantization aware training](https://arxiv.org/pdf/1712.05877.pdf) * Definition: 簡單說就是模型的權重直接用整數來進行訓練,但通常在進行整數訓練前,模型會先用浮點數訓練後再用整數來進行Fine-tune訓練。 * 這種方式比Post-training Quantization又更複雜一點。 ## Reference * [A Survey of Model Compression and Acceleration for Deep Neural Networks](https://arxiv.org/pdf/1710.09282.pdf) * [A Visual Guide to Quantization](https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up