23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요. Teus입니다.
이번에 포스팅에서는 GPT라는게 어떻게 구성이 되어있고
현재 많이 쓰이는 ChatGPT의 동작을 LLAMA모델을 통해서 대략적으로 알아봅니다.
전체적인 문맥을 만드는 일은 굉장히 어렵지만
현재 단어를 보고, 다음에 올 단어를 예측해보는일은 어느정도 가능한 일 입니다.
예를 들어 볼까요?
life is short
위 문장만 주어질 경우 다음 단어가 무엇이 나와야 할지 맞추기 어렵지만
life is short, you need
까지 주어지면, 앞에있는 단어들을 통해서 해당하는 문장의 다음 단어가 python일것이라고 대략적으로 예상해 볼 수 있습니다.(물론 🍺도 맞지만요!)
이처럼 문장이 주어지고, 그 문장 다음에 어떤 단어가 나올지를 맞추는게 GPT의 알파이자 오메가 라고 할 수 있습니다.
이때 문장을 주고, 해당하는 문장에 따른 다음 문자를 예측하면 되는것이기 때문에
기존 머신러닝의 데이터 : Label1 과같은 형태의 데이터가 없더라도
인터넷에 존재하는 모든 텍스트가 이런 다음단어 예측기의 데이터로 활용이 가능해 집니다.
GPT는 이제는 유명해진 General Pretrained Transformer의 약자 입니다.
full name에서 추론해 볼 수 있지만, 블라블라Transformer 인것을 알 수 있습니다.
Transformer는 (범블비🤪) google의 attention is all you need에서 처음 등장한것으로 알고있습니다.
그리고, 이 Transformer를 설명할 때 항상 아래그림이 등장하죠
근데, 저만 그런가요?
사실 이렇게 주어지고, 이해하라고하면 저는 잘 모르겠더라구요.
그래서 조금더 설명을 추가해 봤습니다.
조금은 설명을 추가해 봤습니다.
아 multi-head attention 뭔지 잘 모르겠고!
아니 데이터가 도대체 어디서 어디로 흐르는 것이냐아아ㅏ
위 두가지를 반영 해봤는데요
(왼쪽 남색부분)Inputs를 통해서 들어간 문자열은 Vector로 변환됩니다.
(보라색 부분)1️⃣에서 처리가 완료된 Vector를 사용해서 뭔지 모르겠지만 Encoding 동작을 하면, 그 결과로 Input한 Text의 특성을 보유한 Latent Vector가 생성됩니다.
(오른쪽 남색부분)Latent Vector를 사용해서 이제 새로운 무언가를 출력해 내야합니다. 이때 가장먼저 start token이 들어갑니다. 이 start token역시 단어의 일종이어서, Vector로 변환됩니다.
(초록색 부분)Latent Vector를 start token의 특성을 뽑아내는 중간에 끼어넣고, 출력해야하는 Text의 특성을 뽑아냅니다.
(주황색 부분)4️⃣에서 얻어진 출력 Text의 특성을 활용해서, start token 다음에 올 문자를 추측합니다.
5️⃣에서 얻어진 단어(Ex. Hello)와 start token을 합쳐서 [start token] Hello를 만들고, 이 문자를 다시 3️⃣에다가 넣어줍니다.
end token이 나올때까지 3~6을 반복해 줍니다.
여기서 Latent Vector없이 오른쪽 부분이 바로 다음단어 예측기인 것을 알 수 있고,
Transformer는 다음단어는 예측할 때 입력문장의 정보까지 참고해서 예측한다고 할 수 있습니다.
Transformer의 경우 입력된 값이있고, 입력된 값에 따른 적당한 출력값이 필요합니다.
그래서 0. 다음단어 예측기와 같이 단순하게 학습시킬 수 없고
입력된 문장에 대응되는 적당한 결과문장이 필요합니다.
(그래서 Transformer를 설명할때 자주 언급되는게 번역작업 이죠)
여기서 이제 아이디어를 내는게
그러면 그냥 입력 문장의 특성추출부분 없이, 바로 예측해버리면 되는거 아냐?
가 됩니다.
그래서, 최신 GPT계열의 모델들의 경우 다음단어 예측기(Decoder) Only Model이 대세를 이루고 있습니다.
그래서 입력문장의 특성추출을 별도로 분리하지않고
입력문장을 그대로 출력문장의 단어예측에 집어넣는 방식이 바로 Decoder Only Model입니다.
https://dugas.ch/artificial_curiosity/GPT_architecture.html
이런 구조로 될 경우
life is short, you need 가 들어갈 경우 python이라는 문자가 출력되게 모델의 가중치를 학습시키면 되고
문장은 온라인 상에 넘쳐나기 때문에, 학습에 어려움이 없습니다.
huggingface에 올라온 LLaMa2 모델을 살펴보면
#Pytorch 의사코드로 표현된 Llama2
class LlamaModel(nn.Module):
def __init__(self, vocab_size, dim, hidden_dim, num_layers, num_heads, max_seq_len):
super().__init__()
#문자열 -> Vector 변환기
self.embed_tokens = nn.Embedding(vocab_size, dim)
#Vector를 이용해서 다음 문자열을 추측하기위한 정보 추출
self.layers = nn.ModuleList([
LlamaDecoderLayer(dim, hidden_dim, num_heads)
for _ in range(num_layers)
])
self.norm = RMSNorm(dim)
self.max_seq_len = max_seq_len
def forward(self, input_ids, mask=None):
x = self.embed_tokens(input_ids)
for layer in self.layers:
x = layer(x, mask)
return self.norm(x)
class LlamaForCausalLM(nn.Module):
def __init__(self, vocab_size, dim, hidden_dim, num_layers, num_heads, max_seq_len):
super().__init__()
self.model = LlamaModel(vocab_size, dim, hidden_dim, num_layers, num_heads, max_seq_len)
#추출된 정보를 바탕으로 다음에 올 문자에 대한 확률 return
self.lm_head = nn.Linear(dim, vocab_size, bias=False)
def forward(self, input_ids, mask=None):
hidden_states = self.model(input_ids, mask)
return self.lm_head(hidden_states)Decoder Only Transformer의 모습을 보여주는것을 확인할 수가 있습니다.
이러한 Decoder Only Transformer에 천문학적인 문서를 통해서 다음 문자를 예측하게 만든 상태를
pre-trained 상태 LLM 또는 Base Model이라고 부릅니다.
하지만 지금까지 본 내용 만으로는
어떻게 GPT가 유저와 Chat이 가능한지 예상하기 어렵습니다.
GPT가 어떻게 유저와 Chat이 가능한다는 다음 포스팅에서 다룹니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.