EEG分类方法全解析:从传统机器学习到深度学习与混合架构
EEG 数据分类这件事说简单点就是给一段脑电信号打标签说复杂点它横跨了信号处理、特征工程、机器学习、深度学习好几个领域而且每个领域里都有自己的一套方法论和坑。我接触这个方向有些年头了从最早拿 SVM 做运动想象分类到后来用 CNN、RNN、GNN 各种网络结构往上堆踩过的坑比跑通的实验多得多。这篇东西不是教科书式的综述而是我把自己对 EEG 分类这个领域的理解重新梳理了一遍按分类体系的逻辑把它拆开讲清楚每一类方法到底在解决什么问题、为什么这么设计、实际用的时候哪里容易翻车。如果你刚入门 EEG 分类面对满屏的 CNN、RNN、GNN 不知道从哪下手或者你已经跑过一些模型但总觉得效果不稳定、不知道问题出在哪个环节那这篇内容应该能帮你把整个知识框架理清楚。我会从 EEG 信号本身的特殊性讲起然后按方法论的演进脉络把传统机器学习方法、CNN 系方法、RNN 系方法、GNN 系方法以及混合架构逐一拆解最后聊一下这个领域当前面临的核心挑战和可能的突破方向。1. EEG 分类为什么不能直接套用图像分类的那套逻辑1.1 EEG 信号的物理特性决定了它的分类难度很多人第一次做 EEG 分类下意识会觉得不就是一维信号嘛跟音频差不多拿个 CNN 上去搞就行了。这个想法不能说错但低估了 EEG 的特殊性。EEG 是通过电极在头皮表面采集到的脑神经元群体活动的电信号总和它的幅值通常在微伏级别非常微弱而且极易受到各种噪声干扰——眼电、肌电、心电、工频干扰、电极接触阻抗变化任何一个环节出问题都会让信号质量急剧下降。更麻烦的是EEG 信号的信噪比天然就低。你拿一个图像分类任务猫和狗的区别在像素层面是肉眼可见的但 EEG 信号里不同认知状态的差异可能就隐藏在几个微伏的波动模式里而且这些模式还因人而异、因时间而异。同一个人在不同时间做同样的运动想象任务EEG 模式可能都有明显差异不同人之间做同样的任务差异就更大了。这就是所谓的跨被试变异性问题也是 EEG 分类里最头疼的事情之一。从信号维度来看EEG 通常是多通道的少则几个通道多则几十甚至上百个通道。每个通道是一个时间序列所以整体数据可以表示成一个通道数 × 时间点的二维矩阵。这个矩阵里既包含空间信息不同通道对应不同脑区也包含时间信息信号随时间变化还包含频率信息不同频段的振荡。怎么把这三种信息有效地提取和融合是 EEG 分类方法设计的核心问题。1.2 从传统机器学习到深度学习的方法论迁移早期的 EEG 分类基本走的是手工特征 浅层分类器的路线。所谓手工特征就是从信号里提取一些有物理意义的指标比如功率谱密度、共空间模式、自回归模型系数、小波变换系数等等。这些特征提取方法背后都有信号处理的理论支撑提取出来的特征维度通常不高然后丢给 SVM、LDA、随机森林之类的分类器做判别。这套流程在数据量小、任务简单的场景下其实挺好用的。比如运动想象分类用 CSP 提取空间滤波特征再加上 LDA在 BCI 竞赛数据集上就能拿到不错的结果。但问题在于手工特征的设计高度依赖领域知识而且很难穷尽所有可能有用的信息。你提取了功率谱可能丢了相位信息你用了 CSP可能忽略了通道间的非线性关系。更重要的是手工特征提取本身就是一个信息压缩的过程压缩过程中不可避免地会丢失一些对分类有用的细节。深度学习的思路就不一样了。它不依赖人工设计特征而是让网络自己从原始数据或轻度预处理的数据里学习表示。CNN 可以自动学习局部的时间-空间模式RNN 可以捕捉长时依赖GNN 可以建模通道之间的拓扑关系。理论上只要网络结构设计合理、数据量足够深度学习模型能学到比手工特征更丰富、更判别性的表示。但理论上这三个字很关键。EEG 数据量通常不大标注成本又高深度学习模型很容易过拟合。而且 EEG 的信号特性跟图像、语音有本质区别直接把图像领域的 CNN 架构搬过来效果往往不如预期。所以 EEG 分类的方法设计需要在深度学习框架下充分考虑 EEG 的领域特性这也是为什么这个领域至今仍然有大量开放问题的原因。1.3 分类体系的构建逻辑我倾向于把 EEG 分类方法按两个维度来组织一个维度是特征提取方式另一个维度是分类决策方式。但这样分太学术化了实际做项目的时候不太实用。更接地气的分法是按模型架构来分因为架构选择直接决定了你怎么处理数据、怎么设计训练流程、怎么调参。按架构分大致可以分成这几类传统机器学习方法SVM、LDA、随机森林等、CNN 系方法包括各种变体如 EEGNet、DeepConvNet 等、RNN 系方法LSTM、GRU 及其变体、GNN 系方法GCN、GAT 等、以及混合架构CNNRNN、CNNGNN 等。这个分类不是互斥的很多方法实际上是交叉的比如一个模型可能同时用了 CNN 做特征提取和 LSTM 做时序建模。接下来的几个章节我会按这个分类体系逐一展开重点讲清楚每类方法的核心思路、适用场景、以及实际用的时候需要注意什么。2. 传统机器学习方法不是过时而是 baseline 的首选2.1 CSP LDA运动想象分类的经典组合共空间模式Common Spatial Pattern, CSP是 EEG 运动想象分类里最经典的特征提取方法没有之一。它的核心思想是找到一组空间滤波器使得两类信号的方差差异最大化。具体来说CSP 会对两类信号的协方差矩阵做广义特征值分解得到一组特征向量这些特征向量就是空间滤波器。把原始多通道信号投影到这些滤波器上再计算投影后信号的方差或者对数方差就得到了分类特征。CSP 之所以在运动想象任务上效果好是因为运动想象会引起特定脑区比如运动皮层的节律变化表现为 mu 节律和 beta 节律的事件相关去同步化或同步化。CSP 找到的空间滤波器正好能捕捉到这些节律变化的空域模式。配合 LDA 分类器在 BCI Competition IV 2a 数据集上被试内分类准确率通常能做到 70%-85% 左右具体取决于被试和任务难度。但 CSP 有几个明显的局限。第一它假设两类信号的协方差矩阵差异足够大对于任务难度高或者信号质量差的数据效果会大打折扣。第二CSP 是线性的对于非线性可分的情况无能为力。第三CSP 对频带选择很敏感你需要先确定用哪个频段的数据来做 CSP这个频段选择本身就是一个需要调的超参数。第四CSP 容易过拟合尤其是通道数多、训练样本少的时候需要做正则化。实际用 CSP 的时候我一般会做这几个处理先用带通滤波器把信号限制在 8-30 Hz覆盖 mu 和 beta 节律然后对每个被试单独做 CSP因为空间模式因人而异滤波器数量通常取 2-6 对太多容易过拟合最后用 LDA 或者 SVM 做分类。如果数据量允许可以做被试间的迁移学习比如用多个被试的数据训练一个通用的 CSP 滤波器然后在新被试上做微调。2.2 频域特征与时频域特征的提取策略除了 CSP 这种空域滤波方法频域特征也是 EEG 分类里常用的一类。最直接的就是功率谱密度PSD它描述了信号在不同频率上的能量分布。对于 EEG 来说通常关注 delta1-4 Hz、theta4-8 Hz、alpha8-13 Hz、beta13-30 Hz、gamma30-100 Hz这几个频段。你可以计算每个通道在每个频段上的平均功率然后把这些功率值拼接成一个特征向量。PSD 特征的好处是物理意义明确、计算简单、对信号质量的要求相对没那么高。但它的缺点也很明显它假设信号是平稳的而 EEG 信号本质上是非平稳的。你用一个 2 秒的窗口去算 PSD实际上是把这 2 秒内的频率成分平均了时间分辨率很低。对于需要精细时间信息的任务比如事件相关电位分析PSD 就不太够用了。时频域特征就是为了解决这个问题。常用的方法包括短时傅里叶变换STFT、小波变换Wavelet Transform、以及希尔伯特-黄变换HHT等。STFT 通过加窗把信号分成短段然后对每段做傅里叶变换得到一个时间-频率的二维表示。小波变换则用不同尺度的小波基去分析信号在低频段有好的频率分辨率在高频段有好的时间分辨率更适合 EEG 这种非平稳信号。实际做特征提取的时候我通常会组合多种特征。比如把 CSP 特征、PSD 特征、以及一些时域统计特征均值、方差、偏度、峰度等拼在一起然后用随机森林或者梯度提升树做分类。这种多特征融合 树模型的方案在很多 EEG 分类任务上都能拿到不错的 baseline而且训练速度快、可解释性好适合作为项目初期的快速验证方案。2.3 传统方法在实际项目中的定位虽然现在深度学习很火但我不建议一上来就搞深度模型。传统机器学习方法在 EEG 分类里仍然有很重要的价值主要体现在几个方面。第一作为 baseline。你做一个新任务先用 CSPLDA 或者 PSD随机森林跑一个结果出来心里就有底了。如果深度学习模型跑出来还不如传统方法那说明你的网络设计或者训练流程有问题需要回头检查。第二数据量小的时候。EEG 标注数据很难获取很多公开数据集也就几十个被试、每个被试几十到几百个 trial。这种数据量下深度学习模型很容易过拟合传统方法反而更稳。第三可解释性要求高的场景。传统方法的特征有明确的物理意义你能说清楚模型是根据哪个频段、哪个脑区的信号做出的判断。深度学习模型虽然可以用 Grad-CAM 之类的工具做可视化但解释性还是差一些。第四计算资源受限的场景。传统方法训练快、推理快在嵌入式设备或者实时 BCI 系统里更有优势。所以我的建议是先把传统方法跑通建立一个可靠的 baseline然后再根据实际需求决定要不要上深度学习。不要为了用深度学习而用深度学习。3. CNN 系方法从 EEGNet 到各种变体到底该怎么选3.1 EEGNet 的设计哲学与适用边界EEGNet 是 EEG 分类领域引用量最高的深度学习模型之一它的设计非常巧妙专门针对 EEG 信号的特性做了优化。EEGNet 的核心结构可以分成两块第一块是时间卷积用一维卷积在时间维度上提取频率特征第二块是空间卷积用深度可分离卷积在通道维度上提取空间特征。这个设计背后的逻辑是EEG 信号的信息主要体现在什么频率和什么空间位置上所以先做时间卷积提取频率特征再做空间卷积提取空间特征符合 EEG 的物理特性。EEGNet 的一个关键设计是使用了深度可分离卷积Depthwise Separable Convolution这大大减少了参数量。EEGNet 的参数量通常只有几千个相比动辄几百万参数的图像 CNN它非常轻量。这也是为什么 EEGNet 在小数据集上不容易过拟合的原因之一。但 EEGNet 不是万能的。它的时间卷积核长度和空间卷积的配置需要根据具体任务调整。比如运动想象任务时间卷积核长度通常设成采样率的一半左右对应 2 Hz 左右的频率分辨率而 P300 检测任务可能需要更短的时间卷积核来捕捉瞬态响应。另外EEGNet 的输入需要是通道 × 时间点的格式如果你的数据是其他格式需要先做转换。我在实际用 EEGNet 的时候发现几个需要注意的点。第一输入数据的归一化很重要。EEG 信号幅值因人而异如果不做归一化模型很难学到通用的模式。我通常会对每个 trial 的每个通道做零均值单位方差归一化或者用全局的均值和方差做归一化。第二EEGNet 的 dropout 率需要仔细调。默认的 0.25 或 0.5 不一定适合所有任务数据量小的时候可能需要更高的 dropout。第三EEGNet 对学习率比较敏感我一般用 Adam 优化器学习率设成 0.001 到 0.0001 之间配合余弦退火或者 ReduceLROnPlateau 调度。3.2 DeepConvNet 与 ShallowConvNet两种极端的设计思路DeepConvNet 和 ShallowConvNet 是另外两个经典的 EEG 分类 CNN 架构它们代表了两种极端的设计思路。DeepConvNet 顾名思义网络很深由多个卷积块堆叠而成每个卷积块包含卷积、批归一化、激活函数、池化等操作。它的设计思路是通过深层网络逐级提取从低级到高级的特征。ShallowConvNet 则相反网络很浅只有一个卷积层但卷积核的设计很讲究它模拟了带通滤波和对数变换的操作。这两种架构的对比很有意思。DeepConvNet 参数量大理论上表达能力更强但在小数据集上容易过拟合。ShallowConvNet 参数量小更接近传统信号处理的方法在小数据集上往往表现更稳定。我在 BCI Competition IV 2a 数据集上做过对比ShallowConvNet 在被试内分类任务上通常能比 DeepConvNet 高 2-5 个百分点尤其是在训练样本少于 200 个 trial 的时候。但这不意味着 DeepConvNet 就没用。如果你的数据量足够大比如几千个 trial 以上或者你用了数据增强、迁移学习等技术DeepConvNet 的潜力就能发挥出来。另外DeepConvNet 的架构更灵活你可以根据需要调整深度、宽度、卷积核大小等超参数而 ShallowConvNet 的结构相对固定。实际选型的时候我的建议是数据量小500 trial优先试 ShallowConvNet 或 EEGNet数据量中等500-2000 trial可以试 DeepConvNet 配合强正则化数据量大2000 trial可以尝试更复杂的架构或者自定义网络。3.3 CNN 处理 EEG 时的几个关键工程问题用 CNN 处理 EEG 数据有几个工程问题必须处理好否则模型效果会大打折扣。第一个是输入数据的维度排列。不同框架对输入维度的要求不一样PyTorch 的 Conv1d 要求输入是 (batch, channels, length)Conv2d 要求 (batch, channels, height, width)。EEG 数据通常是 (trials, channels, time_points)你需要根据网络结构做相应的维度变换。我见过不少人因为维度搞错了模型训练半天不收敛最后发现是数据格式的问题。第二个是 padding 策略。EEG 信号是时间序列做卷积的时候边界怎么处理会影响结果。通常有两种选择valid padding不填充输出长度会缩短和 same padding填充输出长度不变。对于 EEG 分类我一般用 same padding因为不想丢失边界信息。但如果你用的是因果卷积比如实时 BCI 场景那就需要用 causal padding。第三个是批归一化的位置。批归一化在 CNN 里通常放在卷积之后、激活函数之前。但对于 EEG 数据有研究表明把批归一化放在卷积之前效果更好因为它可以先对输入做标准化。这个没有定论需要根据具体任务实验。第四个是池化策略。EEG 信号的时间分辨率很重要过度池化会丢失时间信息。我通常用较小的池化窗口比如 2 或 4或者用步长卷积代替池化。另外全局平均池化Global Average Pooling在 EEG 分类里用得很多它可以把时间维度的特征聚合起来同时减少参数量。4. RNN 系方法捕捉 EEG 的时间依赖到底有多难4.1 LSTM 和 GRU 在 EEG 分类中的实际表现RNN 系方法的核心优势是能捕捉时间序列的长时依赖。EEG 信号本质上是时间序列理论上 RNN 应该很适合。但实际用下来LSTM 和 GRU 在 EEG 分类上的表现往往不如 CNN尤其是在被试内分类任务上。原因有几个。第一EEG 信号的有效时间依赖通常没有那么长。很多 EEG 分类任务比如运动想象、P300 检测的判别信息集中在几百毫秒到几秒的时间窗口内LSTM 的长时记忆能力反而可能引入噪声。第二LSTM 和 GRU 的参数量通常比 CNN 大在小数据集上容易过拟合。第三LSTM 的训练速度比 CNN 慢很多因为它的计算是串行的不能像 CNN 那样并行化。但这不意味着 RNN 在 EEG 分类里没用。在一些需要建模长时间动态的任务上比如睡眠分期、癫痫检测、情绪识别RNN 的表现就很有竞争力。睡眠分期的 EEG 信号通常需要分析 30 秒甚至更长的片段不同睡眠阶段之间的转换有明确的时间规律LSTM 能很好地捕捉这些规律。实际用 LSTM 处理 EEG 的时候我一般会先用 CNN 做特征提取然后把 CNN 的输出序列喂给 LSTM。这种 CNNLSTM 的混合架构在很多任务上比纯 LSTM 效果好。CNN 负责提取局部的时间-空间特征LSTM 负责建模这些特征之间的时间依赖。另外双向 LSTMBiLSTM在离线分析任务里用得很多因为它能同时利用过去和未来的信息。但在实时 BCI 场景里你只能用单向 LSTM因为未来的数据还没来。4.2 注意力机制与 Transformer 的引入近几年注意力机制和 Transformer 在 EEG 分类里越来越火。Transformer 的核心是自注意力机制它能直接建模序列中任意两个位置之间的关系不受距离限制。对于 EEG 信号这意味着模型可以同时关注不同时间点、不同通道之间的关联。但 Transformer 用在 EEG 上有几个挑战。第一Transformer 的参数量通常很大需要大量数据才能训练好。EEG 数据量普遍偏小直接上标准 Transformer 很容易过拟合。第二Transformer 的计算复杂度是序列长度的平方EEG 信号的时间点通常很多比如 1000 Hz 采样率下10 秒就是 10000 个点直接做自注意力的计算量太大。第三Transformer 对位置编码很敏感而 EEG 信号的位置信息时间位置和通道位置怎么编码还没有统一的最佳实践。目前比较可行的做法是先用 CNN 或者线性投影把 EEG 信号降维减少序列长度然后再用 Transformer 做建模。或者用一些高效的注意力变体比如 Linformer、Performer 等降低计算复杂度。另外一些专门为 EEG 设计的 Transformer 变体也在不断涌现比如把通道维度和时间维度分开做注意力或者用图结构来约束注意力范围。4.3 RNN 系方法的调参经验与常见陷阱RNN 系方法的调参比 CNN 更麻烦因为多了几个关键超参数。隐藏层维度、层数、dropout 率、梯度裁剪阈值、学习率调度策略每一个都会显著影响结果。隐藏层维度方面我一般从 64 或 128 开始试根据数据量和任务复杂度调整。层数通常 1-2 层就够了太深容易梯度消失或爆炸。Dropout 率在 RNN 里通常设得比 CNN 高0.3-0.5 比较常见。梯度裁剪是必须的EEG 信号里偶尔会有大幅度的伪迹不裁剪的话梯度可能会爆炸。我一般把梯度范数裁剪到 1.0 或 5.0。学习率方面RNN 对学习率比 CNN 更敏感。我通常用 Adam学习率从 0.001 开始如果训练不稳定就降到 0.0001。另外RNN 的训练通常需要更多的 epoch 才能收敛耐心一点不要看到前几个 epoch 效果不好就放弃。常见陷阱方面第一个是序列长度不一致的问题。不同 trial 的长度可能不一样你需要做 padding 或者截断。Padding 的时候要注意用 mask 把填充部分排除在损失计算之外否则模型会学到填充值的模式。第二个是 batch 内序列长度差异大的问题这会导致 padding 很多计算效率低。可以用 bucket by length 的策略把长度相近的样本放在同一个 batch 里。第三个是双向 RNN 在实时场景的误用前面提过了不再赘述。5. GNN 系方法把电极当成图节点之后发生了什么5.1 EEG 通道拓扑图的构建方式GNN 在 EEG 分类里的应用逻辑很直观EEG 电极分布在头皮上不同电极之间存在空间关联这种关联天然可以用图结构来表示。每个电极是一个节点电极之间的连接是边边的权重可以表示电极之间的功能连接强度或者物理距离。构建图的方式直接影响 GNN 的效果。常见的方法有几种。第一种是基于物理距离的图两个电极之间的边权重跟它们在头皮上的距离成反比。这种图简单直接但没有考虑功能连接。第二种是基于功能连接的图用相关性、相干性、互信息等指标计算电极之间的功能连接强度然后根据阈值或者 top-k 策略构建边。这种图更能反映实际的脑功能网络但计算量更大。第三种是自适应图让模型自己学习图结构而不是预先定义。这种最灵活但也最容易过拟合。我在实际项目里通常用物理距离图 功能连接图的混合策略。物理距离图提供先验知识功能连接图提供数据驱动的信息两者结合往往比单一图效果好。另外图的结构不一定要固定可以在训练过程中动态调整比如用注意力机制来学习边的权重。5.2 GCN、GAT 与 GraphSAGE 在 EEG 上的适配GCNGraph Convolutional Network是最基础的图神经网络它通过聚合邻居节点的特征来更新每个节点的表示。在 EEG 分类里GCN 可以把每个电极的信号特征作为节点特征然后通过图卷积来融合空间信息。GCN 的优点是简单、计算效率高缺点是它假设所有边的权重是固定的不能自适应地调整。GATGraph Attention Network引入了注意力机制让每个节点在聚合邻居信息时能自适应地分配权重。对于 EEG 数据这意味着模型可以自动学习哪些电极之间的连接对当前任务更重要。GAT 在很多 EEG 分类任务上比 GCN 表现好尤其是在通道数多、连接模式复杂的情况下。但 GAT 的参数量更大训练也更慢。GraphSAGE 是一种归纳式图学习方法它通过学习一个聚合函数来生成节点表示而不是为每个节点学习一个固定的嵌入。这使得 GraphSAGE 能泛化到训练时没见过的图结构。对于 EEG 分类如果你需要跨被试迁移GraphSAGE 可能比 GCN 或 GAT 更合适因为不同被试的图结构可能不同。实际用 GNN 处理 EEG 的时候我一般会把 GNN 和 CNN 结合起来。CNN 负责提取每个通道的时间-频率特征GNN 负责融合通道之间的空间信息。这种 CNNGNN 的架构在运动想象和情绪识别任务上都有不错的表现。5.3 GNN 的过拟合问题与正则化策略GNN 在 EEG 分类里最大的问题就是过拟合。EEG 数据量本来就小GNN 的参数量又不小两者叠加导致过拟合风险很高。我见过不少项目GNN 在训练集上准确率能到 95% 以上但验证集上只有 60% 多典型的过拟合。解决过拟合我通常从几个方面入手。第一简化图结构。不要用全连接图而是用稀疏图。边的数量控制在节点数量的几倍以内避免图太稠密。第二用 dropout。GNN 里的 dropout 可以作用在节点特征上也可以作用在边上。边 dropout 对 EEG 特别有效因为它相当于在训练时随机丢弃一些连接迫使模型学习更鲁棒的特征。第三用权重衰减。L2 正则化在 GNN 里很常用系数通常设成 1e-4 到 1e-3。第四早停。监控验证集损失如果连续多个 epoch 不下降就停止训练。第五数据增强。EEG 的数据增强方法包括加噪声、时间平移、通道丢弃、频率扰动等能有效增加训练样本的多样性。另外GNN 的层数不要太多。EEG 的图结构通常不大几十个节点2-3 层 GNN 就够了。层数太多会导致过平滑问题所有节点的表示变得相似失去判别性。6. 混合架构与多模态融合什么时候该把模型堆复杂6.1 CNNRNN 的经典组合与变体CNNRNN 是 EEG 分类里最常见的混合架构。基本思路是CNN 提取局部的时间-空间特征RNN 建模这些特征之间的时间依赖。具体实现上你可以用 CNN 处理原始 EEG 信号把输出的特征序列喂给 LSTM 或 GRU最后用全连接层做分类。这种架构在睡眠分期、癫痫检测、情绪识别等任务上都有成功案例。比如睡眠分期CNN 可以先提取每个 30 秒 epoch 内的时频特征然后 LSTM 建模相邻 epoch 之间的转换规律最后输出每个 epoch 的睡眠阶段。癫痫检测也类似CNN 提取发作间期和发作期的特征差异LSTM 捕捉发作的时序演变。但 CNNRNN 的参数量通常比较大训练也慢。如果数据量不够很容易过拟合。我的经验是如果 CNN 单独用就能拿到不错的结果那就没必要加 RNN。只有当任务确实需要建模长时间依赖而且数据量足够支撑 RNN 的训练时才考虑这种混合架构。6.2 CNNGNN 的空间-时间联合建模CNNGNN 是另一个常见的混合架构特别适合需要同时建模时间动态和空间拓扑的任务。CNN 负责提取每个通道的时间特征GNN 负责融合通道之间的空间信息。这种架构在运动想象分类上表现很好因为运动想象涉及多个脑区的协同活动GNN 能有效建模这种空间协同。实现上你可以先用 CNN 对每个通道的信号做一维卷积得到每个通道的特征向量然后把这些特征向量作为 GNN 的节点特征用预定义的或者自适应的图结构做图卷积最后把 GNN 的输出聚合起来做分类。这种架构的关键在于图结构的构建和 CNN 与 GNN 的衔接方式。图结构前面讲过了这里说一下衔接方式。一种做法是 CNN 和 GNN 端到端训练梯度可以从 GNN 传回 CNN。另一种做法是分阶段训练先训练 CNN固定 CNN 的参数后再训练 GNN。端到端训练效果通常更好但训练难度也更大。6.3 多模态融合EEG 与其他生理信号的结合在实际应用里EEG 往往不是唯一的信号源。很多场景下会同时采集眼电、肌电、心电、皮电等生理信号甚至包括视频、音频等非生理信号。多模态融合就是把这些不同来源的信息整合起来提高分类性能。多模态融合的策略大致分三种早期融合、中期融合、晚期融合。早期融合是在输入层面把不同模态的信号拼接起来然后一起送进模型。这种最简单但要求不同模态的信号在时间上对齐。中期融合是在特征层面做融合每个模态先各自提取特征然后在中间层把特征拼接或做注意力融合。晚期融合是在决策层面做融合每个模态各自出一个预测结果然后投票或者加权平均。对于 EEG 分类我一般推荐中期融合因为不同模态的信号特性差异大早期融合可能会让模型难以学习。中期融合可以让每个模态先提取适合自己的特征然后再做融合。融合方式可以用简单的拼接也可以用注意力机制让模型自适应地决定每个模态的权重。7. 分类体系之外的现实问题数据、评估与可复现性7.1 EEG 数据集的获取与预处理流水线做 EEG 分类数据是最大的瓶颈。公开数据集虽然有一些比如 BCI Competition 系列、TUH EEG 数据集、DEAP 数据集等但要么规模小要么任务单一要么标注质量参差不齐。自己采集数据的话设备、被试、实验设计、伦理审查每一个环节都是成本。预处理流水线是另一个关键环节。EEG 原始数据里充满了各种伪迹不处理的话模型学到的可能全是噪声。标准的预处理流程通常包括带通滤波去掉低频漂移和高频噪声、陷波滤波去掉工频干扰、坏道检测与插值、独立成分分析ICA去眼电和肌电、重参考、分段与基线校正。每一步都有讲究。比如带通滤波的频段选择取决于任务运动想象通常用 8-30 HzP300 用 0.1-20 Hz睡眠分期用 0.3-35 Hz。ICA 去伪迹的时候需要人工检查每个成分的拓扑图和功率谱判断哪些是伪迹成分。这一步很耗时但很重要自动化方法虽然有一些但准确率还不够可靠。7.2 评估指标的选择与交叉验证策略EEG 分类的评估不能只看准确率。如果类别不平衡比如癫痫检测里发作样本远少于非发作样本准确率会严重误导。这时候需要用平衡准确率、F1 分数、AUC-ROC 等指标。另外kappa 系数在 EEG 分类里也用得很多它衡量的是分类器比随机猜测好多少。交叉验证策略也很关键。被试内分类通常用 k-fold 交叉验证把同一个被试的数据分成 k 份轮流做验证集。被试间分类则用留一被试交叉验证Leave-One-Subject-Out每次留一个被试的数据做测试其他被试的数据做训练。被试间分类难度大得多准确率通常比被试内低 10-20 个百分点。还有一个容易被忽略的问题是数据泄漏。EEG 数据里同一个 trial 的不同片段如果被分到了训练集和验证集就会导致数据泄漏让评估结果虚高。正确的做法是按 trial 划分确保同一个 trial 的所有片段都在同一个集合里。另外预处理步骤比如 ICA、归一化如果用了全部数据的信息也会导致泄漏。严格的做法是在交叉验证的每一折里独立做预处理。7.3 可复现性危机与工程实践建议EEG 分类领域的可复现性问题比较严重。同一个模型不同人实现出来效果可能差很多因为预处理细节、超参数、训练策略、甚至随机种子的选择都会影响结果。我见过不少论文报告的结果自己复现的时候根本达不到。提高可复现性我建议从几个方面入手。第一固定随机种子。PyTorch、NumPy、Python 的随机种子都要设确保每次运行结果一致。第二记录所有超参数和预处理步骤。用配置文件管理不要硬编码在代码里。第三用版本控制管理代码和数据。数据预处理后的版本也要记录确保用的是同一份数据。第四公开代码和预训练模型。如果条件允许把代码整理好放到 GitHub 上方便别人复现和对比。另外做实验的时候要控制变量。一次只改一个超参数观察结果变化。不要同时改好几个否则出了问题都不知道是哪个引起的。实验记录要详细包括每次运行的配置、结果、以及观察到的现象。这些工程习惯看起来琐碎但长期来看能节省大量时间。8. 我在 EEG 分类项目里踩过的几个真实坑8.1 预处理顺序搞错导致模型完全学不到东西有一次做运动想象分类数据预处理的时候我先做了 ICA 去伪迹然后才做带通滤波。结果模型训练出来准确率一直在 50% 左右徘徊跟随机猜差不多。排查了很久最后发现是预处理顺序的问题。ICA 应该在带通滤波之后做因为带通滤波会改变信号的统计特性影响 ICA 的分解结果。顺序搞反了ICA 分解出来的成分质量很差去伪迹效果不好残留的伪迹干扰了模型学习。这个坑让我意识到预处理流水线的每一步顺序都是有讲究的不能随便调换。标准的顺序是带通滤波 → 陷波滤波 → 坏道检测与插值 → ICA 去伪迹 → 重参考 → 分段与基线校正。当然具体顺序可能因任务和数据集而异但大原则是先做线性滤波再做盲源分离最后做重参考和分段。8.2 被试间分类直接套用被试内模型的血泪教训被试内分类和被试间分类的难度完全不是一个量级。我刚开始做 EEG 分类的时候被试内分类用 CSPLDA 能到 80% 多就以为被试间分类也差不多。结果直接套用同样的流程做被试间分类准确率掉到了 55% 左右跟随机猜差不了多少。后来才明白被试间分类的核心难点在于不同被试的 EEG 模式差异太大。CSP 滤波器是在特定被试的数据上训练的换一个被试空间模式可能完全不一样。解决这个问题要么用迁移学习把源被试的知识迁移到目标被试要么用深度学习方法让模型自动学习被试无关的特征表示要么做被试特定的校准用目标被试的少量数据做微调。这个教训让我在做任何 EEG 分类项目之前都会先明确是哪种分类场景然后选择相应的方法和评估策略。被试内分类的结果不能直接推广到被试间场景反之亦然。8.3 数据泄漏让实验结果虚高差点发出去的错误结论有一次做一个情绪识别项目用 DEAP 数据集交叉验证的时候我按样本随机划分训练集和验证集。结果模型准确率到了 90% 多我当时还挺高兴觉得方法很有效。后来仔细检查才发现DEAP 数据集里同一个被试的多个 trial 是高度相关的按样本随机划分会导致同一个 trial 的片段同时出现在训练集和验证集里造成数据泄漏。改成按被试划分之后准确率掉到了 65% 左右这才是真实水平。这个坑让我深刻认识到EEG 数据的划分必须考虑数据的层次结构被试 → trial → 片段不能简单地按样本随机划分。另外预处理步骤也要在交叉验证的每一折里独立做不能用全部数据的信息。8.4 模型在公开数据集上表现很好换到自己的数据就崩了公开数据集上的结果好不代表模型在实际数据上也能好。我做过一个癫痫检测项目在公开数据集上 AUC 能到 0.95 以上但换到合作医院的数据上AUC 掉到了 0.7 左右。原因有很多设备不同、采集协议不同、被试群体不同、标注标准不同、伪迹模式不同。这个坑让我明白EEG 分类模型的泛化能力是一个很大的问题。在公开数据集上刷高分数固然重要但更重要的是模型能不能在实际场景里稳定工作。做项目的时候一定要尽早拿到实际数据做验证不要等到模型在公开数据集上调好了才去试实际数据那时候可能已经走了很多弯路。9. 这个领域接下来值得关注的方向EEG 分类这个领域方法论的演进速度很快但真正落地的东西不多。我觉得接下来有几个方向值得关注。第一个是自监督学习。EEG 标注数据稀缺但未标注数据相对容易获取。自监督学习可以通过设计预训练任务比如掩码重建、对比学习、时序预测等让模型从大量未标注 EEG 数据里学习通用表示然后在下游任务上用少量标注数据微调。这个方向如果能突破对 EEG 分类的落地会有很大推动。第二个是跨被试迁移和领域自适应。被试间差异是 EEG 分类的核心难题现有的迁移学习方法效果还不够理想。未来可能会有更有效的领域自适应方法或者结合元学习、少样本学习的技术让模型能快速适应新被试。第三个是可解释性。EEG 分类模型如果要用在临床或者 BCI 场景可解释性很重要。医生或者用户需要知道模型是根据哪些信号特征做出的判断。现有的可解释性方法比如 Grad-CAM、SHAP 等在 EEG 上的效果还有待提升未来可能会有专门针对 EEG 的可解释性工具。第四个是实时性和低功耗。BCI 系统对实时性要求很高模型推理必须在毫秒级完成。现有的深度学习模型虽然准确率高但计算量大在嵌入式设备上跑不动。未来可能会有更多轻量化、高效化的 EEG 分类模型出现。第五个是标准化评估。EEG 分类领域缺乏统一的评估基准和标准不同论文用的数据集、预处理流程、评估指标都不一样导致结果很难直接比较。未来可能会有更规范的评估框架出现推动领域的健康发展。这些方向里我个人最看好自监督学习和跨被试迁移因为它们直接针对 EEG 分类的两个核心瓶颈标注数据少和被试差异大。如果这两个问题能有实质性突破EEG 分类的落地应用会迎来一波真正的增长。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →