ML, Deep Learning에 관한 강의도 여러 개 봤고, 대학교 데이터학습과지능 강좌에서 전체적인 AI에 대한 Overview와 특징도 알게 되었다. 거기에 더해 실질적인 ML 테크닉을 익히기 위해서 Kaggle Dataset 가지고 분석을 해보았는데, 뭔가가 부족한 느낌이 들었다. 기본적인 머신러닝 툴들에 대한 이해도는 높아졌지만, 정작 domain knowledge을 활용한 결과물은 아직 시도해보지 못했기 때문이다. 솔직히 Tools들에 배우는건 귀찮고 복잡할 뿐이지 생각보다 금방 익히는데, 이걸 본인의 전공 지식에 적용하는 건 또 다른 이야기다. 또한 실제로 현대과학은 지금 딥러닝 기술들을 어떻게 활용하고 있는지도 궁금해져서 관련 논문들을 뒤져보았다. 학부가 화학과인 만큼 화학 분야의 지식들을 활용한 결과물을 탐색하다가 OpenChem이라는 open project를 만나게 되었다.

OpenChem Project Overview

OpenChem is a deep learning toolkit for Computational Chemistry with PyTorch backend. The goal of OpenChem is to make Deep Learning models an easy-to-use tool for Computational Chemistry and Drug Design Researchers.

OpenChem은 (소개글에 나와있듯이) 계산화학을 위한 PyTorch 백엔드 기반의 딥러닝 툴킷이다. 계산화학과 신약개발 연구자들을 겨냥한 모델인데, 기본의 다른 de novo design methods에 비해 향상된 성능과 편리한 API을 자랑하고 있었다. 그들이 어떻게 만들었는지 궁금해서 논문을 찾아보았다.

관련 논문

두 개의 논문이 나와있었는데, OpenChem에 관한 논문의 경우 기관을 통해서 열람할 수 있다. 대학교 도서관 계정으로 열람했는데 해당 내용은 다음에 리뷰하려고 한다. 다음으로 2019년에 발표한 MolecularRNN에 대한 논문이 꽤나 흥미로웠다. (해당 사이트에서 무료로 열람가능) 이 글에서는 MolecularRNN에 대한 내용을 다루려고 한다.

MolecularRNN

-> [Figure 1] Process of MolecularRNN (출처: https://arxiv.org/abs/1905.13372)

기존 연구와 차별되는 MolecularRNN의 특징은 다음과 같다.

  • 분자 구조를 표현하는 방법으로 그래프를 그대로 사용함으로써, (SMILES, fingerprints, 3D atom configuration)에 비해 더 현실적인 구조가 가능하다. (validity/uniqueness/novelty에서 높은 score 보임)
  • valency constraints에 대해 penalty를 부여함으로써, 100% 타당한 분자만을 생성

10쪽 정도의 논문인데, 솔직히 MolecularRNN의 Methods 부분이 중요하고 나머지 부분은 “우리가 이런저런 테스트셋으로 평가해봤는데 기존것보다 낫더라. 어때 쓸만하지?“의 내용이다. ㅋㅋ 그래서 MolecularRNN model에 대한 부분만 집중적으로 알아보도록 하자.

3.1 Background: GraphRNN model

MolecularRNN model은 GraphRNN model을 extend해서 만들어졌다고 밝힌다. Node와 Edge을 기반으로 graph을 생성하는 모델인데, BFS 방식으로 graph을 생성한다고 한다. (백준에서 자주 풀었던 BFS 문제가 이렇게 쓰인다니?! 왠지 모르게 반가웠다 ㅋㅋㅋ) 이래저래 수식이 많긴 한데 결국 말하고자 하는건 state-transition function인 NodeRNN과 output function인 GraphRNN을 합쳐서 RNN 모델을 구성했다는 이야기다. 수식도 hidden state와 parameters에 대한 기본 세팅에 대해 알려주고 있다.

3.2 MolecularRNN

molecule과 graph을 일대일대응 시키는 단계. 장황하게 설명되어있지만 정리해보면 아래와 같다.

molecule graph equation
atoms nodes $ C_{i}^{\pi} $ = {1,2,…k} (각각 Oxygen, Nigrogen, Chlorine… 나타냄)
bonds edges
bond types adjacency vector $ S_{i,j}^{\pi} $ = {0,1,2,3} (각각 결합x, 단일,이중,삼중결합 나타냄)

그리고 나서 앞의 GraphRNN의 hidden state와 parameters을 molecular에 적용해서 식을 정리했다. NodeRNN은 다음 atom의 종류를 예측하고, EdgeRNN은 결합 종류를 예측하도록 설계되었다. 유기화합물을 예측하므로 첫 Node는 탄소 원자로 설정했다.

3.3 Valency-Based Rejection

논문 상에서 분량이 적지만, 사실상 MolecularRNN의 핵심은 이 부분이라고 생각한다. 기존 연구의 SMILES 표현식과는 달리 분자의 graph 표현식에서는 각각의 edge에 penalty를 부여함으로써 valency을 만족하는 결과물을 도출하도록 할 수 있다는 점이 획기적이었다. 딥러닝으로 분자에 대해 어떻게 해석하는지에 대한 나의 궁금증을 해소해준 부분이기도 하다.

3.4 Property Optimization & 3.5 Structural Penalty

각 state에 대해서 reward를 제공해가며 molecule chain을 완성해나가는 단계. 원하는 목적에 따라 추가적인 penalty를 부여해서 원하는 성질을 갖는 분자를 moleculeRNN이 예측하도록 한다.

후기

2차원 구조를 1차원 문자로 바꾼 SMILES을 분석하는 것보다, graph로 치환해서 형태 그대로 분석한다는 점이 기존 연구와 가장 차별화된 점이라고 생각된다. 그런데 유기화합물만을 상정한거라, 무기화합물의 경우에는 first node를 다르게 하는 등 변화가 필요해보이는데, 관련 연구를 진행한 논문이 있는지 찾아봐야겠다. 또한 실제로 이런 MolecularRNN을 활용한 계산화학적인 추가 연구나 논문이 있는지 찾아볼 계획이다.

다음 논문리뷰는 이 MolecularRNN을 기반으로 한 OpenChem API을 살펴볼 예정이다. 전체적 구조를 살펴보고, 안으로 들어가서 어떤 점이 기존 연구와 차별화되는지, 더 개선할 부분은 없는지 알아볼 계획이다.