论文笔记:Decoding speech perception from non-invasive brain recordings

本文介绍了一种通过非侵入性脑记录(MEG/EEG)解码语音感知的模型,利用对比学习和自监督预训练语音模型(wav2vec 2.0),实现对自然语音的高效解码。

代码链接:github.com/facebookresearch/brainmagick

一、方法与模型架构

模型主要由 “大脑模块” 和 “语音模块” 组成。通过对比学习(contrastive learning)来对齐两者的表示,使得模型能够从非侵入性脑记录中解码出感知语音的自我监督表示。

1、大脑模块

输入:原始 MEG/EEG 时间序列数据以及对应参与者的独热编码。(参与者的独热编码用于告知模型当前输入的脑信号属于哪一个参与者,以便后续模型通过参与者特定层调用对应的个体参数)输出:与语音表示对齐的潜在大脑表征。

(1)空间注意力层

       目标:动态学习每个传感器的权重,突出对语音解码最相关的脑区信号,抑制噪声或无关区域的干扰。适应不同数据集的传感器配置(如 MEG 的 273 通道 vs. EEG 的 60 通道),增强模型的跨数据集泛化能力。(注:传感器是指分布在头皮用于记录脑电活动的仪器,不同传感器对应不同脑区的信号)

      用 MNE-Python 库的find_layout函数,将三维传感器位置投影到二维平面,保留传感器间的相对距离,再进行坐标归一化。每个输出通道的注意力权重通过傅里叶基函数建模,捕捉传感器位置的周期性空间模式(如脑区活动的空间频率特征)。

对每个输入传感器 i,计算其二维坐标 (x_i, y_i) 对应的注意力分数 a_j(x_i, y_i),表示该传感器对输出通道 j 的重要性。再用softmax 函数进行归一化。为增强泛化能力,计算注意力权重时,随机选择一个二维坐标(x_{\text{drop}}, y_{\text{drop}}),并移除距离该坐标小于d_{\text{drop}}=0.2 的传感器权重(设为 0)(空间随机失活)

(2)参与者特定层

 参与者特定层(Subject-Specific Layer) 是实现模型跨个体适应性的核心组件。

(在不改变时间维度的前提下,对通道维度进行线性变换,等价于对每个通道的特征进行加权组合。)

不同参与者的M_s完全独立,训练时仅更新当前批次数据对应的参与者参数,其他参与者的参数保持不变。

(3)残差扩张卷积块

由五个卷积块堆叠而成,每个卷积块包含三个卷积层。前两个卷积层采用扩张卷积,并用残差跳跃连接(将输入直接添加到前两层卷积的输出),进行批归一化和 GELU 激活;第三个卷积层使用门控线性单元(GLU)激活,以减半通道数量。最后通过两个 1×1 卷积层输出与语音表示维度匹配的结果。

2、语音模块

目标:提取语音的潜在表示,为对比学习提供语音特征

方法:文章提到了两种方法

(1)Deep Mel 模块:使用与大脑模块类似的深度卷积架构(不含参与者块),试图同时学习提取语音和 MEG、EEG 的表示,使它们最大程度对齐。但该方法效率不如基于 wav2vec 2.0 的方法,原因在于它仅能看到 MEG 和 EEG 数据集里的音频,学习到的语音特征可能不够全面和通用。

(2)wav2vec 2.0:是一种自监督学习的语音模型,在大量语音数据上进行预训练。它通过卷积和 Transformer 块对原始波形进行变换,预测自身潜在表示的掩码部分,能有效编码多种语言特征。在本研究中,使用 wav2vec2-large-xlsr-53 模型,将其最后四层 Transformer 的激活进行平均,作为语音的潜在表示。这一模型的优势在于其在大规模数据上的预训练,能够学习到丰富的语音语义和语法结构,为语音解码提供更强大的特征表示。

3、对比学习

对比学习(Contrastive Learning)是一种无监督 / 自监督学习方法,其目标是让同一类样本的特征在特征空间中紧密聚集,不同类样本的特征尽可能分离。

二、训练

1、数据集:整合 4 个公开的 MEG/EEG 数据集,涵盖 175 名健康参与者,包括:

  • MEG 数据集:Schoffelen 2019(荷兰语,96 人)、Gwilliams 2022(英语,27 人)。
  • EEG 数据集:Broderick 2019(英语,19 人)、Brennan and Hale 2019(英语,33 人)。

2、多参与者联合训练:模型的主体结构(如卷积层、注意力层、大部分参数)在所有参与者之间共享,在共享的主体结构之外,为每个参与者引入一个独立的参数层

 三、结果

MEG数据:在超过1000个候选语音片段中,模型通过3秒MEG信号识别对应语音片段的top-1准确率最高达41.3%(平均),最佳参与者达80%。例如,Gwilliams数据集的最佳参与者top-1准确率超过80%。

EEG数据:性能较低(top-10准确率17.7%-25.7%),但显著高于随机基线(<1%)。

<think>嗯,用户遇到了一个错误信息:“error decoding 'ports': Invalid containerPort: hadoop-net”。我需要帮他弄清楚这是怎么回事。首先,这个问题应该是在Kubernetes或者Docker的配置文件中出现的,因为涉及到containerPort。常见的containerPort应该是一个数字,比如8080或者80,而用户这里用了“hadoop-net”,这可能是一个字符串,不是合法的端口号。 那可能的情况是,用户在定义容器端口的时候,错误地使用了服务名或者网络名称,而不是端口号。比如在Kubernetes的YAML文件中,ports下面的containerPort字段应该是整数,但用户可能写成了字符串,或者误用了其他配置项的名字,比如网络名称hadoop-net。 接下来,我需要确认这个错误发生的上下文环境。用户可能是在使用kubectl apply或者docker-compose up的时候遇到了这个问题。如果是Kubernetes,检查Deployment或者Pod定义中的ports部分;如果是Docker Compose,检查service的ports配置。 可能的解决方案是检查YAML文件中的containerPort字段,确保其值为数字,而不是字符串或者其他类型。例如,正确的应该是: ```yaml ports: - containerPort: 8080 ``` 而不是: ```yaml ports: - containerPort: hadoop-net ``` 另外,用户可能混淆了端口和网络配置,hadoop-net可能是一个自定义的网络名称,而应该在其他地方定义网络,而不是在containerPort这里。需要提醒用户区分端口和网络的配置部分。 还有可能,用户在YAML文件中使用了错误的缩进或者格式,导致解析错误。比如,ports可能被错误地嵌套在其他的键下面,或者缩进不正确,使得解析器误将hadoop-net当作containerPort的值。 总结一下,用户需要检查他们的配置文件,确保containerPort的值是有效的端口号(整数),并且语法正确,没有拼写错误或者格式问题。同时,确认hadoop-net是否在正确的位置定义,比如在网络配置部分,而不是端口映射里。</think>你遇到的错误信息 `error decoding 'ports': Invalid containerPort: hadoop-net` 通常与 **Kubernetes 或 Docker 的配置文件**相关。这个错误表明在定义容器的端口时,`containerPort` 字段的值 `hadoop-net` 是无效的,因为 **`containerPort` 必须是一个整数(有效的端口号)**,而不是字符串或其他类型。 --- ### **可能的原因和解决方案** #### 1. **错误的 `containerPort` 类型** - **问题**:在 Kubernetes 的 YAML 文件(如 Deployment、Pod 或 Service 配置)中,`containerPort` 必须是一个数字(例如 `8080`),但你使用了字符串 `hadoop-net`。 - **示例错误配置**: ```yaml containers: - name: my-container ports: - containerPort: hadoop-net # 错误!此处应为数字 ``` - **修复方法**:将 `hadoop-net` 替换为实际的端口号(如 `8020`、`9000` 等): ```yaml containers: - name: my-container ports: - containerPort: 8020 # 必须是整数 ``` --- #### 2. **混淆网络名称和端口** - **问题**:`hadoop-net` 可能是你定义的 Docker 网络名称(例如在 `docker-compose.yml` 中),但 `containerPort` 是用于声明容器监听的端口,与网络无关。 - **正确做法**: - **端口声明**:`containerPort` 必须是容器内服务实际监听的端口(如 Hadoop 的 `8020`、`9000` 等)。 - **网络配置**:如果需要自定义网络(如 `hadoop-net`),应在 Kubernetes 或 Docker 的独立网络配置部分设置,而不是在端口字段中。 --- #### 3. **YAML 格式错误** - **问题**:YAML 文件缩进或语法错误可能导致解析失败,误将 `hadoop-net` 识别为 `containerPort` 的值。 - **检查点**: - 确认 `ports` 字段的缩进正确(通常是两空格缩进)。 - 确保 `containerPort` 是 `ports` 列表下的子字段。 --- ### **示例:Kubernetes 正确配置** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: hadoop-deployment spec: template: spec: containers: - name: hadoop-container image: hadoop-image ports: - containerPort: 8020 # 必须为数字 protocol: TCP # 如果有自定义网络,通常在 Service 或 Ingress 中配置,而非此处 ``` --- ### **总结** - `containerPort` 必须是一个 **有效的端口号(整数)**,代表容器内服务监听的端口。 - `hadoop-net` 可能是网络名称,需在 Kubernetes 的 NetworkPolicy 或 Docker 的 `networks` 配置中单独定义。 - 检查 YAML 文件的缩进和语法,确保没有格式错误。 如果问题仍未解决,请提供完整的配置文件片段,以便进一步分析!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值