Molecular graph는 Graph Neural Network를 활용한 접근이 굉장히 straightforward하게 느껴지면서도 도메인에 대한 높은 진입 장벽 때문에 어려움을 느끼는 분야인 것 같습니다. Data 자체에 대한 복잡성, feature의 다양함 등 computer scientist와 chemistry/biology 관련 도메인의 전문가 사이의 소통이 쉽지 않은 이유 또한 이와 무관하지 않을 것 같습니다. 보통 블로그의 글을 완벽히 신뢰하는 것은 힘들다고는 하지만 이 글이 computer scientists, 특별히 graph neural network를 연구하시는 분들에게 도움이 되었으면 하는 바람으로 복잡한 도메인 지식들을 풀어서 설명해 보고자 합니다. 그리고 개인적인 의견이지만, 단락 사이사이에 Organic chemistry knowledge에서 출발한 GNN approach들을 제안해 보고자 합니다.
Molecule, 분자를 graph로 해석할 수 있는 이유는 기본적으로 분자가 원자들의 결합으로 이루어져 있기 때문입니다.
Molecule graph의 feature가 그렇게 다양한 이유는 그러면 무엇일까요?
그런데, Chemical bond의 특성은 단순히 결합 자체만으로 정의되지 않습니다. 인접한 다른 결합과의 관계 속에서 정의되기도 합니다. 이게 무슨 뜻일까요? Node features & Edge features의 관점에서 해석해 보겠습니다.
Molecular graph에서의 node feature는 무엇을 의미할까요? Node가 원자에 대응되기 때문에, 해당 atom의 property가 node feature로 사용될 수 있을 것입니다. Organic chemistry의 관점에서, property는 크게 정전기적 성질에 기반한 property와 크기에 기반한 property로 구분할 수 있습니다.
실제로, electronic & steric effect라고 불리는 두 효과는 각각 정전기적 성질과 크기와 관련된 두 성질에 의해서 발생하는 효과로, 유기화학 반응이 특정한 경로로 선택되는 것 현상을 설명하기 위해 필요한 가장 기초적인 접근입니다. 그렇다면, 아래와 같은 가설을 생각해 볼 수도 있겠습니다.
Hypothesis 1: Explicitly disentangling electronic-based features & steric properties will enhance molecular graph learning.
RDKit과 같은 라이브러리에서는 node feature extraction을 위해 API를 제공하고 있으나, 그 종류가 매우 다양하기 때문에 무엇을 취사선택해야 할지 고민하는 것은 기준 또한 모호하고 어려운 일입니다. 정의를 이해하거나 자세한 정보를 위해서는 각각의 의미에 대한 검색이 필요하겠지만, 그래도 feature들의 종류와 간단한 설명을 아래에 남겨 놓고자 합니다.
def _get_node_features(self, mol):
all_node_feats = []
for atom in mol.GetAtoms():
node_feats = []
# get Atomic Number
node_feats.append(atom.GetAtomicNum())
# get Atomic Degree
node_feats.append(atom.GetDegree())
# get Formal Charge
node_feats.append(atom.GetFormalCharge())
# get Hybridization
node_feats.append(atom.GetHybridization())
# get Aromaticity
node_feats.append(atom.GetIsAromatic())
all_node_feats.append(node_feats)
all_node_feats = np.asarray(all_node_feats)
return torch.tensor(all_node_feats, dtype=torch.float)
Feature Types | Interpretation |
---|---|
GetAtomicNum | 원자 번호: Atom type의 unique identifier |
GetDegree | 차수: 해당 node와 연결된 neighbor의 수를 의미하지만, 오비탈 혼성화(GetHybridization)와도 연관이 있음 |
GetFormalCharge | 형식전하: 엄밀한 정의는 복잡하지만 electronic property 중 하나 |
GetHybridization | 혼성화: 노드들 사이의 공간적 배향을 결정함 |
GetIsAromatic | 방향족성: aromatic node는 pi-pi interaction과 같은 단백질 affinity에서 중요한 특성에 기여할 수 있음 |
Edge feature 역시 마찬가지입니다. 원자와 원자 사이의 결합은 다양한 방식으로 분류될 수 있는데, 기본적으로 결합 차수(1차, 2차, 3차)와 결합의 종류에 따라서 분류할 수 있습니다.
결합 차수의 경우에는 두 원자 사이의 결합에 관여하는 전자쌍의 개수에 따라서 결정되는데, 이는 결합의 세기와 직접적인 연관성이 있으며 원자(node)의 종류에 따라서 가질 수 있는 결합 차수의 종류가 제한되어 있습니다(dependancy structure).
일반적으로 결합이라 함은 공유 결합을 가정하지만, 전자쌍을 제공하는 방향에 따라서 graph edge의 방향을 결정할 수도 있으며 edge를 구성하는 두 노드의 상대적인 형식전하/전기 음성도 등을 기반으로 polarity(극성)을 결정하여 edge의 방향을 새로운 feature로 추가할 수도 있을 것입니다. 아래는 가장 기초적인 feature인, bond type(결합 차수)와 IsInRing(고리 형태의 화합물 결합에 포함되어 있는지 여부)를 feature로 사용하는 경우입니다.
def _get_edge_features(self, mol):
all_edge_feats = []
for bond in mol.GetBonds():
edge_feats = []
# get Bond type
edge_feats.append(bond.GetBondTypeAsDouble()
# get Rings
edge_feats.append(bond.IsInRing())
all_edge_feats.append(edge_feats)
all_edge_feats = np.asarray(all_edge_feats)
return torch.tensor(all_edge_feats, dtype=torch.float)
하지만 molecule의 property는 단순히 결합 형태에서만 emerge하는 것은 아닙니다. Molecule graph를 활용하는 대표적인 task로 molecule-molecule interaction이 있는데, molecule이 어떠한 종류인지에 따라 interaction의 형태 또한 다르게 나타납니다.
예를 들어 Protein-protein interaction의 경우에는 protein 구조를 구성하는 기능적 단위인 domain들을 중심으로 interaction이 일어날 것이라고 추측할 수 있습니다. 그리고 이러한 상호작용은 node & edge feature만으로는 설명이 불가한 특성들입니다. Physical torsion에 의해서 구조가 특정한 형태로 접히거나 굽어지고, 굽어진 구조 사이에서의 형태적 상보성에 의한 guest-host interaction(대표적으로 수소결합, pi-pi interaction)은 노드들이 어떻게 공간적으로 배치되었는지에 따라서 달라집니다. 그리고 이것은 GNN에서의 중요한 특징 중 하나인 permutational invariance에 정면으로 배치하는 사실이기도 합니다. 어쩌면 position-aware GNN이 더 좋은 성능을 보일지도 모르는 이유입니다.
그리고 이러한 domain의 기능을 뒷받침하는 특수한 분자 구조가 존재하는 경우가 많고, 이러한 구조들 간의 상호작용은 넓은 범위에서 일어날 수도 있지만 때때로 매우 국소적입니다. 따라서, 오히려 전체 molecule graph에 대한 feature를 모두 활용하는 것은 interaction을 예측하는 데 필요한 중요한 정보를 희석하는 영향을 가져올 수도 있을 것입니다. 따라서, 아래와 같은 가설을 생각해 볼 수 있겠습니다.
Hypothesis: Exploiting whole molecular graph. Since properties of molecule emerge in different hierarchies, matching the semantic hierarchy of graph information can help molecular graph learning.
이러한 organic-chemistry inspired 접근은 때때로 "Is it plausible?" 이라는 의문을 낳을 수도 있습니다. 하지만, 때때로는 매우 놀라운 효과를 가져올 수도 있습니다.
Chen, S., Jung, Y. A generalized-template-based graph neural network for accurate organic reactivity prediction. Nat Mach Intell 4, 772–780 (2022). 에서는 template based GNN을 통해 organic chemistry synthesis를 높은 정확도로 예측하는 방법론을 제안하였습니다. 핵심 원리는 "유기 화학 반응은 4개의 커다란 범주에 속하는 기초 반응들의 조합으로 나타낼 수 있다"라는 가정입니다. 일반적인 유기 반응의 경우 ATTACK, BREAK, CHANGE, REMOTE 네 개의 operation들의 조합으로 표현 가능한 universality를 가지고 있는데, 이러한 기본 operation들의 시퀀스를 예측함으로써 AoT(Action of Transform)과 반응 위치를 추정하고, 이를 바탕으로 최종 생성물을 그려내는 방식입니다. 성능이 뒷받침될 뿐만 아니라 유기화학적 배경 지식을 멋지게 GNN과 접목하여 구현했다는 사실이 놀라우면서도, 해당 분야에서 다른 형태의 organic-chemistry insipred GNN이 제안되지 않을까 기대가 됩니다. 이상으로 글을 마치겠습니다.