반응형

Transformer 개념에 대해  정리한 글입니다. 

 

2023. 11. 11 최초작성



시퀀스 데이터(sequence data)

시퀀스 데이터는 “나는 고양이가 좋다”처럼 순서가 있는 단어의 나열이나 하루의 온도 같은  순서가 있는 수치의 나열 등을 의미합니다. 본 글에서는 시퀀스 데이터를 단어의 나열로 구성된 문장 또는 문장으로 구성된 텍스트를 의미한다고 가정하겠습니다. 

    



시퀀스 변환(sequence transduction) 모델

시퀀스 변환 모델은 시퀀스 데이터를 입력으로 사용하여 다른 형태의 시퀀스 데이터를 출력하는 모델을 의미합니다. 예를 들어 영어 문장 "Hello, how are you?”을 입력으로 사용하여 한국어 문장  "안녕하세요, 어떻게 지내세요?”를 출력하는 것입니다. 또는 문서를 짧은 글로 요약하거나 음성을 텍스트로 변환하는 것도 시퀀스 변환의 한 예입니다. Transformer도 시퀀스 변환 모델 중 하나입니다.



트랜스포머 논문이 나온 시점인 2017년에 주요한 순차 변환 모델은 순환 신경망(Recurrent Neural Networks, RNN) 또는 합성곱 신경망(Convolutional Neural Networks, CNN) 기반이었습니다.

 

트랜스포머는 RNN의 장기 의존성 문제와 CNN의 지역적인 정보 처리 한계를 개선하기 위해 등장하였습니다.  트랜스포머는 "어텐션 메커니즘"을 사용하여 RNN의 장기 의존성 문제와 CNN의 지역적인 정보 처리 한계를 해결하려고 했습니다. RNN은 시퀀스 데이터를 처리할 때 이전 상태의 정보를 현재 상태에 전달하는 방식으로 작동합니다. 이로 인해 장기 의존성을 처리하는 데 어려움이 있습니다. 반면, CNN은 지역적인 패턴을 잘 감지할 수 있지만, 전체 시퀀스 내에서의 긴 범위의 의존성을 파악하는 것에 한계가 있습니다. 트랜스포머는 어텐션 메커니즘을 통해 입력 시퀀스의 모든 단어 간의 관계를 동시에 계산할 수 있게 되었습니다. 특히 "멀티-헤드 어텐션"은 다양한 관점에서 어텐션을 계산하여 풍부한 문맥 정보를 포착할 수 있게 합니다. 이러한 어텐션 메커니즘 덕분에 트랜스포머는 시퀀스 내의 장거리 의존성을 효과적으로 처리할 수 있게 되었습니다.



토큰

자연어 처리(NLP)에서 토큰(token)은 일반적으로 텍스트의 최소 단위를 의미합니다. 다양한 토큰화 방법이 있기 때문에 토큰의 정의는 사용하는 방법에 따라 약간 다를 수 있습니다. 그중 하나가 단어 토큰화로 단어 하나를 토큰으로 보는 것입니다. 예를 들면, “순이는 창문을 닫았다.”라는 문장을 단어 토큰화하면 “순이는”, “창문을”, “닫았다”로 분리됩니다.



임베딩

임베딩(Embedding)을 통해 토큰을 고정된 크기의 벡터로 변환합니다. 벡터는 하나의 단어인 토큰을 수치화된 형태로 바꾼 것입니다. 벡터를 임베딩이라고 부르기도 합니다. 

 

대부분의 단어 임베딩 알고리즘은 고차원의 데이터를 저차원의 벡터 공간으로 변환하는 차원 축소 기술을 사용합니다. 이를 통해 단어들 간의 관계를 보다 효과적으로 캡쳐할 수 있습니다. 임베딩은 학습 데이터에 크게 의존합니다. 즉, 임베딩이 학습된 문서나 텍스트의 특성에 따라 결과가 달라질 수 있습니다. 예를 들어, 의학 관련 텍스트에서 학습된 임베딩은 의학 용어들 간의 관계를 잘 반영할 것이며, 일반적인 뉴스 기사에서 학습된 임베딩은 일상적인 단어들의 관계를 더 잘 반영할 것입니다. Word2Vec, GloVe, FastText, BERT, Sentence BERT와 같은 다양한 단어 혹은 문장 임베딩 방식이 존재합니다. 각기 다른 방식은 단어와 문맥의 관계를 다르게 캡쳐할 수 있습니다.



어텐션(Attention)

트랜스포머의 핵심은 어텐션입니다. 어텐션 메커니즘은 모델에게 한 단어의 의미를 파악할 때 어떤 단어들을 참조할지 선택하게 합니다. 예를 들어, "The boy is holding a blue ball."이라는 문장에서 'ball'의 의미를 파악할 때 'blue'와 'holding'을 참조합니다. 반면에 'blue'의 의미를 파악할 때 'boy'를 참조하지 않습니다.



트랜스포머는 셀프 어텐션 메커니즘을 활용하여 입력 시퀀스 내의 단어들 사이의 연관성을 캡처합니다. 이 메커니즘은 문장 내의 특정 단어가 주변 문맥과 어떻게 연결되는지 의미가 무엇인지 정확하게  파악하는 데 도움을 줍니다.

 

예시로, "The cat drank the milk because it was hungry."와 "The cat drank the milk because it was sweet."라는 두 문장이 있을 때, 첫 문장에서의 'it'은 'cat'을 참조하고, 두 번째 문장에서의 'it'은 'milk'를 참조합니다. 트랜스포머의 셀프 어텐션 메커니즘은 이러한 문맥적인 참조를 정확하게 파악하여 각 단어의 의미와 그들 사이의 관계를 정확하게 이해합니다.



문장의 의도와 의미에 대한 더 많은 뉘앙스를 처리할 수 있도록 트랜스포머에는 각 단어에 대한 여러 주의력 점수가 포함되어 있습니다.예를 들어 'it'이라는 단어를 처리하는 동안 첫 번째 점수는 '고양이'를 강조하고 두 번째 점수는 '배고픈'을 강조합니다. 따라서 예를 들어 'it'이라는 단어를 다른 언어로 번역할 때 '고양이'와 '배고프다'의 두 가지 측면을 번역된 단어에 통합하여 해독할 수 있습니다.



비슷한 문맥 또는 의미를 가진 단어나 서로 관련 있는 단어는 유사도가 높기 때문에 벡터 공간에서 가까이 위치하게 됩니다. 예를 들어 ‘노트북’과 ‘컴퓨터’는 유사한 의미를 가지기 때문에 벡터 공간에서 가까이에 위치하게 됩니다. ‘연필’과 ‘지우개’는 서로 직접적인 유사한 의미는 갖고 있지 않지만 관련 있는 단어이기 때문에 자주 같이 텍스트에 나타날 수 있습니다. 그래서 이 두 단어는 벡터 공간에서 가까이에 위치할 수 있습니다.

 

어텐션 메커니즘은 토큰(단어)들 간의 유사성이나 관련성을 측정하기 위해 토큰(단어)을 수치화된 형태인 벡터(임베딩)으로 변환하고 이들 간의 내적을 계산함으로써 유사도를 측정합니다. 이 유사도는 두 토큰이 의미와 문맥 측면에서 얼마나 비슷한지 혹은 관련있는지를 나타내는 점수인 정렬 점수(alignment score)로 표현됩니다. 

 

아래 두 문장에서 동사 “닫았다”가 비슷한 의미로 사용되므로 두 문장에 있는 동사 “닫았다”의 유사도는 높습니다.  어텐션 메커니즘에서 이 두 단어의 벡터(임베딩)에 대한 내적값은 커져 alignment score'(정렬 점수)가 높아집니다.

  • 순이는 창문을 닫았다.
  • 그녀는 서랍을 닫았다.

 

아래 경우는 “닫았다”가 두 개의 문장에서 다른 의미로 사용된 경우로 두 문장에 있는 동사 “닫았다”의 유사도는 낮습니다. 어텐션 메커니즘에서  두 단어의 벡터(임베딩)에 대한 내적값은 작아져 alignment score'(정렬 점수)가 작아집니다.

  • 순이는 창문을 닫았다.
  • 그는 마음을 닫았다.





어텐션은 문장 내의 단어들 사이의 관계를 평가하여, 특정 단어를 이해하는데 중요한 역할을 하는 단어들이 어떤 것들인지 파악합니다.  즉 특정 단어를 해석할 때 다른 단어들의 영향을 얼마나 받는지 판단합니다. 예를 들어 두 가지 뜻이 있는 동사 “닫았다”를 살펴봅시다.  "순이는 창문을 닫았다."란 문장에서 "닫았다"를 이해하는 데 "창문을"과 “순이는”가 큰 영향을 줍니다.  또 다른 문장인 “그는 마음을 닫았다.”란 문장에서 “닫았다”를 이해하는 데 “마음을”이 큰 영향을 줍니다.  똑같은 동사 “닫았다”이지만 문장에서 같이 사용된 단어에 따라 “닫았다”의 뜻이 다릅니다. 이렇게 어텐션은 단어간의 관계를 파악하여 문장의 전체 의미를 더 잘 이해하도록 도와줍니다.



어텐션을 적용하기 전에,  토큰(단어)들의 초기 위치는 "일반적인 의미"에만 기반을 둡니다. 어텐션 메커니즘이 포함된 인코더 레이어를 여러 번 거칠 때마다, 토큰(단어)이 그 주변의 토큰(단어)들과 어떻게 관련되어 있는지를 더 잘 반영하기 위해 벡터(임베딩)위치가 업데이트 됩니다."

 

어텐션 레이어는 쿼리, 키, 값이라는 세 가지 파라미터의 형태로 입력을 받습니다. 세 매개변수 모두 구조가 유사하며, 시퀀스의 각 단어는 벡터로 표현됩니다. 어텐션 함수는 벡터 형태인 쿼리(Query), 키(Keys), 값(Values)을 사용하여 값에서 집중해야 하는 부분을 찾는 과정입니다. 

 

쿼리(Query) : 어떤 정보에 주목해야 하는지 나타내는 벡터입니다. 

키(Keys) : 각 데이터 조각이나 위치를 대표하는 벡터들입니다. 쿼리와 키를 비교하여 쿼리가 어떤 부분에 주목해야 하는지 결정합니다. 어떤 값들이 쿼리와 얼마나 관련이 있는지를 나타냅니다.

값(Values) : 실제로 정보를 담고 있는 벡터들입니다. 키와 매칭되며, 쿼리가 특정 키에 주목할 때, 그 키에 해당하는 값이 결과로 선택됩니다.

 

키와 쿼리의 내적을 통해 키와 쿼리의 유사도를 계산합니다. 내적으로 구한값을 값(Values)의 가중치로 사용합니다.  내적 값이 크면 키와 쿼리가 더 유사하다는 것을 의미하고, 그 결과로 해당 값(Values)을 더 많이 고려하게 됩니다. 반대로 내적 값이 작으면 키와 쿼리가 덜 유사하므로 해당 값(Values)은 덜 고려하게 됩니다. 이 유사도를 소프트맥스 함수에 통과시켜 0~1 사이의 확률로 바꾸는데 이 결과를 가중치로 사용하여 값(Values)에 곱하여  벡터를 얻습니다.



인코더와 디코더

트랜스포머, RNN, CNN이 시퀀스 처리를 위한 모델로 사용될 때, 특히 기계 번역과 같은 태스크에서는 "인코더(encoder)"와 "디코더(decoder)"라는 두 부분으로 구성되어 있습니다. 인코더는 원문의 정보를 압축하여 벡터로 변환하는데 사용되며, 디코더는 이 압축된 정보를 바탕으로 목표 시퀀스를 생성하는 데 사용됩니다.



트랜스포머는 6개의 인코더와 6개의 디코더로 구성되는데 모든 인코더와 디코더는 같은 구조를 가지고 있습니다. 이렇게 여러 개의 인코더와 디코더를 사용하는 이유는 모델의 표현력을 높이고, 복잡한 패턴과 상호작용을 더 잘 잡아내기 위함입니다.

 

 



위 그림에서 보여주고 있는 트랜스포머의 주요 구성요소는 다음과 같습니다.

 

1. 입력 시퀀스(Input Sequence) : 문장이나 단어들의 연속으로 구성된 입력 데이터입니다.

 

2. 임베딩 및 위치 인코딩(Embedding & Position Encoding) : 입력 시퀀스의 각 토큰(단어)을 벡터 형태로 변환하는 임베딩과 단어의 위치 정보를 제공하는 위치 인코딩입니다. 토큰을 벡터 형태로 변환시 위치 정보가 없기 때문에 별도로 위치 인코딩을 하여 임베딩 벡터에  위치 인코딩 벡터를 더하게 됩니다.

 

3. 인코더(Encoder): 그림상으로 보면 인코더는 6개의 인코더 레이어로 구성되어 있습니다. 각 인코더 레이어는 셀프 어텐션 레이어와 피드 포워드 레이어로 구성됩니다. 셀프 어텐션 레이어는 입력 시퀀스 내의 단어들 사이의 상호 관계를 분석하고 학습하는 역할을 수행합니다. 이는 각 단어가 전체 문맥 속에서 어떻게 위치하는지를 모델에게 이해시키는 데 중요합니다. 이를 통해, 모델은 입력 시퀀스 내의 각 단어가 가진 문맥적 의미를 파악하고, 이 정보를 바탕으로 후속 처리를 위한 정보를 조합합니다. 피드 포워드 레이어는 셀프 어텐션 레이어의 출력에 비선형 변환을 적용하여, 각 단어 또는 단어 조합의 표현을 더욱 풍부하게 만듭니다. 

 

인코더의 각 레이어를 거치면서, 모델은 점점 더 넓은 범위의 문맥을 고려할 수 있게 되며, 이는 특히 장거리 의존성이 있는 언어 구조를 처리할 때 중요합니다. 예를 들어, 문장의 처음에 나오는 단어가 문장의 끝 부분에 큰 영향을 미칠 수 있는데, 인코더는 이러한 관계를 정확히 이해하고 인코딩할 수 있습니다. 

 

4. 목표 시퀀스(Target Sequence) : 출력을 생성하는 데 사용되는 시퀀스입니다. 주로 훈련 과정에서 사용됩니다.

 

5. 디코더(Decoder): 그림상으로 보면 인코더와 마찬가지로 디코더에도 6개의 디코더 레이어가 쌓여 있습니다. 각 디코더 레이어는 셀프 어텐션 레이어와 피드 포워드 레이어, 그리고 인코더-디코더 어텐션 레이어로 구성되어 있습니다. 셀프 어텐션 레이어는 현재 생성되어야 할 단어가 이전에 디코더에 의해 생성된 단어 시퀀스와 어떻게 관련되는지를 모델에게 이해시키는 데 중요합니다. 이를 통해 모델은 각 단어의 문맥적 의미를 파악하고, 다음 단어를 예측할 때 이전 단어들의 정보를 바탕으로 적절한 선택을 할 수 있도록 합니다. 셀프 어텐션은 디코더의 각 단계에서 생성된 단어들에 대한 정보를 계속해서 통합하면서, 모델이 전체 시퀀스에 걸쳐 효과적으로 정보를 조율하고 활용할 수 있도록 지원합니다. 인코더-디코더 어텐션 레이어는 디코더가 인코더의 출력과 어떻게 상호 작용할지를 결정합니다. 이는 디코더가 입력 시퀀스의 어떤 부분에 주목해야 할지를 배우도록 도와줍니다. 피드 포워드 신경망은 셀프 어텐션과 인코더-디코더 어텐션 레이어의 출력에 추가 변환을 적용합니다.

 

6. 출력 시퀀스 생성(Generate Output) : 최종적으로 디코더에서 생성된 정보를 바탕으로 원하는 시퀀스를 출력합니다.



좀 더 상세히 트랜스포머 구조를 살펴보겠습니다.



잔여 연결

잔여 연결(residual connection)은 입력 데이터가 하나 이상의 레이어를 건너뛰어 레이어를 통과한 출력과 더하는 방식으로 작동합니다. 이를 통해 깊은 네트워크에서 발생할 수 있는 그라디언트 소실 문제를 완화하고 모델의 학습을 안정화시킵니다.

 

아래 그림에서는  Feed-forward 레이어를 건너뛰는 화살표와 Self-Attention 레이어를 건너뛰는 화살표가 그려져 있는데, 이는 잔여 연결을 나타냅니다. 



예를 들어  Self-Attention을 건너뛴 결과와  Self-Attention 레이어를 통과한 결과가 합쳐져서 Layer Norm 레이어의 입력으로 사용됩니다. 

 




어텐션

트랜스포머 아키텍처에서는 어텐션 함수가 병렬로 8개 실행되며 Multi-Head Attention라고 부릅니다. 최종 출력은 8개의 어텐션 함수의 결과 벡터를 연결하여 하나의 벡터를 만들어서 얻습니다. 



트랜스포머에서 어텐션 메커니즘은 다음 세 곳에서 사용됩니다:

 

1. 인코더의 셀프 어텐션 (Self Attention in the Encoder) - 아래 그림에서 인코더 부분의 Multi-Head Attention

2. 디코더의 셀프 어텐션 (Self Attention in the Decoder) - 아래 그림에서 디코더 부분의 Multi-Head Attention

3. 디코더의 인코더-디코더 어텐션 (Encoder-Decoder Attention in the Decoder) - 아래 그림에서 디코더 부분의 Masked Multi-Head Attention

 



Self-attention

셀프 어텐션(self-attention)이란 어텐션을 자기 자신에게 수행한다는 의미입니다.  셀프 어텐션에서는 Query, Key, Value가 동일합니다. 즉, 하나의 문장에 있는 단어로부터 Q, K, V를 만듭니다. 

 

Self-attention 메커니즘은 주어진 시퀀스 내 각 토큰(단어)이 다른 토큰과 어떤 관계를 가지는지를 수치적 가중치로 계산합니다. 이 가중치는 해당 토큰의 문맥적 중요성을 나타내며, 이를 바탕으로 시퀀스의 각 토큰에 대한 새로운 표현(representation)을 생성합니다. 이러한 과정을 통해 모델은 문장의 구조와 의미를 더욱 정밀하게 이해하며, 특히 문장 내에서 각 단어의 상대적 중요성과 그들 간의 상호 작용을 파악하게 됩니다. 이 메커니즘은 특히 긴 문장에서나 문맥이 복잡한 경우에 효과적으로 작동하여 문장의 정확한 의미를 추론하는 데 도움을 줍니다.



예를 들어, self-attention 메커니즘을 사용하는 경우:

 

1. 입력 시퀀스(문장)의 각 단어 또는 토큰은 초기에 해당 단어의 임베딩(벡터 표현)을 갖습니다.

2. Self-attention은 이 시퀀스 내의 각 단어가 다른 단어들과 어떻게 상호 작용하는지를 파악합니다.

3. 이 상호 작용을 바탕으로 각 단어의 초기 벡터 표현을 업데이트하거나 조정합니다. 이렇게 조정된 벡터들은 해당 단어가 문장 내에서 어떤 역할을 하는지, 다른 단어들과 어떤 관계를 가지는지를 더 잘 반영하게 됩니다.

4. 결과적으로, self-attention을 거친 후의 벡터 표현은 원래의 시퀀스 데이터보다 그 구조나 의미를 더 잘 반영하는 "새로운 표현"이 됩니다.



self-attention 레이어는 시퀀스 내의 모든 위치(단어나 토큰)를 동시에 한 번에 볼 수 있습니다. 따라서 시퀀스의 길이에 상관없이 동일한 양의 연산을 수행하여 모든 위치 간의 관계를 파악합니다. 순환 레이어는 시퀀스를 순차적으로(한 위치씩 차례대로) 처리합니다. 그렇기 때문에 시퀀스의 길이가 n이라면, n번의 순차적인 연산이 필요하게 됩니다. self-attention 레이어에 비해 더 많은 연산이 필요합니다. 결론적으로, self-attention은 모든 위치를 동시에 보는 반면, 순환 레이어는 각 위치를 순차적으로 처리한다는 차이가 있습니다.



"나는 학교에 간다" 문장의 각 단어를 임베딩을 사용하여 벡터로 변환했다고 가정해 봅시다:

  • "나는"은 [0.1, 0.2]
  • "학교에"는 [0.3, 0.4]
  • "간다"는 [0.5, 0.6]

 

이제 각 토큰에 대해 Query(Q), Key(K), Value(V) 벡터를 생성합니다. 셀프 어텐션 메커니즘에서 Q, K, V는 같은 토큰에서 파생되지만, 서로 다른 가중치 행렬(W_Q, W_K, W_V)을 곱함으로써 다른 값을 가질 수 있습니다. 벡터 W_Q, W_K, W_V는 입력 시퀀스의 임베딩인 X에 곱해져서 각각 Q, K, V를 생성합니다. 여기서 X는 입력 시퀀스의 임베딩이며, W_Q, W_K, W_V는 학습 가능한 가중치 행렬로, 학습 과정을 통해 최적화됩니다.

 

  • Q = XW_Q
  • K = XW_K
  • V = XW_V




예를 들어 계산된 Q, K, V 벡터는 다음과 같다고 가정합니다.

 

  • Q : "나는" [0.11, 0.21], "학교에" [0.31, 0.41], "간다" [0.51, 0.61]
  • K : "나는" [7.77, 0.22], "학교에" [17.19, 0.42], "간다" [10.47, 0.62]
  • V : "나는" [0.13, 0.23], "학교에" [0.33, 0.43], "간다" [0.53, 0.63]



어텐션 점수는 Q와 K의 내적으로 계산됩니다: 어텐션 점수 = QK^T

"학교에"의 Q 벡터와 K의 모든 벡터와의 내적을 계산해보면 다음과 같습니다:

 

  • "학교에"와 "나는": 0.31 * 7.77 + 0.41 * 0.22 ≈ 2.5
  • "학교에"와 "학교에": 0.31 * 17.19 + 0.41 * 0.42 ≈ 5.5
  • "학교에"와 "간다": 0.31 * 10.47 + 0.41 * 0.62 ≈ 3.5



소프트맥스 함수를 적용하여 어텐션 확률을 구합니다. 이 값은 각 단어가 다른 단어에 주는 가중치를 나타냅니다:

  • softmax(2.5) = e^2.5 / (e^2.5 + e^5.5 + e^3.5) ≈ 0.042
  • softmax(5.5) = e^5.5 / (e^2.5 + e^5.5 + e^3.5) ≈ 0.8437
  • softmax(3.5) = e^3.5 / (e^2.5 + e^5.5 + e^3.5) ≈ 0.1141



이제 각 단어에 해당하는 V 벡터에 어텐션 확률을 가중치로 적용합니다:

  • V("나는") = [0.13, 0.23]
  • V("학교에") = [0.33, 0.43]
  • V("간다") = [0.53, 0.63]



어텐션 가중치를 적용한 결과는 다음과 같습니다:

  • 어텐션값("나는") = [0.13, 0.23] * 0.042 ≈ [0.00546, 0.00966]
  • 어텐션값("학교에") = [0.33, 0.43] * 0.8437  ≈ [0.278421, 0.364791]
  • 어텐션값("간다") = [0.53, 0.63] * 0.1141 ≈ [0.060473, 0.071883]



보통, 어텐션 메커니즘에서는 자기 자신에 대한 어텐션 점수가 가장 높아야 합니다. 즉, "학교에"와 "학교에" 사이의 점수가 가장 높습니다. 이렇게 하면 모델은 "학교에"의 중요성을 인식하고, "간다"와 "학교에" 사이에 두 번째로 높은 관계를 인식할 수 있습니다, 이는 중요한 문맥적 연결을 나타냅니다.

 

최종 출력 벡터는 어텐션 가중치를 적용한 V 벡터들의 합으로 계산됩니다. 이는 문장의 각 단어에 대해 계산된 어텐션 가중치를 사용하여 문장의 단어들이 서로 얼마나 영향을 미치는지를 종합적으로 반영한 벡터입니다.

 

어텐션 가중치를 적용한 V 벡터들을 모두 더하면 다음과 같은 최종 출력 벡터를 얻습니다:

최종 출력 벡터 = 어텐션값("나는") + 어텐션값("학교에") + 어텐션값("간다")

                      = [0.00546 + 0.278421 + 0.060473, 0.00966 + 0.364791 + 0.071883]

                      = [0.344354, 0.446334]



이 벡터는 입력된 문장 "나는 학교에 간다"의 새로운 어텐션 기반 표현으로 사용될 수 있으며, 이는 다운스트림 작업(예: 기계 번역, 질문 응답 등)에 입력으로 사용될 수 있습니다.



인코더 셀프 어텐션.

인코더는 셀프 어텐션(self-attention) 레이어를 포함합니다. 문장 내의 각 단어가 다른 단어들과 어떻게 관련되어 있는지를 통해 그 뜻을 더 잘 파악합니다. 예를 들어, '그녀'라는 단어의 정확한 의미를 이해하기 위해 문장 내의 다른 단어들과 얼마나 관련이 있는지를 학습합니다. '그녀는 팀의 리더입니다'라는 문장에서 '그녀'는 '리더'와 직접적인 관련이 있습니다. 또한 '그녀는 파티에서 가장 눈에 띄었습니다'라는 문장에서 '그녀'는 '눈에 띄다'와 관련이 있을 수 있습니다.

 

각 단어의 초기 벡터 표현이 후속 인코더 레이어들을 거치면서 문장 전체의 컨텍스트와 다른 단어들과의 관계를 반영한 보다 정보가 풍부한 벡터로 변화합니다.

 

예를 들어, 다음과 같은 문장을 생각해봅시다:

"나는 파리에서 태어났다."

 

초기에는  "파리"는 도시의 이름일 수도 있고, 곤충의 이름일 수도 있습니다. 초기에는 이 두 가지 중 어떤 의미인지 모르는 상태입니다. 6개의 인코더 레이어를 거치면서: "파리" 주변의 단어들 ("나는", "에서", "태어났다")과의 관계를 학습하면서 "파리"가 여기서는 도시의 이름임을 알게 됩니다.이렇게 인코더 레이어들을 거치면 "파리"의 단어 벡터는 그 주변 단어들과의 관계를 포함하여 '도시의 이름'이라는 의미를 강조하는 방향으로 발전하게 됩니다.





 

디코더 셀프 어텐션

디코더는 셀프 어텐션 레이어를 포함합니다. 

 

출력을 생성하는 과정에서 각 단어가 이전 단어들과 어떻게 상호작용하는지를 결정함으로써, 문장을 한 단계씩 구축해 나갑니다. 이 과정에서 마스킹은 미래의 단어 정보를 숨겨 현재 단어의 예측이 오직 이전에 생성된 단어들에만 기반하도록 보장합니다. 어텐션 가중치는 이전 단어들과의 관계의 강도를 측정하고, 이를 통해 문맥 벡터를 생성하여 현재 단어의 의미를 풍부하게 합니다. 이 문맥 벡터는 디코더의 피드포워드 신경망을 거쳐 다음 단어를 예측하는 데 사용됩니다.

 

디코더의 이러한 과정은 인코더가 제공한 입력 시퀀스의 문맥 정보와 깊게 연결되어 있습니다. 인코더에서 처리된 입력 시퀀스의 정보는 디코더에 전달되어, 셀프 어텐션을 통한 내부적인 상호작용과 결합됩니다. 이는 디코더가 각 단어를 생성할 때 입력 시퀀스의 문맥을 참조하고 반영할 수 있게 하여, 결과적으로 입력 문장의 의미를 정확히 반영하는 적절하고 일관된 타겟 문장을 생성하는 데 중요합니다. 따라서, 디코더의 셀프 어텐션은 각 단어의 생성이 이전 단어들, 그리고 원본 입력 시퀀스와의 관계 속에서 이루어지도록 하는 핵심적인 기능을 수행합니다.

 

 

인코더-디코더 어텐션

인코더-디코더 어텐션은 Transformer 모델에서 두 가지 주요 구성 요소인 인코더와 디코더 사이의 다리 역할을 합니다. 인코더는 입력 시퀀스를 처리하여 각 단어에 대한 문맥 정보를 포함하는 벡터의 시퀀스로 변환합니다. 이 변환은 각 레이어를 통과하며 점진적으로 이루어집니다. 예를 들어, 인코더의 첫 번째 레이어가 처리되면, 이 정보는 디코더의 첫 번째 레이어로 전달되어 출력 시퀀스의 첫 번째 단어를 생성하는 데 사용됩니다.

 

디코더의 각 스텝은 인코더의 각 레이어에서 나온 정보를 활용하여 출력 시퀀스를 생성합니다. 즉, 디코더의 첫 번째 레이어는 인코더의 첫 번째 레이어로부터의 정보를 기반으로 첫 번째 단어를 생성하고, 이 과정은 디코더의 각 레이어를 거치며 순차적으로 진행됩니다. 이러한 방식으로 디코더는 인코더의 출력을 참조하여 각 단어를 생성할 때 입력 시퀀스의 문맥을 고려할 수 있습니다.

 

결과적으로, 인코더-디코더 어텐션을 통해 디코더는 생성하는 각 단어가 입력 시퀀스의 어떤 부분과 가장 관련이 있는지 결정하며, 인코더의 문맥 정보를 활용하여 더 정확하고 관련성 높은 출력을 생성할 수 있습니다. 이것은 번역, 요약, 텍스트 생성 등의 작업에서 모델이 입력과 출력 사이의 복잡한 관계를 더 잘 이해하고, 더 정확한 결과를 도출하는 데 핵심적인 역할을 합니다.



 

 

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts