草庐IT

AI知道你脑子里在想什么,还帮你画了出来,项目代码已开源

机器之心 2023-03-28 原文
在科幻小说《三体》中,企图占领地球的三体人被赋予了一个很独特的设定:通过脑电波共享信息,彼此之间思维透明、不善阴谋。在他们那里,想和说是同一个词。而人类则利用自身思维不透明的特性想出了「面壁计划」,最终成功骗过三体人,取得了阶段性胜利。

那么问题来了,人类的思维真的是完全不透明的吗?随着一些技术手段的出现,这个问题的答案似乎没有那么绝对了。很多研究者都在尝试解码人类思维的奥秘,将一些大脑中的信号解码为文字、图像等信息。

最近,两个研究团队同时在图像解码方向取得了重要进展,而且相关论文都被 CVPR 2023接收了。 

第一个团队来自大阪大学,他们使用最近非常火的 Stable Diffusion,能从功能磁共振成像 (fMRI) 获得的人脑活动图像中重建大脑活动中的高分辨率、高精准图像(参见《Stable Diffusion 读你大脑信号就能重现图像,研究还被 CVPR 接收了》)。

巧合的是,几乎同一时间,来自新加坡国立大学、香港中文大学和斯坦福大学的华人团队也做出了类似的成果。他们开发了一款名为「MinD-Vis」的人类视觉解码器,通过预训练的一个 mask modeling 和 latent diffusion model,能从 fMRI 数据中直接解码出人类视觉刺激。它生成的这些图像不仅有合理的细节,而且还准确地呈现了图像的语义和特征(如纹理和形状)。目前,这项研究的代码已经开源。

论文题目:Seeing Beyond the Brain: Conditional Diffusion Model with Sparse Masked Modeling for Vision Decoding

  • 论文链接:http://arxiv.org/abs/2211.06956
  • 代码链接:https://github.com/zjc062/mind-vis
  • 项目链接:https://mind-vis.github.io/
接下来我们将详细介绍这篇论文。

研究概览

「所见即所思」。

人类的感知和先前知识在大脑中有着密切的关联,我们对世界的感知不仅受到客观刺激的影响,也受到我们的经验影响,这些影响形成了复杂的大脑活动。理解这些大脑活动并解码信息是认知神经科学的重要目标之一,其中解码视觉信息是一个具有挑战性的问题。

功能性磁共振成像 (fMRI) 是一种常用的非侵入性且有效的方法,可以用于恢复视觉信息,如图像类别。 

MinD-Vis 的目的是探索使用深度学习模型直接从 fMRI 数据中解码视觉刺激的可能性。

以往的方法直接从 fMRI 数据中解码复杂神经活动时,存在缺乏 {fMRI - 图像} 配对和有效的生物学指导的问题,所以重建的图像通常模糊且在语义上无意义。因此,有效地学习 fMRI 表征是一项重要的挑战,这有助于建立大脑活动与视觉刺激之间的联系。

此外,个体变异性使问题更加复杂,我们需要从大型数据集中学习表征,并且放宽从 fMRI 生成条件合成的限制。

因此,作者认为使用自监督学习 (Self-supervised learning  with pre-text task) 加上大规模生成模型可以使模型在相对较小的数据集上微调后具有上下文知识和令人惊叹的生成能力

在上述分析的驱动下,MinD-Vis 提出了人类视觉解码的掩码信号建模与双条件潜在扩散模型,具体贡献如下:

  • 提出了 Sparse Coded-Masked Brain Modeling(SC-MBM),作为受生物学指导的有效视觉解码大脑特征预训练学习器。
  • 通过增加双条件潜在扩散模型(DC-LDM),在相同语义下强化了解码一致性,同时允许生成方差。
  • 结合 SC-MBM 的表示能力和 DC-LDM 的生成能力,MinD-Vis 生成的图像在保留语义信息的同时更加合理。
  • 在多个数据集上进行了定量和定性测试。

与过往的方法进行对比 – 生成质量

 与过往的方法进行对比 – 评判指标的定量对比

自监督学习 + 大规模生成模型

由于收集 {fMRI - 图像} 配对非常昂贵且耗时,这个任务一直存在缺乏数据标注的问题。另外,每个数据集、每个个体的数据都会存在一定的域偏移。

在这个任务中,研究人员的目标是建立大脑活动与视觉刺激之间的联系,并由此生成相应的图像信息。

为此,他们使用了自监督学习和大规模生成模型。他们认为这种方法可以使模型在相对较小的数据集上进行微调,并获得上下文知识和令人惊叹的生成能力。

MinD-Vis 框架

接下来将详细介绍 MinD-Vis 框架,并介绍设计的理由和思路。

fMRI 数据有这些特点和问题:

  1. fMRI 用 3D 体素(voxel)来测量大脑血氧水平相关(BOLD)的变化,来观测大脑活动变化。邻近体素的幅度通常相似,表明 fMRI 数据中存在空间冗余。
  2. 在计算 fMRI 数据时,通常会提取 Region of Interest (ROI) 并把数据打成 1D vector。在这个任务里,只提取大脑 visual cortex 的信号,因此,体素的数量(约为 4000)远比图像里像素点的数量(256*256*3)少,这样的数据在纬度方面和通常处理图像数据的方式存在相当的差距。
  3. 由于个体差异,实验设计的差异,脑信号的复杂程度,每个数据集、每个个体的数据都会存在一定的域偏移。
  4. 对于一个固定的视觉刺激,研究者希望模型还原的图像在语义上一致;但由于个体差异,每个人看到这个视觉刺激的反应不同,研究者又希望模型有一定的方差和灵活性。
为了解决这些问题, MinD-Vis 包含两个阶段:

  1. 利用大规模的 fMRI 数据集来训练 Masked Autoencoder,来学习 fMRI representation。
  2. 将预训练好的 fMRI encoder 与 LDM 通过 cross-attention conditioning 和 time-step  conditioning 相集成进行 double conditioning,以进行条件合成。然后,通过使用配对的 {fMRI, Image} 来共同 finetune LDM 中的 cross attention head。
下面将在这里详细介绍这两步。

MinD-Vis Overview

(A)Sparse-Coded Masked Brain Modeling (SC-MBM) (MinD-Vis Overview 左)

由于 fMRI 空间信息冗余,即使大部分被遮盖,fMRI 数据仍然可以恢复。因此,在 MinD-Vis 的第一阶段,为了节省计算时间,大部分 fMRI 数据被遮盖了。这里,作者使用了类似于 Masked Autoencoder 的做法:

  1. 将 fMRI voxels 划分成 patches
  2. 使用有等于 patches 大小的步长的 1D 卷积层转换成 embedding
  3. 把剩余的 fMRI patch 加入 positional embedding 后作为 vision transformer 的输入
  4. 解码得到重建的数据
  5. 计算重建的数据与原数据的 loss
  6. 通过反向传播优化模型,使得重建的数据尽可能地与原数据相似
  7. 重复 2-6 的步骤,训练出最终模型

SC-MBM 能有效还原被掩盖的 fMRI 信息

这个设计和 Masked Autoencoder 有什么区别?

  • 当 mask modelling 应用于自然图像时,模型一般使用等于或略大于 1 的 embedding-to-patch-size ratio。
  • 在这个任务中,作者使用了比较大的 embedding-to-patch-size ratio,这能显著提高信息容量,为 fMRI 创建了大的表征空间,这种设计也对应于大脑中信息的稀疏编码*。

SC-MBM 的消融实验

(B)Double-Conditioned LDM (DC-LDM) (MinD-Vis Overview 右)

在 Stage A 中进行了 large-scale context learning 之后,fMRI encoder 可以将 fMRI 数据转换为具有局部性约束的 sparse representation。在这里,作者将解码任务表述为条件生成问题,并使用预训练的 LDM 来解决此问题。

  • LDM 在图像的潜在空间上操作,fMRI 数据 z 作为条件信息,目标是学习通过反向扩散过程形成图像。
  • 在图像生成任务中,多样性和一致性是相反的目标,fMRI 到图像更依赖于生成一致性。
  • 为了确保生成一致性,作者将 cross attention conditioning 和 time step conditioning 相结合,并在 UNet 的中间层使用带有 time embedding 的条件机制。
  • 他们进一步把优化目标式重新表述为双重调节交替式。

我们通过多次解码不同随机状态的图像证明了我们方法的稳定性。

微调

在 fMRI encoder 通过 SC-MBM 预训练后,它与预先训练的 LDM 通过 double conditioning 整合在一起。在这里,作者:

  1. 将 encoder 的输出使用卷积层合并到 latent dimension 中;
  2. 联合优化 fMRI encoder、cross attention heads 和 projection heads,其他部分固定;
  3. 微调 cross attention heads 是连接 pre-trained conditioning space 和 fMRI latent space 的关键;
  4. 在通过 fMRI 图像对端到端进行微调的过程中,通过 large-capacity fMRI representations 将学到 fMRI 和图像特征之间更清晰的联系。

DC-LDM 的消融实验

额外细节

意外的是,MinD-Vis 可以解码出一些在 ground truth 图像里并不实际存在,但与图片内容十分相关的细节。比如说,当图片是自然风景时,MinD-Vis 解码出了河流和蓝天;在提供房屋时,MinD-Vis 解码出了相似的室内装饰。这既有好处又有坏处。好处在于,这说明我们能够解码出想象到的内容;坏处在于,这可能会影响对解码结果的评估。

喜闻乐见的翻车集锦

作者认为,在训练样本数量较少的情况下,刺激的解码难度会有所不同。例如,GOD 数据集包含的动物训练样本比服装多。这意味着一个语义上类似于 “毛茸茸” 的词更可能被解码为动物而不是服装,如上图所示,其中一只袜子被解码为一只羊。

实验设置

数据集

在这里,作者用了三个公开数据集。

  • 第一阶段的预训练:用了 Human Connectome Project,它提供 136,000 个 fMRI 数据片段,没有图像,只有 fMRI。
  • 微调 Encoder 和第二阶段的生成模型:用了 Generic Object Decoding Dataset (GOD) 和 Brain, Object, Landscape Dataset (BOLD5000) 数据集。这两个数据集分别提供了 1250 张和 5254 张 {fMRI, Image} 配对,其中,分别取了 50 张和 113 张作为测试集。
模型结构

本文模型结构的设计(ViT 和扩散模型)主要是参照过去的文献。模型参数细节请参照正文。同样地,他们也采用了一种不对称的体系结构:编码器旨在学习有意义的 fMRI 表示,而解码器试图预测被遮盖的块。因此,我们遵循以前的设计,使解码器更小,预训练后我们将其舍弃。

评判指标

跟过往的文献一样,作者也使用了 n-way top-1 和 top-5 分类准确率来评估结果的语义正确性。这是一种在多次试验中,通过计算 n-1 个随机选择的类别和正确类别的 top-1 和 top-5 分类准确率来评估结果的方法。与先前的方法不同,他们在这里采用了更直接、可复制的评估方法,即使用预训练的 ImageNet1K 分类器来判断生成图像的语义正确性,而不是使用 handcrafted features。此外,他们还使用了 Fréchet inception distance(FID)作为参考来评估生成图像的质量。但是,由于数据集中图像数量有限,因此 FID 可能无法完美地评估图像分布。

效果

这篇文章的实验是在个体水平上进行的,即模型在同一个个体上进行训练和测试。为了与之前的文献进行比较,在这里报告了 GOD 数据集第三位被试的结果,并在附录中列出了其他被试的结果。

写在最后

通过这个项目,作者展示了通过 fMRI 还原人脑视觉信息的可行性。然而,这个领域有很多问题需要解决,例如如何更好地处理个体之间的差异性,如何减少噪声和干扰对解码的影响,如何将 fMRI 解码与其他神经科学技术结合起来,以更全面地理解人类大脑的机制和功能。同时,我们也需要更好地了解和尊重人类大脑和个体隐私方面的伦理和法律问题。

此外,我们还需要探索更广泛的应用场景,例如医学和人机交互等领域,以便将这项技术转化为实际应用。在医学领域,fMRI 解码技术未来可能可以被用来帮助视觉障碍人士、听觉障碍人士、甚至全身瘫痪患者等特殊群体来解码出他们的想法。这些人由于身体上的障碍,无法通过传统的交流方式来表达自己的思想和意愿。通过使用 fMRI 技术,科学家们可以解码他们的大脑活动,从而获取他们的想法和意愿,进而与他们进行更加自然和高效的交流。在人机交互领域,fMRI 解码技术可以被用来开发更加智能和自适应的人机界面和控制系统,例如通过解码用户的大脑活动来实现更加自然和高效的人机交互体验。

我们相信,在大规模数据集 + 大模型 + 算力的加持下,fMRI 解码将会有更加广泛和深远的影响,推动认知神经科学和人工智能领域的发展。

注:*使用稀疏编码在脑中学习视觉刺激表示的生物学基础:稀疏编码曾被提出来作为感觉信息表征的一种策略。研究表明,视觉刺激在视觉皮层中被稀疏编码,这样可以增加信息传输效率并减少脑中的冗余。使用 fMRI 可以从视觉皮层收集的少量数据中重建自然场景的视觉内容。稀疏编码可能是计算机视觉中编码的有效方式。文章中提到了 SC-MBM 方法,它将 fMRI 数据分成小块来引入局部性约束,然后将每个小块稀疏编码成高维向量空间,这样可以作为生物学上有效且高效的脑特征学习器,用来进行视觉编码解码。

有关AI知道你脑子里在想什么,还帮你画了出来,项目代码已开源的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  7. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  8. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  9. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  10. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

随机推荐