在實時音視頻中應用深度學習,你須要瞭解這些

在場景需求的推進下,以及背後算法、算力、數據的支撐下,AI 已經慢慢走出實驗室,開始擁抱產業,這其中也包括 RTC 行業。在實時的視頻、實時音頻、實時傳輸、視頻內容檢索與推薦、實時交互等層面,都已經出現了與 AI 結合的落地應用。算法

從實時的視頻來說,超分辨率就是最典型的應用之一。在深度學習的幫助下,咱們能夠在視頻接收端提升原有圖像的分辨率,獲得高分辨率的圖像,這個過程就是超分辨率重建。咱們之前也分享過一些知名的算法模型。 實時音頻方面,咱們能夠看到不少 AI 的應用。例如帶寬擴展,在咱們通話的過程當中,對方的聲音聽起來有些悶,這是由於語音信號中的高頻區域被移除掉了。而基於DNN的頻帶擴展則可將高頻區域恢復出來,就像下圖這樣。通過頻帶擴展後的信號增長了不少高頻信息,實際的聽感也會更加明亮、清晰。網絡

除此以外,AI 在實時語音上的應用還包括語音加強、基於 RNN 的丟包恢復、語音音樂分類器等。AI的發展使得音頻領域有了更多的可能性去解決以前難以處理的問題。對於實時音頻而言,AI是一把全面提高質量的利刃,但實時音頻所必須的低複雜度、低延時特性註定全面AI化引擎還有很長的路要走。 另外,除了實時音視頻,AI架構

還能夠用於改善實時傳輸質量,也能夠用於視頻內容的檢索與推薦,或進行音視頻內容審覈。以上這些相關話題,你均可以在今年的 RTC 實時互聯網大會上聽到。 10 月 24 日、25 日即將舉行的 RTC 2019 實時互聯網大會(2019.rtcexpo.org/) 邀請了來自聲網Agora、Hulu、依圖科技、南京大學等公司與高校的演講人,他們將從分享 AI 在移動端實時視頻超分辨率、音頻優化、傳輸優化、視頻內容推薦、音頻內容審覈等角度分享實踐經驗。細數下來,今年幾十個演講中,有近 1/3 的演講都與深度學習、神經網絡相關。函數

同時,在大會第一天上午的主會中,聲網Agora 首席科學家鐘聲、搜狗公司AI交互事業部高級總監、語音技術部負責人陳偉,也將圍繞 AI 與 RTC 深刻分享更多技術實踐與趨勢。性能

不過,對於剛剛入門神經網絡的開發者而言,可能須要要過許多彎路,咱們下面來總結一下訓練神經網絡的入門級知識點,從循環神經元的選擇、激活函數、過擬合,到優化器的選擇。學習

1.循環神經單元的選擇測試

若是神經網絡中須要用到循環神經單元,首先須要從多個現有模板裏選擇一個。單向循環神經單元如今主流的有RNN/LSTM/GRU,這幾個循環神經單元綜合來講性價比是RNN<LSTM<GRU。大數據

RNN是一個設計比較早的結構,缺點是每一個時間步的輸入的比重是同樣的,若是輸入的時間步過多,RNN會遺忘較早的信息。優化

LSTM是爲了解決上述RNN缺點而設計出來的,相比RNN,LSTM主要增長了4個門和1個細胞狀態,用來控制哪些信息須要遺忘,哪些信息須要記住,但LSTM的缺點是模型比較複雜,權重不少,比較難訓練且模型比較大。翻譯

GRU至關因而一個簡化版的LSTM,GRU只有三個門,而且融合了細胞狀態C和輸出狀態h,這樣GRU的計算複雜度和模型體積大概只有LSTM的3/4,而且更容易訓練。

除此以外,還有一個非主流的模型SRU,SRU使用大量哈達瑪乘積代替了傳統的矩陣點乘,而且當前時刻的輸出已經不依賴以前時間步的輸出,只依賴前一時刻的細胞狀態。該模型的一大優勢是能夠對其進行並行化優化,提高其在GPU上的計算性能。相同hidden layer數量的SRU的模型體積和計算複雜度大概是GRU的1/2,但偏差有所上升。SRU的詳細介紹能夠參考另一篇徵文。

2.激活函數的選擇

主流激活函數有sigmoid/tanh/relu/leakyrelu/prelu等。

值得一提的是,循環神經單元門內的激活函數通常是sigmoid,輸出的激活函數通常是tanh,這兩個通常來講不建議修改,錯誤的修改容易引發梯度爆炸。

relu系列主要是爲了解決深度神經網絡中梯度消失的問題,實際上,在relu設計出來以前,深度神經網絡仍是很依賴pretraining+finetuning這種方法的,relu的做用是和droupout/L1 regularization的功能相似,即便得部分權重失活,達到稀疏網絡的目的。

leakyrelu和prelu是relu的變種,這兩個激活函數在輸入爲負的時候仍有輸出,但負值輸入會被乘上一個權重,leakyrelu須要手動設置這個權重,prelu則會經過訓練獲得整個權重。性能上relu<leakyrelu<prelu,但prelu在訓練的時候須要額外的計算量,由於它多一個反向傳播。

推薦首選relu系列激活函數,由於它在大多數場景下都有較明顯的優點。

3.過擬合及防止過擬合的手段

過擬合近乎是訓練網絡時沒法避免的問題,嚴重的過擬合會在訓練集上跑出完美的結果,卻徹底沒法在測試集上工做。總的來講,目前防止過擬合的手段都圍繞着一個思想:稀疏網絡。

經常使用的防止過擬合的方法主要有:dropout、regularization,上述的relu系列激活函數也算是一種方法。整體來講,防止過擬合的思路是使網絡變得稀疏,稀疏能夠簡單理解爲把一個大網絡裏全部權重共同協做的方式改成大網絡裏多個小網絡並行計算,這種描述不太準確,但能夠大概這麼理解。dropout實現稀疏的方法比較直接,就是在訓練的時候隨機讓一些權重失活,在使用網絡時時恢復這些權重,並將輸出除以(1-α),其中α是dropout的比例。regularization的中文翻譯爲「正則化」,這個不太好理解,可能把它理解爲「限制」更好一些,它實際上是針對權重加了一個限制。regularization分爲L1 regularization和L2 regularization,L1 regularization是在反向傳播偏差時加上權重自己的一個一階範數,它的做用是,使得最終訓練出網絡的權重有更多的0值,實現了稀疏網絡的目的;L2 regularization是在權重上加了權重自己的二階範數,這使得最終訓練出網絡的權重都變小並趨近於0,但不等於0,也實現了稀疏網絡的目的。

關於爲何稀疏的網絡能夠防止過擬合,個人理解是,一個大網絡裏其實有好多權重是沒什麼用的,但這些權重計算出的信息會去很好的擬合訓練集,但會在驗證集和測試集上引入噪聲,所以,經過稀疏網絡,使得這些「無用權重」扮演的角色變小,網絡就能更好的擬合曆來沒見過的測試集。

4.優化器的選擇

優化器是訓練網絡時的梯度降低的方法,目前主流優化器有SGD、Adagrad、Adadelta、RMSprop、Adam、NAdam這幾種。

其中,SGD的全稱是stochastic gradient descent,它的思想是每次只訓練少許樣本進行梯度降低,優勢是相比以前的BGD(Batch gradient descent)佔用內存少一些,可以進行大數據量的訓練,缺點是由於每次只用少許樣本,可能loss是震盪降低的,所以SGD很依賴於部分超參的設置,如學習率在何時衰減對SGD來講是很是重要的,能夠暫時這麼說,若是SGD的超參設置的很是完美,那它就能訓練出最佳的模型,但通常來講這個是很難的。

Adagrad的最大特色在於它經過累計計算過去的梯度(就是導數),給不一樣參數不一樣的學習率,但這個優化器的一個最大的問題是,累計的梯度越大,學習率越小,很容易出如今訓練未結束時學習率就降低到很是低的問題。

Adadelta則修正了Adagrad的學習率降低過早的問題,它經過指數加權平均方法計算過去N個梯度值,再也不是從第一次訓練一直開始累積梯度,這樣就從必定程度上避免了上述問題。此外,Adadelta還能夠本身計算學習率,所以不須要預設。

RMSprop能夠看作Adadelta的一個超參特殊版,值得一提的是,RMSprop在訓練循環神經網絡時的表現不錯。

Adam是目前最容易被選擇的一個優化器,它能夠看作是RMSprop+Momentum,Momentum能夠計算過去訓練的累計梯度,若是歷史梯度降低方向和當前降低方向一致,學習率就會被增強,若是歷史梯度降低方向和當前方向不一致,學習率就會被減弱。須要注意的是,Momentum累計梯度時累計的是梯度自己的值,而上面幾個優化器自己累計梯度時累計的是梯度的平方,因此Momentum和優化器自己至關因而兩個並行的控制函數,這兩個函數的超參也是分別設置的。

NAdam至關於Adam+Nesterov,Nesterov至關於對Momentum又加了一個校訂,理論上能夠達到更好的效果,但問題是,施加這個校訂須要從新計算一遍梯度降低,因此NAdam的計算量差很少是Adam的兩倍,所以要慎用NAdam,除非不在乎訓練時間。

綜上,Adam是萬能公式,能夠在訓練循環神經網絡時嘗試RMSprop,儘可能避免使用SGD,除非對本身的調參能力很是自信。此外,Adam這種帶Momentum的優化器很容易在訓練末期陷入抖動,沒法降低到最優勢,一種比較麻煩的處理方法是,先使用Adam訓練,再換成SGD進行最後的收尾工做。

5.學習率的設置

學習率最重要的是初始值設定和衰減方法,初始值設定根據不一樣種類的目標有所不一樣,建議對於一個新的模型,開始不要嘗試太大的學習率,能夠用小一點的學習率,如0.001試一下,訓練完畢後,把偏差降低曲線打印出來,觀察loss曲線,理想的loss曲線應該是相似於y=1/x,若是曲線過於平滑,說明學習率過小,若是偏差曲線降低的很快並伴隨着上下波動,說明學習率過大。

衰減方法主要有按輪次衰減和根據loss衰減,以keras爲例,若是按照10輪訓練衰減一次,每次衰減一半,須要調用LearningRateSchedule():

若是想根據監控驗證集的loss調整學習率,須要調用ReduceLROnPlateau(),當連續n輪loss不降低,進行學習率的衰減。

  1. 其他細節

如下總結僅供參考,不必定對每一個task都起做用

(1)權重初始化:推薦orthogonal初始化,能夠有效避免梯度消失或爆炸,緣由可見這篇博文。

(2)Attention層:Attention層多用於語音識別或轉化,Attention經過對每一個timestep分配權重,設定了一個特定注意力區域,而不是把注意力都集中在最新時刻的輸入。如今講Attention的文章有不少,這裏就再也不贅述了。

(3)當多循環單元串聯時,建議不要修改循環單元內部激活函數,避免梯度爆炸。這就帶來一個問題,以GRU爲例,輸出狀態h通過的是一個tanh。若是隻單純串聯多個循環單元,整個網絡沒有relu來稀疏網絡,致使網絡性能降低。

建議多層串聯循環網絡架構以下:GRU-PRelu-TimeDistributed-tanh-GRU…,或者是GRU-PRelu-LayerNormalization-GRU…。這樣作的緣由是:加入Prelu用來稀疏網絡,加強網絡魯棒性;加入TimeDistributed用來實現更復雜的類Attention的功能;最後的激活函數選擇tanh是由於但願數據在輸入下一個循環單元前範圍限制在-1~1之間。LayerNormalization能夠重置數據的分佈,目的是和上述作法差很少的。

(4)Batch Normalization:該層能夠將輸入的批數據強行變成均值爲0,方差爲1的高斯分佈。理論上Batch Normalization層帶來的白化數據能夠加速訓練,但我實驗下來在RNN系列上偏差有所上升,且Batch Normalization性能依賴於batch size,對訓練機器的性能有考驗。推薦在RNN類的網絡上仍是使用LayerNormalization好一些。

(5)若是網絡沒有明顯的過擬合,或者只過擬合了一丟丟,在迴歸問題上建議不要使用Regularization,Regularization能夠較明顯的泛化網絡輸出結果,使得模型在測試集上的表現也出現必定降低。

(6)結合CNN的循環單元,若是須要使用,建議把CNN擱到循環單元后面。這麼作一是避免破壞原始輸入數據的時域相關特性,二是參考了這篇文章裏的實驗結果。

(7)關於數據預處理:數據歸一化在無特殊狀況下都是建議作的。關於變化域的數據預處理,以前嘗試過對信號進行PCA後輸入到神經網絡,但出現了部分白化後數據梯度爆炸的現象,並且PCA沒有帶來很明顯的正向增益,卻會引入必定複雜度,在數據預處理時,須要謹慎選用PCA,但PCA能夠有效實現降維,當數據維數過大致使網絡難以擬合時,PCA是一個不錯的選擇。

(8)Loss function的肯定:對於迴歸問題來講,若是數據是歸一化的,建議使用MAE或其近似變種就好,MSE可能會使其性能降低。分類問題暫時沒有作過相關項目,就不寫了。

(9)網絡架構的優化:循環神經網絡主要的模型體積和計算複雜度來源於那幾個門控單元,其隨着門控單元隱層數量平方級增長,除了剪枝等方法,一種簡單的優化方法是,把大的循環單元拆分紅多個小的循環單元,儘可能減小大矩陣相乘的次數。但這樣須要更多巧妙的小設計去彌補帶來的偏差,能夠參考已有相似網絡的設計,如Wavenet等。

相關文章
相關標籤/搜索