Skip to main content

그래디언트 탐구

그래디언트를 시각화해 모델의 심장 박동을 추적하세요 이 글은 AI 번역 기사입니다. 오역이 의심되면 댓글로 알려주세요
Created on September 15|Last edited on September 15

요약

저는 단백질 구조와 서로 다른 단백질 간 상호작용을 예측하기 위해 그래프 합성곱 모델을 사용합니다. 모델의 심장 박동을 추적하고, 아키텍처를 조정하며, 학습 중 문제를 진단하기 위해 그래디언트 시각화를 활용합니다.


배경

저의 배경은 생물학이며, 현재는 머신러닝을 활용해 유전학의 어려운 문제들을 해결하고 있습니다. 학부 연구에서는 통계적 방법을 사용해 유기체의 유전적 구성과 환경 사이의 상호작용을 탐구했고, 스탠퍼드에 오면서 머신러닝에 대한 이해를 더 깊게 할 수 있는 기회를 놓치지 않았습니다. 수학을 따라잡는 일은 도전적이었지만, 바닥부터 모델을 구현하는 과정에서 CS 231n 및 CS 229 탄탄한 기초를 다질 수 있었습니다. 현재는 매일 머신러닝 기법을 활용하여 폴리 포다이스 연구실, 분자 상호작용을 더 명확히 정의하고 예측하기 위해 노력하고 있습니다.

연구

제 대학원 연구는 분자 상호작용의 생물물리학에 초점을 맞추고 있습니다. 조금 멋지게 말하면, 생체 내에서 단백질들이 서로 얼마나 강하게 결합하는지를 예측한다는 뜻입니다. 두 개 이상의 생체 분자 간 상호작용이 지배하는 과정은 놀라울 정도로 다양한 기능을 수행합니다. 이러한 상호작용은 다음과 같습니다:
  • 세포가 어떤 유전자를 언제 켤지 결정할 때 사용하는 것
  • 면역 체계가 혈액 속 물질이 자신의 것인지 외부 침입자인지 구별하는 방식
  • 그리고 점점 더 최첨단 의료 치료의 기반이 되고 있습니다
딥러닝이 이러한 상호작용을 이해하고 나아가 설계하는 데 어떻게 활용될 수 있는지 파악하려면, 먼저 단백질이 어떻게 구성되는지에 대해 조금 더 이해할 필요가 있습니다.




중요한 분자 간 상호작용의 예: 인간 리노바이러스의 짧은 단백질 서열과 복합체를 이루고 있는 항체(PDB ID: 1A3R)

단백질

단백질은 아미노산이라 불리는 작은 화합물, 즉 “잔기”가 실에 꿰어진 구슬처럼 길게 연결된 사슬로 이루어져 있습니다. 단백질을 구성하는 데 사용되는 아미노산은 오직 20종뿐입니다. 그럼에도 불구하고 이렇게 제한된 ‘알파벳’으로도 자연은 실로 눈이 어지러울 만큼 다양한 기능을 수행하는 단백질들을 만들어냈습니다. 다른 단백질과 결합하고 조절하는 일부터, 생명 유지에 필수적인 화학 물질을 합성하는 일에 이르기까지 그 기능은 매우 폭넓습니다.
단백질이 이러한 수많은 일을 해내는 이유는 각각의 삼차원 구조가 다르기 때문입니다. 그리고 그 구조는 궁극적으로 아미노산 자체의 화학적 성질과 그것들이 어떤 순서로 연결되어 있는지에 의해 결정됩니다. 예를 들어, 대부분의 단백질에서는 소수성(물을 싫어하는) 아미노산 잔기가 단백질의 중심부에 주로 위치하는 반면, 단백질 표면에는 친수성(물을 좋아하는) 잔기가 더 많이 분포하는 경향이 있습니다. 물로 이루어진 환경에서 물을 싫어하는 아미노산들이 단백질 내부에 숨어 있는 편이 일반적으로 더 유리합니다. 이러한 화학적 성질은 단백질의 구조를 규정하는 데 기여하고, 그 구조는 핵심 기능성 잔기의 위치를 정함으로써 단백질의 기능을 결정합니다. 기능성 잔기는 많은 결합 단백질처럼 표면에 자리할 수도 있고, 많은 효소처럼 중심부에 존재할 수도 있습니다. 효소는 화학 반응을 촉매하는 단백질을 말합니다.

단백질 서열을 3차원 구조와 연결하기

이제 단백질 서열과 구조를 매개로 한 단백질 기능의 연결에 대해 어느 정도 알게 되었으니, 단백질의 아미노산 서열을 완전히 접힌 3차원 구조에 연결해 줄 수 있는 모델이 있으면 정말 좋겠다고 느껴집니다. 불행히도, 이는 여전히 가장 어려운 과제 중 하나로 남아 있는 극도로 도전적인 문제입니다. 가장 큰 미해결 과제 계산 생물학 분야에서. 최근의 진전에도 불구하고 DeepMind 그리고 기타하지만 단지 서열만으로 단백질의 구조를 완벽하게 예측할 수 있는 일반화 가능한 모델을 갖추기까지는 아직 갈 길이 멉니다.
단백질 접힘 문제는 아직 완전히 해결되지 않았지만, 잠재적 기능에 대한 유용한 통찰을 제공할 수 있는 다양한 구조 대리 지표들이 존재합니다. 그중에서도 컨택트 맵은 전체 구조를 예측하지 않고도 접힌 단백질의 핵심 구성 요소를 추상화하는 데 가장 널리 쓰이는 방법입니다. 컨택트 맵은 간단히 말해 2차원 이진 행렬로, 각 행과 열은 단백질의 하나의 아미노산을 나타냅니다. 특정 유형의 접촉(예: 공유 결합이나 수소 결합)이 두 잔기 사이에 존재하면 해당 행렬 위치의 값은 1이 되고, 그렇지 않으면 0이 됩니다. 이러한 접촉은 무향적이기 때문에 컨택트 맵은 주대각선을 기준으로 대칭입니다. 컨택트 맵은 국소 영역에서의 접촉 간 상관성과 문제를 3차원에서 2차원으로 사영한다는 점 때문에, 완전한 3차원 구조를 예측하는 것보다 훨씬 쉽게 예측될 수 있습니다. 이 맵들은 잠재적 결합 포켓의 위치나 국소 구조처럼 단백질 기능과 관련된 정보를 여전히 보존합니다. 따라서 저는 단백질 서열만을 입력으로 하여 다중 채널 컨택트 맵을 예측하기로 했으며, 이 컨택트 맵이 단백질-단백질 상호작용의 강도와 기전을 해석하는 데 유용한 중간 표현으로 작용하기를 기대합니다.

컨택트 맵의 예시. 왼쪽은 딥러닝 모델이 예측한 컨택트 맵이고, 오른쪽은 정답 맵이다.

나의 과정

내 연구에서 가장 흥미롭고도 답답한 부분 중 하나는 새로운 딥러닝 아키텍처를 자유롭게 실험해 볼 수 있다는 점이다. 논문을 읽고, 그 논문에서 제안한 새로운 방법을 PyTorch로 구현한 뒤, 내가 풀고자 하는 예측 과제에서의 결과(좋든 나쁘든)를 직접 확인하는 과정은 끝없이 보람차다. 하지만 모든 새로운 방법이 내 문제에 꼭 맞는 것은 아니며, 상당한 도움을 줄 수 있는 방법조차도 첫 시도에서 완벽하게 작동하는 경우는 드물다.

유망한 방향을 식별하기

내 일에서 가장 어려운 부분은 새로움에 대한 과도한 탐닉 유혹을 뿌리치는 것이다. 반짝이는 것 증후군은 실제로 존재하고, 마감이 요구사항이기보다는 권고에 가까운 학계 같은 세계에서는 예측 과제에 전혀 도움이 되지 않는 새로운 방법을 쫓느라 몇 달을 허비하게 만들 수 있다. 그 결과, 나는 새로운 방법을 추구할지 여부를 결정할 때 매우 신중해졌다. 데이터 구조와 그것을 만들어 내는 생물학적 과정이 방향 전환을 할지, 아니면 현재의 노선을 유지할지에 대한 내 결정을 이끌도록 최대한 노력한다. 새로운 코드를 한 줄이라도 구현하기 전에, 나는 스스로에게 다음과 같이 묻는 편이다:
  • 그 방법은 데이터를 만들어 내는 과정과 맞아떨어지는가? — 예: 결합 곡선은 기저에 있는 생화학적 직관을 갖고 있어, 맞춰야 할 매개변수의 수를 줄일 수 있다.
  • 데이터 구조가 해당 아키텍처에 이상적인 유형과 맞아떨어지는가? — 예: 이미지 데이터에는 2D CNN, 시퀀스에는 RNN.
  • 내 대상 데이터셋에 특정 방법을 적용할 때 발생하는 운영·현실적인 제약은 없는가? — 예: 단백질 구조 데이터를 다룰 때 전체 모델을 GPU 메모리에 적재할 수 있는가?
단백질–단백질 상호작용의 컨택트 맵을 예측하는 경우, 그래프 합성곱 신경망(GCN)은 위 세 가지 요건을 모두 충족한다. 단백질을 이루는 원자들은 여러 결합으로 연결되어 있으며, 각 원자가 결합하는 파트너의 수는 균일하지 않다. 따라서 단백질의 자연스러운 데이터 구조를 근사하는 데에는 2D나 3D CNN보다 그래프가 더 적합하다. 또한 GCN은 컨택트 맵 예측이라는 특정 문제에서 2D CNN 대비 의미 있는 성능 향상을 제공한다. 대칭적인 컨택트 맵의 경우 2D CNN은 사실상 동일한 값을 두 번 예측하게 되는 반면, 그래프 합성곱은 각 컨택트를 한 번만 예측하도록 설계할 수 있어 메모리 효율이 크게 향상된다.

장애물 극복하기

GCN은 딥러닝에서 비교적 새롭고 빠르게 발전하는 연구 분야다. 그 결과, 이러한 아키텍처를 구현하고 사용하는 과정은 이미지 데이터에 CNN을 적용하는 것처럼 이미 정립된 작업보다 꽤 더 어려울 수 있다. 나는 평균값만을 지속적으로 예측하는 현상, 매개변수 값이 오버플로되어 NaN이 발생하는 문제, 심지어 학습이 완전히 실패하는 경우까지 여러 흥미롭고 난해한 실패 양상을 겪었다. 실패 양상마다 고유한 디버깅 절차가 필요했지만, 모든 유형의 실패에 공통으로 꼭 필요한 기법이 하나 있었다. 바로 모델의 그래디언트에서 드러나는 패턴을 시각화하는 것이다.

왜 그래디언트인가?

모델 내부의 그래디언트 분포를 왜 시각화해야 할까요? 이미 손실이나 정확도 같은 목표 지표를 추적하고 있는데, 그 필요성이 바로 와닿지 않을 수 있습니다. 하지만 이러한 표준 성능 지표에 아무런 개선이 보이지 않을 때, 무엇을 근거로 다음 조치를 결정하시겠습니까? 여기서 한 가지를 상기하고자 합니다. 바로 옵티마이저가 매 스텝마다 사용하는 업데이트 규칙입니다:

여기서 Θ는 매개변수, α는 학습률, J는 현재 배치 또는 예시에 대한 손실 함수다. 이제 모델을 학습시키는 동안 그래디언트를 추적하는 이유가 조금 더 분명해졌을 것이다. 매개변수 업데이트에 영향을 주는 값은 학습률과 그래디언트 두 가지뿐이기 때문이다. 학습률은 일반적으로 고정되어 있으며(모든 옵티마이저에서 항상 그런 것은 아니지만), 대체로 그래디언트가 각 업데이트의 방향과 크기를 결정한다.

그래디언트와 매개변수

그래디언트가 매개변수 업데이트에 사용된다면 “그냥 모델의 매개변수 자체를 보면 되지 않나?”라고 물을 수 있다. 이에 대한 답은, 그래디언트가 담고 있는 정보량이 풍부하고 학습 과정의 어느 시점에서든 해석이 동일하다는 것이다. 그래디언트는 항상 현재 최적화 지형에서의 위치에 대해 이동해야 할 방향과 “기울기(가파름)”를 알려준다. 국소 최적점에 가까울수록, 국소 최적점에서 멀리 떨어져 있을 때보다 그래디언트의 크기는 일반적으로 더 작아진다. 게다가 정규화와 같은 방법은 매개변수의 스케일을 직접 제어하기 위해 존재하지만, 실험자가 그래디언트의 스케일을 직접적으로 제어하는 것은 훨씬 더 어렵다.

그래디언트 추세

시간이 지남에 따라 모델의 매개변수가 (국소) 최적값에 가까워질수록 모든 그래디언트가 점차 0에 수렴하는 경향을 보이는 것이 정상입니다. 학습이 진행될수록 그래디언트 분포의 분산이 증가하는 추세가 관찰된다면, 최적점을 지나치지 않도록 학습률을 낮추거나 정규화를 도입하는 등의 조치를 고려해 볼 수 있습니다.
모델의 매개변수가 최적값에 가까워질수록, 손실과/또는 정확도가 평탄해지기 시작하는 시점에 그래디언트 히스토그램이 0을 향해 줄어드는 모습을 보게 될 것입니다. 그래디언트가 줄어드는데도 정확도/손실이 기대한 수준에 미치지 못한다면, 국소 최적점에 도달해 갇혀 있을 가능성을 시사합니다. 이 경우, 학습률을 높이거나 정규화 제약을 완화하는 것이 도움이 될 수 있습니다.


모델의 두 매개변수 집합에 대한 그래디언트 분포로, 모델 정확도가 증가하고/모델 손실이 감소함에 따라 크기가 (잡음이 있긴 하지만) 감소하는 추세를 보여준다.

그래디언트 스케일

마지막으로 살펴볼 가치가 큰 패턴은 그래디언트 자체의 스케일이다. 그래디언트는 손실 함수를 매개변수에 대해 미분한 값이므로, 어떤 매개변수가 아주 작은 변화만으로도 특정 예시의 손실을 크게 바꿀 수 있다면, 중요하지 않은 매개변수에 비해 더 큰 도함수를 갖는 것이 자연스럽다. 네트워크의 서로 다른 레이어나 모듈 간 상대적 스케일에 주목하면, 정확한 예측에 핵심적인 구성요소와 보조적이거나 비중이 작은 구성요소를 가려내는 데 큰 도움을 얻을 수 있다. 모델의 서로 다른 부분으로 흐르는 그래디언트 크기 사이에 한 자릿수 이상(한 order of magnitude)의 차이가 보인다면, 특정 모듈이 필수적이지 않을 가능성을 시사하며, 경우에 따라서는 네트워크 성능에 실제로 해가 될 수도 있다.
최근에 이 요령을 활용해 내 모델 중 하나가 임베딩 레이어를 사실상 업데이트하지 못하고 있다는 것을 확인할 수 있었다. 대신, 임베딩 위에 얹힌 네트워크만이 임의 초기값에 맞춰 적응하고 있었다. 이에 따라, 그 위에 네트워크를 추가하기 전에 정보성을 갖춘 임베딩 레이어를 먼저 만드는 데 더 많은 시간을 들이면, 네트워크와 임베딩을 동시에 학습시키려는 접근보다 더 나은 결과를 얻을 가능성이 크다.
아래 예제에서는 무작위 노이즈를 주입하는 불필요한 모듈을 포함한 네트워크를 직접 다뤄 볼 수 있습니다. 학습 과정에서 중요하지 않은 구성요소가 네트워크 성능에 어떤 영향을 미치는지 직접 확인할 수 있을 것입니다.


같은 모델 내의 서로 다른 매개변수들이 작은 크기의 그래디언트(왼쪽)와 큰 크기의 그래디언트(오른쪽)를 보이는 사례.

그래디언트 시각화

Weights & Biases는 모델 학습 동안 그래디언트의 히스토그램을 직접 추적하고 시각화할 수 있는 훌륭하고 사용하기 쉬운 도구를 제공합니다. 학습 루프 전에 wandb.watch(model, log='all') 한 줄만 추가하면, 매 업데이트 단계마다 모델의 파라미터와 그 그래디언트 히스토그램을 W&B에서 확인할 수 있습니다. 여기에서 소개한 요령들을 활용해 다음 모델의 디버깅 시간을 크게 단축하시길 바랍니다!

라이브 예제




대부분의 사람이 단백질 접힘과 관련된 문제를 다루지 않기 때문에, 저는 다음과 같은 구현을 마련했습니다. Google Colab 노트북 여러분이 직접 그래디언트 시각화를 실험해 볼 수 있도록 준비했습니다. 좌측 상단의 “Open in playground”를 클릭해 모델을 직접 조작해 보세요. 학습률, 배치 크기, 모멘텀 등을 조정하면서 각 모델의 그래디언트 분포와 크기에 어떤 영향을 미치는지 감을 잡아 보세요.















이 글은 AI가 번역한 기사입니다. 오역이 의심되면 댓글로 알려 주세요. 원문 보고서는 다음 링크에서 확인할 수 있습니다: 원문 보고서 보기