ALI的Tensorflow炼成与GAN科普
Abstract:Deep Learning是一個很大的領域,其中GAN是Deep Learning的明星,希望大家可以通過本文來簡單的了解一下GAN這個模型以及這個模型的一些運用。本文介紹關于GAN的一些知識以及GAN的思想如何轉(zhuǎn)移到ALI中,以及通過Google的Deep Learning框架TensorFlow,通過MNIST數(shù)據(jù)來實現(xiàn)ALI模型。所涉及到Tensorflow的一些很簡單的一些解說,包括tf.Variable()和tf.placeholder()的一些用法以及區(qū)別,同時給出一小段代碼案例。雖然提到了最簡單的兩個Tensorflow,tf.Variable()和tf.placeholder(),但是在本文中,不深入解釋更多的關于TensorFlow的運用以及神經(jīng)網(wǎng)絡是如何搭建的。最后,我們將結(jié)果組合成模型。
使用Tensorflow建立ALI模型
背景
由于這次做項目的時候用到ALI這個Model,朋友希望自己能夠為ALI和GAN來寫一點自己的想法,故作此文。
生成模型已經(jīng)成為建復雜高維數(shù)據(jù)集模型的常用的框架,面對復雜性時如同降維二向箔打擊。
什么是ALI模型?
ALI(adversarially learned inference),中文直譯過來呢,就是對抗學習推理了吧?
在這里簡單的給大家介紹一下ALI模型。既然有一個Adversarial在里面,那想必就和GAN有一點關系了。而GAN(Generative Adversarial Networks)即“生成對抗網(wǎng)絡”就是Deep Learning入門神書的作者Ian Goodfellow的神作。
GAN的idea就是同時訓練兩個模型,一個生成模型,一個Discriminative Model。我們把生成模型簡寫成G,Discriminative Model簡稱為D。而實現(xiàn)的方法,是讓兩個網(wǎng)絡相互競爭。
生成模型是用來獲取數(shù)據(jù)的分布情況的,而D則是用來估計來自訓練數(shù)據(jù)的概率的。生成模型的訓練過程就是想辦法把D的錯誤概率給最大化。在任意函數(shù)G和D的空間中,存在唯一的解決方案,G恢復訓練數(shù)據(jù)分布,D等于1/2。在G和D由多層感知器定義的情況下,整個系統(tǒng)可以用BP來進行訓練。
在Training或Generating樣本的期間,不需要任何馬爾科夫鏈或展開的近似推理網(wǎng)絡。,也就是活生生的把推理給繞過去了。當然還有Autoregressive Approaches(自回歸方法)放棄潛在的表征,而是直接對輸入變量之間的關系進行建模。或多或少的砍掉或者放棄掉一些東西。
自回歸模型可以生成相當出色的樣本,但是犧牲掉了速度。同時其要求學習之前數(shù)據(jù)的抽象表達。而基于GAN的方法代表了一個很好的妥協(xié):他們學習一個生成模型,生成比最佳VAE技術更高質(zhì)量的樣本,而不犧牲采樣速度,并且還利用潛在代表在生成過程中。然而,GAN缺乏有效的推理機制,使得GANs無法在抽象層面推理數(shù)據(jù)。因此大牛們在研究如何優(yōu)雅的將GANs其他的方法進行結(jié)合,出雜交種,其實本質(zhì)意義上就是在兩個短板中互相妥協(xié)罷了。
ALI是個通過Generation Network和Inference Network。 兩個Model來對懟。也就是將Inference Machine(或encoder)和深度定向G Model(decoder)投入到類似GAN的對抗框架中學習。
訓練一個鑒別器,以便將來自解碼器的聯(lián)合樣本的數(shù)據(jù)和相應的潛在變量的聯(lián)合樣本與編碼器(或近似后驗)區(qū)分開,而編碼器和解碼器被一起訓練以愚弄鑒別器。我們不僅要求鑒別器區(qū)分合成樣本與實際數(shù)據(jù),而且要求它區(qū)分數(shù)據(jù)空間和潛在變量之間的兩個聯(lián)合分布。生成網(wǎng)絡將樣本從隨機潛在變量映射到數(shù)據(jù)空間,而推理網(wǎng)絡將數(shù)據(jù)空間中的訓練示例映射到潛在變量的空間。
ALI概念圖
我們可以針對GAN得出以下構(gòu)想:
兩個一個生成器,一個判別器共兩個神經(jīng)網(wǎng)絡重復博弈。
今天用Tensorflow實現(xiàn)一下,同時解釋一些Tensorflow的Concept
在這里,我們設置好我們的參數(shù)。
導入大名鼎鼎的MNIST數(shù)據(jù)
一個簡單的科普
很多人其實經(jīng)常就是Tensorflow的第一步就愣住了,臥槽???這是什么玩意???為了讓大家不至于——“臥槽這是什么玩意?”簡單的給大家說一下tf.placeholder:
其實大家看模型的時候(包括看Keras或者TensorLayer),其實經(jīng)常可以看到兩個很經(jīng)典東西:
tf.Variable()tf.placeholder()這兩個有什么區(qū)別呢?
為了訓練我們的example,我們首先要立個placeholder。tf.placeholder是用來feed我們需要訓練的example的,同時tf.placeholder是必須用feed_dict來fed!!!
給大家舉個例子:
在這里呢,sess.run(y_example)是會被弄死的,因為你只能用feed_dict來fed我們的tf.placeholder,但是我們對比一下tf.Variable的話,tf.Variable是通過run()調(diào)用來維護狀態(tài)的,也就是說,在之前的我們的sess.run(y_example)是可以受用于tf.Variable的。
通過構(gòu)造tf.Variable來向圖中添加變量。同時tf.Variable()的構(gòu)造函數(shù)需要給定任何類型和形狀的Tensor變量的初始值。初始值定義變量的類型和形狀,其變量的type和shape是固定的。因此,在這里我們主要使用tf.placeholder來feed我們需要訓練的example的。
OK,現(xiàn)在進入正題
先定義幾個簡單的小函數(shù),包括一些必要的log和sample的函數(shù)以及后期用到的導出結(jié)果的可視化函數(shù)。
由于這一環(huán)節(jié)沒有任何的難點,不做多余闡述:
在這里解釋一下Q、P、D三個函數(shù):? Q函數(shù),將
現(xiàn)在我們通過tf.Session()來跑模型。最后,說一下這個很經(jīng)常出現(xiàn)Session()。Tensorflow以Graph的計算而得名,而Session()封裝了執(zhí)行Operation對象的環(huán)境。通過Session可以執(zhí)行圖的計算。與Session相近的有tf.InteractiveSession()? tf.InteractiveSession()將自己安裝為構(gòu)建中的默認Session。而簡單直接的方法也有這般:
常規(guī)會話會在with語句中創(chuàng)建時將其自身作為默認會話。一般我們在代碼中的用法是這樣的,我也比較常用Session()這個方法就是了:
總結(jié)一下一般的啟動邏輯:
因此,tensorflow就將底層給配置好之后,我們在tensorflow這個大環(huán)境里愉快的奔跑。而難點就在于Variable的各種的設置和run的操作方法。初期,Variable被大量的套路給設定好,我們可以通過別人的輪子,來配適。
但是Deep Learning的從業(yè)者的核心價值應該在于能夠自己的將自己想做的數(shù)據(jù)導入自己的模型,而不是簡單的調(diào)參或者利用別人的輪子滾來滾去。各種算法和一些主流的實現(xiàn)就像加減乘除一般了然于胸,并且有自己做輪子的能力。
將模型訓練十萬次(如果有想法的,請換一臺支持GPU的電腦,要不然可能會等很久。),我們將1000Iteration為一個單位,print一次:
由于導出大量的圖片,我在這里就給大家看一下對比圖,? 最早的圖:
不久之后:
本文由ALI Paper, arxiv依照Tensorflow重現(xiàn)。ALI的概念非本人提出,本人根據(jù)自己對ALI的理解通過Tensorflow進行實現(xiàn),并且運行于Jupyter中。所有代碼在Windows10,Python3.5,TensorflowGPU版(1.1.0rc2)完美運行。限于本人水平,可能有出現(xiàn)一定的錯誤,如有失誤,歡迎交流。同時,由于本人學習Deep Learning的時候直接接觸英文材料,故一些專有名詞的翻譯可能存在一些偏差。故一些專有名詞直接保留為原單詞,不做翻譯。ALI的翻譯沒有參考過任何相關中文信息,由本人直接查閱在Arxiv上ALI的原文所得。如果有想來交流的小伙伴,歡迎私信。? Reference
1、ALI Paper, arxiv
2、GAN - Paper, NIPS
3、GAN - Goodfellow
4、生成模型與判別模型 zouxy09,csdn
5、Adversarial machine learning - ACM Digital Library
Running Graph
原文發(fā)布時間為:2017-05-15? 本文作者:那只貓 本文來自云棲社區(qū)合作伙伴“Python中文社區(qū)”,了解相關信息可以關注“Python中文社區(qū)”微信公眾號
總結(jié)
以上是生活随笔為你收集整理的ALI的Tensorflow炼成与GAN科普的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 中Lock的使用
- 下一篇: php数组根据指定列排序