把運動意圖當成隱藏狀態
把你想要的東西建模成隱藏狀態 \mathbf{x}_k——對游標而言就是位置與速度,\mathbf{x} = [x, y, v_x, v_y, 1]^\top(末尾的 1 用來吸收基線偏移)。你量測到的神經特徵是觀測量 \mathbf{z}_k——即分箱放電率向量。一個狀態空間模型以兩條線性高斯方程把它們耦合起來。
\begin{aligned} \mathbf{x}_k &= A\,\mathbf{x}_{k-1} + \mathbf{w}_k, & \mathbf{w}_k &\sim \mathcal{N}(\mathbf{0}, W) \\ \mathbf{z}_k &= C\,\mathbf{x}_k + \mathbf{q}_k, & \mathbf{q}_k &\sim \mathcal{N}(\mathbf{0}, Q) \end{aligned}上式為軌跡(狀態)模型,下式為觀測(編碼)模型。解碼器所知的一切都住在 A, W, C, Q 之中。
卡爾曼濾波器把運動建模成一個隨時間滑行前進的隱藏狀態(軌跡模型),並由它生成你觀測到的神經放電(觀測模型)。解碼器對世界的一切假設,都塞進四個矩陣裡。
- \mathbf{x}_k
- 第 k 步的隱藏狀態(例如游標速度)。
- \mathbf{z}_k
- 第 k 步觀測到的神經放電。
- A,\ W
- 狀態轉移與其過程雜訊共變異數。
- C,\ Q
- 狀態如何映到神經觀測,以及觀測雜訊。
A 說「速度會延續」;C 說「這些神經元對那個速度放這麼多電」——這就是速度卡爾曼濾波器。
兩個模型:動力學與編碼
軌跡模型 A 是一個平滑先驗——一個近似隨機漫步的過程,表示速度會延續且略受阻尼;W 設定狀態每個時間窗可跳動的幅度。觀測模型 C 是編碼映射:每一列是某通道對動作學參數的線性調諧,因此 C\mathbf{x} 是該狀態所預測的放電率,而 Q 是神經雜訊共變異數。兩者皆由一段短暫的校準區段(觀察或嘗試的動作)擬合而得。
預測—更新遞迴
每個時間窗執行兩步。預測:把上一個估計推過動力學,並讓不確定性增長。更新:依你對新神經量測的信任程度,把預測拉向該量測。
\hat{\mathbf{x}}_k^- = A\,\hat{\mathbf{x}}_{k-1}, \qquad P_k^- = A\,P_{k-1}\,A^\top + W預測步:先驗狀態及其共變異數。
在看到新的神經資料之前,濾波器把上一次的估計透過動力學向前推,猜出狀態跑到哪裡,並擴大它的不確定度,以反映「預測從不完美」。
- \hat{\mathbf{x}}_k^-
- 量測之前的先驗(預測)狀態。
- A\,\hat{\mathbf{x}}_{k-1}
- 上一次估計被動力學向前推。
- P_k^-
- 預測的不確定度(共變異數)。
- W
- 加入的過程雜訊,使不確定度膨脹。
「上一框游標往右移,所以預測它繼續往右」——只是誤差範圍變得更寬。
\begin{aligned} K_k &= P_k^-\,C^\top\!\left(C\,P_k^-\,C^\top + Q\right)^{-1} \\ \hat{\mathbf{x}}_k &= \hat{\mathbf{x}}_k^- + K_k\,\underbrace{\left(\mathbf{z}_k - C\,\hat{\mathbf{x}}_k^-\right)}_{\text{innovation}} \\ P_k &= \left(I - K_k C\right)P_k^- \end{aligned}更新步:卡爾曼增益將創新(量測殘差)相對於先驗加以加權。
現在新的神經量測到了。濾波器把它和原本的預期相比(創新),再依卡爾曼增益決定的幅度,把預測往資料方向推——神經訊號可靠時就更信量測,否則就更信預測。
- K_k
- 卡爾曼增益——在預測與量測之間的信任旋鈕。
- \mathbf{z}_k - C\,\hat{\mathbf{x}}_k^-
- 創新:實際觀測減去預期觀測。
- \hat{\mathbf{x}}_k
- 校正後的(後驗)狀態估計。
- P_k
- 用了量測之後降低的不確定度。
若神經元放電比「往右移」的預測還多,卡爾曼增益就把速度往上修正。
卡爾曼增益 K_k 講的全是信任:當神經雜訊 Q 很大時它縮小,濾波器倚賴先驗(平滑、遲滯);當 Q 很小時它增大,濾波器追逐量測(靈敏、抖動)。創新 \mathbf{z}_k - C\hat{\mathbf{x}}_k^- 是新資訊;若模型正確它應為白噪聲,這也是一個即時診斷——用以判斷編碼模型是否已漂移。
# one closed-loop bin k of a velocity Kalman filter x_pred = A @ x # predict state (pos, vel) P_pred = A @ P @ A.T + W S = C @ P_pred @ C.T + Q # innovation covariance K = P_pred @ C.T @ inv(S) # Kalman gain x = x_pred + K @ (z - C @ x_pred) # correct with firing rates z P = (I - K @ C) @ P_pred cursor_velocity = x[2:4] # drive the effector # user sees the cursor move, adjusts intention -> next z
調整濾波器就是調整手感
平滑與遲滯之間沒有免費午餐。較大的過程雜訊 W(或較小的 Q)給出靈敏但抽動的游標;反之則給出平滑但遲鈍的游標。實務上你要依使用者的操控手感、而非離線誤差來調整比值 W/Q——離線擬合最好的設定,往往遲滯到無法操作。
乾淨模型崩壞之處
此濾波器僅在其假設下最佳,而真實皮質會違反這些假設。調諧 C 在單次內與跨單次間漂移;積分後的速度會累積位置偏差;而校準是在開迴路下蒐集的,其統計特性與解碼器實際運行的閉迴路情境不同。每一種失效都有對策——而每一種對策正是下一章的主題。