Company
교육 철학

어텐션(Attension)

학습 목표

지금까지는 하나의 정답(분류)이나 이미지(생성)를 출력하는 모델을 만들었습니다. 이번에는 입력된 문장에 맞춰 길이가 다른 새로운 문장을 출력하는, 더 복잡하고 유연한 모델을 만들어 봅니다. 이를 위해 인코더(Encoder)가 문장을 읽은 모든 순간을 디코더(Decoder)가 참고하는 어텐션(Attention) 메커니즘을 이해하고 구현합니다.

핵심 용어 미리보기

1. Seq2Seq (Sequence-to-Sequence) 모델링

길이가 다른 입력과 출력을 처리하기 위한 모델 구조입니다. 예를 들어, 짧은 영어 문장을 긴 한국어 문장으로 번역하는 것처럼 입력 시퀀스(Sequence)와 출력 시퀀스의 길이가 다를 때 사용됩니다.

2. 어텐션 (Attention)

번역기가 **'집중(Attention)'**하는 방식을 모방한 기술입니다.
기존 번역기는 입력 문장을 하나의 정보 덩어리로 압축해서 번역을 시작했습니다. 하지만 어텐션 기법은, 번역할 단어를 만들 때마다 입력 문장의 모든 단어를 다시 훑어보고, 현재 번역할 내용과 가장 관련이 깊은 단어에 더 집중합니다. 예를 들어 'student'를 번역할 차례가 되면, 입력 문장의 'student'라는 단어에 높은 가중치를 부여하는 식이죠.

3. 토큰 (Token)

컴퓨터가 이해할 수 있도록 문자를 숫자로 나타내는 방법입니다.
<SOS> (Start of Sentence): 문장의 시작을 알리는 특별 토큰입니다.
<EOS> (End of Sentence): 문장의 끝을 알리는 특별 토큰입니다.

4. GRU (Gated Recurrent Unit)

LSTM의 간소화 버전인 순환 신경망의 한 종류입니다. LSTM처럼 복잡한 셀 상태(Cell State) 없이 은닉 상태(Hidden State)만으로 과거와 현재의 정보를 효율적으로 처리합니다. LSTM보다 구조가 간단하고 계산이 빠르다는 장점이 있습니다.
우리가 사용하는 언어는 저마다 고유한 문법과 구조를 가지며, 같은 의미를 표현하더라도 문장을 구성하는 단어의 개수는 천차만별입니다. "I ate an apple"은 4단어지만, "나는 사과를 먹었다"는 3개의 어절로 표현되죠. 이러한 언어 간의 불일치는 인공지능 번역기를 만들 때 근본적인 질문을 던집니다. 입력될 문장의 길이는 알 수 있지만, 번역되어 나올 문장이 몇 개의 단어로 이루어질지는 모델이 전혀 예측할 수 없습니다. 이처럼 출력의 길이를 알 수 없는 문제는 어떻게 해결할 수 있을까요?
이 난제를 풀기 위해 고안된 구조가 바로 Seq2Seq(Sequence-to-Sequence), 즉 '문장에서 문장으로'의 모델입니다. Seq2Seq는 이름 그대로 하나의 문장(시퀀스)을 입력받아 완전히 새로운 문장(시퀀스)을 출력하는 데 특화된 아키텍처입니다. 이 구조는 크게 두 부분, **인코더(Encoder)**와 **디코더(Decoder)**로 나뉘어 작동합니다.
먼저, 인코더의 역할은 번역하고자 하는 원본 문장(예: 한문)을 읽어 들이는 것입니다. 인코더는 LSTM과 같은 순환 신경망으로 구성되어, 문장의 첫 단어부터 마지막 단어까지 순차적으로 읽으며 문장 전체에 담긴 핵심 의미와 맥락을 하나의 정보 벡터로 압축합니다. 이 벡터는 원본 문장의 '정수(essence)'를 담은 요약본이라고 할 수 있습니다.
다음으로, 디코더가 이 압축된 정보 벡터를 전달받아 번역을 시작합니다. 디코더 역시 LSTM으로 구성되어, 인코더가 전달한 문장의 의미를 바탕으로 새로운 문장(예: 영어)을 '생성'해냅니다. 여기서 핵심은 디코더가 **<SOS>(Start of Sentence)**라는 '문장 시작' 신호를 받는 순간부터 단어를 하나씩 만들어내고, 번역이 끝났다고 스스로 판단하는 시점에 **<EOS>(End of Sentence)**라는 '문장 끝' 신호를 출력한다는 점입니다. 이 과정을 통해 모델은 출력 단어의 개수를 미리 정해둘 필요 없이, 문맥에 맞게 유연한 길이의 번역문을 완성할 수 있습니다.
이 모든 과정에서 '단어'는 컴퓨터가 이해할 수 있는 숫자 표현, 즉 **토큰(Token)**으로 변환됩니다. 이 토큰은 BOW(Bag-of-Words) 방식의 희소한 벡터일 수도, 혹은 임베딩 층을 거친 밀집 벡터일 수도 있습니다. 결국 Seq2Seq 모델은 이처럼 숫자화된 토큰들의 시퀀스를 입력받아, 의미를 압축하고, 다시 새로운 토큰의 시퀀스를 생성해내는 정교한 '문장 번역 공장'이라고 할 수 있습니다.

Seq2Seq 장단점

장점
단점
• 순서가 있는 데이터를 다룰 때 사용할 수 있습니다.
• 알고리즘이 복잡하기 때문에 구현이 어렵습니다.
• RNN 및 LSTM 알고리즘에 비해 성능이 좋습니다.
• 모든 시점을 고려하기 때문에 일반적인 시계열 알고리즘보다 계산량이 늘어납니다.

유용한 곳

텍스트를 입력으로 받고 텍스트를 출력할 때 사용하기 좋습니다.
어텐션 메커니즘은 이미지 전체를 보도록 CNN에서 사용할 수도 있습니다.

Attention 메커니즘

1. 기본 Seq2Seq의 문제점: 정보의 병목 현상 bottleneck

보내주신 글처럼, 기본적인 Seq2Seq 모델에는 한계가 있습니다.
인코더는 입력 문장(예: "I am a student")의 모든 정보를 읽어서 단 하나의 '요약본' 벡터(마지막 시점의 은닉 상태)로 압축합니다.
디코더오직 이 '요약본' 하나만을 가지고 번역(예: "나는 학생입니다")을 시작해야 합니다.
이 방식은 문장이 짧으면 괜찮지만, 문장이 길어지면 심각한 문제가 생깁니다. 100단어짜리 긴 문장의 모든 의미와 뉘앙스를 단 하나의 '요약본'에 빠짐없이 담는 것은 거의 불가능합니다. 문장 앞부분의 중요한 정보들은 뒤로 갈수록 점점 희미해지거나(fades) 덮어쓰여 사라지게 됩니다.

2. 어텐션의 해결책: "필요한 부분만 다시 보자!"

*어텐션(Attention)**은 이 '정보 병목' 문제를 해결하기 위해 "번역할 때마다 원본을 다시 참고하자!"라는 아주 직관적인 아이디어를 도입합니다.
디코더가 '요약본' 하나만 보고 번역을 하는 것이 아니라, 단어를 하나 생성할 때마다 인코더의 모든 시점(모든 입력 단어)을 다시 훑어보는 것입니다.

3. 어텐션 메커니즘의 작동 원리 (4단계)

어텐션은 디코더가 매 순간 "지금 어떤 입력 단어에 **집중(Attention)**해야 하지?"를 계산하는 과정입니다.
1.
연관성 계산: 디코더가 예를 들어 "나는"이라는 단어를 막 출력했다고 가정해 봅시다. 이제 다음 단어를 만들기 위해, 자신의 현재 상태와 인코더의 모든 입력 단어("I", "am", "a", "student")의 은닉 상태를 하나씩 비교하며 **연관성(유사도)**을 계산합니다. (본문의 '내적'이 이 과정의 일부입니다.)
2.
중요도(가중치) 계산: 이 연관성 점수들을 소프트맥스(Softmax) 함수에 통과시켜 **'어텐션 가중치(Attention Weights)'**라는 중요도 점수로 변환합니다. 이 점수들의 합은 1이 되며, 현재 번역에 어떤 단어가 얼마나 중요한지 %로 나타냅니다.
예: "student"를 번역할 차례라면, 중요도는 [I: 0.1, am: 0.05, a: 0.05, **student: 0.8**] 처럼 "student"에 압도적으로 높게 나옵니다.
3.
컨텍스트 벡터 생성: 이 중요도(가중치)를 각 입력 단어의 은닉 상태에 곱해준 뒤 모두 더합니다. 이렇게 하면 '현재 번역에 가장 필요한 정보만 쏙 뽑아낸 맞춤형 요약본', 즉 **컨텍스트 벡터(Context Vector)**가 만들어집니다. (본문의 '중요도를 하나의 벡터로 묶는 과정'입니다.)
4.
최종 출력: 디코더는 이 '맞춤형 요약본'과 자신의 현재 상태를 합쳐(본문의 '디코더의 은닉 상태와 합쳐') 다음 단어인 "학생입니다"를 예측해냅니다.
이 과정을 매 단어를 생성할 때마다 반복하기 때문에, 어텐션은 문장이 아무리 길어져도 번역에 필요한 정확한 소스 정보를 놓치지 않고 참고할 수 있습니다.

GRU란? (Gated Recurrent Unit)

GRULSTM을 더 간단하게 만든 모델입니다. LSTM이 '장기 기억(셀 상태)'과 '단기 기억(은닉 상태)'을 둘 다 사용했던 것과 달리, GRU는 이 두 가지를 하나의 '은닉 상태'로 통합했습니다.
구조는 더 단순해졌지만, LSTM과 비슷하게 '게이트(Gate)'를 사용해서 과거와 현재의 정보를 효과적으로 학습할 수 있습니다.

GRU의 핵심 게이트 2가지

GRU는 **'리셋 게이트'**와 **'업데이트 게이트'**라는 두 개의 문을 통해 정보의 흐름을 제어합니다.

1. 리셋 게이트 (Reset Gate, R)

역할: "과거의 기억(h1)을 얼마나 무시(리셋)할까?"
작동 방식: 이 게이트는 현재 정보(x)와 과거의 기억(h1)을 살펴본 뒤, "과거 기억이 지금 별로 안 중요해"라고 판단하면 과거 기억의 영향력을 줄여버립니다. (이미지의 R 부분)
목적: 현재 정보를 바탕으로 새로운 후보 기억(H)을 만들 때, 불필요한 과거 기억을 지우는 역할을 합니다.

2. 업데이트 게이트 (Update Gate, Z)

역할: "과거 기억(h1)과 새로운 기억(H) 중 무엇을 얼마나 반영할까?"
작동 방식: 이 게이트는 일종의 '비율 조절기'처럼 작동합니다.
과거 기억 보존: "과거 기억은 이만큼(1-Z) 가져가자." (이미지의 번 경로)
새로운 기억 추가: "새로운 후보 기억은 이만큼(Z) 가져오자." (이미지의 번 경로)
목적: 이 두 정보의 비율을 조절하여 더한 값으로 최종 **현재 상태(h2)**를 만듭니다. 만약 Z 값이 0에 가까우면 과거 기억을 거의 그대로 가져오고, 1에 가까우면 새로운 기억을 많이 반영하게 됩니다.

결론

GRU는 LSTM의 복잡한 '셀 상태'를 없애고 리셋 게이트업데이트 게이트라는 두 개의 문만으로 정보의 흐름을 제어합니다. 덕분에 구조는 더 간단하고 계산은 빠르면서도, LSTM과 유사하게 장기 의존성 문제(과거의 정보를 잘 기억하는 능력)를 효과적으로 처리할 수 있습니다.