Skip to content

Latest commit

 

History

History
108 lines (79 loc) · 4.32 KB

ch12_generativemodels.asciidoc

File metadata and controls

108 lines (79 loc) · 4.32 KB

12章: コンピューターに化学構造を考えさせる

jupyter

Deep Learningがメディナルケミストリに大きなインパクトをもたらしたものの一つに生成モデルがあげられます。特にこの数年での生成モデルの進化は素晴らしいです。ここではMarcus Olivecronaにより開発されたREINVENTを使って新規な合成案を提案させてみましょう。

生成モデルとは?

11章で構築した予測モデルを一般に識別モデルといいます。一方で入力の分布をモデル化することでモデルからのサンプリングつまり入力データを生成することが出来るようになります。これを生成モデルといいます。

詳しくはPRMLの1.5.4を読むのをおすすめします

準備

pytorchというディープラーニングのライブラリをcondaでインストールします。新しいバージョンでは動かないのでバージョンを指定してインストールします。

pytorchとは?

keras同様TensorFlowをより便利に使うためのライブラリです。

$ conda install pytorch=0.3.1 -c pytorch

続いてREINVENT本体をGitHubからクローンします。

$ cd <path to your working directory>
$ git clone https://github.com/MarcusOlivecrona/REINVENT.git

続いて、ChEMBLの110万件くらいのデータセットで予め訓練済みのモデルをダウンロードしてきて元のデータと置き換えます。 このデータはGTX 1080TiGPUマシンを利用して5,6時間かかっていますのでもしトレーニングを自分で行うのであればGPUマシンは必須です。

$ wget https://github.com/Mishima-syk/13/raw/master/generator_handson/data.zip
$ unzip data.zip
$ mv data ./REINVENT/

これで準備が整いました。

実例

ここではJanuviaとして知られる抗糖尿病薬sitagliptinの類似体を生成するようなモデルを作成してみます。

まずはtanimoto係数をスコアとして類似度の高い構造を生成するようにモデルを訓練します。今回は3000ステップ訓練しますが、大体ちょっと前のMacbook Airで7,8時間かかるので気長に待ちましょう。待てない場合はここのデータを使ってください。

./main.py --scoring-function tanimoto --scoring-function-kwargs query_structure 'N[C@@H](CC(=O)N1CCn2c(C1)nnc2C(F)(F)F)Cc3cc(F)c(F)cc3F' --num-steps 3000 --sigma 80

ここからはjupyter notebookを立ち上げます。

必要なライブラリを読みこみます。sys.path.appendはREINVENTのディレクトリを指定してください。

%matplotlib inline
import sys
sys.path.append("[Your REINVENT DIR]")
from rdkit import Chem
from rdkit.Chem import AllChem, DataStructs, Draw
import torch
from model import RNN
from data_structs import Vocabulary
from utils import seq_to_smiles

続いて、トレーニングしたモデルから50化合物サンプリングします。

voc = Vocabulary(init_from_file="/Users/kzfm/mishima_syk/REINVENT/data/Voc")
Agent = RNN(voc)
Agent.rnn.load_state_dict(torch.load("sitagliptin_agent_3000/Agent.ckpt"))
seqs, agent_likelihood, entropy = Agent.sample(50)
smiles = seq_to_smiles(seqs, voc)

実際にどんな構造が生成されたのか見てみましょう。

mols = []
for smi in smiles:
    mol = Chem.MolFromSmiles(smi)
    if mol is not None:
        mols.append(mol)

Draw.MolsToGridImage(mols, molsPerRow=3, subImgSize=(500,400))

まずまずといったところでしょうか?

Sitagliptin_analogues

REINVENTについて

是非ともMolecular De Novo Design through Deep Reinforcement Learningを読んでください。