- 대부분의 LLM이 체스를 못 두는 가운데
gpt-3.5-turbo-instruct만 유독 강했던 현상은, 프롬프트 인터페이스를 바꾸면gpt-4o와gpt-4o-mini도 상당히 나아진다는 실험으로 일부 설명됨 - OpenAI가 체스 엔진을 몰래 호출한다는 가설은 약함: 같은 보드라도 도달 수순에 따라 다른 수를 두고, 프롬프트 변화에 민감하며, 성능도 엔진이 아닌 약 1750 Elo 수준에 머묾
- 세 개의 짧은 인컨텍스트 예시만으로 성능이 크게 올랐고, Stockfish 자가 대국 100개에서 뽑은 예시로 파인튜닝해도 개선이 확인됨
- 반대로 현재 가능한 합법 수를 알려주면 성능이 크게 나빠졌고, 전체 기보를 반복한 뒤 다음 수를 붙이는 기보 반복(regurgitation) 방식은 chat 모델을 completion 모델처럼 행동하게 만들어 성능을 끌어올림
- 최종 조합인
gpt-4o + regurgitation + examples는gpt-3.5-turbo-instruct와 50판에서 10승 5무 35패를 기록했고, 백의 이점을 감안하면 약 1540 Elo로 추정돼gpt-3.5-turbo-instruct의 약 1750 Elo에는 못 미침
문제 설정: 왜 gpt-3.5-turbo-instruct만 체스를 잘 두는가
- 기존 관찰의 출발점은 대부분의 LLM이 체스를 매우 못 두지만,
gpt-3.5-turbo-instruct는 고급 아마추어 수준으로 둔다는 점임 - 이 모델은 1년 이상 된 비교적 작은 모델인데도 최신 모델보다 체스를 잘 두는 것으로 나타남
- 가능한 설명은 크게 네 가지였음
- 큰 base 모델은 체스를 잘 두지만 instruction tuning을 거친 chat 모델에서는 능력이 유지되지 않음
gpt-3.5-turbo-instruct가 더 많은 체스 데이터로 학습됨- 특정 LLM 아키텍처에 특별한 요소가 있음
- 체스 데이터가 전체 학습 데이터에서 충분히 큰 비중을 차지해야 함
- 이후 논의는 OpenAI의 체스 엔진 호출 가능성, LLM이 실제로 체스를 두는지 여부, base 모델과 chat 모델의 차이로 좁혀짐
체스 엔진을 몰래 쓰는 가설은 설득력이 낮음
gpt-3.5-turbo-instruct가 체스 표기법을 인식해 외부 체스 엔진을 호출한다는 의심은 가능성이 매우 낮아 보임- 근거는 여러 갈래로 나뉨
- OpenAI 관계자들이 그런 처리를 하지 않았다고 말함
- 체스 엔진은 같은 보드 상태라면 수순과 무관하게 평가하지만,
gpt-3.5-turbo-instruct는 같은 보드라도 도달 수순이 다르면 다른 수를 둠 - 체스 아마추어 기준으로는 좋지만 전문가 기준으로는 약하고, 체스 엔진과 비교하면 매우 낮은 성능임
- 프롬프트를 바꾸면 플레이가 미묘하게 달라짐
- 이후 OpenAI 모델들은 기본 상태에서 훨씬 못 두지만, 적절한 프롬프트를 쓰면 잘 둘 수 있음
- 만약 부정행위가 있었다면 외부 엔진 호출처럼 보이지 않게 하면서 LLM이 직접 수를 고르는 듯 보이도록 매우 복잡한 방식을 택한 셈임
LLM은 단순 암기만으로 두는 것이 아님
gpt-3.5-turbo-instruct는 후반부에서도 불법 수를 드물게 제안함1. e4 d5 2. exd5 Qxd5 3. Nc3같은 문자열에서 마지막 수가 합법인지 판단하려면 체스 규칙과 상태 추적이 필요함- 실제 대국에서도
gpt-3.5-turbo-instruct는 역사상 존재한 적 없는 새 보드 상태에서 꽤 잘 둠 - 따라서 오프닝을 암기한 뒤 이후에는 무작위로 둔다는 설명은 맞지 않음
기본 실험: completion 모델과 chat 모델의 차이
gpt-3.5-turbo-instruct는 completion 모델이라 PGN 형태의 텍스트를 이어 쓰게 하는 방식으로 다음 수를 얻음- 예시는
[Event "Shamkir Chess"], 선수 이름, Elo, 결과,1. e4 e5 2. Nf3 Nc6 3.같은 기보를 제공하는 방식임
- 예시는
gpt-4o-mini와gpt-4o는 chat 모델이라 system prompt와 user prompt를 통해 다음 수만 표준 대수 표기법으로 내게 함- Stockfish level 1을 상대로 각 수에 최대 0.01초를 주고 50판 평균을 냈으며, 게임 뒤 각 턴의 점수를 centipawn으로 계산함
- pawn은 100점으로 계산
- ±1500은 승패에 해당
- 기본 프롬프트에서는
gpt-3.5-turbo-instruct가 강하고,gpt-4o와gpt-4o-mini같은 chat 모델은 약하게 나타남
프롬프트 구성 실험
- user prompt 맨 위에 system prompt를 반복할지, 선수 이름과 Elo 같은 메타데이터를 넣을지 조합을 바꿔 실험함
gpt-4o-mini에서는 큰 차이가 거의 없어 보임gpt-4o에서는 system prompt 반복이 약간 도움이 되고 메타데이터는 약간 해로운 것처럼 보였지만, 노이즈일 가능성도 남아 있음- 이후 실험에서는 단순화를 위해 system prompt 반복과 메타데이터를 모두 끔
세 개의 예시만으로 성능이 크게 개선됨
- LLM에 작업을 시킬 때 흔히 쓰는 방식처럼 세 개의 짧은 입출력 예시를 API로 제공함
- 입력
1.→ 출력e4 - 입력
1. e4→ 출력d5 - 입력
1. e4 e5 2. Nf3 Nc6 3.→ 출력Bb5
- 입력
- 이 세 예시만으로 결과가 매우 좋아짐
- 더 많거나 다른 예시가 더 나을 수 있지만, 각 그림을 만들기 위해 매우 많은 쿼리가 필요해 추가 확인은 하지 않음
파인튜닝은 도움되지만 예시와의 조합은 불안정함
gpt-4o-mini와gpt-4o모두에 파인튜닝을 수행함- 데이터 생성 방식은 다음과 같음
- Stockfish가 최고 난이도로 자기 자신과 100판을 둠
- 각 게임에서 임의의 한 수를 골라 학습 예시로 사용함
- 별도로 Stockfish 자가 대국 100판을 검증 데이터로 사용함
- 파인튜닝 자체는 성능을 개선함
- 다만
gpt-4o의 첫 파인튜닝 결과가 나빠 보여 더 작은 step size로 다시 실행했고, 이 점은 불안 요소로 남음 - 예시와 파인튜닝을 결합하면 기대처럼 일관되게 좋아지지 않음
- 파인튜닝만 있으면 도움이 됨
- 예시만 있어도 도움이 됨
- 파인튜닝 뒤 예시를 더하면 거의 효과가 없음
- 예시가 있는 상태에서는 파인튜닝이 오히려 해로운 결과를 냄
합법 수 목록 제공은 성능을 망침
- 모델이 가끔 불법 수를 내기 때문에, 현재 가능한 합법 수 목록을 기보 앞에 제공하는 실험을 함
- system prompt도 합법 수 목록과 부분 기보를 받는 형태로 바꿈
- 결과는 매우 나빴음
- 승률이 낮아졌을 뿐 아니라 더 이른 턴부터 실수를 시작함
- 합법 수 목록 제공은 이후 사용하지 않음
핵심 아이디어: 전체 기보를 반복하게 만들기
- chat 모델은 special token과 instruction tuning을 통해
<|SYSTEM|>,<|USER|>,<|ASSISTANT|>같은 대화 형식으로 동작함 - base 모델은 문자열을 이어 쓰는 completion 모델에 가깝고, PGN 기보도 그런 방식과 더 잘 맞음
- OpenAI의
gpt-4-base에 직접 접근할 수 없고,gpt-4o를 completion mode로 호출할 수도 없어 직접 비교는 불가능함 - 대신
gpt-4o가 completion 모델처럼 행동하도록, 다음 수만 내지 말고 전체 게임을 반복한 뒤 새 수를 하나 더 붙이게 함 - 예를 들어 입력이
1. e4 e5 2.라면 출력이1. e4 e5 2. Nf7같은 형태가 되도록 요구함 - 이 방식은
gpt-4o-mini와gpt-4o의 체스 성능을 개선함 - 전체 수순을 반복하게 하면 모델이 좋은 수를 고를 가능성이 높은 문맥을 스스로 만들게 됨
- 이 결과는 접근 불가능한
gpt-4-base를 completion mode로 호출할 수 있다면 체스를 꽤 잘 둘 것이라는 근거로 작용함
기보 반복, 예시, 파인튜닝의 조합
- 기보 반복 방식에서도 별도의 파인튜닝 실험을 다시 수행함
- 입력은 기존처럼 부분 기보
- 원하는 출력은 입력 기보 전체를 반복한 뒤 다음 수를 붙인 형태
- 이 방식의 파인튜닝은 약간 도움이 된 것처럼 보임
- 기보 반복 방식에 맞춰 세 개의 예시도 다시 구성함
- 입력
1.→ 출력1. e4 - 입력
1. d4→ 출력1. d4 d5 - 입력
1. e4 e5 2. Nf3 Nc6 3.→ 출력1. e4 e5 2. Nf3 Nc6 3. Nf3
- 입력
- 적은 정보량에도 예시는 다시 큰 영향을 줌
- 예시와 파인튜닝을 함께 쓰면 이상한 패턴이 반복됨
- 파인튜닝에 예시를 더하면 도움이 됨
- 하지만 예시만 쓴 경우보다 여전히 나쁨
실험 결과와 Elo 추정
- 실험 결과는 세 부류로 정리됨
- 좋음: 기보 반복, 예시, 예시 없는 파인튜닝
- 불명확: 메타데이터, system prompt 반복, 예시와 함께 쓰는 파인튜닝
- 나쁨: 합법 수 목록 제공
- 최종 조합은 기보 반복과 예시를 사용하고 나머지는 끈 방식임
gpt-4o + regurgitation + examples는 꽤 괜찮지만gpt-3.5-turbo-instruct만큼 강하지는 않았음- 두 모델이 50판을 뒀고, 모든 판에서
gpt-4o가 백을 잡음
gpt-4o 결과 |
횟수 |
|---|---|
| 승 | 10 |
| 무 | 5 |
| 패 | 35 |
- 이 결과는 Elo 차이 약 -191과 일치함
- 백의 선공 이점이 약 35 Elo로 알려져 있다는 점을 반영하면,
gpt-4o + regurgitation + examples는 약1750 - 191 - 35/2 ≈ 1540 Elo로 추정됨 - 이는 중급 아마추어 수준으로 평가됨
현재 가설: 데이터와 인터페이스가 함께 작용함
- 현재 가설은 두 부분으로 나뉨
- OpenAI의 base 모델은 오픈 모델보다 더 많거나 더 좋은 체스 게임 데이터로 학습됨
- 최신 OpenAI base 모델은 completion mode에서 체스를 잘 둘 가능성이 있지만, 실제 접근 가능한 chat 모델은 그렇지 않음
- 오픈 모델들은 base 모델이든 chat 모델이든 체스를 못 두는 것으로 나타났고, 이는 아키텍처 한계보다는 데이터 차이일 가능성이 더 큼
- 한 논문 A.2 절에는 GPT-4가 PGN 표기의 체스 게임으로 학습됐고, Elo 1800 이상 플레이어의 게임만 포함하도록 필터링했다는 내용이 있음
gpt-3.5-turbo-instruct가 같은 데이터를 썼다는 공개 확인은 없지만, PGN 표기로 체스를 두고 측정 Elo가 약 1750이라는 점은 우연처럼 보이지 않음- Llama 등 오픈 모델 학습에 체스 데이터가 얼마나 포함됐는지는 확인하지 못함
- 오픈 인터넷에서 많은 게임이 들어갔을 수는 있지만, 고품질 게임을 대규모로 선별한 데이터베이스가 더 나은 결과를 냈을 가능성이 있음
- 너무 많은 저숙련 체스 데이터 때문에 모델이 낮은 품질의 수를 예측할 가능성도 있지만, 강한 수순이 이어진 상황에서는 강한 플레이어의 다음 수를 예측해야 하므로 주된 설명은 아니라고 봄
남은 불확실성과 실무적 인상
gpt-4ochat mode가gpt-4-basecompletion mode보다 약하다면, 원인이 chat interface인지 instruction tuning인지, 또는 둘 다인지는 알 수 없음gpt-4-base를 chat mode처럼 시뮬레이션하면 잘 둘지,gpt-4o를 completion mode로 호출하면 잘 둘지도 실험할 수 없음gpt-4o에서 더 나은 행동을 끌어내는 방법은 더 있을 가능성이 큼- 프롬프트, 예시, 파인튜닝의 최적 조합을 찾기는 매우 어려움
- 탐색 공간이 큼
- 쉬운 추상화가 없음
- LLM은 예측하기 어렵고 취약함
- 실험은 느리고 비용이 많이 듦
- 같은 최종 레시피를
gpt-4에 적용했을 때는 체스를 잘 두지 못함 - 찾은 조합은
gpt-4o에 특화됐을 수 있으며,gpt-4에는 다른 프롬프트, 더 많은 예시, 또는 파인튜닝이 필요할 수 있음 - 이 과정은 공학이라기보다 주문 찾기에 가깝게 느껴질 정도로 모델별 민감도가 큼