JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

自適應解碼:CLDA、ReFIT 與對抗非平穩性

讓 BCI 在線上持續運作的解碼器端演算法——意圖估計(ReFIT)、CLDA 混合,以及對抗非平穩性的穩定性–可塑性旋鈕。

解碼器為何會漂移

即使初始擬合完美,固定的解碼器仍會衰退。神經訊號是非平穩的:電極相對於組織會微幅移動,單元收訊逐日改變,喚醒與注意力會移動基線,而使用者自身的可塑性又在改寫編碼。這些合起來就是神經非平穩性與訊號漂移,而從解碼器的角度看,它表現為共變量偏移——輸入分布從一個昨天還正確的映射底下移走了。解方是讓解碼器適應;危險則是把它調錯。再校正無可避免,所以我們希望它便宜、安全、且最好是無形的。

意圖估計:ReFIT 的核心想法

線上重新訓練的核心障礙,是你不知道標籤。監督式擬合需要每一刻的意圖速度,但在閉迴路裡真正的意圖是隱藏的。ReFIT用一個優雅而簡單的任務假設化解它:在伸手觸標的任務中,使用者始終意圖直直朝目標移動。於是把解碼出的速度取來,保留其速率,把方向旋轉成指向目標——這個旋轉後的向量就是你的意圖估計,你用它來重新訓練。套用到速度卡爾曼濾波器上,就得到ReFIT 卡爾曼濾波器,這是迄今展示過性能最高的運動解碼器之一。

\tilde v_k = \lVert \hat v_k \rVert \; \frac{g_k - p_k}{\lVert g_k - p_k \rVert}

意圖估計:保留解碼出的速率 \lVert \hat v_k\rVert,但把方向從目前游標 p_k 改指向目標 g_k。已在目標上的樣本則設為零速度。以 \tilde v_k 重新訓練,可去除使用者誤差與解碼器誤差之間的混淆。

保留解碼器算出的速率,但把方向從原本亂飄之處改為直指目標。這假設使用者總是想朝目標前進,因此以這些修正後的速度重新訓練,可把使用者的誤差和解碼器的誤差解開。

\tilde v_k
用於重新訓練的修正「意圖」速度。
\lVert \hat v_k \rVert
解碼出的速率(大小)——保持不變。
g_k - p_k
從游標 p_k 指向目標 g_k 的向量。
\frac{g_k - p_k}{\lVert g_k - p_k \rVert}
把該向量縮成長度 1——純粹指向目標的方向。

一個往旁邊飄的游標保留其速率,方向卻被扳正直指目標;已在目標上的樣本則設為零速度。

閉迴路解碼器自適應(CLDA)

ReFIT 提供標籤;閉迴路解碼器自適應(CLDA)則提供把標籤納入卻不使迴路失穩的更新規則。這一家族共享同一種形狀:週期性地從近期一批資料估出新的解碼器參數,再把它們混入運行中的解碼器,而非直接取代。SmoothBatch 取凸組合;遞迴最大概似(RML)則以遺忘因子連續地做同樣的事;自適應卡爾曼變體則在線上更新模型自身的共變異數。

\Theta_n = (1-\rho)\,\Theta_{n-1} + \rho\,\hat\Theta_n^{\mathrm{batch}}, \qquad \rho = 1 - 2^{-\Delta t_{\text{batch}} / \tau_{1/2}}

SmoothBatch:把新批次估計混入目前參數。半衰期 \tau_{1/2} 是主控旋鈕——半衰期長代表適應緩慢而穩定;半衰期短代表適應快速而躁動。

與其跳到每個新估計,不如把它輕柔地混入舊參數。混合的快慢由半衰期決定:半衰期長代表緩慢而穩定的適應;半衰期短則代表快速但躁動。

\Theta_n
混合後更新的解碼器參數。
\hat\Theta_n^{\mathrm{batch}}
由最新一批資料算出的新鮮估計。
\rho
介於 0 與 1 之間的混合比例——採用新估計的多少。
\tau_{1/2}
半衰期——控制適應速度的主旋鈕。

半衰期長時,每批只輕輕推動解碼器;半衰期短時,它會迅速擺向新估計。

# One CLDA batch update for a velocity Kalman filter
rho = 1 - 2**(-dt_batch / half_life)              # blend weight from half-life
for batch in closed_loop_stream():
    p, v_dec = run_decoder(batch)                 # cursor path + decoded velocity
    v_int = refit_intention(v_dec, goal=p_goal, pos=p)   # rotate toward target
    Theta_batch = fit_kalman(neural=batch.y, kin=v_int)  # fresh estimate
    Theta = (1 - rho) * Theta + rho * Theta_batch        # SmoothBatch blend
    deploy(Theta)                                 # keep driving the loop
一個 CLDA 迴路:估計意圖、在一批資料上重新擬合、緩慢混入、持續運行——不需要監督式停機。

穩定性與可塑性:自適應速率這個旋鈕

混合權重正是控制理論與機器學習交會之處。適應太快,解碼器會去追逐量測雜訊,更糟的是會與使用者自身的學習產生不良耦合——就是上一篇的移動目標失穩,只是如今由你的更新速率所驅動。適應太慢,則追不上真實的漂移。因此解碼器穩定性是半衰期/遺忘因子的調參問題,而不是天上掉下來的性質。

\hat\Theta_n = \arg\min_{\Theta} \sum_{i \le n} \lambda^{\,n-i}\, \ell\big(\Theta;\, y_i, \tilde v_i\big), \qquad 0 < \lambda < 1

指數加權(遺忘因子)擬合:近期樣本主導,舊樣本以速率 \lambda 淡出。\lambda 小則追漂移快但雜訊大;\lambda \to 1 則穩定但緩慢——與 SmoothBatch 半衰期是同一個穩定性–可塑性旋鈕。

擬合解碼器,但給近期資料較高權重,讓舊資料以指數方式淡出。\lambda 小則忘得快(追漂移快但跳動大);\lambda 接近 1 則記得久(穩定但緩慢)——與 SmoothBatch 半衰期是同一個穩定性對可塑性的旋鈕。

\hat\Theta_n
n 步的最佳擬合解碼器參數。
\lambda
介於 0 與 1 之間的遺忘因子。
\lambda^{\,n-i}
樣本 i 的權重;越舊的樣本影響力呈指數縮小。
\ell(\cdot)
你正在加總並最小化的每樣本損失。

\lambda = 0.95,二十步前的樣本只約有最新樣本三分之一的份量。

半監督與自我再校正

自適應解碼的前沿,是徹底去掉校正段落。自我再校正利用任務本身的結構——游標停在目標上、一次點擊、一個解碼出的 ErrP、自然動作的統計——以非監督方式產生標籤,於是解碼器一邊追蹤漂移,使用者一邊照常工作。好處是零停機;風險則是一種回饋病態:若偽標籤衍生自解碼器自身的輸出,錯誤可能被強化,迴路可能漂移進一個「自信卻錯誤」的狀態。如何防範這種自我強化,是一個活躍的研究問題,我們會在最後一篇回到它。