這篇論文中提出了一個基於pixelRNN/CNN上進行改進的一個模型——gated pixelCNN。 gated pixelCNN依舊還是一個圖片生成模型。它基於對像素點的概率分布進行建模,只要給這個模型一組描述性的向量(這些向量可以是一組具有描述性的標簽,gated pixelCNN就可以生成大量的有變化的圖片。 ———-
圖片生成模型
生成模型是一種訓練模型進行無監督學習的模型,希望從數據中學習到信息后的模型能夠生成一組和訓練集盡可能相近的數據。 圖片生成模型就是更具體的指向說給模型一組圖片作為訓練集讓模型進行學習https://img-,圖像生成模型又可以根據模型對像素點分布的預測情況進一步細分。  其中當下最流行的三種圖片生成器模型當屬:pixelRNN/CNN、VAE、GAN。 -**自回歸模型**:auto regressive models,一種概率圖形模型,進行圖片再生成) -**生成對抗網絡**:GAN(generative adversarial network),分別是生成器網絡和判別式網絡來聯合進行建模 ———-
pixelRNN/CNN
怎么想
現在需要構建一個模型來實現生成一張圖片,同時將前面生成的像素點作為參考。相當於將預測一張圖上所有像素點的聯合分布轉換為對條件分布的預測。
這里的xixi就是指在ii處的像素點。
怎么做
既然是用已經預測得到的像素來預測當前點的像素,那么就應該可以想到用RNN來建模。因此這個模型就叫pixelRNN。 在pixelRNN中用了12個兩維LSTM層。 在《pixel recurrent neural networks》這篇論文中,由於本文是對gated pixelCNN進行梳理,所以pixel RNN的訓練時間特別長,那為什么不可以使用 CNN來進行建模呢?用CNN構建出來的模型叫pixelCNN。 但是標准的卷積層會把所有像素的信息一次性進行提取,用到masked convolutions以及去掉池化層來進行建模。
masked convolutions


這是一個5*5的掩膜卷積核。它的作用就是只保留中心點處之前的像素信息。
可以看到當要提取中心點的像素信息的時候,右邊和后面的像素信息被“遮蓋”住了,maskA這種掩膜的傳遞方式是不傳遞給自己,為什么三個通道之間的傳遞關系是這樣的,所以像素的信息傳遞不僅僅是基於前后的context的像素點信息的傳遞,R算是前面的信息,B是后面的信息,同樣的,在pixelCNN中,后面所有的層上都是使用的maskB這種掩膜。
可以看到兩種mask的區別就是在信息傳遞上RGB這三個通道中像素點信息是否傳遞給自己這一點上有不同。可以看到,maskB這種方式是信息要傳遞給自己。
這里還需要進行說明,因為每個點的像素信息是由RGB這三個通道的值構成的,還有自己的三個通道上面的值的一個傳遞。而按照RGB的位置順序來說,G屬於中間的信息,所以在記錄當前像素點的R通道上面的信息時就不能把后面的GB信息當作已知條件,在記錄當前像素點的B通道上的信息時可以將RG兩個通道上的信息當作已知條件。所以可以看到有這樣的傳遞關系。
論文中提到,只有在第一個卷積層上使用了maskA,所以不管是生成圖片的過程還是訓練的過程,所以速度較慢,所以訓練時間較pixelRNN有提高,這里也不展開多說。 ———-
gated pixelCNN
為什么要從pixelCNN到gated pixelCNN
gated pixelCNN是在pixelCNN上進行了某些改進的到的,從表現效果上面看,但是模型的效果並沒有它好,pixelCNN存在“盲點”問題。在生成圖像的時候因為使用了mask的原因,可以推測是因為pixelRNN模型中每一個LSTM層都能夠獲取到之前像素的所有信息。
而在CNN中,獲取到的信息也在不斷增多。
所以如果能夠合理增加pixelCNN中的卷積層,pixelRNN表現效果不錯,這些單元可以幫助模型的神經元之間有更加復雜的聯系。所以,可以將masked convolutions之間的簡單線性鏈接單元換成和RNN中門與門之間的激活方式一樣的連接方式:
其中σσ是sigmoid激活函數,�8�6指元素之間的點乘運算,這也是為什么改進之后的這個模型叫gated pixelRNN的原因。
“盲點”問題
要如何改進“blind spot”問題,論文中分別叫這兩種卷積網絡horizonal stack和vertical stack。
Horizonal stack是將當前像素所在的行(當然也是指當前像素之前的像素值)作為條件進行卷積,在horizonal stack中仍然要使用掩膜技術來實現只提取前面的信息。
Vertical stack是將當前像素所在的行的前面所有行當作條件來進行卷積,所以vertical stack中不進行掩膜操作。

將每一層的兩種stacks的結果進行結合,這樣就消除了“盲點”問題。
所以使用門的技術和更多的卷積層來提高pixelCNN的表現效果,就得到了論文最終想要的模型gated pixelCNN。


改后的gated pixelCNN的作用
論文中提到
這仍然是一個基於像素的概率分布進行預測的圖像生成器(生成式模型)。
論文中還提到
只要給這個模型一組描述性的向量,用ImageNet數據集中的分類標簽(一組描述性的標簽)進行生成圖像,比如說動物、風景等等;如果是用由其它卷積網絡中間生成的沒見過的人臉照片(其他網絡生成的向量)輸入pixel CNN模型中,論文中也提到
如果把門這種元件納入條件pixelCNN中,可以使pixelCNN的性能達到和pixelRNN的性能一樣好,所以gated pixelCNN仍然可以在訓練好模型之后直接進行圖片生成。在論文中作者在CIFAR-10這個數據集上訓練了gated pixelCNN模型, training performance in brackets.
這里的NLL值是指負對數似然的值,這個值越小越好。
可以看到gated pixelCNN的效果已經在pixelCNN上得到了很大的提升, training performance in brackets.可以看到,可以看到gated pixel CNN的效果已經非常好了。
conditional gated pixelCNN
Gated pixel CNN作為一個條件圖片生成器就是指,添加一些先驗信息來使生成的圖片往我們想要的方向生成。上面提到的給模型一組向量來生成圖片就是指作為conditional gated pixelCNN的作用。
p(X|h)=∏i=1n2p(xi|x1...xi�6�11h)p(X|h)=∏i=1n2p(xi|x1,xi�6�11y=tanh(Wkf�6�5X+VTkfh)�8�6σ(Wkg�6�5x+VTkgh)y=tanh(Wk,fTh)�8�6σ(Wk,gTh)
這里的hh就是我們給的一個先驗信息hh可以以兩種方式提供給模型:一組描述性的標簽;基於其他網絡生成的向量。
hh是a one-hot encoding that specifies a class
若hh是a one-hot encoding that specifies a class,gated pixel CNN可以准確的生成這個種類hh只告訴模型要生成的東西是什么,訓練好的模型會生成大量基於不同地點的圖片。
更NB的地方是,hh甚至可以直接是imagenet 這個數據集中1000類別里面的類別id,作者訓練pixelCNN生成了八種不同類型的動物圖片,但是場景相似。Figure 3: Class-Conditional samples from the Conditional PixelCNN.
hh是基於其他網絡生成的向量
若hh是一個用由其它卷積網絡中間生成的沒見過的人臉信息,然后給模型一張不在整個訓練集中的完全陌生的人臉信息給模型,一個auto-encoder由兩部分組成,encoder部分就是將輸入的圖片降維變成一個低緯度表示的特征hhhh送入decoder中hh進行重構,它將encoder中生成的hh作為條件輸入,作者在ImageNet上訓練了一個gated pixelCNN auto-encoder,最后生成的圖片效果如下:
Figure 6: Left to right: original image,conditional samples from a PixelCNN auto-encoder. Both auto-encoders were trained end-to-end with a m = 10-dimensional bottleneck and a m = 100 dimensional bottleneck.
最左邊的這個張圖是原圖,右邊的是gated pixel CNN生成的圖片。可以看到,而gated pixelCNN在盡力去生成不同的但是相似的圖像。
總結
最后作者對整個模型進行了一個總結,作者指出,gated pixel CNN可以生成在不同光照條件下的圖片,所以gated pixel CNN可以客服生成模型中訓練集光照條件不好的問題。