About
home
📌

트랜스포머(Transformer) 파헤치기—3. Decoder & Masked Attention

Date
2024/10/27
Writer
트랜스포머(Transfomer) 논문 “Attention is All You Need” 중 Decoder & Masked Attention에 대해 공부한 글입니다.
Contents.
지난 글들에서는 Positional Encoding Multi-head Attention에 대해 정리했습니다. 각각에 대한 자세한 내용은 아래 불릿의 링크들을 참고해주시기 바랍니다.
 트랜스포머(Transformer) 파헤치기 시리즈
이번 글은 트랜스포머 파헤치기 시리즈의 마지막 글로 Decoder & Masked Attention에 대해 공부한 내용을 정리했습니다.

1. Residual Connection

본격적으로 Decoder와 Masked Attention에 대해 살펴보기 전에 Transformer 구조에 많이 등장하고 있는 Residual Connection에 대해서 간단하게 살펴보려고 한다.
이 그림은 우리가 흔히 알고 있는 residual connection이다. 입력 xx 가 들어와서 f(x)f(x)가 나가는 기존 신경망과 다르게, residual connection은 입력 xx와 해당 레이어에서 학습된 변환 f(x)f(x)를 더하여 x+f(x)x+f(x)형태로 출력되는 구조이다.
Residual connection은 초기 학습 단계에서 입력을 거의 그대로 전달하도록 설계하여, 모델이 더 쉽고 안정적으로 학습할 수 있도록 돕는다. 그렇기에 f(x)f(x)가 처음에는 큰 변화를 일으키지 않도록 설정하는 것이 중요하다. 이를 위해 weight matrix를 0에 가깝게 초기화 하면, f(x)0f(x) \approx 0이 되어 출력이 대략 x+0=xx + 0 = x가 된다. 다시말해, 처음에는 입력과 비슷한 출력을 만들어 내어 모델이 학습을 점진적으로 시작할 수 있게 된다. 이를통해 각 레이어는 입력값을 크게 변형하지 않고 점진적으로 작은 변화를 적용하게 되고, 안정적인 출력을 생성하며 학습을 하게된다. 이처럼 residual connection을 통해 모델이 점진적으로 입력을 학습하게 되면, 모델이 깊어져도 학습이 안정적으로 이루어질 가능성이 커진다. 또한 residual connection은 기본적으로 입력이 출력으로 직접 더해지는 경로를 제공한다. 만약 weight matrix를 0에 가깝게 초기화 하면, 모델은 처음에 큰 변화를 일으키지 않고 입력 그대로 전달하는 경로를 이용하게 된다. 이로 인해 모델은 학습 초기에 안정적으로 수렴하고, 이후에는 f(x)f(x)에 변화를 학습하면서 점차 복잡한 특성을 배울 수 있다.
정리하자면 residual learning은 우리가 만들고자 하는 출력과 입력 간의 차이만을 학습한다는 뜻의 잔차학습이다. x+f(x)x+f(x)에서 f(x)f(x)는 입력 xx와 최종출력 간의 차이만을 학습하게 되고. 즉 변화량만 학습하기에 학습을 더 쉽고 안정적이고 빠르게 만든다는 장점을 지니고 있다. 결국 residual connection은 복잡하고 계층적인 구조에서 효과적인 학습을 가능하게 하는 핵심 요소라고 할 수 있다.
트랜스포머는 위의 그림을 통해 알 수 있듯, 다수의 레이어를 사용한 복잡한 구조이다. 이러한 구조에서 각 레이어는 서로의 출력을 반복적으로 참조하면서 풍부한 표현력을 학습하게 된다. 하지만 레이어가 많아질 수록 입력과 출력의 관계가 약해져 학습이 잘 안되는 경우가 생긴다. 이때 residual connection를 통해 입력 정보를 직접 전달함으로 레이어가 깊어져도 안정적으로 학습할 수 있게 돕는다. 이 덕분에 트랜스포머 모델은 정보의 손실 없이 빠르고 안정적이게 학습을 지속할 수 있다.

2. Masked Multi-Head Attention

트랜스포머 디코더의 경우 인코더와 구조가 매우 유사하다. 따라서 다른점들만 살펴보려고 하는데. 그중 하나가 Masked Multi-Head Attention이다. 아래 그림에서도 알 수 있듯 Masked Multi-head Attention는 디코더에 존재하는데 이때 Mask의 위치는 Scale 후, Softmax 전 단계이다. “트랜스포머 파헤치기—2. Multi-head Attention”에서 살펴봤던 내용의 그림을 가져오면 아래와 같이 Scale 연산을 거친 후, Softmax 전에, Mask 연산이 수행되는 것을 알 수 있다.
그렇다면 Mask는 왜 Scale 연산 후 Softmax 전에 수행되는걸까?
완벽해보이는 Multi-head Attention이지만 다음과 같이 중요한 문제를 야기할 수 있다.
현재 단어를 예측할 때, 미래 단어에 대한 정보를 사용할 수 있다.
이게 무슨 문제이고 하니.
그림처럼 “cream”이라는 현재 단어를 예측할 때는, 그림 (a)와 같이 이미 예측한 단어인 “<start>”와 “Ice” 그리고 현재 단어인 “cream”에 대한 정보만으로 예측을 해야하는데. 그림 (b)처럼 아직 오지도 않은 미래 단어인 “is” “delicious” “<end>”의 단어 정보들까지도 사용하는 문제가 발생한다는 것이다. 즉 마음대로 컨닝을 하는 문제가 생긴다.
이와 같은 문제를 방지하기 위해 트랜스포머에서는 Mask 기법을 사용하고 있다.
Mask 기법인 Look-ahead Mask는 디코더가 현재 단어보다 미래에 오는 단어들을 참조하지 못하도록 마스킹 처리하여, 모델이 자연스럽게 순차적인 예측을 할 수 있도록 돕는다. 따라서 현재 단어 이후에 오는 단어들은 가장 작은 숫자인 -\infty로 마스킹 처리한다. (자체적으로 컨닝방지를 하는 셈이다.)
훈련 과정에서는 이러한 Look-ahead Mask와 함께 Teacher Forcing 기법이 적용된다. 디코더가 현재 시점의 단어를 예측할 때, 이전에 예측한 단어 대신 실제 정답 단어(Ground Truth)를 입력으로 사용한다. 이를 Teacher Forcing이라고 하며. 이렇게 하면 모델이 잘못된 예측으로 인해 오류가 누적되는 것을 방지하고 빠르게 학습할 수 있다.
다시말해, Look-ahead Mask는 현재 시점의 정보만 사용해 예측할 수 있도록 돕고, Teacher Forcing을 통해 정답 단어를 기반으로 모델이 빠르게 학습할 수 있도록 한다. 이 두가지 기법의 결합은 자연어 생성의 정확도와 일관성을 유지하는 데 중요한 역할을 한다.
그후 softmax를 취해서 마스킹된 요소들을 weight 0로 만들어 attention score를 계산할 때 미래 시점의 값이 참조되지 않도록 만들어준다. 이를 통해 디코더는 각 시점마다 미래 정보에 접근하지 않고 현재까지의 정보만을 기반으로 다음 언어를 예측하게 된다.
이처럼 Masked Multi-Head Attention은 모델이 각 시점에서의 정보를 바탕으로 순차적으로 다음 단어를 예측하게 하여, 문장의 일관성과 의미를 유지하며 올바른 문장을 만들어내는 데 중요한 역할을 한다.
여기까지 디코더의 이전 출력이 Masked Multi-Head Attention을 통해서 마스킹된 행렬이 Add&Norm 레이어를 지나 디코더의 Multi-Head Attention의 Query로 입력이 된다. 분명 이전 글에서 Multi-Head Attention을 공부할 때, Query, Key, Value가 필요하다고 했는데 Query만 있다. 그렇다면 Key와 Value는 어디에 있는 걸까?
디코더의 Multi-Head Attention은 이전 글에서 살펴 본 Self-Attention과는 조금 다른 점이 있다. 여기서 디코더의 Multi-Head Attention이 기존에 공부한 것과 어떻게 다른지 알아보고자 한다.

3. Encoder-Decoder Attention

Multi-Head Attention 글에서 살펴 보았던 Self-Attention의 경우 query, key, value가 모두 동일한 소스에서 생성된다. 반면, Encoder-Decoder Attention에서는 서로 다른 소스에서 입력을 받는다.
인코더의 경우 입력 값이 하나, 즉 소스입력값 뿐이다. 디코더의 경우 입력 값이 두개로 인코더의 출력값과 디코더에서 지금까지 출력된 값들이다.
즉, Encoder-Decoder Attention에서는 Query, Key, Value가 서로 다른 소스에서 생성된다. Query는 디코더의 현재 시점의 출력에서 생성되고, Key와 Value는 인코더가 처리한 전체 입력 시퀀스에서 생성된 출력에서 가져온다. 인코더의 출력은 전체 입력 시퀀스에 대한 포괄적인 표현(Representation)을 담고 있다. 이 출력은 디코더에서 생성된 query와 상호작용하여, 다음 단어를 예측하기 위해 필요한 정보를 추출한다. Key와 Value는 인코더의 출력에서 얻어지며, Query는 현재 시점에서 디코더가 다음에 생성할 단어에 필요한 정보를 찾는 역할을 한다. 이렇게 생성된 Query는 Key와 Value 간의 관계를 통해 필요한 정보를 선택적으로 추출하여 디코더의 다음 출력 예측에 활용된다. 이를 통해 디코더는 입력 시퀀스 전체에 대한 맥락을 바탕으로 정확한 예측을 수행할 수 있다.
Encoder-Decoder Attention 덕분에 디코더는 각 출력이 입력의 어느 부분과 가장 높은 연관성을 가지는지 계산할 수 있다. 디코더는 이를 바탕으로 인코더의 특정 부분에서 필요한 정보를 선택적으로 추출해 현재 시점에서 가장 관련성 높은 정보를 활용하게 됩니다. 이 과정은 전체 입력 문맥에 대해 디코더가 최적의 예측을 할 수 있도록 돕습니다.
정리하자면, Self-Attention은 입력 시퀀스 내의 각 단어들 간의 관계를 임베딩 벡터를 사용해서 계산되는 방식으로 작동하며, Encoder-Decoder Attention은 인코더의 출력을 디코더로 전달해 디코더가 필요한 정보를 선택적으로 추출할 수 있도록 가중치를 부여한다. 이 과정에서 Query는 디코더의 출력에서, Key와 Value는 인코더의 출력에서 생성된다.
결과적으로, Encoder-Decoder Attention은 인코더의 전체 입력 시퀀스에서 가장 중요한 정보를 선택적으로 추출하여 디코더가 정확하고 일관된 예측을 할 수 있도록 지원한다. 이러한 구조는 특히 자연어 생성이나 번역과 같은 응용 분야에서 맥락을 잘 유지하는 데 필수적인 역할을 한다.

4. Transformer Full Model

이제까지 설명한 컴포넌트들을 머릿속에 둔 채, 다시 전체 그림을 조망해보자. 어째서 이런 요소들이 트랜스포머 모델에 필수적이었는지 이해가 갈 것이다. 처음에 인코더와 디코더의 조합으로 제안되었던 트랜스포머는 이후 인코더 온리 모델이나, 디코더 온리 모델로 분화하여 더 많은 파생을 낳았다. 인코더 온리 모델은 주로 입력 데이터의 분석과 특징 추출에 사용되며, 디코더 온리 모델은 생성 태스크에 특화되어 발전해왔다. 그 중에 디코더 온리로 극단적으로 발전한 것이 우리가 자주 만나는 ChatGPT와 같은 대형 언어 모델이 되었다. 그리고 현재 트랜스포머는 언어 모델을 넘어 이미지 생성, 로봇 제어 등 다양한 분야에 활용되며, 그 적용 가능성이 무한하다는 것을 보여주고 있다.

참고자료

[1] Ashish Vaswani et al. “Attention is All You Need”, NIPS 2017
[3] Minh-Thang Luong et al. “Effective Approaches to Attention-based Neural Machine Translation”, EMNLP 2015
[4] Jay Alammar, “The Illustrated Transformer”, Blog
[5] Lil’ Log, “Attention? Attention!”, personal blog
[6] Lil’ Log, “The Transformer Family”, personal blog
[7] Lil’ Log, "The Transformer Family 2.0”, personal blog