Andrej Karpathy와 함께하는 Microsoft Build 2023: GPT 최신 동향 (1/2) — GPT Assistant를 학습하는 방법
올해 Microsoft Build 2023 행사에는 Tesla에서 다시 OpenAI로 복귀한 안드레이 카파시(Andrej Karpathy)가 등장하여 “State of GPT”를 발표하였다. (안드레이 카파시는 OpenAI의 co-founder 중 한명이었다. OpenAI의 co-founder로 우리가 아는 Ilya Sutskerver, Greg Brockman, Sam Altman, Elon Musk 등이 있다.) 현재까지 GPT의 현재와 미래를 이해할 수 있는 발표라서 정리를 하였다.
한 때 딥러닝을 처음 시작할 때 필수 코스였던 Stanford의 cs231n 강의를 다시 듣는 것과 같아 옛날 생각이 나기도 하였다. 안드레이 카파시의 “State of GPT” 발표는 아래와 같이 두가지 내용으로 구성되어 있다. 내용이 긴 관계로 두 개의 파트로 분리하여 블로그에 리뷰를 연재하기로 한다.
GPT Assistant Training Pipeline
GPT assistant의 학습 파이프라인은 크게 4 단계로 구성되며 서로 순차적으로 이어진다. 각 단계는 학습에 필요한 데이터셋과 학습 알고리즘이 있으며, 해당 데이터셋을 학습한 모델이 각 단계의 최종 결과물이다.
- 1st Stage: Pretraining
- 2nd Stage: Supervised Finetuning
- 3rd Stage: Reward Modeling
- 4th Stage: Reinforcement Learning
1st Stage: Pretraining
Pretraning 단계는 학습 컴퓨팅 시간의 99%를 차지한다. 대부분의 FLOPS 또한 Pretraining 단계에서 필요하며 GPT assistant는 수 천대의 GPU로 몇 달동안 학습된다. 이에 비해 나머지 단계는 소수(1~100대)의 GPU로 수 시간에서 며칠동안 fine-tuning하는 정도의 컴퓨팅 리소스만 필요하다.
Data collection
먼저 Pretraining을 하기 위해선 학습 데이터를 수집해야 한다. 안드레이는 Meta가 공개한 LLaMA 학습에 사용한 데이터셋의 종류(Common Crawl, C4, GitHub, Wikipedia, Books, Archive, Stack Exchange)를 인용하며, 이 모든 데이터셋을 함께 혼합한 후, 주어진 비율에 따라 샘플링하여 GPT assistant의 뉴럴 네트워크를 학습한다고 한다. (주: OpenAI가 사용하는 실제 데이터셋의 종류와 샘플링 비율은 Meta와는 다를 것이다.)
Tokenization
실제 학습 되기 전에 데이터셋은 토큰화(Tokenization) 과정이라는 전처리 단계를 거쳐야 한다. 토큰화는 raw 텍스트를 integer의 긴 시퀀스로 변환하는 작업으로 text → token → integer 변환 과정은 무손실 번역이다. 토큰화를 위한 알고리즘으로 Byte-Pair Encoding(BPE) 등이 사용되며, 1 token은 대략 0.75 word로 환산된다.
학습 hyperparameters
안드레이는 학습에 필요한 hyperparameters를 설명하기 위해 GPT-3 (2020)와 LLaMA(2023)를 비교하였다. (GPT-4의 hyperparameter는 여전히 비공개 상태이다.)
- Vocabulary Size: 10K tokens~
- Context Length: 2K, 4K ~ (Max) 100K
- Model 파라미터 크기: GPT-3(175B) ↔ LLaMA(65B). LLaMA는 GPT-3에 비해 파라미터의 개수는 약 1/3이지만 더 많은 토큰(GPT-3(300B 토큰)에 비해 3배 이상 많은 1.4T 토큰)으로 학습됨.
- 그 밖에 heads, dimension size, layer의 개수 등과 같은 hyperparameters가 있음
- 학습 비용: O(1–10) $M
실제 학습 시 어떠한 일이 발생하는가?
Transformer의 입력으로 (B,T)의 배열을 사용한다.
- B: batch size (e.g. B=4)
- T: max. context length (e.g. T=10)
Transformer에 입력할 문서들은 매우 길므로 이 도큐먼트들을 context length 단위로 묶은 후 행으로 쌓으며, 특수 토큰 <[endoftext]>으로 문서들을 구분하여 새로운 문서가 시작되는 위치를 알려준다.
위와 같이 배치된 (B,T)를 Transformer에 학습시키는 과정을 이해하기 위해 아래 그림의 녹색 cell에 집중한다. 녹색 cell은 그 앞에 있는 모든 토큰(row 2의 모든 노란색)을 살펴보고 이 컨텍스트를 transformer의 뉴럴 네트워크에 공급하면, transformer는 시퀀스의 그 다음 토큰(row2의 빨간색 토큰)을 예측하려고 시도한다. 이 특정 cell에 대한 예제에서 빨간색 토큰은 ‘513’이며 이 값을 transformer의 weight를 업데이트하기 위한 감독 소스로 사용할 수 있다.
이와 같은 동작은 병렬로 각 단일 cell마다 기본적으로 적용된다. 배치를 바꿔가면서(row1 ↷ row2 ↷ row3 ↷ row4)를 transformer가 다른 토큰이 어떠한 순서로 나올지 정확하게 예측할 수 있도록 학습한다.
다음은 셰익스피어의 작은 snippet을 작은 GPT에 학습시켰을 때 GPT의 출력을 보여준다. 초기에는 GPT는 랜덤 weight로 시작하기 때문에 초기 출력 역시 랜덤하게 출력한다. 하지만 GPT를 반복하여 학습하였을 때 모델은 점점 일관성 있는 샘플을 출력하게 된다. GPT가 샘플을 추출하는 방식은 다음에 무엇이 나올지 예측하는 것이다. 시간이 지나감에 따라 transformer는 단어와 공백을 어디에 넣어야 하는지 쉼표를 어디에 넣어야 하는지 학습할 수 있다.
아래의 그림에서 살펴볼 수 있는 것과 같이 loss 함수는 학습을 거듭할수록 loss 값이 낮아지는데 이는 transformer가 더 높은 확률로 시퀀스에서 올바른 다음 integer를 추측할 수 있다는 것을 의미한다.
GPT-1
현장에서 가장 먼저 알아차린 것은 위와 같은 모델이 기본적으로 언어 모델링 과정에 있고, 매우 강력한 일반적인 표현을 학습하며 사용자가 원하는 임의의 다운스트림 태스크에 매우 효율적으로 fine-tuning을 할 수 있다는 점이다.
예전에 감정 분류(Sentiment Classification)을 한다면 긍정과 부정을 수집한 후, 이를 위한 전용 NLP 모델을 학습하였지만 새로운 접근 방식은 감정 분류를 무시하고 대규모 언어 모델을 pretraining한 후 몇가지 예제만 있으면 해당 task에 맞게 모델을 매우 효율적으로 fine-tuning할 수 있었다. 이것이 바로 GPT-1이다. 이 방식은 실제로 매우 잘 작동하는데 transformer가 다음 토큰을 예측하는 것뿐만이 아니라 텍스트의 구조와 그 안에 있는 모든 다른 개념에 대해서 이해하기 때문이다.
GPT-2
GPT-2가 출시되었을 시점에 연구자들은 finetuning보다 더 효과적으로 GPT-2에 프롬프트할 수 있다는 사실을 알게 되었다. 즉, 아래의 예제에서 보는 것과 같이 GPT-2에 몇 개의 few-shot prompt를 준 후, “Q: where does she live”하면 transformer는 문서를 완성하기 위해 “A:” 이후 실제로 질문에 답변하는 것이다.
Base 모델은 ‘Assistants’가 아니다!
이제 뉴럴 네트워크를 학습하거나 finetuning 등을 하지 않고도 많은 문제를 실제로 잘 실행할 수 있다. API를 통해 상호 작용할 수 있는 GPT-4 모델은 base 모델이 아니며 assistant 모델이다. 현재 사용 가능한 가장 좋은 base 모델은 비록 상업적 라이선스가 부여되지 않았지만 Meta의 LLaMA 시리즈이다.
여기서 한가지 지적해야 할 것은 base 모델은 ‘assistants’이 아니다는 점이다. Base 모델들은 질문에 답변하는 것이 아니라 도큐먼트를 완성하길 원할 뿐이다. 따라서 “Write a poem about bread and cheese”라고 요구하면 아래 그림의 왼쪽 예시와 같이 더 많은 질문으로 질문에 답할 뿐이다.
하지만 사용자가 base 모델에 특정 방식으로 프롬프트를 제공한다면 더 잘 작동한다. 아래 그림의 오른쪽 예시와 같이 “Here is a poem about bread and cheese:”라는 프롬프트를 제공하면 base 모델은 올바르게 그 이후 부분을 자동 완성해준다.
Base 모델을 마치 assistant인 것처럼 속일 수도 있는데 아래 그림과 같이 인간과 assistant 사이에 어떠한 종류의 도큐먼트가 있는 것처럼 보이도록 특정 few-shot 프롬프트를 생성하고 정보를 교환한 후 맨 마지막에 쿼리를 집어 넣는 것이다. 하지만 이와 같은 방식은 매우 신뢰할 수 없으며, 실제로 잘 동작하지 않는다.
2nd Stage: Supervised Finetuning
Base 모델이 도큐먼트 완성자가 아닌 실제 GPT assistant를 만들기 위한 경로가 생겼는데 그것은 바로 supervised finetuning이다. Supervised finetuning 단계에서는 인간 라벨러에게 공식적인 프롬프트와 이상적인 응답을 요청하여, 작지만 고품질의 데이터셋(프롬프트-응답 쌍)을 수집한다. 이 과정에서 일반적으로 수 만개 정도의 데이터셋을 수집한다.
이후 이 데이터셋을 이용하여 언어 모델링을 수행한다. 이때 알고리즘적으로 변경된 것은 없으며 다만 학습 데이터셋만 교체할 뿐이다. 1st Stage는 품질이 낮지만 많은 양의 인터넷 도큐먼트를 학습하였다면 2nd Stage은 기본적으로 고품질의 작은 양의 Q&A 프롬프트-응답 데이터셋을 학습한다.
위 그림은 Supervised Fine Tuning(SFT) 데이터셋의 예시를 보여준다. 위 그림의 왼쪽 예시는 프롬프트와 응답에 대한 예시로 “Can you write a short introduction about the relevance of the term “monopsony” in economics? (경제에서 독점이라는 용어의 관련성에 대해 짧은 소개를 작성할 수 있나요?)와 같은 랜덤 프롬프트에 대해 인간 라벨러는 이상적인 답변을 작성한다.
이와 같은 답변을 작성할 때 위 그림의 오른쪽 예시와 같이 인간 라벨러는 광범위한 라벨링 문서의 지침에 따라 도움이 되고(helpful), 진실하며(truthful), 무해한(harmless) 내용을 작성하도록 요청받는다.
3rd Stage: Reward Modeling
2nd Stage supervised finetuning이 끝나면 인간 피드백을 통한 강화 학습인 RLHF로 이동할 수 있다.
3rd Stage인 보상 모델링(RM. Reword Modeling) 단계에선 비교 형태의 RM 데이터셋을 수집하는 것으로 전환한다. 아래 그림은 2nd Stage에서 생성한 SFT 모델을 이용하여 동일한 프롬프트(“Write a Python function that checks if a given string is a *palindrome.”)에 대해 여러 개의 완성물을 생성하는 예시이다.(*palindrome은 단어를 앞으로 읽거나 거꾸로 읽어도 동일한 문자열인 단어,구, 시퀀스이다. 예를 들어 madam or nurses run와 같다.) 이 경우에 모델은 동일한 프롬프트에 대해서 3개의 완성물을 만들면 사람들이 이 완성물의 순위를 매긴다.
아래 예시를 잘 보면 이러한 추측 중 어떠한 것은 비교하기 매우 어려워서 사람이 단일 프롬프트 완성물 쌍을 비교하는데 몇시간이 걸릴 수 있다. 그러나 SFT의 완성물 중 하나가 다른 것보다 훨씬 낫다고 판단하여 순위를 매긴다고 가정하면 완성물들을 가능한 모든 경우의 쌍으로 만들고 이진 분류와 유사한 방식으로 순위를 내길 수 있다.
지금부터 해야 할 일은 프롬프트와 해당 프롬프트의 결과물을 행 단위로 배치하는 것이다. 아래 그림에서 파란색 토큰은 모두 동일한 프롬프트 토큰이며, 노란색 토큰은 SFT가 만든 완성물로 각 행마다 다양한 토큰으로 구성되어 있다. 각 행의 마지막에 위치한 녹색 토큰은 특별한 보상 토큰(<|reward|>)이다.
이와 같이 RM 데이터셋이 완성되면 나머지(파란색 토큰, 녹색 토큰)는 무시하고 녹색 토큰만을 transformer에 지도학습시킨다. Transformer는 해당 프롬프트가 얼마나 잘 완성했는지에 대한 보상을 예측한다. 이러한 방식으로 RM을 학습하고 이를 통해 프롬프트에 대한 완성도를 점수화할 수 있다. 이제 RM이 있기 때문에 주어진 프롬프트에 대한 완성물의 품질을 점수화할 수 있다.
4th Stage: Reinforcement Learning
마지막 4th Stage에선 인간 라벨러를 통해 대규모 프롬프트의 모음을 얻은 후, 3rd Stage에서 얻은 보상 모델과 관련하여 강화 학습을 수행하는 것이다.
다음 그림은 강화 학습의 방식을 설명한다. 하나의 프롬프트를 가져와 행에 배치하고 학습하고자 하는 모델을 SFT 모델로 초기화하여 노란색 토큰(=완성물 토큰)을 생성한다. 그런 다음 보상 토큰(<|reward|>)을 다시 추가하고 더이상 변경되지 않고 고정된 상태로 유지된다.
이제 보상 모델은 이들 프롬프트에 대한 모든 완성품의 품질을 알려준다. 기본적으로 동일한 언어 모델링 손실 함수를 적용할 수 있지만 현재는 노란색 토큰에 대해 학습하고 있다. 그리고 보상 모델에 표시된 보상으로 언어 모델링 목표를 평가하고 있다.
예를들어 아래와 같은 작업을 여러 프롬프트와 여러 배치에 대해서 반복해서 수행한다.
- Row #1: 첫 번째 행에서 보상 모델은 완성물에 대해서 상당히 높은 점수(1.0)를 주었습니다. 따라서 첫 번째 행에서 샘플링한 모든 토큰은 강화되고 앞으로 더 높은 확률을 얻게 될 것이다.
- Row #2: 반면 두 번째 행은 보상 모델이 해당 완성물을 정말 좋아하지 않았다. (-1.2) 따라서 두 번째 행에서 샘플링한 모든 토큰은 미래에 대해 약간 더 높은 확률을 얻게 된다.
이때 기본적으로 노란색 토큰을 생성하는 정책을 얻게되며, 이전 단계에서 학습한 보상 모델에 따라 여기에 있는 모든 완성물들이 높은 점수를 받게 된다. 이것이 바로 RLHF 파이프라인이다. OpenAI는 GPT assistant를 학습하는데 이 RLHF 파이프라인을 사용하여 마지막 배포할 수 있는 모델을 얻는다. ChatGPT는 바로 RLHF 모델이다.
왜 RLHF를 사용하는 것일까?
그렇다면 왜 RLHF를 사용하는 것일까? 그 것이 더 잘 작동하기 때문이다. 아래 그림은 InstructGPT 논문의 결과로 사람들은 다른 모델(Base 모델과 SFT 모델)에 비해 RLHF 모델(PPO)이 생성한 토큰을 더 선호한다는 사실을 알 수 있다.
왜 RLHF가 더 잘 작동하는 것일까? 잠재적인 이유로는 비교하기 쉬운 것과 생성하기 쉬운 것 간의 비대칭성과 관련이 있다. Haiku(각 행마다 5,7,5음 총 17음으로 이루어진 일본의 정형시)를 생성하는 예시를 생각보기로 한다. 모델에 페이퍼 클립에 대한 Haiku를 써 달라고 요청한다고 가정해 보자.
SFT를 위한 학습 데이터를 제공하는 사람들 중 대부분은 Haiku를 멋지게 쓰는 것에 능숙하지 못할 것이다. 하지만 아래와 같이 몇가지 Haiku의 예시 중에서 어떠한 Haiku가 더 잘 쓴 것인지 판단하는 것은 휠씬 쉬운 일이다. 따라서 비교와 생성 간의 비대칭성으로 인해 비교가 조금 더 나은 모델을 만들 수 있는 더 좋은 방법이다.
하지만 RLHF 모델은 경우에 따라 base 모델 대비 엔트로피가 약간 손실된다는 사실을 발견하였다. 즉 RLHF 모델은 base 모델보다 변동이 적은 샘플을 출력하는 반면, base 모델은 엔트로피가 더 많아 더 다양한 결과를 제공한다.
예를들어 base 모델에 7개 포켓몬의 이름을 제공하고 도큐먼트를 완성해 달라고 요청했을 때 훨씬 더 많은 가상의 포켓몬 이름을 생성하는 것을 알 수 있었다. 이는 base 모델이 여전히 엔트로피가 많고 이전에 어떠한 것을 주든 다양하고 멋진 것들을 더 많이 줄 수 있기 때문에 이와 같은 종류의 작업을 더 잘 할 수 있다.
아래 결과는 버클리대가 주축이 된 Vicuna팀이 ELO 평점을 이용하여 각 assistant 모델의 순위를 매긴 표로 1~3위까지는 RLHF 모델(GPT-4, Claude, ChatGPT)이 차지하였으며 나머지 다른 모델들은 모두 SFT 모델로 보인다.
Part1. GPT Assistant를 학습하는 방법에 대한 설명이 끝났다. 다음 연재에는 Part 2. GPT assistants를 애플리케이션에 효율적으로 사용하는 방법에 대해 정리할 예정이다.
레퍼런스
[1] State of GPT