使用強化學習生成模型產生新的分子
在藥物設計、化學資訊學領域,深度學習並不一定能比傳統機器學習領域有更好的表現,尤其是在學術界,由於有標籤的資料很少,資料噪音較大,往往用深度學習只會導致過擬合降低模型的預測能力。但是,生成學習用於藥物設計卻完全發揮了當前深度神經網路的優勢。雖然有標籤的資料很少,但是藥物設計資料庫諸如CHEMBL不乏質量較高的“化合物資訊”。這裡說的質量較高指的是他們的類藥性較強,往往此類資料庫中的化合物都是早期藥物設計中已經合成出且具有一定生物活性的分子。這些化合物可以統統拿來構建一個模型用於生成新的小分子。
另一方面,深度學習所推崇的”原始資料”,對於圖形資料,序列資料的處理能力遠遠大於傳統的機器學習方法,從而解決了傳統方法用分子描述符和分子指紋描述分子並不能得到分子結構本身。現在有了深度學習,一切從分子本身(比如分子的 SMILES)進行訓練,生成新的SMILE即得到小分子的結構。
RNN生成模型
生成模型的架構主要是迴圈神經網路 (RNN),從下圖可以看出,在一個 RNN 模型裡,最初的輸入是“GO”,接下來每個輸入都是上個單元期待的輸出,最終輸出是“EOS”。比如一個乙醇分子 CCO,對應這裡的 x1, x2, x3。訓練的目的就是讓 x1=C
, x2=C
, x3=O
的概率之積最高,用損失函式表示就是:
$$ J(Θ) = -\sum_{t=1}^{T}logP(X^t|x^{t-1},…,x^1) $$

當需要產生新的分子時,則只要讓輸入時“GO”,然後讓前一個單元的輸出作為後一個單元的輸入,直到有一個單元輸出“EOS”表示完成一條資料的生成。

RL優化生成的化合物
當使用大量資料訓練RNN生成模型後,該模型(稱之為 Prior)具有生成 SMILES 的能力,接下來是通過強化學習來優化這個模型(Agent),讓其能生成“更好的分子”。
此時可以將生成小分子的過程想象成一場遊戲,每生成一個字母就是一個行為(action, \(A= \{ a_1, a_2, .. a_n \}\)),生成完整個小分子就是完成了整場遊戲(episode),獲得一個“分數”(S(A))。優化的目的是儘可能讓生成的小分子擁有較高的分數。比如這裡的分數可以是“與某個分子的相似程”。 於是得到一個小分子的概率就可以描述成:
$$ P(A) = \prod_{t=1}^{T}\pi (a_t|s_t) $$
而具體損失函式如下得到:
首先我們要在Prior模型的基礎上增加打分,成為“目標概率”,即:
$$ logP(A)_U=logP(A)_{Prior}+\sigma S(A) $$
損失函式則要讓Agent做這個決策的概率接近這個目標概率,即:
$$ L(\Theta) = [logP(A)_U-logP(A)_A]^2 $$
原始碼及使用方法
原始碼和使用方法見: ofollow,noindex">https://github.com/MarcusOlivecrona/REINVENT
無需REINVENT,只需要搭建環境然後直接使用即可,環境包括:
安裝方法:
conda install -c rdkit rdkit scikit-learn tqdm pytorch=0.1.12 python=3.6
另外如果發現缺少其他包(比如pexpect),建議直接用 pip
安裝即可,附筆者的pip環境:
bokeh==1.0.1 certifi==2018.4.16 cffi==1.11.5 cycler==0.10.0 Jinja2==2.10 kiwisolver==1.0.1 MarkupSafe==1.1.0 matplotlib==2.2.2 numpy==1.14.3 olefile==0.45.1 packaging==18.0 pandas==0.20.3 pexpect==4.6.0 Pillow==5.1.0 ptyprocess==0.6.0 pycparser==2.18 pyparsing==2.2.0 python-dateutil==2.6.1 pytz==2017.2 PyYAML==3.13 scikit-learn==0.19.1 scipy==1.1.0 six==1.11.0 torch==0.4.0 torchvision==0.2.1 tornado==5.0.2 tqdm==4.15.0
環境搭配完後輸入:
./main.py --scoring-function activity_model --num-steps 10
即可看到生成的分子,
其中 activity_model
是原作者預設的打分函式,可以根據自己需要修改,也可以使用原作者預設的相似性打分函式,詳見 score_functions.py
。
原作者已經使用 ChEMBL 訓練過了 Prior 模型,如果想自己訓練,則根據 GitHub 教程,先準備好分子檔案 mol.smi
,然後輸入 ./data_structs.py mols.smi
,再輸入 ./train_prior.py
,筆者並未嘗試,不知要訓練多久。
有描述不對的地方歡迎留言反饋
參考文獻
(1) Olivecrona, M.; Blaschke, T.; Engkvist, O.; Chen, H. Molecular De Novo Design through Deep Reinforcement Learning. 2017. http://arxiv.org/abs/1704.07555