測(cè)編碼與反向傳播:從神經(jīng)科學(xué)到深度學(xué)習(xí)的等價(jià)與分歧)
預(yù)測(cè)編碼與反向傳播的關(guān)系這幾年我在反復(fù)閱讀核心文獻(xiàn)時(shí)發(fā)現(xiàn)很多討論都停在“預(yù)測(cè)編碼比反向傳播更生物合理”這句話上卻說(shuō)不清兩邊到底在什么條件下等價(jià)、在什么地方分道揚(yáng)鑣。這篇報(bào)告想做的事就是把這條線索重新捋一遍從神經(jīng)科學(xué)里的預(yù)測(cè)編碼到機(jī)器學(xué)習(xí)里的反向傳播再到兩者之間的數(shù)學(xué)橋梁和實(shí)驗(yàn)分歧。我會(huì)用編號(hào)代替具體文獻(xiàn)出處重點(diǎn)拆解核心推導(dǎo)、常見(jiàn)誤讀和一份可以照做的最小復(fù)現(xiàn)思路。適合兩類人看一類是做深度學(xué)習(xí)但想了解類腦算法的另一類是做神經(jīng)科學(xué)但好奇怎么用工程驗(yàn)證理論的。1. 問(wèn)題的源頭為什么要把預(yù)測(cè)編碼和反向傳播放在一起看1.1 反向傳播的基本假設(shè)與局限反向傳播解決的是“給定輸入和損失如何更新網(wǎng)絡(luò)所有權(quán)重”的集中式計(jì)算問(wèn)題。它的核心是鏈?zhǔn)椒▌t從損失函數(shù)出發(fā)先算最后一層的梯度再一層層往回傳。每一層的梯度都依賴后一層的梯度這意味著誤差信號(hào)必須被精確地全局傳播。生活里可以這樣類比一個(gè)公司所有部門的績(jī)效都由總部統(tǒng)一考核總部要把業(yè)務(wù)偏差一層層分解到每個(gè)部門部門主管才能知道怎么改進(jìn)。這個(gè)體系看起來(lái)高效但它有兩個(gè)硬約束一是總部和每個(gè)部門之間必須存在清晰的雙向溝通通道二是這種溝通必須被集中調(diào)度。一旦某個(gè)環(huán)節(jié)斷了所有部門的更新都會(huì)停擺。對(duì)計(jì)算機(jī)來(lái)說(shuō)這些約束可以靠保存計(jì)算圖來(lái)滿足但對(duì)大腦來(lái)說(shuō)就不太現(xiàn)實(shí)。大腦沒(méi)有全局損失函數(shù)沒(méi)有一層層反向傳播精確梯度的明確“總控”。這是早期研究者持續(xù)批評(píng)反向傳播的主要原因也是預(yù)測(cè)編碼這類局部學(xué)習(xí)規(guī)則受到重視的起點(diǎn)。1.2 預(yù)測(cè)編碼的核心主張預(yù)測(cè)編碼最初是為了解釋感知現(xiàn)象提出的。它的想法非常直觀大腦不直接讀取外界圖像而是維護(hù)一套自頂向下的生成模型用高層的抽象預(yù)測(cè)低層的輸入。與預(yù)測(cè)不一致的部分形成“預(yù)測(cè)誤差”這個(gè)誤差繼續(xù)向上傳遞并反過(guò)來(lái)修正模型本身。關(guān)鍵在于每一層只需要知道本層的預(yù)測(cè)和相鄰層傳入的誤差整個(gè)更新是局部的。用剛才的類比說(shuō)就是各部門不用等總部發(fā)KPI而是根據(jù)與自己直接合作的上下游之間的差異來(lái)調(diào)整。預(yù)測(cè)編碼把“全局損失最小化”替換成了“讓每一層的預(yù)測(cè)都盡可能正確”而預(yù)測(cè)正確的標(biāo)準(zhǔn)不再是外部標(biāo)簽而是生成模型自身的自洽。這個(gè)主張聽(tīng)起來(lái)溫和實(shí)際上是顛覆性的它意味著學(xué)習(xí)可以不依賴一個(gè)顯式的標(biāo)簽損失即使沒(méi)有監(jiān)督信息預(yù)測(cè)誤差也能驅(qū)動(dòng)表示和權(quán)重的改變。這種能力讓預(yù)測(cè)編碼同時(shí)適配無(wú)監(jiān)督、有監(jiān)督和強(qiáng)化學(xué)習(xí)場(chǎng)景。1.3 為什么兩者關(guān)系值得做成核心文獻(xiàn)分析近幾年陸續(xù)有研究發(fā)現(xiàn)在特定條件下預(yù)測(cè)編碼的穩(wěn)態(tài)更新和反向傳播的梯度計(jì)算是等價(jià)的。但也有同樣多的文獻(xiàn)指出兩者在動(dòng)態(tài)過(guò)程、反饋連接形式、訓(xùn)練穩(wěn)定性上差異巨大。同樣是“誤差傳播”一個(gè)來(lái)自全局損失函數(shù)一個(gè)來(lái)自生成模型的局部預(yù)測(cè)誤差不把條件拆清楚很容易被“預(yù)測(cè)編碼推翻反向傳播”這類標(biāo)題帶偏。我這次重讀文獻(xiàn)時(shí)的主線可以壓縮成三個(gè)問(wèn)題第一預(yù)測(cè)編碼的誤差信號(hào)如何一步步變成權(quán)重更新第二它在什么數(shù)學(xué)條件下與反向傳播重合第三重合之外的部分到底貢獻(xiàn)了什么新東西。下面幾節(jié)就按這條主線展開(kāi)。2. 核心文獻(xiàn)的演進(jìn)脈絡(luò)從神經(jīng)科學(xué)到機(jī)器學(xué)習(xí)2.1 第一代理論感知中的預(yù)測(cè)編碼這一階段的核心文獻(xiàn)把大腦建模成分層生成模型。高層神經(jīng)元的活動(dòng)負(fù)責(zé)預(yù)測(cè)底層神經(jīng)元的輸入底層神經(jīng)元將預(yù)測(cè)誤差傳回高層。學(xué)習(xí)目標(biāo)很樸素最小化所有層預(yù)測(cè)誤差的平方和。早期推導(dǎo)里最重要的不是某個(gè)深度結(jié)果而是它第一次給出了“局部可實(shí)現(xiàn)的誤差傳播”框架。我概括一下當(dāng)時(shí)的推導(dǎo)邏輯假設(shè)某一層有一個(gè)預(yù)測(cè)值下一層有一個(gè)實(shí)際表示兩者做差得到誤差誤差向上傳遞的路徑與正向預(yù)測(cè)路徑相鄰但方向相反。這樣的誤差信號(hào)不需要從網(wǎng)絡(luò)末端統(tǒng)一計(jì)算每一步只發(fā)生在相鄰節(jié)點(diǎn)之間。正因如此這個(gè)框架天然可以映射到神經(jīng)回路里哪怕沒(méi)有全局調(diào)度者也能工作。在這里有一個(gè)很容易被忽略的點(diǎn)預(yù)測(cè)編碼不等于“輸入壓縮”。雖然消除冗余是它的副產(chǎn)品但它真正的目標(biāo)不是把編碼變短而是讓生成模型更好地解釋輸入。換句話說(shuō)它在意的不是“存得少”而是“猜得準(zhǔn)”。2.2 第二代文獻(xiàn)預(yù)測(cè)編碼與目標(biāo)傳播逐步接近反向傳播第二波工作開(kāi)始解決一個(gè)工程問(wèn)題預(yù)測(cè)編碼能不能用來(lái)訓(xùn)練深度網(wǎng)絡(luò)。研究者把每一層的表示也看成變量和權(quán)重一起優(yōu)化。這樣訓(xùn)練變成了兩個(gè)階段的交替推斷階段固定權(quán)重更新各層表示學(xué)習(xí)階段固定表示更新權(quán)重。這種兩階段格局和反向傳播非常像。到這一步文獻(xiàn)的關(guān)鍵突破是給出了一個(gè)數(shù)學(xué)結(jié)論當(dāng)推斷過(guò)程收斂到穩(wěn)態(tài)時(shí)對(duì)滿足高斯誤差假設(shè)的確定性網(wǎng)絡(luò)來(lái)說(shuō)預(yù)測(cè)編碼的權(quán)重更新等價(jià)于反向傳播的梯度下降。等價(jià)性的含義不是“性能接近”而是“同樣一組輸入穩(wěn)態(tài)下的權(quán)重梯度與BP計(jì)算的梯度在理想條件下相等”。與此同時(shí)研究者發(fā)現(xiàn)預(yù)測(cè)編碼和目標(biāo)傳播之間存在親緣關(guān)系。目標(biāo)傳播允許網(wǎng)絡(luò)為每一層設(shè)定一個(gè)目標(biāo)表示再讓權(quán)重向目標(biāo)靠攏反向傳播則可以看作目標(biāo)傳播的一個(gè)極限特例。預(yù)測(cè)編碼恰好站在兩者中間它有明確的生成模型也有可學(xué)習(xí)的目標(biāo)表示所以能同時(shí)容納這兩條線索。2.3 第三次爭(zhēng)論時(shí)間動(dòng)態(tài)、大規(guī)模實(shí)現(xiàn)與開(kāi)放問(wèn)題最近幾年的文獻(xiàn)不再滿足于回答“等價(jià)還是不等價(jià)”而是追問(wèn)三個(gè)更細(xì)的問(wèn)題第一預(yù)測(cè)編碼能不能解釋真實(shí)神經(jīng)記錄第二當(dāng)網(wǎng)絡(luò)規(guī)模達(dá)到視覺(jué)任務(wù)需要的深度和寬度時(shí)預(yù)測(cè)編碼訓(xùn)練是否仍然可行第三連續(xù)時(shí)間版本的預(yù)測(cè)編碼會(huì)不會(huì)產(chǎn)生完全不同的動(dòng)態(tài)行為。這些文獻(xiàn)里一部分認(rèn)為預(yù)測(cè)編碼的大規(guī)模訓(xùn)練已經(jīng)被驗(yàn)證另一部分指出推斷步驟的成本太高、中間表示自由度太大離替代反向傳播還很遠(yuǎn)。我的閱讀結(jié)論是兩邊其實(shí)在討論不同的“預(yù)測(cè)編碼”。前者討論的是一類帶局部誤差的梯度近似算法后者討論的是一種完整的認(rèn)知過(guò)程理論。因此讀文獻(xiàn)時(shí)先確認(rèn)作者在哪個(gè)層面說(shuō)話比急著站隊(duì)重要得多。我把這次分析使用的核心文獻(xiàn)按代號(hào)列在下面方便讀者追蹤問(wèn)題線代號(hào)文獻(xiàn)定位核心貢獻(xiàn)我在分析中關(guān)注的重點(diǎn)文獻(xiàn)A分層預(yù)測(cè)誤差的奠基性文章提出感知即預(yù)測(cè)誤差最小化局部誤差的定義與傳遞方式文獻(xiàn)B預(yù)測(cè)編碼用于深度網(wǎng)絡(luò)訓(xùn)練驗(yàn)證兩階段學(xué)習(xí)可擴(kuò)展推斷穩(wěn)態(tài)與梯度等價(jià)性的實(shí)驗(yàn)條件文獻(xiàn)C等價(jià)性推導(dǎo)與爭(zhēng)議綜述系統(tǒng)對(duì)比預(yù)測(cè)編碼與BP等價(jià)條件、反例、常見(jiàn)誤解文獻(xiàn)D連續(xù)時(shí)間動(dòng)力學(xué)分析將預(yù)測(cè)編碼擴(kuò)展到動(dòng)態(tài)系統(tǒng)時(shí)間演化與在線學(xué)習(xí)的可能性3. 關(guān)鍵技術(shù)細(xì)節(jié)誤差傳播的兩種形式3.1 反向傳播的核心推導(dǎo)與全局依賴反向傳播的數(shù)學(xué)核心是鏈?zhǔn)椒▌t??紤]一個(gè)逐層線性網(wǎng)絡(luò)損失函數(shù)為 L第 l 層輸出為 h_l f(W_l h_{l-1})。誤差項(xiàng)定義為 delta_l dL/dh_l從最后一層向前遞推delta_l (W_{l1}^T delta_{l1}) * f(W_l h_{l-1})權(quán)重的梯度是?L/?W_l delta_l h_{l-1}^T仔細(xì)看這個(gè)公式第 l 層的誤差同時(shí)依賴于上層權(quán)重的轉(zhuǎn)置和上層誤差。也就是說(shuō)誤差信號(hào)必須先經(jīng)過(guò)全網(wǎng)絡(luò)計(jì)算再逐層向下分發(fā)。這帶來(lái)一個(gè)工程后果訓(xùn)練過(guò)程中必須保存每一層的前向激活才能在后向時(shí)算出權(quán)重梯度。對(duì)顯存不友好對(duì)硬件設(shè)計(jì)也提出了很高要求。從學(xué)習(xí)理論的角度看反向傳播不關(guān)心網(wǎng)絡(luò)內(nèi)部表示是否穩(wěn)定它只關(guān)心損失函數(shù)關(guān)于權(quán)重的偏導(dǎo)數(shù)。表示只是計(jì)算的中間變量沒(méi)有自己獨(dú)立的“演化過(guò)程”。這個(gè)特點(diǎn)讓BP方法干凈高效但同時(shí)也讓離開(kāi)計(jì)算圖后的推理變得困難。3.2 預(yù)測(cè)編碼的目標(biāo)函數(shù)與穩(wěn)態(tài)預(yù)測(cè)編碼的典型目標(biāo)函數(shù)如下E Σ_l (1/2) || μ_l - f(W_l μ_{l-1}) ||^2 (1/2) || x - μ_0 ||^2這里 μ_l 是第 l 層的表示估計(jì)x 是輸入。注意它沒(méi)有顯式的標(biāo)簽損失。如果要做有監(jiān)督學(xué)習(xí)一種做法是把最高層的表示 μ_L 固定在標(biāo)簽向量附近或者在目標(biāo)函數(shù)里加上標(biāo)簽約束。但在形式上驅(qū)動(dòng)學(xué)習(xí)的主要誤差來(lái)自“本層預(yù)測(cè)”和“相鄰層表示”之間的差異。推斷階段固定權(quán)重對(duì) μ_l 做梯度下降讓表示趨向于平衡。學(xué)習(xí)階段固定表示對(duì) W_l 做梯度下降。這兩步反復(fù)交替。核心特征在這里顯現(xiàn)權(quán)重更新只涉及本層預(yù)測(cè)誤差和相鄰層表示不依賴跨越多層的全局梯度。這也是預(yù)測(cè)編碼名稱的由來(lái)——網(wǎng)絡(luò)不傳遞“損失梯度”而是傳遞“預(yù)測(cè)誤差”。預(yù)測(cè)誤差實(shí)際上是一種信息信號(hào)它告訴上層“你預(yù)測(cè)得還不夠準(zhǔn)”告訴下層“你該往哪個(gè)方向調(diào)整表示”。3.3 等價(jià)性成立的三個(gè)關(guān)鍵條件文獻(xiàn)中證明“預(yù)測(cè)編碼等于反向傳播”的時(shí)候幾乎沒(méi)有例外都依賴以下幾個(gè)條件目標(biāo)函數(shù)是高斯誤差假設(shè)下的二次預(yù)測(cè)誤差網(wǎng)絡(luò)是確定性逐層映射且每層變換可微推斷過(guò)程在每個(gè)樣本上迭代到穩(wěn)態(tài)且權(quán)重更新速度遠(yuǎn)慢于推斷收斂速度在這三個(gè)條件下可以證明穩(wěn)態(tài)表示處的權(quán)重梯度與BP梯度相同。為什么因?yàn)楫?dāng) μ_l 收斂到最優(yōu)值時(shí)關(guān)于 μ 的梯度為零這個(gè)零梯度條件本身包含了相鄰兩層的預(yù)測(cè)誤差關(guān)系。把它代入權(quán)重更新公式后得到的正是鏈?zhǔn)椒▌t給出的梯度形式。更形象地說(shuō)預(yù)測(cè)編碼把BP中“需要外部計(jì)算的梯度”變成了“通過(guò)內(nèi)部動(dòng)力學(xué)自然達(dá)到的穩(wěn)態(tài)”的副產(chǎn)品。這個(gè)視角很迷人但它的成立也暗示了等價(jià)性的脆弱一旦推斷沒(méi)有收斂或者目標(biāo)函數(shù)不是二次形式穩(wěn)態(tài)就不成立梯度自然也不再等價(jià)。3.4 兩者真正不同在哪里等價(jià)性有條件差異性卻非常普遍。我在整理文獻(xiàn)時(shí)做了這樣一個(gè)對(duì)照維度反向傳播預(yù)測(cè)編碼誤差來(lái)源外部損失函數(shù)內(nèi)部生成模型的預(yù)測(cè)誤差信號(hào)傳遞全局遞歸依賴層級(jí)順序局部迭代可并行收斂反饋矩陣嚴(yán)格使用權(quán)重轉(zhuǎn)置可允許任意反饋連接時(shí)間維度靜態(tài)前向與反向動(dòng)態(tài)馳豫表示隨時(shí)間演化對(duì)表示的要求只是中間變量有獨(dú)立信息意義參與學(xué)習(xí)無(wú)監(jiān)督能力需要額外設(shè)計(jì)天然支持這張表說(shuō)明預(yù)測(cè)編碼的賣點(diǎn)不是“另一種梯度算法”而是“一種更通用的誤差傳播框架”。它犧牲了BP的簡(jiǎn)潔性和保證但換來(lái)了更高的局部性、更強(qiáng)的生物解釋力以及無(wú)監(jiān)督學(xué)習(xí)方面的天然適配性。4. 實(shí)操視角復(fù)現(xiàn)一個(gè)最小預(yù)測(cè)編碼網(wǎng)絡(luò)4.1 模型定義與代碼骨架為了看清等價(jià)性到底長(zhǎng)什么樣最有效的辦法是拋開(kāi)復(fù)雜庫(kù)用 numpy 寫一個(gè)最小預(yù)測(cè)編碼網(wǎng)絡(luò)。我先用線性網(wǎng)絡(luò)做演示公式干凈且能直接對(duì)比BP。網(wǎng)絡(luò)結(jié)構(gòu)只包含輸入層 μ_0隱藏層 μ_1頂層 μ_2。損失為E (1/2)|| μ_1 - W_1 μ_0 ||^2 (1/2)|| μ_2 - W_2 μ_1 ||^2在推斷階段μ_0 固定為輸入 xμ_2 固定為標(biāo)簽 y只有 μ_1 是自由的。計(jì)算 μ_1 的梯度?E_{μ_1} (μ_1 - W_1 μ_0) - W_2^T (μ_2 - W_2 μ_1)這個(gè)公式值得反復(fù)看前一項(xiàng)來(lái)自底層輸入對(duì)隱藏層的預(yù)測(cè)誤差后一項(xiàng)來(lái)自頂層誤差通過(guò) W_2^T 的反向反饋。它和BP的 delta 公式結(jié)構(gòu)幾乎一致但這里不是一次性計(jì)算而是一步一步迭代出來(lái)的。一個(gè)可運(yùn)行的簡(jiǎn)化骨架如下import numpy as np def train_pc(x, y, hidden_dim8, steps200, infer_steps50, rho0.05, lr0.005, seed0): rng np.random.default_rng(seed) batch_dim, input_dim x.shape output_dim y.shape[1] W1 rng.normal(0, 0.1, (hidden_dim, input_dim)) W2 rng.normal(0, 0.1, (output_dim, hidden_dim)) for step in range(steps): mu0 x.copy() mu1 rng.normal(0, 0.1, (batch_dim, hidden_dim)) mu2 y.copy() # 監(jiān)督學(xué)習(xí)頂層表示固定為標(biāo)簽 for _ in range(infer_steps): e1 mu1 - W1 mu0 e2 mu2 - W2 mu1 grad_mu1 e1 - W2.T e2 mu1 - rho * grad_mu1 e1 mu1 - W1 mu0 e2 mu2 - W2 mu1 W1 lr * e1 mu0.T W2 lr * e2 mu1.T這短短幾十行已經(jīng)包含了預(yù)測(cè)編碼的全部要素初始化表示、迭代推斷、用局部誤差更新權(quán)重。實(shí)際運(yùn)行時(shí)你會(huì)發(fā)現(xiàn)只要 infer_steps 足夠大PC 的權(quán)重更新軌跡會(huì)非常接近BP。4.2 兩階段更新的直覺(jué)為什么需要兩階段因?yàn)闄?quán)重和表示是耦合在一起的。如果同時(shí)更新網(wǎng)絡(luò)很容易震蕩。推斷階段可以看作在回答一個(gè)問(wèn)題在給定當(dāng)前權(quán)重的情況下什么樣的隱藏表示最合理學(xué)習(xí)階段回答另一個(gè)問(wèn)題在給定當(dāng)前表示的情況下什么樣的權(quán)重能讓預(yù)測(cè)更準(zhǔn)兩者交替恰好是一種坐標(biāo)下降法目標(biāo)就是最小化全局能量 E。這就像兩個(gè)人配合搬東西一個(gè)人先調(diào)姿勢(shì)另一個(gè)人再調(diào)發(fā)力反復(fù)幾次才找到最穩(wěn)的平衡。如果同時(shí)動(dòng)大概率會(huì)一起摔倒。4.3 實(shí)驗(yàn)對(duì)比設(shè)計(jì)要直觀看到等價(jià)性可以設(shè)計(jì)一個(gè)回歸任務(wù)用隨機(jī)生成的 W_true 產(chǎn)生數(shù)據(jù)再用同一個(gè)初始權(quán)重分別跑BP和PC記錄每一步權(quán)重與 W_true 的距離。BP實(shí)現(xiàn)就是常規(guī)的梯度下降PC用上面代碼。關(guān)鍵設(shè)置包括控制變量初始權(quán)重一致數(shù)據(jù)一致學(xué)習(xí)率一致讀取內(nèi)容每輪結(jié)束后的 train loss以及 W1 與真實(shí)權(quán)重的余弦距離變換條件把 infer_steps 分別設(shè)為 5、20、100觀察梯度差異我在本地跑這類實(shí)驗(yàn)時(shí)infer_steps100 時(shí)PC的收斂曲線幾乎和BP重合infer_steps5 時(shí)PC會(huì)頻繁震蕩。這個(gè)結(jié)果說(shuō)明所謂等價(jià)性不是“免費(fèi)的午餐”而是需要付出迭代代價(jià)才能換來(lái)的。4.4 需要關(guān)心的超參數(shù)和細(xì)節(jié)推斷步數(shù) infer_steps太大會(huì)慢太少會(huì)不收斂。常見(jiàn)范圍是20到100復(fù)雜任務(wù)可能需要更多。推斷學(xué)習(xí)率 rho通常比權(quán)重學(xué)習(xí)率大一個(gè)量級(jí)。太小收斂慢太大則發(fā)散。表示初始化μ_1 不能全零否則梯度對(duì)稱訓(xùn)練會(huì)卡死。用隨機(jī)初始化或從輸入數(shù)據(jù)里復(fù)制一層都可以。頂層固定有監(jiān)督任務(wù)里必須把 μ_2 固定為標(biāo)簽否則網(wǎng)絡(luò)會(huì)自動(dòng)退化成無(wú)監(jiān)督重建模型分類準(zhǔn)確率上不去。非線性激活換成 tanh 或 ReLU 后權(quán)重的梯度要乘以激活函數(shù)的雅可比公式不再像線性網(wǎng)絡(luò)那么干凈但等價(jià)性的主干仍然成立。這些細(xì)節(jié)在論文里通常一句話帶過(guò)但自己動(dòng)手跑一遍就會(huì)明白它們才是決定實(shí)驗(yàn)成敗的關(guān)鍵。5. 閱讀核心文獻(xiàn)的常見(jiàn)誤區(qū)與排查技巧5.1 誤區(qū)一認(rèn)為預(yù)測(cè)編碼不需要任何形式的反向傳播很多文獻(xiàn)標(biāo)題會(huì)讓人以為預(yù)測(cè)編碼徹底繞開(kāi)了反向誤差傳播實(shí)際操作后你會(huì)發(fā)現(xiàn)并不完全如此。在預(yù)測(cè)編碼的推斷過(guò)程中誤差從頂層反饋到低層時(shí)用到了 W_2^T 這樣的轉(zhuǎn)置矩陣本質(zhì)上還是一種反向投影。區(qū)別在于BP把這個(gè)過(guò)程當(dāng)作顯式計(jì)算步驟預(yù)測(cè)編碼則用迭代動(dòng)力學(xué)隱式地實(shí)現(xiàn)了它。因此我更愿意把預(yù)測(cè)編碼理解為“把反向傳播的計(jì)算過(guò)程重新實(shí)現(xiàn)為迭代動(dòng)力系統(tǒng)”而不是“沒(méi)有反向傳播”。這樣理解就不會(huì)在復(fù)現(xiàn)時(shí)被“反向傳播”這個(gè)詞嚇住也不會(huì)錯(cuò)誤宣傳預(yù)測(cè)編碼能徹底擺脫誤差回傳。5.2 誤區(qū)二把預(yù)測(cè)誤差等同于損失函數(shù)預(yù)測(cè)誤差和損失函數(shù)是兩個(gè)層面的東西。預(yù)測(cè)誤差描述的是生成模型內(nèi)部各層之間的不一致性損失函數(shù)則是外部任務(wù)給定的評(píng)價(jià)指標(biāo)。哪怕沒(méi)有分類標(biāo)簽預(yù)測(cè)誤差照樣存在照樣可以驅(qū)動(dòng)權(quán)重更新。很多文章把頂層加上標(biāo)簽誤差只是為了把無(wú)監(jiān)督學(xué)習(xí)框架改造成有監(jiān)督分類器。區(qū)分不清會(huì)導(dǎo)致兩個(gè)問(wèn)題一是讀不懂預(yù)測(cè)編碼為什么能做無(wú)監(jiān)督學(xué)習(xí)二是在設(shè)計(jì)算法時(shí)容易丟掉內(nèi)部誤差結(jié)構(gòu)直接用損失函數(shù)替換掉所有預(yù)測(cè)誤差。實(shí)際上預(yù)測(cè)編碼的力量恰恰來(lái)自內(nèi)部誤差的持續(xù)存在。5.3 誤區(qū)三以為等價(jià)性意味著性能一定一樣數(shù)學(xué)等價(jià)在理想條件下成立但實(shí)際網(wǎng)絡(luò)幾乎永遠(yuǎn)偏離理想推斷不收斂、表示初始化不對(duì)稱、非線性的雅可比會(huì)變、學(xué)習(xí)率不夠小。更關(guān)鍵的是預(yù)測(cè)編碼每個(gè)樣本都要迭代到穩(wěn)態(tài)訓(xùn)練成本比BP高很多。近期一些“預(yù)測(cè)編碼失敗”的工作多半是實(shí)驗(yàn)設(shè)置本身沒(méi)有滿足穩(wěn)態(tài)條件而不是理論有問(wèn)題。因此拿到一篇“PC beats BP”或者“PC fails”的論文第一件事不是記結(jié)論而是查三個(gè)數(shù)字infer_steps 多少、網(wǎng)絡(luò)寬度多少、學(xué)習(xí)率多少。這三個(gè)數(shù)字往往決定了結(jié)論成立的范圍。5.4 給想深讀的讀者一份文獻(xiàn)閱讀路線圖我自己帶過(guò)不少人讀這個(gè)方向發(fā)現(xiàn)以下順序比按時(shí)間線讀更高效先補(bǔ)目標(biāo)傳播的數(shù)學(xué)基礎(chǔ)知道“層目標(biāo)”是什么意思再讀預(yù)測(cè)編碼奠基性文章只看目標(biāo)函數(shù)和前幾行推導(dǎo)不啃全部細(xì)節(jié)接著讀等價(jià)性綜述在手邊畫一張“誤差傳播路徑對(duì)比表”然后找一個(gè)最小PC代碼倉(cāng)庫(kù)把 infer_steps 從大到小調(diào)一遍最后再回到爭(zhēng)議文章這時(shí)候你已經(jīng)有能力分辨對(duì)方批評(píng)的是哪一層含義按這個(gè)路線三小時(shí)左右就能抓住主線而不是被十篇論文的不同角度弄得暈頭轉(zhuǎn)向。6. 我的實(shí)操心得與下一步可以做什么6.1 踩過(guò)的坑我第一次寫預(yù)測(cè)編碼網(wǎng)絡(luò)時(shí)忘記固定頂層表示結(jié)果分類準(zhǔn)確率一直上不去。后來(lái)才發(fā)現(xiàn)網(wǎng)絡(luò)在無(wú)監(jiān)督地重建輸入標(biāo)簽完全沒(méi)有進(jìn)入學(xué)習(xí)循環(huán)。這個(gè)錯(cuò)誤很隱蔽因?yàn)橛?xùn)練 loss 看起來(lái)會(huì)下降但驗(yàn)證準(zhǔn)確率幾乎不動(dòng)。還有一次為了加速訓(xùn)練我把推斷步數(shù)從 50 降到 5結(jié)果每一輪的梯度噪聲變得非常大。用同一份數(shù)據(jù)和初始化BP已經(jīng)收斂PC還在原地抖動(dòng)。后來(lái)我先跑了一條“推斷步數(shù) vs. 梯度誤差”曲線才真正理解穩(wěn)態(tài)假設(shè)不是可有可無(wú)的擺設(shè)。另一個(gè)容易踩的坑是非線性激活。線性網(wǎng)絡(luò)公式干凈一換成 ReLU 或 tanh權(quán)重梯度里必須加入激活函數(shù)的導(dǎo)數(shù)。如果沿用線性公式整個(gè)梯度方向都會(huì)偏。最后我調(diào)試時(shí)會(huì)把每一層的梯度打印出來(lái)和BP的實(shí)現(xiàn)做逐層對(duì)比很快就能定位問(wèn)題。6.2 可擴(kuò)展方向預(yù)測(cè)編碼和反向傳播的關(guān)系研究遠(yuǎn)沒(méi)到蓋棺定論的程度。我比較看好的擴(kuò)展方向有以下四個(gè)連續(xù)時(shí)間版本把離散的迭代推斷改成微分方程預(yù)測(cè)編碼就變得更像真實(shí)神經(jīng)網(wǎng)絡(luò)動(dòng)力學(xué)也有機(jī)會(huì)推導(dǎo)出在線學(xué)習(xí)規(guī)則。非高斯誤差建模把二次誤差換成分布假設(shè)更靈活的誤差項(xiàng)可能會(huì)自然衍生出類似自然梯度的學(xué)習(xí)算法。大規(guī)模模型驗(yàn)證目前大多數(shù)實(shí)驗(yàn)停留在淺層網(wǎng)絡(luò)預(yù)測(cè)編碼在Transformer規(guī)模上的推斷成本和中層表示約束問(wèn)題都還是開(kāi)放問(wèn)題。硬件實(shí)現(xiàn)局部誤差更新不依賴保存全圖計(jì)算圖這對(duì)脈沖神經(jīng)網(wǎng)絡(luò)和邊緣計(jì)算設(shè)備很有吸引力但需要一個(gè)穩(wěn)定的模擬框架支撐。我近期做了一組對(duì)照實(shí)驗(yàn)把同一套權(quán)重分別用BP和PC訓(xùn)練打印每一層的梯度范數(shù)發(fā)現(xiàn)兩者穩(wěn)態(tài)下幾乎一致但中間表示的運(yùn)行軌跡卻完全不同。這讓我意識(shí)到預(yù)測(cè)編碼帶給我們的不是又一種梯度求解器而是對(duì)“學(xué)習(xí)”這件事的不同建模方式。以后再看到“等價(jià)”類結(jié)論我第一反應(yīng)不是去背推導(dǎo)而是去問(wèn)這里討論的是穩(wěn)態(tài)還是動(dòng)態(tài)軌跡是監(jiān)督損失還是生成模型的誤差把這兩個(gè)問(wèn)題想清楚文獻(xiàn)就不容易誤讀。最后建議有條件的讀者自己動(dòng)手把最小PC網(wǎng)絡(luò)跑一遍比讀十篇論文更有用。