ChemBERTa-2:迈向化学基础模型的自监督预训练新范式

arxiv202209 | ChemBERTa-2+:Towards Chemical Foundation Models 阅读详情

1. 从ChemBERTa到ChemBERTa-2:化学AI的“大语言模型”之路

如果你关注过AI在化学领域的应用,这两年肯定没少听到“分子性质预测”这个词。简单来说,就是让AI看一眼分子的结构式(比如SMILES字符串),就能告诉我们这个分子有没有毒性、能不能穿透血脑屏障、或者和某个靶点结合的能力强不强。这活儿以前得靠实验化学家们在实验室里泡上好几个月,现在AI模型几秒钟就能给出预测,听起来是不是很科幻?

但早期的模型有个大问题:它们大多是“从头开始”训练的。就像教一个不认识字的小孩直接去读博士论文,效果可想而知。每个新任务都需要大量的、带标签的实验数据去“喂养”模型,而化学实验数据恰恰是最昂贵、最稀缺的资源。这就形成了一个死循环:没有数据就训不好模型,模型不好用就更难产生有效数据。

这时候,ChemBERTa出现了。它的核心思路借鉴了自然语言处理(NLP)里颠覆性的思想——自监督预训练。想象一下,我们怎么教一个孩子学中文?不是一开始就让他做阅读理解题,而是先让他海量地听和读,在上下文中自然而然地学会词汇、语法和语义。ChemBERTa对分子做的也是同样的事:它把分子的SMILES字符串当成一种特殊的“化学语言”,然后通过“掩码语言模型”(MLM)任务进行预训练。具体来说,就是随机盖住SMILES字符串中的一部分“字符”(原子或化学键符号),让模型根据上下文去猜被盖住的是什么。通过完成这个看似简单的填空游戏,模型在无标签的海量分子结构数据中,自发地学会了分子结构的语法规则和深层表征。

原始的ChemBERTa基于RoBERTa架构,在数百万个PubChem分子上进行了预训练,然后在MoleculeNet等基准数据集上微调,已经在多个性质预测任务上证明了其价值。但科研的脚步从未停止,当我们还在消化ChemBERTa时,更强的ChemBERTa-2已经登场。它不仅仅是规模的扩大,更是在预训练范式、模型架构和任务设计上的一次全面演进,真正朝着“化学基础模型”的宏伟目标迈进。如果说ChemBERTa是学会了识文断字,那么ChemBERTa-2的目标就是成为化学领域的“通才”,具备更深刻的理解和更强的泛化能力。

2. ChemBERTa-2的核心革新:不只是更大,而是更聪明

ChemBERTa-2的改进是全方位的,我把它总结为“三大升级”。这些升级不是拍脑袋想出来的,而是针对化学数据特点和下游任务需求做的深度优化。

2.1 预训练数据的“质”与“量”双飞跃

第一代ChemBERTa主要使用了PubChem的数据。PubChem固然是宝库,但ChemBERTa-2将数据源的视野放得更广。除了更大量的PubChem化合物,它还整合了像ZINC这样的商业化合物库,以及更多来自专利、文献的专有分子结构。数据量级从百万级向千万级甚至更高迈进。

但更重要的是数据质量的提升和处理的精细化。化学SMILES字符串存在一个经典问题:同一个分子可能有多种合法且不同的SMILES表示(称为“规范化”问题)。这就像同一个人有多个曾用名,如果模型把它们当成完全不同的东西来学,就会引入噪声。ChemBERTa-2在预训练前,很可能对数据进行了更严格的**规范化(Canonicalization)**处理,确保每个分子以一种标准、唯一的形式输入模型。这一步看似简单,却能极大提升模型学习到的表征的一致性。

此外,对于超大规-模数据集(比如千万级),ChemBERTa-2采用了更科学的训练策略。原始论文中提到,在1000万分子子集上只训练了3个epoch,以避免过拟合。ChemBERTa-2可能进一步优化了这种策略,比如引入动态掩码比例、更复杂的课程学习(从简单样本到复杂样本),或者对难例样本进行重点学习,让模型每一轮训练的效率更高。

2.2 分词器(Tokenizer)的化学专业化定制

这是ChemBERTa-2可能最具巧思的改进之一。原始ChemBERTa直接借用了NLP中通用的**字节对编码(BPE)**分词器。BPE对于自然语言很有效,但它本质上是基于统计频率来合并字符,对化学语义的理解是盲目的。

举个例子,SMILES字符串中的“C1=CC=CC=C1”代表苯环。BPE可能会把它切成 [“C1”, “=C”, “C=”, “CC”, “=C1”] 这种奇怪的片段,完全破坏了“苯环”作为一个整体功能团的概念。而一个懂化学的分词器,应该能识别出“c1ccccc1”(小写c代表芳香碳)作为一个完整的芳香环模式。

原始文章末尾提到了一个实验:使用基于正则表达式的、化学语义更明确的 SmilesTokenizer(来自DeepChem库)在Tox21任务上取得了比BPE更好的效果(∆PRC-AUC +0.015)。这个信号非常强烈!ChemBERTa-2极有可能采纳或改进了这种思路。

一个专业化的化学分词器会做什么?

  • 识别功能团:将“-COOH”(羧基)、“-NH2”(氨基)作为一个整体token,而不是拆成‘-’, ‘C’, ‘O’, ‘O’, ‘H’。
  • 理解环系统:将
NeurIPS 2020 | ChemBERTa+:用于分子性质预测的大规模自监督预训练 阅读详情

相关推荐

ChemBERTa-2实战指南:如何用自监督预训练提升分子性质预测准确率

本文提供了ChemBERTa-2在分子性质预测任务中的完整实战指南。通过自监督预训练,ChemBERTa-2能深入理解化学语言(SMILES),大幅提升模型在数据有限场景下的预测准确率与泛化能力。文章详细介绍了从环境搭建、数据预处理、模型微调到性能优化的全流程,帮助研究者和开发者高效应用这一前沿AI技术。

weixin_29243279的博客 194

从RoBERTa到ChemBERTa:一文读懂自监督学习如何革新分子表征

本文深入探讨了自监督学习如何革新分子表征,以RoBERTa为基石,详细解析了ChemBERTa如何将Transformer架构迁移至化学领域。通过将分子SMILES字符串视为特殊语言进行自监督预训练,模型能从海量无标签数据中学习通用化学规律,有效解决数据稀缺难题,为药物发现和材料设计提供强大基础。

weixin_29199873的博客 133

DrugCLIP:基于对比学习的蛋白质-分子跨模态检索与虚拟筛选新范式

对比学习是一种自监督学习方法,其核心原理是通过拉近正样本对、推远负样本对的方式,学习数据的通用表示,而无需依赖大量精确标注。在药物发现领域,这一技术价值显著,它能够将蛋白质和药物分子映射到同一语义空间,实现跨模态的相似度匹配。传统虚拟筛选方法依赖分子对接模拟或监督学习模型,面临计算成本高、标注数据稀缺、冷启动困难等挑战。应用对比学习构建的DrugCLIP范式,则利用蛋白质序列预训练模型(如ESM-2)和分子图神经网络(GNN)分别编码蛋白质和分子,通过InfoNCE损失函数优化双塔模型,使有相互作用的蛋白质

weixin_33836874的博客 392

对比学习在药物虚拟筛选中的应用:从CLIP到DrugCLIP的实践指南

对比学习是一种自监督表示学习方法,其核心原理是通过拉近正样本对、推远负样本对的方式,学习数据在表示空间中的本质特征。在药物发现领域,这一技术展现出巨大价值,它能够高效地从海量化合物库中筛选出潜在活性分子,显著降低传统虚拟筛选的计算成本和假阳性率。具体应用时,通过构建蛋白质-分子对数据集,并利用预训练语言模型(如ESM-2、ChemBERTa)作为编码器,结合InfoNCE损失函数进行训练,模型可以学习到一个共享的表示空间。在这个空间中,具有结合活性的蛋白-分子对彼此靠近,从而实现高效的零样本或小样本虚拟筛选

weixin_34221073的博客 308

大语言模型如何变革生物学研究:从知识整合到自主实验

大语言模型(LLM)作为人工智能的前沿技术,其核心原理是基于海量数据预训练,通过自注意力机制理解并生成序列信息。这一技术价值在于能够处理多模态、非结构化数据,实现从信息检索到知识推理的跃迁。在工程实践中,LLM正深度赋能生命科学领域,特别是在处理爆炸式增长的生物学数据(如基因组、蛋白质组数据)和弥合“知识孤岛”方面展现出巨大潜力。其关键应用场景包括构建跨模态的生物学知识图谱、驱动“数据驱动的假设生成”,以及作为“设计-构建-测试-学习”(DBTL)循环的智能核心,最终自然收敛于实现自主实验实验室(Self-

weixin_34355559的博客 368

ChemBERTa 化合物小分子的向量表示及相似检索

参考:https://arxiv.org/pdf/2209.01712.pdf模型是基于分子simles进行transformer的MLM预训练的bert模型。

weixin_42357472的博客 2166

计算pi小数点后10000位

数据结构课上,老师让我们计算一下pi的10000位,复习一下面向对象。 First Try:定义一个高精度类hp(high precision),实现加减乘除,输入输出,然后随便找一个公式,比如Wallis公式,全都用hp进行计算。 现实是:大数乘大数或者大数除大数,实在是太慢了。而且Wallis公式收敛太慢。 Second Try先找到一个收敛较快的公司:BBP公式,观察公式发现,...

我的技术人生 7395

使用基于物质点法(MPM)的Anura3D模拟沙柱坍塌

本博客使用开源软件Anura3D软件模拟了一个沙柱坍塌的过程,这个软件是基于基于物质点法(MPM)设计的

weixin_59902634的博客 4043

ORB-SLAM3单目+IMU实战:从数据加载到位姿优化的完整流程解析

本文详细解析了ORB-SLAM3单目+IMU模式的完整实战流程。从EuRoC等数据集的数据格式准备、系统启动与数据流入口,到帧构建、IMU预积分、视觉-惯性联合初始化,再到基于运动模型的跟踪、局部地图优化及多线程协同,提供了从环境配置到代码解读的全面指南,并分享了参数调优与性能分析的实用调试经验。

weixin_29085151的博客 296

C#实战:YOLOv5+海康工业相机上位机开发全攻略(从图像采集到检测落地)

工业场景下AI质检系统的开发需要综合考虑硬件适配性、算法性能和稳定性。本文针对新能源电池极片缺陷检测场景,提出基于海康工业相机+YOLOv5+C#的技术方案,涵盖以下关键点: 工业级技术选型:选择支持全局快门的海康相机、OpenCvSharp图像处理、YOLOv5s轻量化模型,确保在无GPU工控机上稳定运行。 开发流程优化: 海康SDK集成:详细说明DLL配置和常见报错解决方案 YOLOv5模型导出:强调batch=1、opset12等工业适配参数 相机采集封装:提供线程安全的C#封装类,支持触发采集模式

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1197

基于粒子群优化的PID控制在药液流量控制系统中的应用

本文提出了一种基于粒子群优化(PSO)的PID控制算法,用于药液流量控制系统。系统采用C37控制器和Codesys 2.3编程环境实现,通过传感器实时监测流量、压力和车速,并控制水泵占空比和电动球阀开度来精确调节药液流量。硬件配置包括FT-2000流量传感器、PT-3000压力传感器和MV-500电动球阀等。控制算法将PSO与PID结合,使用ITAE指标优化PID参数,在Codesys中实现了包含PSO优化循环、PID控制等功能的程序模块。该系统通过分层控制策略和智能优化算法,提高了药液流量控制的精度和响应

AI的内部世界的博客 250

FPGA JTAG接口设计全解析

JTAG是FPGA开发的核心接口,主要用于代码下载和在线调试。14-pin设计中包含TCK、TMS、TDI、TDO四个关键信号,采用信号-地布局增强抗干扰能力,TCK建议串联电阻。10-pin设计需注意转接适配,并推荐使用RCLAMP0524P等低电容TVS二极管进行ESD防护。两种接口设计都强调信号完整性和可靠性,建议PCB布局时保持JTAG走线短且预留调整空间。

在读研究生,FPGA电路设计与功能开发。 2184

docker部署neo4j,设置密码。Neo.ClientError.Security.Unauthorized: The client is unauthorized due to authenti

卷,设置NEO4J_AUTH将不会起作用,因为该数据库已经配置了身份验证。Neo4j Docker 服务将会启动,但您需要使用已与该数据库关联的用户名和密码才能登录。这里,使用了环境变量NEO4J_AUTH,设置了用户名为neo4j,密码为neo4jneo4j。这个命令还是比较全的,包括设置密码,设置端口,挂载外部的数据目录等。原因嘛,就是使用docker创建的neo4j,登录不上。把👆提到的外挂的数据,都清空了,再重新来一遍。有一种情况下,这样设置密码,并不会成功。如果不出意外,目前就算大功告成了。

xiezhipu的博客 564

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: Ta-lib实战指南:K线模式识别在量化交易中的应用
下一篇: 基于kkFileView与若依框架,构建可嵌入式前后端分离文件预览系统的实践指南
人间清醒863
博客等级 码龄3年 33粉丝 1544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值