專 欄 作者GitHub ID:
使用Tensorflow建立ALI模型 背景 生成模型已經(jīng)成為建復(fù)雜高維數(shù)據(jù)集模型的常用的框架,面對復(fù)雜性時(shí)如同降維二向箔打擊。 什么是ALI模型? 在這里簡單的給大家介紹一下ALI模型。既然有一個Adversarial在里面,那想必就和GAN有一點(diǎn)關(guān)系了。而GAN(Generative Adversarial Networks)即“生成對抗網(wǎng)絡(luò)”就是Deep Learning入門神書的作者Ian Goodfellow的神作。 GAN的idea就是同時(shí)訓(xùn)練兩個模型,一個生成模型,一個Discriminative Model。我們把生成模型簡寫成G,Discriminative Model簡稱為D。而實(shí)現(xiàn)的方法,是讓兩個網(wǎng)絡(luò)相互競爭。 生成模型是用來獲取數(shù)據(jù)的分布情況的,而D則是用來估計(jì)來自訓(xùn)練數(shù)據(jù)的概率的。生成模型的訓(xùn)練過程就是想辦法把D的錯誤概率給最大化。在任意函數(shù)G和D的空間中,存在唯一的解決方案,G恢復(fù)訓(xùn)練數(shù)據(jù)分布,D等于1/2。在G和D由多層感知器定義的情況下,整個系統(tǒng)可以用BP來進(jìn)行訓(xùn)練。 在Training或Generating樣本的期間,不需要任何馬爾科夫鏈或展開的近似推理網(wǎng)絡(luò)。,也就是活生生的把推理給繞過去了。當(dāng)然還有Autoregressive Approaches(自回歸方法)放棄潛在的表征,而是直接對輸入變量之間的關(guān)系進(jìn)行建模?;蚨嗷蛏俚目车艋蛘叻艞壍粢恍〇|西。 自回歸模型可以生成相當(dāng)出色的樣本,但是犧牲掉了速度。同時(shí)其要求學(xué)習(xí)之前數(shù)據(jù)的抽象表達(dá)。而基于GAN的方法代表了一個很好的妥協(xié):他們學(xué)習(xí)一個生成模型,生成比最佳VAE技術(shù)更高質(zhì)量的樣本,而不犧牲采樣速度,并且還利用潛在代表在生成過程中。然而,GAN缺乏有效的推理機(jī)制,使得GANs無法在抽象層面推理數(shù)據(jù)。因此大牛們在研究如何優(yōu)雅的將GANs其他的方法進(jìn)行結(jié)合,出雜交種,其實(shí)本質(zhì)意義上就是在兩個短板中互相妥協(xié)罷了。 ALI是個通過Generation Network和Inference Network。 兩個Model來對懟。也就是將Inference Machine(或encoder)和深度定向G Model(decoder)投入到類似GAN的對抗框架中學(xué)習(xí)。 訓(xùn)練一個鑒別器,以便將來自解碼器的聯(lián)合樣本的數(shù)據(jù)和相應(yīng)的潛在變量的聯(lián)合樣本與編碼器(或近似后驗(yàn))區(qū)分開,而編碼器和解碼器被一起訓(xùn)練以愚弄鑒別器。我們不僅要求鑒別器區(qū)分合成樣本與實(shí)際數(shù)據(jù),而且要求它區(qū)分?jǐn)?shù)據(jù)空間和潛在變量之間的兩個聯(lián)合分布。生成網(wǎng)絡(luò)將樣本從隨機(jī)潛在變量映射到數(shù)據(jù)空間,而推理網(wǎng)絡(luò)將數(shù)據(jù)空間中的訓(xùn)練示例映射到潛在變量的空間。 ALI概念圖 我們可以針對GAN得出以下構(gòu)想: 兩個一個生成器,一個判別器共兩個神經(jīng)網(wǎng)絡(luò)重復(fù)博弈。 今天用Tensorflow實(shí)現(xiàn)一下,同時(shí)解釋一些Tensorflow的Concept 在這里,我們設(shè)置好我們的參數(shù)。 導(dǎo)入大名鼎鼎的MNIST數(shù)據(jù) 一個簡單的科普 很多人其實(shí)經(jīng)常就是Tensorflow的第一步就愣住了,臥槽???這是什么玩意???為了讓大家不至于——“臥槽這是什么玩意?”簡單的給大家說一下tf.placeholder: 其實(shí)大家看模型的時(shí)候(包括看Keras或者TensorLayer),其實(shí)經(jīng)??梢钥吹絻蓚€很經(jīng)典東西:
這兩個有什么區(qū)別呢? 為了訓(xùn)練我們的example,我們首先要立個placeholder。tf.placeholder是用來feed我們需要訓(xùn)練的example的,同時(shí)tf.placeholder是必須用feed_dict來fed?。。?/span> 給大家舉個例子: 在這里呢,sess.run(y_example)是會被弄死的,因?yàn)槟阒荒苡胒eed_dict來fed我們的tf.placeholder,但是我們對比一下tf.Variable的話,tf.Variable是通過run()調(diào)用來維護(hù)狀態(tài)的,也就是說,在之前的我們的sess.run(y_example)是可以受用于tf.Variable的。 通過構(gòu)造tf.Variable來向圖中添加變量。同時(shí)tf.Variable()的構(gòu)造函數(shù)需要給定任何類型和形狀的Tensor變量的初始值。初始值定義變量的類型和形狀,其變量的type和shape是固定的。因此,在這里我們主要使用tf.placeholder來feed我們需要訓(xùn)練的example的。 OK,現(xiàn)在進(jìn)入正題 先定義幾個簡單的小函數(shù),包括一些必要的log和sample的函數(shù)以及后期用到的導(dǎo)出結(jié)果的可視化函數(shù)。 由于這一環(huán)節(jié)沒有任何的難點(diǎn),不做多余闡述: 在這里解釋一下Q、P、D三個函數(shù): 現(xiàn)在我們通過tf.Session()來跑模型。最后,說一下這個很經(jīng)常出現(xiàn)Session()。Tensorflow以Graph的計(jì)算而得名,而Session()封裝了執(zhí)行Operation對象的環(huán)境。通過Session可以執(zhí)行圖的計(jì)算。與Session相近的有tf.InteractiveSession() 常規(guī)會話會在with語句中創(chuàng)建時(shí)將其自身作為默認(rèn)會話。一般我們在代碼中的用法是這樣的,我也比較常用Session()這個方法就是了: 總結(jié)一下一般的啟動邏輯: 因此,tensorflow就將底層給配置好之后,我們在tensorflow這個大環(huán)境里愉快的奔跑。而難點(diǎn)就在于Variable的各種的設(shè)置和run的操作方法。初期,Variable被大量的套路給設(shè)定好,我們可以通過別人的輪子,來配適。 但是Deep Learning的從業(yè)者的核心價(jià)值應(yīng)該在于能夠自己的將自己想做的數(shù)據(jù)導(dǎo)入自己的模型,而不是簡單的調(diào)參或者利用別人的輪子滾來滾去。各種算法和一些主流的實(shí)現(xiàn)就像加減乘除一般了然于胸,并且有自己做輪子的能力。 將模型訓(xùn)練十萬次(如果有想法的,請換一臺支持GPU的電腦,要不然可能會等很久。),我們將1000Iteration為一個單位,print一次: 由于導(dǎo)出大量的圖片,我在這里就給大家看一下對比圖, 不久之后: 本文由ALI Paper, arxiv依照Tensorflow重現(xiàn)。ALI的概念非本人提出,本人根據(jù)自己對ALI的理解通過Tensorflow進(jìn)行實(shí)現(xiàn),并且運(yùn)行于Jupyter中。所有代碼在Windows10,Python3.5,TensorflowGPU版(1.1.0rc2)完美運(yùn)行。限于本人水平,可能有出現(xiàn)一定的錯誤,如有失誤,歡迎交流。同時(shí),由于本人學(xué)習(xí)Deep Learning的時(shí)候直接接觸英文材料,故一些專有名詞的翻譯可能存在一些偏差。故一些專有名詞直接保留為原單詞,不做翻譯。ALI的翻譯沒有參考過任何相關(guān)中文信息,由本人直接查閱在Arxiv上ALI的原文所得。如果有想來交流的小伙伴,歡迎私信。 1、ALI Paper, arxiv PyLive預(yù)告:TensorFlow入門完全詳解 主講人:chen_h 主講人介紹:一直從事算法設(shè)計(jì)工作,曾獨(dú)立設(shè)計(jì)聊天機(jī)器人。目前在上海紐約大學(xué)養(yǎng)小白鼠,并且寫寫博客。 主講時(shí)間:5月19日(本周五)晚上21:00-22:00 |
|