민프
[AI | ML] [LLM] 2-1. LLM의 동작원리 - Seq2Seq, attention 본문
이번 포스팅에서는 LLM의 동작원리에 대해서 알아보도록 하겠습니다.
LLM의 동작원리를 알아보기 전에 이전 포스팅에서 언급한 Seq2Seq, Transformer에 대해서 자세하게 알아보고 진행하도록 하겠습니다.
이 두 모델은 텍스트 번역, 요약, 질문 응답 같은 자연어 처리 작업에서 큰 역할을 했는데요, Transformer를 제대로 이해하려면 먼저 Seq2Seq가 무엇인지, 그리고 왜 Transformer가 필요한지 이해해야 합니다.
1. Transformer를 이해하려면 왜 Seq2Seq, Attention부터 공부해야 할까?
Transformer는 Seq2Seq, Attention 모델의 개념을 기반으로 발전했기 때문에, Transformer를 이해하려면 Seq2Seq, Attention의 작동 원리를 먼저 알아야 하고,
Seq2Seq는 입력 시퀀스를 출력 시퀀스로 변환하는 최초의 딥러닝 모델입니다.
예를 들어, 영어 문장을 프랑스어로 번역하거나, 문서를 요약하는 일을 할 때 사용되죠.
Transformer는 이 Seq2Seq의 구조를 개선한 모델입니다.
즉, Transformer를 이해하려면 “Seq2Seq가 어떻게 동작하고, 어떤 한계를 가졌는지”를 먼저 아는 게 중요합니다.
여기에서 시퀀스에 대해서 간단하게 설명하자면
Sequence는 영어로 (파파고 참고)
- n. 연달아 일어남, 연속, 속발, 연쇄.. 등...
- vt. 차례로 일어나다, 정리[배열]하다
인데요.
프로그래밍에서의 시퀀스는 순서가 있는 데이터의 나열을 의미합니다. 이건 시간적, 순서적으로 정렬된 요소들로 구성되고, 단어, 숫자 등.. 다양한 형태를 가질 수 있습니다.
예를 들어서)
1. 문장: 단어들이 순서대로 배열된 시퀀스
- “I love you” → 단어 순서: I → love → you
2. 시간 시리즈: 시간에 따라 순차적으로 기록된 데이터
- 주식 가격: Day 1 → Day 2 → Day 3 …
3. 음성 데이터: 시간에 따라 변화하는 소리의 패턴
따라서 Seq2Seq에서 등장하는 입출력 시퀀스는 아래와 같은 뜻을 지니고 있으니 참고하시기 바랍니다.
- 입력 시퀀스(Input Sequence): 모델이 처리해야 하는 원래의 데이터.
- 예: 번역 모델에서 번역하고자 하는 원문.
- 출력 시퀀스(Output Sequence): 모델이 생성해야 하는 결과 데이터.
- 예: 번역 모델에서 생성된 번역문.
입,출력 시퀀스에 대해서 예시를 들어보자면 아래와 같습니다.
NLP에서 시퀀스란?
자연어 처리(NLP)에서 시퀀스는 문장의 단어들의 순서를 의미합니다.
예를 들어, 문장 “I love you”는 다음과 같은 시퀀스입니다:
• 입력 시퀀스: “I”, “love”, “you”
• 각 단어가 순서대로 정렬된 데이터죠.
시퀀스의 종류:
1. 입력 시퀀스: 번역할 원문 문장 → “I love you”
2. 출력 시퀀스: 번역된 결과 문장 → “Je t’aime”
시퀀스에 대해서 제대로 이해를 하셔야 이후 Seq2Seq, Attention, Transformer에 대해서 더 잘 이해하실 수 있습니다.
2. Seq2Seq 동작원리
Seq2Seq는 Encoder-Decoder 구조를 사용합니다. 쉽게 말해
1. Encoder: 입력 문장을 읽어서 이를 하나의 고정된 벡터로 압축합니다.
- 예: “I love you”라는 문장을 이해해서 “요약된 의미”를 만들어내는 역할.
2. Decoder: 압축된 벡터를 기반으로 출력 문장을 생성합니다.
- 예: “Je t’aime”라는 프랑스어 문장을 만들어내는 역할.
이 과정은 순차적으로 이루어지는데요
- Encoder는 입력 단어를 하나씩 읽으면서 정보를 쌓아가고,
- Decoder는 Encoder에서 받은 정보를 바탕으로 단어를 하나씩 생성합니다.
사진을 예시로 들면 더 이해하시기 좋을 것 같아서
위키독스에서 Seq2Seq를 설명하는 부분을 캡쳐해서 가져와보았습니다.
위 사진을 기반으로 설명해보겠습니다.
1. 입력 시퀀스가 들어옴
입력 시퀀스는 단어들의 나열로 이루어져 있습니다.
예를 들어, “I am a student”라는 문장이 있다고 하면, 각 단어는 컴퓨터가 이해할 수 있도록 벡터(숫자 배열)로 변환됩니다.
- “I” → [1.2, 0.5, 0.3]
- “am” → [0.7, 1.5, 0.9]
- “a” → [0.6, 0.8, 1.2]
- “student” → [0.1, 0.8, 1.2]
2. 인코더(Encoder)에서 Context Vector 생성
- Encoder는 입력 시퀀스를 단어별로 처리하며, 문맥 정보를 하나씩 통합합니다.
- 이 과정에서 LSTM이나 RNN 같은 순환 신경망을 통해 마지막 시점의 Hidden State가 생성됩니다.
- 이 마지막 Hidden State가 바로 Context Vector입니다.
- Context Vector = [2.3, 1.9, 2.0]
- 이 벡터는 입력 문장의 의미를 요약한 정보입니다.
3. 고정된 크기의 벡터로 요약
- Context Vector는 항상 고정된 크기를 가지며, 입력 문장의 길이와 관계없이 일정한 크기를 유지합니다.
- 고정된 크기의 Context Vector를 사용하는 이유는 Decoder가 이를 이해하기 쉽게 만들기 위해서입니다.
입력 문장이 길든 짧든, Decoder는 항상 동일한 크기의 Context Vector를 받아야 일관성 있게 출력 시퀀스를 생성할 수 있습니다. - 예: 입력 문장이 3단어든 10단어든, Context Vector는 크기가 3(예: [x, y, z])로 고정됩니다
4. 디코더(Decoder)
- Decoder는 Context Vector를 기반으로 단어를 하나씩 생성합니다.
- 이전에 생성된 단어를 다음 단어를 예측하는 데 사용하는 순차적 작업입니다.
- 최종적으로 출력 시퀀스를 생성.
정리를 해보자면 아래와 같습니다.
*요약*
1. Context Vector의 생성 과정
• 입력 시퀀스 → Encoder → Context Vector.
• Encoder는 입력 시퀀스의 모든 정보를 하나의 벡터로 요약합니다.
2. Context Vector의 고정 크기
• Context Vector는 입력 시퀀스의 길이와 무관하게 고정된 크기를 가지며, 이는 Decoder가 입력으로 사용하기 쉽게 설계된 것입니다.
결론적으로는 입력 시퀀스 자체에 Context Vector가 있는 것이 아니라, 입력 시퀀스를 처리한 Encoder가 Context Vector를 생성하고, 이 Context Vector는 항상 고정된 크기로 요약되어, Decoder가 이를 기반으로 출력 시퀀스를 생성합니다.
3. Seq2Seq의 한계점
Seq2Seq에는 아래와 같은 한계점이 존재하였습니다.
1) Context Vector의 정보 손실
Seq2Seq는 입력 문장의 모든 정보를 Context Vector라는 하나의 고정된 벡터로 압축합니다.
- 예를 들어, “The quick brown fox jumps over the lazy dog”라는 긴 문장을 작은 벡터 하나로 압축하려면 당연히 정보가 손실될 수밖에 없겠죠.
- 특히 문장이 길어질수록 중요한 정보가 사라지거나, 번역 품질이 떨어졌습니다.
2) 긴 문맥 처리 어려움
입력 문장의 앞부분과 뒷부분 사이의 관계를 이해하는 게 어려웠습니다.
- 예 : “fox”와 “jumps” 같은 단어가 멀리 떨어져 있으면 관계를 유지하기 힘들었죠.
3) 병렬 처리 불가능
Seq2Seq는 입력 데이터를 순차적으로 처리해야 했습니다.
- 즉, 첫 단어부터 마지막 단어까지 하나씩 처리해야 하므로 학습 속도가 느렸습니다.
4. Transformer : Seq2Seq의 한계를 해결한 모델 (feat. Attention)
위에서 언급한 Seq2Seq의 한계점을 해결하기 위해 Transformer라는 모델이 나왔습니다.
1) Seq2Seq와의 차이점
Transformer는 Seq2Seq의 Encoder-Decoder 구조를 계승하면서도, 이를 개선했습니다.
- Context Vector 대신 Attention: Transformer는 문장의 모든 단어를 동시에 참고하면서 관계를 학습.
- Self-Attention 메커니즘: 입력 문장의 각 단어가 서로 어떤 관계인지 계산해, 중요한 단어에 집중.
여기까지 차이점만 보면 Attention을 사용한 부분이 가장 큰 것 같죠?
그럼 Transformer에 대해서 더 알아보기 전에 Attention에 대해서 해당 논문을 기반으로 알아보도록 하겠습니다.
5. Attention이란? (Neural Machine Translation by Jointly Learning to Align and Translate 논문 리뷰)
해당 논문은 2015년 ICLR에서 발표되었으며, Attention 메커니즘을 도입한 RNNsearch 모델을 통해 신경망 기반 기계 번역의 성능을 크게 향상시킨 연구입니다. 논문의 주요 기여는 입력 시퀀스와 출력 시퀀스 간 정렬(alignment)을 학습하여 번역 품질을 높이는 것입니다.
Attention은 단어의 뜻에서도 알수 있 듯 NLP 모델에서 어떤 단어가 중요한지 판단하고, 중요한 정보에 더 집중하도록 도와주는 기술 입니다. 쉽게 말하면, 긴 문장을 처리할 때 “필요한 부분에 초점을 맞추는 방법”이죠.
예를 들어, 번역을 할 때 문장의 모든 단어가 똑같이 중요한 건 아니잖아요? 바로 그런 이유로 Attention이 필요한 겁니다.
5-1. 연구 배경
1) 기존 기계 번역의 한계
- 기존의 Seq2Seq 모델은 입력 문장을 “압축(Context Vector)“해서 하나의 벡터에 담아 Decoder로 전달했습니다.
- 예를 들어, “The quick brown fox jumps over the lazy dog” 같은 긴 문장을 번역하려면, 모든 단어를 하나의 고정된 벡터에 담기 어렵다는 단점이 존재하였습니다. 짧은 문장은 괜찮았지만, 긴 문장에서는 중요한 정보가 사라지는 문제가 생겼죠.
2) 새로운 접근의 필요성
- 따라서 긴 문장에서 중요한 정보에 집중할 수 있는 메커니즘이 필요했습니다.
- 이를 해결하기 위해 Attention 메커니즘을 제안하여, Decoder가 입력 문장 내에서 중요한 단어를 동적으로 선택하도록 했습니다.
5-2. 제안된 모델: Attention 기반 RNNsearch
1) 주요 아이디어
- Soft Alignment (필요한 곳에 집중!)
- 입력 문장을 단순히 고정된 벡터로 압축하지 않고, 각 출력 단어를 생성할 때 입력 문장의 특정 위치에 “집중(attend)“하여 번역 품질을 높이는 것을 의미합니다.
- 예를 들어, “I love you”를 번역한다고 해보겠습니다.
아래와 같이 중요한 단어와 구간에 더 집중(attend)하므로, 긴 문장에서도 더 정확하고 자연스러운 번역이 가능해졌습니다.
- “Je”를 생성할 때는 입력 문장의 “I”에 집중!
- “t’“를 생성할 때는 “love”에 집중!
- “aime”를 생성할 때는 “you”에 집중!
- Bidirectional RNN (앞뒤를 모두 살펴보기!)
- 입력 문장을 순방향과 역방향으로 처리하여 문장의 전체 맥락을 더 잘 이해합니다.
- "The cat sat" 으로 예시를 들어보겠습니다.
아래와 같이 두 방향의 정보를 결합하여 각 단어가 앞뒤 문맥을 모두 반영하도록 만듭니다
- 순방향 RNN: 문장을 왼쪽에서 오른쪽으로 처리합니다.
- “The” → “The cat” → “The cat sat”
- 역방향 RNN: 문장을 오른쪽에서 왼쪽으로 처리합니다.
- “mat” → “on the mat” → “sat on the mat”
- 순방향 RNN: 문장을 왼쪽에서 오른쪽으로 처리합니다.
2) Encoder와 Decoder의 역할
- Encoder
Encoder는 입력 문장을 한 단어씩 읽으면서, 단어들 사이의 관계와 문맥을 파악하는 역할을 합니다. 마치 노트 필기를 하면서 요약 정리를 하는 사람이라고 생각하시면 될 것 같습니다.
- 입력 문장을 Bidirectional RNN을 사용해 숨겨진 상태(hidden state)들의 시퀀스로 변환합니다.
- 각 단어의 상태는 이전과 이후 문맥을 모두 포함합니다.
- Decoder
- Attention 메커니즘을 통해 입력 문장의 특정 부분에 집중하며 출력 단어를 생성합니다.
- 각 출력 단어를 생성할 때 Context Vector가 동적으로 재계산됩니다.
5-3. 동작원리
이제 단계별로 동작원리를 설명해보겠습니다.
번역 작업에서 Attention 메커니즘은 Encoder와 Decoder 간의 관계를 학습하게 되며, 이를 “Encoder-Decoder Attention”이라고 부릅니다.
다시 한번 말씀드리지만 Attention 메커니즘의 핵심은 "집중한다!" 입니다.
즉, 단어 벡터 간의 유사도를 계산해서 더 중요한 단어에 집중한다는 것 이라는 것을 머리속에 생각하면서 아래 단계들을 보시는면 더 쉽게 이해하실 수 있으실겁니다.
그럼 이제 영문 “I love you”를 “Je t’aime” 번역하는 과정을 예시로 설명해보겠습니다.
1. 단계 1: 단어 임베딩을 Query, Key, Value로 변환 (wikidocs에서 위 이미지를 가져와봤습니다. 참고하면서 봐주세요)
여기서 Query, Key, Value는 다음과 같이 정의됩니다:
- Encoder: 입력 문장 “I love you”를 처리하며 각 단어의 임베딩을 기반으로 Key (K)와 Value (V) 벡터를 생성합니다.
- Decoder: 출력 문장을 생성하면서 현재 단어(예: “Je”)의 상태를 기반으로 Query (Q)를 생성합니다.
정리하자면
- Query (Q) → Decoder가 현재 출력 단어를 생성하기 위해 입력 문장에서 어떤 단어에 집중해야 하는지를 결정하기 위해 사용됩니다.
- Key (K) → Encoder가 입력 문장 내 각 단어의 정보를 담고 있습니다.
- Value (V) → Encoder가 입력 문장의 각 단어의 최종 출력을 저장합니다.
2. 단계: Query와 Key를 통해 가중치 계산
Decoder가 출력 단어를 생성할 때, 입력 문장의 각 단어와의 관계를 계산합니다.
- “Je”를 생성할 때
- Decoder는 “Je”의 Query와 Encoder의 Key 벡터(각 단어의 정보)를 비교해 가중치(Attention Score)를 계산합니다.
- 이때 “I”의 Key 벡터가 “Je”와 가장 관련이 크기 때문에 높은 가중치가 부여됩니다.
Attention 점수는 Query와 Key 간의 아래 공식과 같은 계산됩니다:
- eij : Attention Score.
- 출력 시퀀스의 i-번째 단어를 생성할 때, 입력 시퀀스의 j-번째 단어와의 유사도(점수)를 의미합니다.
- • si-1 : Decoder의 이전 상태(hidden state).
- • hj : Encoder의 j-번째 단어의 숨겨진 상태(hidden state).
- • a(..) : 유사도를 계산하는 함수.
이렇게 유사도를 구하는 것을 논문에서는 "Feedforward Neural Network"을 사용한다고 합니다.
계산된 점수는 Softmax 함수를 통해 확률 분포로 변환됩니다
- aij : 입력 문장의 단어 j 가 출력 단어 i 를 생성하는 데 얼마나 중요한지 나타내는 가중치입니다
- 이 값은 0~1 사이의 값으로 정규화됩니다.
결과값 예시
- “Je”에 대해: “I”가 가장 높은 가중치(예: 0.8)를 갖습니다.
- “t’“에 대해: “love”가 높은 가중치(예: 0.9)를 갖습니다.
3. 단계 3: Value 벡터에 가중치를 곱해 최종 결과 계산
각 입력 단어의 Value (V) 2단계의 결과(벡터에 가중치) aij를 곱해 최종 결과를 계산합니다:
- hj : 입력 단어 j 의 Value 벡터
- aij : 가중치
예시
- “Je”를 생성할 때
- “love”의 Value 벡터에 가장 높은 가중치를 곱해 “t’“를 생성합니다.
- “t’“를 생성할 때
- “I”의 Value 벡터에 가장 높은 가중치 aij를 곱해 “Je”의 출력을 계산합니다
최종결과
Decoder는 각 출력 단어를 생성할 때 입력 문장의 특정 부분에 집중하면서 번역을 수행합니다.
- “Je”는 “I”에 집중.
- “t’“는 “love”에 집중.
- “aime”는 문맥을 참고해 최종적으로 생성됩니다.
이 원리가 바로 Attention 메커니즘의 핵심이고, “집중한다”는 것은 단어 벡터 간의 유사도를 계산해 중요한 단어에 더 많은 비중을 주는 것을 의미합니다.
5-4. 기존 모델과 비교
“그래서 이게 기존 모델과 어느 정도의 차이가 있느냐?” 궁금하신 분들이 많으실 겁니다. 기존 Seq2Seq - RNN Encoder-Decoder 모델과 새롭게 제안된 Attention - RNNsearch 모델이 어떤 차이를 만들었는지 비교해보겠습니다.
논문에서 나와있는 비교 Setting(데이터셋, 모델 선정 등등..)값 들을 말씀드려보겠습니다.
1. 데이터셋
- WMT ’14 영어-프랑스어 번역 데이터셋 사용
- 총 850M 단어로 구성된 다양한 병렬 코퍼스를 포함 (Europarl, news commentary, UN, 웹 크롤링 등).
- 이를 348M 단어로 줄이기 위해 데이터 선택 기법을 사용.
- 테스트셋으로는 WMT ’14 news-test-2014(3,003 문장)를 사용.
- 전처리
- 단어 토큰화를 수행하고, 각 언어에서 가장 많이 등장하는 30,000개 단어만 사용.
- 리스트에 없는 단어는 [UNK] 토큰으로 대체.
- 소문자화, 형태소 분석 등 특별한 추가 전처리는 적용하지 않음.
2. 모델 설정
두 가지 모델이 사용되었습니다
- 1. RNN Encoder-Decoder (RNNencdec): 기존 Seq2Seq 모델.
- Encoder와 Decoder는 각각 **1,000개의 숨겨진 상태(hidden units)**를 가짐.
- 2. RNNsearch: 제안된 Attention 기반 모델
- Encoder
- Bidirectional RNN을 사용해 입력 문장을 순방향과 역방향으로 처리
- 각 방향은 1,000개의 숨겨진 상태를 가짐.
- Decoder
- Attention 메커니즘을 통해 입력 문장의 특정 부분에 집중하며 출력 단어를 생성.
- 숨겨진 상태 수: 1,000개.
- Encoder
3. 학습방법
아래와 같이 나와있는데 SGD학습 알고리즘, 80개 문장으로 설정된 미니배치, Beam Search 알고리즘을 사용해 최적의 번역을 찾는다고 하는 것 같습니다.
근데 제가 관련 알고리즘들을 잘 몰라서 논문 그대로 올려드리겠습니다.
4. 결과
- 4-1. 정량적 결과
BLEU 점수를 사용하여 번역 성능을 평가했습니다. BLEU는 번역의 질을 정량화하는 지표입니다.보시는 것 과 같이 RNNsearch는 모든 경우에서 기존 RNNencdec 모델을 능가합니다.
특히 긴 문장에서 RNNsearch의 성능이 훨씬 뛰어나며, 이는 Attention 메커니즘이 기존 Seq2Seq보다 성능이 좋은 걸 확인하실 수 있습니다. - 4-2. 정성적 결과
- 예시 - 원문: “This kind of experience is part of Disney’s efforts to extend the lifetime of its series and build new relationships…”
- RNNencdec 번역: 중간 이후 의미가 왜곡되며 오류가 발생.
- RNNsearch 번역: 문장의 모든 의미를 정확히 번역.
- 예시 - 원문: “This kind of experience is part of Disney’s efforts to extend the lifetime of its series and build new relationships…”
5. 결론
정량적, 정성적 분석을 통해 RNNsearch가 기존 RNNencdec 모델보다 현저히 우수하다는 것이 입증되었습니다.
여기까지 Transformer을 제대로 알기 위한 Seq2Seq, attention를 알아보았습니다.
다음 포스팅에서는 Transformer에 대해서 말씀드려보겠습니다.
출처
https://arxiv.org/abs/1409.3215
https://arxiv.org/abs/1409.0473
https://arxiv.org/abs/1706.03762
https://www.youtube.com/watch?v=AA621UofTUA&t=572s