MNN量化 ADMM優化演算法

2021-10-24 14:07:11 字數 3100 閱讀 5739

目錄

量化的模型建立

admm演算法

現在我們知道了如何做量化推斷,下一步是如何去建立量化模型,或者說我們應該用乙個什麼樣的方式才能求得量化權重和量化輸入呢?現在已知我們的輸入為fp32,我們想用int8來對原fp32的資料進行表示,其中的轉化關係假設為:

fp32和int8值之間的轉化關係

對於每個資料塊,我們都希望用乙個尺度因子來對其進行int8的刻畫,這個尺度因子就是上面式子中的s。經過上面式子之後,我們就能找到int8值和fp32值的乙個對應關係。下面我們看看具體的從fp32到int8的值求解過程,這裡假設我們已經知道了尺度因子s和階段關係,那麼int8的值我們可以通過如下式子獲得:

int8值的求解過程

其中e是乙個分段函式,表示如下。在數軸上看這個函式,是乙個分段線性函式,且每個分段的導數為0,在階梯跳躍處的整數點不可導。這個性質是乙個很好用的性質,文中後續將會用到這個性質。

截斷函式

在經過了這一系列過程後,我們就由fp32值得到了int8的值,我們進一步抽象這個過程,為了後面的數學推導做準備。為此,我們再定義乙個函式f,我們稱之為編碼函式;反過來f的逆,我們稱之為反編碼函式,由上式我們很容易得到:

所以,在進行int8值的量化編碼時候,我們執行了如下操作,

int8的編碼過程,由於進行了資料截斷,該過程不可逆,所以這個是乙個資訊損失的過程,為了度量損失的程度,我們下面將會介紹兩種思路,也是mnn中解決該問題的兩種演算法。其目的都是為了,盡量的在編碼過程中減少資訊的損失。一種是從概率分布的角度出發的,目的是讓編碼後的資料分布和編碼前的資料分布盡可能的一致,採用的概率分布度量為kl-散度;另一種是從最優化優化角度出發的,目的是讓編碼後的資料在進行反編碼後的結果,盡可能和原資料接近,採用的度量可以是l2、l1或是廣義範數,但由於l2度量的優化演算法求解方便,我們後面也主要基於l2度量進行討論。

mnn中的admm演算法是從優化的角度出發,來保證編碼前後資料盡可能相似的方法。

首先定義乙個目標:也就是希望編碼後的資料(int8)經過反編碼後,跟原資料的」距離「盡可能的接近。該描述可以通過如下數學公式進行刻畫:

所以,求解尺度因子s的過程,就變成了極小化上述目標函式的過程。而且,上面我們也提到過,e的函式性質很有特點,其在階段域內整點處處不可導,其餘點處處導數為0。利用該階段函式的特點,我們很容對上述目標函式進行求解。不過先別急,我們先算算上面目標函式相對於s的導數,如下:

由於e函式的特點,我們知道e關於s的隱函式求導,在可導處的函式值處處為0,不可導的地方我們先忽略掉(工程實現只需要避免奇點即可)。我們可以將上述式子再進一步簡化如下:

再得到目標函式關於s的導數公式以後,後續的求解就非常簡單了,我們給出幾種求解思路。

第一種,比較直接的方法,可以採用梯度下降法,流程簡單如下:

## 給定s的初值(可以統計資料的min、max進行強對映初始化)

1、 計算l關於s的梯度

2、 更新s的值

3、 判斷終止條件

4、 更新步長

第二種,稍微麻煩點,由第一種演算法我們可以知道,步長的選取是啟發性的,收斂性雖然基本都能 得到保證,但如果我們想自適應的計算最優步長,可以採用golden-search的求解方式,求解過程跟梯度下降法很接近,如下:

## 給定s的初值(可以統計資料的min、max進行強對映初始化)

1、 計算l關於s的梯度

2、 計算最優步長

3、 更新s的值

4、 判斷終止條件

第三種方式,類似一階收斂(梯度下降、golden-search)和二階收斂(牛頓等)我就不再拓展了;我們這裡介紹一下mnn中採用的優化演算法,admm(交替方向法)。在得到l關於s的梯度公式後,如下圖:

其進行了乙個概念轉化,求解l的極小化問題,轉化成求解l關於s的導數為0的數學問題。但由於函式e中還包含了未知數s,mnn在求解這個資料問題的時候,採用了admm的思想,先freezee中的s變數,進行s值的求解;然後再通過求解後的s去估計e的值,如此反覆直到s值收斂到最優。於是上述的式子要弱化為如下公式:

所以迭代的過程就變成了交替迭代求解如下兩個公式的過程,

admm的迭代過程

於是演算法流程可構造如下:

## 給定s的初值(可以統計資料的min、max進行強對映初始化)

1、 計算e的值

2、 更新s的值

3、 判斷終止條件

關於三種演算法的終止條件判斷,可以採用l2 loss的方式即||l(k+1) - l(l(k)) || / n。也可以採用相對變化率的方式,即當前迭代變化和上次迭代變化的比值。不過其實不判斷問題也不大,如mnn中的原始碼實現中是按照最大固定迭代次數來實現的。

交叉方向乘子法(ADMM)演算法

admm是乙個凸優化演算法。交替方向乘子法 admm 是一種求解具有可分離的凸優化問題的重要方法,由於處理速度快,收斂效能好,admm演算法在統計學習 機器學習等領域有著廣泛應用。正常的凸優化問題 這是最簡單的優化問題,其中 x 是優化變數,也就是可以改變的數值,通過調節 x 的大小,使得目標函式 ...

tensorflow模型優化 量化

量化的概念 量化 quantitative 這裡不是指金融上的量化交易,而是指離散化。量化是乙個總括術語,是用比 32 位浮點數更少的空間來儲存和執行模型,並且 tensorflow 量化的實現遮蔽了儲存和執行細節。神經網路訓練時要求速度和準確率,訓練通常在 gpu 上進行,所以使用浮點數影響不大。...

pytorch優化之量化

思考 pytorch的eager模式,是怎樣支援開發模式支援序列執行斷點除錯,生產模式支援生成可併發執行 的,可以拉原始碼除錯分析。這裡會涉及到圖程式設計模式 編譯原理,執行優化等技術。什麼是量化?量化是指用於執行計算並以低於浮點精度的位寬儲存張量的技術。量化模型對張量使用整數而不是浮點值執行部分或...