파이톨치

[BoostCamp AI Tech] Transformer 본문

AI&ML/BoostCamp AI Tech

[BoostCamp AI Tech] Transformer

파이톨치 2024. 8. 16. 14:49
728x90

Attention 복습 

과거에는 LSTM과 같은 순환 신경망(RNN) 구조를 사용할 때 입력 시퀀스의 정보를 처리하는 데 한계가 있었습니다. LSTM은 입력 시퀀스를 하나의 요약 벡터로 압축한 뒤, 그 정보를 디코더가 활용해 출력을 생성했습니다. 그러나 이 방식은 정보의 양을 압축하는 과정에서 손실이 발생할 수 있으며, 시퀀스의 길이가 길어질수록 유용한 정보를 충분히 전달하기 어려웠습니다. 이는 모델이 한 번에 처리할 수 있는 정보의 "창"이 매우 제한적이었음을 의미합니다.

하지만 어텐션 메커니즘을 사용하면, 입력 시퀀스의 모든 요소에 언제든 접근할 수 있습니다. 즉, 정보를 제한된 요약 벡터에 압축할 필요 없이, 입력 시퀀스의 각 부분에서 필요한 정보를 직접 가져올 수 있습니다. 이로 인해 정보 창이 사실상 무제한이 되며, 모델이 시퀀스의 모든 부분을 고려할 수 있어 훨씬 더 풍부한 정보를 활용할 수 있게 됩니다. 다만, 이는 하드웨어 성능에 따라 처리 능력이 제한될 수 있습니다.

 

어텐션(attention) 메커니즘이 처음 등장했을 때, 주로 기계 번역과 같은 시퀀스-투-시퀀스(sequence-to-sequence) 작업에서 사용되었습니다. 여기서 어텐션은 입력 시퀀스(예: 문장의 단어들)와 출력 시퀀스(번역된 문장의 단어들) 사이의 관계를 학습하는 데 사용되었습니다. 이 방식은 입력과 출력 사이에만 어텐션을 적용했기 때문에 "인코더-디코더 어텐션"이라고도 불렸습니다.

하지만 이 어텐션 메커니즘은 시퀀스 내에서 모든 요소들이 서로의 관계를 고려하는 능력이 부족했습니다. 예를 들어, 한 문장의 단어들이 서로 어떻게 관련되어 있는지를 잘 이해하지 못할 수 있었습니다. 이를 해결하기 위해 "셀프 어텐션(Self-Attention)"이 등장했습니다.

Self-Attention의 등장 배경과 필요성

  • 시퀀스 내 요소들 간의 관계 학습:
    • 셀프 어텐션은 입력 시퀀스 내의 각 요소가 동일한 시퀀스 내의 다른 모든 요소들과 상호작용할 수 있도록 합니다. 예를 들어, 문장의 한 단어가 다른 모든 단어들과 관계를 형성할 수 있습니다. 이를 통해 시퀀스의 모든 부분이 서로 어떻게 연결되어 있는지 학습할 수 있습니다.
  • 병렬 처리 가능:
    • RNN 기반 모델들은 시퀀스를 순차적으로 처리하기 때문에 병렬 처리에 한계가 있었습니다. 반면, 셀프 어텐션은 시퀀스의 모든 요소들을 동시에 처리할 수 있기 때문에 병렬화가 가능합니다. 이는 모델의 학습 속도를 크게 향상시켰습니다.
  • 장기 의존성 문제 해결:
    • RNN과 같은 모델들은 긴 시퀀스에서 정보가 손실되거나 희석되는 문제가 있었습니다(장기 의존성 문제). 셀프 어텐션은 시퀀스 내의 먼 요소들 간에도 직접적인 상호작용을 가능하게 함으로써, 이 문제를 해결합니다.

Self-Attention의 핵심 아이디어

셀프 어텐션은 입력 시퀀스의 각 요소가 다른 모든 요소들과 얼마나 관련이 있는지를 학습하여, 각 요소가 시퀀스 내의 모든 다른 요소들로부터 정보를 집합적으로 고려할 수 있게 합니다. 예를 들어, 문장의 특정 단어가 다른 단어들과 얼마나 강하게 연결되어 있는지를 계산하고, 이를 바탕으로 해당 단어의 표현을 강화하거나 조정합니다.

결론

어텐션 메커니즘이 입력과 출력 시퀀스 사이의 관계를 이해하는 데 중점을 두었다면, 셀프 어텐션은 입력 시퀀스 내의 각 요소들이 서로 어떻게 연관되어 있는지를 이해하는 데 중점을 둡니다. 이로 인해 모델이 더 깊이 있는 이해를 통해 더 정교한 예측을 할 수 있게 되었습니다. 셀프 어텐션은 특히 Transformer와 같은 현대적 딥러닝 모델의 핵심 구성 요소로, 자연어 처리뿐만 아니라 다양한 다른 분야에서도 폭넓게 사용되고 있습니다.

Self-Attention의 구조

셀프 어텐션의 작동 방식

셀프 어텐션에서는 쿼리(Query), 키(Key), 값(Value)가 모두 입력 문장의 단어 벡터들입니다. 다음은 셀프 어텐션의 단계별 과정입니다:

  1. 쿼리, 키, 값 계산:
    • 입력 문장의 각 단어 벡터를 쿼리, 키, 값 벡터로 변환합니다. 이를 위해 각각의 벡터를 학습 가능한 가중치 행렬에 곱해줍니다.
  2. 유사도 계산:
    • 쿼리 벡터와 모든 키 벡터 간의 유사도를 계산하여 주의(attention) 점수를 얻습니다. 이 점수는 쿼리와 각 키의 관련성을 나타냅니다.
  3. 가중치 적용:
    • 계산된 유사도 점수를 소프트맥스(softmax) 함수에 통과시켜, 각 값 벡터에 얼마나 집중할지를 결정하는 가중치로 변환합니다.
  4. 가중합:
    • 이 가중치를 사용하여 값 벡터들을 가중합합니다. 이렇게 하면, 입력 문장 내의 각 단어가 다른 단어들로부터 정보를 얼마나 반영할지를 결정합니다.

Encoder에서 I am a student라는 문장이 들어 갔을 때의 예시이다. 전통적인 Attention 구조와 비슷하다. 

다만 Q, K, V를 뽑을 때 자기 자신만을 사용한다는 것이다!

 

이제 attention value를 FNN 층에 넣어주면 최종적인 출력을 얻을 수 있습니다. 

 

행렬 연산으로 변환

셀프 어텐션에서 행렬 연산을 사용하는 이유와 방법을 쉽게 설명해볼게요.

개념 이해: 벡터 vs. 행렬 연산

처음에 셀프 어텐션을 설명할 때는 각 단어마다 '쿼리(Query)', '키(Key)', '값(Value)' 벡터를 따로 계산했습니다. 이렇게 각 단어마다 따로따로 연산을 하는 방식은 이해하기 쉽지만, 실제로는 행렬 연산을 사용해서 한꺼번에 처리하는 게 훨씬 효율적이에요.

행렬 연산에서는 여러 단어의 벡터들을 모아서 큰 행렬(matrix)로 만들어놓고, 한 번에 연산을 처리합니다. 예를 들어, 문장 내 모든 단어에 대해 '쿼리', '키', '값' 벡터를 각각 구하는 대신, 모든 단어들을 하나의 행렬로 묶어서 연산합니다.

단계별로 이해해보자

쿼리(Q), 키(K), 값(V) 행렬 생성:

  • 문장에 있는 모든 단어 벡터를 모아서 하나의 큰 행렬을 만듭니다. 이 행렬에 가중치 행렬을 곱해주면, 각각의 '쿼리', '키', '값' 행렬(Q, K, V)이 만들어집니다. 즉, 단어 하나하나 따로 계산하지 않고, 한꺼번에 처리하는 거죠.

어텐션 스코어 계산:

  • '쿼리' 행렬(Q)와 '키' 행렬(K)을 곱해줍니다. 그런데 K는 그대로 곱하는 게 아니라, 전치(transpose)라고 해서 행과 열을 뒤바꿔서 곱합니다. 이렇게 하면, 각 단어의 '쿼리' 벡터가 다른 모든 단어들의 '키' 벡터와 내적(dot product)되어, 어텐션 스코어를 담은 행렬이 만들어집니다.
  • 이 어텐션 스코어는 각 단어가 다른 단어와 얼마나 연관이 있는지를 나타내요.

어텐션 스코어 정규화:

  • 계산된 어텐션 스코어 행렬의 값을 전체적으로 조정하기 위해서, 이 값을 나누고 소프트맥스(softmax) 함수를 적용합니다. 이 단계는 모든 스코어를 0과 1 사이의 확률값으로 변환하는 과정이에요.

어텐션 값 계산:

  • 마지막으로, 이 정규화된 어텐션 스코어 행렬에 '값(Value)' 행렬(V)을 곱해줍니다. 이 과정은 각 단어가 다른 단어와 얼마나 관련이 있는지를 고려해서, 최종적으로 조정된 벡터를 계산하는 거예요.

멀티 헤드 어텐션

기본 어텐션에서, 입력된 단어 벡터의 차원이 클 때(예: 512차원), 이를 작게 나눠서(예: 64차원으로 나눔) 처리하면 더 효율적으로 계산할 수 있습니다. 트랜스포머에서는 이 방법을 사용해서 여러 개의 어텐션 헤드를 동시에 사용합니다. 각 어텐션 헤드는 입력 데이터를 조금씩 다르게 해석하도록 학습됩니다. 1번 헤드는 문장 구조를, 2번 헤드는 단어간 의미를 해석하는 식으로 말입니다. 

 

멀티 헤드 어텐션의 장점은 다양한 시각에서 데이터를 분석할 수 있다는 것입니다. 예를 들어, 하나의 어텐션 헤드는 "그것(it)"이 "동물(animal)"과 관련이 있다는 것을 강조할 수 있고, 다른 어텐션 헤드는 "그것(it)"이 "피곤하다(tired)"와 더 관련이 있다는 것을 강조할 수 있습니다. 이렇게 각각의 헤드가 다른 특성을 학습하기 때문에, 모델은 입력 문장을 더 깊이 이해할 수 있습니다.

병렬 처리와 결합

모든 어텐션 헤드를 사용해 병렬로 계산한 후, 그 결과를 다시 하나로 결합(concatenate)합니다. 이렇게 결합된 결과를 최종적으로 가중치 행렬과 곱해서 멀티 헤드 어텐션의 결과물을 얻습니다. 이 과정에서 입력의 크기는 처음과 동일하게 유지됩니다.

728x90