相关文章推荐
有腹肌的烤红薯  ·  SegmentFault AIGC ...·  4 月前    · 
兴奋的板栗  ·  全面吃透JAVA ...·  1 年前    · 
阳光的枇杷  ·  windows下python ...·  1 年前    · 

今天主要是讲基于attention的一个蛋白质熔点预测的一个算法,也就其实这个题目是非常大的,这个就像你写硕士或者写本科论文是,那基于XXX的蛋白质熔点预预测算法,也就它不像你读一些英文对,英文论文关CF论文或者是CF论文,它直接把那个。

你要解决问题,它们写在你的内容上,这个只是我没有中文的写法,然后那我们就给出我们这次比赛一一个形式化的描述,

1. 本次比赛的形式化描述

我们的任务是给一个 Protein_Sequence ,就是一个蛋白质序列。蛋白质是由氨基酸组成的,下图中 DVSGTCL 就代表一个氨基酸序列,不需要管具体氨基酸的意思,从非生物学的角度来说,就是给一串由字母组成的序列,我的目标是要预测一个数,这个数 tm 就是指的蛋白质的稳定性。
在这里插入图片描述
那么就可以建模为一个回归任务,

2. attention 讲解

RNN-based 模型缺点?

  • 1)slow to train.
  • 2) long sequences lead to vanishing/exploding gradients.
    • 存在梯度爆炸的可能

”Attention is all your need“

attention用在很多地方,但在解决实际问题中,多少两级才能不会过拟合?

Q K T = [ S , S ] ,也就是 KaTeX parse error: Undefined control sequence: \timesS at position 2: S\̲t̲i̲m̲e̲s̲S̲ 多大才能学到特征?如果S特别长的话,那么过softmax之后,它的值接近于0,不同的transformer论文都是在设计如何去更新这个 KaTeX parse error: Undefined control sequence: \timesS at position 2: S\̲t̲i̲m̲e̲s̲S̲ ,那么在更新的时候太长的话,最简单的方法,对于NLP来说的话,一段太长的话,切成几段path,然后path和path之间做self-attention,然后path内部做self-attention。这就是CV里面的VIT==>Swin,

没有loss的话,无法做反向传播,
在这里插入图片描述

self-attention 是用来代替 CNN的,它是另外一种深度学习特征更新范式,

2.1.1 NLP

step1: “Inputs Embedding” + "Positional Encodin

比如 This is a cat. ,我们人可以直到this是【这】is是【是】【个】【猫】,但是计算机是不明白的,它只能看懂数字,所以 step1我们做 Inputs Embedding 意思就是说,对于NLP任务的话,this我要写成一个向量的形式代表它,最简单是 one-hot encoding。

但是 one-hot encoding 并不能代表出一个词的语义信息,
但是对于计算机来说的话,它计算机它不明白,计算机它其实只能是时间数字,所以,第一步我们去做一个input in Beijing的意思就是说,对于NLP任务的话,我this,我要形成一个向量来去代表,它就this,我用一个比如说vector,一个4个数的vector,比如说四个数的vector,就比如说这个地方1000代表this is0100,对,就一个victor去编码,它所以最简单的就是one hot including,这是one hot including。
在这里插入图片描述
下图中,run 和 jump 其实是一个类,这个地方它其实就是借鉴了一个 unpervise 的思想,也就是无监督的思想,就是在高维空间里面,类别相近的一些词应该去形成一个 cluster,
在这里插入图片描述

它其实并不能表现出我们这个词的一个语义信息,什么叫语义信息?就比如说我应该是在我相似的词,比如说在一个开森dimension,或者是一个你高层空间里面,比如说我是dog,兔子和和这个猫它其实是比较相近的,都是动物类的,对,所以我们应该是去编码的时候要去考虑一些它的语义信息,

那么很自然的我们有一些形成它 embedding 的手段,比如说下图中的两句英语,
在这里插入图片描述

所以,我们怎么获取 NLP 中每个词的 embedding 呢?

我们如何获取NLP中每个词的embedding呢?除了one-hot encoding,还有很多方法(GLoVe)。起初大家用one-hot embedding.下图是非常好的NLP工具库,你如果做NLP任务的话,简单举例GLoVe这个工具包,它就是一个unsupervise learning 的算法。
在这里插入图片描述
你看任何 unsupervise learning 的论文,核心永远是一句话,就是说在高维空间里面,每一个输入(input),比如对于NLP来说的每一个词,对于image来说的话,每一张图片,对于社交网络来说的话每一个node,比如说欺诈检测,对于一段音频来说的话它的每一帧,比如音频里的色情检测,或者什么……

总的来说,UNsupervise 的核心就是在高维空间里面,比如说 dog 和 rabbit 我去算一个similarity(内积),内积越大的话,说明我这两个词(vector)是比较相近的.形成了一个cluster,然后通过一些 loss。
在这里插入图片描述

上面主要讲,对于一个NLP任务来说,每个词我们如何来形成一个representation表示。

2.1.2 CV

视频8:00之后开始

对于计算机视觉来说,我怎么形成一个image corss 的一个 representation呢?一般来说,我输入的就是一张图片,一个CWH的图片
在这里插入图片描述
而图片它不像文字一样,文字的话会有上下文信息,而图片的话我们一般会通过一个 BackBone(imagenet_pretrained resnet),比如说普通的就是 resnet50,经过一个BackBone呢,就形成了一个高维空间—— [ C , W , H ] ,这个地方就形成了每个picture的embedding。

除此之外,音频每个帧也有一个通过i3d的预训练网络,形成了每一帧的一个embedding,那么,对于一个社交网络图节点来说的话。比如一张图,欺诈检测的话,图里面哪些是异常节点,那么它怎么形成一个 node embedding呢?它就有可能就是年龄与不同的特征加权和,来形成我们每一个 node embedding,这个就需要手工设计了。那么对于生物分子来说,它也有一下 embedding,比如说你可以把你这个每一个生物分子,它有一些生物分子的计算工具,这个课程我们后面会讲,这个比赛的前top都是用一些物理学的方法,去算的一个工具,这个我们后面会讲,存粹是为了打比赛,
在这里插入图片描述

但是我们目前讲这个 attention的话,完全就是知道了,第一步我们要形成 Embedding,目的就是想给每一个 Inputs ,无论是 NLP 里面的每一个字,还是 CV 里面的每一个像素,还是音频里面的每一帧,还是一个社交网络图,去形成这么一个embedding,这个大家一定要记住。
在这里插入图片描述
另外一个,就是说为了去记录每一个字的位置,比如说了一句话:“This is a cat.”,除了形成embedding,还需要知道这句话在整个context中的位置,我需要赋予embedding,这里最原始就是加一个 sin 和 cos 的变化,
在这里插入图片描述

为了去记录每一个字的位置,也就是每一个字在context中的位置,我需要赋予我这个embedding。所以这个地方最原始的方法是加一个sin和cosin的变化,去赋予我这个字的embedding一个 context info ,如下图所示:
在这里插入图片描述
到这里,我们形成了每一个字的embedding,就是一个vector。

那么,第二步,就是通过attention的方法,

首先说一下 self-attention,从宏观角度来说的话,它其实就是,首先给一个形式化的描述,
i n p u t : [ N , S , D ] = = > o u t p u t : [ N , S , D ] ,N是batch维度,S是sequence的长度,这个sequence长度在NLP里面的话就是一段话里面的各个word(词),在CV里面,比如20*20的图片,S则是一个400的pixel,S=400(多少帧)。

在NLP里面,如果一句话有10个词的话,这个地方 S=10。我们经过 attention这个机制,更新完之后,经过了aggravate和update之后,我们的输出也是[N, S, D]。那么,相比于CNN它是怎么做呢?

画一个图来解释:

我们的输入和输出都为 D 的意思是hidden demission,就是我这个sequence的每一个feature的维度,其值可能是64,或为32,一般不会128,128时容易过拟合。

第一行是This,第二行is 以此类推,一共4行,S=4.
在这里插入图片描述

首先把Input,先讲self-attention,输出一个output,input怎么做呢?
首先,我们肯定是在feature,在hidden demission里面做,是在一个隐空间去做,高维空间去做,所以第一步就是要把input把它映射成,当然这个地方也有一个含义,也是通过learning的方法去做。

也就是说,我们input的时候,就形成了三个不同特征的一个矩阵,这个矩阵的意思通常来说呢就是Q,K, V
在这里插入图片描述
它们的维度也是 4 × 4 的 Attention Vector ,意思就是说

下图,对角线上的值,本身就比较大,
在这里插入图片描述
上图右侧,attention map也叫similarity map,即相似度矩阵。如果大家经常看一些论文的话,里面的诸如 attention map和similarity map 就是这么来的。

在这里插入图片描述
就是通过 Q 和K 的内积来的,Q和K的一个转置,来求出来的。

然后第二步呢,就是attention map 如何去做aggregate?这个attention map 如果大家学过GNN 的话,比如说一些 Cora 数据集,这个 attention map 又称为 邻接矩阵aka adj matrix,这个邻接矩阵就是一个图的结构。

把GNN的链接矩阵,和attention map关联起来,那你对transformer的理解就过关了。而且对attention的理解也非常深了。

通过 D 这个input,我形成了 Q、K,由Q、K算出了一个 similarity map(或attention map)之后,再去跟 V 相乘, S D 的。
在这里插入图片描述
我形成 output 这个值,是通过 attention 学出来这个关联性(correction),跟我 V 的第一个维度相乘,关联性大的,比如说This is
在这里插入图片描述
attention_map 的一行,乘以 V 的一列,形成 output 的一个值。什么意思呢?

就是之前想 S × S 就代表 This 和其它 (This is a Dog) 的关系强弱,我利用这个关系强弱,去更新我的 S,S 其实就是代表我原来feature的第一个维度,它是一个动态更新(dynamis update)。

就是我形成我 output 这个值,我是通过我 attention 学出来这个关联性
correction),跟我 V 的第一个维度相乘,关联性大的,比如说This is a dog。

比如说This 和dog关联性大,第一行Dog这个地方的值就比较大,那么我形成的一个新的 This 第一维的 feature,就包含了更多的 dog 的信息。
在这里插入图片描述
以此类推,第一行 × 第2列,一直来说就形成了一个新的This的feature。

我的目的是把我第一行This的feature去更新,那么我更新的时候,我利用correction(关联性)——similarity_map,跟我这个 V 的第一维去相乘,里面的意思是如果我这里面的 dog 关联程度比较大,那么我更新出来的新的This的第一个feature,里面更多的包含跟dog的correction。

这是一个非常巧妙的 attention,其实就是一句话,Z Q K T 之后,要过softmax,
在这里插入图片描述
softmax其实就是形成一个百分比关系,那么就是你看我第一行,The [0.71, 0.04, 0.07, 0.18],说明The ,有71%的和The是一个correction,有18%是和dog是一个correction,

在这里插入图片描述
过了softmax之后,再去和 V 去相乘,当然这个地方,softmax有非常多的形式,它不局限于softmax,还有tanh,就是把 Z 约束到 [0,1] 之间的一个值。
在这里插入图片描述
所以说,这就是整个一个 self-attention,我本身这个 Input,这个feature,S和D经过 3 个 FC,或者 3 个 Q K T = [ S , S ] ,这个[S,S]的attention map里面的值代表的是我这个值应该去跟我哪些相似度比较高,这个是一个NLP里面的例子
在这里插入图片描述
如果是CV里面的例子的话,都是一些S-400pixel,举个例子,比如说我在操场打篮球,如何去识别这个打篮球呢?

那S就是一系列的pixel,那怎么判断一个人在打篮球呢?

更合理的方法就是,我和操场有一定关系,我和篮板、篮球架有一定关系,甚至和观众有一定关系,相比于如果是一个CNN,CNN它其实需要一个 4 0 0 × 4 0 0 的similarity map,关于篮球的那些pixel,篮球、篮板等相应程度应该比较大,应该和有关篮球框、篮球架的关系度比较大,

在GNN中,在一个社交网络图里面,以Cora数据集为例子,它是若干个科学家的citeation ,论文的引用关系。

那么这个 attention map 就应该是比如同一个类别的,比如都是数学领域的论文,那么数学领域的attention map值应该比较大。

这就是一个非常简单的,我的输入是[N,S,D],我的输出也是[N,S,D],所以说这是一个非常简单,但是非常高效的。transformer是self-attention和cross-attention的结合,

Encoder Block - step2 : “Multi-Head” Attention +Add & Norm

2.2 corss attention

最开始因为是机器翻译的,最开始是将英语翻译成法语,Output embedding就是最后形成的法语embedding,自己先做一个self-attention,更新一下feature,
在这里插入图片描述
Cross-Attention:
Cross-Attention很简单,就是一句话,Query is given from outside,也就是说Query是从A-sequence来的,key和value是从B-sequence来的。

在这里插入图片描述
前面讲的Q,K,V,它们是从同一个sequence来的,也是算的同一个sequence的关系,而对于cross-attention呢?

Q由一个new Input形成的,它有J个序列,也就是 [ J , S ] 的,也就是说,这个地方,cross attention算的是。也就是每一个J序列和S序列的关系强度,你如果是做机器翻译任务的话,就是J是一个法语词(纵列),S是一个英语词。
在这里插入图片描述
这个算出来就是每一个法语词汇,和英语词汇的相似度,也就是说我最终的目的。

干脆把例子改成【中文】翻译成【英文】,如下图所示
在这里插入图片描述
J 和S & S和D 算出来的是 J × D 的关系。
在这里插入图片描述
也就是说,我的cross attention,它不断更新 query 的特征,我 query 的特征,这个词
在这里插入图片描述
所以说cross-attention就一句话,query是从一个目标来去找的,如果在计算机世界里面

Encodder sequence出来的值一般是做key和value,Decoder sequence是做query,然后query不断去优化。

3. 非生物学角度进行蛋白质熔点预测的方法

sentences这些句子,例如上面的This is a dog,可以看成它是一个Sentence,就是它一个蛋白质序列,比如说augc,Word里面就是每一个氨基酸,a代表一个意思,u代表一个意思,g代表一个意思,c代表一个意思。
在这里插入图片描述

59:40 开始代码讲解

4. 代码讲解

main_attention_train.py
无论干任何东西,都要先固定seed,seed一般设为 42。

为什么是42? 宇宙的终极奥秘都是 42,比较玄学,Google的大佬都设置为 42.

下面是一个很标准的 set seed,大家以后写任何代码,都要固定 seed,这个一个好习惯,否则你后面探索出的一些不可复现的结果,非常的不好。

def set_seed(seed=42):
    ##### why 42? The Answer to the Ultimate Question of Life, the Universe, and Everything is 42.
    random.seed(seed) # python
    np.random.seed(seed) # numpy
    torch.manual_seed(seed) # pytorch
    torch.cuda.manual_seed(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

seed是固定参数,意义是排除一切随机性。这个代码无论跑 n 遍,就是同样的代码跑 n 遍,会得出一样的结果。

pandas 非常重要,也是一个日积月累的过程。

蛋白质结构预测是生物信息学中的一个重要课题,也是当前深度学习技术应用于生物科学领域的热点之一。目前,基于深度学习的蛋白质结构预测方法主要分为三类:基于序列的方法、基于结构的方法和基于序列和结构的融合方法。 基于序列的方法主要使用卷积神经网络(CNN)和循环神经网络(RNN)进行预测。这类方法主要是通过分析蛋白质序列的信息来预测蛋白质的结构。其中,CNN能够有效地提取蛋白质序列中的特征信息,而RNN则能够处理序列中的时序依赖关系。 基于结构的方法主要使用图卷积网络(GCN)和自注意力机制(Self-Attention)进行预测。这类方法主要是通过分析蛋白质结构中的信息来预测蛋白质的结构。其中,GCN能够有效地提取蛋白质结构中的特征信息,而Self-Attention则能够捕捉蛋白质结构中的长程依赖关系。 基于序列和结构的融合方法主要使用深度神经网络进行预测。这类方法主要是通过将蛋白质序列和结构信息进行融合来预测蛋白质的结构,从而提高预测精度。其中,常用的深度神经网络包括多层感知器(MLP)、长短时记忆网络(LSTM)和残差网络(ResNet)等。 总体来说,基于深度学习的蛋白质结构预测方法在预测精度上取得了显著进展,但仍然存在一些问题,如数据集的不足和噪声问题等。未来,随着大规模蛋白质结构数据的积累和深度学习技术的不断发展,基于深度学习的蛋白质结构预测方法将会得到更广泛的应用。
numpy.core._exceptions.MemoryError: Unable to allocate 1.45 GiB for an array with shape (13935, 1393 怎么解决的?大神,用的哪种方法 numpy.core._exceptions.MemoryError: Unable to allocate 1.45 GiB for an array with shape (13935, 1393 疯老先生: 解决了,把我的世界关掉就好了,谢谢帮助。 python小波变换绘制频谱图和等线图 Py_Meteor: 好滴,已在奔溃的边缘

2.1 self-attetnion