의료 AI(딥러닝) 공부 일기

CH 04-0. Deep Learning for Biomedical sequence

ignuy 2024. 7. 9.

Sequence data modality

NLP를 생각하는 것이 가장 쉽게 biomedical sequence data의 modality를 이해하는 방법일 것이다. 그냥 긴~~ 책이라고 생각하자. 이 긴~~ 책 머신러닝적으로 어떻게 처리할 것인가를 다룰 것이다. 초반부터 이런 데이터들을 상당히 많이 접해왔다. DNA, RNA, Protein sequence, Compound SMILES 표현 등등 biomedical 분야에서 상당히 다양한 data가 존재한다.

bio, chemi 논문들은 문제가 되는 sequence에 대해서 일일히 엑셀 형태로 정리를 해둔다. 그렇게 모이게된 데이터들을 가지고 문제 해결에 뛰어들게 될 것이다.

BERT라는 Transformer 모델을 기반으로 PubMed, PMC 등의 사이트에서 data를 가져와 Pretrained model을 만든다. 그 후 일반적으로 문제 해결을 위한 특별히 구축된 dataset(task-Specific Dataset)을 기반으로 Fine-tuning을 진행한다.

DNA

ATGC, 오직 4개의 염기가 서열을 구성하기 때문에 Token을 만들기 굉장히 쉽다. 이런 염기들을 묶어서 subword처럼 처리하기도 한다.

RNA

AUGC, 4개의 염기가 서열을 구성한다.

Portein

20가지 아미노산으로 연결된 Sequence data이다. Druggable Target으로 연구에 활용된다. alphafold가 이 protein sequence 데이터를 3D로 바꾸는 혁신적인 연구를 선보였다. 다양한 representation 방법이 있고 가장 간단하게는 20개의 amino acid로 one-hot encoding하는 방법이 있다.

Compound

원자들과 화학적 결합으로 이루어져 있는데 여기도 다양한 Representation 방법이 존재한다. 우리는 이미한번 Morgan Fingerprint로 data를 표현했었다.

Data representation

Onehot Encoding

데이터를 0과 1의 조합을 가진 테이블로 나타내는 방법이다. 원래는 vocab이 많을 때, Onehot encoding 방식을 채택하면 메모리 이슈가 생길 수 있지만 Biomedical 분야는 token이 별로 없어서 onehot encoding 방식을 사용해도 큰 무리가 없다. 하지만 Subword embedding할 때는 제외하자.

One hot encoding 방식은 치명적인 맹점이 있는데 벡터 내에 0이 매우 많고, 1이 적은 Sparse Representation(희소 표현) 문제가 발생하게 되면 0이 weight에 많이 곱해져서 weight 효과가 사라진다. 이를 1D-CNN, Learnable Embedding, Pretrained Embedding으로 해결한다.

Lookup table

One-hot encoding의 경우 데이터 사이즈가 너무 크기 때문에 이를 vector화 하여 float 형태 데이터로 데이터 사이즈를 줄여 놓는 것을 Lookup table이라고 부른다.

Learnable Embedding

1D CNN

1차원 CNN으로 단어들의 local feature를 담아서 연산하는 방법도 있다. 1D CNN에 RNN을 붙이는 방식을 추후에 직접 시도해 보며 learnable embedding을 local하게 뽑아내는 시도를 해 볼 것이다.

Word Embedding

단어들 간에 유의미한 벡터를 뽑아내는 것이다. 비슷한 의미의 단어들끼리 묶어 주는 방법이다. 학습을 통해서 단어 간의 의미를 규정한 벡터를 만들어내고 이를 활용한다.

Gene & Protein & Molecular Embedding

Gene과 Protein, Molecular 도 유의미한 벡터로 표현가능하다.

BioWordVec

+ NLP max sequence length

NLP를 처리할 때 variable length를 처리한다고 하지만 max sequence length를 정해놓고 처리하게 된다.

RNN Background

RNN을 공부하기 전에!! RNN의 Background 지식으로 몇가지 알고가자.

CNN을 어떻게 1D로 처리하는가

image 처리할때는 2D, 3D로 처리하는 것이 보통이었던 CNN을 1D로 처리하는 이유와 방법을 공부해보자.

CNN을 1D로 처리하면 한 방향으로 data를 처리하기 때문에 마치 시계열 데이터를 다루는 것처럼 보인다.

상당히 활용도를 높일 수 있다. NLP 분야 뿐만아니라, Purse data를 분석할 수도 있다. sequential한 데이터라면 local feature를 뽑는데에 특화된 CNN을 고려해볼 수 있을 것이다.

Directed acyclic computational graph

얽히고 섥힌 그래프는 아니지만 시간의 순서에 맞게 배열되어있는 graph이다. 시간은 왼쪽에서 오른쪽으로 흐른다.

자 여기서, 우리가 CNN 처음에 공부할 때 Fully connected network로 바로 무식하게 훈련시켜서 하면 성능이 나오지 않을까?를 먼저 고민해보자.

 불가능한 방법은 아니다. 데이터가 많고 weight sharing을 사용하지 않아도 가능은 하다. 가능만 하다. 성능은 무시하는 결과가 나오겠지…

RNN(Recurrent Neural Network)

RNN은 Sequential한 데이터를 다루기 위한 네트워크이다.

CNN과의 비교

  • CNN
    • Grid 형태의 input (e.g image)
    • Wide and tall image
    • Images of variable size
  • RNN
    • Sequential value
    • Long sequences 처리 가능
    • 다양한 길이 Sequential 데이터

Parameter Sharing(weight sharing)

CNN에서는 local feature를 처리하기 위한 weight sharing이 들어갔다면 RNN은 time에 대한 weight를 sharing 하기 위해 들어간다. 따라서, 반복되는 신호에 대해서 처리할 수 있다.

weight sharing을 사용하는 것이 위의 MLP를 무식하게 사용하는 것보다 일반화된 성능 향상을 기대할 수 있을 것이다.

Traditional Machine Learning For Sequenctial Data

Hidden State

RNN 층이 출력하는 값을 Hidden state라고 한다. 시계열 데이터를 처리할 때는 hidden factor를 다루게 될 것이다. RNN은 이 전에 계산했던 weight에 대해서 hidden factor로 서로 상관관계를 약하게 또는 강하게 찾는 과정이다.

CoViD19의 비슷한 sequence를 hidden factor를 통해서 변종을 찾아낼 수 있고, Biomedical에서는 Hidden Markov Model(HMM)로 대부분 연구가 진행되어 왔었다(지금은 상황이 조금 다르다).

왼쪽 예시처럼 h(t) = (x(t), h(t - 1)) 로 연산이 recurrent하게 이루어 질 것이다. 전체적인 구조는 오른쪽 예시와 같다.

이전 hiddent state를 가지고 현재 input vetor와 함께 function f에 집어 넣으면 새로운 state가 나오게 되는 구조이다. 여기서 매 스텝마다 parameters는 sharing되게 된다.

Activation function

RNN의 Activation function으로는 tanh나 ReLU를 많이 사용한다.

만약 Activation function으로 Sigmoid 함수가 사용된다면 출력 값이 0과 1사이로 압축되고 입력 값이 커질 수록 출력 값의 변화가 작아지는데, 이는 역전파 과정에서 기울기를 매우 작게 만든다. RNN은 많은 시간 단계에 걸쳐 역전파를 수행하기 때문에, 초기 단계로 갈수록 기울기가 점점 작아져 거의 0에 가까워진다. 이를 기울기 소실(gradient vanishing) 문제라고 하는데 이로 인해 모델이 과거의 정보를 잘 학습하지 못하게 된다. 이 뿐만 아니라, Sigmoid 함수는 출력이 0.5 근처에 몰리는 경향이 있어, 학습 초기에 가중치가 무작위로 초기화되면 출력이 모두 비슷한 값이 되어버린다. 이는 RNN의 초기 학습 단계를 비효율적으로 만든다. 학습이 천천히 진행되고, 모델이 다양한 출력을 생성하는 데 어려움을 겪게 된다.

Stacking RNN & Biderectional RNN

Vanishing or Exploding Gradient

역전파 과정중에 기울기가 점점 작아지거나 점점 커지는 문제를 나타낸다.

Vanishing Gradient 문제 같은 경우 Activation function으로 sigmoid나 tanh를 사용할 때 자주 발생한다. 기울기가 너무 작아지면 네트워크의 초기 층이 거의 학습하지 못하며 모델이 먼 과거의 정보를 기억하는것이 어려워진다. 이를 통해 장기적인 의존 관계를 학습하는데 어려움을 겪게 된다.

Exploding Gradient 문제는 역전파 과정중에 기울기가 너무 커져 가중치가 비정상적으로 커지게 되고 학습이 불안정해지면서, 네트워크가 발산할 수 있다. 이로써 학습이 불가능해지거나 불안정해진다.

Truncated Backpropagation Through Time (TBPTT)

RNN의 전체 시퀀스를 통해 back propagation을 수행하면 계산 비용이 너무 커지므로 쪼개서 계산하면 효율적인 연산을 할 수 있지 않을까해서 고안되었다.

Gradient Clipping

Exploding Gradient 문제를 해결하기 위한 방법이다. 기울기가 너무 커지는 경우, 이를 일정 임계값으로 잘라내는 기법입니다.

GRU(Gated Recurrent Units)

LSTM을 simplify한 모델로 구조가 단순하며 LSTM보다 계산이 더 효율적이다. 또한 파라미터를 맞췄을 때, LSTM과 비슷한 성능이 나온다. 이전 state를 기반으로 gate를 통해서 그대로 이전 정보를 받아들이는데, time stamp마다 다른 정도로 state를 받아들이는 기법이다.

GRU의 구성 요소

GRU는 두 가지 중요한 게이트(gate)를 가지고 있다:

  1. 업데이트 게이트 (Update Gate): 새로운 정보와 이전 상태를 얼마나 업데이트할지를 결정
  2. 리셋 게이트 (Reset Gate): 이전 상태를 얼마나 잊을지를 결정

GRU의 동작 방식

  • 입력: 현재 시점의 입력 x_t와 이전 시점의 hidden state h_t−1를 받는다.
  • 리셋 게이트 계산
    • r_t=σ(W_r x [h_{t−1},x_t]) 여기서 σ는 시그모이드 함수, Wr는 리셋 게이트의 가중치
    • 리셋 게이트 r_t는 현재 입력 x_t와 이전 숨겨진 상태 h_{t−1}를 사용하여 계산된다.
  • 업데이트 게이트 계산
    • z_t=σ(W_z x [h_{t−1},x_t]) 여기서 Wz는 업데이트 게이트의 가중치
    • 업데이트 게이트 z_t도 비슷하게 현재 입력 x_t와 이전 숨겨진 상태 h_{t−1}를 사용하여 계산된다.
  • 새로운 메모리 내용 계산
    • h~t=tanh(W x [r_t x h{t−1},x_t]) 여기서 W는 새로운 메모리 내용을 계산하는 가중치
    • 리셋 게이트 r_t를 사용하여 새로운 메모리 내용을 계산한다. 리셋 게이트는 이전 상태를 얼마나 잊을지를 결정한다.

    • 최종 숨겨진 상태 계산
      • h_t=(1−z_t) ⋅ h_{t−1} + z_t ⋅ h~_t 업데이트 게이트 z_t는 새로운 정보와 이전 정보를 어떻게 조합할지를 결정
      • 업데이트 게이트 z_t를 사용하여 이전 상태 h_{t−1}와 새로운 메모리 내용 h~_t를 조합하여 최종 숨겨진 상태를 계산

댓글