選自Journal of Geek Studies
作者:Henrique M. Soares
機器之心編譯
參與:機器之心編輯部
精靈寶可夢(Pokémon)取得舉世矚目的成功已逾 20 年,本文將通過機器學習的方法來解決「那個精靈寶可夢是誰?」的難題。本文提出了一個機器學習的預處理及分類流程,將會使用卷積神經網絡對精靈寶可夢進行分類。本文作者為巴西聖保羅的獨立研究者 Henrique M. Soares。此外,感興趣的讀者還可以點擊文末「閱讀原文」下載本文的 PDF 版本。
計算和圖像識別
計算機被發明以來 [1],在日常生活中的使用就愈加頻繁。最初它們的應用程式局限於解決數學問題,以及彈道學和密碼學中的軍事應用;而如今它們正在飛速地多樣化發展。迄今機器已經在很多項任務中超越了人類,最近的例子便是 AlphaGo 打敗了世界圍棋冠軍(Go Game Guru, 2017)。
這一成就證明了機器在智能應用方面的顯著進步。具有幾乎無限的組合 [2] 的圍棋是無法用「蠻力」[3] 輕易解決的——而「蠻力計算」已經被計算機用在其它一些完美信息博弈(perfect information games)來對抗人類。
但請不要沮喪,並非所有人都會在未來與機器人的鬥爭中失敗,因為計算機仍然還在學習人類與生俱來的能力:圖像和模式識別。不管目前的計算機在這方面有多麼擅長,人類也仍然能比它注意到更多:即使圖 1 僅顯示了一輛汽車,卻存在不尋常的情況。
圖 1:撞到樹的汽車。機器(至少目前)還寫不出這樣的文本。(該圖像提取自維基共享資源;Thue,2005)
但計算機就要趕上來了!機器學習技術(特別是監督學習方法)的進步,以及不斷增長的用於此類算法的數據,都已讓這一領域實現了巨大飛躍。2015 年,MSRA 團隊訓練了一個 150 層的殘差神經網絡集合,在同年的圖像分類挑戰中達到了 62%的平均精度,該挑戰使用了一個包含超過 1000 個不同對象的數據集(Large Scale Visual Recognition Challenge, 2015)。
圖 2:一些簡單的東西對計算機而言可能會很難。
(「任務」;XKCD,https://xkcd.com/1425)。
所以我們想知道……對於過去 22 年中由世界各地的孩子們所解決的難題,機器能夠辦到嗎?
圖 3:那個精靈寶可夢是誰?(精靈寶可夢動畫系列的截圖)
精靈寶可夢
精靈寶可夢是一個十分成功的遊戲及動畫系列,它的目標受眾是年輕人(儘管作者本人並不同意這種分類)。田尻智(Satoshi Tajiri)在 1995 年創建了這個系列,並為任天堂的掌上遊戲機 Game Boy 發行了兩款遊戲。在遊戲中,玩家將扮演一位精靈寶可夢訓練師,捕捉並和目標生物戰鬥。這個系列極其成功,並很快紅遍了世界(Wikipedia, 2017b)。
這個系列最初有 151 只妖怪(圖 4),但如今的遊戲已經完成了第七次迭代,共有 802 只妖怪。
圖 4:從左到右分別為妙蛙種子(Bulbasaur)、小火龍(Charmander)和傑尼龜(Squirtle)
每個精靈寶可夢都通過所屬的一或兩種屬性來表現其「元素親和力(elemental affinity)」,以及相對於其他類精靈寶可夢的優缺點。這個功能在遊戲玩法中至關重要,它能夠建立一個深度且複雜的石頭-剪刀-布機制,而這恰恰是戰鬥系統的基礎。遊戲中有 18 種屬性(第一個遊戲只有 15 個),如圖 5 所示(Bulbapedia,2017)。
圖 5:使用它們的慣用背景顏色所描繪的 18 種屬性的精靈寶可夢。
本文檢測了卷積神經網絡(也稱為 ConvNet)在指定精靈寶可夢遊戲中的精靈後,執行寶可夢屬性分類任務的表現。我將會展示收集的數據、預處理和訓練流程,並會以所選模型的性能指標結束。所有的數據、實現代碼、結果,以及對所有步驟做出解釋的 Jupyter Notebook 都可以在一個 GitHub 庫找到:
我將使用遊戲精靈來訓練模型。而從 Veekun(2017)能夠獲得數據集(精靈包)。這些精靈包擁有遊戲的第 1 代到第 5 代的精靈。雖然又發布了新的遊戲(和新的妖怪),但它們使用了三維動畫模型,因此從遊戲中提取資源會更困難,將其以轉換成機器學習方法所支持的格式也會更難。因此本文將僅使用到第五代遊戲為止的精靈寶可夢(共有 649 個)。
隨即可以發現,遊戲機硬體和軟體的不同,造成了遊戲間細節級別上的差異。任天堂發布的第一代掌上遊戲機 Game Boy,儘管在數據集中存在一些色調信息,但單個精靈的色調幾乎沒有發生變化(如 Bulbasaur 是綠色,Charmander 是紅色,而 Squirtle 是藍色;如圖 6 所示)。隨著研究從 Game Boy Advance 進展到到任天堂 DS,我們能發現其細節水平不僅體現在色調方面,還體現在形狀方面。
初看之下,我們還能識別圖像分類任務中所遇到的一些典型問題。這些圖像大小不同。儘管所有的圖像的長寬比保持在 1:1,但它們已經從第一代的 40 像素寬度發展到了第五代的 96 像素寬度(請注意圖 6 中每個精靈邊界的刻度)。
圖 6. 正如遊戲和各代版本中所見,這是三個精靈寶可夢的變體樣本。
此外,並非所有精靈在每個圖像中都會填充相同的空間,最老一代的精靈似乎會填充圖像相對更大的部分。這在相同代之間也會發生,特別是在更新遊戲中,往往會涉及每個精靈寶可夢的大小差異以及進化(圖 7)。
圖 7:第五代遊戲中的妙蛙種子的進化路線。隨著精靈寶可夢進化,它也會變大,就會填充圖像中更大的部分。
圖像居中(Image Centering)
為了解決這個問題,我們要應用一些計算機視覺技術來識別圖像中的主要對象,給它定下邊界框,並將圖像居中在這個框上。這個流程是:
1. 將圖像轉換為灰度。
2. 在圖像上應用 Sobel 濾波器來突出精靈的邊緣。Sobel 濾波器是一個 3×3 的卷積核(convolutional kernel,之後會介紹這些便利的工具的更多信息,也也可參見 Sckikit-Image, 2017),其會儘量逼近圖像的梯度。對於給定的圖像'A',Sobel 算子被定義為:
3. 填充圖像中的孔,獲得精靈寶可夢的輪廓。
4. 計算輪廓的凸包(Convex Hull),即包括輪廓中所有像素的最小凸多邊形。
5. 根據之前計算的凸包定義矩形邊界框。
6. 選擇邊界框內的內容,並將大小調整為 64 x 64 像素。
在遵循上述描述的流程之後,我們得到了新的精靈,其使圖像上的精靈的填充率最大化。這些步驟是通過使用 skimage 完成的(skimage 是一個用於 Python 程式語言的圖像處理庫)。圖 8 顯示了第一代三個初始精靈和妙蛙花(Venusaur)的居中轉換流程。
我們所提出的流程對於當前所面臨的任務非常有效。由於其有著非常簡潔的白色背景且我們的圖片是非常簡單的精靈,這樣的結果也在我們的預料之中。
最後,讓我們將我們的方法應用於我們所有的精靈和圖像。圖 9 顯示了一群精靈寶可夢的結果。
圖 9:幾種第五代精靈寶可夢的居中處理結果
目標變量
現在我們有了全部的精靈寶可夢的圖像來建立我們的圖像數據集,我們必須根據我們想要預測的變量對其進行分類。在這篇論文中,我們將嘗試僅使用每個精靈寶可夢的圖像並根據其正確的屬性對其分類。例如,在圖 10 中,我們嘗試使用邊界框內的圖像將精靈寶可夢分為 18 種屬性之一,試圖匹配其真實屬性(在每個精靈寶可夢下方顯示)。
圖 10:精靈寶可夢和其各自的屬性的樣本。 頂行:妙蛙草 (左) 和波波 (右)。底行:大鋼蛇 (左) 和菊石神 (右)
但是有一個問題。大多數精靈寶可夢,像圖 9 和 圖 10 的那些精靈寶可夢有雙重屬性。也就是說,它的真實屬性將是那 18 種屬性列表裡的兩種不同屬性的組合。例如,在圖 10 中,妙蛙草是草屬性和毒屬性,同時具有兩種屬性的優缺點。
考慮到這一點,我們必須對組合的屬性進行目標分類。即使我們忽視屬性順序(也就是說[火與巖石] 和 [巖石與火] 是一個屬性),我們最終還是會得到 171 個可能的類。(事實上,這個數字會小一點,154,因為並不是所有的組合都在遊戲中存在)。
更糟的是,一些組合非常少見(圖11),只有一個或者兩個精靈寶可夢,從而限制了可用的學習樣本。
圖11:一些罕見的屬性組合。頂行:熔巖蝸牛(Magcargo (左) )和溜溜糖球(Surskit (右)); 底行: 花巖怪(Spiritomb (左) )和席多藍恩(Heatran (右))
由於上述原因,在本文中我選擇忽略屬性組合。因此,我們只考慮精靈寶可夢的主要屬性。例如,在圖 10 中,我們將有:妙蛙草:草屬性、波波:一般屬性、大鋼蛇:鋼屬性、 菊石神:巖石屬性
模型訓練
選擇模型
我使用卷積神經網絡(Convolutional Neural Network)作為我們的數據集的預測器。神經網絡是通常用於機器學習的許多種預測模型中的一種,包括被稱為神經元的簡單單元的互連網絡。基於與生物系統內部運作的不嚴格的類比,神經網絡可通過這些簡單的單元學習複雜的功能和模式。
在其最簡單的形式中,神經元只是其輸入的線性函數,接著是非線性激活函數(圖 12)。然而,通過一些層的組合,神經網絡能夠對目前的獨立和非獨立變量之間愈發複雜的關係進行建模。
圖 12:神經網絡的基本單元。
圖 13.:一個稍微複雜的結構,帶有一個隱含層的神經網絡。
神經網絡不是最近才提出的,1940 年就存在對其的研究了( Wikipedia, 2017a)。然而,直到近年來隨著計算能力的進步以及用於其訓練的反向傳播算法的發展,才使得其使用變得更加廣泛。
好了,這足以讓我們明白一點神經網絡了。但是,「卷積(convolutional)」是什麼意思?讓我們先來談一談核(Kernel)。
在圖像處理中,一個核(也被稱為卷積矩陣(Convolution Matrix)或掩碼(Mask))是用於模糊、銳化、邊緣檢測等的小矩陣。通過對適當的內核計算矩陣卷積,產生新的圖像從而獲得效果。我們已經在我們的預處理流程中看到了一個在本文中使用的核,其中我們應用了 Sobel 核來檢測精靈的邊緣。
圖 14:Sobel 核對妙蛙花圖像的影響
卷積運算可以被看作是核在我們的圖像上的滑動。核中的值以元素的方式乘以圖像中下面的值,並將結果相加以產生該窗口上卷積的單個值。(關於卷積運算更好的解釋請參考
http://setosa.io/ev/ image-kernels/)。
在圖 15 中,我們應用垂直 Sobel 濾波器來檢測顏色強度的明顯變化。(在我們的灰度圖像中,範圍在 120 到 255 內)。
圖 15 。卷積示例。圖像中突出顯示的紅色區域正在使用垂直邊緣檢測器進行卷積,從而得到結果矩陣(resulting matrix)中紅色框內的值。
但是這是怎麼回事!這些核與神經網絡有什麼關係?關係大得超出了我們的想像!一個神經網絡裡的卷積層只是一種聰明的排列神經元及其相互連接的方式,以實現能夠通過監督學習識別這些濾波器的架構。(同樣,關於整個神經網絡的東西可以參考http://cs231n.github.io/convolutional-network s/)在我們預處理流程中,我們使用了特殊的核,因為我們已經知道了一個十分擅長當前任務的核,但是在卷積網絡中,我們讓訓練算法去找到那些濾波器,並在後續層中將其組合起來以實現越來越複雜的特性。
我們的神經網絡的架構
對於我們的精靈寶可夢分類的任務,我使用了一個不太深的卷積網絡
圖 16:在本文中使用的神經網絡的架構
圖像的每一層在我們的卷積網絡中表示為一個層。在每一個層後,我們獲得表示該層輸出的狀態張量(張量的維度列在每個層的右側)。
然後一個卷積層應用這些卷積運算。在第一層中,我們對輸入圖像應用 32 個大小為 5 的核,產生了 32 個大小為 60 x 60 的輸出。(由於邊界效應,每個卷積圖像尺寸有所減少)
我們還使用了最大池化層( max pooling layers),通過獲得其最大值簡單地將張量區域減少到單個區域(圖 17)。因此,在應用一個 2 x 2 的最大池化層之後,我們得到原始大小四分之一的張量。
圖 17:最大池化運算的示例
最後,我們將張量展平為一維,並將其連接到密集連接層以用於預測。我們最終層的大小為 18,與輸出域大小相同。
訓練和檢驗
為了實現我們的模型訓練,我們要將數據集分為兩部分:
(1)「訓練數據集(training dataset)」將使用我們的訓練算法從數據中學習模型參數;(2)「驗證數據集(validation dataset)」將用於評估未知的數據的模型性能。這樣,我們將能夠識別過擬合問題(相信我,我們將看到很多過擬合[4])。
但是我們不能隨意地選擇精靈的隨機樣本。來自同一精靈寶可夢的精靈,在不同遊戲中彼此非常相似,特別是在同一代遊戲之間(圖18)。
圖18:來自精靈寶可夢白金版(左)和鑽石版(右)的大比鳥(Bird Jesus)。等等...這是另一回事嗎?
框1:表現測試指標
本文我們使用三個指標來評估我們的模型表現:
(1)準確度(Accuracy):獲得精靈寶可夢正確屬性分類的預測的百分比;
(2)精度(Precision):歸類為真正屬於該類(屬性)的圖像的百分比;
(3)召回率(Recall):歸類為該類(屬性)的圖像的百分比。
準確度使我們能夠得到模型的總體質量,精度和召回率用于衡量我們的模型的每個類的預測。
如果我們隨機選擇精靈,則會有使用與訓練集相同精靈汙染測試集的風險,這將導致對未知數據的模型表現的高估。因此,我對精靈寶可夢樣本進行了挑選。也就是說,我將整個精靈寶可夢分配到了同一個集合,而不是分配單個精靈。這樣,如果噴火龍被分配給測試集,它對應的所有精靈都將跟隨,從而消除了汙染的風險。
我使用了20%的精靈寶可夢作為測試樣本,80%作為訓練集,也就是有 2727 個精靈用來訓練。
第一個模型:裸骨訓練
在第一次嘗試中,我用原始精靈的圖像訓練算法,同時保持訓練/測試分開。該算法訓練超過了20個 epoch [5],總共花了大約一分鐘[6]。第一個訓練獲得的結果在圖19中給出(參見框1表現度量查看解釋)。
圖19:第一次嘗試中訓練集的表現
結果令人吃驚!我們得到的所有分類都是正確的!但是這些指標能很好地估計未知數據的模型性能嗎?那些指標是否顯示,我們的模型學習訓練樣本,但對新數據適應不佳?擾亂警報:確實如此。讓我們來看看它:圖20展示了那些和我們驗證集相同的度量。
看來,我們的模型確實過擬合了訓練集,即使它的表現優於隨機猜測。
圖20:第一次嘗試驗證集的表現
但等一下.為什麼我們沒有任何飛行屬性的精靈寶可夢?事實證明,只有一個精靈的主要屬性是飛行(圖21,龍捲雲(Tornadus)),它被包括在了訓練集中。
圖21:在飛行屬性中,龍捲雲是獨一無二的。
第二個模型:圖像增強
我們並不驚訝測試集獲得的第一個模型性能不佳。正如在介紹中所說,圖像分類是計算機要解決的一個困難問題。我們的數據集太小,沒有足夠的變化,以致我們的算法不能在更廣泛的應用程式中學習能夠泛化的特徵。
為了至少解決部分的問題,讓我們應用一些圖像增強技術。這涉及對訓練圖像應用隨機變換,從而增強它們的變化。人類將能夠識別皮卡丘,無論其方向如何(顛倒,傾斜到一側等),我們希望我們的模型能達到相同的效果。因此,我對我們的訓練數據集採用以下範圍的變換(圖22):(1)隨機旋轉高達40度;(2)隨機水平移位高達20%的圖像寬度;(3)隨機垂直移位高達20%圖像高度;(3)隨機放大高達20%;(4)在垂直軸上取倒影;(5)在0.2弧度範圍內的剪切變換。
圖22:通過在圖像增強流程獲得的圖像,某隻妙蛙種子精靈。
我將這個流程應用到訓練集中的所有精靈,為每個精靈生成10個新圖像。這樣,我們的訓練集擴展到27,270張圖像。但是,這就足夠了嗎?至少訓練30 epoch後(這次時間花的稍長,總共超過10分鐘),我獲得了以下結果(圖23)。
圖23.第二個模型的訓練集的表現。
等一下,我們模型的性能下降了嗎?這個圖像增強的東西不能改善我的模型?這有可能,但是,讓我們不要根據我們訓練集的表現就做假設。整體性能的下降是由於我們訓練集變化的增加,如果能在驗證集上取得更好的表現(圖24),這或許是個好消息。
圖24.第二個模型的驗證集表現。
在這裡,有了!圖像增強實際上有助於提高模型表現。其中,準確率提高了14個百分點,達39%。我們可以繼續嘗試獲得一個更好的模型,處理模型超參數或嘗試網絡架構,但我們就到此為止吧。
仔細觀察分類
我想提醒你注意一些事情。預測精度較高的屬性有:火(61%)、水和毒(每種 54%)、草(47%)、電(46%)。具有更高召回率的屬性(參見框1)是:惡(92%)、火(74%)、水(55%)、一般(49%)、草(42%)。
毫不奇怪,三種主要屬性(火、水和草)在這兩個指標中位列前五。這些屬性對顏色具有非常強的親和力,這是從圖像中容易獲得的信息。他們的類型也豐富,有很多訓練樣例供模型學習。
現在讓我們看看一些被正確和錯誤歸類的精靈寶可夢(分別圖25和26)。
圖25:被正確歸類的精靈寶可夢。頂行:傑尼龜(左)、皮卡丘(中)、Weepingbell(右)。底行:火焰鳥(左)、班基拉斯(中)、脫殼忍者(右)。
圖26.被錯誤分類的精靈寶可夢。頂行:豪李(左)、菊石神(中)、洛奇亞(右)。底行:沙奈朵(左)、飯匙蛇(中)、水伊布(右)。
即使在這個小樣本中,我們也可以看到,顏色在整體分類中起著重要的作用。例如,沒被正確分類的精靈寶可夢中,Machoke有很大可能被歸為毒藥類,可能是由於其外表是紫色的。同樣,Seviper被歸類為黑暗類,可能是由於他的外表是深色。
為什麼是這樣?好吧,我們可能永遠不知道!使用深層神經網絡進行分類的缺點之一是該模型是一種「黑匣子」。有很多研究正在試圖弄清楚網絡在圖像中搜索什麼。(我建議你在網際網路上搜索「Deep Dream」,會看到一些非常漂亮的圖片。)
現在,我們可以看到針對一些精靈寶可夢,第一層被激活的情況,並試圖弄清楚每個內核正在尋找的東西是什麼。但是隨著我們越來越深入了解網絡,這個挑戰變得越來越困難(圖27)。
圖27:三個第一代初始狀態的第一層激活(部分)。
結論
39%的準確性可能不那麼令人印象深刻。但是,用這麼少的數據研究18類分類問題也是很困難的,況且我們的模型相比零規則基線( Zero Rule Baseline)獲得了20個百分點的增益,它是為了猜測所有精靈寶可夢中最常見的類。表1列出了測試集上每類出現的頻率,這為零規則提供了19.5%的精度。
表1:鍵入測試數據集的頻率。
但是,如果我們預期機器有一天能成為這個星球的統治者,我們就不應該用這種笨拙的方法衡量它們。距離計算機有一天在「精靈寶可夢分類挑戰」中打敗我的小兄弟,還有很長的路要走。但往好的地方想,他們可能已經擊敗了我爹,但這是另一篇文章的主題啦。
參考文獻
Bulbapedia. (2017) Type. Available from:
http:// bulbapedia.bulbagarden.net/wiki/Type (Date of access: 20/01/2017).
Go Game Guru. (2017) DeepMind AlphaGo vs Lee Sedol. Available from:
https://gogameguru. com/tag/deepmind-alphago-lee-sedol/ (Date of access: 07/Mar/2017).
Large Scale Visual Recognition Challenge.(2015) Large Scale Visual Recognition Challenge 2015 (ILSVRC2015). Available from:
http://image-net.org/challenges/LSVRC/2015/results (Date of access: 20/01/2017).
Scikit-Image. (2017) Module: filters. Available from:
http://scikit-image.org/docs/dev/api/skimage.fi lters.html#skimage.filters.sobel
(Date of access: 07/Mar/2017).
Tromp, J. & Farnebäck, G.(2016) Combinatorics of Go. Available from:
https://tromp.github.io/go/ gostate.pdf
Veekun.(2017) Sprite Packs. Available from:
https:// veekun.com/dex/downloads (Date of access: 20/01/2017).
Wikipedia. (2017a) Artificial Neural Network. Available from:
https://en.wikipedia.org/wiki/ Artificial_neural_network (Date of access: 07/Mar/2017).
Wikipedia. (2017b) Pokémon. Available from:
https://en.wikipedia.org/wiki/Pok%C3%A9mon (Date of access: 20/01/2017).
原文地址:https://jgeekstudies.files.wordpress.com/2017/03/soares_2017_neural-mon.pdf
©本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。
✄---
加入機器之心(全職記者/實習生):hr@jiqizhixin.com
投稿或尋求報導:editor@jiqizhixin.com
廣告&商務合作:bd@jiqizhixin.com