如何為實時音視訊設計小且優的深度學習模型?

聲網Agora發表於2018-12-19

在 GDG 組織的 DevFest 2018 上,聲網Agora 首席科學家鐘聲與在座的上千位開發者分享了演講《Deep Learning for MobilePlatforms: Complexity and Performance Analysis》。以下是由 GDG 整理髮布的演講實錄。

歡迎訪問 RTC 開發者社群,與更多實時音視訊、編解碼技術開發者交流經驗。 

如何為實時音視訊設計小且優的深度學習模型?


關於演講者

如何為實時音視訊設計小且優的深度學習模型?

演講實錄

如何為實時音視訊設計小且優的深度學習模型?


開場白

最近在微信群裡看到一張很有意思的圖,大家應該都見過大街小巷地鐵站旁邊的手機貼膜吧?但這張圖的牌子上寫的不是「手機貼膜」而是「模型調參」。用這個例子雖然有些不恰當,但人工智慧學習演算法確實正在成為我們生存的必殺技,可見人工智慧有多火。

從 AI 的應用開始

回到我們今天的主題,我想問,今天的午餐和深度學習有什麼共同之處?餐盒和黑盒,都是盒子。餐盒有一個沙拉、主菜和餐後的水果。黑盒子打不開、看不到。

今天的演講試圖稍稍進入黑盒裡能看一下,作為工程師,我們都想知其然,也知其所以然。我就基於我們所做的工作稍稍解密一下深度學習某些方面。

聲網主要提供實時音視訊通訊傳輸服務、編解碼及前後處理等等,我們更多的聚焦在通訊實時互動領域。

現在的社交娛樂應用裡面有很多 AI 的應用。美顏,貼紙,包括一些互動動作的識別,變臉、變聲都是屬於風格轉換,AI 演算法在這些方面有很好的應用。

除了這些,AI 在後處理端也有很多應用。比如如何提升比較模糊的影像的細節,更清晰地呈現給大家,提高收視的體驗;又比如由於網路傳輸線路上有丟包,接收的資料有失真,這個也可以利用 AI 演算法來補償。

AI 在雲端也有更多的應用,比如內容的監管,比如黃色圖片的鑑別,以及識別暴力影像,還有語音變成文字,以及情感計算等等,這些很多在實時通訊領域裡有非常好的應用。

超解析度恢復模糊影像

下面以恢復模糊影像作為一個例子,介紹人工智慧的深度演算法和應用。

如何為實時音視訊設計小且優的深度學習模型?

我們都知道超解析度(超分,SR)對恢復細節有幫助。在我們的場景下,由於網路頻寬受限,會產生丟包,因而此時會以低位元速率壓縮和傳輸影像,解碼出來的影像通常是會模糊一點,影響收視體驗。尤其是在直播應用裡,使用者希望看到清晰的面容和聽到清晰的聲音。

如何為實時音視訊設計小且優的深度學習模型?

超分是我們後處理的一步,作為跟前面的處理不相關的一個處理,這一步放在最後。視訊源經過編碼在網路上傳輸,解碼器收到後經過解碼出來是一個模糊的影像,經過超解析度處理把細節提升或者放大,再顯示出來。

深度神經網路已經被證明了可以較好地生成影像的細節。GAN 模型是一個非常有效的模型,它也是我們超分演算法的基礎模型,接下來主要是以 GAN 來做效能和複雜度的分析。

GAN 模型

如何為實時音視訊設計小且優的深度學習模型?


下面介紹一下GAN 的基本思路。它通常包含兩個網路,一個是生成器,一個是判別器,這兩個模型以又合作又對抗的方式運作,最後達到一個平衡,使得生成器能夠產生以假亂真的資料,例如:

  • 當判別器接收到的是真實的影像資料,判別器會把它接受為一個真實的資料。

  • 當生成器輸入的是一個低解析度的資料,我們想生成高清的資料,希望生成器出來的資料像真的一樣。但判別器的任務正好相反,它儘量不讓生成的資料矇混過關,並且要把它踢出去。

一旦被區別出來之後,生成器會反覆訓練、調參,使得生成的資料更像真的;判別器也會反覆訓練、努力提高自己的能力,鑑別假資料的能力越來越強。可謂道高一尺魔高一丈,最後二者收斂的時候判別器再也不能區分生成器生成出來的資料是真的還是假的,這個時候的結果就被判別器接受了。

最近幾年在頂級 AI 會議上,三分之二以上的文章可能跟GAN有關的。

如何設計小且優的深度學習模型?

眾所周知深度學習最好的結果是採用比較大的模型,在比較大的機器平臺,比如說伺服器,有成千上萬的 GPU作並行處理來訓練,並且需要有非常大量的訓練資料集。

但是現在針對移動裝置的應用很多,我們做移動社交、做直播、通訊,面臨的挑戰是要設計一個小的模型,最好能滿足下面三個條件:

  • 這個小模型能夠在移動裝置上實時地跑,並且不會消耗太多功耗,不會引起發熱等等問題。

  • 另外它的結果還要足夠好,不能因為模型做小了而沒有效果,這個沒有意義。

  • 訓練要能夠基於比較合理數量的資料集就能夠取得好的效果,要上百萬個甚至上千萬個資料往往不夠現實,因為資料收集的成本太高。

接下來我們作複雜性分析,我們的目標是縮小模型。來看一些典型的模型,經典的一些作影像分析和識別的深度神經網路,像 VGG 模型,是很大的模型,它的引數個數,也就是權重的個數,是衡量這個模型複雜性的一個重要指標。

VGG16 模型有一億多個引數。為了在移動平臺能夠執行,業界做了大量的工作,這些工作包括把這個模型做剪枝、壓縮和重新訓練模型等,也有通過更復雜的技術,比如通過強化學習來達成一個更小的模型。這些方法都有一些潛在的問題,比如最終出來的結構不夠簡單,計算量仍然不夠少,或者不易於並行實現等。

谷歌在這方面也做了很好的工作,最新的結果是 MobileNet v2 的 340 萬個引數,不到 VGG16 引數個數的 3%,縮小了很多,將近兩個數量級,非常小。但是對我們來說,340 萬個引數的模型還是很大,尤其在移動裝置上以軟體實現仍不是很理想,當然我們的任務有點不一樣,我們是做影像超分,而上述模型是做做物體識別的。

基於 ReLU 的 CNN

我們來看一下基於 ReLU 的 CNN,實際上是分段線性函式,這個很容易理解,尤其是當stride 為1的時候,分段線性的對映還是保持的。

為了更好地理解下面的內容,我再介紹一個概念,就是流型。舉個例子來說流型比較容易理解,比如關於人臉的影像,雖然可以是在 1000×1000 個大的尺寸上,有一百萬個畫素點,但真正表徵人臉不需要一百萬個點,一兩百個引數就可以,實際上在比較低維的一個空間裡即可以表徵出來,這個過程就是從它的背景空間對映到它的引數空間,或者稱為隱空間的過程,這實際上是一個編碼的過程,是一個降維處理。

反過來從這個低維空間到高維空間是一個解碼的過程,是一個生成器。一般來說編碼是把資料壓縮到更低維的引數空間,叫隱空間。存在一個對映,從高維流型到低維的空間之間,正對映和逆對映都是連續的,這就是同胚對映。我們想隱空間這個低維的引數空間裡做些操作。

剛才說過深度學習實際上是一個分段線性的對映,它是對流型的一個分段線性的逼近,比如這個模型比較簡單的時候,它是以兩條線來逼近,模型複雜的時候以四條線來逼近,這時逼近的程度更高。實際上一個更復雜的深度學習網路能產生的效果更好,逼近的精度更高,當然它的複雜度也更高。

另外,不同的逼近方法達到的效果也不一樣,換一個方式可能逼近的更好,實際上不同的權重對應不同的對映,對應不同的逼近效果,我們訓練的過程就是在找一個最優化的逼近,至少是找一個區域性最優化的逼近過程,使得它達到的效果某種意義上是最優的。精度是由逼近的質量來衡量的。

我把我們的結果報告一下,最後做到了只有萬級的引數個數,比谷歌的用於移動裝置的 MobileNet v2 模型還小了兩個多數量級。聲網模型不到它的 1%,進一步小了非常多。通常模型變小之後會有一個問題,GAN 本身隱含的問題就變得更突出,模式坍塌就是其中一個問題。

模式坍塌

模式坍塌是什麼問題?生成器很難學習多模態的分佈。舉一個在圓環上的八個高斯分佈的例子。生成器想學習這個分佈,但是在一個簡單模型的訓練的過程及最後結果都只能收斂到其中一個高斯分佈。用在實際應用的例子上,比如生成數字,我們期望它像第一行影像中這樣能生成 0-9 的各個數字,但是很容易它就像第二行這樣只能生成其中一個數字,比如總生成 1 或者某個含混難辯的數字,因為 1 容易在判別器那裡矇混過關,這雖然做對了,但是它生成不了別的數字,用處不大。

如何解決這個問題或者緩解這個問題呢?我們做了一系列的工作,簡單來說,我們加了一些約束,加了對局域的約束,加了對切空間的約束,再加了對隱空間的優化,接下來不能一一講述,就簡單講解一下對隱空間的優化。

隱空間的優化

剛才我提到過 DNN 實際上是把一個流型往隱空間或者引數空間做對映。一個影像通常被編碼到一個低維的空間,就是隱空間。這裡給大家做一個直觀的解釋,我們直接在這個編碼空間,即隱空間裡來做恢復,先在隱空間裡均勻的去取樣一些點,然後再通過這些點輸入到生成器,生成器重構出來的影像點,把它們重疊到原來的影像上,有些恢復出來的點很密,但是有些地方比如頭部臉部就很稀疏,這就意味著頭部的恢復很差。生成器坍塌到一個區域性最優,這個重構是很難或者不太容易得到很好的結果。當然我們可以更密集的取些取樣點,最終頭部也被覆蓋到,但是代價會很大。

我們可以把這個隱空間先做優化,再在上面做均勻抽樣,再把它輸入進生成器,生成器出來,抽樣點還是這麼多,重構影像出來的重構點也是均勻的,也就是從這個點雲裡出來的東西也是均勻的。

打個比方,我們拿一張平的紙,使用各種不規則的方式任意摺疊起來很多遍,你被要求在摺疊起來的一團紙上抽取一定的取樣點,然後把紙展開恢復平整後要求這些取樣點是均勻的。這個很難,一般做不到,除非用暴力取足夠多的點出來。但那樣複雜性很高,與我們的目標相悖。我們想同時控制複雜性又控制效果。我們把類似的隱空間優化應用到了我們的模型訓練裡。因為我們最終模型的引數非常小,所以功耗在 iPhone7 上很少,另外手機也不會發熱。效果基本上我們能做到,比如說一個 360P 的視訊,出來的效果能夠達到在 720P 的效果,能得到一個高清的效果。

我們未來還想從數學更多的理解一些深度網路,對某個點、某個問題上能夠用數學的方式來描述,來進一步提高影像清晰度。這是我們未來要做的工作,謝謝大家。

最後給希望開發實時音視訊App,或希望學習 WebRTC 的開發者推薦一些博文與資料


相關文章