1. 从一个失败实验说起当模型把生日快乐理解成数学题七八年前我还在某高校的认知神经科学实验室干活。当时组里接了一个跨学科项目要把经典的语义启动范式搬进计算模型里用一个循环神经网络去模拟看到单词——激活语义——产生行为反应这条链。导师给的预期很乐观说第一版模型跑通之后再叠加脑电数据做源定位应该能凑一篇还不错的文章。结果我第一个模型就翻车了输入生日这个词循环网络激活最强烈的语义节点居然是计算公式这一类。查了很久才明白问题出在哪——训练语料里有一个高频词生日蛋糕蛋糕的价格标签经常和结算计算这些语境共现网络把生日和计算的权重拉得极高。这件事让我印象特别深不是因为模型笨而是因为它暴露了一个根本问题语言加工的神经计算模型到底应该模拟行为结果还是模拟神经计算过程后来这几年我陆续做了不少语言加工的计算建模工作也帮几个团队搭过 fMRI 和脑电的编码模型。说实话市面上大多数号称神经计算模型的工作其实只是把行为数据拟合了一下离神经还差得很远。真正要做语言加工的神经计算模型至少要回答三件事模型在哪一层表征语言信息、模型如何把时间维度的输入转化为状态变化、模型输出怎么和神经信号BOLD、ERP、频带功率对齐。这篇文章把我踩过的坑、试过有效的流程和一些关键思考写出来希望能给刚入坑的同行省点时间。我把文章分成几条主线先是理论框架怎么选然后是计算建模的具体落地接着是模型和脑数据对齐的实操方法最后聊一个我认为当前领域最大的争议点。全文偏经验分享不回避失败细节。2. 从行为模型到神经模型这个神经到底指什么2.1 传统心理语言学模型的两层结构先往回看一眼。传统心理语言学对语言加工的描述基本是二分结构词汇层面词形、语音、词义和句法语义层面组合、整合、推理。经典模型比如早期的那套词汇发生模型和后来的双通路朗读模型都能解释不少行为现象词频效应、一致性效应、规则词和不规则词的差异。但这类模型有一个共同问题——它们都是符号逻辑箱。符号模型假设大脑里存在类似词典的条目每个条目有固定属性加工过程就是查表、匹配、竞争。这个假设的好处是解释力强坏处是生物学上很难成立。单个神经元不可能对应一个生日的完整词条语义知识一定是分布式存储在成千上万个神经元群体里的。这也是后来分布式表征模型如早期的联结主义模型兴起的原因。联结主义模型用一组数值向量表示词义用权重矩阵模拟学习很多经典的语义启动、语音混淆效应都能被复现。2.2 神经计算模型要回答的层次问题那神经计算模型和上述联结主义模型有什么区别我个人理解关键在三个层次第一表征层次。神经计算模型需要明确表征单元与神经群体的映射关系。比如词向量里的每一个维度对应哪个皮层区域这在传统联结主义模型里是不管的。第二时间动力学。语言加工是高度时间动态的一个词从视网膜到前颞叶语义区大约只需 200-300 毫秒。神经计算模型必须要在时间维度上显式建模不能用简单的前馈一次传播带过。第三预测与误差。现在的主流观点认为大脑不是被动接收语言输入而是持续生成预测并用输入信号与预测的差异来更新内部状态。这个预测加工的思想成为语言神经计算模型的统一性框架后面我会专门展开。如果你只把行为数据拟合得很好但没有讨论表征映射、没有涉及时间动态、没有和脑信号对照那我建议这篇文章还是叫语言加工的计算模型不要加神经两个字因为审稿人一定会问你的模型哪一部分对应哪个神经过程你怎么验证这个对应是对的2.3 一个判断框架先定要解释的信号我在实际项目中拿到一个新任务的第一步从来不是选模型而是确定要解释的神经信号是什么。不同信号对应的时间尺度和空间尺度完全不同信号类型时间分辨率空间分辨率适合回答的问题行为反应时毫秒级无加工难度、竞争、冲突脑电 ERP毫秒级低需源定位加工阶段、预测违背、注意调制脑磁图 MEG毫秒级中动态网络、频段互动功能磁共振 fMRI秒级毫米级脑区定位、表征结构通过多体素模式颅内电极 ECoG毫秒级高局部高伽马、特定脑回时间进程有了信号类型才能决定建模粒度。比如你要解释 N400 效应模型就必须有语义预测误差这样的变量能在毫秒时间尺度上产生一个幅度变化你要解释左侧颞叶前部的语义组合效应模型就必须有显式的组合算子能输出一个逐 trial 的激活值用来预测 fMRI 体素响应。所以说到底神经计算模型不是一种特定算法而是一套把认知理论转化为可计算过程、把计算过程与神经信号相连的方法论。模型选择取决于解释目标而不是跟风用某种热门的深度学习架构。3. 语言加工的双通路模型如何把它改造成可计算的架构3.1 背侧与腹侧不只是解剖学区分提到语言加工的神经计算模型绕不开双通路框架。解剖学上看语言网络大致分两条路腹侧通路负责声音到意义从初级听觉皮层经颞中回、颞下回到达前颞叶背侧通路负责声音到动作从听觉皮层经缘上回、弓状束到达额下回后部。这解释了很多行为分离现象语义痴呆患者腹侧通路受损听得到词但想不起意思传导性失语患者背侧通路受损理解尚可但复述困难。但这个双通路框架在计算建模里长期不受重视因为早期的模型只处理文字输入不需要处理语音-动作转换。真正让它重新火起来的是语音识别和语音合成的深度神经网络——它们天然就是听觉到语义和听觉到动作两条通路。3.2 我的双通路简化实现方案如果要在自己的项目里复现一个双通路神经计算模型我的建议是不要一开始就把两条通路都建得极其复杂先用一个最小可行版本跑通。我常用的方案是输入层使用语音特征梅尔频谱或者音素序列而非纯文本。因为纯文本会丢掉语音韵律信息让背侧通路没有存在感。腹侧通路使用一个编码器-解码器结构把声学特征映射为语义向量。这个语义向量空间可以用词嵌入预训练初始化再用任务语料微调。背侧通路一个序列到序列的映射从声学特征直接映射到发音动作参数或者对应的文本音素序列。这部分本质上是语音识别/合成任务。双向交互在每条通路中间加入一个共享隐层让两条通路可以互相调节。这个调节是实现自上而下预测的关键部位。例如当听到天气时腹侧通路激活的是温度出门要不要带伞这类语义背侧通路则模拟嘴里准备发tiān qì这两个音节的运动程序。两者共享的隐层会传递信息语义预测可以提前抑制背侧通路里不太可能的发音变体同时发音动作的反馈也会修正语义激活的模糊性。这个最小版本跑通后再去调整通路之间的权重、加递归连接、加入预期误差项一步一步逼近真实的神经动态。3.3 训练数据与损失函数的设计陷阱很多人在这一步摔跟头用标准的交叉熵损失训练双通路模型做完之后发现背侧通路退化了——因为训练数据里有很多文本-语义对但没有足够的文本-发音对模型学会了绕过背侧通路直接由输入特征跳到语义向量。解决这个问题我在实践中用了两个技巧一是分阶段训练。先分别用各自的语料训练两条通路让两条通路都能独立完成各自任务再合并联合训练。这相当于先给模型建立两条高速公路再修两条路之间的连接匝道。如果一开始就联合训练模型会偷懒走捷径。二是在损失函数里加通路特异性约束。比如对背侧通路的输出加一个目标不仅要能转换到发音动作参数还要在隐层空间和腹侧通路的表征保持部分距离。这个约束的作用是防止两条通路的信息完全同质化保留双通路各自的计算特点。这类避免通路退化的损失设计本质上是在告诉模型你的任务是模拟大脑的计算组织方式而不只是做出正确答案。这个哲学区别恰恰是神经计算模型和普通AI模型的分水岭。4. 预测编码为什么说这是语言加工最合理的计算原则4.1 大脑是预测机器语言加工就是一连串预测修正我花了很久才真正理解预测编码对语言加工的重要性。之前总觉得预测编码只是贝叶斯大脑的一种表述换汤不换药。直到自己做脑电实验看到 N400 幅度随语境可预测性单调变化的数据才意识到预测编码在语言模型里不是可选项而是近乎必然的选择。核心思想很简单大脑在加工每个词之前已经根据语境生成了一组概率预测。如果输入与预测一致神经反应很弱如果输入违反预测神经反应就会显著增强。这个预测误差信号在脑电上最典型的体现就是 N400在fMRI中则表现为颞叶和额下回的激活增强。从计算角度看这正好对应了生成模型的基本操作前向生成预测、计算误差、反向传播更新。因此语言加工的神经计算模型在很大程度上就是用生成模型的眼光重新审视语言理解。4.2 模拟 N400 的一个最小预测编码模型我曾经帮一位师兄做过一个模拟实验目标是想验证N400 幅度是否由预测误差大小解释。我们搭建了一个两层模型高层的语义记忆网络先根据前文语境生成下一个词的语义特征预测低层的输入表征是当前词的真实语义特征。误差信号的大小由两者的余弦距离计算。关键细节模型在每一个词出现时都会输出一个误差标量把这个标量序列和受试者的 ERP 波形做相关。结果发现在 300-500 毫秒窗口内单 trial 的误差大小能解释 N400 幅度方差的 30% 左右。如果只用语义相关或者词频预测解释率只有 10%-15%。这个结果让我很受触动。因为 30% 的方差解释在认知建模里已经算不错了而且模型里并没有任何脑电响应参数——误差大小是被计算出来的不是被拟合出来的。这说明预测编码框架和神经生理信号之间确实存在深层对应关系。4.3 层级预测编码把语音、词汇、句子分开来建模后来我把模型扩展到层级结构底层预测音素、中层预测词形、高层预测语义主题和句法角色。每一层都有独立的预测与误差计算层与层之间通过误差信号反向传导。这个扩展版在解释 P200 和 N400 的分离上有优势。P200 的调制与低层级语音预测误差更相关而 N400 与高层级语义预测误差更相关。我们可以设计一个分层回归来检验用低层误差预测 P200 幅度用高层误差预测 N400 幅度把两者的解释部分分离出来。这个做法的好处是让模型的每一部分都有明确的神经对应物文章写出来、神经计算这个名号才算名副其实。缺点也很明显层级越细化需要标注的数据越多训练越容易陷入局部最优。我的建议是一层一层加先验证单层预测误差与脑电的相关性再逐步加入高层不要一上来就建一个十层生成模型。5. 与脑数据对齐模型输出到体素活动这一步才是真功夫5.1 编码模型 vs 解码模型别把方向搞反一个很常见的误区是很多人把用脑信号预测词解码当成模型验证的主要手段。其实在神经计算模型的语境里更有信息量的是用模型表征预测脑信号编码。解码告诉你脑信号里包含了哪些信息编码告诉你模型的表征结构能否解释脑信号的激活模式。两者的差别很大。解码模型比如 SVM 分类器往往有很强的自由度少量 trial 就能训练出不错的效果但无法告诉我们大脑具体如何计算。编码模型要求你显式给出每个刺激的预测特征值然后用线性回归去拟合体素响应——如果拟合得好说明模型的计算结构确实与大脑的激活模式共享某种统计关系。我自己的项目流程几乎固定是编码模型检验理论、解码模型做稳健性验证两步走。5.2 Banded ridge regression 与交叉验证流程在 fMRI 编码模型里最常用也最稳的方法是带岭回归。如果不考虑多重共线性普通最小二乘就能把模型特征映射到体素但语言特征维度通常很高几千维trial 数量却只有一两百共线性非常严重必须加正则化。我一般这样做提取每个 trial 的模型特征向量比如 256 维的词义特征 128 维的句法结构特征 50 维的语境一致性特征。使用 banded ridge regression把特征分组各组分别惩罚。这样做的目的不是为了预测准确率而是为了给每个特征组单独估计一个方差解释比例。用嵌套交叉验证外层按被试轮流留一内层用网格搜索惩罚强度。这一步最容易出问题详见下一小节。回归结果解释也有讲究。不要把模型特征能预测一部分体素直接说成该脑区编码了模型特征。更严谨的做法是用置换检验或者对比基线模型确认预测能力显著高于一个控制模型比如打乱语义特征的模型。只有通过这个对照才能下因果性较弱的结论。5.3 边界条件脑电时间序列的滞后对齐fMRI 和模型拟合是静态对齐——刺激出现后的几个 TR 内的平均响应。但脑电 ERP 是动态的需要做时间对齐。做法是把模型输出序列和 ERP 波形逐点做相关找到解释率最大的时间窗口或者使用Temporal Generalization方法检验模型特征在不同时间点上的表征稳定性。这块有一个极易被忽视的坑不要在全时间窗口上做单一相关性检验。ERP 里有明显的成分重叠P1、N1、P200、N400、P600一个模型特征可能在多个窗口都有弱相关。正确做法是先把 ERP 分解成独立成分ICA或者做时间窗口分组检验再分别和模型特征做相关。否则你得到的高相关可能只是不同成分平均后的伪影。5.4 需要的工具与开发环境这一节写给想复现的读者。我的依赖清单相对朴素没有用特别重的框架Python 3.9numpy、scipy、scikit-learn回归和交叉验证NilearnfMRI 数据读取、mask 处理MNE-Python脑电预处理和分析PyTorch搭建神经网络模型提取特征自定义的 100 行左右 banded ridge 实现主要为了灵活控制特征分组如果你只做脑电验证MNE-Python 就够了如果要同时处理 fMRI 和脑电建议把数据处理流程单独写成脚本不要在一个 Notebook 里互相污染。我的血泪教训是脑电预处理的标记系统和 fMRI 的刺激时间轴一旦对不上后面所有模型验证都会出问题。6. 我的踩坑实录预处理、统计效力和可复现性6.1 脑电预处理不当导致的虚假预测效应有一个项目让我印象很深。当时用预测编码模型解释语义异常的 N400初步结果显示模型误差与 N400 幅度相关高达 0.5。我差点就准备写文章了但一个偶然的机会发现只要在预处理里把眼电伪迹去除这一步换用不同的 ICA 参数相关就从 0.5 掉到 0.2。这是典型的过度预处理问题。因为我的模型误差比较高低的 trial恰好也是被试眼睛注视漂移比较明显的 trial语义异常的刺激更容易引起注意从而引起眼动如果 ICA 没有完全去掉眼动成分模型误差信号就借了眼电的方差。教训凡是预测变量和行为/神经变量高度相关的结果先检查这个预测变量是否与低层生理伪迹存在共变。这应该是所有语言神经计算建模者的本能反应。验证方法很简单把模型误差与眼电的 RMS 幅度做相关如果显著相关那你的神经计算建模可能只是在模拟眨眼。6.2 显著性检验的多重比较问题fMRI 体素级分析天然会做多重比较校正但很多人忘了在编码模型里你可能同时检验了多个特征组语义、句法、语音、语境这些检验不是独立的。如果你在报告里说语义特征显著预测了左侧颞叶句法特征显著预测了左侧额下回但没有做特征间差值的显著检验严格来说证据不足。我的做法是对所有特征模型的预测与基线模型预测做配对置换检验并且在进行脑区级别的报告前使用聚类水平的置换检验cluster-based permutation test控制假阳性。这个做法在 MNE 里有现成实现但很多人嫌麻烦跳过最后审稿人一问就崩。6.3 可复现性的最后一公里固定种子与版本锁定深度学习模型提取特征时由于随机初始化同一批刺激在不同运行中的特征可能有微小差异。如果这些差异正好落在与脑信号相关的地方结果就不可复现。我的经验是模型结构一旦确定立即把特征提取结果缓存为 .npy 文件之后的编码模型分析全部基于缓存特征。同时环境依赖 lock 版本最好打包成容器镜像。这个习惯看似无关紧要但在合作项目里能避免无数争论。另外还有一个容易忽略的点脑电数据的 epoch 时间锁定。模型预测误差的计算是从刺激呈现前就开始的上下文预测ERP 的 0 点是刺激呈现时刻。两者之间的时间对齐必须有明确的代码注释否则换个人来看你的数据根本不知道这个 0 点是怎么对齐的。7. 表征主义和具身认知之争语言神经计算模型的未来在哪7.1 纯符号/统计表征的边界目前多数语言神经计算模型本质上是内部表征统计特征向量这一派。我承认这套思路非常有效fMRI 编码模型解释力最好的特征向量往往来自大规模语言模型。但我这两年也在不断怀疑一件事语言加工真的只是高维空间里的向量运算吗临床上有一些病人纯粹的语言表征网络词汇语义系统受损程度很轻抽象名词理解还行但具体名词特别是有身体动作关联的比如踢抓理解显著下降。这类现象提示语义不是完全脱离感觉运动系统的抽象符号而是以多模态经验为基础的分布式信息。如果只用一个文本预训练的词向量模型这类病人的语义缺陷是模拟不出来的。这倒逼我思考语言加工的计算模型是不是应该加入动作、感知、情感这些模态的信息7.2 多模态神经计算模型一种可行但也要踩坑我尝试过一种方案把语义特征扩展为文本向量 动作特征 视觉特征的三模态拼接。具体来说动作特征来自一个简易的动作语义空间把人称代词与动作相关词汇共现矩阵做低维嵌入视觉特征来自一个预训练图像模型对对应物体的输出向量。实验结果是对具体名词的神经解码效果确实更好。但问题也随之而来多模态特征之间的尺度差异很大如果不做适当的白化处理编码模型回归时动作特征会占据主导导致视觉特征的预测贡献被低估。我当时为了调这个白化参数花了整整两周。所以我的建议是如果你没有明确的临床或行为学证据表明单模态文本特征不够不要轻易上多模态。多模态是加分项但也是风险项。先跑通纯文本基线再逐个模态加每加一个模态都要比较增量解释力是否显著。7.3 我对这个领域方向的个人判断说点个人经验层面的看法。我觉得未来语言加工的神经计算模型一定会走向多尺度约束整合微观尺度要有神经元动力学的约束介观尺度要有皮层区域交互的约束宏观尺度要有行为表现的约束。现在绝大多数模型只做到了介观和宏观之间的对接微观层面的约束非常稀缺。而这恰恰是留给下一批研究者的机会。当前脑机接口和神经记录技术正在快速发展单细胞水平和多脑区同步记录的数据会越来越多。如果能把这些高分辨率数据与语言加工的时间动态模型结合起来我们可能真的能第一次在计算意义上理解人类如何用几百毫秒理解一句从未听过的话。就我个人而言这个方向虽然难但每个阶段都有值得做的问题。哪怕只是把一个最小预测编码模型跑到脑电数据上验证一遍也比停留在纯行为数据的拟合阶段更有价值。毕竟模型改变了我们对大脑的认识方式也会跟着改变。
阅读完成 · 觉得有帮助?