딥러닝, 논문 리뷰

[딥러닝, 논문리뷰] Attention Is All You Need 3 - Residual Connection, 나머지 내용들

cheorish 2025. 3. 4. 00:38

 

 

 

https://arxiv.org/abs/1706.03762
 

Attention Is All You Need

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new

arxiv.org

 

이번 시간은 트랜스포머 메커니즘 마지막 단계인 Residual Connection에 대해서 정리하면서 트랜스포머 이론편은 마무리 하도록 하겠습니다.

 

 

 

이전 내용 링크 

 

이동하기 ▶

포지셔널 인코딩 

어텐션 메커니즘

 


Residual Connection? 

트랜스포머에서 Residual Connection(잔차 연결) 은 이미지 모델에서 자주 사용되는 Skip Connection(스킵 커넥션) 과 유사한 역할을 합니다.

 

왜 이런 구조를 고안했을까요?

 

➡ 신경망이 깊어질수록 역전파 과정에서 기울기 소실(Vanishing Gradient) 문제가 발생할 가능성이 커집니다.

➡ 이를 해결하고 훈련을 안정적으로 만들기 위해 기존 입력을 변환된 출력에 추가로 연결하는 방식을 도입했습니다.

 

쉽게 말하면, 체인룰을 통해 입력값이 계속 미분되면서 값이 점점 작아지게 되고, 이로 인해 기울기 소실이 발생할 가능성이 높아집니다.
Residual Connection은 원래 입력 값을 출력과 더해줌으로써 신경망이 깊어지더라도 정보가 손실되지 않도록 도와주며, 학습을 안정화하는 역할을 합니다.

 

💡 간단한 수식 표현

 

\(\text{Output=Layer}(X)+X\)

 

여기서 \(X\) 는 입력 벡터이고, \(\text{Layer}(X)\)는 특정 연산 (예: Self-Attention, Feed-Forward Layer)을 거친 출력임.

 

1. 트랜스포머에서 Resdiaul Connection이 사용되는 위치 

 

  • 트랜스포머 구조에서 각 서브 레이어(어텐션, 피드포워드 뉴럴 레이어) 후에 레지듀얼 커넥션을 거침 
  • 이후에 Layer Normal이 적용 

1-1. 셀프 어텐션 이후 

 

\(Z=\text{Multi-Head Self-Attention}(X)+X\) 

 

1-2. 피드포워드 네트워크 이후 

 

\(Y=\text{Feed-Forward}(Z)+Z\)

 

 

2. SQL표로 보는 연산 과정

    Input X
       │
       ▼
Multi-Head Self-Attention
       │
       ▼
+─────── Residual Connection (X + Self-Attention Output)
│
▼
Layer Normalization
       │
       ▼
Feed Forward Network (FFN)
       │
       ▼
+─────── Residual Connection (Z + FFN Output)
│
▼
Layer Normalization
       │
       ▼
Output

 

👉 각 층을 지나면서 원래 입력 값을 더해주므로, 모델이 깊어져도 정보가 유지되며 학습이 안정화됨

 

3. 레지듀얼 커넥션이 필요한 이유

 

기울기 소실(Vanishing Gradient) 방지

  • 네트워크가 깊어질수록 역전파(Backpropagation) 과정에서 기울기가 작아지는 문제 발생 가능.
  • 하지만 레지듀얼 커넥션은 그래디언트가 직접 전달되도록 도와 학습을 원활하게 함.

학습 속도 향상

  • 레지듀얼 커넥션이 없는 경우, 트랜스포머 블록이 완전히 새로운 표현을 학습해야 하지만,
    레지듀얼 커넥션이 있으면 기존 입력을 활용하면서 점진적으로 학습 가능!

정보 손실 최소화

  • 원본 입력이 네트워크를 거치면서 손실되지 않고 다음 레이어로 전달될 수 있음.

트랜스포머의 성능 향상

  • 트랜스포머는 깊은 네트워크 구조이기 때문에, 레지듀얼 커넥션이 없으면 성능이 급격히 저하됨.

 

4. 코드로 보는 트랜스포머 레지듀얼 커넥션

import torch
import torch.nn as nn

class TransformerBlock(nn.Module):
    def __init__(self, embed_dim, num_heads, ff_dim, dropout=0.1):
        super(TransformerBlock, self).__init__()
        self.attention = nn.MultiheadAttention(embed_dim, num_heads)
        self.norm1 = nn.LayerNorm(embed_dim)
        self.norm2 = nn.LayerNorm(embed_dim)
        self.ffn = nn.Sequential(
            nn.Linear(embed_dim, ff_dim),
            nn.ReLU(),
            nn.Linear(ff_dim, embed_dim)
        )
        self.dropout = nn.Dropout(dropout)

    def forward(self, x):
        # Self-Attention with Residual Connection
        attn_output, _ = self.attention(x, x, x)  # Multi-head Self-Attention
        x = x + self.dropout(attn_output)  # Residual Connection
        x = self.norm1(x)  # Layer Normalization

        # Feed Forward Network with Residual Connection
        ffn_output = self.ffn(x)
        x = x + self.dropout(ffn_output)  # Residual Connection
        x = self.norm2(x)  # Layer Normalization

        return x

# 입력 데이터
x = torch.rand(10, 5, 512)  # (sequence_length, batch_size, embedding_dim)

# 트랜스포머 블록 실행
transformer_block = TransformerBlock(embed_dim=512, num_heads=8, ff_dim=2048)
output = transformer_block(x)

print(output.shape)  # (10, 5, 512) -> 동일한 차원 유지됨

 

 

그림으로 보는 Residual Connection

 

5. 트랜스포머에서 레지듀얼 커넥션을 사용할 때 고려할 점

  • Layer Normalization과 함께 사용해야 안정적
  • Dropout을 적용해 과적합 방지
  • 잔차(Residual) 값이 너무 커지지 않도록 조절 (LayerNorm이 이를 도와줌)

 

번외 

스킵 커넥션(Skip Connection) vs. 레지듀얼 커넥션(Residual Connection)

 

🔹 1. 스킵 커넥션 (Skip Connection)

  • 입력을 특정 레이어를 건너뛰어서 출력에 직접 연결하는 방식.
  • 딥러닝 모델에서 다양한 형태로 사용됨.
  • VGG, U-Net, DenseNet 등에서도 활용됨.

수식 

 

\(Y=f(X)+X\)

 

  • \(X\): 입력
  • \(f(X)\) : 임의의 네트워크 연산 (예: CNN, RNN Transformers)
  • \(Y\): 출력 

💡 스킵 커넥션의 대표적 예시:

  • U-Net에서 Low-Level Feature를 High-Level Feature에 전달할 때 사용.
  • DenseNet에서 레이어 간의 모든 출력을 다음 레이어와 연결할 때 활용됨.

2. 레지듀얼 커넥션 (Residual Connection)

  • 스킵 커넥션의 한 종류이지만, ResNet에서 처음 개념이 정립됨.
  • ResNet(Residual Network)에서는 기본적으로 입력과 변환된 출력을 더하는 방식을 사용.
  • 원래는 딥 뉴럴 네트워크에서 기울기 소실(Vanishing Gradient) 문제를 해결하기 위해 제안됨.

 

\(Y=X+F(X,W)\)

 

  • \(X\) : 입력 
  • \(F(X, W\) : 가중치 W를 학습하는 신경망 레이어
  • \(Y\) : 출력 

Residual Connection의 대표적 예시:

  • ResNet (CNN 기반) → 깊은 네트워크에서 성능 향상.
  • Transformer (Self-Attention 및 Feed-Forward 이후 적용).

3. 트랜스포머에서 Residual Connection을 사용하는 이유

위에서도 정리해서 간단하게 나열하면.

 

1. 기울기 소실 문제 완화

 

사용 위치 

 

1-1. 셀프 어텐션 이후 

 

\(Z=\text{Multi-Head Self-Attention}(X)+X\) 

 

1-2. 피드포워드 네트워크 이후 

 

\(Y=\text{Feed-Forward}(Z)+Z\)

 

 


논문 나머지 내용 정리 

3.2 Embeddings and Softmax

 

1. 입력/출력 토큰을 벡터로 변환하는 과정

 

  • 트랜스포머는 자연어 처리를 수행할 때 단어(토큰)를 벡터로 변환해야 함.
  • 이를 위해 단어 임베딩(Word Embedding)을 학습하여 고정된 차원의 벡터로 변환함.
  • 각 입력 토큰과 출력 토큰은 \(d_{model}\) 차원의 벡터로 매핑됨.

\(d_{model}\) 값은 논문에서 512로 설정됨 → 즉, 각 토큰은 512차원의 벡터로 표현됨.

 

2. 디코더에서 소프트맥스를 이용해 다음 토큰을 예측하는 과정

  1. 디코더의 최종 출력은 \(d_{model}\) 차원의 벡터가 됨.
  2. 이를 선형 변환(Linear Transformation) → 소프트맥스(Softmax) 연산을 통해 각 단어에 대한 확률 분포로 변환.
  3. 최종적으로 확률이 가장 높은 단어가 다음 토큰으로 예측됨.

📌 수식 표현:

 

$$
X_E = X_E \cdot \sqrt{d_{\text{model}}}
$$

여기서,

  • \( X_E \) = 입력 임베딩 벡터 
  • \( \sqrt{d_{\text{model}}} \) 를 곱함으로써 벡터 크기를 적절히 조정  

 

3. 입력 임베딩과 출력 임베딩을 동일한 가중치로 공유

 

 

트랜스포머에서는 입력 임베딩과 출력 임베딩의 가중치를 공유함.

 

📌 기존 모델 (예: RNN, LSTM)과의 차이점

  • 일반적으로, 입력 단어를 변환하는 임베딩 행렬과 디코더의 최종 출력을 변환하는 행렬은 서로 다른 가중치 행렬을 사용함.
  • 하지만 트랜스포머는 두 개의 행렬을 동일하게 설정하여 학습하는 방식을 채택함.
  • 이렇게 하면 파라미터 수를 줄여 모델이 더 효율적으로 학습할 수 있음.

📌 수식 표현:

 

$$
P(y_t | y_{<t}, X) = \text{softmax}(W_o \cdot Z_t + b_o)
$$


여기서,  

  • \( W_o \) = 학습된 선형 변환 가중치 (행렬 크기: \( d_{\text{model}} \times V \), 여기서 \( V \)는 어휘 크기)  
  • \( Z_t \) = 디코더에서 나온 출력 벡터 (\( d_{\text{model}} \)-차원)  
  • \( b_o \) = 바이어스 벡터  

 

즉, 입력 임베딩과 출력을 변환하는 행렬이 동일하다는 의미

 

4. 임베딩 가중치를 \(\sqrt{d_{model}}\)로 조정

 

\(\sqrt{d_{model}}\)로 곱하는지?

 

일반적으로 단어 임베딩 행렬 \(W_E\) 의 값은 난수로 초기화됨.

 

이때, 초기값이 너무 크거나 작으면 학습이 비효율적이거나 불안정해질 수 있음.

따라서, \(d_{model}\)의 제곱근인  \(\sqrt{d_{model}}\) 로 조정하여 수치적 안정성을 확보

 

왜 이렇게 하면 안정적일까?

  • 가중치 행렬의 값이 랜덤하게 초기화되었을 때, 벡터의 평균 크기를 일정하게 유지할 수 있음.
  • 네트워크의 초반 학습 속도를 조절하여 너무 빠르게 수렴하거나, 너무 느리게 학습되는 문제를 방지.

💡 이 기법은 "Scaled Embedding" 이라고 부르며, 입력 벡터의 크기를 적절히 조정하여 학습을 원활하게 만듬 

 


 

4. Why Self-Attention

 

트랜스포머 모델이 왜 Self-Attention을 사용하는가? 에 대한 설명을 제공하며, 기존의 순환 신경망(Recurrent Layers)과 합성곱 신경망(Convolutional Layers)과 비교하면서,

 

셀프 어텐션(Self-Attention)의 장점을 설명하고 있음.

 

 

1. 기존 시퀀스 변환 모델과 Self-Attention 비교

트랜스포머의 셀프 어텐션(Self-Attention)은 기존의 순환 신경망(RNN, LSTM)합성곱 신경망(CNN) 과 비교하여 세 가지 중요한 요소를 중심으로 설명됨.

 

📌 비교 기준 (Three Key Factors)

1️⃣ 계층당 총 계산량 (Total Computational Complexity per Layer)

  • 모델이 한 층을 계산하는 데 얼마나 많은 연산이 필요한지?

2️⃣ 병렬 연산 가능성 (Parallelization Capability)

  • 모델이 병렬 연산을 얼마나 효과적으로 수행할 수 있는지?

3️⃣ 긴 시퀀스에서 정보 전달 경로(Path Length of Long-Range Dependencies)

  • 장기 의존성(Long-Range Dependency)을 학습할 때, 한 단어에서 다른 단어까지 신호가 전달되는 경로의 길이가 얼마나 짧은지?
  • 짧을수록 정보가 더 빠르게 전달되고, 모델이 쉽게 학습할 수 있음.

2. Self-Attention vs. RNN vs. CNN 성능 비교

논문에서는 표 1 (Table 1) 을 통해 RNN, CNN, Self-Attention의 성능을 비교하고 있음

 

🔹 2-1. 연산량(Computational Complexity)

  • RNN: \(O(n \cdot d^2\)) → 시퀀스 길이 nn 에 비례하는 선형 증가.
  • CNN: \(O(k \cdot n \cdot d^2\)) → 커널 크기 \(k\) 에 따라 다르지만, 커널 크기가 크면 연산량이 증가.
  • Self-Attention: \(O(n^2 \cdot d\)) → 시퀀스 길이가 길어지면 계산량이 커지지만, 긴 문장을 처리하는 데 RNN보다 훨씬 유리.

🔹 2-2.병렬 연산 가능성(Parallelization Capability)

  • RNN: 병렬화 불가능 (\(O(n)\)→ 각 시간 단계(time step)에서 앞 단계의 결과를 필요로 하므로, 한 번에 한 단어씩 처리해야 함.
  • CNN: 부분적으로 병렬화 가능 (\(O(log_k n\)) → 여러 층을 쌓으면 입력 문장의 각 단어가 병렬적으로 처리될 수 있음.
  • Self-Attention: 완전 병렬화 가능 (\(O(1)\)) → 문장 전체를 한 번에 계산할 수 있어서 병렬 연산에서 매우 유리함.

🔹 2-3. 긴 문장에서의 정보 전달 경로(Path Length for Long-Range Dependencies)

  • RNN: 길이가 \(O(n)\) 으로 매우 길다 → 시퀀스가 길어질수록, 초반 단어의 정보가 후반 단어까지 전달되기 어려움 (기울기 소실 문제 발생).
  • CNN: 경로 길이가  (\(O(log_k n\))  → CNN은 여러 계층을 통해 정보를 전달하므로, 비교적 빠르게 정보를 전달할 수 있음.
  • Self-Attention: 경로 길이가  (\(O(1)\))   (모든 토큰이 한 번에 연결됨) → 모델이 긴 거리의 의존성을 쉽게 학습할 수 있음.

👉 즉, Self-Attention은 RNN과 CNN보다 더 빠르고, 병렬화가 용이하며, 장기 의존성 학습에 유리함

 

3. Self-Attention의 성능 최적화 (긴 시퀀스 처리 개선)

  • 문장이 매우 길어지면 Self-Attention의 연산량 \(O(n^2 \cdot d\))  가 커지는 문제가 있음.
  • 이를 해결하기 위해, 국소적인(Local) Self-Attention 방식 제안:
    • 특정 토큰에서 일정 거리 rr 내의 토큰들만 고려하도록 함.
    • 이를 적용하면 최대 경로 길이가 \(O(n/r)\) 로 감소.

📌 이 아이디어는 이후 등장한 Longformer, Sparse Attention, Linformer 등의 모델에서 활용됨.

 

4. 추가 장점: 해석 가능성(Interpretability)

 

  • Attention Score를 시각화하면, 모델이 어떤 단어를 더 중요하게 생각하는지 확인 가능.
  • 개별 어텐션 헤드(Attention Heads)들이 문장에서 다양한 역할을 수행하는 것을 발견함.
    • 예를 들어, 어떤 어텐션 헤드는 문장의 구문 구조(Syntax)를, 다른 헤드는 의미(Semantics)를 학습함.