注意:这是关于AlphaFold的算法详细解析,而不是AlphaFold2的

注意:带斜体句子的是个人推测,不确定是否和论文对应。

作为一个计算机专业的算法从业人员,一直对AlphaFold[1]的算法细节很感兴趣。而AlphaFold是这两年“人工智能”领域数一数二的突破性进展,本文旨在站在一个生物“外行”的角度,深入剖析AlphaFold到底使用了什么样的方法,这些方法对我们进行其他领域的研究有什么样的启发。

由于笔者并没有生物背景,文中生物有关的术语和方法可能有使用不当之处,欢迎指正。

一、问题概述

AlphaFold解决的问题是蛋白质折叠问题,可以抽象成如下:

输入:Alpha Fold的输入是一个氨基酸序列,每一个位置的元素代表了链上的一个氨基酸单元(一共可以有21种氨基酸单元),一个典型的输入如下

PIAQIHILEGRSDEQKETLIREVSEAISRSLDAPLTSVRVIITEMAKGHFGIGGELASK

这个输入代表是一个包含59个氨基酸的链

输出:在接收到这个单一序列的输入之后,AlphaFold需要使用算法,预测这一个氨基酸链条会如何折叠,所以输出的是一个拓扑结构,上面这段氨基酸输入经过AlphaFold模型运算之后输出的氨基酸拓扑结构可视化如下:

氨基酸链折叠拓扑结构示例

当然而这个拓扑结构本身肯定不能作为输出,作为输出肯定需要是结构化的数据。准确的说,输出的数据是每一个氨基酸单元和其下一个氨基酸单元在空间中的夹角,由于是三维空间,所以说明一个方位需要2维数据,(φ, ψ),所以AlphaFold的模型的输出就是一组数量和输入对应的夹角对:

(φ1, ψ1),(φ2, ψ2),(φ3, ψ3),(φ4, ψ4),…

如果输入的是k个氨基酸,那么输出的就是k-1个夹角对,比如上文中输入是59个氨基酸组成的氨基酸链,那么就应该输出58个夹角对。

问题大概就是这样一个问题,输入输出都有明确的定义。

在现代生物学中,这是一个价值极大的问题,解决了这个问题,就能更高效的进行药物研发,进行生物化学药品的成分效用分析。

然而这个问题并没有这么简单,并且困扰了科学家很久,即使是AlphaFold/AlphaFold2都不能算完全解决了这个问题。

二、大体算法框架

本文由于不是综述性文章,就跳过相关的其他工作,直接从算法角度看看AlphaFold的框架是什么样的:

AlphaFold算法框架
黄色代表特征抽取,绿色代表结构预测,红色代表potential construction,蓝色代表结构生成

整个AlphaFold算法大致分为几个部分

  1. 序列和MSA[2]特征抽取,可以理解为机器学习中最常见的特征构造部分,把氨基酸链的输入转换到特征空间;
  2. 深度神经网络结构预测,主要工作是用根据(1)中的抽取的特征—->去预测输出氨基酸链的一些性质,比如氨基酸之间两两的距离分布,氨基酸链的夹角分布(注意,这里不是直接预测结构,而是预测距离和夹角的分布,同时注意,这里预测的都是分布,而不是直接预测夹角/距离,这是算法的很重要的细节,在下文会提到);
  3. potential construction,这个一时不知道如何准确的翻译,其任务是根据(2)中神经网络预测的性质,构造一个评估函数,来评估诸多可能的解的合理程度;
  4. 结构生成,这里使用了(3)中构建的评估函数,使用(3)中的预测夹角分布初始化一个解,然后使用评估函数评估它,并且使用梯度下降法优化这个解,直到解收敛。

你可能看完这些步骤仍然一头雾水,别着急,这是很正常的,来我会一一解析介绍这些系统。

不过如果你是和我一样也是一个搞算法的,很容易注意到图中和常见计算机视觉/NLP算法不同的点,也就是红色和蓝色的部分,即上面算法的(3)和(4)部分,明明(2)中已经可以预测氨基酸链的夹角了,为什么还需要后面的步骤?整个pipeline不应该停在(2)么?

别急,好戏才刚刚开始。

1、特征提取

AlphaFold的特征提取包含了序列特征序列平方特征两大部分。

1.1序列特征

首先是序列特征,序列特征是长度和原始输入序列相同的,包括了one-hot[3]的:

  • 氨基酸种类特征(21维);
  • HHblit[4]特征(22维):HHblit[4]特征代表HHblit工具算法对每个氨基酸计算出的一个特征向量,可以理解为类似NLP中的embedding的概念,只不过这个embedding是用了很多先验知识算出来的,而不是学出来的。类似的很多其他特征也被加入到序列特征中用于丰富特征表达能力。
  • MSA[2]特征:MSA是Multiple Sequence Alignment的缩写,即多序列对齐,这个技术用于从一个大的数据库中抽取和输入氨基酸序列相近的序列,并且顺便进行对齐。抽取这个特征的原因是类似的氨基酸序列一般来说折叠方式也类似,相当于在特征中就加入了相近的序列结构信息。

这里我们举个例子,HHblit[4]工具也可以用来做MSA[2],我们在他的网站中输入上文我们用于举例的59个氨基酸组成的序列:

使用HHblit工具提交一个氨基酸序列

然后点击提交,HHblit[4]工具就会在数据库中开始搜索序列与之相近的氨基酸序列,并且进行对齐。检索完成后会显示查询结果:

查询结果,可以看到有很多比较接近的氨基酸序列

而这些氨基酸序列与输入序列的对齐也会作为输出的一部分:

top2和输入序列最为接近的序列的对齐结果

那么这样一来,这些比较接近的氨基酸序列和其结构也可以作为特征的一部分来辅助模型判断,这是一个很典型的将专家知识加入机器学习系统的方法

而MAS特征到底多有用呢?在alpha fold开源版[5]提供的colab代码[6]中,deepmind提到,如果使用一个小的MSA数据库:

While accuracy will be near-identical to the full AlphaFold system on many targets, a small fraction have a large drop in accuracy due to the smaller MSA and lack of templates.

大体上说,使用小的MAS数据库会使得准确率在一些长尾数据上骤降(由于找不到匹配的模版),但是大体准确率不会有太大影响。在另一个alphafold2的开源实现上[7],作者也提到如果不加上MAS特征,准确率会掉将近10个点。所以MSA特征是AlphaFold的一个重要组成部分。

上面总结了序列特征,如果输入的氨基酸序列长度为k,那么序列特征的矩阵就是一个维度为 (k,m) 的矩阵,其中m是序列特征的总维度

1.2序列平方特征

其次就是序列平方特征,与序列特征不同,如果输入的氨基酸长度为k,那么序列平方特征的就会是一个维度为(k,k,n)的矩阵(n为序列平方特征的数量),这个特征很tricky,是把另一个模型的输出作为AlphaFold的输入,这个被作为AlphaFold输入的模型就是CCMpred[8][9],这是一个用于预测氨基酸折叠后两两接触概率的模型,由于CCMpred的示例找不到图片,这里用ESM-1b[10]的图片替代:

三级结构预测,预测的是蛋白质的contact map

可以从图中看出,其预测的是氨基酸两两之间的结构上的接触概率。

AlphaFold将这个概率图和其模型参数(论文原文是模型参数,我猜测也许是指MLP的最后一层的hidden units?)一并加入到输入的feature中,由于这个特征是针对两两氨基酸对构造的,所以其属于序列平方特征

上面就是特征构造的全部部分,总结一下,AlphaFold的特征构造分为

  • 序列特征:序列特征中包含了很多专家先验知识,包括很重要的MSA[2]特征,其中包含了从数据库中检索的相近的氨基酸序列结构作为模型参考
  • 序列平方特征:序列平方特征主要包含的是另一个模型预测的氨基酸两两之间的Contact map(接触图)和这一接触图模型的参数(可能是hidden unit值);

这些特征都是为了给AlphaFold的结构预测模型提供更多更好的的参考和先验知识。

2、“结构预测”模型

黄色代表特征抽取,绿色代表结构预测,红色代表potential construction,蓝色代表结构生成

结构预测网络承担了预测蛋白质折叠后的性质的作用,注意一下,再强调一次,预测的是蛋白质的性质(包含氨基酸之间两两的距离分布,氨基酸链的夹角分布),而不是直接预测结构本身。

为了深入理解这一点,我们先来详细看一下结构预测模型的输入/输出。模型的输入包含了特征抽取后的序列特征序列平方特征

同样,我们假设模型的输入是一条长度为 k的氨基酸序列,那么模型的输出包含两个部分:

  • 距离分布:一个(k,k,64)维度的输出,代表预测的两两氨基酸单元之间的距离分布,这个输出是距离的概率分布,64代表的是将2-22Å[11](1Å=10^-10m,是一个距离单位)划分为64个桶,网络输出两两氨基酸的距离落在相应的桶里的概率;
  • 夹角分布:一个(k-1,1296)维度的输出,1296 = 36^2,这个输出代表每一个氨基酸和其后一个氨基酸的相对方位夹角,上文有提到,这个夹角应该用两个维度表示:(φ1, ψ1),(φ2, ψ2),(φ3, ψ3),(φ4, ψ4),… ,但是这里AlphaFold的处理比较暴力,直接将每个360度划分成36个桶,这样一个夹角对就可以落到36×36=1296个桶中的一个,网络仍然是预测每个氨基酸对和后一个的夹角落在每个桶中的概率。

那么这里一个很明显的问题就是,为什么不直接使用预测出来的第二个输出,也就是方位夹角预测的输出直接反向求解出氨基酸的结构呢?毕竟这就是最后想要的output不是么?

这里的矛盾实际上也正是我认为AlphaFold对其他领域启发最大的地方:如果一个东西很复杂,约束很多,不适合直接使用神经网络预测,那么就改变思路,预测这个东西的一些性质,然后使用这些预测的性质构造约束条件,从而反过来求解这个复杂的东西。

这里打个比方

比如我们要解决的是这样一个问题,五辆摩托在一条路上行驶,前车突然摔倒,五辆车撞在一起,你要预测摔倒后五辆摩托车的位置。

举的例子

当然,你可以直接用一个神经网络,输入撞车前五辆车的位置,速度等,直接输出撞车后五辆车的坐标,但是这样你会忽略了一些很重要的信息:

  • 一般来说,撞车的时候后车有更多的反应时间,所以撞车后后方的车一般会及时刹车拉开与前车的距离,可以总结为约束:后车与前车的距离和车的位置相关;另外一般来说撞车后整个队伍的长度会比撞车前的小,那么这就是另一个约束。
直接预测可能导致不准确

所以,如果采用AlphaFold的思路解这个问题,那么我们应该怎么做?

首先预测性质

首先我们就预测这个摩托车队伍撞车后的一些性质,比如:

  • 第一个骑手和第二个骑手的距离概率分布是什么样的,
  • 整个队伍的长度概率分布是什么样的,

然后假设这些预测都是准确的,那么第二步就是根据这些预测出来的性质去构建约束,然后在这样的约束下求解整个队伍中每辆机车的位置

再举个例子

比如说我们没有见过苹果的分子结构,但是要预测苹果的分子结构是什么样的,那么与其直接预测每个分子的位置和种类,我们不如预测苹果的特性,是甜的,大概直径10~20厘米,圆的,然后使用这些预测出来的约束条件去间接求解苹果的分子结构。

让我们回到AlphaFold,AlphaFold的网络正是运用了这一思想,所以这里的结构预测模型,实际上预测的是结构可能具有的一些性质,具体说就是氨基酸之间两两的距离分布,氨基酸链的夹角分布大概是什么样的。

那么为什么不直接使用其预测的氨基酸链夹角作为输出呢?原因也很明显了:

  • 直接使用网络预测的氨基酸链夹角作为输出没有考虑其他约束,特别是氨基酸对的距离约束,而氨基酸对的距离正好神经网络比较擅长预测;
  • 氨基酸链夹角预测精度其实很差,夹角预测只能给出+-5度的精度(每个桶10度),而氨基酸链很长,即使一点点的角度预测偏差,都会造成累积误差,从而堆积成不可逆转的巨大偏差
  • 即使直接使用regression来预测精确的角度,仍然会因为累积误差堆积而使得结果不可用;

所以AlphaFold所面对的氨基酸折叠问题正好满足很复杂,有很多的约束条件。

约束条件比较容易预测,而问题本身比较难预测,所以就先使用结构预测模型预测结构的性质,然后使用预测的性质构建约束,从而求解。

Ok,讲完了思路,我们回到网络结构本身,现在已经知道了AlphaFold结构预测网络的输入/输出和思路,那么AlphaFold的网络结构到底是什么样的呢?

不得不说,AlphaFold的网络结构是非常的深,按照论文中的描述,AlphaFold使用了220个残差块并且使用了空洞卷机扩大感知野。具体的每一个残差块的结构如下图所示:

AlphaFold的残差块结构

具体的网络结构和超参数如下:

  • 7×4的 残差块,256 channel ,空洞dilations在4个残差块中循环为1,2,4,8
  • 48×4的 残差块,128 channel ,空洞dilations在4个残差块中循环为1,2,4,8
  • 使用同步随机梯度下降训练
  • 每个gpu上4个样本训练
  • 0.85 的Dropout keep prob
  • 使用elu
  • 学习率0.06
  • 训练时间:5天,60万step
  • 网络直接使用交叉熵损失函数训练

在经过残差网络之后,输出(k,k,64)的距离特征图,并且将倒数第二层其经过max-pool之后经过全连接输出(k-1,1296)的扭转角特征图。

AlphaFold把输入的特征图切成不互相覆盖的64×64的小块来训练,而在预测的时候则会把输入的特征图切成互相覆盖的64×64的小块,分别预测,然后组合起来,一方面为了避免切块的边缘效应,另一方面也是一种ensemble,这倒是image segmentation算法的日常了。

AlphaFold刚出来的时候有人说这又是Deepmind算力的胜利,但是从计算资源上看AlphaFold差不多用了100~200个gpu,训练了5天时间,其实并没有很夸张,特别是跟Alpha-zero[12]或者是GPT-3[13]相比。国内的很多实验室/公司其实完全可以负担得起。那么接下来的一个问题就很尴尬了,为什么资源都有,别人可以搞出来,国内却不可以呢?当然,这么尴尬的问题我是不会问的。

一个AlphaFold的距离预测,左边是答案,右边是AlphaFold的预测,可以看出并不是完全准确的

上图是一个Alphafold的预测结果(距离),可以发现其实AlphaFold的距离预测的并不完全准确,这也是不能直接预测氨基酸链结构,而是先预测约束的原因。

3、potential construction

黄色代表特征抽取,绿色代表结构预测,红色代表potential construction,蓝色代表结构生成

先说这个部分的目的,potential construction的部分可以称作是AlphaFold论文的精华,它的主要任务是构造了一个可微函数,给这个可微函数输入一组夹角(φ1, ψ1),(φ2, ψ2),(φ3, ψ3),(φ4, ψ4),… ,可以计算出一个V值,这个值越小,则代表这一组夹角是更好的预测结果。

我们先抛开这个可微函数是怎么构造出来的不谈,如果有了这样一个函数,那么整个氨基酸折叠问题不就变成了函数最小值求解问题了么?那么这样一来一个梯度下降法不就可以求解这个问题了?

对的,AlphaFold的potential construction部分就是想要构造这样的一个函数,从而把蛋白质求解这样一个抽象的,困难的问题转化为梯度下降法可以求解的函数极小值问题。

首先这个可微函数的输入是一组夹角,那么根据这组夹角,就可以算出这个氨基酸链上两两氨基酸单元之间的距离,这个也比较好理解,我们以二维平面举例:

二维平面中,知道一个单链的角度,求PA距离

由于我们知道氨基酸的种类,就可以从化学上推导出相邻氨基酸之间的距离,并且由于我们又知道了氨基酸链上的每一个夹角,那么求每个氨基酸两两之间的距离,其实就是一个或几个三角函数能够解决的问题,这个过程(由角度对到氨基酸两两之间的距离对的推导过程)是完全可导的。

经过这样的推导后,一样假设输入的氨基酸链长度为k,可以从角度输入得到(k,k)的距离矩阵,我们把这个距离矩阵称为D,于是现在我们有了输入的角度φ, ψ,和推导出的距离矩阵D。

在结构预测模型中,AlphaFold已经预测了距离分布角度分布,如果诸位对上文还有印象的话,这些分布分别是(k,k,64)维度的距离分布和(k-1,1296)维度的角度分布,AlphaFold用非常暴力的三线性插值的方法将这两个预测得到的概率分布直接插值为概率密度函数。

那么剩下的事情就很简单了,只需要根据这个构造的概率密度函数构建这样一个估值函数就可以,首先是根据距离矩阵D,利用模型预测的距离分布,可以构建关于距离的 ,这个数值越小,说明这个距离矩阵更加符合模型预测。

距离概率密度函数推导出的V,越小越好

其次是可以构建出关于角度的:

角度概率密度函数推导出的V,同样越小越好

由于上文已经提到,距离矩阵D是可以从输入的扭转角φ, ψ推出来的,所以整体的估值函数V可以表示为φ, ψ函数的形式:

最后的总体估值函数

注意公式中的score2_smooth项是加入了一个范德华项,主要考虑分子间的排列需要符合某些物理条件。这整个项也是越小越好。

到此为止,potential construction的部分就已经完成了,我们有了一个函数,它可以输入扭转角向量φ, ψ,算出这个扭转角向量的“合理程度”。

4、结构生成

有了potential construction的铺垫,加下来的步骤几乎可以说是水到渠成的,只需要使用梯度下降法求解(φ,ψ)即可得出最优的参数φ,ψ,而根据φ,ψ,就可以构造出完整的氨基酸序列的空间结构。

但是即使这样,梯度下降法有个众所周知的缺点,就是容易陷入局部最优值,AlphaFold还是在这里使用了一些trick来使得AlphaFold算法在运行时没那么容易陷入局部最优解,这些trick使得AlphaFold的结构生成方法有点像进化算法和梯度下降法的结合:

  • 初始从结构网络的预测中采样多组φ,ψ值;
  • 使用L-bfgs(一种梯度下降法),分别针对这几组φ,ψ值进行梯度下降优化;
  • 维护20组最低(φ,ψ)值的φ,ψ对;
  • 当φ,ψ对的池子满了之后,向当前(φ,ψ)值最低的φ,ψ对中添加噪音(这个过程称为noise restart),然后充满整个池子,然后对每个φ,ψ对重复梯度下降过程;
  • 这个算法使用的资源也很多,每个氨基酸序列输入需要平均跑5000次梯度下降法;

其中根据论文,noise restart有1~2个点的收益。

结构生成模块也是AlphaFold的最后一个模块,在这个模块的算法运行完毕之后,(φ,ψ)值最低的一组φ,ψ对被输出作为整个AlphaFold模型的预测。

三、AlphaFold模型总结

AlphaFold中运用的很多手段都是非常精妙的,可以说deepmind中的研究员对深度学习和生物都有着非常深刻的认识和理解(当然这是废话)。

看完AlphaFold的论文,深深体会到什么叫做全方位,跨领域的碾压,虽然AlphaFold中的一些方法并不是完全新提出的,但是仍然有非常多的亮点,值得甚至生物领域之外的研究方向借鉴:

1、对专家知识的融合

我认为AlphaFold对专家知识的融合做的是极好的,AlhpaFold中的专家只是主要体现在两方面:输入的特征构造和potential constructio时的专家项()。

  • 首先是输入时尽可能多的结合领域知识构建输入特征,并且拿到了不小的收益(10%甚至更多);
  • 然后在potential construction阶段将专家知识(氨基酸链的物理特性)归结到范德华项中,令人非常印象深刻。

2、对蛋白质折叠问题的建模方式

AlphaFold对氨基酸折叠问题的建模方式也让我眼前一亮,由于氨基酸折叠问题过于复杂,直接预测氨基酸如何折叠太难,于是Deepmind先预测了氨基酸折叠后的一些性质,将这些性质转化为可微的约束,然后在这种预测出来的约束下求解,这一套思路可以用在很多其他非常复杂,难以直接预测的的问题上面,对我的启发非常大。

3、对梯度下降法的深入理解

梯度下降法能做很多事情,但是也做不好很多事情,如果把AlphaFold的最后一个模块,结构生成模块交给我来做,我肯定会无脑直接用梯度下降法来做,那样效果一定没有AlphaFold这样类似进化/退火算法加上梯度下降法的好。

有同学可能会认为这种算法结构是为了发论文好看的,但是我并不这么认为。AlphaFold的算法创新点很多,没必要为了好看凑这么一个不怎么突出的。

梯度下降法本身非常适合用于求解生成模块的问题,但是其也有本质缺陷:梯度下降法求出的解很有可能只是局部最优解。Deepmind非常敏锐的发现了这一点并且通过类似进化/退火算法加以解决,非常有趣。

这种方法本身对其他问题的优化也有启发:哪些问题适合用类似的方法求解最优解?哪些不适合?我们手上神经网络求解出的“最优解”真的是“最优”的么?

这三个亮点中,我认为其中的第二点的启发意义最大,AlphaFold的独特建模方式非常值得其他领域借鉴。

四、从AlphaFold看开去

AlphaFold像是deepmind呕心沥血走的一个旁门左道,AlphaFold的诸多方法都非常值得学习,也包括开始AlphaFold这个“不务正业”的项目本身。

“内卷“在2021年仍然是一个热门词汇,既然我是一个搞算法的,那生物与我何干?早9晚10干好自己本分工作不就好了,为什么要看AlphaFold这种搞生物的人才应该看的东西?

同样的话也可以apply到deepmind上:你deepmind是搞Alpha go起家的,那你搞好游戏算法不就好了么?德州扑克解决了么?文明6解决了么?你deepmind这些问题都还没解决,为什么还要去掺合人家生物领域的事?

像NASA给修女的一封信[14]中提到的,NASA每年花那么多的经费,而这些钱明明可以用来解决地球上的问题,那为什么要探索太空呢?

NASA认为“走出去,可以解决地球上的问题”,而我更加激进,我始终认为“只有走出去,才能解决内部的问题”。

Again, you can’t connect the dots looking forward; you can only connect them looking backward. So you have to trust that the dots will somehow connect in your future.
Steve Job

乔布斯不可能在学习艺术字体的时候就知道之后apple会用到这种艺术字体,deepmind不可能知道AlphaFold对现在的游戏研究有什么影响,我也不可能知道阅读AlphaFold和花这么大精力写这篇文章会给我带来什么。

而另一个问题,为什么不多花时间做好本职工作呢?你是一个计算机学生呀,工作找了么?钱赚了么?房买了么?没有?那你为什么要研究这些生物知识?

大家应该都坐过高铁或者飞机,每到下火车/下飞机的时候,就会有一大群人开始在出口处排队,坐了2,3个小时的高铁就已经走了小半个中国,现在就真的差排队这5分钟?每次我看到这种情况,都不经意会联想到很多工作,其性质是完全相同的。利用上世纪发明的互联网,我们可以以光速访问地球上几乎所有的网站,但是多少前端工程师的绩效是“把首屏展示时间优化到xx秒”。

这些工作有价值么?有价值。 无聊么?无聊,真的无聊。但是很多国内的互联网大厂,就是喜欢这些“有价值”的事,而这些“有价值”的事情,也就渐渐消磨了我们的精力。

所以我认为,要做这些“没价值”的事情,不仅要做,而且要多做,毕竟100年,200年之后,没有人会记得你赚了多少钱,为公司创造了多少“价值”,但是他们会记得你讲的一个笑话,贡献的一个点子。

所以,希望我自己,和各位,都能多多做“没价值”的事,不管天寒地冻,路遥马亡。

2021年夏于深圳

参考

  1. ^AlphaFoldImproved protein structure prediction using potentials from deep learning | Nature
  2. ^abcdeMultiple Sequence Alignmenthttps://www.youtube.com/watch?v=TZaA_-4j19w
  3. ^one-hothttps://en.wikipedia.org/wiki/One-hot
  4. ^abcdHHblitsBioinformatics Toolkit
  5. ^alpha fold 开源代码GitHub – deepmind/alphafold: Open source code for AlphaFold.
  6. ^alpha fold colabhttps://colab.research.google.com/github/deepmind/alphafold/blob/main/notebooks/AlphaFold.ipynb
  7. ^torch版alpha foldGitHub – lucidrains/alphafold2: To eventually become an unofficial Pytorch implementation / replication of Alphafold2, as details of the architecture get released
  8. ^ccmpred githubhttps://github.com/soedinglab/CCMpred
  9. ^CCMPred论文CCMpred–fast and precise prediction of protein residue-residue contacts from correlated mutations – PubMed
  10. ^ESM-1b利用Transformer替代MSA从蛋白序列中学习Contact Map_Amusi(CVer)的博客-CSDN博客
  11. ^A圈https://en.wikipedia.org/wiki/%C3%85
  12. ^alpha zerohttps://arxiv.org/abs/1712.01815
  13. ^GPT-3https://en.wikipedia.org/wiki/GPT-3
  14. ^NASA给修女的一封信Why Explore Space? – Letters of Note

深入剖析AlphaFold算法 – 知乎