개요

여기까지 오면서 Transformer라는 재료가 갖춰졌다. 이번 글은 그 재료를 어떻게 쓰느냐에 대한 이야기다.

그리고 이 지점에서 자연어처리의 방식이 통째로 바뀐다.

작업마다 모델을 만들던 시대 → 큰 모델 하나를 먼저 만들어두고 가져다 쓰는 시대

지금 우리가 쓰는 대화형 AI가 바로 이 흐름의 끝에 있다. 1편에서 “단어를 숫자로 어떻게 바꾸지?”로 시작한 이야기가 여기까지 이어진다.

교육 자료는 대외비라 슬라이드 이미지나 예제 데이터는 싣지 않는다. 개념 흐름만 내가 이해한 방식으로 재구성했고, 그림은 전부 생성했다.


1. 사전학습이란

사전학습(Pretraining) = 대규모 데이터로 일반적인 언어 능력을 먼저 익히게 하는 과정

사전학습과 파인튜닝

예전 방식의 문제부터 보자. 리뷰 감정 분류기를 만든다고 하면 이런 순서였다.

  1. 모델을 아무 값으로 초기화한다
  2. 라벨을 붙인 리뷰 데이터로 학습한다
  3. 완성

여기서 모델은 한국어가 뭔지도 모르는 상태에서 시작한다. 리뷰 몇만 건으로 언어 자체와 감정 판단을 동시에 배워야 한다. 데이터가 적으면 당연히 실력이 안 나온다.

게다가 다음에 스팸 분류기를 만들려면 또 처음부터다. 앞에서 배운 언어 지식이 하나도 재활용되지 않는다.

두 단계로 나누기

사전학습은 이걸 둘로 쪼갠다.

단계 무엇으로 무엇을 배우나
1. 사전학습 인터넷의 방대한 글 언어 그 자체 — 문법, 어휘, 상식
2. 파인튜닝 내 작업 데이터 (적어도 됨) 그 작업의 요령

핵심은 1단계에 정답표가 필요 없다는 점이다. 그냥 글만 잔뜩 있으면 된다.

신입에게 일을 가르치는 상황과 같다. 한국어를 아는 사람에게 업무를 가르치는 것과, 한국어부터 가르쳐야 하는 사람에게 업무를 가르치는 것은 난이도가 완전히 다르다.

사전학습은 “한국어를 아는 상태”를 미리 만들어두는 것이고, 그 상태는 어떤 업무를 맡기든 그대로 쓸 수 있다.

워드 임베딩과 뭐가 다른가

1편의 워드 임베딩도 미리 학습해두고 가져다 쓰는 것이었다. 그럼 같은 얘기 아닌가?

규모가 다르다.

  워드 임베딩 언어 모델 사전학습
미리 배우는 것 단어 하나하나의 뜻 모델 전체 — 문맥 이해까지
나머지 부분 여전히 아무 값에서 시작 전부 학습된 상태에서 시작
문맥 반영 단어당 벡터 하나로 고정 문장에 따라 표현이 달라진다

1편에서 남겨둔 숙제를 기억할 것이다. “배”라는 단어가 먹는 배든 타는 배든 같은 벡터를 받는다는 문제였다.

사전학습된 언어 모델은 이걸 해결한다. Self-Attention이 주변 단어를 보고 표현을 만들기 때문에, “과일 가게에서 배를 샀다”의 배“배를 타고 섬에 갔다”의 배가 서로 다른 값을 갖는다.


2. 세 갈래로 갈라진다

Transformer는 인코더와 디코더로 이루어져 있었다. 그런데 꼭 둘 다 쓸 필요는 없다.

무엇을 떼어 쓰느냐에 따라 모델이 세 갈래로 갈라진다.

세 갈래

구조 대표 성격 잘하는 일
인코더만 BERT 앞뒤 문맥을 모두 본다 이해 — 분류, 개체명 인식, 질의응답
인코더+디코더 T5 읽고 나서 쓴다 변환 — 번역, 요약
디코더만 GPT 앞쪽만 보고 다음을 쓴다 생성 — 대화, 글쓰기, 코드

지난 글에서 정리한 마스킹의 차이가 그대로 성격이 된다. 앞뒤를 다 볼 수 있으면 이해에 유리하고, 앞만 볼 수 있으면 생성에 맞는다.


3. BERT — 빈칸 맞히기로 배운다

인코더 기반 모델의 대표다. 여기서 재밌는 문제가 하나 생긴다.

인코더는 앞뒤를 다 본다. 그럼 “다음 단어 맞히기”로는 학습을 못 한다. 답이 이미 보이니까.

그래서 다른 문제를 낸다.

BERT의 학습법

Masked Language Model = 문장의 일부를 가려놓고, 가려진 자리에 올 단어를 맞히게 한다

입력 토큰의 15% 정도를 가리고 그 자리를 복원시킨다. 앞뒤 문맥을 모두 활용해야 풀 수 있는 문제라, 인코더 구조에 딱 맞는다.

여기서도 정답표를 사람이 만들 필요가 없다. 문장에서 단어를 가리면 그게 곧 문제이고, 가린 단어가 곧 정답이다. 1편의 Word2Vec에서 본 발상이 훨씬 큰 규모로 반복되는 셈이다.

BERT는 여기에 두 문장이 실제로 이어지는 문장인지 맞히는 문제도 같이 학습한다. 문장 사이의 관계를 이해해야 하는 작업에 도움을 주기 위해서다.

잘하는 것과 못하는 것

BERT는 이해가 필요한 작업에서 당시 기록을 갈아치웠다. 감정 분류, 문장 관계 판단, 질의응답, 개체명 인식 등.

하지만 글을 쓰지는 못한다. 앞뒤를 다 보는 구조라 한 단어씩 순서대로 만들어 나가는 방식과 맞지 않는다. 생성 작업에는 디코더 기반 모델이 필요하다.


4. GPT — 다음 단어 맞히기로 배운다

디코더 기반 모델의 대표다. 학습 방법은 놀랄 만큼 단순하다.

앞의 글을 보고 다음 단어를 맞힌다.

4편에서 본 언어 모델 그 자체다. 새로운 학습 방법을 발명한 게 아니라, 가장 오래된 방식을 아주 큰 규모로 돌린 것이다.

그리고 여기서 예상 밖의 일이 벌어진다.


5. In-Context Learning — 파인튜닝 없이

GPT의 크기를 계속 키우다 보니 이런 현상이 나타났다.

파인튜닝을 하지 않았는데도, 설명과 예시를 몇 개 보여주면 새로운 작업을 해낸다.

이걸 In-Context Learning(ICL, 문맥 내 학습)이라고 부른다.

파인튜닝과 ICL

두 방식의 차이가 이번 글에서 가장 중요한 부분이다.

  파인튜닝 In-Context Learning
준비물 라벨 붙인 데이터 수백~수천 건 설명 한 줄, 예시 몇 개
하는 일 역전파를 돌려 모델 값을 갱신 그냥 입력에 적어 넣는다
결과물 그 작업 전용 모델이 생긴다 모델은 그대로, 답만 달라진다
비용 학습 시간과 장비 거의 없음
모델이 바뀌나 바뀐다 안 바뀐다

마지막 줄이 핵심이다. ICL에서는 모델이 조금도 바뀌지 않는다. 학습이라는 이름이 붙어 있지만 가중치 갱신이 전혀 일어나지 않는다.

파인튜닝은 신입을 몇 주간 교육시켜 그 업무에 맞게 바꿔놓는 것이다. 교육이 끝나면 그 사람은 달라져 있다.

ICL은 이미 일 잘하는 사람에게 “이런 식으로 처리해주세요”라고 예시 두어 개를 보여주는 것이다. 그 사람이 바뀐 게 아니라, 상황을 파악하고 맞춰준 것이다.

예시를 몇 개 주느냐

부르는 이름이 나뉜다.

이름 주는 것
Zero-shot 설명만 주고 시킨다
One-shot 예시 하나를 보여준다
Few-shot 예시 몇 개를 보여준다

일반적으로 예시가 많을수록 잘한다. 그리고 중요한 건 모델이 클수록 이 효과가 뚜렷해진다는 점이다. 작은 모델은 예시를 줘도 별 차이가 없는데, 큰 모델은 확연히 달라진다.

이게 왜 중요한가

실무적으로 판이 바뀐다.

  • 작업마다 모델을 따로 만들 필요가 없다
  • 라벨 데이터를 대량으로 모으지 않아도 된다
  • 말로 시키면 된다

우리가 지금 챗봇에게 “이런 형식으로 정리해줘”라고 예시를 붙여 요청하는 게 정확히 이거다. 프롬프트를 쓰는 행위가 곧 ICL이다.

이 지점에서 “프롬프트를 어떻게 쓰느냐”가 갑자기 중요한 기술이 됐다.


6. Chain-of-Thought — 생각을 적게 하기

ICL에도 약점이 있었다. 여러 단계를 거쳐야 하는 문제에는 약했다. 특히 계산이 섞인 문제에서 답만 툭 내놓고 틀리는 일이 잦았다.

여기서 나온 아이디어가 Chain-of-Thought(CoT) prompting이다.

답만 요구하지 말고, 풀이 과정을 거쳐 답에 도달하도록 유도한다.

Chain-of-Thought

예시를 보여줄 때 답만 적힌 예시 대신 풀이 과정이 적힌 예시를 보여준다. 그러면 모델도 그 형식을 따라 단계를 밟아가며 답을 만든다.

효과가 컸다. 여러 단계를 거쳐야 하는 문제에서 정답률이 크게 올랐고, 파인튜닝한 모델보다 좋은 결과가 나오는 경우도 있었다.

암산으로 답만 말하라고 하면 틀리던 문제를, 풀이를 적으면서 풀게 하니 맞히는 것과 같다. 사람도 그렇다. 중간 과정을 종이에 적으면 실수가 줄어든다.

예시조차 필요 없다

CoT의 원래 방식은 풀이 과정이 담긴 예시를 몇 개 보여줘야 했다. 예시를 만드는 것도 일이다.

그런데 아주 단순한 대안이 발견됐다.

질문 뒤에 “차근차근 단계별로 생각해보자” 같은 문장 한 줄만 붙인다.

이것만으로도 모델이 스스로 추론 단계를 만들어낸다. 예시가 없어도 되니 Zero-shot CoT라고 부른다.

한 줄 덧붙였을 뿐인데 성능이 크게 달라진다는 게 이 분야의 재밌으면서도 좀 얄궂은 부분이다. 모델을 건드린 게 아니라 시키는 방식만 바꾼 것이기 때문이다.


7. 여기까지의 흐름

이번 시리즈를 한 줄로 이으면 이렇게 된다.

단계 해결한 문제 남긴 숙제
원-핫 단어를 숫자로 유사도를 못 잰다
워드 임베딩 의미를 담았다 순서를 못 다룬다
RNN 순서를 다뤘다 멀면 잊어버린다
LSTM 더 오래 기억한다 여전히 한 줄, 느리다
Seq2Seq 문장 → 문장 벡터 하나에 병목
Attention 필요한 곳을 직접 본다 아직 RNN 위에 얹혀 있다
Transformer RNN을 걷어냈다 학습에 데이터가 많이 필요하다
사전학습 미리 배워두고 재사용

각 단계가 앞 단계의 한계에서 출발한다. 어느 하나도 갑자기 튀어나온 게 없다.

개인적으로 이 계보를 따라오면서 인상 깊었던 건, 아이디어 자체는 대부분 단순하다는 점이었다. 이웃 단어로 뜻을 짐작하고, 메모를 넘기고, 필요한 곳을 골라 보고, 가려놓고 맞히게 한다. 어려운 건 발상이 아니라 그 발상을 감당할 계산량과 데이터였던 셈이다.


정리

  • 사전학습 = 방대한 글로 언어 자체를 먼저 배우게 하는 단계. 정답표가 필요 없다
  • 사전학습 → 파인튜닝 두 단계로 나누면, 내 작업 데이터가 적어도 성능이 나온다
  • 워드 임베딩과의 차이 — 모델 전체가 학습된 상태로 시작하고, 문맥에 따라 표현이 달라진다
  • 구조에 따라 세 갈래
    • BERT (인코더) — 앞뒤를 다 본다. 가린 단어 맞히기로 학습. 이해에 강함
    • T5 (인코더+디코더) — 모든 작업을 텍스트 변환으로 통일
    • GPT (디코더) — 앞만 본다. 다음 단어 맞히기로 학습. 생성에 강함
  • In-Context Learning — 파인튜닝 없이 설명과 예시만으로 새 작업을 해낸다
    • 모델은 전혀 바뀌지 않는다. 입력에 적어 넣을 뿐
    • Zero-shot / One-shot / Few-shot. 모델이 클수록 효과가 뚜렷하다
  • Chain-of-Thought — 풀이 과정을 거치게 유도하면 여러 단계 문제의 정답률이 오른다
    • “차근차근 단계별로” 한 줄만 붙여도 효과가 있다

다음 글에서

여기까지가 지금까지 정리한 범위다. 학습이 더 쌓이는 대로 이 시리즈에 이어서 추가할 예정이다.

한줄 평

  • 기존에 강의를 들으며 이해한 부분을 AI와 복습을 해가며 다시 읽게되니, 채득이 빠른 것 같다.