蛋白质之间的相互作用是实现其生物活性的重要基础,例如人体可以产生抗体蛋白(上图绿色部分)与入侵的病菌(紫色部分)结合从而抑制疾病。生物制药研究通过分析生物分子之间相互作用的物理、化学机制,进一步设计出可以与一些特定靶点相结合的新型药物分子(如研发新冠抗体)。在微观尺度下,蛋白质之间的相互结合主要由分子间作用力决定,例如氢键、静电力、疏水作用等。在传统药物研发中,分子对接技术 (molecular docking) 通过物理方法建模这些微观作用来模拟计算真实生物体内两个分子相互作用的稳定结构。这些传统的分子对接模型需要进行大量的构型采样及优化,并筛选出其中较为稳定的结构作为预测结果。这种基于采样和筛选的策略导致传统方法效率较低,难以应用于高通量的蛋白质对接任务(例如从 1 万个蛋白中筛选出最有可能与病菌表面结合的 10 个来进行湿实验测试)。研发准确且高效的分子对接模型可以帮助快速筛选出适合进行湿实验测试的蛋白质分子,从而提高新药研发的效率。为了开发更加准确且高效的蛋白质对接模型,字节跳动 ByteDance Research 团队设计了一套基于分子表面的几何深度学习方案。该方案的核心思想是训练 AI 模型从拼图的角度去理解蛋白质之间的相互作用,并按照拼图的思路实现蛋白质复合物构型预测。
图:能够结合的蛋白质分子必须同时满足化学性质匹配和几何结构互补这两个条件,类似于拼图问题。基于上述假设,团队提出了一种基于分子表面黎曼流形的深度学习表示方法 (Harmonic Molecular Representation, HMR) :用二维黎曼流形建模分子表面,结合调合分析技术与神经网络实现流形上几何、化学信号的多尺度传播和两个蛋白质表面之间的匹配度比较,进而利用「蛋白质拼图」的逻辑实现蛋白质分子刚性对接 (rigid protein docking) 。直观上,神经网络模型需要从大量蛋白质复合物的结构(训练集)中学习这类拼图的几何、化学规律,从而可以去预测没有见过的(测试集)蛋白质复合物结构。实验表明,基于 HMR 的分子对接模型比当前深度学习 SOTA [1] 有更高的准确性,并且较传统分子对接方法提速 100 倍以上。接下来的 3 个章节将分别介绍黎曼流形分子表示、分子表面几何深度学习和蛋白质拼图模型的主要思想和技术概要。
图:抗体蛋白 (PDB ID: 6W41) 表面流形在不同分辨率下的表示。颜色代表分子表面静电势能函数,蓝色为负电荷区域。生物分子的表面通常是指该分子在溶液中与溶剂(例如水分子)形成的界面。我们可以将这样的界面表示为一个三维空间中的二维黎曼流形 (Riemannian manifold)。上图展示了一个抗体蛋白在不同分辨率下的表面流形结构,流形上的颜色对应分子表面的静电势能函数分布。换句话说,流形的结构勾勒了分子的形状,而流形上分布的函数则可以表示分子表面的化学性质。因此,利用黎曼流形可以统一地表示分子的几何结构和化学性质,从而整合分子信息并帮助 AI 模型更好地学习蛋白质的结构 - 活性关系。在黎曼流形的表示下,每个分子都有一套独特的「形状基因」(Shape-DNA) 。这些形状基因被定义为分子表面流形的拉普拉斯-贝尔特拉米算子 (Laplace-Beltrami Operator, LBO) 的本征值的集合 {?ᵢ},它们提供了一种描述分子形状的内蕴方法,不受三维空间中分子的位置和取向影响。
图:黎曼流形上的拉普拉斯特征方程。Δ 代表拉普拉斯-贝尔特拉米算子,φᵢ和?ᵢ分别代表第 i 个本征函数和对应的本征值。不同的分子表面流形有其独特的特征方程的解。这些形状基因所对应的 LBO 本征函数 {φᵢ} 构成了分子表面流形上的一组(标准正交的)基函数 (orthonormal basis functions)。我们可以简单将它们类比为正弦 / 余弦函数组成的傅立叶基组在黎曼流形上的拓展。因此,这些形状基因和基函数可以帮助我们在分子表面进行调和分析 (harmonic analysis),也就是将一个流形上的函数展开成一系列基函数的线性组合的形式(下图)。对于同一个分子表面,不同的化学性质(如疏水性、静电势能)可以非常简洁地表示为一组线性组合系数(一维数组 [c₀, c₁, c₂,...])。
图:分子表面黎曼流形上的调和分析。可以将流形上的函数展开成一系列基函数线性组合的形式。仅选择性展示了 3 个基函数,其实所有的展开项都参与线性组合。这种黎曼流形的表示是对分子表面的直接建模,得到的形状基因和 LBO 基函数受不同离散化建模方式的影响较低(例如分子表面预处理过程中的离散采样密度和三角剖分方式 [2]),因此增加了建模的鲁棒性。
图:利用流形调和信息传递机制进行分子表面的表示学习。(a)分子表面的局部特征可以通过不同的信息传递机制在流形上传递,实现有效的几何、化学性质表示。(b)流形上的信息传递神经网络结构。
图:「蛋白质拼图」流程示意图:模型首先预测两个蛋白质之间的结合表面区域,再利用神经网络所学函数的匹配性实现高选择性的拼图。在具体的模型构建上,团队首先利用文中提出的 HMR 模块进行表面位点的预测 (binding site prediction)。通过流形信息传递机制实现分子表面的特征学习,并引入交叉注意力机制 (cross attention) 实现蛋白质分子间的信息交流。该模块最终的输出是模型对分子表面的某个区域是否属于蛋白结合位点的二元预测。可以理解为这一步对应的是寻找拼图上缺失的一块。接下来进入分子对接模块:预测得到的蛋白结合表面上应具有一定的函数对应关系 (functional correspondence),因为分子间相互作用是由匹配的化学作用(如静电力和氢键)决定的。也就是说能够匹配的拼图上所对应的纹理也应该有一致性。根据这样的假设,团队进一步利用泛函映射技术 (functional map) 将这种函数对应关系转化为受体 - 配体结合位点之间的空间对应关系,并使用 Kabsch 算法将配体分子进行空间上的旋转和平移,最终得到对接后的蛋白质复合物结构。
图:「蛋白质拼图」模型流程图,主要分为结合表面预测(左?)和刚性分子对接(右?)两个模块。文中将这种「蛋白质拼图」方法和三维图神经网络的方法 EquiDock [1] 以及基于「采样 - 筛选」策略的传统方法(ATTRACT 和 HDOCK)进行了比较。在蛋白质对接标准测试集 Docking Benchmark 5.5 上,「蛋白质拼图」的方法在各个衡量项目上均比三维图神经网络取得了更好的效果,甚至接近于一些传统方法。而这种基于深度学习的方法预测分子对接的速度比传统方法提高了 100 倍以上。
图:「蛋白质拼图」模型(显示为 ours)和基于三维图神经网络的深度学习模型 SOTA (EquiDock) 以及传统刚性分子对接模型 ATTRACT 和 HDOCK 的比较。Complex RMSD 越小、DockQ 越高说明预测的蛋白质复合物结构越接近真实结构。我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#