在《我的世界》里搭建神經網絡,運行過程清晰可見 | 開源
本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載,轉載請聯系出處。
可能是疫情吧,大家在現實中行動受限,就越來越多去游戲世界中釋放天性。
前有《我的世界》舉辦畢業典禮,后有《動物森友會》舉辦AI會議。最近《我的世界》又被大神帶來了硬核玩法:

你以為他在涂鴉?不!其實他在進行神經網絡的推理。
你如果是一個熟悉神經網絡的人,想必已經猜出來了。
圖片里這位玩家做的正是MNIST手寫數字分類網絡。
只需用劍在墻壁上畫出數字,神經網絡就能知道你寫的是幾。不僅僅如此,神經網絡在推理過程中,哪些神經元被激活,都可以在這里看得一清二楚。

這個腦洞大開的玩家是一位來自印度的小哥Ashutosh Sathe,游戲項目叫做Scarpet-nn。
Sathe不僅放出了試玩視頻,還開源了代碼,如果你是《我的世界》玩家+神經網絡煉丹師,那么你也可以把自己的網絡放在游戲里。
Scarpet-nn支持卷積層和完全連接層,允許在單個世界中運行多個神經網絡。而且可以展示中間張量的逐塊激活,甚至還能一次運行多個神經網絡。
Sathe小哥到底是怎么想到用《我的世界》來搭建神經網絡的呢?
像素風和神經網絡是絕配
我的世界里那一個個像素色塊簡直就是顯示3維數組的神器。如果一個長方體的每個小塊都用不同顏色來展示數值,那么一個長方體就可以表示一個張量。

但是用表示的范圍有限,我的世界地圖里的資源也有限,在神經網絡中顯示BERT什么的顯然不切實際。
所以用兩種顏色的色塊表示二值神經網絡(BNN)最合適了。

BNN是一種高度簡化的神經網絡,權重和激活都只能取兩個值:+1或-1。但是計算機中二進制的位表示是不同的。因此在BNN中,我們將+1存儲為1為,將-1存儲為0。

這樣在BNN中乘法運算就變成了邏輯門中的同或運算,而邏輯門在《我的世界》中可以用紅石電路造出。

至此,用《我的世界》搭建神經網絡的理論基礎已經完成,下面開始實際操作。
神經網絡轉像素模塊
我們需要在電腦上安裝《我的世界》Java版,第三方Mod也是必不可少的。在這個項目里,我們要安裝Litematica和carpetmod兩個Mod。
另外還需要通過Python3安裝PyTorch和nbtlib。
接下來就是“煉丹”,先在PyTorch里訓練好你的二值神經網絡。
Litematica是一個幫助用戶從零開始繪制示意圖的模塊,它可以準確地構建結構,指定將塊放置在何處。

運行modeltolitematica.py將神經網絡的所有層轉換為不同的Litematica示意圖。每個示意圖僅包含一層神經網絡。
圖中以紫色表示+1的塊,以綠色代表-1的塊。
在這一步后,你會獲得一組示意圖文件,后綴名為.litematica。文件的名稱和你命名的網絡層相同,比如conv1.weight.litematica、fc2.weight.litematica等等。將相應文件導入即可。

把神經網絡鋪在地上
由于卷積層會出現4維數組,這在3維空間里是沒法表示的,因此這個過程中還加入了壓縮。
一般卷積層的形式是:[c2, c1, fh, fw]。其中c2是輸出激活的通道數量,c1是輸入激活的通道數量,fh和fw是卷積濾波器的高度和寬度。
通過scarpet-nn將后兩個維度乘起來,變成[c2, c1, fh× fw],這樣就解決了3維顯示問題。

而全連接層都是2維的,不存在不能顯示的狀況,因此不需要做任何調整。

然后你就可以在空地上繪制一張16×16的輸入圖像了。

將卷積層導入地圖后,你就可以進行神經網絡運算了。

最后,作者還給出了一個MNIST示意圖MineCraft文件包,如果只想簡單看看實際運行效果,可以在我們的公眾號中回復我的世界獲取。
不得不說,《我的世界》里大神太多,之前有復旦本科生從零計算機,現在又有印度小哥從零打造神經網絡。
(相關閱讀:在《我的世界》里從零打造一臺計算機有多難?復旦本科生大神花費了一年心血)

只是現在的模塊還不能在《我的世界》里訓練神經網絡,相信在這些大神的努力下,未來用《我的世界》煉丹也不是夢。
傳送門
博客地址:https://ashutoshbsathe.github.io/scarpet-nn/scarpet-apps/twoclassmnist/
Litematica下載地址:http://minecraft.curseforge.com/projects/litematica
源代碼:https://github.com/ashutoshbsathe/scarpet-nn