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