對于計算機科學愛好者們來說,有關《我的世界》中的環境是否「夠格」作為各種嚴肅實驗的話題,早已經過了充分讨論:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5SY4UGZjZjM4cTM0MjZiJTYlZGO0YzMjVjYhF2M3UzN58CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.jpg)
答案是肯定的,《我的世界》中紅石電路和指令方塊體系已經分别圖靈完備了。這意味着我們理論上可以在其中建構一個通用圖靈機(雖然難度比較大),進而造出一台功能完整的正常架構計算機。
既然如此,我們能不能在遊戲裡「敲出」一個神經網絡模型呢?
已經有人做到了。最近,一名來自印度的程式員 Ashutosh Sathe 向我們展示了真正的技術,他在《我的世界》裡運作起了一個具有圖像識别能力的神經網絡。
隻要在遊戲裡的「畫闆」上寫字,《我的世界》裡的「計算機」就可以識别出你寫的内容是什麼:
「神經網絡推斷出畫闆上的文字為數字 1」。
除了給出識别的結果,神經網絡識别的過程也是清晰可見:
在看了這波操作之後,衆多吃瓜網友留下了不争氣的淚水,感慨道:「這是『别人的世界』……」
這一炫酷的技術被稱為 scarpet-nn,是一套可以讓玩家在《我的世界》遊戲中運作二值神經網絡(BNN)的工具。BNN 是一種激活、權重被固定為 1 或-1 的特殊神經網絡,大幅度簡化了神經網絡的運算量,最早由 Yoshua Bengio 等人提出。正是這些特性,讓 BNN 的權重可以由單個二進制位來表示,并在《我的世界》裡運作。
與此前人們在《我的世界》中運作神經網絡的一些嘗試不同,scarpet-nn 的 API 允許人們在遊戲中運作任何二值神經網絡的體系架構。也就是說,任何人都可以訓練自己的二值神經網絡,然後将其運作在《我的世界》裡。
此外,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]。
看完技術細節,有人覺得,在這種像素化的沙盒遊戲裡,用紅石搭建神經網絡,未免也太過複雜……
但也有人覺得,恰恰是因為用紅石邏輯建構網絡,才讓人印象深刻。
作者本人回複說,scarpet-nn 比指令方塊體系的性能要好得多,《我的世界》可以将其用于繪制地圖時在隐蔽模式下打開隐藏内容。
隻是目前,在《我的世界》中可以實作的神經網絡功能仍然有限:看起來隻有前向傳播而沒有反向傳播。
不過在玩家們的不懈努力下,又有什麼是不能實作的呢?
參考連結:
https://ashutoshbsathe.github.io/scarpet-nn/ https://www.reddit.com/r/MachineLearning/comments/gb08da/p_i_wrote_an_api_to_build_neural_networks_in/