解碼器是一次受過訓練的猜測
解碼器其實就是一個準備得非常充分的猜測者。你給它看大腦特徵——比如某人想像左手或右手運動時,特定節律裡的能量——並為每個樣本附上正確的標籤。它由此學到一條規則:面對新的特徵,哪個選擇最有可能?這就是一句話版的神經解碼。
這些帶標籤的樣本來自一段簡短的校準環節:受試者按照提示完成指令,同時你進行記錄。這就是監督式機器學習——從帶標籤的資料中學習一個映射。這個映射的好壞,更多取決於乾淨的特徵和誠實的評估,而非模型有多花俏。
從簡單開始:LDA
線性判別分析(LDA)會畫出一條筆直的分界——在二維裡是一條線,在更高維裡是一個平面——把兩個類別分開。直覺上,它會找到一個方向,讓兩團樣本沿這個方向被推得最開,然後在那裡把它們分開。在特徵又少又乾淨時,它是一個極好的基線:快、穩,而且不容易被騙。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # X_train: features (trials x features), y_train: labels (e.g. left/right) clf = LinearDiscriminantAnalysis() clf.fit(X_train, y_train) # learn the boundary from calibration data y_pred = clf.predict(X_test) # guess the class for new trials
SVM 及其同伴
支援向量機(SVM)同樣會畫一條分界,但它在意的是間隔。在所有能分開兩個類別的分界中,它會挑出兩側空白間隔最寬的那一條——也就是離每個類別最近樣本都盡量遠的那條邊界。這點額外的餘地,往往讓它在資料有限時更穩健。
當類別無法用直線分開時,SVM 還能藉助一種叫核函數的技巧,把邊界彎成曲線。和 LDA 一樣,它在又小又精選的特徵集上表現出色——所以它理應和 LDA 並肩放進你的基線工具箱。兩個都試試,讓誠實的驗證來決出勝者。
神經網路與深度學習
神經網路押的是另一種賭注。它們不需要你手工設計特徵,而是逐層自己學習特徵。一個卷積神經網路(CNN)可以接收相當原始的 腦電(EEG),並自行發現有用的模式——空間濾波器與頻段——無需別人告訴它。
誠實的代價是:這種靈活性很「餓」。深度網路有大量參數要擬合,所以需要海量帶標籤資料,才能勝過一個簡單基線。而一次典型的腦機介面校準,大概只能給你幾十到幾百個試次——通常遠遠不夠。在小資料集上,LDA 或 SVM 往往能與深度網路打平甚至更勝一籌。當你擁有大型、彙集起來的資料集時再動用深度學習,不要提前。
過擬合的陷阱
下面這個坑會絆倒所有人。在小資料集上,靈活的模型可能把雜訊背了下來,而不是學到訊號。它在自己訓練過的那些樣本上得分漂亮——然後一遇到真實、即時的大腦就崩盤。高高的離線準確率,是會騙人的。