当前位置: 首页 > article >正文

【多模态表示与语言模型】3.1 自引用嵌入字符串(SELFIES)

3.1 自引用嵌入字符串SELFIES在分子生成式 AI 领域表示学习Representation Learning的瓶颈长期以来集中在语法脆弱性问题上。传统SMILESSimplified Molecular-Input Line-Entry System表示法虽然简洁但其上下文敏感文法导致随机变异或模型生成的字符串大多无效——随机突变后的有效性仅为9.9%。为解决这一根本性问题Krenn 等人于 2020 年提出了SELFIESSelf-Referencing Embedded Strings这是首个保证 100% 鲁棒性的分子字符串表示法。3.1.1 100% 有效性分子表示SELFIES 的核心创新在于将分子图映射为一种上下文无关文法Context-Free Grammar, CFG配合自引用函数的形式语言。与 SMILES 的上下文敏感语法不同SELFIES 确保无论符号如何组合、变异或生成每个字符串都对应一个化学上有效的分子图。从信息论视角看SELFIES 重新定义了分子表示的语义空间$$\forall s \in \Sigma_{SELFIES}^*, \exists! G \in \mathcal{G}_{chem} : \text{decode}(s) G$$其中 $\Sigma_{SELFIES}$ 是 SELFIES 字母表$\mathcal{G}_{chem}$ 是有效化学图空间。这一性质使得生成模型可以在整个隐空间中自由探索而无需担心无效区域的“陷阱”——实验表明基于 SELFIES 的 VAE 在隐空间中每一点都能解码出有效分子而 SMILES-based VAE 存在大量无效区域死区。在分子生成任务中这一特性带来了数量级的性能提升基于 SELFIES 的 GAN 生成78.9%的多样有效分子而 SMILES-based GAN 仅为18.6%。更重要的是SELFIES 允许模型内部记忆存储两个数量级更多的多样化分子结构。图1VAE隐空间有效性对比左SMILES存在大量无效区域红色右SELFIES保证100%有效性全绿3.1.1.1 SELFIES 语法自引用机制与分支/环的局部编码规则SELFIES 的语法体系建立在增强型上下文无关文法之上通过引入状态机和自引用函数将化学约束价键规则编码到文法产生式中。核心文法结构SELFIES 采用 Chomsky 类型-2上下文无关文法定义为四元组 $G (V, \Sigma, R, S)$非终结符$V \{X_0, X_1, \dots, X_r, N\}$其中 $X_i$ 表示当前原子的剩余价态可形成 $i$ 个键$N$ 为数值参数。终结符$\Sigma$包含原子符号、分支符号、环符号。产生式规则$R$基于当前状态 $X_i$ 和输入符号 $s_j$ 的转换规则。起始符号$S$初始状态 $X_0$。自引用函数syntactic validity 的保障分支函数$B(N, X_i)$当解析器遇到分支符号[BranchX]时函数递归地启动一个新的文法推导使用后续 $N$ 个符号在状态 $X_i$ 下构建子图。完成推导后将子图连接到当前顶点$$B(N, X_i) \to \text{derive}(s_{i1}, \dots, s_{iN}) \hookrightarrow v_{current}$$环函数$R(N)$建立当前顶点与第 $(N1)$ 个最近推导顶点之间的边。这通过维护一个环闭合队列lazy evaluation 策略实现。局部编码规则十六进制索引系统SELFIES 采用十六进制编码显式指定分支和环的长度分支长度计算若分支符号后跟随索引符号 $c_1, \dots, c_k$则分支包含的符号数 $N$ 为$$N 1 \sum_{i1}^{k} 16^{i-1} \cdot c_i$$环闭合编码环符号[RingX]同样使用十六进制索引指向回溯 $N1$ 步的顶点。这种显式长度编码消除了 SMILES 中环闭合数字冲突的问题。价态约束的状态机SELFIES 通过状态机跟踪原子剩余价态确保不生成超价结构当状态为 $X_i$剩余 $i$ 个键位时请求键级 $\beta$ 会被自动调整为 $\min(i, d(\beta))$防止价态违规。例如在碳原子价态 4已形成 3 个键状态 $X_1$后若请求双键[C]系统会自动降级为单键局部编码规则十六进制索引系统SELFIES 采用十六进制编码显式指定分支和环的长度分支长度计算若分支符号后跟随索引符号 $c_1, \dots, c_k$则分支包含的符号数 $N$ 为$$N 1 \sum_{i1}^{k} 16^{i-1} \cdot c_i$$环闭合编码环符号[RingX]同样使用十六进制索引指向回溯 $N1$ 步的顶点。这种显式长度编码消除了 SMILES 中环闭合数字冲突的问题。价态约束的状态机SELFIES 通过状态机跟踪原子剩余价态确保不生成超价结构当状态为 $X_i$剩余 $i$ 个键位时请求键级 $\beta$ 会被自动调整为 $\min(i, d(\beta))$防止价态违规。例如在碳原子价态 4已形成 3 个键状态 $X_1$后若请求双键[C]系统会自动降级为单键[C]。3.1.1.2 与 SMILES 的互操作kekulization 处理与立体化学支持Kekulization芳香性处理SELFIES 内部不直接支持芳香性原子符号。当encoder()接收含芳香符号的 SMILES如c1ccccc1时首先执行凯库勒化Kekulization将其转换为显式的交替单双键输入 SMILES:c1ccccc1(苯)Kekulization:C1CCCCC1输出 SELFIES:[C][C][C][C][C][C][Ring1][Branch1]立体化学支持手性中心使用和标记如[CH1]。SELFIES 确保属性顺序标准化[Bond][Isotope][Element][Chirality][H-count][Charge]。环立体化学通过扩展环符号[/RingX]和[\RingX]支持跨环键的 $E/Z$ 构型。3.1.1.3 自定义化学约束超价物种与特殊原子类型的规则定义语义约束机制通过set_semantic_constraints()用户可以定义规则向量 $\Lambda_i$针对每种原子类型 $T_i$ 指定最大价态 $D_i \max\text{deg}(T_i)$允许的键型单键、双键、三键电荷范围Python# 示例定义超价硫S6 import selfies as sf custom_constraints sf.get_semantic_constraints() custom_constraints[S] 6 sf.set_semantic_constraints(custom_constraints)特殊原子类型支持金属有机化合物Fe, Co, Ni 等过渡金属的配位键表示。同位素标记如[13CH1]。自由基与部分电荷通过[CH01]等符号表示。非标准价态如五价碳碳正离子或超价磷。与 SMILES 的互操作边界当前 SELFIES 不支持某些 SMILES 特性通配符*、四键$、反应箭头和聚合标记。对于这些情况encoder()会抛出异常以确保转换的可靠性。代码示例完整的SELFIES编解码与约束自定义 SELFIES分子表示完整示例 包括基础编解码、分支/环解析、自定义约束、立体化学处理 import selfies as sf from rdkit import Chem from rdkit.Chem import Draw # 1. 基础编解码100%有效性保证 print( * 60) print(3.1.1 100%有效性分子表示) print( * 60) benzene_smiles c1ccccc1 benzene_selfies sf.encoder(benzene_smiles) print(f苯SMILES: {benzene_smiles}) print(f苯SELFIES: {benzene_selfies}) # 输出: [C][C][C][C][C][C][Ring1][Branch1] # 解码回SMILESkekulized形式 decoded_smiles sf.decoder(benzene_selfies) print(f解码Kekulized: {decoded_smiles}) # 输出: C1CCCCC1 # 2. 自引用机制分支与环的局部编码 print(\n * 60) print(3.1.1.1 自引用机制与局部编码) print( * 60) # 复杂分子对乙酰氨基酚Paracetamol # 包含苯环、酰胺基和羟基 paracetamol_smiles CC(O)Nc1ccc(O)cc1 paracetamol_selfies sf.encoder(paracetamol_smiles) print(f对乙酰氨基酚 SELFIES:\n{paracetamol_selfies}) # [C][C][Branch1][C][O][N][C][C][C][C][Branch1][Branch1][C][C][Ring1][Branch1][O] # 分析结构 # [C][C] - 乙酰基起始 # [Branch1][C][O] - 分支1羰基CO # [N] - 酰胺氮 # [C][C][C][C]... - 苯环主干 # [Ring1][Branch1] - 环闭合指向1步前的原子带双键分支 # 3. 立体化学支持 print(\n * 60) print(3.1.1.2 立体化学与Kekulization) print( * 60) # 手性分子(R)-乳酸 lactic_acid_smiles C[CH](O)C(O)O lactic_acid_selfies sf.encoder(lactic_acid_smiles) print(f乳酸含手性SELFIES: {lactic_acid_selfies}) # 包含手性标记: [CH1] 或 [CH1] # 解码验证 mol Chem.MolFromSmiles(sf.decoder(lactic_acid_selfies)) print(f手性中心数量: {Chem.FindMolChiralCenters(mol).__len__()}) # 4. 自定义化学约束 print(\n * 60) print(3.1.1.3 自定义化学约束) print( * 60) # 默认约束硫最大价态为2如H2S try: sulfuric_acid OS(O)(O)O sf.encoder(sulfuric_acid) # 可能失败或警告 except Exception as e: print(f默认约束下编码失败: {e}) # 自定义约束允许超价硫6价 constraints sf.get_semantic_constraints() constraints[S] 6 # 硫可形成6个键 sf.set_semantic_constraints(constraints) selfies_sulfuric sf.encoder(sulfuric_acid) print(f硫酸超价SSELFIES: {selfies_sulfuric}) # 成功编码: [O][S][Branch1][C][O][Branch1][C][O][Branch1][C][O][O] # 5. 鲁棒性验证随机变异测试 print(\n * 60) print(鲁棒性验证随机变异) print( * 60) import random def random_mutate(selfies_string, num_mutations1): 随机变异SELFIES字符串 symbols list(sf.split_selfies(selfies_string)) alphabet list(sf.get_semantic_robust_alphabet()) for _ in range(num_mutations): idx random.randint(0, len(symbols) - 1) symbols[idx] random.choice(alphabet) return .join(symbols) # 测试对乙醇进行10次随机单点变异 ethanol_selfies sf.encoder(CCO) print(f原始乙醇 SELFIES: {ethanol_selfies}) valid_count 0 for i in range(10): mutated random_mutate(ethanol_selfies, 1) try: # SELFIES保证任何变异都产生有效分子 decoded sf.decoder(mutated) mol Chem.MolFromSmiles(decoded) if mol is not None: valid_count 1 print(f变异{i1}: {mutated} - {decoded} (有效)) except Exception as e: print(f变异{i1}: 无效 - {e}) print(f\n有效性率: {valid_count}/10 (理论上应为10/10)) # 对比SMILES随机变异通常只有~10%有效性技术总结SELFIES通过形式文法理论与化学语义约束的深度融合解决了分子生成AI中的有效性瓶颈100%鲁棒性通过上下文无关文法配合自引用函数确保任何符号组合都对应有效分子图局部编码分支和环使用十六进制索引显式编码长度避免SMILES的上下文依赖问题互操作性通过kekulization处理芳香性完整支持立体化学实现与SMILES的双向无损转换可扩展性自定义约束机制支持超价物种、金属有机化合物等特殊化学领域这些特性使SELFIES成为现代分子语言模型如ChemBERTa、MOLGEN、PolyBART的首选表示法在药物发现、材料设计和聚合物信息学中展现出显著优

相关文章:

【多模态表示与语言模型】3.1 自引用嵌入字符串(SELFIES)

3.1 自引用嵌入字符串(SELFIES)在分子生成式 AI 领域,表示学习(Representation Learning)的瓶颈长期以来集中在语法脆弱性问题上。传统 SMILES(Simplified Molecular-Input Line-Entry System)表…...

OpenClaw创意辅助:Qwen3.5-9B-AWQ-4bit实现设计草图转文案

OpenClaw创意辅助:Qwen3.5-9B-AWQ-4bit实现设计草图转文案 1. 为什么设计师需要AI创意辅助 作为独立设计师,我经常遇到这样的困境:在灵感迸发时快速绘制的手稿,几天后回看却难以还原当时的完整思路。传统工作流中,我…...

不要让接口过早失去可选项

这&#xff0c;是一个采用C精灵库编写的程序&#xff0c;它画了一幅漂亮的图形&#xff1a; 复制代码 #include "sprites.h" //包含C精灵库 Sprite turtle; //建立角色叫turtle void draw(int d){for(int i0;i<5;i)turtle.fd(d).left(72); } int main(){ …...

C# WinForm 系统参数设置功能完整实现

在工业上位机、客户端工具开发中&#xff0c;系统参数配置是必备基础功能。本文用一套完整可运行的代码&#xff0c;带你实现 WinForm INI 配置文件的参数设置&#xff1a;自动生成配置、读取加载、界面编辑、保存生效&#xff0c;全程逻辑清晰、注释详细&#xff0c;可直接落…...

Three.js模型加载太慢?试试这个gltf-pipeline压缩技巧,亲测有效!

Three.js模型加载优化实战&#xff1a;gltf-pipeline压缩技巧详解 在Web 3D开发中&#xff0c;Three.js无疑是构建沉浸式体验的首选工具之一。然而&#xff0c;随着3D模型复杂度的提升&#xff0c;文件体积膨胀导致的加载延迟成为开发者面临的普遍挑战。想象一下&#xff0c;用…...

全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?

早些时候&#xff0c;聊过 Python 领域那场惊心动魄的供应链攻击。当时我就感叹&#xff0c;虽然我们 JavaScript 开发者对这类套路烂熟于心&#xff0c;但亲眼目睹这种规模的“投毒”还是头一次。然而&#xff0c;属于我们 JS 圈的至暗时刻&#xff0c;终究还是卷土重来了。而…...

16.为什么 Fragment 相比额外包一层 div 更优?

在 React 里&#xff0c;只要你写过几行组件&#xff0c;很容易掉进一个老毛病&#xff1a;“反正组件要有一个根节点&#xff0c;那我就随手包一层 <div> 吧。”一开始看不出问题&#xff0c;但项目一大&#xff0c;你会发现&#xff1a;DOM 结构被一堆没意义的 <div…...

17.在 React 中如何根据条件决定渲染哪个组件?

在 React 里&#xff0c;组件不是一上来就“全给你渲染出来”的。 很多时候&#xff0c;我们希望&#xff1a;界面要看情况说话——登录了看“欢迎回来”没登录就看“请先登录”加载中只给你个转圈圈请求失败再丢个错误提示这些“根据条件&#xff0c;决定渲染什么”的行为&…...

18.children 这个 props 的意义何在?该怎样正确使用?

在 React 里&#xff0c;children 是一个非常特殊、非常常用的 prop&#xff0c; 它专门用来接收&#xff1a;写在组件标签中间的那一部分内容。你可以把它理解为&#xff1a;组件外层负责搭“外壳”&#xff0c;children 负责装进这个壳里的“内容物”。一、children 到底是什…...

交付验收前批量筛一遍配图质量:桌面工具用法记录

如果你经常遇到这种场景&#xff1a;项目交付包里附带大量截图、现场照片&#xff0c;甲方要求「明显糊的、过曝的别混进来」&#xff0c;但文件夹嵌套很深&#xff0c;人工抽查像抽奖。可以试一款只做「打分按档归类」的 Windows 桌面工具&#xff0c;全称【批量图片质量检测筛…...

药流和人流哪个恢复快?术后修护行业洞察与实用指南

意外怀孕后&#xff0c;药流和人流的恢复差异及术后修护&#xff0c;是女性关注的核心话题&#xff0c;也是孕产修护领域的重点议题。术后修护作为缩短恢复周期、减少并发症的关键&#xff0c;其科学合理性直接影响女性生殖健康。本文结合行业现状与实用经验&#xff0c;探讨药…...

OpenClaw个人财务助手:Qwen3-14B分析消费记录生成报表

OpenClaw个人财务助手&#xff1a;Qwen3-14B分析消费记录生成报表 1. 为什么需要AI财务助手 上个月整理支付宝账单时&#xff0c;我盯着密密麻麻的消费记录发了半小时呆。餐饮、购物、交通的金额混在一起&#xff0c;根本分不清钱到底花在哪里。手动分类300多条记录后&#x…...

STM32开发中printf重定向的两种实现方法

1. STM32开发中的printf重定向需求解析在嵌入式开发中&#xff0c;调试信息的输出是开发过程中不可或缺的一环。对于STM32这类ARM Cortex-M系列微控制器而言&#xff0c;标准库中的printf函数默认是无法直接使用的&#xff0c;因为这类设备通常没有像PC那样的标准输出设备。这就…...

从Claude Code代码泄漏到AI Agent逻辑设计VS龙虾OpenClaw

近期 Anthropic的Claude Code 的源码泄露事件,为业界提供了一份价值连城的“活体解剖指南”。本文将深入对比高内聚的 Claude Code 架构与高解耦的 OpenClaw 通用框架,从系统执行逻辑、上下文管理、OS 沙盒交互以及记忆提纯等维度,探讨次世代 AI Agent 在模型推理与工程落地…...

MAX31865嵌入式驱动库:高精度RTD温度测量实战指南

1. 项目概述7Semi_MAX31865 是一款面向工业级高精度温度测量场景的嵌入式驱动库&#xff0c;专为 Maxim Integrated&#xff08;现属 Analog Devices&#xff09;MAX31865 RTD-to-digital 转换器芯片设计。该库并非简单封装&#xff0c;而是以底层硬件控制为核心&#xff0c;提…...

从 LLM 到 OpenClaw:七步看懂 Prompt、Memory、MCP、Skills、Agent

从 LLM 到 OpenClaw&#xff1a;七步看懂 Prompt、Memory、MCP、Skills、Agent 这两年 AI 术语越来越多&#xff1a;LLM、MCP、Agent、Skills、OpenClaw。 如果你不是技术背景&#xff0c;第一次看到这串词&#xff0c;基本都会懵。下面我用一个统一场景来讲&#xff1a;把 AI…...

A89306电机控制器驱动库:SPI寄存器级控制与FOC系统集成

1. A89306电机控制器驱动库技术解析与工程实践1.1 芯片定位与系统角色A89306是由Allegro MicroSystems推出的高集成度三相无刷直流&#xff08;BLDC&#xff09;电机控制器专用IC&#xff0c;面向中高端工业驱动与精密运动控制场景。该芯片并非通用MCU&#xff0c;而是集成了栅…...

002、零基础搭建你的第一个AI开发环境

昨天帮隔壁组实习生看代码&#xff0c;小伙子对着屏幕发愁&#xff1a;“环境都跑不起来&#xff0c;一训练就报cuda版本不匹配。”我凑过去一看&#xff0c;好家伙&#xff0c;系统里装了三个Python版本&#xff0c;conda环境混着pip装&#xff0c;torch版本和cuda差了两位小数…...

Arduino嵌入式多设备协同控制模板

1. 项目概述“TongHopThuVienCon1”&#xff08;越南语&#xff0c;意为“子库集成1号”&#xff09;并非一个独立功能完备的嵌入式开源库&#xff0c;而是一个面向Arduino平台的工程模板项目&#xff08;Arduino_Project_Template&#xff09;。其核心价值不在于提供特定外设驱…...

百度飞桨PaddleOCR图片印章检测技术简介

百度飞桨PaddleOCR图片印章检测技术简介 全文链接 百度飞桨PaddleOCR图片印章检测技术简介 github仓库&#xff1a;使用PaddleOCR识别图片红色印章文字 red-seal-ocr 3.X和2.X区别较大&#xff0c;建议使用3.X版本。 PaddleX简介 PaddleX github地址PaddleX模型产线使用概览…...

嵌入式与单片机:核心概念与开发实战解析

1. 嵌入式与单片机&#xff1a;从概念到实战的全面解析作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我经常被问到这样一个问题&#xff1a;"单片机不就是嵌入式吗&#xff1f;"这个问题看似简单&#xff0c;却反映了初学者对这两个概念的普遍困惑。今天&am…...

C语言实现进程调度算法:优先级与时间片轮转

1. 项目概述在嵌入式系统和操作系统开发中&#xff0c;进程调度是一个核心概念。今天我要分享的是如何在C语言中实现一个简单的程序调度机制&#xff0c;重点讲解高优先数调度算法和先来先服务算法的实现。这个项目非常适合想要深入理解操作系统底层原理的开发者&#xff0c;特…...

ESP32开发板变身万能协议分析仪

1. ESP32开发板的隐藏潜力&#xff1a;从物联网到万能协议分析仪当大多数人拿到ESP32开发板时&#xff0c;第一反应都是用它来做物联网项目。确实&#xff0c;这款集成了Wi-Fi和蓝牙功能的微控制器在智能家居、远程监控等领域表现出色。但今天我要告诉你的是&#xff0c;ESP32的…...

告别卡顿:在Windows10上通过QEMU与WHPX硬件加速高效部署Ubuntu20.04开发环境

1. 为什么选择QEMUWHPX方案&#xff1f; 很多开发者都遇到过这样的困境&#xff1a;在Windows系统上运行Linux虚拟机时&#xff0c;要么性能拉胯到让人抓狂&#xff0c;要么配置复杂得让人望而却步。我之前用VMware跑Ubuntu时&#xff0c;光是开个浏览器就能让CPU飙到100%&…...

OpenClaw安全实践:千问3.5-27B私有化部署下的权限管控

OpenClaw安全实践&#xff1a;千问3.5-27B私有化部署下的权限管控 1. 为什么需要关注OpenClaw的安全配置&#xff1f; 去年我在尝试用OpenClaw自动整理财务报表时&#xff0c;差点酿成一场灾难。当时我的脚本误将未加密的财务数据同步到了公开目录&#xff0c;幸亏及时发现。…...

信号量实战:多进程协同操作有限缓冲区的伪代码精解

1. 信号量机制与生产者-消费者模型 想象一下餐厅后厨的场景&#xff1a;厨师&#xff08;生产者&#xff09;不断制作菜品&#xff0c;服务员&#xff08;消费者&#xff09;将菜品端给顾客。如果厨师做菜太快&#xff0c;服务员来不及端走&#xff0c;菜品就会堆积&#xff1b…...

2025届必备的六大降重复率助手横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 纵然人工智能辅助毕业论文写作现如今已然成为一种学术方面的新常态&#xff0c;可是却需要去…...

Android音频开发避坑指南:用OboeTester的Device Report快速排查耳机兼容性问题

Android音频开发实战&#xff1a;用OboeTester精准诊断耳机兼容性问题 当你在星巴克掏出Type-C耳机准备调试刚写完的音频播放代码&#xff0c;却发现设备死活不出声——这种崩溃瞬间每个Android音频开发者都经历过。数字耳机兼容性问题就像薛定谔的猫&#xff0c;不到实际连接那…...

P6 v24.12 新功能实战:如何用‘基线预览’和‘取消链接’高效管理项目变更?

P6 v24.12 新功能实战&#xff1a;如何用‘基线预览’和‘取消链接’高效管理项目变更&#xff1f; 在复杂工程项目管理中&#xff0c;计划变更如同家常便饭。每次设计调整、资源变动或进度延误&#xff0c;都可能引发连锁反应。传统做法中&#xff0c;项目经理往往需要反复试…...

从一次深夜停电抢修说起:聊聊馈线自动化(FA)如何把故障恢复时间从小时级压到分钟级

从深夜抢修到智能自愈&#xff1a;馈线自动化如何重塑电网韧性 凌晨2点17分&#xff0c;某城市核心商圈突然陷入黑暗。传统配电网时代&#xff0c;这样的故障意味着至少3小时的停电——从人工报修、巡线排查到隔离修复&#xff0c;每一步都依赖人力响应。但此刻&#xff0c;调度…...