功能磁共振成像(fMRI)可测量整个大脑的血流变化,在过去几十年中已被用于各种应用,包括“功能解剖学”——一种确定哪些大脑区域在何时开启的方法一个人执行一项特定的任务。fMRI已被用来观察人们在做各种事情时的大脑——解决数学问题、学习外语、下棋、即兴弹奏钢琴、做填字游戏,甚至看电视节目,如“抑制你的热情””
一个很少受到关注的追求是计算机编程——既是编写代码的苦差事,又是试图理解一段已经编写的代码的同样令人困惑的任务。“考虑到计算机程序在我们日常生活中的重要性,”博士ShashankSrikant说。麻省理工学院计算机科学与人工智能实验室(CSAIL)的学生,“这当然值得研究。现在有很多人都在处理代码——阅读、编写、设计、调试——但没有人真正知道他们在什么时候脑子里在想什么那个会发生。”
幸运的是,他在一篇论文中朝这个方向取得了一些“进展”——与麻省理工学院的同事本杰明·利普金(该论文的另一位主要作者,还有斯里坎特)、安娜·伊万诺娃、伊芙琳娜·费多连科和乌娜·梅·奥莱利一起撰写——那是本月早些时候在新奥尔良举行的神经信息处理系统会议上提出。
这篇新论文基于2020年的一项研究,该研究由许多同一作者撰写,该研究使用fMRI来监测程序员在“理解”小块或代码片段时的大脑。(在这种情况下,理解意味着查看片段并正确确定片段执行的计算结果。)
2020年的研究表明,代码理解并没有始终如一地激活语言系统,即处理语言处理的大脑区域,大脑与认知科学(BCS)教授、早期研究的合著者费多连科解释说。“相反,多需求网络——一个与一般推理相关并支持数学和逻辑思维等领域的大脑系统——非常活跃。”她说,目前的工作还利用了程序员的MRI扫描,需要“更深入地研究”,以寻求获得更精细的信息。
之前的研究着眼于20到30个人,以确定平均依赖哪些大脑系统来理解代码,而新研究着眼于个体程序员在处理计算机程序的特定元素时的大脑活动。例如,假设有一段涉及单词操作的单行代码和一段需要数学运算的单独代码。
“我能否从我们在大脑中看到的活动、实际的大脑信号出发,尝试进行逆向工程并弄清楚程序员具体在看什么?”斯里坎特问道。“这将揭示哪些与程序有关的信息在我们的大脑中被独特编码。”他指出,对于神经科学家来说,如果他们可以通过查看某人的大脑信号来推断该属性,则他们认为该物理属性已“编码”。
举个例子,循环——程序中重复特定操作直到达到预期结果的指令——或分支,一种不同类型的编程指令,可以使计算机从一个操作切换到另一个。根据观察到的大脑活动模式,该小组可以判断某人是在评估一段涉及循环还是分支的代码。研究人员还可以判断代码是否与文字或数学符号相关,以及是否有人正在阅读实际代码或仅仅是该代码的书面描述。
这解决了调查人员可能会问的第一个问题,即某些东西实际上是否经过编码。如果答案是肯定的,下一个问题可能是:它在哪里编码?在上述案例中——循环或分支、单词或数学、代码或其描述——大脑激活水平被发现在语言系统和多需求网络中具有可比性。
然而,当涉及到与所谓的动态分析相关的代码属性时,观察到一个明显的差异。
程序可以具有不随时间改变的“静态”属性,例如序列中数字的数量。“但程序也可以具有动态方面,例如循环运行的次数,”Srikant说。“我不能总是阅读一段代码并提前知道该程序的运行时间。”麻省理工学院的研究人员发现,对于动态分析,信息在多需求网络中的编码比在语言处理中心的编码要好得多。这一发现是他们寻求了解代码理解如何在整个大脑中分布的线索——哪些部分参与其中,哪些部分在该任务的某些方面发挥更大的作用。
该团队进行了第二组实验,其中结合了专门针对计算机程序进行训练的称为神经网络的机器学习模型。近年来,这些模型在帮助程序员完成代码方面取得了成功。该小组想要了解的是,当参与者检查代码片段时,他们在研究中看到的大脑信号是否与神经网络分析同一代码片段时观察到的激活模式相似。他们得出的答案是肯定的。
“如果你将一段代码放入神经网络,它会生成一个数字列表,以某种方式告诉你该程序的全部内容,”Srikant说。研究计算机程序的人的脑部扫描类似地产生了一个数字列表。例如,当程序以分支为主时,“你会看到一种截然不同的大脑活动模式,”他补充道,“当机器学习模型试图理解相同的片段时,你会看到类似的模式。”
马克斯普朗克软件系统研究所的MariyaToneva认为这样的发现“特别令人兴奋。它们提高了使用代码计算模型更好地理解我们阅读程序时大脑中发生的事情的可能性,”她说。
麻省理工学院的科学家们肯定对他们发现的联系很感兴趣,这些联系揭示了离散的计算机程序片段是如何在大脑中编码的。但他们还不知道这些最近收集到的见解能告诉我们人们如何在现实世界中执行更详尽的计划。
完成这类任务——比如去看电影,这需要检查放映时间、安排交通、购买门票等等——不能由一个单一的代码单元和一个单一的算法来处理。成功执行这样的计划需要“组合”——将各种片段和算法串在一起形成一个合理的序列,从而产生新的东西,就像组装单独的音乐小节以制作一首歌甚至一首交响乐一样。CSAIL的首席研究科学家O'Reilly说,创建代码组合模型“目前超出了我们的掌握范围。”
Lipkin,BCS博士学生,认为这是下一个合乎逻辑的步骤——弄清楚如何“结合简单的操作来构建复杂的程序,并使用这些策略来有效地解决一般推理任务。”他进一步认为,该团队迄今为止在实现该目标方面取得的一些进展归功于其跨学科构成。
“我们能够从程序分析和神经信号处理以及机器学习和自然语言处理的联合工作中汲取个人经验,”利普金说。“随着神经科学家和计算机科学家联手寻求理解和构建通用智能,这些类型的合作变得越来越普遍。”