ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자연어처리] Transformer 쉽게 풀어서 정리해드립니다.
    자연어처리 공부 2024. 1. 5. 20:25

    자연어처리에서 창의적인 아키텍처와 엄청난 학습량, 높은 성능으로 한 획을 그은 구글의 Transformer가 있습니다. Transformer 아키텍처는 "Attention Is All You Need" 논문에서 처음 소개되었습니다. 이 모델은 기존의 순환 신경망(RNN)이나 장단기 메모리(LSTM), 게이트 순환 유닛(GRU) 등의 기존의 순차적인 아키텍처를 사용하지 않고, Attention 메커니즘을 중심으로 구성되어 있습니다. 

     

    "Attention Is All You Need. Concentration is All I Need, Also."

     

    저는 이 모델을 이해하기 위해 많은 노력과 집중력을 필요했습니다. 그래서 "Attention Is All You Need. Concentration is All I Need, Also." 제 감정을 이렇게 표현하고 싶네요 ^^ㅠ 그런 만큼 저 또한 잊어버리지 않게 최대한 쉽게 써보려고 합니다. 이름에서 알 수 있듯 Transformer는 번역기입니다. 기계번역을 예시로 설명을 하도록 하겠습니다. 또한 이해하기 쉽게 찾아보면 가장 흔한 포루투갈어를 영어로 번역하는 것의 매커니즘을 예로 들겠습니다.

     

    • 번역이라는 것은 하나의 언어를 다른 하나의 언어로 바꾸는 것입니다. 그렇게 때문에 저희는 두 개의 언어로 만들어진 번역된 쌍을 가지고 있어야 합니다. 또한 각 언어에 맞는 토크나이저가 필요합니다. 
    • 번역되는 언어인 영어는 훈련을 시켜야하기 때문에 한 칸씩 밀린 벡터로도 만들어져야 합니다. 따라서 총 3개 벡터 완성.
    • 이 벡터들은 각은 input 형식으로 들어가야 하기 때문에 max_tokens에 맞춰 패딩을 시킵니다. (to_token을 사용하면 자동으로 패딩됨)
    • 단어들을 기계가 인식하고 계산할 수 있도록 임베딩시켜줍니다
    • Transformer는 시계열을 알만한 레이어나 아키텍쳐가 없습니다. 따라서 cos, sin을 이용하여 순서를 식별할 수 있는 인코딩을 추가하여 임베딩된 input데이터와 합해줍니다. 그러면 딥러닝이 잘하는 패턴인식을 활용하여 단어의 위치 정보를 모델이 알 수 있게 됩니다.
    • self-attention을 통해 input으로 들어온 임베딩 단어를 Query, Key, Value 벡터를 통해 같은 문장 내에서 단어들 간의 유사도를 구할 수 있도록 훈련시켜줍니다. 구한 유사도를 가지고 scaling을 하는데 그 이유는 너무 값이 커지면 softmax를 계산할 때 값이 커져 기울기를 찾기 어려워서 back propagation을 하지 못하기 때문입니다. 스케일링 후에 softmax에 넣어서 value vector와 합성곱을 하여 self-attetion을 마칩니다. 이를 통해 하나의 단어가 모든 단어와의 관계를 고려하면서 가중치가 업데이트되고 단어 간의 의존성을 파악하여 문맥상 유사한 단어끼리 유사성을 높일 수 있기 때문입니다.
    • Self-Attention을 여러 개의 헤드로 나누어 병렬로 계산함으로써 GPU를 사용해 계산이 빨라지고 더 많은 데이터를 학습시킬 수 있습니다. 또한 나누어 계산함으로써 다르게 나온 결과들을 합하여 평균적인 더 높은 성능의 가중치를 얻을 수 있게 됩니다.
    • 나온 벡터를 잔차를 연결하여 기울기 소실을 방지하고 정규화시켜 빠르게 학습할 수 있도록 scale을 조정해줍니다.
    • 입력이 네트워크를 통과하면서 각 층의 노드에서 가중치와 결합되고 활성화 함수를 통과하면서 비선형성을 모델링하고 패턴을 찾아내거나 추상화하면서 데이터의 의미 있는 정보를 추출하고 일반적인 패턴을 찾아냅니다.
    • 인코더 중 가장 마지막 인코더를 탑 인코더라고 부르는데 탑인코더에서 나온 포루투갈어의 K, V 벡터가 디코더의 인코더-디코더 어텐션으로 준비가 됩니다.
    • 이제는 기존에 만들었던 영어의 임베딩된 단어들을 위치 인코딩과 결합하여 디코더의 인풋으로 준비합니다. 그 후 영어 단어들도 Multi-head attion을 거칩니다. 하지만 디코더는 text generation을 해야하기 때문에 self-attention에서 뒤에 나온 것을 미리 알 수 없습니다. 따라서 아직 나오지 않은 순서의 뒷부분은 마스킹 처리를 해줍니다. 이 또한 잔차 연결과 정규화를 거쳐 원하는 정보를 질의할 수 있는 대상이 되는 Q들이 만들어졌습니다.
    • 영어 부분에서 만든 Q와 포루투갈어에서 만든 K,V을 가지고 인코더-디코더 어텐션을 합니다. 이는 디코더가 현재 단어를 생성하려고 할 때, 디코더의 해당 위치에서 인코더의 각 단어에 대한 중요도를 결정하는 attention 가중치가 계산됩니다.
    • 그 후 Feedforward 네트워크를 통해 디코더가 입력 시퀀스에서 중요한 정보를 어떻게 찾아내고 활용하는지에 대한 가중치를 얻습니다. 디코더는 현재 생성 중인 단어와 관련이 있는 인코더의 단어를 강조하여 선택합니다. 
    • 그 후 linear와 softmax 과정을 거쳐 가장 확률 높은 단어를 선택하게 되고 문장이 생성됩니다. 

     

    transfomer는 시퀀스 데이터에 사용되는 RNN(LSTM 포함), CNN을 사용하지 않았습니다. 그런데도 positional encoding으로 위치 정보를 넣어주었습니다. 또한 기존 시퀀스 관련 모델들은 토큰 하나하나 넣어줄 때 있었던 길이가 깊어지면 기울기 소실이 발생하는 문제와 time step순으로 순차적으로 처리하면서 메모리와 계산량이 많았고 비효율적이고 느렸습니다. 하지만 RNN을 사용하지 않게 되면서 병렬처리가 가능해졌고 GPU 효율을 극대화시키면서 더 많은 데이터들을 빠르게 학습시킬 수 있었고 그러면서 모델의 크기와 성능이 향상되었습니다. 또한 기존 모델은 time step별로 토큰을 넣으면서 순서에 종속되어 state vector값이 만들어졌고 순서와 문맥에 따라 그 벡터가 달라져서 transfer learning을 하기 어려웠는데 time step별로 넣는 것을 없앰으로써 전이학습이 가능해졌습니다. 또한 토큰 하나하나씩이 아닌 self-attention을 도입하면서 문장 전체를 한 번에 유사도를 계산하고 multi-head attention으로 각기 다른 시각으로 얻어진 결과값을 종합하면서 인코더 부분에서는 문장을 더 잘 이해하게 되고 의미를 더 잘 파악하게 되고 디코더 부분에서는 더 자연스러운 text generation이 가능하게 되었습니다. 대단한 모델이며 이런 매커니즘을 어떻게 생각해내었는지 너무 놀랍고 경이롭네요 ㅎㅎ ^^

     

     

    transfomer 꼭 알아둘 것들: positional encoding, self-attention, multi-head attention, masking

Designed by Tistory.