英文

GPT2 Zinc 87m

这是一个基于约480m SMILES字符串的GPT2风格的自回归语言模型,其中包含来自 ZINC database 的数据。

该模型具有约87m个参数,使用3072的批次大小进行175000次迭代训练,验证损失为~.615。该模型可用于生成药物分子或从SMILES字符串生成嵌入。

如何使用

from transformers import GPT2TokenizerFast, GPT2LMHeadModel

tokenizer = GPT2TokenizerFast.from_pretrained("entropy/gpt2_zinc_87m", max_len=256)
model = GPT2LMHeadModel.from_pretrained('entropy/gpt2_zinc_87m')

生成分子:

inputs = torch.tensor([[tokenizer.bos_token_id]])

gen = model.generate(
              inputs,
              do_sample=True, 
              max_length=256, 
              temperature=1.,
              early_stopping=True,
              pad_token_id=tokenizer.pad_token_id,
              num_return_sequences=32
                         )
smiles = tokenizer.batch_decode(gen, skip_special_tokens=True)

计算嵌入:

from transformers import DataCollatorWithPadding

collator = DataCollatorWithPadding(tokenizer, padding=True, return_tensors='pt')

inputs = collator(tokenizer(smiles))
outputs = model(**inputs, output_hidden_states=True)
full_embeddings = outputs[-1][-1]
mask = inputs['attention_mask']
embeddings = ((full_embeddings * mask.unsqueeze(-1)).sum(1) / mask.sum(-1).unsqueeze(-1))

模型性能

为了测试生成性能,使用不同的温度值生成了1m个化合物。检查生成的化合物是否唯一且结构有效。

  • percent_unique表示n_unique_smiles/n_total_smiles
  • percent_valid表示n_valid_smiles/n_unique_smiles
  • percent_unique_and_valid表示n_valid_smiles/n_total_smiles
temperature percent_unique percent_valid percent_unique_and_valid
0.5 0.928074 1 0.928074
0.75 0.998468 0.999967 0.998436
1 0.999659 0.999164 0.998823
1.25 0.999514 0.99351 0.993027
1.5 0.998749 0.970223 0.96901

在1m个生成化合物上计算的属性直方图: