카테고리 없음
트랜스포머 구조는 어떻게 GPT 구조의 기반이 되었을까?:RNN부터 트랜스포머까지
thrcle
2025. 1. 19. 10:46
안녕하세요 오니입니다.
요즘은 무엇이든 막히거나 모를 때 GPT에게 물어보는 것이 일상이 되었는데요. 오랜만에 이론으로 다시 돌아가 딥러닝을 배울 때 등장하는 RNN에서부터 GPT의 구조의 기반이 되는 트랜스포머구조까지의 발전 흐름에 대해 직관적인 이해를 해보도록 하겠습니다.
*이번 포스팅에서는 딥러닝 이해에 도움을 주었던 혁펜하임님의 '혁펜하임의 Easy! 딥러닝' 책에서 흥미로운 부분을 인용하여 작성하였습니다.
RNN
특징
RNN(Recurrent Neural Network)은 시간적 순서나 순차적인 관계를 가진 데이터 처리에 유용한 구조이지만 길이가 긴 경우 초기 정보의 손실 문제가 발생하고 병렬처리가 어려워 학습속도가 느리다는 한계가 있습니다.
동작방식
- 1. 연속 데이터를 처리하기 위해 적절한 단위로 나누는 작업(토크나이징)을 합니다. 나눠진 단위를 토큰이라고 합니다.
- 토크나이징 단위는 글자, 띄어쓰기 등 다양하지만 최근에는 sub-word 단위의 토크나이징을 통해 모델이 새로운 단어나 복합어의 의미를 유추할 수 있도록 해줍니다.
- 'Pretrained'를 학습한 적이 없어도 preview, training, weighted 등의 단어를 통해 pre, train, ed의 의미를 각각 학습했다면 'pretrained'의 뜻을 유추할 수 있습니다.
- 토크나이징 단위는 글자, 띄어쓰기 등 다양하지만 최근에는 sub-word 단위의 토크나이징을 통해 모델이 새로운 단어나 복합어의 의미를 유추할 수 있도록 해줍니다.
- 2. 각 토큰을 숫자로 변환(인코딩)합니다.
- 인코딩 방식도 여러 방법이 있으며 대표적인 방식은 one-hot encoding입니다.
- 이 때 토큰의 갯수와 인코딩된 벡터의 갯수는 동일합니다.
- Ex. 나는 학생입니다 ➡️ 나는=x1=[0,0,1] 학생=x2=[0,1,0] 입니다=x3=[0,0,1]
- 3. 인코딩된 데이터를 순차적으로 RNN에 입력합니다.
- x1 -> x2 -> x3가 순차적으로 rnn 모델을 통과합니다. 모든 시점에서 같은 규칙을 적용하되, 이전 시점의 정보를 현재 시점에 전달합니다.
- h_{1}=tanh(x_{1}W_{x}+b), 출력: y\hat{}_{1}=h_{1}W_{y}+b_{y}
- h_{2}=tanh(x_{2}W_{x}+h_{1}W_{h}+b), 출력: y\hat{}_{2}=h_{2}W_{y}+b_{y}
- h_{3}=tanh(x_{3}W_{x}+h_{2}W_{h}+b), 출력: y\hat{}_{3}=h_{3}W_{y}+b_{y}
- 이때 오래된 시점일수록 activation의 곱해진 수가 많고, activation의 크기는 1이하의 크기이므로 W는 가장 최근 입력인 x3의 영향이 가장 크고 먼 과거의 입력인 x1의 영향이 줄어 듦을 직관적으로 이해할 수 있습니다.
LSTM
- LSTM(Long Short-Term memory)은 핵심 키워드를 잘 보존할 수 있도록 현재 시점까지의 정보를 얼마나 유지할지(Long Term Memory), 새로운 입력값을 얼마나 받아들일지(Short Term Memory)를 학습하도록 고안된 방법입니다.
- 기존 RNN에서 gate(정보의 흐름을 조절하는 밸브 역할) 개념을 추가한 방식입니다.
- LSTM의 구조는 Input gate(새로운 정보를 얼마나 받아들일 것인지 결정), Forget gate(기존 정보를 얼마나 유지할 것인지 결정), Output gate(얼마나 외부로 출력할지 결정)로 이루어져있으며 각각 0과 1사이의 값을 가집니다(중요한 정보는 1에 가깝게)
- 하지만 이 방법 역시 RNN처럼 '순차적 연산'이라는 기본 구조를 따르고 있어 긴 시퀀스 처리에는 여전히 한계가 존재했습니다.
Seq2seq
- seq2seq은 입력시퀀스를 받아 출력 시퀀스로 변환하는 모델로, 두 개의 RNN을 연결한 구조이며 주로 RNN의 many-to-many 문제에 특화된 구조로 사용됩니다.
- 인코더에서는 입력 시퀀스를 압축하여 context vector를 생성하고 디코더에서는 context vector를 기반으로 출력 시퀀스를 생성합니다.
- context vector는 2014년에 Google Brain 팀이 발표한 논문 "Sequence to Sequence Learning with Neural Networks"에서 처음 소개된 개념입니다.
- context vector는 인코더가 입력 시퀀스의 정보를 압축한 것으로, 디코더가 시퀀스를 생성할 때 참조하는 핵심 정보가 됩니다.
💡seq2seq 모델에서 context vector는 인코더의 마지막 은닉벡터 h3로, 디코더에 전달되어 첫 번째 은닉벡터로 사용됩니다. h3가 디코더로 전달된 후에는 더 이상 입력 문장의 정보를 추가로 활용하지 않기 때문에 디코더의 모든 시점에서 동일한 context vector가 사용됩니다
Attention
- 'Attention'은 이름에서 알 수 있듯, 어떤 단어를 집중할 지를 학습하는 방법입니다.
- Attention은 Context Vector가 출력 시점마다 달라진다는 큰 차이가 있습니다.
- 기존 RNN 방식은 h3를 x1,x2,x3의 정보를 모두 담은 '문장 벡터'로 해석했습니다.
- h_{3}=tanh(x_{3}W_{x}+h_{2}W_{h}+b), 출력: y\hat{}_{3}=h_{3}W_{y}+b_{y}
- Attention에서는 각 은닉벡터를 '개별 단어를 잘 표현'하는 것으로 해석합니다.
- h1, h2, h3는 각각 '저는','학생', '입니다'를 벡터 공간에서 잘 표현하는 것.
- 기존 RNN 방식은 h3를 x1,x2,x3의 정보를 모두 담은 '문장 벡터'로 해석했습니다.
- Attention 메커니즘에서는 각 시점의 Context Vector가 추가로 출력 계산에 관여하고, 시점마다 다른 Context Vector를 사용함으로써 Attention 메커니즘은 디코더가 출력을 생성할 때 입력 시퀀스의 정보를 더 유연하게 활용할 수 있게 합니다.
트랜스포머의 Self-Attention
- 트랜스포머는 문장의 순서를 인식하는 접근방식을 바꾼 방법입니다. 토큰의 위치정보를 쓰지 않는 대신 위치인코딩이라는 기법을 사용합니다. 위치인코딩은 각 토큰의 임베딩 벡터에 해당 토큰의 위치 정보를 추가하는 방식으로, 모델이 토큰의 순서를 인식할 수 있게 해줍니다.
- 앞선 순서의 표현의 의미가 희미해지는 현상으로 인해 최근 단어에만 집중하는 문제는 Encoder-Decoder Attention으로 완화
- 앞선 순서의 표현이 사라지는 현상으로 인해 디코더 파라미터 학습의 어려운 문제는 디코더의 Self-attention으로 해결
- 이러한 혁신적인 구조 덕에 병렬처리로 인한 속도 개선 및 긴 문장에 대해서도 높은 성능을 보일 수 있었고 이 구조를 기반으로 한 GPT, BERT 등의 모델 등 자연어 처리 기술이 더욱 발전했습니다.