您當前的位置:首頁 > 繪畫

機器學習中的編碼器-解碼器結構哲學

作者:由 SIGAI 發表于 繪畫時間:2019-10-21

原創宣告:本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不能用於商業目的。

其它機器學習、深度學習演算法的全面系統講解可以閱讀

《機器學習-原理、演算法與應用》

,清華大學出版社,

雷明著

,由SIGAI公眾號作者傾力打造。

書的購買連結

書的勘誤,最佳化,原始碼資源

本文PDF下載連結:機器學習中的編碼器-解碼器結構哲學

導言

機器學習中體現著各種工程和科學上的哲學思想,大的有整合學習,沒有免費午餐,奧卡姆剃刀;小的有最大化類間差異、最小化類內差異。對於很多問題,存在著一類通行的解決思路,其中的一個典型代表就是“編碼器-解碼器”結構。這一看似簡單的結構,背後蘊含的工程思想卻非常值得我們學習和品味。

在這篇文章中,我們將各種演算法中採用的這一思想貫通起來介紹,以更好的形成脈絡。限於篇幅,無法做非常詳細的介紹,本文所講的演算法在《機器學習與應用》,雷明著,清華大學出版社一書中大都有詳細的講解。其中PCA位於“第7章-資料降維”,自動編碼器位於“第14章-深度學習概論”,全卷積網路位於“第15章-卷積神經網路”,序列到序列學習位於“第16章-迴圈神經網路”。編碼器CNN-解碼器RNN位於“第16章-迴圈神經網路”,編碼器RNN-解碼器CNN位於“第17章-生成對抗網路”。變分自動編碼器在後續的版本中可能會加入,此書在持續最佳化中,對於讀者提出的第一版存在的問題,下一版會做大幅度的改進,敬請關注!

編碼器-解碼器結構在我們的日常生活中並不陌生。電話就是最典型的例子,它將聲音訊號編製成電訊號,經過傳輸之後,在另外一端再將電訊號恢復成聲音訊號。這樣,對方就能在千里之外聽到你的聲音。在這裡,電訊號是聲音訊號的另外一種表示,這是物理上的變換,解碼和編碼透過硬體實現。

在機器學習中,很多問題可以抽象出類似的模型:

機器翻譯。將一種語言的句子轉化成另外一種語言的句子。

自動摘要。為一段文字提取出摘要。

為影象生成文字解說。將影象資料轉化成文字資料。

根據一段文字描述生成影象。這是上面問題的反過程,將文字轉化成影象。

其它的例子我們就不一一列舉。在這些問題中,我們需要將輸入資料轉化成另外一種輸出資料,二者之間有機率關係。例如,對於機器翻譯來說,二者有相同的語義。

直接用一個函式完成這個轉化

y=f(x)

可能會存在困難。例如對機器翻譯來說輸入和輸出的長度是不固定的,二者還可能不相等。因此我們需要曲線救國,先將輸入資料

x

轉化成一種中間資料

z

,再從z映射出

y

。這就是編碼器、解碼器結構。就像我們無法將聲音直接傳送到很遠的地方去一樣,藉助於電訊號這樣的中間表示,我們可以更好的完成任務。接下來將列舉出機器學習中一些典型的編碼器-解碼器結構演算法。

從PCA說起

主成分分析是一種經典的無監督資料降維演算法。它將一個高維的向量x對映成一個低維的向量y,前提條件是y很好的保留了x的主要資訊。在做資料降維時,我們執行如下變換

y = W(x-m)

計算過程很簡單,先減掉均值向量,然後左乘投影矩陣即可。其中

m

是樣本集的均值向量,

W

是投影矩陣,透過樣本集計算得到,具體的原理可以參考PCA的教程。這一投影過程的作用類似於編碼器,將高維向量

x

編碼成低維向量

y

有些時候,我們需要從降維後的向量

y

重構出原始的向量

x

,這可以透過資料重構演算法實現,計算公式很簡單

W^Ty + m

這剛好和投影演算法相反,是先左乘投影矩陣W的轉置, 然後加上均值向量。在這裡,重構演算法可以看作是解碼器,從降維後的向量解碼出原始的訊號。

自動編碼器

自動編碼器(Auto-Encoder,簡稱AE)是一種特殊的神經網路,用於特徵提取和資料降維絡。最簡單的自動編碼器由一個輸入層,一個隱含層,一個輸出層組成。隱含層的對映充當編碼器,輸出層的對映充當解碼器。

訓練時編碼器對輸入向量進行對映,得到編碼後的向量;解碼器對編碼向量進行對映,得到重構後的向量,它是對輸入向量的近似。編碼器和解碼器同時訓練,訓練的目標是最小化重構誤差,即讓重構向量與原始輸入向量之間的誤差最小化,這與PCA非常類似。因此樣本

x

的標籤值就是樣本自身。

訓練完成之後,在預測時只使用編碼器而不再需要解碼器,編碼器的輸出結果被進一步使用,用於分類,回個等任務。

下圖是自動編碼器的一個例子。輸入資料是6維向量,因此輸入層有6個神經元;隱含層有3個神經元,對應編碼後的向量;輸出層有6個神經元,對應重構後的向量。

機器學習中的編碼器-解碼器結構哲學

訓練時先經過編碼器得到編碼後的向量,再透過解碼器得到解碼後的向量,用解碼後的向量和原始輸入向量計算重構誤差。如果編碼器的對映函式為

h

,解碼器的對映函式為

g

,訓練時最佳化的目標函式為:

\min \frac{1}{2l} \sum^l_{i=1}\left \|  x_i - g_{{\theta}

這裡採用了歐氏距離損失。其中為訓練樣本數,

\theta

{\theta}

是分別是編碼器和解碼器要確定的引數。

變分自動編碼器

變分自動編碼器(Variational Auto-Encoder,簡稱VAE)[1]是一種深度生成模型,用於生成影象,聲音之類的資料,類似於生成對抗網路(GAN)。雖然也叫自動編碼器,但和標準的自動編碼器有很大的不同,二者用於完全不同的目的。

現在考慮資料生成問題,如寫字,最簡單的是寫出MNIST資料集這樣的手寫數字

機器學習中的編碼器-解碼器結構哲學

如果我先收集一些訓練樣本,然後讓演算法原樣輸出它們,當然也可以完成寫字,但這樣生成的樣本完全就沒用多樣性了。因此一般的解決思路是先生成一些隨機數,然後對其進行變換,生成我們想要的複雜的樣本資料。這一過程如下圖所示

機器學習中的編碼器-解碼器結構哲學

問題是,這個簡單的隨機數,該怎麼生成呢,應該服從何種機率分佈?它們可以代表筆畫特徵,字型寬度,清晰角度,字型型別等資訊,但如果這樣人工設計,一是費時費力,二是具有侷限性。因此我們會想到:能不能從文字影象中先學習中這些特徵,然後對這些特徵進行隨機擾動,生成新的樣本?變分自動編碼器就採用了這種思路。其結構如下圖所示

機器學習中的編碼器-解碼器結構哲學

這裡的隱變數可以看做是從影象中學習得到的特徵。同樣的,編碼器和解碼器同時訓練,訓練時的目標是下面方程的右端

\log p(x) -D_{KL}\left [ q(z|x) \right ||p(z|x)] = E_{z-q}\left [ \log p(x|z) \right ] - D_{KL}\left [ q(z|x)||p(z) \right ]

由於原理較為複雜,在這裡我們不做深入的講解。訓練完成之後,預測階段可以直接生成樣本。具體做法是,從正態分佈

Z\sim N(0,I)

產生一個隨機數,然後送入解碼器中,得到預測結果,即為生成的樣本。此時已經不再需要編碼器,另外需要強調的是,也不需要對隨機數進行均值和方差變換。

機器學習中的編碼器-解碼器結構哲學

密集預測-全卷積網路

影象分割的目標是確定影象中每個畫素屬於什麼物體,即對所有畫素進行分類,是一個逐畫素預測的密集預測問題。卷積網路在進行多次卷積和池化後會縮小影象的尺寸,最後的輸出結果無法對應到原始影象中的每一個畫素,卷積層後面接的全連線層將影象對映成固定長度的向量,這也與分割任務不符。針對這兩個問題設計出了全卷積網路(FCN)[2][3],它全掉了卷積神經網路中的全連線層,全部用卷積代替,為了從前面的卷積特徵影象得到與原始輸入影象尺寸相等的輸出影象,採用了反捲積運算。

這種模型從卷積特徵影象預測出輸入影象每個畫素的類別。網路能夠接受任意尺寸的輸入影象,併產生相同尺寸的輸出影象,輸入影象和輸出影象的畫素一一對應。這種網路支援端到端、畫素到畫素的訓練。

FCN的前半部分是卷積層和池化層,充當編碼器,從輸入影象中提取特徵。網路的後半部分是反捲積層,充當解碼器,從特徵中解碼出結果影象。典型的網路結構如下圖所示

機器學習中的編碼器-解碼器結構哲學

文獻[3]提出的SegNet語義分割網路更為複雜。網路的前半部分是編碼器,由多個卷積層和池化層組成。網路的後半部分為解碼器,由多個上取樣層和卷積層構成。解碼器的最後一層是softmax層,用於對畫素進行分類。

編碼器網路的作用是產生有語義資訊的特徵影象;解碼器網路的作用是將編碼器網路輸出的低解析度特徵影象映射回輸入影象的尺寸,以進行逐畫素的分類。整個網路的結構如下圖所示

機器學習中的編碼器-解碼器結構哲學

序列到序列學習

有些問題輸入序列的長度和輸出序列不一定相等,而且我們事先並不知道輸出序列的長度。以機器翻譯為例,將一種語言的句子翻譯成另外一種語言之後,句子的長度即包括的單詞數量一般是不相等的。

英文句子“what‘s your name”是3個單片語成的序列,翻譯成中文為“你叫什麼名字”,由4個漢字片語成。標準的RNN無法處理這種輸入序列和輸出序列長度不相等的情況,解決這類問題的一種方法是序列到序列學習(Sequence to Sequence Learning,簡稱seq2seq)技術[4]。

seq2seq由兩個迴圈神經網路組成,它能實現從一個序列到另外一個序列的對映,兩個序列的長度可以不相等。seq2seq框架包括兩部分,分別稱為編碼器和解碼器,它們都是迴圈神經網路。這裡要完成的是從一個序列到另外一個序列的預測:

S_{src} \rightarrow S_{dst}

前者是源序列,後者是目標序列,二者的長度可能不相等。

用於編碼器的網路接受輸入序列,最後時刻

T

產生的隱含層狀態值

h_r

作為序列的編碼值,它包含了時刻1到

T

輸入序列的所有資訊,在這裡我們將其簡寫為

v

,這是一個固定長度的向量。用於解碼的網路每個時刻的輸入值為

v

y_t

,它可以計算目標序列

y_1,\cdots,y_{T

的條件機率

p(y_1,\cdots,y_{T

對於機器翻譯而言,編碼器依次接收源語言句子的每個詞,最後得到語義向量

v

。解碼器首先輸入bos,即句子的開始,根據它和

v

預測出下一個詞使用每個詞的機率,挑選出機率最大的一個或幾個詞。接下來將這個詞與v送入解碼器,得到幾下一個此,如此迴圈,直到得到eos,即句子的結尾,翻譯結束。這裡使用了集束搜尋(beam search)技術。下圖是用seq2seq做機器翻譯的原理示意圖。

機器學習中的編碼器-解碼器結構哲學

CNN與RNN的結合

前面介紹的FCN是CNN和CNN的結合,seq2seq是RNN和RNN的結合。在編碼器-解碼器框架中,CNN和RNN可以雜交,誰充當編碼器,誰充當解碼器,都是可以的,可靈活組合用於各種不同的任務。

從影象到文字

這類任務是指為影象或影片生成文字解說[5]。這是從影象到文字的對映,在這裡,CNN是編碼器,用於提取出影象的語義特徵。RNN充當解碼器,其輸入為影象的語義特徵,輸出不固定長度的文字序列。這一結構如下圖所示

機器學習中的編碼器-解碼器結構哲學

從文字到影象

這是上一類任務的反過程。現在面臨一個相反的問題:由一段文字來生成影象。文獻[6]提出了一種用迴圈神經網路和深度卷積生成對抗網路解決這一問題的方法,將視覺概念從文字變成畫素表示。下圖是一些結果

機器學習中的編碼器-解碼器結構哲學

和機器翻譯類似,採用編碼器-解碼器框架。第一步是將一段文字轉換成向量表示,即文字的語義資訊,透過一個深度卷積網路和一個迴圈神經網路為文字產生向量輸出,這個輸出和影象對應。

演算法的第二步是在第一步生成的文字向量基礎上訓練一個生成對抗網。在這裡生成模型是一個深度卷積網路,負責生成影象。生成器網路實現的對映為

\mathbb{R} ^z \times \mathbb{R} ^T \rightarrow \mathbb{R} ^D

其中為文字描述向量化後的向量維數,為隨機噪聲的維數,是生成的影象的維數。生成網路接受隨機噪聲向量和文字的特徵向量作為輸入,輸出指定大小的影象。

參考文獻

[1] Carl Doersch。 Tutorial on Variational Autoencoders。 2016, arXiv: Machine Learning。

[2] Long J, Shelhamer E, Darrell T, et al。 Fully convolutional networks for semantic segmentation。 Computer Vision and Pattern Recognition, 2015。

[3] Vijay Badrinarayanan, Alex Kendall, Roberto Cipolla。 SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation。

[4] Ilya Sutskever, Oriol Vinyals, Quoc V Le。 Sequence to Sequence Learning with Neural Networks。 neural information processing systems。 2014。

[5] J。Donahue, L。A。Hendricks, S。Guadarrama, M。Rohrbach, S。Venugopalan, K。Saenko, and T。Darrell。 Long-term recurrent convolutional networks for visual recognition and description。 arXiv preprint arXiv:1411。4389, 2014。

[6] S Reed, Zeynep Akata, Xinchen Yan, Lajanugen Logeswaran, Bernt Schiele,Honglak Lee。 Generative Adversarial Text to Image Synthesis。 international conference on machine learning, 2016。

標簽: 編碼器  解碼器  向量  影象  卷積