【機器學習】如何教機器繪畫?
抽象的形象溝通對于人們交流思想發揮了重要的作用。孩子們很小的時候就發展出用簡單的線條來描繪事物甚至表達自己情感的能力。這些簡單的繪畫可能沒有照片來得真實,但它確實可以讓我們從另一個角度了解人們是如何描繪和重建周圍的世界的。
▲ sketch-rnn 生成的矢量圖
在最新論文《簡筆畫繪圖的神經表征》(A Neural Representation of Sketch Drawings) 中,我們提出了一個能夠生成常見物體簡筆畫的生成式循環神經網絡,其目標是以類似于人類的方式訓練機器繪畫和概括抽象概念。我們利用一個手繪簡筆畫的數據集訓練我們的模型,其中每張簡筆畫表示握筆動作的一個序列:往哪個方向移動,什么時候提筆以及停筆。這樣我們就可以創建一個具有廣泛應用潛力的模型,從協助藝術家進行創作到幫助教學生如何繪畫。
對于使用神經網絡的生成式建模方面,目前已做了大量工作,其中大部分工作的重心是以 2D 像素網格來表示光柵圖像。盡管這些模型目前能夠生成逼真的圖像,但由于 2D 像素網格的高維度,其面臨的一個關鍵挑戰是生成具有連貫結構的圖像。這些模型有時產生的圖像很有趣,例如,有三只乃至更多眼睛的貓,或有多個頭的狗。
▲ 上圖展示了生成的身體部位數量錯誤的動物,這些是使用 128x128 ImageNet 數據集訓練的先前 GAN 模型生成的。上圖是 Ian Goodfellow 的 NIPS 2016 教程《生成對抗網絡》(Generative Adversarial Networks) 中的第 29 圖。
在這項工作中,我們受到人類繪畫方式的啟發,對更低維度的基于向量的表征進行了研究。我們的模型 sketch-rnn 以 sequence-to-sequence (seq2seq) 自編碼器框架為基礎。它融入了變分推理,并將超網絡用作循環神經網絡細胞。seq2seq 自編碼器的目標是訓練網絡將輸入序列編碼成一個被稱作隱向量的浮點數向量,并通過一個解碼器盡可能接近地再現輸入序列,從這一隱向量中重建輸出序列。
▲ sketch-rnn 的原理圖
在我們的模型中,我們刻意向隱向量添加噪音。在我們的論文中,我們展示了通過將噪聲引入編碼器和解碼器之間的通信通道中,讓模型無法再準確地再現草圖,而是必須學會以噪音隱向量的形式捕捉草圖的本質。我們的解碼器將使用這個隱向量生成用于構建新簡筆畫的一系列動作。在下圖中,我們將幾個表現真實的貓的樣子的簡筆畫輸入編碼器中,以使用解碼器生成重建的簡筆畫。
▲ 受過貓簡筆畫訓練的模型重建的簡筆畫
需要強調的是,重建的貓簡筆畫并不是對輸入的簡筆畫的復制,而是與輸入的簡筆畫具有相似特征的全新草圖。為證明模型不是簡單地復制輸入順序,而是確實學會了人類畫貓的一些技巧,我們可以嘗試將非標準簡筆畫輸入編碼器中:
當我們輸入一個三眼貓的簡筆畫后,模型將生成一個具有類似輪廓的貓,但它只有兩只眼睛,這就表明我們的模型已經知道貓只有兩只眼睛。為證明我們的模型并不是簡單地從大量儲存的貓簡筆畫中選擇最接近正常的貓的簡筆畫,我們可以嘗試輸入一些完全不同于貓的物體,如一只牙刷的簡筆畫。我們看到網絡仍然努力生成了一只貓的形象,擁有長長的胡須,同時盡量遵循牙刷的形狀。這表明網絡已經學會了將輸入簡筆畫編碼成一組抽象的貓的概念,并嵌入到隱向量中,同時還能基于這個隱向量重建一個全新的簡筆畫。
還是不太相信?我們再用一個受過小豬簡筆畫訓練的模型來重復此實驗,看看能不能得出相似結論。如果輸入一只有八條腿的豬,該模型生成的形狀將與豬相似,并且只有四條腿。如果向畫豬的模型輸入一輛卡車的簡筆畫,那么它就會畫出一頭長得像卡車的豬。
▲ 受過小豬簡筆畫訓練的模型重建的簡筆畫
為了研究這些隱向量是如何編碼動物形態特征的,在下圖中,我們首先從兩張迥然不同的小豬簡筆畫中獲得隱向量,在此案例中是一個豬頭(綠色框中)和豬的全身(橙色框中)。我們希望了解我們的模型是如何學會表現豬的形象的,一種方法是在兩個不同的隱向量之間進行內插,并將內插的隱向量生成的每個簡筆畫進行可視化。如下圖所示,我們展示了豬頭的簡筆畫是如何慢慢變成整頭豬的,以及模型是如何理解豬的簡筆畫這個概念的。我們可以看到隱向量控制著簡筆畫中鼻子相對于頭的位置和尺寸,然后又添加了身體和腿。
▲ 從一個受過豬簡筆畫訓練的模型生成的隱空間插值
我們還想知道如果模型學會了表現多種動物,那它們將會是什么樣子?在下圖中,我們通過在貓頭和整頭豬之間內插隱向量生成簡筆畫。我們可以看到表征是如何慢慢地從貓頭過渡到具有尾巴的貓,再過渡到一個有肥胖身體的貓,最后變成一頭完整的豬。就像兒童學習繪畫一樣,我們的模型通過將動物的頭、腿、尾巴添加到身體上來畫出自己想要的動物。我們看到,模型還可以繪制與豬頭完全不同的貓頭。
▲ 受過貓和豬簡筆畫繪制訓練的模型的隱空間插值
以上這些插值示例表明隱向量確實對簡筆畫的概念特征進行了編碼。但是,我們是否可以使用這些特征來填充沒有此類特征的其他簡筆畫,比如為一個貓頭加上身體?
▲ 探索使用隱向量算法學習抽象概念之間的聯系
確實,我們發現受過貓和豬繪制訓練的模型可以進行簡筆畫繪制類比。例如,我們可以從整頭豬的隱向量減去已編碼的豬頭的隱向量,從而得到一個表現身體概念的向量。將這一區別添加到貓頭的隱向量中,從而得到一只完整的貓(即,貓頭+身體=整只貓)。這些繪圖類比讓我們可以探索模型是如何組織其隱空間以在生成的眾多簡筆畫中體現不同概念。
【本文是51CTO專欄機構“谷歌開發者”的原創稿件,轉載請聯系原作者(微信公眾號:Google_Developers)】