機器學習到底在學啥?一些最小模型實踐

摘要

這是一篇關於機器學習的有趣長文,翻譯自 Stephen Wolfram 的《What’s Really Going On in Machine Learning? Some Minimal Models》,閱讀原文可以看英文原版。下面是對文章的兩則摘要:
From GPT 👾
沃爾夫勒姆解釋說,雖然機器學習(尤其是透過神經網路)取得了令人印象深刻的成果,但我們仍然不完全瞭解how and why it works。
此篇的核心見解是,機器學習不一定會建立有組織的系統來解決問題;相反,它利用簡單計算規則中固有的複雜性,而這些規則通常表現得不可預測。這種隨機性和複雜性使得機器學習模型能夠以類似於自然進化的方式找到解決方案——透過探索多種可能性並堅持有效的方法,而不是遵循清晰的、合乎邏輯的路徑。
這種理解可以透過關注計算的簡單性和自然豐富性來更有效的構建和改進機器學習系統,而不是試圖設計高度結構化的解決方案。
From Jessie 👀
機器學習科學從生物進化中獲得什麼啟發呢?
和生物進化一樣,機器學習的根本目的在於找到可行的方法,不受人類在一步步明確設計事物時強加給我們的“可理解性”約束。
沃爾夫勒姆說,我們基本上只能研究一些計算不可約的過程,並觀察到它“恰好起作用”——而且我們不會對“為什麼”做出高層次的解釋。
機器學習的力量來自於利用計算不可約性的“自然資源”,想象一下一個人在建一堵牆。一種可能性是製作出一種特定形狀的磚塊,這些磚塊知道它們可以拼在一起。但另一種可能性是隻看一眼周圍散落的石頭,然後儘可能將它們拼合在一起來建造這堵牆。
如果有人問“為什麼牆上會有這樣或那樣的圖案?”,答案基本上是“因為那是從碰巧散落在周圍的石頭上得到的”。它本身並沒有總體理論;它只是對現有資源的反映。
我之前讀過他介紹 GPT 是如何工作的書《GPT在幹啥,為什麼它有效?》1,他解釋說GPT的“任務”就是對文字進行合理的延續,這本身是一個理解問題。而理解是一個非常困難的任務,在文字交流和溝通中,你很難讓對方明白你在說什麼– 你想表達什麼,你不明白的是什麼,而這有時候也是我們最想知道的。

正文

機器學習的奧秘

關鍵詞

computational neural nets #visualization #computational irreducibility #minimal models

令人驚訝的是,人們對機器學習的基礎瞭解甚少。是的,從工程的角度來看,人們已經弄清楚了大量如何構建神經網路的方法,這些神經網路可以完成各種令人印象深刻甚至幾乎神奇的事情。但從根本上講,我們仍然不知道神經網路為什麼“work”——我們對神經網路內部發生的事情沒有任何“科學全景”。
神經網路的基本結構相當簡單。但當它們訓練完成並確定所有權重等後,很難知道發生了什麼,甚至無法很好地將其視覺化。事實上,甚至連整個設定中哪些方面真正必不可少,哪些方面只是“細節”,可能自 20 世紀 40 年代計算神經網路首次發明以來就一直“沿用”至今,都遠未明朗。
好吧,我在這裡要做的就是“深入”這個問題,並儘可能地“簡化問題”。我將探索一些非常小的模型,除其他外,這些模型更易於視覺化。一開始,我完全不確定這些最小模型是否能夠重現我們在機器學習中看到的任何事物。但令人驚訝的是,它們似乎可以。
At the outset, I wasn’t at all sure that these minimal models would be able to reproduce any of the kinds of things we see in machine learning. But, rather surprisingly, it seems they can. 一開始,我完全不確定這些最小模型是否能夠重現我們在機器學習中看到的任何事物。但令人驚訝的是,它們似乎可以。
而且,它們構造簡單,因此更容易“看清內部”——也更容易瞭解機器學習背後的本質現象。人們可能認為,儘管機器學習系統的訓練可能是迂迴曲折的,但最終系統還是會透過某種可識別和“可解釋”的機制完成它的工作。但我們會發現,事實上通常情況並非如此。
相反,它看起來更像是訓練設法集中於一些相當瘋狂的計算,而這些計算“恰好取得了正確的結果”。機器學習似乎並沒有建立結構化的機制;相反,它基本上只是從計算宇宙中看到的典型複雜性中進行取樣,挑選出行為與所需行為重疊的部分。因此,從某種意義上說,機器學習的可能性最終是計算不可約性現象的另一個結果。
這是為什麼呢?嗯,正是因為計算不可約性,計算宇宙才如此豐富。更重要的是,正是因為計算不可約性,事物最終才變得足夠隨機,以至於訓練機器學習系統的自適應過程可以取得成功而不會陷入困境。
但是計算不可約性的存在還有另一個重要含義:即使我們可以期望找到有限的計算可約性,我們也不能指望對機器學習系統的功能有一個“一般敘述性解釋”。換句話說,機器學習不會有傳統的(比如說數學的)“一般科學”(或者,就此而言,也可能有神經科學)。相反,這個故事將更接近我長期以來探索的從根本上計算的“新科學”,它為我們帶來了物理專案和規則。
從很多方面來看,機器學習的問題都是自適應進化的一般問題的一種,例如在生物學中遇到的。在生物學中,我們通常想象我們想要自適應地最佳化系統的整體“適應性”;在機器學習中,我們通常嘗試自適應地“訓練”系統,使其與某些目標或行為保持一致,這些目標或行為通常由示例定義。(是的,在實踐中,這通常是透過嘗試最小化通常稱為“損失”的數量來實現的。)
In many ways, the problem of machine learning is a version of the general problem of adaptive evolution, as encountered for example in biology. 從很多方面來看,機器學習的問題都是自適應進化的一般問題的一種。
雖然生物學中普遍認為“萬物源於進化”,但其具體原理卻一直是一個謎。但(令我驚訝的是)我最近發現了一個非常簡單的模型,它似乎能夠很好地捕捉到生物進化的一些最基本的特徵。雖然該模型與我們將在這裡探討的機器學習模型不同,但它們確實有一些相似之處。最後我們會發現,機器學習和生物進化的核心現象似乎非常一致——並且都與計算不可約性現象有著根本的聯絡。
And in the end we’ll find that the core phenomena of machine learning and of biological evolution appear to be remarkably aligned—and both fundamentally connected to the phenomenon of computational irreducibility. 機器學習和生物進化的核心現象似乎非常一致——並且都與計算不可約性現象有著根本的聯絡。
我在這裡所做的大部分工作都集中在基礎理論問題上。但是,透過更多地瞭解機器學習的真正情況(以及什麼是必要的,什麼不是必要的),我們還將能夠開始看到在實踐中機器學習可以如何以不同的方式進行,可能具有更高的效率和更多的通用性。

傳統神經網路

關鍵詞

multilayer perceptron #weights #bias #activation function #the loss #randomness

為了開始理解機器學習的本質,讓我們從一個非常傳統且熟悉的例子開始:一個完全連線的(“多層感知器”)神經網路,它經過訓練可以計算某個函式f [ x ]:
如果在頂部給出一個值x作為輸入,那麼在“經過網路各層”之後,我們會在底部得到一個值,該值(幾乎完全)對應於我們的函式f [ x ]:
掃描不同的輸入x,我們會看到網路內部中間值的不同模式:
以下是(以線性和對數尺度)每個中間值隨x 的變化情況。最終值(此處突出顯示)的出現方式看起來非常複雜:
那麼神經網路最終是如何組成的呢?我們繪製的這些值是如何確定的?我們使用完全連線的多層網路的標準設定。每一層上的每個節點(“神經元”)都連線到上一層的所有節點 – 並且值從一層“流”到下一層,乘以與它們流經的連線相關的(正或負)“權重”(在圖片中用顏色表示)。給定神經元的值是透過將前一層的所有(加權)輸入加起來,為該神經元新增一個“偏差”值,然後將結果應用於某個(非線性)“啟用函式”(此處為 ReLU 或Ramp [ z ],即If [ z < 0, 0, z ])來找到的。
給定神經網路將計算的整體函式由神經網路中出現的權重和偏差集合(以及其整體連線架構和所使用的啟用函式)決定。機器學習的理念是透過自適應地從該函式的示例中“學習”來找到產生特定函式的權重和偏差。通常,我們可能從一組隨機權重開始,然後連續調整權重和偏差以“訓練”神經網路以重現該函式:
The idea of machine learning is to find weights and biases that produce a particular function by adaptively “learning” from examples of that function. 機器學習的理念是透過自適應地從該函式的示例中“學習”來找到產生特定函式的權重和偏差。
透過繪製訓練過程中各個權重的連續變化,我們可以瞭解這一過程是如何進展的(是的,這很複雜)(接近尾聲的峰值來自不影響整體行為的“中性變化”):
訓練的總體目標是逐步減少“損失” ——f [ x ]的真實值與神經網路生成的值之間的平均(平方)差。損失的演變定義了神經網路的“學習曲線”,向下的故障對應於神經網路實際上“取得突破”的點,能夠更好地表示函式:
值得注意的是,神經網路訓練通常會注入隨機性。因此,如果多次進行訓練,每次都會得到不同的網路和不同的學習曲線:
但神經網路訓練到底發生了什麼?實際上,我們正在尋找一種方法來將一個函式(至少在某種程度上近似)“編譯”成具有一定數量(實值)引數的神經網路。在這裡的例子中,我們恰好使用了大約 100 個引數。
But what’s really going on in neural net training? Effectively we’re finding a way to “compile” a function (at least to some approximation) into a neural net with a certain number of (real-valued) parameters. 但神經網路訓練到底發生了什麼?實際上,我們正在尋找一種方法來將一個函式(至少在某種程度上近似)“編譯”成具有一定數量(實值)引數的神經網路。
但是如果我們使用不同數量的引數,或者以不同的方式設定神經網路架構,會發生什麼情況呢?以下是幾個例子,表明對於我們試圖生成的函式,我們迄今為止使用的網路幾乎是可以工作的最小網路:
順便說一下,如果我們將啟用函式從 ReLU 更改

為更平滑的 ELU ,會發生什麼情況

稍後我們將討論使用離散系統進行機器學習時會發生什麼。為此,有趣的是,如果我們採用我們在這裡討論的神經網路,並在離散級別“量化”其權重(和偏差),看看會發生什麼:
結果是(正如最近的大規模神經網路的經驗所表明的那樣),神經網路的基本“操作”不需要精確的實數,但即使數字至少有些離散,它也能繼續存在——正如這個作為離散度 δ 函式的 3D 渲染也表明的那樣:

簡化拓撲:網格神經網路

關鍵詞

mesh neural net

到目前為止,我們一直在討論非常傳統的神經網路。但是要進行機器學習,我們真的需要具有所有這些細節的系統嗎?例如,我們真的需要每一層上的每個神經元都從前一層的每個神經元獲取輸入嗎?如果每個神經元最多隻從其他兩個神經元獲取輸入,會發生什麼情況 – 比如說,神經元有效地佈置在一個簡單的網格中?令人驚訝的是,事實證明,這樣的網路仍然能夠完美地生成像我們一直用作示例的函式:
Do we really need systems that have all those details? For example, do we really need every neuron on each layer to get an input from every neuron on the previous layer?
我們真的需要每一層上的每個神經元都從前一層的每個神經元獲取輸入嗎?如果每個神經元最多隻從其他兩個神經元獲取輸入,會發生什麼?
這種“網格神經網路”的一個優點是——就像細胞自動機一樣——它的“內部行為”可以很容易地以相當直接的方式視覺化。例如,以下是“網格網路如何生成其輸出”的視覺化,逐步顯示不同的輸入值x:
是的,即使我們可以將其視覺化,我們仍然很難理解“內部發生了什麼”。將網路中每個節點的中間值視為x函式並沒有多大幫助,儘管我們可以在函式f [ x ] 發生跳躍的地方“看到一些事情發生” :
那麼我們如何訓練網格神經網路呢?基本上,我們可以使用與上面看到的全連線網路相同的程式(ReLU 啟用函式似乎不適用於網格網路,因此我們在這裡使用 ELU):
以下是訓練過程中每個權重差異的演變情況:
以下是不同隨機種子的結果:
在我們所使用的(網格神經網路)規模下,我們的網格神經網路具有與上述全連線網路主要示例大致相同的連線數(因此權重也相同)。我們發現,如果我們嘗試減小網格神經網路的規模,它就無法很好地重現我們的函式:

讓一切離散化:生物進化的模擬

關鍵詞

discrete #single-point mutation #model of adaptive evolution

網格神經網路簡化了神經網路連線的拓撲結構。但一開始有些令人驚訝的是,我們似乎可以更進一步簡化我們正在使用的系統,並且仍然可以成功進行機器學習。特別是,我們會發現我們可以使我們的系統完全離散。
神經網路訓練的典型方法涉及逐步調整實值引數,通常使用基於微積分的方法,並求導。人們可以想象,任何成功的自適應過程最終都必須依賴於能夠進行任意微小的更改,這種更改是使用實值引數可以實現的。
但在研究生物進化的簡單理想化時,我最近發現了一些驚人的例子,事實並非如此——完全離散的系統似乎能夠捕捉到正在發生的事情的本質。
where completely discrete systems seemed able to capture the essence of what’s going on. 完全離散的系統似乎能夠捕捉到正在發生的事情的本質。
以 (3 色) 細胞自動機為例。規則顯示在左側,透過重複應用該規則 (從單細胞初始條件開始) 生成的行為顯示在右側:
該規則具有以下特性:它生成的模式(從單細胞初始條件)可以存活 40 步,然後消失(即每個細胞都變成白色)。而重點是,可以透過離散自適應過程找到此規則。其想法是從一個空規則開始,然後在每一步隨機更改規則中 27 個結果中的一個結果(即在規則中進行“單點突變”)。大多數此類更改將導致模式的“壽命”遠離我們的目標 40 — — 我們會丟棄這些更改。但我們可以逐漸積累“有益突變”
透過“逐步適應”,最終實現我們最初的 40 歲壽命規則:
我們可以繪製一張圖,記錄我們所做的所有嘗試,這些嘗試最終讓我們活到了40歲——我們可以將這條漸進的“適應度”曲線看作是我們之前看到的機器學習中的損失曲線:
如果我們做出不同的隨機突變序列,我們將得到不同的適應性進化路徑,以及生命週期為 40 的規則的不同“解決方案”:
有兩點立即引人注目。首先,它們基本上似乎都在“使用不同的想法”來實現目標(可能類似於生命之樹中不同分支的現象)。其次,它們似乎都沒有使用明確的“機械程式”(我們可以透過傳統工程構建的那種)來實現目標。相反,它們似乎正在尋找“自然的”複雜行為,這些行為恰好“恰好”實現了目標。
First, that they essentially all seem to be “using different ideas” to reach their goal (presumably analogous to the phenomenon of different branches in the tree of life). And second, that none of them seem to be using a clear “mechanical procedure” (of the kind we might construct through traditional engineering) to reach their goal. 首先,它們基本上似乎都在“使用不同的想法”來實現目標(可能類似於生命之樹中不同分支的現象)。其次,它們似乎都沒有使用明確的“機械程式”(我們可以透過傳統工程構建的那種)來實現目標。
當然,這種行為能夠實現我們在此設定的目標,並且基於隨機點突變的簡單選擇能夠成功實現必要的行為,這並非易事。但正如我在生物進化中討論的那樣,這最終是一個計算不可約性的故事——特別是在行為和實現行為所需路徑的多樣性方面。
How does this model of adaptive evolution relate to systems like neural nets?這種自適應進化模型與神經網路等系統有何關係呢?… But it turns out that—essentially as a consequence of computational irreducibility—the very simple method of successive random mutation can be successful. 但事實證明,本質上由於計算不可約性,非常簡單的連續隨機突變方法可以成功。
但是,那麼,這種自適應進化模型與神經網路等系統有何關係呢?在神經網路的標準語言中,我們的模型就像迴圈卷積網路的離散模擬。它之所以是“卷積的”,是因為在任何給定步驟中,相同的規則都會在元素陣列的區域性範圍內應用。它之所以是“迴圈的”,是因為實際上資料會反覆“透過”相同的規則。通常用於訓練傳統神經網路的程式(如“反向傳播”)無法訓練這樣的系統。但事實證明,本質上由於計算不可約性,非常簡單的連續隨機突變方法可以成功。

離散規則陣列中的機器學習

關鍵詞

rule array #single-point mutation #model of adaptive evolution #random mutations #basin of attraction

假設我們想要建立一個類似神經網路的系統,或者至少是一個網格神經網路,但我們希望它是完全離散的。(我的意思是“天生離散”,而不僅僅是從現有的連續系統中離散化。)我們該怎麼做呢?一種方法(碰巧,我在 20 世紀 80 年代中期首次考慮過,但從未認真探索過)是製作我們所謂的“規則陣列”。就像在細胞自動機中有一個細胞陣列。但這些細胞並非總是根據相同的規則進行更新,在細胞自動機模擬的“時空”中,每個位置的每個細胞都可以選擇不同的規則。(儘管這是一個相當極端的理想化,但我們可以想象這些不同的規則代表了網格神經網路中不同區域性權重選擇的離散模擬。)
作為第一個例子,讓我們考慮一個規則陣列,其中有兩種可能的規則選擇:k = 2,r = 1 元 胞自動機規則 4 和 146(分別是類 2 和類 3):
特定規則陣列由這些規則中的哪一個將用於陣列中的每個(“時空”)位置來定義。以下是幾個示例。在所有情況下,我們都從相同的單細胞初始條件開始。但在每種情況下,規則陣列都有不同的規則選擇排列——“執行”規則 4 的細胞被賦予背景

,而執行規則 146 的細胞被賦予

背景:

我們可以看到,不同的規則陣列選擇會產生非常不同的行為。但是(本著機器學習的精神)我們能否有效地“反轉這一點”,並找到一個可以產生我們想要的某些特定行為的規則陣列?
一種簡單的方法是直接模擬我們在生物進化的最小模型中所做的事情:逐步進行隨機的“單點突變” – 這裡“翻轉”規則陣列中僅一個規則的身份 – 然後只保留那些不會使情況變得更糟的突變。
作為我們的示例目標,我們要求找到一個規則陣列,使使用該規則陣列從單個單元格生成的模式“存活”恰好 50 步。起初,我們可能不太清楚我們能夠找到這樣的規則陣列。但事實上,我們的簡單自適應程式很容易做到這一點:
正如這裡的點所示,許多突變並不會導致更長的壽命。但偶爾,適應性過程會有一個“突破”,延長壽命——最終達到 50 歲:
正如我們的生物進化模型一樣,不同的隨機突變序列會導致不同的“解決方案”,這裡的問題是“活出恰好 50 ”:
其中一些實際上是“簡單的解決方案”,只需要一些突變。但大多數——就像我們在生物進化中看到的大多數例子一樣——似乎只是“碰巧奏效”,透過利用恰當的、相當複雜的行為來有效地發揮作用。
這些情況之間有明顯的區別嗎?看看上面例子的“適應度”(又稱“學習”)曲線集合,似乎沒有:
不難看出如何“構建一個簡單的解決方案”,只需在規則陣列中策略性地放置第二條規則的單個例項即可:
但關鍵在於,透過重複突變實現的適應性進化通常不會“發現”這種簡單的解決方案。而重要的是,適應性進化仍然可以成功找到某種解決方案——即使它不是這種“可理解”的解決方案。
到目前為止,我們使用的細胞自動機規則需要 3 個輸入。但事實證明,我們可以透過將普通的2 輸入布林函式放入規則陣列中來使事情變得更簡單。例如,我們可以從And和Xor函式(r = 1/2 規則 8 和 6 )建立一個規則陣列:
不同的And + Xor (

+ ) 規則陣列表現出不同的行為:

但是,是否存在例如And + Xor規則陣列,可以計算 16 個可能的(2 輸入)函式中的任何一個?我們無法使用 — 獲得Not或任何其他 8 個函式

,但事實證明,我們可以使用 — 獲得所有 8 個函式

(此處假設其他輸入為):

事實上,我們還可以為所有其他“偶數”布林函式設定And + Xor規則陣列。例如,以下是 3 輸入規則 30 和規則 110 布林函式的規則陣列:
值得一提的是,設定此類規則陣列的能力與我們正在使用的底層規則的功能完整性有關- 儘管它們並不完全相同。功能完整性是關於設定任意公式,實際上可以允許中間結果之間的長距離連線。在這裡,所有資訊都必須明確地流經陣列。但是例如 Nand ( r = 1/2 規則 7,

)的功能完整性允許它在與First(r = 1/2 規則 12,

)結合時生成所有布林函式,儘管有時所需的規則陣列非常大:

好的,但是如果我們嘗試使用自適應進化過程,比如解決尋找一個可以存活 30 步的模式的問題,會發生什麼?以下是And + Xor規則陣列的結果:
這裡還有其他“解決方案”的例子(在這種情況下,沒有一個看起來特別“機械”或“構造”):
但是如何學習原始的f [ x ] =函式呢?首先,我們必須決定如何在離散規則陣列系統中表示數字x和f [ x ]。一種方法是簡單地根據黑色單元格的位置(“獨熱編碼”)來表示。例如,在這種情況下,在對應於大約x = –1.1 的位置處有一個初始黑色單元格。然後,經過規則陣列後,結果就是在對應於f [ x ] = 1.0 的位置處有一個黑色單元格:
所以現在的問題是,我們能否找到一個規則陣列,根據我們想要的對映x

f [ x ] 成功地將初始單元格位置對映到最終單元格位置。好吧,這裡有一個至少接近這樣做的例子(請注意,陣列被視為迴圈的):

那麼我們是如何發現這一點的呢?我們只是使用了一個簡單的自適應進化過程。與機器學習中通常的做法直接類似,我們設定了“訓練示例”,形式如下:
然後,我們反覆在規則陣列中進行單點突變,保留那些與所有訓練示例的總差異沒有增加的突變。經過 50,000 次突變後,這得到了上述最終結果。
透過展示我們接近目標的中間結果序列(而不是僅僅遠離目標),我們可以瞭解“我們是如何到達那裡的”:
以下是相應的規則陣列,在每種情況下都突出顯示了已更改的元素(並顯示陣列中f [0]的計算):
不同的隨機突變序列將導致不同的規則陣列。但使用此處定義的設定,生成的規則陣列幾乎總能成功準確計算f [ x ]。以下是幾個示例 – 我們特別展示了f [0 ] 的計算:
再次強調,一個重要的結論是,我們沒有在發生的事情中看到“可識別的機制”。相反,看起來更像是我們得到的規則陣列“恰好”做了我們想要的計算。它們的行為很複雜,但不知何故,我們可以設法“利用它”來計算我們的f [ x ]。
但這種計算有多可靠?典型機器學習的一個關鍵特徵是它可以從給出的具體示例中“概括”。如何描述這種概括一直不清楚(什麼時候貓穿著狗裝的影像開始被識別為狗的影像?)。但是——至少當我們談論分類任務時——我們可以從吸引域的角度來思考正在發生的事情,這些吸引域會引導我們找到與我們的類別相對應的吸引子。
A key feature of typical machine learning is that it can “generalize” away from the specific examples it’s been given. It’s never been clear just how to characterize that generalization (when does an image of a cat in a dog suit start being identified as an image of a dog?). 典型機器學習的一個關鍵特徵是它可以從給出的具體示例中“概括”。如何描述這種概括一直不清楚(什麼時候貓穿著狗裝的影像開始被識別為狗的影像?)
不過,在我們這裡探索的這種離散系統中,分析起來要容易得多。例如,我們可以輕鬆地列舉所有訓練輸入(即所有包含單個黑色細胞的初始狀態),然後檢視這些輸入導致任何給定細胞變黑的頻率:
順便說一下,以下是在訓練過程中連續“突破”時該圖發生的情況:
但是,如果輸入中包括不只包含一個黑色單元格的輸入,該怎麼辦呢?好吧,我們可以列舉所有輸入,並計算陣列中每個單元格為黑色的總體頻率:
正如我們所料,結果比我們僅使用訓練輸入得到的結果“模糊”得多。但訓練資料中出現的f [ x ] 離散值仍然很明顯。如果我們繪製給定最終單元格為黑色的總體機率,我們會看到f [ x ]取值為 0 和 1 的位置出現峰值:
但由於我們的系統是離散的,我們可以明確地看到會發生什麼結果:
總體而言,最常見的是“毫無意義”的全白狀態——這基本上發生在從輸入到輸出的計算“永遠無法完成”時。但第二常見的結果恰好對應於f [ x ] = 0 和f [ x ] = 1。再接下來是“疊加”結果,其中f [ x ] 實際上是“0 和 1”。
但是,好吧,那麼這裡的各種結果“處於吸引盆地中”(即會演化成)的初始狀態是什麼呢?上面最後一欄中相當平坦的圖表明,黑色細胞的整體密度幾乎不能說明某個特定初始狀態會演化成什麼吸引子。
因此,這意味著我們必須研究初始條件下細胞的具體配置。例如,從初始條件開始
演變為:
現在我們可以問一下,如果我們觀察一系列略有不同的初始條件,會發生什麼。這裡我們用黑白兩色表示初始條件仍然會演變為原始的“吸引子”狀態,用粉色表示演變為某種不同狀態:
這裡面到底發生了什麼?下面是幾個例子,突出顯示了由於初始條件改變而值發生變化的單元格:
正如機器學習中的典型情況一樣,似乎沒有任何簡單的特徵來描述吸引盆(basin of attraction)的形式。但現在我們知道了原因是什麼:這是計算不可約性的另一個結果。計算不可約性為我們提供了有效的隨機性,使我們能夠透過自適應進化找到有用的結果,但它也會導致變化產生看似隨機和不可預測的影響。(順便說一句,值得注意的是,我們可以透過專門包括注入了“噪音”的訓練資料示例來顯著提高吸引盆的穩健性。)

多路變異圖

關鍵詞

multiway graph #single-point mutation

在實踐中進行機器學習時,目標通常是找到一些權重集合等,以成功解決特定問題。但一般會有許多這樣的權重集合等。對於典型的連續權重和隨機訓練步驟,很難看出可能性的整個“集合”。但在我們的離散規則陣列系統中,這變得更加可行。
考慮一個只有兩條可能規則的 2×2 規則陣列。我們可以製作一個圖,其邊表示此規則陣列中可能發生的所有可能的“點突變”:
在我們的自適應進化過程中,我們總是圍繞這樣的圖表移動。但通常大多數“移動”最終都會進入被拒絕的狀態,因為它們會增加我們定義的損失。
考慮生成And + Xor規則陣列的問題,其中我們以生命週期為 4 的模式結束。將損失定義為我們距離這個生命週期有多遠,我們可以繪製一個圖表,顯示所有可能的自適應進化路徑,這些路徑總是逐步減少損失:
其結果是一種多向圖,我們現在已經在許多情況下看到了這種型別的圖——尤其是我們最近對生物進化的研究。
儘管這個特定示例非常簡單,但總體思路是,這種圖的不同部分代表解決問題的“不同策略”。與我們的物理專案和遊戲圖等研究直接類似,我們可以想象這些策略被佈置在由多路圖中配置的共同祖先定義的“分支空間”中。
可以預料的是,在某些情況下,分支圖會相當統一,但在其他情況下,分支圖會有很多分離的部分,代表完全不同的策略。當然,底層策略可能不同並不意味著系統的整體行為或效能會有明顯差異。事實上,在大多數情況下,計算不可約性將導致足夠的有效隨機性,以至於不會出現可辨別的差異。
但無論如何,這裡有一個從包含And和Xor的規則陣列開始的示例- 我們觀察到自適應進化的不同分支,這些分支導致找到生命週期恰好為 4 的配置的問題的不同解決方案:

最佳化學習過程

關鍵詞

plateaus #path of steepest descent

機器學習中應該如何進行學習?在傳統神經網路的實際工作中,學習通常使用反向傳播等系統演算法方法進行。但到目前為止,我們所做的一切都是簡單得多的事情:我們透過連續進行隨機點突變並僅保留那些不會讓我們遠離目標的突變來“學習”。是的,有趣的是,這樣的程式可以起作用 – 而且(正如我們在其他地方討論過的)這可能與理解生物進化等現象非常相關。但是,正如我們將看到的,即使對於我們正在研究的離散系統,也有更有效(可能更有效)的機器學習方法。
How should one actually do the learning in machine learning? In practical work with traditional neural nets, learning is normally done using systematic algorithmic methods like backpropagation. But so far, all we’ve done here is something much simpler: we’ve “learned” by successively making random point mutations, and keeping only ones that don’t lead us further from our goal. 機器學習中應該如何進行學習?在傳統神經網路的實際工作中,學習通常使用反向傳播等系統演算法方法進行。但到目前為止,我們所做的一切都是簡單得多的事情:我們透過連續進行隨機點突變並僅保留那些不會讓我們遠離目標的突變來“學習”。
讓我們先回顧一下之前的例子,即找到一個And + Xor規則陣列,該陣列的“生命週期”正好是 30。在我們的自適應(“學習”)過程的每一步,我們都會進行單點突變(更改規則陣列中的單個規則),如果它不會讓我們離目標更遠,就保留該突變。突變逐漸積累——每隔一段時間就會達到一個規則陣列,使生命週期更接近 30。就像上面一樣,這是透過連續突變實現的生命週期的圖——其中“內部”紅點對應於被拒絕的突變:
我們看到一系列“平臺期”,突變在這些平臺期不斷積累,但不會改變整體壽命。在這些平臺期之間,我們偶爾會看到“突破”,壽命會突然增加。以下是這些突破的實際規則陣列配置,其中突出顯示了自上次突破以來的突變:
但最終,這裡的過程是相當浪費的;在這個例子中,我們總共進行了 1705 次變異,但其中只有 780 次真正有助於生成最終的規則陣列;所有其他的都被丟棄了。
那麼我們如何才能做得更好呢?一種策略是嘗試在每一步中找出哪種突變“最有可能產生影響”。而實現此目的的一種方法是依次在每一步中嘗試每種可能的突變(如多向進化)——並檢視每種突變對最終壽命的影響。由此我們可以構建一個“變化圖”,其中我們給出與每個特定細胞的突變相關的壽命變化。對於規則陣列的每種配置,即在自適應進化的每一步,結果都會不同。但例如,對於上面顯示的特定“突破”配置,結果如下(灰色區域中的元素如果發生變化,不會影響結果;紅色區域將產生積極影響(紅色越深表示越積極),藍色區域將產生消極影響):
假設我們從隨機規則陣列開始,然後反覆構建變化圖並應用它所暗示的突變,從而產生最積極的變化——實際上,每一步都遵循“最陡下降路徑”以達到我們想要的壽命(即減少損失)。那麼我們得到的“突破”配置序列是:
實際上,這比我們的純單點突變序列對應於稍微更直接的“解決方案路徑”。
順便說一句,達到一定壽命的特定問題具有足夠簡單的結構,以至於這種“最速下降”方法 – 從一個簡單的統一規則陣列開始時 – 找到一條非常“機械”(如果很慢)的解決方案路徑:
那麼學習f [ x ] =的問題呢?我們再次可以根據我們定義的損失繪製變化圖。以下是一系列“突破性”配置的結果。灰色區域是變化“中性”的區域,因此仍然可以進行探索而不會影響損失。紅色區域實際上是“鎖定”的區域,任何變化都會對損失產生不利影響:
那麼,如果我們遵循“最陡下降路徑”,始終根據變化圖做出最佳更改,會發生什麼情況?結果實際上非常不令人滿意。從幾乎任何初始條件開始,系統都會很快陷入困境,並且永遠找不到任何令人滿意的解決方案。實際上,似乎確定地遵循最陡下降路徑會將我們引向無法逃脫的“區域性最小值”。那麼,如果只看變化圖,我們會錯過什麼?我們構建的變化圖有一個侷限性,即它會分別評估每個可能的個體突變的影響。它不能同時處理多個突變——如果要找到“最快的成功路徑”並避免陷入困境,這通常是必需的。
但即使在構建變化圖時也已經存在問題。因為至少直接計算它的方式擴充套件性很差。在n × n規則陣列中,我們必須檢查翻轉約n2 個值的效果,並且對於每個值,我們必須執行整個系統——總共需要約n4 次操作。並且必須對學習過程的每個步驟分別執行此操作。
那麼傳統神經網路如何避免這種低效率呢?答案在某種意義上涉及數學技巧。至少在通常情況下,它完全基於神經網路中權重和值的連續性——這使我們能夠使用微積分方法。
假設我們有一個這樣的神經網路
計算某個特定函式f [ x ]:
我們可以問一下,當我們改變網路中的每個權重時,這個函式如何變化:
實際上,這給了我們類似上面的“變化圖”的東西。但有一個重要的區別。因為權重是連續的,我們可以考慮對它們進行無窮小的改變。然後我們可以問這樣的問題:“當我們對某個權重w i進行無窮小的改變時, f [ x ] 如何變化?”——或者等價地,“在點x處, f對w i的偏導數是多少?”但現在我們可以使用無窮小變化的一個關鍵特徵:它們總是可以被認為是“線性相加”(本質上是因為 ε 2總是可以忽略不計)。或者換句話說,我們可以透過給出權重空間中的“方向”來總結任何無窮小的變化,即一個向量,表示每個權重應該(無窮小)改變多少。所以如果我們想盡快改變f [ x ](無窮小),我們應該沿著由f對權重的所有導數定義的最陡下降方向前進。
在機器學習中,我們通常會嘗試設定權重,以便我們生成的f [ x ]的形式能夠成功最小化我們定義的損失。我們透過逐步“在權重空間中移動”來實現這一點——每一步都計算最陡下降的方向以瞭解下一步該去哪裡。(在實踐中,有各種各樣的技巧,如“ADAM”,試圖最佳化實現這一目標的方式。)
但是,我們如何高效地計算f對每個權重的偏導數呢?是的,我們可以對每個權重分別生成類似上述的。但事實證明,微積分的一個標準結果為我們提供了一個效率高得多的程式,實際上可以“最大限度地重複使用”已經完成的計算部分。
一切都始於巢狀(即組合)函式導數的教科書鏈式法則:
這基本上表明,“整個鏈” d [ c [ b [ a [ x ]]]] 的值的(無窮小)變化可以計算為與鏈中每個“環節”相關的(無窮小)變化的乘積。但關鍵的觀察是,當我們計算鏈中某個點的變化時,我們已經必須進行大量所需的計算 – 只要我們儲存了這些結果,我們就始終只需執行增量計算。
那麼這如何應用於神經網路呢?神經網路中的每一層實際上都在進行函式組合。例如,我們的d [ c [ b [ a [ x ]]]] 就像一個簡單的神經網路:
但是權重呢?畢竟,我們想要找到改變權重的效果。好吧,我們可以將它們明確地包含在我們正在計算的函式中:
然後我們原則上可以符號式地計算這些權重的導數:
對於我們上面的網路
相應的表示式(忽略偏差)是
其中 φ 表示我們的啟用函式。我們再次處理巢狀函式,並且再次——儘管在這種情況下它有點複雜——可以透過逐步評估鏈式法則中的項來計算導數,實際上使用標準的神經網路方法“反向傳播”。
那麼離散情況呢?我們可以使用類似的方法嗎?我們不會在這裡詳細討論這個問題,但我們會給出一些可能涉及的內容的提示。
作為一個可能更簡單的案例,我們來考慮普通的細胞自動機。我們的變化圖的類似物詢問特定“輸出”細胞的值如何受到其他細胞變化的影響——或者實際上是輸出值的“偏導數”相對於其他細胞值的變化是多少。
例如,考慮此細胞自動機演化中突出顯示的“輸出”細胞:
現在我們可以檢視此陣列中的每個單元格,並根據翻轉該單元格的值(然後從該點向前執行細胞自動機)是否會改變輸出單元格的值來製作更改圖:
如果我們檢視不同的“輸出單元”,變化圖的形式會有所不同:
順便說一下,這裡有一些更大的變化圖,以及其他一些細胞自動機規則:
但有沒有辦法逐步構建這樣的變化圖?有人可能會認為,至少對於細胞自動機來說,(與這裡的情況不同)基本上是可逆的。但實際上這種可逆性似乎沒有多大幫助——因為雖然它允許我們“回溯”細胞自動機的整個狀態,但它不允許我們追蹤單個細胞的單獨影響。
那麼如何使用離散的導數模擬和鏈式法則呢?例如,我們將規則 30 中一步計算出的函式稱為細胞自動機演化w [ x , y , z ]。我們可以將此函式在點x處關於x的“偏導數”視為表示當x從給定值開始翻轉時, w的輸出是否發生變化:
(請注意,“沒有變化”表示為False或,而變化表示為True或。是的,可以在這裡明確計算規則結果,然後從中推匯出函式形式,或者可以使用符號規則直接推匯出函式形式。)
可以計算任意布林函式的導數的離散模擬。例如,我們有
我們可以將其寫成:
我們還有:
下面是所有 2 輸入布林函式的“布林導數”表:
事實上,有一整套“布林微積分”可以用於計算這些型別的導數。特別是,有一個直接類似於鏈式法則的公式:
其中Xnor [x,y]實際上是相等性測試x == y:
但是,好吧,我們如何使用它來建立變化圖?在我們簡單的細胞自動機案例中,我們可以將變化圖視為表示輸出單元的變化如何“傳播回”到先前的單元。但是,如果我們只是嘗試應用離散微積分規則,我們會遇到一個問題:不同的“鏈式規則鏈”可能意味著同一單元值的不同變化。在連續情況下,由於無窮小的工作方式,這種路徑依賴不會發生。但在離散情況下確實如此。最終,我們正在進行一種回溯,它只能作為多路系統才能真正忠實地表示出來。(儘管如果我們只想要機率,例如,我們可以考慮對多路系統的分支取平均值——我們上面展示的變化圖實際上是對多路系統進行閾值處理的結果。)
但是,儘管在“簡單”細胞自動機情況下出現了這樣的困難,但這些方法在我們最初更復雜的規則陣列情況下似乎效果更好。我們不僅要根據規則陣列中的值來尋找導數,還要根據規則的選擇(這類似於連續情況下的權重)來尋找導數,這其中有很多微妙之處。
讓我們考慮一下And + Xor規則陣列:
我們的損失是其值與底部顯示的行不一致的單元格的數量。現在,我們可以使用離散導數方法以直接“向前”和“向後”的方式為該規則陣列構建一個變化圖(我們透過始終選擇“多數”值來有效地解決少量“多向行為”):
雖然結果並不完全相同,但結果類似。以下是其他幾個示例:
是的,從細節上看,前向方法和後向方法的結果本質上總是存在區域性差異。但後向方法(如普通神經網路中的反向傳播)可以更有效地實現。對於實際的機器學習而言,它實際上可能完全令人滿意——尤其是考慮到前向方法本身只是為哪種突變最好這個問題提供了近似值。
舉個例子,對於上面展示的“突破性”配置,以下是學習函式f [ x ]=問題的前向和後向方法的結果:

我們能學到什麼?

關鍵詞

piecewise linear function

我們已經展示了不少機器學習的應用例項。但我們尚未解決的一個基本問題是,機器學習究竟能學到什麼。在討論這個問題之前,還有一個問題:給定一個特定的底層系統,它能表示哪些型別的函式?
作為第一個例子,考慮以下形式的最小神經網路(本質上是單層感知器):

以 ReLU (又稱Ramp)作為啟用函式,且第一組權重均取 1,此類神經網路計算出的函式形式如下:

有了足夠的權重和偏差,這種形式可以表示任何分段線性函式——本質上只是透過使用偏差移動斜坡,並使用權重縮放它們。例如考慮以下函式:
這是由上述神經網路計算出的函式——它是如何透過新增與各個中間節點(神經元)相關的連續斜坡來構建的:

(同樣可以從 ELU 等啟用函式中獲取所有平滑函式。)

如果我們嘗試用多個引數來表示函式,事情會變得稍微複雜一些。使用單箇中間層,我們只能獲得“分段(超)平面”函式(即僅線上性“斷層線”處改變方向的函式):
但是,由於已經有了總共兩個中間層,並且每個層中都有足夠多的節點,我們可以生成任意數量引數的分段函式。
如果我們限制節點的數量,那麼我們粗略地限制了函式值中不同線性區域之間的邊界數量。但是,隨著我們增加具有給定節點數量的層數,我們基本上增加了函式值內多邊形區域可以具有的邊數:
那麼我們之前討論的網格網路會發生什麼情況呢?以下是一些隨機示例,結果與具有可比節點總數的淺層全連線網路非常相似:
好的,那麼我們的完全離散規則陣列怎麼樣?它們可以表示什麼函式?當我們生成規則陣列來表示各種布林函式時,我們已經看到了部分答案。事實證明,有一個基於布林可滿足性的相當有效的程式可以明確找到可以表示給定函式的規則陣列 – 或者確定沒有規則陣列(例如給定大小的規則陣列)可以做到這一點。
使用此過程,我們可以找到代表所有(“偶數”)3 輸入布林函式(即r = 1 細胞自動機規則)的最小And + Xor規則陣列:
總是可以透過 2n 位的陣列指定任何n輸入布林函式,如下所示:
但是從上圖我們可以看出,當我們將布林函式“編譯”成And + Xor規則陣列時,它們可以採用不同的位數(即規則陣列中元素的數量不同)。(實際上,函式的“演算法資訊內容”因我們用來表示它們的“語言”而異。)例如,在此處顯示的n = 3 的情況下,最小規則陣列大小的分佈為:
有些函式很難用And + Xor規則陣列來表示(似乎需要 15 個規則元素),而有些函式則比較容易。這類似於我們將布林函式表示為布林表示式(例如以合取正規化)並計算所使用的(一元和二元)運算總數時發生的情況:
好的,所以我們知道原則上存在一個And + Xor規則陣列,它可以計算任何(偶數)布林函式。但現在我們可以問,自適應進化過程是否真的可以找到這樣的規則陣列——比如說,透過一系列單點突變。好吧,如果我們進行這樣的自適應進化——損失計算規則 254 的“錯誤輸出”數量——那麼可以產生一系列連續的突破配置:
結果不如上述最小解決方案那麼緊湊。但似乎總是有可能找到至少一些And + Xor規則陣列來“解決問題”,只需使用單點突變的自適應進化即可。
以下是一些其他布林函式的結果:
因此,是的,不僅所有(偶數)布林函式都可以用And + Xor規則陣列來表示,而且它們還可以透過這種形式進行學習,只需透過單點突變的自適應進化即可。
在上面我們所做的工作中,我們研究了機器學習在特定情況下(例如函式)如何使用規則陣列。但現在我們有一個案例,我們可以明確列舉所有可能的函式,至少是給定類的函式。從某種意義上說,我們看到的證據表明,機器學習往往非常廣泛——並且至少在原則上能夠學習幾乎任何函式。
當然,可能會有特定的限制。例如,我們在這裡使用的And + Xor規則陣列不能表示 的(“奇數”)函式

。(我們上面討論的Nand + First規則陣列卻可以。)但總的來說,這似乎反映了計算等價原理,即幾乎任何設定都能夠表示任何函式,並且還可以自適應地“學習”它。

順便說一句,當處理離散(可數)函式時,討論表示或學習“任何函式”的問題要容易得多——因為人們可以期望能夠“精確地得到”給定的函式,或者不能。但對於連續函式,情況會更復雜,因為人們幾乎不可避免地要處理近似值(除非可以使用符號形式,而符號形式基本上是離散的)。因此,例如,雖然我們可以說(如上所述)(ReLU) 神經網路可以表示任何分段線性函式,但一般來說,我們只能想象連續接近任意函式,就像在簡單的傅立葉級數中逐步新增更多項一樣:
回顧離散規則陣列的結果,一個值得注意的觀察是,雖然我們可以成功重現所有這些不同的布林函式,但實現這一點的實際規則陣列配置往往看起來相當混亂。事實上,它與我們在整個過程中看到的非常相似:機器學習可以找到解決方案,但它們不是“結構化解決方案”;它們實際上只是“碰巧有效”的解決方案。
是否有更結構化的方式用規則陣列來表示布林函式?以下是代表規則 30 的兩個可能的最小大小And + Xor規則陣列:
在下一個更大的尺寸下,規則 30 的可能性更多:
另外還有可以表示規則 110 的規則陣列:
但在所有這些情況下,都沒有明顯的結構讓我們立即看到這些計算是如何進行的,或者正在計算什麼函式。但是,如果我們嘗試透過標準工程方法顯式地構建一個計算特定函式的規則陣列,會怎麼樣呢?我們可以從獲取規則 30 的函式開始,並用And和Xor 的形式(即ANF 或“代數正規化”)編寫它:
我們可以想象使用“評估圖”來實現這一點:

但是現在很容易將其轉變為規則陣列(是的,我們還沒有完全完成並安排複製輸入等):

針對不同的輸入“評估”此規則陣列,我們可以看到它確實給出了規則 30:
對規則 110 執行同樣操作,And + Xor表示式為
評估圖是
規則陣列為:
至少,以評估圖為指導,我們可以很容易地“看到這裡發生了什麼”。但我們使用的規則陣列比上面的最小解決方案大得多,甚至比我們透過自適應進化找到的解決方案大得多。
這是在許多其他型別的系統中看到的典型情況(例如排序網路):有可能有一個具有清晰結構和規律性並且“可理解”的“構造解決方案”。但最小解決方案(或透過自適應進化找到的解決方案)往往要小得多。但它們幾乎總是在很多方面看起來是隨機的,並且不容易理解或解釋。
到目前為止,我們一直在研究計算特定函式的規則陣列。但要了解規則陣列可以做什麼,我們可以考慮“可程式設計”的規則陣列,因為它們的輸入指定它們應該計算什麼函式。例如,這裡有一個And + Xor規則陣列(由自適應進化發現),它將任何(偶數)布林函式的“位模式”作為左側的輸入,然後將該布林函式應用於右側的輸入:
使用相同的規則陣列,我們現在可以計算任何可能的(偶數)布林函式。例如,這裡它正在評估Or:

其他型別的模型和設定

關鍵詞

sequence continuation

我們的主要目標是建立能夠捕捉神經網路和機器學習最基本特徵的模型,但這些模型的結構足夠簡單,我們可以輕鬆“檢視內部”並瞭解它們在做什麼。我們主要關注規則陣列,以此提供標準“感知器式”前饋神經網路的最小模擬。但是其他架構和設定呢?
實際上,我們的規則陣列是細胞自動機的“時空非齊次”概括——其中自適應進化決定在每個(空間)位置和每個(時間)步驟應該使用哪個規則(比如來自有限集合)。另一種理想化(事實上我們已經在上面的一節中使用過)是擁有一個普通的齊次細胞自動機——但只有一個由自適應進化決定的“全域性規則”。規則陣列類似於前饋網路,其中規則陣列中的給定規則實際上只在資料“流經”系統時使用一次。普通的齊次細胞自動機就像迴圈網路,其中單個數據流實際上會一遍又一遍地遵循相同的規則。
這些情況之間存在各種插值。例如,我們可以想象一個“分層規則陣列”,其中不同步驟的規則可以不同,但給定步驟上的規則都是相同的。這樣的系統可以看作是卷積神經網路的理想化,其中給定層將相同的核心應用於所有位置的元素,但不同的層可以應用不同的核心。
分層規則陣列無法像通用規則陣列那樣編碼那麼多資訊。但它仍然能夠顯示機器學習式的現象。例如,這是分層And + Xor規則陣列的自適應進化,逐步解決生成一個只存在 30 步的模式的問題:
也可以想象“垂直分層”的規則陣列,其中不同的規則用於不同的位置,但任何給定的位置都會永遠執行相同的規則。然而,至少對於我們在這裡考慮的問題型別而言,僅僅能夠選擇執行不同規則的位置似乎還不夠。似乎要麼需要在不同的(時間)步驟中更改規則,要麼需要能夠自適應地發展底層規則本身。
規則陣列和普通細胞自動機具有共同的特徵,即每個細胞的值僅取決於前一步相鄰細胞的值。但在神經網路中,給定節點的值取決於前一層的許多節點的值是標準做法。在神經網路中,這一點很簡單,因為來自先前節點的值(加權,也可能經過其他變換)只需透過簡單的數值加法即可組合 – 並且加法(n元且具有結合性)可以接受任意數量的“輸入”。然而,在細胞自動機(或布林函式)中,輸入的數量始終是確定的,由函式的結構決定。在最簡單的情況下,輸入僅來自最近相鄰的細胞。但並不要求事情必須這樣運作 – 例如,我們可以選擇任何“本地模板”來引入函式的輸入。這個模板可以在每個位置和每個步驟上都是相同的,也可以在不同位置從某個集合中以不同的方式挑選出來——實際上給了我們“模板陣列”以及規則陣列。
那麼,如果像我們在上面的第一個神經網路示例中那樣擁有一個完全連線的網路,會怎麼樣呢?要建立這種離散模擬,我們首先需要某種離散的n元關聯“累加器”函式來填補數值加法的位置。為此,我們可以選擇一個像And、Or、Xor或Majority這樣的函式 。如果我們不打算在給定層的每個節點上都得到相同的值,我們需要設定與每個連線相關的權重的某種模擬——我們可以透過對流經每個連線的值應用Identity或Not(即翻轉或不翻轉)來實現。
下面是此類網路的示例,經過訓練可以計算我們上面討論的函式:
這裡只有兩種連線:翻轉和非翻轉。在每個節點上,我們都在計算多數函式——如果其輸入的多數為 1,則給出值 1,否則給出值 0。藉助我們之前使用的輸入和輸出的“獨熱編碼”,以下是該網路如何評估我們的函式的幾個示例:
這是僅使用應用於連線型別的 1000 步單點突變進行訓練的。損失系統地下降——但即使實現了零損失(即即使在完全學習該函式之後),連線型別的配置仍然看起來相當隨機:
在我們剛剛所做的操作中,我們假設所有連線都繼續存在,儘管它們的型別(或有效符號)可能會發生變化。但我們也可以考慮一個網路,其中連線最終可能會在訓練期間被清零 – 因此它們實際上不再存在。
我們在這裡用機器學習所做的大部分工作都集中在嘗試學習x

 f [ x ] 形式的變換。但機器學習的另一個典型應用是自動編碼——或者實際上是學習如何壓縮代表特定示例集的資料。同樣,可以使用規則陣列完成這樣的任務,透過一系列單點突變實現學習。

首先,考慮訓練一個規則陣列(由細胞自動機規則 4 和 146 組成)來重現任意寬度的黑色細胞塊,而不改變其形狀。有人可能認為這很簡單。但事實並非如此,因為實際上,初始資料不可避免地會在規則陣列中“磨碎”,最後必須重新構建。但是,是的,我們仍然可以訓練一個規則陣列,至少粗略地做到這一點——儘管我們發現能夠做到這一點的規則陣列看起來非常隨機:
但要設定一個非平凡的自動編碼器,讓我們想象一下,我們逐漸“擠壓”中間的陣列,建立一個越來越窄的“瓶頸”,資料必須透過這個瓶頸流動。在瓶頸處,我們實際上擁有原始資料的壓縮版本。我們發現,至少在瓶頸的某個寬度範圍內,可以建立規則陣列,這些規則陣列有合理的機率可以作為原始資料的成功自動編碼器:
LLM 的成功凸顯了機器學習在序列延續方面的應用,以及 Transformer 在這方面的有效性。但與其他神經網路一樣,實際使用的 Transformer 的形式通常非常複雜。但能否找到一個能夠捕捉“Transformer 的本質”的最小模型呢?
The success of LLMs has highlighted the use of machine learning for sequence continuation—and the effectiveness of transformers for this. But just as with other neural nets, the forms of transformers that are used in practice are typically very complicated. But can one find a minimal model that nevertheless captures the “essence of transformers”? LLM 的成功凸顯了機器學習在序列延續方面的應用,以及 Transformer 在這方面的有效性。但與其他神經網路一樣,實際使用的 Transformer 的形式通常非常複雜。但能否找到一個能夠捕捉“Transformer 的本質”的最小模型呢?
假設我們有一個想要繼續的序列,例如:
我們希望用向量對每個可能的值進行編碼,如下所示
例如,我們的原始序列被編碼為:
然後我們有一個“頭”,它讀取一組連續的向量,挑選出某些值並將它們成對地送入And和Xor函式,以獲得布林值向量:
最終,這個頭部將沿著我們的序列“滑動”,“預測”序列中的下一個元素是什麼。但不知何故,我們必須從布林值向量轉到序列元素(的機率)。可能我們只需使用規則陣列就可以做到這一點。但為了我們的目的,我們將使用完全連線的單層Identity + Not網路,其中在每個輸出節點,我們只需找到到達它的值的數量的總和 – 並將其視為確定(透過 softmax )相應元素的機率:
在這種情況下,具有最大值的元素是 5,因此在“零溫度”下,這將是我們對下一個元素的“最佳預測”。
為了訓練整個系統,我們只需對所有事物進行一系列隨機點突變,保留不會增加損失的突變(其中損失基本上是預測的下一個值和實際的下一個值之間的差異,或者更準確地說是“分類交叉熵”)。以下是這種損失在典型的此類訓練中的進展方式:
在本次訓練結束時,以下是我們最小變壓器的元件:
首先是序列中不同可能元素的編碼。然後是頭部,這裡顯示應用於原始序列的第一個元素的編碼。最後有一個單層離散網路,它從頭部獲取輸出,並推斷出接下來不同元素的相對機率。在本例中,下一個元素的最高機率預測應該是元素 6。
為了模擬 LLM,我們從一些初始“提示”開始,即適合頭部寬度(“上下文視窗”)的初始序列。然後我們逐步應用我們的最小變換器,例如在每一步都將下一個元素作為具有最高預測機率的元素(即在“零溫度下”執行)。使用此設定,“預測強度”集合以灰色顯示,“最佳預測”以紅色顯示:
在我們原始訓練資料之外執行這個程式,我們發現我們得到了一個連續正弦波的“預測”:
正如我們所料,我們的最小 Transformer 能夠做出如此合理的預測,這依賴於正弦曲線的簡單性。如果我們使用“更復雜”的訓練資料,例如“數學定義的”(

)藍色曲線

訓練和執行最小變壓器的結果現在是:
而且,毫不奇怪,它無法“計算出正確的計算結果”來正確地延續曲線。順便說一句,不同的訓練執行將涉及不同的突變序列,並會產生不同的預測(通常伴有周期性的“幻覺”):
在研究“感知器式”神經網路時,我們最終使用規則陣列(或實際上是時空非均勻細胞自動機)作為最小模型。在這裡,我們最終得到了一個稍微複雜一些的 Transformer 神經網路最小模型。但如果我們進一步簡化它,我們最終得到的將不是細胞自動機之類的東西,而是標籤系統之類的東西,其中有一個元素序列,並且在每個步驟中從開頭刪除一個塊,並且根據其形式在末尾新增某個塊,如下所示:
Here we’ve ended up with a slightly more complicated minimal model for transformer neural nets. But if we were to simplify it further, we would end up not with something like a cellular automaton but instead with something like a tag system. 如果我們進一步簡化它,我們最終得到的將不是細胞自動機之類的東西,而是標籤系統之類的東西。
是的,這樣的系統可以產生極其複雜的行為——這強化了我們在這裡反覆看到的想法,即機器學習透過選擇與已設定的目標相符的複雜性來發揮作用。
按照這種思路,我們可以將各種不同的計算系統視為機器學習的基礎。我們一直在研究類似細胞自動機和標籤系統的例子。但例如,我們的物理專案向我們展示了基於超圖重寫的系統的強大功能和靈活性。從我們在這裡看到的情況來看,超圖重寫之類的東西似乎可以作為機器學習更強大、更靈活的基礎。

那麼機器學習到底發生了什麼?

關鍵詞

#irreducible computation #path of steepest descent

我認為,從我們在這裡所做的工作中可以得出幾個相當驚人的結論。首先,比傳統神經網路簡單得多的模型似乎能夠捕捉機器學習的基本特徵——事實上,這些模型很可能是新一代實用機器學習的基礎。
但從科學的角度來看,這些模型的一個重要特點是,它們的結構非常簡單,可以立即將其內部運作視覺化。研究這些視覺化結果時,最引人注目的特徵是它們看起來非常複雜。
one of the things that’s important about these models is that they are simple enough in structure that it’s immediately possible to produce visualizations of what they’re doing inside. And studying these visualizations, the most immediately striking feature is how complicated they look. 這些模型的一個重要特點是,它們的結構非常簡單,可以立即將其內部運作視覺化。研究這些視覺化結果時,最引人注目的特徵是它們看起來非常複雜。
機器學習可能會以某種方式“破解系統”,並找到其功能的簡單表示。但這似乎根本不是正在發生的事情。相反,似乎正在發生的事情是,機器學習在某種意義上只是“搭便車”利用了計算宇宙的普遍豐富性。它不是“專門構建一個人需要的行為”;相反,它所做的是利用計算宇宙中“已經存在”的行為。
這種方法之所以可能奏效,取決於一個至關重要的(乍一看可能出乎意料的)事實:在計算型宇宙中,即使是非常簡單的程式也能普遍產生各種複雜的行為。關鍵在於,這種行為具有足夠的豐富性和多樣性,因此有可能找到符合機器學習目標的例項。從某種意義上說,機器學習所做的就是在計算型宇宙中“挖掘”能夠執行所需操作的程式。
這並不是說機器學習可以確定一個特定的精確程式。相反,在機器學習的典型成功應用中,有很多程式“或多或少做了正確的事情”。如果一個人試圖做的事情涉及到一些計算上不可約的東西,機器學習通常無法“很好地協調”以正確地“完成不可約計算的所有步驟”。但似乎許多“類人任務”是現代機器學習特別關注的重點,可以成功完成。
順便說一句,我們可以預期,透過這裡探索的最小模型,可以更切實地描述哪些型別的目標可以透過機器學習成功實現,哪些不能。機器學習操作的關鍵不僅在於存在可以做特定事情的程式,還在於它們可以透過自適應進化過程實際找到。
one can expect that with the minimal models explored here, it becomes more feasible to get a real characterization of what kinds of objectives can successfully be achieved by machine learning, and what cannot. 我們可以預期,透過這裡探索的最小模型,可以更切實地描述哪些型別的目標可以透過機器學習成功實現,哪些不能。
在我們所做的工作中,我們經常使用本質上最簡單的適應性進化過程:一系列點突變。我們發現,即使這樣通常也足以讓我們得到令人滿意的機器學習解決方案。我們的適應性進化之路可能會一直陷入困境,無法得到任何解決方案。但這種情況不會發生,這似乎與我們正在研究的系統中普遍存在的計算不可約性密切相關,這會導致有效的隨機性,這種隨機性極有可能“讓我們擺脫困境”。
we’ve often used what’s essentially the very simplest possible process for adaptive evolution: a sequence of point mutations. 我們(尋找機器學習解決方案)經常使用本質上最簡單的適應性進化過程:一系列點突變。
從某種意義上說,計算不可約性為不同的自適應進化過程“提供了公平的競爭環境”,甚至簡單的過程也能成功。我們正在使用的整個框架似乎也發生了類似的事情。任何一類系統似乎都能夠成功地進行機器學習,即使它們沒有傳統神經網路的詳細結構。我們可以將此視為計算等價原理的典型體現:即使系統在細節上可能有所不同,但它們最終在它們可以進行的計算方面都是等價的。
計算不可約性現象導致了一種根本的權衡,這在思考人工智慧之類的事情時尤為重要。如果我們想要提前知道——並且大致保證——一個系統將要做什麼或能夠做什麼,我們必須將系統設定為計算可約性的。但是,如果我們希望系統能夠最大限度地利用計算,它將不可避免地具備計算不可約的行為。機器學習也是如此。如果我們希望機器學習能夠做到最好,甚至給我們一種“實現魔法”的印象,那麼我們必須讓它表現出計算不可約性。如果我們希望機器學習“可以理解”,它必須是計算可約性的,而不是能夠充分利用計算能力。
不過,一開始,機器學習是否真的需要這種能力還不清楚。也許存在一些計算上可簡化的方法來解決我們想要使用機器學習解決的問題。但我們在這裡發現,即使在解決非常簡單的問題時,機器學習核心的自適應進化過程最終也會取樣並使用我們預期的計算上不可簡化的過程。
和生物進化一樣,機器學習的根本目的在於找到可行的方法,不受人類在一步步明確設計事物時強加給我們的“可理解性”約束。我們能想象限制機器學習以使事物變得可理解嗎?這樣做會有效地阻止機器學習獲得計算不可簡化過程的能力,從這裡的證據來看,在這種限制下,我們在機器學習中看到的那種成功似乎不太可能實現。
Like biological evolution, machine learning is fundamentally about finding things that work—without the constraint of “understandability” that’s forced on us when we as humans explicitly engineer things step by step. 和生物進化一樣,機器學習的根本目的在於找到可行的方法,不受人類在一步步明確設計事物時強加給我們的“可理解性”約束。
那麼,這對“機器學習科學”意味著什麼呢?人們可能希望能夠“深入瞭解”機器學習系統,並獲得有關其執行情況的詳細敘述性解釋;實際上,人們將能夠“解釋一切機制”。但我們在這裡看到的表明,一般來說,這樣的方法行不通。人們只能說,在計算宇宙的某個地方,存在一些(通常是計算不可約的)過程“恰好”與我們想要的一致。
是的,我們可以基於計算不可約性做出一般性陳述,例如此類過程的可發現性,例如透過自適應進化。但如果我們問“系統如何詳細工作?”,答案就不多了。當然,我們可以追蹤其所有計算步驟,並看到它以某種方式執行。但我們不能指望它正在做什麼的“全球人類層面的解釋”。相反,我們基本上只能研究一些計算不可約的過程,並觀察到它“恰好起作用”——而且我們不會對“為什麼”做出高層次的解釋。
但這一切都有一個重要的漏洞。在任何計算上不可約的系統中,總是不可避免地存在計算可約性的口袋。而且——正如我在物理專案中詳細討論的那樣——正是這些計算可約性的口袋讓我們這些計算受限的觀察者能夠識別出諸如“自然法則”之類的東西,從中我們可以構建“人類層面的敘述”。
那麼機器學習又如何呢?其中出現了哪些計算可約性,我們可以從中構建“人類水平的科學定律”?就像在氣體分子或空間最終離散元素水平上發生的計算不可約過程中出現的“簡單連續行為”一樣,我們可以預期,當處理大量元件時,至少某些計算可約性特徵會更加明顯。事實上,在足夠大的機器學習系統中,當人們觀察訓練曲線等探測到的聚合行為時,通常會看到平滑的曲線和明顯的規律性。
但關於可約性口袋的問題始終是它們最終是否與我們認為有趣或有用的東西相一致。是的,機器學習系統可能會表現出某種集體(“類似腦電圖”)行為。但尚不清楚的是,這種行為是否會告訴我們有關係統中正在進行的實際“資訊處理”(或其他)的任何資訊。如果要有一門“機器學習科學”,那麼我們希望的是,我們可以在機器學習系統中找到與我們可以測量和關心的事物相一致的計算可約性口袋。
那麼,鑑於我們已經能夠在這裡探索到機器學習的基礎,我們能如何評價機器學習系統的終極威力呢?一個關鍵的觀察是,機器學習的工作原理是“搭載”計算不可約性,實際上是透過尋找恰好符合目標的“計算不可約的自然片段”。但是,如果這些目標涉及計算不可約性呢——就像人們在處理一個已經成功以計算術語形式化的過程(如數學、精確科學、計算 X 等)時經常發生的那樣?好吧,我們的機器學習系統“在內部使用一些計算不可約性”是不夠的。為了實現特定的計算不可約目標,系統必須做一些與實際、具體目標密切相關的事情。
然而,必須指出的是,透過在這裡揭示機器學習的更多本質,至少可以更容易地定義將典型的“形式計算”與機器學習相結合的問題。傳統上,系統的計算能力與其可訓練性之間存在權衡。事實上,就我們在這裡看到的情況而言,這似乎反映了這樣一種感覺,即“更大的計算不可約性”更難以融入人們透過自適應進化過程逐步建立起來的東西中。
那麼我們最終應該如何看待機器學習?實際上,它的力量來自於利用計算不可約性的“自然資源”。但是,當它使用計算不可約性時,它透過“搜尋”恰好有助於實現其目標的碎片來實現。想象一下一個人在建一堵牆。一種可能性是製作出一種特定形狀的磚塊,這些磚塊知道它們可以拼在一起。但另一種可能性是隻看一眼周圍散落的石頭,然後儘可能將它們拼合在一起來建造這堵牆。
Imagine one’s building a wall. One possibility is to fashion bricks of a particular shape that one knows will fit together. But another is just to look at stones one sees lying around, then to build the wall by fitting these together as best one can. 想象一下一個人在建一堵牆。一種可能性是製作出一種特定形狀的磚塊,這些磚塊知道它們可以拼在一起。但另一種可能性是隻看一眼周圍散落的石頭,然後儘可能將它們拼合在一起來建造這堵牆。
如果有人問“為什麼牆上會有這樣或那樣的圖案?”,答案基本上是“因為那是從碰巧散落在周圍的石頭上得到的”。它本身並沒有總體理論;它只是對現有資源的反映。或者,在機器學習的情況下,可以預期,人們所看到的東西在很大程度上反映了計算不可約性的原始特徵。換句話說,機器學習的基礎與任何植根於規則學的東西一樣多。在很大程度上,我們應該從這門科學入手,努力更多地瞭解機器學習中“到底發生了什麼”,很可能也包括神經科學。

歷史及個人筆記

從某種程度上來說,這似乎是思想史的一個怪癖,我在這裡討論的那些基礎問題很久以前並沒有得到解決——從某種程度上來說,這似乎是某些直覺和工具最近才發展起來的必然結果。
大腦從根本上來說是由相互連線的神經細胞組成的觀點是在 19 世紀後期提出的,並在 20 世紀最初幾十年開始流行——1943年,沃倫·麥卡洛克 (Warren McCulloch) 和沃爾特·皮茨 (Walter Pitts) 的工作中,以計算方式運作的神經網路的形式化概念得以完整呈現。到 20 世紀 50 年代末,出現了以“感知器”形式實現的神經網路硬體(通常用於影像處理)。儘管早期人們對神經網路充滿熱情,但實際結果卻好壞參半,20 世紀 60 年代末,人們宣佈可以透過數學分析解決的簡單問題——這導致人們普遍認為“神經網路無法做任何有趣的事情”。
自 20 世紀 40 年代以來,人們開始對神經網路進行一些常規分析,尤其是使用物理學方法。但這些分析通常以連續近似之類的結果結束,而這些結果幾乎無法說明神經網路的資訊處理方面。與此同時,人們一直堅信神經網路可以以某種方式解釋和再現大腦的工作方式,但似乎沒有方法可以解釋大腦是如何運作的。然後在 20 世紀 80 年代初,人們對神經網路的興趣又重新興起,來自多個方向。其中一些研究集中在非常實際的努力上,以使神經網路能夠執行特定的“類似人類”的任務。但有些則更具理論性,通常使用統計物理學或動態系統的方法。
但不久之後,這種熱潮就漸漸消退了,幾十年來,只有少數幾個團隊仍在研究神經網路。2011 年,神經網路在影像分析方面的應用取得了令人意外的突破。這是一個重要的實用進步。但它是由技術理念和發展推動的,而不是任何重大的新理論分析或框架。
這也是幾乎所有後續事件的模式。人們花費了巨大的努力來設計出有效的神經網路系統——關於如何最好地實現這一點的各種民間傳說層出不窮。但實際上甚至沒有嘗試過建立基礎理論;這是一個工程實踐領域,而不是基礎科學。
正是在這種傳統下,ChatGPT 在 2022 年底一炮走紅。LLM的幾乎所有方面似乎都很複雜。是的,從經驗上看,確實存在一些大規模的規律(比如縮放定律)。我很快就懷疑 LLM 的成功是人類語言中普遍規律的強烈暗示,而這些規律以前並沒有被清楚地識別出來。但除了一些異常的例子外,幾乎沒有什麼關於“LLM 內部發生了什麼”的事情似乎很容易破譯。而為系統執行設定“強有力的護欄”的努力——實際上是為了讓它在某種程度上“可預測”或“可理解”——通常似乎會大大降低它的能力(這一點現在在計算不可約性的背景下是有意義的)。
我與機器學習和神經網路的接觸始於 1980 年,當時我正在開發我的SMP 符號計算系統,並想知道是否有可能將系統的符號模式匹配基礎推廣到某種更接近人類思維的“模糊模式匹配”。我知道神經網路,但認為它們是大腦的半現實模型,而不是我想象中的可能“解決”模糊匹配的演算法的潛在來源。
部分原因是,為了理解神經網路等系統的本質,我在 1981 年提出了後來被我視為一維細胞自動機的東西。不久,我便深入研究細胞自動機,並形成了新的直覺,即複雜行為如何從簡單規則中產生。但當我瞭解到最近有人試圖利用統計力學的思想來構建理想化的神經網路模型時,我至少有足夠的好奇心去建立模擬,試圖更多地瞭解這些模型。
但我所做的並不成功。我既不能讓這些模型做任何具有重大實際意義的事情,也沒有設法從理論上理解它們。不過,我一直在想,細胞自動機“只是執行”和神經網路等可以“學習”的系統之間可能存在什麼關係。事實上,在 1985 年,我試圖製作一個基於細胞自動機的最小模型來探索這一點。這就是我現在所說的“垂直分層規則陣列”。雖然在很多方面我已經提出了正確的問題,但這是一個不幸的特定系統選擇——我對它的實驗並沒有揭示我們現在看到的現象。
很多年過去了。我在《一種新科學》中寫了一節關於“人類思維”的內容,討論了思維本質的簡單基本規則的可能性,甚至包括了神經網路的最小離散模擬。不過,當時我並沒有發展這些想法。然而,到了 2017 年,即這本書出版 15 年後——並且知道了深度學習的突破——我開始更具體地思考神經網路是如何透過從整個計算宇宙中取樣程式來獲得能力的。但我仍然不明白這將如何運作。
與此同時,機器學習的實踐經驗中出現了一種新的直覺:如果你“足夠猛烈地”攻擊幾乎任何系統,它都會學習。這是否意味著也許不需要神經網路的所有細節就可以成功地進行機器學習?也許可以建立一個結構足夠簡單的系統,使其操作可以視覺化?我在2023 年初撰寫 ChatGPT 和 LLM 的論述時特別想知道這一點。我一直在談論“LLM 科學”,但沒有太多機會去研究它。
但幾個月前,為了理解科學和人工智慧之間關係,我嘗試了一種“一次性實驗” ——令我驚訝的是,它似乎成功地捕捉到了生物進化的一些本質。但其他適應性進化呢——特別是機器學習?所需的模型與我 1985 年研究的模型非常接近。但現在我有了新的直覺——而且,多虧了Wolfram 語言,我有了更好的工具。
當然,這只是一個開始。但我很高興能夠看到我認為的機器學習基礎科學的開端。已經有了明確的實際應用方向(不用說,我計劃探索)。有跡象表明,也許我們最終能夠理解機器學習的“魔力”為何以及何時發揮作用。

致謝

感謝Wolfram 研究所的 Richard Assar提供的大量幫助。還要感謝 Brad Klee、Tianyi Gu、Nik Murzin 和 Max Niederman 提供的具體成果,感謝Symbolica的 George Morgan 和其他人的早期關注,以及感謝 Kovas Boguta 多年前建議將機器學習與《一種新科學》中的想法聯絡起來。


相關文章