文献学习1-Automatic Chemical Design Using a Data-Driven Continuous Representation of Molecules

分子生成与优化

可能是因为背景知识了解的太少,本来只是想整理一下思路,记记不懂的地方的,不知不觉几乎变成一篇翻译了QAQ。最后一段METHODS实在是一个字都看不懂,就不放出来了。这篇里应该有很多错误,有大神发现的话一定要戳戳我,感谢~

摘要:

作者找到了一种可以把分子的离散表示(例如本文的SMILES表示方法)和多维连续表示相互转换的方法,这可以用来在开放式化合物空间中产生新分子。

一个深度的神经网络经训练可以实现三个耦合功能:

  1. 编码。将分子的离散表示转换为实型连续向量。
  2. 解码。从实行连续向量转换为离散表示。
  3. 预测。从潜在连续向量中估计分子的化学性质。

关于多维连续表示的一些性质:

  1. 可以通过在潜在空间做一些简单的操作来自动获得index化学结构。
  2. 允许使用基于梯度的优化来知道优化功能化合物的搜索。

本文通过对类药分子和一组少于9个重原子的分子来证明他们的方法

介绍

要想找到具有理想的定量的性质的分子是很困难的,因为可搜索的空间太大了,潜在的、具有类药性的分子太多,而事实上目前为止真正合成的物质相比起来少之又少。
虚拟筛选是一个加快搜索的好方法,在投入正式实验之前,可以把候选药物用法基于训练了的代理模型的第一性模拟和统计预测来试验一下。但是,即使如此,计算分子的设计还是被搜索策略所限制。
当前的搜索策略有:

  1. 搜索固定库。但固定库是单块的,搜索代价高昂,而且为了避免不合实际的化学反应,需要人工制定规则。
  2. 离散的局部搜索方法——遗传方法。需要人工制定突变和交叉规则的启发法。
  3. 离散的局部搜索方法——离散插值方法。它因为不允许用梯度方法搜索,所以难以搜索大空间。

一个连续的、数据驱动的、可以转换为机器可读分子的分子表示方法诸多优点:

  1. 不需要手写突变规则,因为我们可以用修改向量并解码的方式获得新化合物。
  2. 如果建立了一个可微分的模型,将分子表示映射到所需性质,就可以用基于梯度的优化。
  3. 可以用未标记的大量化合物建立一个隐式库,再用已标记的化合物建立一个从分子表示到所需性质的模型。这样我们就可以利用由未标记化合物生成的库了。

我们可以把近期机器学习的成果——概率生成模型经训练后可以产生逼真的合成样本,而且模型还可以生成建模数据的低维连续表示,从而可以用插值、类比推理等方法——应用到化学设计中。我们应用一对训练成为自动编码器的深层网络,把分子的SMILE方法表示(事实上我们可以采取任意表示方法,但是SMILE方法可以轻松地转换为分子)转换成连续向量表示。
现在有了分子连续向量表示,就可以用连续优化的方法来生成新分子。我们基于属性预测任务来联合训练自动编码器:添加一个多层感知器,可以预测属性值,并且把回归误差包含在损失函数中。然后我们检查联合训练对潜在空间的影响,并测试了这种优化。

表示法和自动编码器框架

自动编码器分为把字符串转换为固定长度向量的“编码器”和执行逆过程的“解码器”。自动编码器要最小化解码的误差,因此它要学习身份功能。自动解码器的关键在于用信息瓶颈(在这里也就是固定长度向量)来映射字符串。信息瓶颈诱导网络学习一种压缩的表示方法,这种表示方法捕获了数据中最显著的信息。(这段指的是解码过程吗?) 我们把用向量表示的分子(vector-encoded molecule)称作分子的潜在表示(latent representation of the molecule)。(continuous molecular representation和latent representation是一个东西吗,还是说前者经过一些处理之后才会变成后者?)
为了可以在潜在空间进行无限制的优化,必须把潜在空间中的点解码,成为捕获了训练数据中的化学性质的SMILES字符串。否则 (是指没有捕获训练数据中的化学性质吗?) ,自动编码器学习得到的潜在空间就会很稀疏并且包含巨大的“死区”——即解码得到的SMILES字符串无效。为了确保潜在空间的点都能解码有效,我们使用变分自动解码器(VAE)框架。

VAE框架:

  1. 概括了自动编码器。
  2. 给编码器添加了随机性。
  3. 结合惩罚项鼓励了潜在空间的所有区域都与有效解码对应。
在 C++ 中,将 `signed char*` 转换为 `float*` 会引发不兼容的二进制数据类型转换问题,因为这两种类型在内存中的表示方式不同。`signed char` 通常表示 8 位有符号整数,而 `float` 是 32 位浮点数,其内部结构遵循 IEEE 754 标准。直接进行指针转换会导致未定义行为,编译器通常会发出警告或错误。 如果目标是将 `signed char` 数据解释为 `float` 的二进制形式(例如从二进制文件或网络流中读取原始数据),则需要确保数据的内存布局与 `float` 类型兼容,并使用 `reinterpret_cast` 进行转换: ```cpp #include <iostream> int main() { signed char data[4] = {0x00, 0x00, 0x80, 0x3F}; // IEEE 754 表示 1.0f 的小端格式 float* fptr = reinterpret_cast<float*>(data); std::cout << "Value: " << *fptr << std::endl; // 输出 1.0 return 0; } ``` 然而,如果 `signed char*` 指向的是数值数据(例如图像像素值),而目标是将其转换为浮点数进行数学运算,则应使用逐元素转换: ```cpp #include <iostream> #include <vector> int main() { signed char data[4] = {-128, -1, 0, 127}; std::vector<float> result; for (int i = 0; i < 4; ++i) { result.push_back(static_cast<float>(data[i])); } for (float val : result) { std::cout << "Converted: " << val << std::endl; } return 0; } ``` 此外,如果目的是抑制 C++ 编译器对某些类型转换的警告(如使用 `-Wdeprecated-declarations` 或其他类型转换警告),可以使用 `#pragma` 指令临时忽略特定警告: ```cpp #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" // 可能产生警告的代码 float* fptr = (float*)data; #pragma clang diagnostic pop ``` 需要注意的是,这种做法应谨慎使用,确保转换逻辑的正确性和可移植性。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值