[2025] CS231n 8강: Attention and Transformers - CS231n 강의 노트

2026. 4. 18. 22:50·[2025] CS231n
반응형

 

8강 : Attention and Transformers

지난 강의에서 RNN(Recurrent Neural Networks)를 통해서 입력과 출력의 길이가 달라도 처리 가능한 구조를 배웠다. 번역과 같은 테스크에서 사용하는 RNN을 살펴보고 기존 RNN의 문제점과 이를 극복하기 위한 Attention과 Transformer에 대해서 살펴볼 것이다. 그러기 위해서 Transformer를 처음으로 도입한 구글의 "Attention is All You Need"이 제안한 방법을 알아볼 것이다. 

 

Sequence to Sequence with RNNs

기계 번역의 경우, 번역을 하기위한 입력 문장이 주어지고 모델을 통과하여 번역이 된 출력 문장이 나온다. 문장을 넣어서 문장이 나오는 형태를 sequence to sequence라고 한다. 문장을 한꺼번에 넣기보다는 단어처럼 적절한 단위마다 끊어서 넣고 그에 맞는 번역 결과가 나올 것이다. 

 

예를 들어서 "we see the sky"라는 문장에서 we, see, the, sky라고 입력을 나눌 수 있다. 그림으로 보면 다음과 같다. 

RNN은 hidden state가 존재하고 새로운 입력을 통해서 업데이트한다. 위 그림에서도 h2는 x2를 받아서 h1에서 업데이트가 되는 모습을 볼 수 있다. 다음으로 이 encoder에서 입력을 다 받은 다음을 보자. 

두 가지 벡터를 생성한다. 첫 번째로 Decoder에서 출력을 위한 decoder state $s_0$가 있으며, 두 번째로는 모든 입력을 요약하는 context vector c가 존재한다. 그럼 다음 출력을 위해서 decoder는 3가지를 참고한다. 이전 decoder state(1)와 요약 context vector(2) 그리고 입력으로 들어오는 직전의 아웃풋(3)이다. 다음의 그림과 같이 번역 결과가 출력이 된다. 

하지만 이 방법은 정말 치명적인 문제점이 존재한다. 바로 매우 긴 문장(예: 1000단어)가 들어오면 context vector c는 요약하기에는 너무 크기가 작다는 문제점이다. 이러면 입력 문장의 많은 정보가 손실이 날 수 있다. 그래서 이를 보완하기 위해서 각 아웃풋 시점에서 context vector가 서로 다른 입력 시점을 보면서 정말 필요한 정보만을 보도록 하는 메커니즘이 바로 Attention이다.  

 

Sequence to Sequence with RNNs and Attention 

각 출력에 필요한 입력 부분을 보기 위해서 attention을 사용하는 방법은 우선 직전의 decoder state와 같은 시점의 입력파트 hidden state를 곱해서 alignment score를 구한다. 이 score를 얼마나 집중할 지에대한 실제 점수로 만들기 위해서 softmax 함수를 통과시킨다. 통과되어 나온 이 점수들을 attention weights라고 부른다.

이 attention weights는 특정 입력 부분을 얼마나 집중해서 볼 것인지를 담당하며 예를 들어 2번째 입력 단어를 몇 %만큼 볼 지 결정하는 역할을 한다. 그래서 이 입력 부분, 즉 encoder에 hidden state에 attention weights를 곱하고 전체합을 구한다. 이것이 바로 attention 메커니즘에서의 context vector이다. 그런 다음 decoder에서 출력하는 과정은 기존 RNN과 동일하다. 

Key-Value로 살펴보는 Attention

여기서부터는 cs231n의 슬라이드 기반보다는 다른 자료를 통해서 attention과 transformer를 살펴보고자 한다. "Illustrated Transformer"라는 Transformer을 알기 시각화한 블로그 글이다. 링크 : https://jalammar.github.io/illustrated-transformer/

우선 이전에 보았던 어텐션 계산 방법을 Key, Value 그리고 Query를 추가해서 다시 설명을 해보겠다. 

 

Query = 직전의 디코더 hidden state

Key = encoder의 hidden state이며 alignment score 계산에 사용

Value = encoder의 hidden state이며 context vector에서 사용

 

alignment score를 계산하기 위해서 다음과 같은 식을 사용하였다:

$e_{i,j}= f_{att}(s_{t-1}, h_i)$

여기서 $s_{t-1}$은 이전의 decoder의 hidden state이고 key에 해당한다. 

그리고 $h_i$는 encoder의 hidden state이고 query에 해당한다. 

 

그리고 context vector의 식은 

$c_t = \sum_i a_{t,i}h_i$

여기서 계산한 어텐션에 $h_i$를 곱하는데 이것이 Value에 해당한다.

 

그렇다면 Key, Value 그리고 Query는 어떻게 생성되는 것일까? 

바로 3가지의 각각 학습 가능한(trainable) 행렬을 곱해서 생성한다. 

"The Illustrated Transformer" by Jay Alammar

입력을 임베딩하고 $W^{Q}, W^{K}, W^{V}$와 같은 행렬을 곱하면 생성할 수 있는데 여기에서는 1x4의 임베딩 행렬을 4x3의 W로 곱하여서 1x3의 key, value, query를 각각 얻을 수 있다. 

 

Transformer : A High-Level Look

우선 Transformer의 overwiew로 살펴보도록하자 

Transformer는 sequence-to-sequence 모델로 입력 문장을 받으면 아웃풋 문장이 나오는 기본적인 구조이다.

번역할 문장을 Transformer에 넣으면 번역된 문장이 나온다.

이제 Tranformer를 한 겹 더 자세히 보면 다음과 같다.

다음과 같이 Transformer는 Encoders + Decoders의 형태로 이루어져 있다. 아래 그림과 같이 여러 Encoder를 쌓아 올렸고 각 Encoder는 모든 Decoder로 전달한다. 

Encoder의 구조 

Encoder를 자세하게 살펴보자. Encoder는 두 개의 하위 층으로 이루어져 있다:

Self-attention layer : encoder가 입력 문장의 서로 다른 단어와의 관계를 살펴본다.

Feed-forward neural network : 각 위치의 단어마다 통과시킴

 

self-attetnion layer는 어텐션 기반으로 기존의 보았던 어텐션과 거의 동일하다. 이후 더 자세히 살펴보도록 하겠다. 

 

단어의 시퀀스로 된 문장을 모델이 처리를 하기위해서 숫자로 된 벡터의 형태로 바꿔야한다. 이를 word embedding이라고 한다. 맨 처음, 즉 encoder의 가장 아래에서 시작한다. Transformer 논문에서는 임베딩 벡터의 크기를 512로 사용하였다. 

 

Decoder의 구조

Decoder의 경우 Encoder와 다르게 세 가지의 하위 층으로 이루어져 있다. 

Encoder에도 존재하는 self-attention, feed forward layer말고 Encoder-Decoder Attetnion이 추가되었다.

Encoder-decoder attention layer : cross-attention으로 더 많이 알려져 있으며 이름대로 Encoder와 Decoder의 부분을 참고한다. 

 

Self-Attention

우선은 self-attention에서 어떤 일이 발생하는 지에 대해서 살펴보도록 하겠다. 

이전에 Key-Value로 설명한 어텐션 파트에서 볼 수 있듯이 learnable 벡터를 곱해서 Query, Key, Value를 구하였고 이를 통해서 attention score 계산하였다. 

 

이 atteion 점수를 통해서 다른 입력의 어떤 부분을 집중할 수 있을 지를 정할 수 있어고 Query와 Key 벡터의 곱을 통해서 구하였다. 

논문 "Attention is All You Need"에서는 self attention을 계산하는 방법으로 우선 다음과 같다. 

 

1.Query와 Key 벡터를 곱하여서 점수를 구한다. 

2. 일정한 범위로 정규화를 하기위해서 Key 벡터의 차원인 $d_k$의 루트로 나눈다.

3. softmax를 통해서 점수로 바꾸어준다. 

4. 이 점수를 value에 적용해 부분합을 구한다. 

 

이를 시각화하면 다음과 같다.

번외) 왜 정규화를 할 때 $d_k$로 나누는가?

더보기

Query와 Key의 각 성분을 이렇게 두자

$q_i, k_i ~N(0,1)$ 평균 : 0, 분산 : 1

내적은 다음과 같다:

Q⋅K = $ \sum\limits_{i=1}^{d_k} q_ik_i $

 

이 때 각 항 $q_ik_i$의 분산을 알아보기 위해 한 항 씩 보면

$X_i = q_ik_i$

평균 : $E[X_i] = E[q_i]E[k_i] = 0$

분산 : $Var(X_i) = E[q^2_ik^2_i] = E[q^2_i]E[k^2_i] = 1\cdot1 = 1$

따라서 각 항의 분산은 1이다.

 

이제 전체 내적 

S = $\sum\limits_{i=1}^{d_k}X_i$

Var(S) = $\sum\limits_{i=1}^{d_k}Var(X_i)$

= $d_k\cdot1 = d_k$

 

따라서 내적의 분산은 $d_k$에 비례해서 커진다.

직관적으로 보아도 차원이 커질수록 더 퍼지므로 점점 튀케 된다. 

그래서 분산이 $d_k$이면 표준편차는 $\sqrt{d_k}$이므로 표준편차로 나누어 분산을 1로 정규화한다. 

 

Multi-Head Attention

self-attention layer에서는 하나의 어텐션 블록이 아닌 여러개의 attention 헤드를 사용한다. 이를 통해 다양한 위치를 집중할 수 있는 능력이 생긴다. 에를 들어서 8개의 어텐션 헤드를 사용하면 다음과 같이 다양한 위치에서 집중을 할 수 있다.

아래와 같이 $2x(3\cdot8)$벡터에 24x4의 $W^Q$를 곱해서 2x4의 결과 벡터를 만들어주고 이를 FFN에 보낸다. 

Positional Encoding

하지만 Self-Attention에 문제가 있는데 바로 시퀀스에 있는 단어들의 순서를 알지 못한다. 그래서 해결책으로 위치 정보를 담은 Positional Encoding 벡터를 입력 임베딩 부분에 추가해준다. 

 

Residuals and Layer Norm

안정적인 gradient 흐름을 위해서 residual connection을 Self-Attention과 FFN을 지나기 이전에서 해준다. 그리고 나서 layer normalize를 통해서 정규화를 해준다. Encoder 1개의 전체적인 구조는 다음과 같다. 

 

Decoder

전반적으로 Encoder의 아키텍쳐와 유사하다. Decoder와 Encoder는 구조적 차이 하나 그리고 학습 방식에 차이 하나가 존재한다. 

우선 아래 그림와 같이 Decoder에는 Encoder-Decoder Attention 층이 하나가 더 추가로 존재한다. 

Encoder-Decoder Attention, Cross Attention으로 더 잘 알려져 있는 이 layer는 Key와 Value를 Encoder의 맨 위에서 전달 받는다. 위의 그림에서 Encoder가 끝나고 화살표가 Encoder-Decoder Attention으로 들어가는 모습에서 확인할 수 있다. 

 

이해를 위해 이전에 sequence-to-sequence 모델의 구조를 가져와보자. 

여기에서 $e_{i,j}$를 계산하기 위해서 $s_{t-1}$과 $h_i$가 사용되는데 이 $s_{t-1}$이 decoder의 Query이고 $h_i$가 Encoder의 Key이다. 따라서 Encoder의 Key와 Value 그리고 Decoder의 Query를 통해서 attention을 구한다. 

 

학습 방식의 차이는 self-attention에서 계산하는 방식에 있다. 바로 미래의 시점에서의 단어를 못보도록 가리는 masked multi-head self-attention이다. 이는 이후의 위치를 못보도록 막으며 비유로 공부를 할 때 풀지않은 문제의 정답을 가려서 베끼지 못하게 막는 것을 들  수 있다. 

 

문장 생성 방법 : Logits and Softmax

그렇다면 과연 Tranformer에서 어떻게 단어를 생성할까? Decoder의 결과물로 float vector가 나온다. 이것이 바로 특정한 단어를 상징하지 않고 변환이 필요하다.

 

1. linear layer : float vector를 logits으로 바꾸어 준다. 

예를 들어 모델이 학습한 단어의 크기가 1만이라면 차원을 1만x1로 바꾸어서 가장 높은 값을 결과로 정할 것이다.

2. softmax layer : logits를 확률 벡터로 바꾼다.

실수 단위의 값을 확률로 바꾸어준다. 

The Transformer : 트랜스포머의 디테일한 구조 

다시 본 강의의 The Transformer 부분으로 돌아와서 전체적인 트랜스포머의 구조를 살펴보도록 하자. 

우선 입력 벡터를 집어넣고 Self-Attention 이전과 이후를 각각 residual connection으로 연결해준다. 그리고 Layer Normalization을 통해서 정규화해준다. 

그 다음으로 $y = w^Tx+b$ 형태의 선형함수와 활성화함수가 있는 MLP(Mluti-Layer Perceptron)을 각 벡터마다 통과시킨다. 똑같이 전과 후를 더해준다. 

이후 다시 Layer Noramlization으로 정규화 하면 입력 벡터 x에 대응하는 y를 얻을 수 있다. 

이러한 일련의 과정을 하나의 Transformer 블록으로 부른다. Transformer는 이러한 Transformer 블록을 단순히 여러 개 쌓아 올린 형태이다. 이 구조가 크게 바뀌지는 않았지만 더 많은 블록을 사용하였다. 예시로 Transformer 논문에서는 12개의 블록과 2억1천만개의 파라미터를 사용하였는데 Open AI의 GPT-2의 경우 48개의 블록과 15억의 파라미터를 사용하였고 GPT-3는 96개 블록 그리고 1750억개의 파라미터를 사용하였다.

 

Vision Tranformer(ViT)

 

이 Transformer을 컴퓨터 비전으로 적용한 Vison Transfomer(ViT)에 대해서 알아보도록 하자. 문장에서는 단어들을 집합형태로 통과시켰는데 이미지의 경우 어떻게 통과시킬까? 컴퓨터 비전에서 가장 많이 사용하는 Vision Transformers(ViT)에서는 이미지를 등분해서 9개의 패치로 자르고 Transformer을 통과시킨다. 

이렇게 224x224x3 이미지를 하나가 16x16x3으로 나누었을 때 총 256 픽셀과 RGB 3개 층으로 768의 값이 존재한다. 이를 Transformer에 넣기 위해서 768의 차원에서 D차원으로 변환한다. 시퀀스 때와 마찬가지로 positional encoding을 추가해서 각 패치의 위치를 Transformer가 알 수 있게 해준다. 아래와 같이 시각화를 보자 (by ViT를 처음으로 도입한 논문)

Figure1 in "An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale"

Tweaking Transformer : 미세 변경

2017년 Transformer가 처음으로 도입된 이후에 크게 구조적으로 바뀐 것은 없지만 성능 향상을 위해 약간의 변경 부분이 존재한다. 

Pre-Norm Transformer

이름 그대로 self-Attention과 MLP 이후의 존재하였던 Normalization을 이전으로 옮겨서 정규화를 거치고 통과하도록 바꾸었다. 이를 통해 더욱 안정적인 학습을 할 수 있다.

RMSNorm 

layer Normalization을 Root-Mean-Square(RMS)으로 바꾸었다. 역시 더 안정적인 학습을 할 수 있다. 

SwiGLU MLP 

기존 MLP에서 두 개의 가중치 행렬 W를 사용했다면 SwiGLU MLP에서는 3개의 W를 사용한다. 기존의 ReLU를 사용하는 MLP보다 성능이 더 좋으면서 전체 파라미터의 갯수는 같다. 

 

Mixture of Experts(MoE)

MoE는 하나의 거대한 신경망이 모든 것을 처리하는 대신에 특정 분야에 특화된 여러 개의 작은 신경망(Experts, 전문가)을 사용한다. 전문가 MLP E개가 각 Transformer 블록마다 있다고 할 때 각 단어(토큰)마다 가장 적합한 A개의 전문가에게만 맡긴다. 즉 전체 E보다 작은 A개만을 사용한다. 이렇게 하여서 추론 속도를 빨라 답변을 빠르게 얻을 수 있다.  

다음 글 : Detection, Segementaion, Visualization

이번 글을 통해서 Attention과 Transformer에 대해서 자세하게 알아보았다. 다음 강의에서는 다시 컴퓨터 비전으로 돌아와 핵심 과제인 Detection, Segementaion, Visualization에 대해서 알아보자. 

 

 

강의자료

CS231n 강의 공식사이트 -  cs231n.stanford.edu

CS231n Spring 2025 유튜브 강의 -  youtube

CS231n 강의 슬라이드 -  cs231n.stanford.edu/slides/2025

CS231n 과제 및 자료 - cs231n.stadford.edu.github.io

 

 

 

 

반응형
저작자표시 비영리 동일조건 (새창열림)

'[2025] CS231n' 카테고리의 다른 글

[2025] CS231n 9강: Detection, Segmentation, Visualization, and Understanding - CS231n 강의 노트  (0) 2026.05.26
[2025] CS231n 7강: Recurrent Neural Networks - CS231n 강의 노트  (0) 2025.12.27
[2025] CS231n 6강: Training CNNs and CNN Architectures - CS231n 강의 노트  (0) 2025.11.20
[2025] CS231n 5강: Image Classification with CNNs - CS231n 강의 노트  (0) 2025.11.17
[2025] CS231n 4강: Neural Networks and Backpropagation - CS231n 강의 노트  (0) 2025.11.06
'[2025] CS231n' 카테고리의 다른 글
  • [2025] CS231n 9강: Detection, Segmentation, Visualization, and Understanding - CS231n 강의 노트
  • [2025] CS231n 7강: Recurrent Neural Networks - CS231n 강의 노트
  • [2025] CS231n 6강: Training CNNs and CNN Architectures - CS231n 강의 노트
  • [2025] CS231n 5강: Image Classification with CNNs - CS231n 강의 노트
코드짜는 오리
코드짜는 오리
AI에 대한 글을 올립니다.
  • 코드짜는 오리
    코드짜는 오리
    코드짜는 오리
  • 전체
    오늘
    어제
    • 전체 글 (41)
      • AI숏츠 (17)
      • 논문 리뷰 (10)
      • [2025] CS231n (10)
      • 컴퓨터비전 (2)
      • LLM (1)
  • 링크

    • GitHub
  • 인기 글

  • 최근 글

  • 반응형
  • 태그

    Optimizer
    컴퓨터비전
    ADAM
    transformer
    논문리뷰
    cs231n
    머신러닝
    CV
    AI숏츠
    ComputerVision
    lstm
    llm
    AI
    쉽게배우는
    pytorch
    ChatGPT
    CS231n 강의노트
    deeplearning
    논문
    경사하강법
    attention
    AlexNet
    인공지능
    SGD
    computer vision
    옵티마이저
    rnn
    딥러닝
    GPT
    트랜스포머
  • hELLO· Designed By정상우.v4.10.5
코드짜는 오리
[2025] CS231n 8강: Attention and Transformers - CS231n 강의 노트
상단으로

티스토리툴바