数据竞赛为数据科学领域提供了一个实践和创新的平台,激发了数据科学家和研究人员的创造力和热情。通过竞赛,参赛者可以接触到各种类型的数据和问题,尝试不同的算法和方法,推动数据科学理论和技术的不断发展和创新。数据竞赛的题目通常来源于实际的业务问题或社会问题,具有重要的现实意义。通过竞赛,可以汇聚全球数据科学家的智慧和力量,共同探讨和解决这些问题。
数据是数据竞赛的核心资源,不同类型的数据对应不同类型的行业和竞赛。
数据竞赛的题目通常来源于实际的业务问题或社会问题,具有重要的现实意义。通过竞赛,可以汇聚全球数据科学家的智慧和力量,共同探讨和解决这些问题。例如,在医疗健康竞赛中,参赛者可以通过分析医疗数据,开发出疾病诊断辅助系统、医疗资源管理系统等,提高医疗服务的质量和效率;在环境保护竞赛中,参赛者可以通过分析环境监测数据,提出新的环境监测方法、污染治理方案等,为环境保护事业做出贡献。
赛题任务回顾
“AI for Science”(人工智能用于科学研究)是一种新兴的跨学科研究范式,它利用人工智能(AI)技术来推动科学研究的创新与发展。通过将机器学习、深度学习、自然语言处理等 AI 技术与传统科学领域相结合,AI for Science 旨在解决复杂科学问题,加速科学发现的进程,并开辟新的研究方向。
合成生物赛道:蛋白质固有无序区域预测 上海科学智能研究院
为推动科学智能领域创新发展,在上海市政府的指导下,上海科学智能研究院携手复旦大学在上智院平台发布“第三届世界科学智能大赛”。大赛设置航空安全、材料设计、合成生物、创新药、新能源五大赛道,配有高额奖金池,面向全球人才开放,旨在推进科学智能技术创新,挖掘顶尖创新团队,构建科学智能生态,激发科学智能发展新动能。
https://cqb.pku.edu.cn/info/1065/2540.htm
在生物体系中,蛋白质并非总是维持着固定的刚性结构,相当一部分蛋白质或其部分区域处于无序状态,即所谓的内在无序蛋白(IDPs)以及蛋白质中的无序区域(IDRs)。IDRs的存在,使蛋白质更容易形成液滴状,诱发相变生成和调控的发生,在DNA调节和细胞信号传导中具有重要意义。现有IDRs位置的区域大多通过生化方法完成,由于其结构的不稳定,需要大量不停的方法和实验,才能进行全面的表征。创建基于计算机的方法,实现对IDRs的准确预测是当前生物信息学研究的重要方向之一。 本次赛题的核心是IDRs预测问题,需要参赛者基于给定的蛋白质序列信息,准确预测蛋白质的内在无序区域。
由于 IDRs 的结构不稳定,传统的生化方法在表征这些区域时面临巨大挑战。这些方法通常需要大量的实验和时间,且难以精确预测无序区域的位置。因此,开发基于计算机的方法来准确预测 IDRs 的位置,已成为生物信息学研究的重要方向之一。
本次赛题的核心是蛋白质固有无序区域(IDRs)的预测问题。参赛者需要基于给定的蛋白质序列信息,准确预测蛋白质中的内在无序区域。参赛者将获得一系列蛋白质的氨基酸序列。每个序列由一串氨基酸组成,每个氨基酸用单字母表示(如 A、C、D 等)。
-
序列标注:参赛者需要对每个氨基酸位置进行标注,判断该位置是否属于无序区域。
-
标注方式:使用二进制标签(0 或 1)表示每个氨基酸是否属于无序区域。例如:
{'id': 'disordered_protein_0',
'sequence': 'MKQFGLAAFDELKDGKYNDVNKTILEKQSVELRDQLMVFQERLVEFAKKHNSELQASPEFRSKFMHMCSSIGIDPLSLFDRDKHLFTVNDFYYEVCLKVIEICRQTKDMNGGVISFQELEKVHFRKLNVGLDDLEKSIDMLKSLECFEIFQIRGKKFLRSVPNELTSDQTKILEICSILGYSSISLLKANLGWEAVRSKSALDEMVANGLLWIDYQGGAEALYWDPSWITRQL',
'label': array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])}
{'id': 'disordered_protein_35',
'sequence': 'MNKIPIKDLLNPQITDEFKSSILDINKKLFSICCNLPKLPESVTTEEEVELRDILGFLSRANKNRKISDEEKKLLQTTSQLTTTITVLLKEMRSIENDRSNYQLTQKNKSADGLVFNVVTQDMINKSTKPYRGHRFTKENVRILESWFAKNIENPYLDTKGLENLMKNTSLSRIQIKNWVSNRRRKEKTITIAPELADLLSGEPLAKKKE',
'label': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])}
通过我们对赛题的分析,发现其是一个典型的序列标注的任务。你可以将赛题视为一个典型的自然语言处理任务,因为输入的数据为文本序列。
序列标注有什么特点呢?典型的特点就是输入与输出的文本长度相同,在本次赛题中我们输入的蛋白质序列长度与标注结果长度相同。接下来我们就考虑相关的序列标注模型,可以参考实体识别的技术路线:
-
词向量模型
-
LSTM模型
-
BERT模型
-
GPT大模型
自然语言处理基础
自然语言处理(Natural Language Processing,NLP)是计算机科学和人工智能领域中一个极具挑战性和应用前景的研究方向。它旨在使计算机能够理解、生成和处理人类的自然语言,从而实现人机之间更加自然和高效的交互。随着互联网的飞速发展和数据量的爆炸式增长,自然语言处理技术在搜索引擎、机器翻译、智能客服、文本挖掘、语音助手等众多领域得到了广泛应用,极大地改变了人们的生活和工作方式。
自然语言处理是计算机科学与语言学交叉的学科,它致力于研究如何让计算机能够像人类一样理解和生成自然语言。自然语言是指人类日常交流所使用的语言,如汉语、英语、法语等,与人工设计的编程语言(如 Python、Java 等)有着本质的区别。自然语言具有高度的复杂性、模糊性和多样性,这使得自然语言处理成为一项极具挑战性的任务。
NLP常见任务
文本分类是将文本文档自动分配到一个或多个预定义类别的任务,是自然语言处理(NLP)中的基础任务之一。序列标注是为文本中的每个单元(通常是词或字符)分配一个标签的任务,考虑序列中元素之间的依赖关系。
-
文本分类的输入输出 :为整个文本分配一个或多个类别标签
-
序列标注的输入输出 :输出是一个与输入等长的标签序列
词向量
词向量(Word Embedding)是自然语言处理(NLP)中的一种重要技术,用于将词汇映射到低维连续向量空间,使得语义和语法相似的词在向量空间中距离相近。
-
传统方法(如One-Hot编码)的缺点 :
-
高维稀疏(词汇表多大,向量就多大)
-
无法表达词与词之间的语义关系(如"猫"和"狗"都是动物,但One-Hot编码无法体现)
-
-
词向量的优势 :
-
低维稠密(如50维、100维、300维)
-
语义相近的词在向量空间距离相近
-
可以计算词之间的相似度(如余弦相似度)
-
BERT模型
BERT(Bidirectional Encoder Representations from Transformers)是由 Google 在 2018 年提出的一种预训练语言模型。BERT 的核心特点是其双向性,即它能够同时考虑上下文的左右信息,从而生成更准确的语言表示。这种双向性使得 BERT 在理解词语的多义性和上下文关系方面表现出色。
BERT 模型基于 Transformer 架构,完全依赖自注意力机制来处理序列数据。 Transformer 架构最初由 Vaswani 等人在 2017 年的论文《Attention is All You Need》中提出。BERT 的预训练过程包括两个主要任务:
-
掩码语言模型(Masked Language Model, MLM):
- 在训练过程中,BERT 会随机掩盖输入序列中的一些词(通常用特殊标记[MASK]
- 在训练过程中,BERT 会随机掩盖输入序列中的一些词(通常用特殊标记[MASK]
-
下一句预测(Next Sentence Prediction, NSP):
- BERT 还训练了一个二分类任务,即判断给定的两个句子是否是连续的。例如,给出句子 A 和句子 B,模型需要判断 B 是否紧接在 A 之后出现。这个任务有助于模型理解句子之间的逻辑关系。
BERT 在自然语言处理领域有着广泛的应用,包括:
-
文本分类:如情感分析、垃圾邮件检测、主题分类等。
-
命名实体识别(NER):识别文本中的人名、组织名、地点等实体。
-
问答系统:理解问题的上下文并提供相关答案。
-
机器翻译:捕捉语言的细微差别,提高翻译的准确性。
-
文本摘要:生成简洁而有意义的文本摘要。
-
语义相似性:测量句子或文档之间的语义相似性,用于重复检测、释义识别等任务。
GPT大模型
GPT(Generative Pre-trained Transformer)是由 OpenAI 开发的一系列自然语言处理模型,基于 Transformer 架构的解码器部分,通过大规模语料库的预训练,学习语言的统计规律,并能够生成连贯、自然的文本。
GPT 模型采用自回归(Autoregressive)的方式生成文本,即在给定前面的文本基础上逐步预测并生成下一个词。其核心架构是 Transformer 的解码器部分,利用多头自注意力机制捕捉句子中单词之间的关系,并通过前馈神经网络进行非线性变换。与传统的循环神经网络(RNN)不同,Transformer 能够在一个时间步中并行计算整个输入序列,大大加快了训练和推理速度。
-
GPT-1(2018 年):首次引入“生成式预训练”的概念,参数量为 1.17 亿。
-
GPT-2(2019 年):参数量增加到 15 亿(最大 175 亿),引入了零样本学习能力。
-
GPT-3(2020 年):参数量达到 1750 亿,具备强大的零样本和少样本学习能力。
-
GPT-4(2023 年):进一步扩展了模型的输入模态,支持图文双模态,提升了复杂任务的处理能力。
-
GPT-4V(2023 年 9 月):增强了模型的视觉能力,允许模型理解与分析图像输入。
-
GPT-4 Turbo(2023 年 11 月):在 GPT-4 的基础上进行了优化,提升了性能和效率。
-
GPT-4o(2024 年 5 月):支持文本、音频和图像的任意组合输入,并能生成多种模态的输出。
ERT 使用双向 Transformer 编码器,通过 Masked Language Model(MLM)和 Next Sentence Prediction(NSP)任务进行预训练。MLM 通过随机遮蔽输入句子中的部分词,让模型预测这些被遮蔽的词,从而捕捉上下文中的双向依赖关系。NSP 则通过预测两个句子是否相邻,帮助模型理解文本的连贯性。
GPT 使用单向 Transformer 解码器,通过自回归语言模型训练,预测句子中的下一个词。这种单向训练方式使得 GPT 在生成连贯文本时表现强大,但对上下文的理解相对较弱。
-
BERT 的设计目标是优化文本理解能力,而不是文本生成。它通过双向上下文的建模,在句子级别的语义理解、上下文推理和信息抽取任务上表现优越
-
GPT 的生成能力非常强大,尤其是在文本生成方面。它可以基于前文自动生成后续的文本,适用于创意写作、文章撰写、对话生成等任务
机器学习与深度学习
基础介绍
机器学习(Machine Learning, ML)是人工智能(Artificial Intelligence, AI)的一个重要分支,它使计算机能够从数据中自动学习并改进。机器学习的核心目标是让计算机能够通过数据驱动的方法,自动发现数据中的模式和规律,并据此做出预测或决策,而无需进行明确的编程。
机器学习可以分为以下几种主要类型:
-
监督学习是机器学习中最常见的类型,它使用标记好的训练数据来训练模型。标记数据是指每个训练样本都有一个对应的标签或目标值。
-
无监督学习使用未标记的数据来训练模型,目标是发现数据中的内在结构和模式。
深度学习(Deep Learning, DL)是机器学习的一个子领域,它基于人工神经网络(Artificial Neural Networks, ANN)的多层结构,能够自动学习数据中的复杂特征和模式。深度学习模型通常包含多个隐藏层,这些隐藏层能够逐层提取数据的高级特征,从而实现更强大的表示能力。
-
前馈神经网络(Feedforward Neural Networks, FNN)
-
卷积神经网络(Convolutional Neural Networks, CNN)
-
LeNet:最早的卷积神经网络之一,用于手写数字识别。
-
AlexNet:在 ImageNet 竞赛中取得突破性成果,推动了深度学习的发展。
-
VGGNet:通过堆叠多个卷积层和池化层,提高了模型的深度和性能。
-
ResNet:引入残差连接,解决了深层网络的训练问题。
-
InceptionNet:通过多尺度卷积和模块化设计,提高了模型的效率和性能。
-
-
循环神经网络(Recurrent Neural Networks, RNN)
-
简单循环神经网络(Simple RNN):基本的循环神经网络结构,但存在梯度消失和梯度爆炸问题。
-
长短期记忆网络(Long Short-Term Memory, LSTM):通过引入门控机制,解决了梯度消失问题,能够学习长期依赖关系。
-
门控循环单元(Gated Recurrent Unit, GRU):简化了 LSTM 的结构,同样能够学习长期依赖关系。
-
-
Transformer 架构
-
BERT(Bidirectional Encoder Representations from Transformers):基于 Transformer 编码器的预训练语言模型,广泛应用于文本理解任务。
-
GPT(Generative Pre-trained Transformer):基于 Transformer 解码器的预训练语言模型,广泛应用于文本生成任务。
-
模型训练与评价
端到端学习是一种学习范式,它直接从原始输入数据到最终输出结果进行学习,中间不需要人工设计特征或进行复杂的预处理。端到端学习的目标是通过一个统一的模型,直接从输入到输出进行映射。
-
机器学习:通常需要人工设计特征,将数据转换为适合模型的格式。例如,在图像识别任务中,可能需要人工提取图像的边缘、纹理等特征。
-
深度学习:通过多层神经网络自动学习特征,不需要人工设计特征。深度学习模型能够自动从原始数据中提取高级特征。
解题方案
方法1:词向量+机器学习
步骤1:训练词向量
-
使用
gensim
库的Word2Vec
模型对氨基酸序列进行词向量训练。 -
将每个蛋白质序列转换为由空格分隔的字符串(
' '.join(x["sequence"])
),形成句子列表。 -
vector_size=100
-
min_count=1
:至少出现一次的单词才会被考虑。 -
训练完成后,
model_w2v
包含了每个氨基酸的词向量表示。
datas = pickle.load(open("WSAA_data_public.pkl", "rb"))
model_w2v = gensim.models.Word2Vec(sentences=[' '.join(x["sequence"]) for x in datas], vector_size=100, min_count=1)
步骤2:编码词向量
-
对于序列中的每个氨基酸,提取其上下文窗口内的词向量,并计算平均值作为特征。
-
sequence[max(0, idx-2): min(len(sequence), idx+2)]
:获取当前氨基酸及其前后两个氨基酸的窗口。 -
model_w2v.wv[...]
:获取窗口内氨基酸的词向量。 -
.mean(0)
:对窗口内的词向量取平均值,得到一个固定维度的特征向量。
-
-
将特征向量添加到
data_x
,将对应的标签添加到data_y
。
data_x = []
data_y = []
for data in datas:
sequence = list(data["sequence"])
for idx, (_, y) in enumerate(zip(sequence, data['label'])):
data_x.append(
model_w2v.wv[sequence[max(0, idx-2): min(len(sequence), idx+2)]].mean(0)
)
data_y.append(y)
步骤3:训练贝叶斯模型
-
使用
GaussianNB
(高斯朴素贝叶斯)分类器对提取的特征进行训练。 -
model.fit(data_x, data_y)
:将特征和标签传入模型进行训练。
model = GaussianNB()
model.fit(data_x, data_y)
dump((model, model_w2v), "model.pkl")
方法2:BERT实体识别
虽然BERT最初是为自然语言处理设计的,但其强大的语言表示能力也可以应用于生物信息学中的蛋白质序列分析,例如蛋白质固有无序区域(IDRs)的预测。
步骤1:数据预处理
-
序列编码:将蛋白质的氨基酸序列转换为BERT可以处理的格式。每个氨基酸可以用单字母表示(如A、C、D等)。由于BERT是基于字符的模型,可以直接将氨基酸序列作为输入。
-
标签处理:将每个氨基酸位置的无序区域标签(0或1)作为目标标签。例如,
1
表示该位置属于无序区域,0
表示不属于无序区域。 -
分词:虽然蛋白质序列是连续的氨基酸序列,但可以将其视为一个“句子”,每个氨基酸视为一个“词”。BERT的输入格式通常是一个序列,因此可以直接将整个氨基酸序列作为输入。
步骤2:加载BERT模型
-
微调(Fine-tuning):将预训练的BERT模型用于特定任务(如蛋白质固有无序区域预测)。在微调阶段,BERT模型的权重会根据蛋白质序列数据进行调整,以更好地适应任务需求。
-
输出层设计:在BERT的输出层添加一个分类层,用于预测每个氨基酸位置是否属于无序区域。具体来说,BERT的输出是一个序列的隐藏状态,每个位置的隐藏状态可以通过一个全连接层(Dense Layer)和激活函数(如Sigmoid)来预测二分类标签(0或1)。
步骤3:模型微调
-
损失函数:使用二分类交叉熵损失函数(Binary Cross-Entropy Loss)来训练模型。该损失函数适用于二分类问题,能够衡量模型预测值与真实标签之间的差异。
-
优化器:使用Adam优化器,这是一种常用的优化器,适用于深度学习任务。
方法3:微调Qwen
步骤1:数据预处理
指令微调使模型能够更准确地识别和理解用户指令的意图。例如,通过大量的指令微调数据,模型可以学会区分“回答问题”、“生成故事”、“提供建议”等不同类型的指令。
LLM 的微调一般指指令微调过程。所谓指令微调,是说我们使用的微调数据形如:
{
"instruction": "回答以下用户问题,仅输出答案。",
"input": "1+1等于几?",
"output": "2"
}
其中, instruction
是用户指令,告知模型其需要完成的任务; input
是用户输入,是完成用户指令所必须的输入内容; output
是模型应该给出的输出。
步骤2:加载Qwen模型
Qwen 2.5 是阿里巴巴通义团队于 2024 年 9 月发布的最新版本,包含多种参数规模的模型,从 0.5B 到 72B。在多个权威基准测试中,Qwen 2.5 系列模型表现出色,例如在 MMLU(通用知识)、MBPP(代码能力)和 MATH(数学能力)基准测试中分别取得了 86.8、88.2 和 83.1 的优异成绩。
模型以半精度形式加载,如果你的显卡比较新的话,可以用 torch.bfolat
形式加载。对于自定义的模型一定要指定 trust_remote_code
参数为 True
。
tokenizer = AutoTokenizer.from_pretrained('/root/autodl-tmp/qwen/Qwen2.5-7B-Instruct/', use_fast=False, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained('/root/autodl-tmp/qwen/Qwen2.5-7B-Instruct/', device_map="auto",torch_dtype=torch.bfloat16)
步骤3:模型微调
LoRA(Low-Rank Adaptation)是一种用于大模型微调的技术。LoRA的核心思想是基于大模型的内在低秩特性,假设大模型中的某些矩阵(例如Attention中的Q、K、V等投影矩阵)在需要进行更新时,可以分解成低秩矩阵的形式,并只在这部分低秩矩阵上进行训练更新。
相比全参数微调,LoRA大幅减少了需要训练的参数量,降低了对计算资源和显存的需求。例如,对175B参数的GPT-3进行微调时,LoRA仅需训练约0.01%的参数。
LoraConfig
这个类中可以设置很多参数,但主要的参数没多少,简单讲一讲,感兴趣的同学可以直接看源码。
-
task_type
:模型类型 -
target_modules
:需要训练的模型层的名字,主要就是attention
部分的层,不同的模型对应的层的名字不同,可以传入数组,也可以字符串,也可以正则表达式。 -
r
:lora
的秩,具体可以看Lora
原理 -
lora_alpha
:Lora alaph
,具体作用参见Lora
原理
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
inference_mode=False, # 训练模式r=8, # Lora 秩lora_alpha=32, # Lora alaph,具体作用参见 Lora 原理lora_dropout=0.1# Dropout 比例
)