AlphaFold2源码解析(6)--模型之特征表征

news2024/9/24 17:18:30

AlphaFold2源码解析(6)–模型之特征表征

整体推理说明:

Embedding只是在推理使用,影响非常小(sup-Inference篇章)

特征表征表示的入口模型如下:
evoformer_module = EmbeddingsAndEvoformer(self.config.embeddings_and_evoformer, self.global_config)
其中:

  • embeddings_and_evoformer 是模型的配置参数
self.config.embeddings_and_evoformer.keys()
['evoformer', 'evoformer_num_block', 'extra_msa_channel', 'extra_msa_stack_num_block', 'max_relative_feature', 'msa_channel', 'pair_channel', 'prev_pos', 'recycle_features', 'recycle_pos', 'seq_channel', 'template']
  • global_config全局配置参数
self.global_config.keys()
['deterministic', 'multimer_mode', 'subbatch_size', 'use_remat', 'zero_init']

整体Embedding流程

  • target_feat: shape(N_res, 21) 一个由 aatype 特征组成
  • residue_index: shape(N_res), 由 residue_index特征组成。
  • msa_feat:shape(N_clust, N_res, 49)的特征,由 cluster_msacluster_has_deletioncluster_deletion_valuecluster_deletion_meancluster_profile 拼接而成。
  • extra_msa_feat: shape(N_extra_seq, N_res, 25)的特征,由 extra_msaextra_msa_has_deletionextra_msa_deletion_value连接而成。与上面的 msa_feat一起,还从这个特征中抽取N_cycle×N_ensemble随机样本
  • template_pair_feat: shape(N_templ, N_res, N_res, 88), 由template_distogramtemplate_unit_vector组成,template_aatype特征是通过平铺和堆叠包含的(这在两个残基方向上完成了两次)。还包括掩码特征template_pseudo_beta_masktemplate_backbone_frame_mask,其中特征f_ij=mas_ki·mas_kj。
  • template_angle_feat: shape(N_templ, N_res, 51)特征,由template_aatype, template_torsion_angles, template_alt_torsion_angles, 和 template_torsion_mask组成。


    内容翻译如下:
    MSA Embedding
    网络的第一部分首先从嵌入一个来自MSA的新示例开始,以创建MSA_{m_si}表示和pair_{z_ij}表示的初始版本。MSA表示的第一行和完整的对表示由来自前一个迭代的回收输出更新,对于第一个迭代,回收输出初始化为零。

Template EmbeddingPair Embedding:
接下来的步骤将集成来自模板的信息。template_angle_feat通过浅层MLP嵌入并连接到MSA表示。template_pair_feat由一个浅注意网络嵌入,并添加到pair表示中。

嵌入过程的最后一步通过浅Evoformer-like网络处理额外的MSA特征,该网络针对大量序列进行了优化,以更新pair表示。

代码细节

MSA Representation

preprocess_1d = common_modules.Linear( # 初始化线性层
        c.msa_channel, name='preprocess_1d')( # c.msa_channel 256
            batch['target_feat']) #(84, 22) --> (84, 256)

    preprocess_msa = common_modules.Linear(
        c.msa_channel, name='preprocess_msa')(
            batch['msa_feat']) # (508, 84, 49) --> (508, 84, 256)

    msa_activations = jnp.expand_dims(preprocess_1d, axis=0) + preprocess_msa

Pair Representation

注入以前的输出进行回收


## 位置信息
 if c.recycle_pos: 
   prev_pseudo_beta = pseudo_beta_fn(batch['aatype'], batch['prev_pos'], None) # (84, 3)
   dgram = dgram_from_positions(prev_pseudo_beta, **self.config.prev_pos)
   pair_activations += common_modules.Linear(c.pair_channel, name='prev_pos_linear')(dgram)
   
  # 特征信息
 if c.recycle_features: 
   prev_msa_first_row = hk.LayerNorm(axis=[-1], create_scale=True, create_offset=True, name='prev_msa_first_row_norm')(
           batch['prev_msa_first_row']) # (84, 256) --> (84, 256) 取第一行MSA
   msa_activations = msa_activations.at[0].add(prev_msa_first_row) # 第一行的加到msa_activations第一行
 
 ## Pair 信息
 pair_activations += hk.LayerNorm( axis=[-1], create_scale=True, create_offset=True, name='prev_pair_norm')(batch['prev_pair']) ## (84, 84, 128) --> (84, 84, 128)

.......  
def pseudo_beta_fn(aatype, all_atom_positions, all_atom_masks):
  """Create pseudo beta features. 创建伪测试功能"""
  # (84, 37, 3) --> atom 空间位置信息
  is_gly = jnp.equal(aatype, residue_constants.restype_order['G']) # 是否是gly氨基酸
  ca_idx = residue_constants.atom_order['CA'] # C_α 索引 1
  cb_idx = residue_constants.atom_order['CB'] # C_β 索引 3
  pseudo_beta = jnp.where( # is_gly 1 选择 ca_idx 否则 选择 cb_idx --> (84, 3)
      jnp.tile(is_gly[..., None], [1] * len(is_gly.shape) + [3]), # 将函数沿着X或者Y轴扩大n倍,jnp.tile((84,1), [1,3]) -> (84, 3)
      all_atom_positions[..., ca_idx, :],
      all_atom_positions[..., cb_idx, :]) # all_atom_positions[..., cb_idx, :]--> (3,)

  if all_atom_masks is not None:
    pseudo_beta_mask = jnp.where(
        is_gly, all_atom_masks[..., ca_idx], all_atom_masks[..., cb_idx])
    pseudo_beta_mask = pseudo_beta_mask.astype(jnp.float32)
    return pseudo_beta, pseudo_beta_mask
  else:
    return pseudo_beta

def dgram_from_positions(positions, num_bins, min_bin, max_bin):
  """Compute distogram from amino acid positions. 根据氨基酸位置计算距离图
    positions: [N_res, 3] Position coordinates. 位置:[N_res,3]位置坐标。
    num_bins: The number of bins in the distogram. num_bins:分布图中的箱数。
    min_bin: The left edge of the first bin. min_bin:第一个bin的左边缘。
    max_bin: The left edge of the final bin. The final bin catches max_bin:最终bin的左边缘。最后一个bin将捕获大于“max_bin”的
  """

  def squared_difference(x, y):
    return jnp.square(x - y)

  lower_breaks = jnp.linspace(min_bin, max_bin, num_bins)
  lower_breaks = jnp.square(lower_breaks) # 下限(15)
  upper_breaks = jnp.concatenate([lower_breaks[1:],
                                  jnp.array([1e8], dtype=jnp.float32)], axis=-1) # 上限
  dist2 = jnp.sum(
      squared_difference(
          jnp.expand_dims(positions, axis=-2),  # (84, 1, 3)
          jnp.expand_dims(positions, axis=-3)), # (1, 84, 3) ## 上下两部分正好是残基对相互匹配求差,
      axis=-1, keepdims=True) ##[84, 84, 1]

  dgram = ((dist2 > lower_breaks).astype(jnp.float32) *
           (dist2 < upper_breaks).astype(jnp.float32))
  return dgram ## 保留残基之间距离为〉lower_breaks 〈 upper_breaks , 这个是mask (84, 84, bin)-> 最后一维是不同桶的分布

。。。。。。。

 if c.recycle_features: # 特征信息
   prev_msa_first_row = hk.LayerNorm(
       axis=[-1],
       create_scale=True,
       create_offset=True,
       name='prev_msa_first_row_norm')(
           batch['prev_msa_first_row']) # (84, 256) --> (84, 256) 取第一行MSA

关联最大距离特征

if c.max_relative_feature: # 相互关联的最大距离
  # Add one-hot-encoded clipped residue distances to the pair activations.
  pos = batch['residue_index']
  offset = pos[:, None] - pos[None, :] # (84, 84) pair相对位置相减
  rel_pos = jax.nn.one_hot(
      jnp.clip(
          offset + c.max_relative_feature,
          a_min=0,
          a_max=2 * c.max_relative_feature),
      2 * c.max_relative_feature + 1) ## 位置差信息
  pair_activations += common_modules.Linear(
      c.pair_channel, name='pair_activiations')(
          rel_pos) # (84, 84, 65) -> (84, 84, 128)

模版特征


使用的预处理信息

[k for k in batch.keys() if k.startswith('template_')]
['template_aatype', # 氨基酸序列的one-hot表示 [N_temp, N_res, 22]
'template_all_atom_masks', # [N_temp, n_res, 37]
'template_all_atom_positions', #原子信息 [N_temp, n_res, 37, 3]
'template_mask', #[N-temp]
'template_pseudo_beta', #[N_temp, N_res, 3]
'template_pseudo_beta_mask', # [N_temp, N_res] 指示β-碳(甘氨酸的α-碳)原子是否具有该残基处模板的坐标的掩码
'template_sum_probs'] # [n_temp, 1]
 if c.template.enabled: # 是否使用模版
     template_batch = {k: batch[k] for k in batch if k.startswith('template_')}
     template_pair_representation = TemplateEmbedding(c.template, gc)(
         pair_activations,
         template_batch,
         mask_2d,
         is_training=is_training)

     pair_activations += template_pair_representation

........


额外的MSA Representation

extra_msa_feat = create_extra_msa_feature(batch)
extra_msa_activations = common_modules.Linear(c.extra_msa_channel, name='extra_msa_activations')(extra_msa_feat)

def create_extra_msa_feature(batch):
  """将extra_msa扩展为1hot,并与其他额外的msa功能合并。
我们尽可能晚做这件事,因为一个小时的额外msa可能非常大。
  """
  # 23 = 20 amino acids + 'X' for unknown + gap + bert mask
  msa_1hot = jax.nn.one_hot(batch['extra_msa'], 23)
  msa_feat = [msa_1hot,
              jnp.expand_dims(batch['extra_has_deletion'], axis=-1),
              jnp.expand_dims(batch['extra_deletion_value'], axis=-1)]
  return jnp.concatenate(msa_feat, axis=-1)

Extra MSA Stack

extra_msa_stack_input = {
        'msa': extra_msa_activations,
        'pair': pair_activations,
    }

    extra_msa_stack_iteration = EvoformerIteration(
        c.evoformer, gc, is_extra_msa=True, name='extra_msa_stack')

    def extra_msa_stack_fn(x):
      act, safe_key = x
      safe_key, safe_subkey = safe_key.split()
      extra_evoformer_output = extra_msa_stack_iteration(
          activations=act,
          masks={
              'msa': batch['extra_msa_mask'],
              'pair': mask_2d
          },
          is_training=is_training,
          safe_key=safe_subkey)
      return (extra_evoformer_output, safe_key)

    if gc.use_remat:
      extra_msa_stack_fn = hk.remat(extra_msa_stack_fn)

    extra_msa_stack = layer_stack.layer_stack(
        c.extra_msa_stack_num_block)(
            extra_msa_stack_fn)
    extra_msa_output, safe_key = extra_msa_stack(
        (extra_msa_stack_input, safe_key))

    pair_activations = extra_msa_output['pair']

    evoformer_input = {
        'msa': msa_activations,
        'pair': pair_activations,
    }

MSA 与模版角度特征concat

 evoformer_masks = {'msa': batch['msa_mask'], 'pair': mask_2d}

# Append num_templ rows to msa_activations with template embeddings.
# Jumper et al. (2021) Suppl. Alg. 2 "Inference" lines 7-8
if c.template.enabled and c.template.embed_torsion_angles:
  num_templ, num_res = batch['template_aatype'].shape

  # Embed the templates aatypes.
  aatype_one_hot = jax.nn.one_hot(batch['template_aatype'], 22, axis=-1)

  # Embed the templates aatype, torsion angles and masks.
  # Shape (templates, residues, msa_channels)
  ret = all_atom.atom37_to_torsion_angles(
      aatype=batch['template_aatype'],
      all_atom_pos=batch['template_all_atom_positions'],
      all_atom_mask=batch['template_all_atom_masks'],
      # Ensure consistent behaviour during testing:
      placeholder_for_undefined=not gc.zero_init)

  template_features = jnp.concatenate([
      aatype_one_hot,
      jnp.reshape(
          ret['torsion_angles_sin_cos'], [num_templ, num_res, 14]),
      jnp.reshape(
          ret['alt_torsion_angles_sin_cos'], [num_templ, num_res, 14]),
      ret['torsion_angles_mask']], axis=-1)

  template_activations = common_modules.Linear(
      c.msa_channel,
      initializer='relu',
      name='template_single_embedding')(
          template_features)
  template_activations = jax.nn.relu(template_activations)
  template_activations = common_modules.Linear(
      c.msa_channel,
      initializer='relu',
      name='template_projection')(
          template_activations)

  # Concatenate the templates to the msa.
  evoformer_input['msa'] = jnp.concatenate(
      [evoformer_input['msa'], template_activations], axis=0)
  # Concatenate templates masks to the msa masks.
  # Use mask from the psi angle, as it only depends on the backbone atoms
  # from a single residue.
  torsion_angle_mask = ret['torsion_angles_mask'][:, :, 2]
  torsion_angle_mask = torsion_angle_mask.astype(
      evoformer_masks['msa'].dtype)
  evoformer_masks['msa'] = jnp.concatenate(
      [evoformer_masks['msa'], torsion_angle_mask], axis=0)

网络主干线evoformer

evoformer_iteration = EvoformerIteration(
        c.evoformer, gc, is_extra_msa=False, name='evoformer_iteration')

EvoformerIteration网络的处理过程比较复杂, 我们这里省略,这里只讲解该网络的输入和输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊卖家店铺没流量怎么办?这几个方法可以试试!

大家都知道亚马逊是一个产品为王的平台&#xff0c;只有我们的产品好&#xff0c;亚马逊就会给我们推送流量&#xff0c;作为一个新手卖家该如何帮亚马逊店铺来获取流量&#xff0c;今天赛狐ERP就来给卖家们几个方法&#xff0c;来获取流量。 1.自然搜索 自然流量顾名思义也就…

docker搭建测试,镜像保存并传输发布

Docker OPENJDK本身的docker占用526M &#xff0c;昨天我在本地测试的&#xff0c;加上我们的项目大小&#xff0c;最终创建的镜像大小大概是526M项目大小&#xff0c;镜像大小大概这么多&#xff0c;我们需要先在服务器上安装docker&#xff0c;之后安装dockerOpenJDK&#x…

LIO-SAM源码解析(四):imuPreintegration.cpp

1. 代码流程 2. 功能说明 这个cpp文件主要有两个类&#xff0c;一个叫IMUPreintegration类&#xff0c;一个叫TransformFusion类。 现在我们分开讲&#xff0c;先说IMUPreintegration类。 关于IMU原始数据&#xff0c;送入imuhandle中&#xff1a; 2.1. imuhandle imu原始…

re:Invent现场直击:无处不在的云计算

2012年&#xff0c;第一届亚马逊云科技re:Invent全球大会拉开帷幕的时候&#xff0c;许多人还不知道云计算为何物。2022年&#xff0c;第十一届亚马逊云科技re:Invent全球大会召开的时候&#xff0c;人们发现云计算已经是无处不在。云计算从遥不可及到无处不在美国当地时间2022…

Clock and Jitter

1、Jitter定义 定义1&#xff08;SONET规范&#xff09;&#xff1a;抖动可以定义为数字信号在重要时点上偏离理想时间位置的短期变化。 2、Total Jitter表征方式 2.1、周期抖动&#xff08;Period Jitter&#xff09;&#xff0c;与理想时钟无关&#xff0c;不累积 Period …

Qt之QPropertyAnimation移动动画

#include "cpropertyanimationtest.h" #include "ui_cpropertyanimationtest.h" #include<QPropertyAnimation> CPropertyAnimationTest::CPropertyAnimationTest(QWidget *parent) :QWidget(parent),ui

Mybatis练习(按值单条件查询)

Mybatis练习 安装MybatisX 接下来我们就使用Mybatis完成品牌数据的增删改查操作。以下是我们要完成功能列表&#xff1a; 查询 查询所有数据查询详情条件查询 添加修改 修改全部字段修改动态字段 删除 删除一个批量删除 创建数据库 数据库表&#xff08;tb_brand&#xff09;…

腾讯云服务器CVM和轻量应用服务器区别全方位对比

腾讯云轻量服务器和云服务器有什么区别&#xff1f;轻量应用服务器和云服务器CVM哪个更好&#xff1f;抛开价格及使用门槛&#xff0c;云服务器CVM更好&#xff1b;从性价比及易用性角度考虑&#xff0c;轻量应用服务器更好&#xff0c;轻量服务器性价比高&#xff0c;这个配置…

【Python】批量提取图片经纬度并写入csv文件

需求 无人机图片中往往包含经纬度信息&#xff0c;需要一个脚本批量将文件夹中包含经纬度信息的图片提取出来&#xff0c;保存成csv文件。 经纬度格式解读 默认情况下&#xff0c;图片采用的WGS84经纬度&#xff0c;默认格式采用的是度分秒格式&#xff0c;另一种格式是十进…

【数据结构】二叉树的基本操作与遍历(C语言)

目录 定义 满二叉树 完全二叉树 性质 应用 计算二叉树结点个数 计算叶子结点的个数 第 k 层结点的个数 查找值为x的节点 遍历 前序遍历 中序遍历 后序遍历 层序遍历 判断是否为完全二叉树 定义 &#x1f984;二叉树是由树发展过来的&#xff0c;即度最大为2的树&…

stm32 笔记 PWM及HAL库应用

stm32 PWM原理 STM32 使用一个定时器作为 PWM 输出&#xff0c;在上图中&#xff0c;ARR 即为重装载值。在计数器的值大于CRRx的值并且小于 ARR 之间&#xff0c;即区分高低电平。输出在图中分别有 ① 和 ② 两种情况. 分别为&#xff1a; ①CRR 和 ARR 区间为低电平。 ②CR…

【pen200-lab】10.11.1.222

pen200-lab 学习笔记 【pen200-lab】10.11.1.222 &#x1f525;系列专栏&#xff1a;pen200-lab &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36d;作…

Vue框架学习(第十三课)Vuex状态管理中的store和state属性

学习官网文档:开始 | Vuex (vuejs.org) 第一部分:查图观色思考为什么&#xff1f;下面的一张图中的数据如何实现组件与组件之间的数据共享呢&#xff1f; 如何去实现下面的方案呢能让数据得到共享 这一张图告诉你们答案 这样如何实现组件与组件之间的通信呀 Vuex五个核心的基本…

FANUC机器人程序设计

一&#xff0e;注意事项 1.FANUC机器人所有者、操作者必须对自己的安全负责。FANUC不对机器使用的安全问题负责。FANUC提醒用户在使用FANUC机器人时必须使用安全设备&#xff0c;必须遵守安全条款。 2.FANUC机器人程序的设计者、机器人系统的设计和调试者、安装者必须熟悉FAN…

408 考研《操作系统》第一章第一节:操作系统的概念和特征

文章目录教程&#xff1a;1. 操作系统的概念、功能和目标1.1 大家熟悉的操作系统1.2 操作系统的概念1.3 操作系统的功能和目标1.3.1 操作系统的功能和目标——作为系统资源的管理者1.3.2 操作系统的功能和目标——作为用户和计算机硬件之间的接口1.3.3 操作系统的功能和目标——…

【三维目标检测】CenterPoint(二)

CenterPoint数据和源码配置调试过程请参考上一篇博文&#xff1a;https://blog.csdn.net/suiyingy/article/details/128002709。本文主要详细介绍CenterPoint网络结构及其运行中间状态。 1 CenterPoint模型总体过程 CenterPoint模型的整体结构如下图所示&#xff0c;由最初的一…

50 jhat 中 java.lang.String 的实例占用空间为什么是 28 bytes ?

前言 此问题是 多个 classloader 加载的同类限定名的Class 在 jhat 中显示不全d 同一时期发现的问题 大致的情况是 看到了 jhat 中统计的各个 oop 的占用空间 似乎是不太能够对的上 比如 java.lang.String, 在 64bit vm 上面 开启了 UseCompressedOops 之后, 应该是占用 …

Gram矩阵+Gram矩阵和协方差矩阵的关系

目录Gram矩阵简介协方差矩阵Gram矩阵 和 协方差矩阵的关系Gram Matrix代码Gram矩阵简介 gram矩阵是计算每个通道 i 的feature map与每个通道 j 的feature map 的内积 gram matrix的每个值可以说是代表 i 通道的feature map和 j 通道的 feature map的互相关程度。 参考博客 GAT…

小程序开发---02认识宿主环境

小程序依赖于微信提供宿主环境 小程序可以借助宿主环境提供的能力&#xff0c;可以完成许多普通网页无法完成的功能&#xff0c;如&#xff1a;微信扫码&#xff0c;微信支付&#xff0c;微信登录&#xff0c;定理定位&#xff0c;etc…等 小程序宿主环境包含以下内容&#xf…

关闭不同型号的 ESP 芯片的 ROM Code 上电启动日志的流程

【说明】 芯片 ROM Code 上电启动日志&#xff0c;不会对应用固件产生任何影响。通过 ROM Code 上电日志能够判断芯片启动模式是处于什么状态。若关闭此日志打印&#xff0c;当芯片进入下载模式或进入 Flash 启动模式等都不会有任何日志提示&#xff0c;不利于检查芯片状态&am…