印度小哥在"我的世界"裏搭神經網絡,圖像識別,網友:是別人的世界
參與:澤南、小舟
在沙盒遊戲《我的世界》中,有人搭建了完整的校園,有人舉辦了畢業典禮,有的人從零開始製作計算機,玩家們層出不窮的創意總能讓人眼前一亮。現在,又有一位印度程序員展現了真正的技術:在《我的世界》裏搭建神經網絡。
對於計算機科學愛好者們來説,有關《我的世界》中的環境是否「夠格」作為各種嚴肅實驗的話題,早已經過了充分討論:
答案是肯定的,《我的世界》中紅石電路和命令方塊體系已經分別圖靈完備了。這意味着我們理論上可以在其中構建一個通用圖靈機(雖然難度比較大),進而造出一台功能完整的常規架構計算機。
既然如此,我們能不能在遊戲裏「敲出」一個神經網絡模型呢?
已經有人做到了。最近,一名來自印度的程序員 Ashutosh Sathe 向我們展示了真正的技術,他在《我的世界》裏運行起了一個具有圖像識別能力的神經網絡。
只要在遊戲裏的「畫板」上寫字,《我的世界》裏的「計算機」就可以識別出你寫的內容是什麼:
在《我的世界》裏進行 MNIST 式的手寫數字識別。
「神經網絡推斷出畫板上的文字為數字 1」。
除了給出識別的結果,神經網絡識別的過程也是清晰可見:
在看了這波操作之後,眾多吃瓜網友留下了不爭氣的淚水,感慨道:「這是『別人的世界』……」
這一炫酷的技術被稱為 scarpet-nn,是一套可以讓玩家在《我的世界》遊戲中運行二值神經網絡(BNN)的工具。BNN 是一種激活、權重被固定為 1 或-1 的特殊神經網絡,大幅度簡化了神經網絡的運算量,最早由 Yoshua Bengio 等人提出。正是這些特性,讓 BNN 的權重可以由單個二進制位來表示,並在《我的世界》裏運行。
與此前人們在《我的世界》中運行神經網絡的一些嘗試不同,scarpet-nn 的 API 允許人們在遊戲中運行任何二值神經網絡的體系架構。也就是説,任何人都可以訓練自己的二值神經網絡,然後將其運行在《我的世界》裏。
先看一下完整的 Demo 視頻:
此外,Ashutosh Sathe 還開放了代碼。
項目地址:https://github.com/ashutoshbsathe/scarpet-nn
技術細節:投影(Litematica)原理圖生成
要想在我的世界裏運行神經網絡,你首先需要安裝一個 Java 版遊戲,Litematica 和 carpetmod 兩個 mod,另一方面還需要有 Python 3,深度學習框架 pytorch 和 nbtlib 庫。
通用表徵標準
在 scarpet-nn 中,nn-to-litematica 模塊將 pytorch 檢查點的二值化權重轉換為 litematica 原理圖。每個 litematica 的排列方式是讓前兩個維度位於 (x,z) 平面上。此外,原理圖的加載點(加載原理圖時玩家所在的區域)總是表示權重數組中的第一個數字。權重數組中的第一個維度是從加載點到 X 軸正半軸,第二個維度是從加載點到 Z 軸正半軸。超過 3 的維度會被重塑成第 3 個軸(Y 軸)。
卷積層的表徵
這裏遵循上述通用表徵標準。由於卷積層是以四維數組的形式存儲的,因此需要壓縮額外的維度,使其變成三維。卷積層的典型 shape 是 [c_2,c_1,f_h,f_w]。其中,
c_2 = 輸出激活應有的通道數
c_1= 輸入激活應有的通道數
(f_h,f_w)= 卷積濾波器的高度和寬度
為了將此轉換成三維的表徵,scarpet-nn 將 (f_h,f_w) 壓縮成一個大小為 f_h×f_w 的單一維度。因此,生成的原理圖中新的卷積層將會是 [c_2,c_1,f_h×f_w]。
為了直觀地理解這一點,請看下面的樣例圖片。該圖展示了第三個卷積層(conv3)權重的塊表徵,它的權重從 [16, 8, 3, 3] 壓縮成了 [16, 8, 9]。
全連接層的表徵
全連接(fc)層也符合 scarpet-nn 的通用表徵標準。全連接層的典型 shape 是 [n,k],輸入是 [m,n],輸出是 [m,k]。由於所有的操作都是二維的,所以不需要做維度調整。由於也沒有第三維,所以整個的權重數組都在 X-Z 平面內。
如下是 fc1 層的示意圖。該層的 shape 是 [8, 16]。
看完技術細節,有人覺得,在這種像素化的沙盒遊戲裏,用紅石搭建神經網絡,未免也太過複雜……
但也有人覺得,恰恰是因為用紅石邏輯構建網絡,才讓人印象深刻。