정글에서 온 개발자

언어모델. 원시적 모델부터 GPT까지 개요 본문

머신러닝

언어모델. 원시적 모델부터 GPT까지 개요

dev-diver 2024. 8. 25. 23:12

*제목을 위해 원시적 모델이라고 했지만, '전통적인' 통계적 모델입니다.

요약

통계적 방법을 적용하던 언어 모델에 딥러닝이 적용 됐습니다. 문맥 파악을 위해 방법을 찾던 중 '어텐션 메커니즘'을 사용하는 '트랜스포머'를 개발하게 되고, 이를 응용하여 GPT가 개발되었습니다.


통계적 언어 모델(SLM; Statistical Language Model)

아이디어

사람들이 많이 쓰는 언어의 데이터 뭉치들 (코퍼스;Corpus) 의 시퀀스(단어의 나열)를 실제로 세서(count) 전체 코퍼스 중에 해당 시퀀스가 나올 확률을 구하고자 했습니다.

'모델이 생성(예측)하는 다음 단어는 확률을 통해 구한다' 는 언어 모델의 기본 개념을 정립했습니다.
모델이 발전은 다음에 올 단어의 확률을 구하는 방법의 발전입니다. 가장 확률이 높은 단어를 고르는 방식에서 시작해 Temperature, Top_k 등의 하이퍼 파라미터 조정으로 차순위 확률을 갖는 단어도 선택해 모델의 '창의성'을 조절하기도 합니다.

한계

통계적 언어 모델은 '코퍼스'에 있는 문장 조합에 의존하기 때문에, 코퍼스에 없는 문장은 아예 생성할 수 없습니다.
'I love you', 'I like you', 'I hate you' 등 중간 단어를 바꾸는 일이 단어의 성질만 알면 쉬운 일이지만, 통계적 모델에 'I hate you' 가 없으면 절대 나올 수 없습니다.

 

신경망 언어 모델(NNLM; Neural Network LM)

아이디어

'단어의 의미적 유사성을 알 수 있다면, 데이터에 없는 시퀀스도 예측할 수 있지 않을까?'
이 아이디어를 '딥러닝' 을 통해서 해결하고자 했고, 효과가 좋아서 이후의 모델들은 신경망을 사용하면서 발전했습니다.

임베딩

단어간 유사성을 구한다는 것은 단어간 연산이 필요한 것이기 때문에, 컴퓨터가 알 수 있게 단어를 표현하는 방법이 필요합니다.
이 표현 방법이 '임베딩' 입니다.
단어와 표현의 1대1 대응인 '임베딩 벡터' 방식으로 시작해  '문맥에 따라 달라지는  뜻'을 표현하기 위해 이후의 신경망 모델들이 발전합니다.

 

RNN 언어 모델

입력을 계속 넣을 수 있는 RNN(Recurrent NN) 을 활용했습니다. Recurrent 마다 'Step(시점)' 이라는 개념이 적용돼, 시점과 앞 시퀀스의 입력에 따라 같은 단어라도 다른 의미로 해석될 수 있습니다.
그러나 기초적인 RNN은 문장이 길어지면 앞쪽 단어의 의미가 희석되는 '장기 의존성 문제' 가 있었습니다.

LSTM, GRU

기초적 RNN 의 장기 희석 문제를 해결하기 위해, RNN에 '장기 기억'을 담당하는 Path 를 추가했습니다.
조금 더 장기 기억이 유지됐지만 여전히 장기 의존성 문제는 있었습니다.

 

인코더-디코더 구조

다른 언어로 번역을 하는 seq2seq 모델을 만들 때 사용한 구조입니다. LSTM을 쌓은 '인코더' 와 '디코더' 라는 모델을 따로 만들고 인코더의 출력인 '컨텍스트 벡터' 를 디코더가 해석하는 방식입니다.
의미를 생성하는 부분(인코더) 와 의미를 해석하는 부분(디코더)를 분리하는 개념이 알려졌습니다.

장기 의존성 문제를 해결한 것은 아닙니다.

 

어텐션(Attention) 메커니즘의 등장

LSTM 구조에서도 해결하지 못한 '장기 의존성 문제'를 보완하기 위해 만들어졌습니다.

아이디어

디코더의 다음 출력 예측시, 마지막 출력과 인코더의 입력 시퀀스 전체 단어들의 유사도를 측정해서 어떤 단어에 주목(어텐션) 해야 하는지 가중치를 정해줄 수 있습니다.

효과

입력 시퀀스의 단어 전체에 대해서 유사도를 측정하기 때문에 '장기 의존성 문제' 가 해결됩니다.

한계

인코더-디코더 구조에서의 '컨텍스트 벡터' 는 정보의 압축이기 때문에 '정보 소실'이 있습니다.

 

트랜스포머(Transformer)의 등장

아이디어

어텐션이 이미 글로벌 컨텍스트 정보 중에 어디에 주목해야 할지 알려주고 있는데, RNN으로 step 에 따른 문맥을 줄 필요가 있을까?
인코더-디코더 구조에서 RNN은 빼고 어텐션만 적용해보면 어떨까?

적용한 어텐션

  • 인코더의 시퀀스끼리 어텐션
  • 디코더의 시퀀스끼리 어텐션
  • 인코더의 입력에 대한 디코더 시퀀스의 어텐션

효과

결과적으로 RNN보다 우수한 상황이 나왔고, 이후 트랜스포머를 레이어로 활용한 많은 구조들이 나왔습니다.

 

GPT(Generative Pre-trained Transformer)

아이디어

트랜스포머를 이용하면 문장 예측시 효과가 좋을 것 같다!
'예측' 이므로 예측하려는 단어 이후의 시퀀스는 넣을 수 없는데, 이는 트랜스포머의 '디코더' 부분만 사용한 것과 같습니다.

효과

예상 외로 각종 언어모델 태스크에서 효과가 좋아서, '사전학습(pre-trained)'모델이라는 이름이 붙었음에도 불구하고 '일반 언어 모델'로서 역할을 잘 할 수 있습니다.
특히 트랜스포머 층이 여러층 쌓이면서, 이전에 볼 수 없었던 추론 능력 등이 발현되는 것처럼 보였습니다.
이후 우리가 아는 LLM의 시대가 열리게 되었습니다.


참고

딥러닝을 이용한 자연어 처리 입문-wikidocs