LLM (Large Language Model)의 현재와 미래

지난 글에서는 자연어처리 기술을 평정하다시피 한 트랜스포머 구조의 탄생에 대해 알아보았습니다. 그리고 트랜스포머 구조에서 인코더와 디코더 구조만을 따로 떼어 사용하는 시도가 있었고, 인코더만을 사용하는 모델은 BERT로, 디코더만을 사용하는 모델은 GPT가 되었다고 설명해 드렸습니다. 이번 글에서는 각각의 모델이 어떻게 발전했는지, 그리고 세간을 뒤흔든 LLM (Large Language Model)은 어떻게 등장하게 되었는지 다뤄 보려고 합니다.

트랜스포머 구조에서의 인코더와 디코더, 그리고 인코더가 없어진 GPT의 디코더

언어 모델

지난 글에서 잠시 언급한 언어 모델이라는 것에 대해 조금 더 자세히 알아봅시다. 언어 모델의 기본적인 정의는 “단어 나열의 확률을 계산하는 모델” 입니다. 즉, 단어가 어떻게 나열되어야 의미를 가지고 자연스러운 “언어” 가 되는지 0과 1 사이의 확률 값으로 점수를 매긴다고 할 수 있습니다. 하지만 이것을 그냥 학습 시키기에는 너무 막연합니다. 어떻게 해야 “그럴듯한 문장”에 높은 점수를 매기고, 어색하지만 이해가 되는 문장에 적당히 낮은 점수를 줄 수 있을까요?

여기서 사용된 것이 바로 주어지지 않은 단어를 예측하는 학습법입니다. 우리는 어떤 문장이 자연스러운지에 대해서는 완벽하게 객관적인 점수를 줄 수는 없지만, 적어도 지금까지의 문장의 일부를 보았을 때 다음 단어가 이것으로 적절한지 아닌지는 알려줄 수 있습니다. 바로 실제로 사람들이 작성한 문장을 정답으로 쓰는 것입니다. 이렇게 모델이 다음 단어를 예측하게 한 다음 정답 여부를 알려주면, 모델은 “말이 되는” 단어의 나열이 무엇인지 알게 되고, 나중에 빈칸 없이 일반적인 문장이 들어오면 자신이 학습한 “자연스러운 문장”의 형태일 때 확률을 높게 책정합니다.

이렇게 학습할 때, 빈 칸이 아닌 단어는 모델을 통과했을 때 입력된 원래 단어를 나타낼 수 있어야 합니다. 입력한 단어는 벡터 형태로 바뀌지만 여전히 그 의미나 가리키는 대상이 바뀌어선 안 됩니다. 그러다 보니 이렇게 머신러닝으로 학습된 언어 모델은 단어를 벡터 공간에 대응시키는 단어 임베딩으로도 사용할 수 있습니다. 이렇게 머신러닝을 이용해 학습된 언어모델을 단어 임베딩으로 사용하는 것이 실제로 문맥 등이 고려되어 출현 빈도 등 통계적인 값만을 적용한 예전 단어의 임베딩 기술보다 더 좋은 성능을 보입니다.

BERT: 양방향 Attention을 이용한 이해력 상승

지금까지의 언어 모델은 단방향으로 학습했기 때문에 문맥 정보를 완벽하게 파악해서 다음 단어를 예측할 수는 없었습니다. Bi-LSTM처럼 단방향 두 개를 서로 반대로 놓는 방법으로 해결하려는 시도도 있었지만, 각 방향의 LSTM이 서로 유의미하게 정보를 주고받지는 않았기 때문에, 그렇게 큰 성과를 거두지는 못했습니다.

BERT는 트랜스포머 구조에서 인코더 부분만을 가져온 모델입니다. 인코더만 가져왔기 때문에 생기는 가장 큰 특징은, 문장의 뒷 부분을 가리는 마스킹이 없다는 것입니다. 그렇기 때문에 문장의 모든 부분을 언제나 참조할 수 있게 됩니다. 만약 어떤 단어가 비어있는 문장이 들어온다면 빈  곳과 다른 모든 단어들과의 관계를 다 살펴볼 수 있기 때문에 예측이 훨씬 더 정확해집니다.

그리고 하나 더, 모두가 모두를 참조하므로 방향이라는 개념이 사실상 무의미해집니다. 그래서 BERT를 훈련 시킬 때는 문장의 순서대로 다음 단어를 예측 시키는 것이 아니라, 문장의 단어 일부를 가려 놓고 입력 시킨 후, 가려진 단어를 예측하는 형태로 학습합니다. 이렇게 순차적으로 예측하는 것이 아니라 중간 중간 단어를 가려 놓는 것을 것을 영어로 마스킹(Masking)이라고 하기 때문에, 이렇게 언어 모델을 학습 시키는 것을 MLM (Masked Language Modeling)이라고 합니다. BERT는 여기에 더해, 그것에 더해서, 문장 단위로도 순서에 관해 학습을 할 수 있도록 문장의 순서를 섞어 놓고 다음 문장을 맞추도록 하는 다음 문장 예측 (Next Sentence Prediction)이라는 학습법도 동시에 진행합니다.

이렇게 학습된 BERT는, 그 자체로는 앞뒤 문맥을 고려한 고품질의 단어 임베딩을 할 수 있습니다. 이 임베딩이 얼마나 좋은지, 이 BERT를 가지고 다른 복잡한 모델을 만드는 것이 아니라, 간단한 신경망층[1]을 조금 더 추가하고 약간의 추가적인 학습만 해주면 이를 곧장 활용할 수 있을 정도입니다. 이렇게 추가적인 학습을 하는 경우 정말 모델의 극히 일부분만 변화하기 때문에, 미세조정(Fine-tuning)이라고 합니다.

[1] 더 자세하게는 Fully-Connected Layer, 혹은 Linear Layer라고 하며, 가장 간단한 형태의 머신러닝 레이어 중 하나입니다.

위에 얹어주는 레이어는 작업의 내용에 따라 구조가 달라집니다. 예를 들어, 문장 전체를 받아들이고 이 문장이 긍정적인지, 부정적인지 판별하는 작업을 시킨다고 합시다. 그러면 모델에 추가적으로 얹어주는 레이어는 문장 전체의 입력을 받아들이고, 0(부정적) 혹은 1(긍정적)인 1차원 벡터를 출력하는 형태여야 합니다. 만약 문장 각 단어의 형태소를 알려주는 모델을 만들고자 한다면, 문장 전체에 대한 입력을 받을 것이 아니라 단어별로 형태소를 분류해내는 레이어를 얹어주면 됩니다.

BERT 위에 얹은 레이어에 따라 수행할 수 있는 과제가 달라진다.

BERT의 발전: 경량화와 효율화

BERT의 근간이 되는 트랜스포머 구조는 입력으로 들어온 모든 단어에 대해 서로 관계를 고려하기 때문에, 모델 자체가 아주 크며 계산량도 정말 많습니다. 그래서 학습을 할 때도 우리가 게임 할 때 쓰는 일반적인 GPU로는 몇 주가 걸릴 정도로 오래 걸립니다. 그래서 연구자들은 주로 BERT의 훌륭한 성능을 최대한 유지하면서 계산량을 줄이거나, 학습 과정을 효율적으로 개선하려는 시도를 했습니다.

계산량을 줄인 대표적인 예시로 DistillBERT가 있습니다. 이름의 Distillation은 “증류” 라는 뜻입니다. 기계학습에서 Distillation이라고 하면 잘 훈련된 원본 모델이 있다고 할 때, 크기를 줄인 구조의 모델을 하나 더 만들어서 이 작은 모델이 원본 모델이 하는 예측을 따라하도록 훈련시키는 것을 말합니다. 그래서 원본 모델을 Teacher, 경량 모델을 Student라고도 합니다. 원본 BERT가 1억 1천만개의 파라미터를 가지고 있었는데, Distillbert는 이를 6600만개로 반 정도로 줄였습니다. 그런데도 원본 BERT 성능의 97% 정도를 보여주었으니, 일종의 근 손실이 거의 없는 체중 감량을 한 셈입니다.

그 외에 훈련 과정 자체를 효율적으로 하려는 시도도 있었습니다. Pre-training이 너무 오래 걸리는데, 이 부분에서 더 학습 효과를 높이면 그만큼 소요한 시간 대비 좋은 성과를 거두는 것이니까요. 원본 BERT에서 학습하는데 사용되었던 다양한 훈련 기법 중, 오히려 성능을 떨어트리는 학습 기법은 제외하고, 모델이 긴 맥락에 대해서도 충분히 pre-train될 수 있도록 입력 데이터를 조절하는 등의 조치를 취합니다. 비슷한 조건에서 원본 BERT보다 성능이 더 잘 나온 것은 두말할 필요도 없겠습니다.

GPT: 추가 학습이나 레이어가 필요하지 않은 다재다능 모델

GPT는 트랜스포머의 디코더 부분만을 가져온 모델입니다. 인코더와의 가장 큰 차이점은 어텐션 부분에서 문장의 지금까지 드러난 부분만 참조하도록 뒷 부분이 가려져 있다는 점입니다. BERT에 비해 맥락을 파악할 수 있는 정보가 줄어들었으니, 구조만 보았을 때는 GPT가 맥락 파악 등의 추론에서는 훨씬 불리해 보입니다. 실제로 BERT 논문에서는 GPT가 BERT보다 성능이 낮은 이유에 대해 이렇게 소개하기도 했습니다.하 지만 GPT의 연구자들은 그것보단 다른 쪽에 더 집중하고 있었습니다. 바로 별도의 추가 학습이나 레이어 없이 여러 작업을 수행할 수 있는 언어 모델을 만드는 것입니다.

사전학습된 BERT 모델은 그 자체로는 훌륭한 단어 임베딩 역할을 해내지만, 반대로 말하면 임베딩 이외의 어떤 작업을 수행할 수는 없습니다. 위에서 말했듯 레이어를 조금 더 얹고, 다시 원하는 수행 과제에 맞게 미세조정을 해 줘야 합니다. 이렇게 미세조정된 모델의 특징은 한 번에 하나의 과제만을 수행한다는 점입니다. 각 작업을 수행하는 레이어를 따로따로 얹어주면 동시에 수행할 수 있을 것이라고 생각할 수 있습니다. 하지만 미세조정에서 조정되는 영역의 일부가 서로 겹치기 때문에, 모든 필요한 레이어가 있는 상태에서 다시 미세조정을 해 줘야 합니다.

GPT의 연구자들은 그럴 필요 없이, 한번의 사전학습으로 거의 바로 실전에 투입할 수 있는 모델을 만들고자 했습니다. GPT-1[2]의 연구 과정에서는 이런 과정이 크게 강조되지 않았고, 미세조정 과정도 있었습니다. 하지만 GPT-2부터는 정말로 별도의 미세조정 없이 글 이어쓰기, 번역 등을 할 수 있다는 것을 보여주었습니다.

[2] GPT를 처음 제시한 논문에서는 숫자가 붙어있지 않지만, 모델 계통으로써의 GPT와의 구분을 위해 첫 발표된 GPT모델은 GPT-1이라고 하겠습니다)

이것이 가능했던 이유에는 크게 두 가지가 있습니다. 첫번째는 다양한 작업을 수행하는데 도움이 되는 자료들을 정말 넓은 범위에서 구했기 때문입니다. GPT2를 개발할 때 연구자들은 데이터셋을 고르는데 매우 신중했습니다. 일반적인 LM을 학습할 때 사용하는 데이터 셋을 그대로 사용한 것이 아니라, 자연스럽게 자연어 관련 작업들을 내포하는 데이터 셋을, 사람과 기계를 모두 사용하여 품질을 검증한 후 사용하였습니다. 이렇게 모인 데이터 셋에는 단순히 언어 모델이 언어 만을 학습하는데 쓰이는 데이터 뿐 아니라, 모델이 수행해야 하는 태스크에 관한 내용도 자연스럽게 들어가 있습니다.

GPT-2 연구자들이 학습용 데이터셋에서 찾은 자연스러운 영어-프랑스어 번역을 하는 문장
Radford, A., Wu, J., Child, R., Luan, D., Amodei, D., & Sutskever, I. (2019). Language models are unsupervised multitask learners. OpenAI blog, 1(8), 9.

다른 하나는, 디코더가 문장을 ‘생성’해내는 부분이라는 점을 이용한 것입니다. 모델이 문장을 생성해낼 때는 지금까지 생성해낸 단어들을 참고합니다. 그럼 이를 이용해서, 모델이 해야 할 일을 설명하는 부분을 문장의 시작 부분으로 두는 시도를 한 것입니다. 예시를 하나 들어보겠습니다. 이야기의 도입부를 가지고 소설을 쓰는 GPT라면, 도입부 부분을 모델이 “지금까지 만든 문장의 일부” 라고 보게 하고, 그 뒤부터 생성을 시작하게 하면 되는 것입니다.

GPT-2까지는 이 부분에 대해 명확한 설명이 있지 않았는데, GPT-3부터는 이 부분에 명확하게 초점을 맞추어 In-context learning이라고 명명하고, 태스크의 “예시”에 해당하는 예제를 얼마나 적게 줄 수 있을지를 탐구했습니다. 여기서는 예시를 주는 회수가 많아야 3~4회이기 때문에, few-shot learning이라고 명명하였습니다. 영어를 프랑스어로 번역하게 한다면, 같은 뜻의 영어와 프랑스어 문장 쌍을 몇 개를 예시로 줄지에 대한 것입니다.

언뜻 보면 예시를 준다는 시점에서 지금까지 했던 fine-tuning과 별로 차이가 없다고 생각할 수도 있지만, 이 예시들이 역전파되어 모델의 파라미터에 영향을 주는 것이 아니라, 앞으로 생성될 내용에만 지시를 한 다는 것이 아주 큰 차이점입니다. 여기서 나아가서 예시를 주지 않고 바로 지시를 내려 과제를 수행하게 하는 것도 가능하기 때문에, 작지만 결정적인 차이라고 할 수 있습니다. 그래서 이를 기존의 미세조정과 구분하여 “in-context learning”이라고 합니다.

GPT-3에서 사용된 in-context learning과 지금까지의 Fine-tuning의 차이점
Brown, T., Mann, B., Ryder, N., Subbiah, M., Kaplan, J. D., Dhariwal, P., … & Amodei, D. (2020). Language models are few-shot learners. Advances in neural information processing systems, 33, 1877-1901.

즉 GPT는 좋은 품질의 풍부한 학습 데이터를 큰 모델에게 학습시키면, 사용자의 입력으로 요구받은 내용을 곧장 수행할 수 있도록 하는 것이 가능하다는 것을 보여준 것입니다. 그리고 여러분이 ChatGPT로 경험해보셨듯이, 대부분의 상황에서는 이를 잘 수행해냅니다. 번역이나 간단한 추론은 물론이고, 대신 코드를 작성해주거나 주제를 제시하면 소설을 쓰기까지 하죠.

이제는 많은 자연어처리 연구자들이 디코더 기반의 생성형 언어모델에 관심을 기울이고 있습니다. GPT-3이 공개된 이후 구글도 PaLM이라는 모델을 발표했습니다. 메타(페이스북) 역시 LLaMA라는 언어 생성형 언어 모델을 개발하여 공개했습니다. 이들 모두 폭넓은 범위의 기능을 수행할 수 있다는 공통점이 있습니다.

“Large”: 같은 구조지만 파라미터는 1000배 이상 증가

GPT-2는 GPT-1에서 내부 구조를 조금 수정한 것 말고는 기본 구조에는 변화가 없습니다.  GPT-3 논문에서도 기본 구조는 GPT-2와 동일하다고 밝혔습니다. GPT-4는 모델의 내용을 논문에서 자세하게 설명하진 않았지만, 차이점을 분명하게 밝히지 않았기 때문에 역시 거의 비슷하다고 추정되고 있습니다. LLaMA나 PaLM 역시 기본 트랜스포머 구조에서 크게 바꾼 것이 없다고 논문에서 언급했습니다.

그러면 무엇이 달라진 걸까요? 바로 파라미터의 수입니다. 첫 GPT의 파라미터(매개변수; 모델 안에서 학습/추론에 사용되는 변수) 개수는 1700만개였는데, GPT-3에 이르러서는 1750억개가 되었습니다. 이미 여기서 첫 GPT-1의 천배가 넘는 파라미터 개수를 가지게 되었습니다. 최근에 발표된 GPT-4는 언어뿐 아니라 이미지도 처리할 수 있게 되었다고는 하지만, 또 다시 10배정도 늘어 1조 8천억개가 되었다고 알려져있습니다(OpenAI는 모델의 파라미터 개수를 공개하지 않았습니다). 구글의 PaLM의 파라미터 수는 5400억개입니다. 파라미터 수를 줄이려고 노력했던 LLaMA도 파라미터 수가 700억개로, 백억 단위가 넘어가는 파라미터 수를 가지고 있습니다. 사실 Large에 대한 명확한 정의는 없습니다. 하지만 대체로 GPT-3 이후로 등장한 파라미터 개수가 백억을 가볍게 넘는 모델들이 LLM이라고 불리고 있습니다.

이 정도 크기는 일반 개인은커녕 왠만한 기업들도 큰 투자 없이는 훈련하기 힘든 수준입니다. 연산을 얼마나 너무 많이 하는지, 훈련시키는데 사용되는 전기로 인한 탄소 발생량에 대한 우려가 나올 정도입니다. 한 연구에 따르면, GPT-3을 훈련시키는데 사용되는 전기는 1287MWh, 이산화탄소 배출량은 502t입니다[3]. 가정용 에어컨 133대를 1년동안 쉬지않고 틀어야 하는 전기 소비량, 자동차 약 150대가 1년동안 배출하는 탄소 양과 맞먹습니다.

[3] Luccioni, A. S., Viguier, S., & Ligozat, A. L. (2022). Estimating the carbon footprint of bloom, a 176b parameter language model. arXiv preprint arXiv:2211.02001.

LLM은 파라미터 늘리기만이 전부?

여기까지 읽으셨다면, 그럼 이제 언어모델의 미래는 파라미터 수를 늘리고 데이터를 더 좋게 수집하는 것 말고는 방법이 없는가 라는 의문이 드실 수도 있습니다. 사실 언어모델의 성능을 좌우하는 한가지 요소가 더 있습니다. 바로 모델의 출력 앞부분에 넣어주는 지시사항입니다.

GPT-3부터는 이부분에 대해 프롬프트(prompt)라는 이름을 붙여줄 정도로 중요성을 강조합니다. 실질적으로 모델에게 명령을 수행하는 지점이라는 인식을 갖게 된 것이죠. 그리고 이 프롬프트를 잘 설계하는 것이 모델의 성능을 향상시키는데 중요한 역할을 합니다. 얼마나 중요한지, 이제 프롬프트 엔지니어라고 하는 직업군이 생길 정도니까요. 프롬프트의 중요성을 보여주는 예시로, PaLM의 논문에서 언급한 사례를 하나 소개드리겠습니다. 모델에게 글로 풀어 쓴 산수 문제를 줍니다. “카페테리아에는 사과가 23개 있었습니다. 점심을 만드는 데 20개를 사용하고 6개를 더 샀다면, 이제 몇 개의 사과가 있을까요?” 같은 질문입니다. 만약 이런 질문을 아무런 설명 없이 곧장 물어보면(0-shot) 잘못된 정답을 말합니다. 하지만 앞에 예시로 서술형 문제를 풀듯이 풀어나가는 과정이 적힌 답안 예시를 들어주면, 실제 모델도 이를 따라하며 논리적인 서술을 하고, 정답도 맞출 수 있게 됩니다. 똑같은 모델에 프롬프트를 잘 주면, 모델의 성능도 같이 상승하는 것입니다. 최근에는 이러한 특징을 악이용해서 악의적으로 프롬프트를 작성해 외부로 드러나서는 안 될 정보나, 수행하지 말아야 할 작업을 수행하게 하는 등의 해킹(Prompt-injection)이 일어나기도 합니다.

모델에게 논리적 추론을 하는 예시를 주면 모델도 논리적 추론을 하는 모습
Chowdhery, A., Narang, S., Devlin, J., Bosma, M., Mishra, G., Roberts, A., … & Fiedel, N. (2022). Palm: Scaling language modeling with pathways. arXiv preprint arXiv:2204.02311.

또, 모델에서 생성된 정보를 완벽하게 신뢰할 수 없다는 문제점도 있습니다. 올 초 인터넷을 뜨겁게 달궜던 “세종대왕 맥북 던짐 사건”을 알고 계신가요? chatGPT에게 이 사건에 대해 설명해달라고 입력했더니, 있을 수 없는 이 일에 대해 그럴듯하게 몇 문장에 걸쳐 사건의 상세 내용을 설명해주는 일이 있었습니다. 지금은 업데이트를 통해 이런 존재하지 않는 사건에 대해서는 이런 일이 있을 수 없다고 답변하지만, 언제 어떤 분야에서 또 이런 그럴듯한 거짓말을 할지 모르는 일입니다. 이것을 환각 현상(Hallucination)이라고 합니다. 이 환각 현상 역시 연구자들의 발빠른 대응 덕분에 조금씩 해결되고는 있지만, 완벽하지는 않습니다. 다른 데서 답을 아무리 잘 해도 이렇게 신뢰도를 떨어트리는 답변이 나온다면, LLM을 넓은 영역에 걸쳐 사용하기에는 무리가 있겠죠.

지금까지 새 언어모델의 시대를 열어젖힌 LLM에 대해 GPT를 중심으로 알아보았습니다. LLM의 발전으로 자연어처리 기술의 성능이 크게 발전한 것은 정말 대단합니다. 하지만 동시에 여러가지 궁금증이 생겨나기도 합니다. 일부 글로벌 대기업만이 학습이 가능한 LLM은 정말 이대로 괜찮은 걸까요? 훈련에 사용되는 막대한 양의 에너지와 발생하는 탄소를 줄일 수 있는 방법은 없을까요? 어떻게 해야 프롬프트를 이용해 품질 좋은 답변을 얻으면서도 시스템에 위협을 줄 수 있는 해킹은 막을 수 있을까요? 여기서 더 성능이 늘어나면 언어 모델이 정말 지능을 가지게 될 수도 있는 걸까요? 아무쪼록 이번 두 편의 글이 여러분께 LLM에 대해 이해할 수 있는 좋은 계기가 되었길 바라며, LLM의 미래에 관한 질문을 여러분께 드리고 갑니다. 감사합니다.


한승규

연구원, AI 연구 개발팀

고려대학교, 컴퓨터학과 석사

고려대학교 자연어처리 및 인공지능 연구실에서 자연어처리 관련 연구를 하였으며, 다양한 데이터 셋으로 모델을 파인튜닝하는 프로젝트들을 진행했다. 현재는 테스트웍스 AI 본부에서 LLM과 Multi-modal 관련 연구를 진행하고 있다.