매치콤보 - Neural network가 생각대로 잘 작동하지 않는다
이전 이야기 한줄요약: 최적 전략 찾는 문제를 알파고 알고리즘으로 풀 수 있지 않을까? 싶어서 이것저것 해보고 있다.
하여튼 현재의 Leaderboard
LLM에게 이런저런 Policy를 구현하게 하고, 그것들을 경쟁시킨 Leaderboard를 만들어서 비교해보고 있다. 현재의 점수판은 다음과 같다.
Summary
| Policy | Total | Average |
|---|---|---|
| randfill | 36178.03 | 3617.80 |
| claude-opus-4.5 | 29693.18 | 2969.32 |
| simple_nn | 26916.02 | 2691.60 |
| heuristic | 26916.02 | 2691.60 |
| torch_nn | 26916.02 | 2691.60 |
| hybrid_nn | 13084.28 | 1308.43 |
Game-by-game
| Game | simple_nn | heuristic | randfill | claude-opus-4.5 | torch_nn | hybrid_nn |
|---|---|---|---|---|---|---|
| 1 | 3160.66 | 3160.66 | 3230.31 | 3539.73 | 3160.66 | 1091.11 |
| 2 | 3305.72 | 3305.72 | 3812.99 | 2906.36 | 3305.72 | 2512.76 |
| 3 | 1543.44 | 1543.44 | 5302.11 | 2151.45 | 1543.44 | 1114.84 |
| 4 | 2714.98 | 2714.98 | 4073.43 | 3294.27 | 2714.98 | 882.52 |
| 5 | 1709.24 | 1709.24 | 2322.99 | 2549.14 | 1709.24 | 1473.24 |
| 6 | 4590.47 | 4590.47 | 2350.24 | 4779.34 | 4590.47 | 1126.41 |
| 7 | 4464.25 | 4464.25 | 4929.98 | 4605.15 | 4464.25 | 983.31 |
| 8 | 1370.45 | 1370.45 | 3988.93 | 1592.66 | 1370.45 | 1278.50 |
| 9 | 2682.72 | 2682.72 | 3359.93 | 2681.91 | 2682.72 | 988.75 |
| 10 | 1374.09 | 1374.09 | 2807.12 | 1593.17 | 1374.09 | 1632.84 |
Heuristic: 야 Claude-opus-4.5야, 요런 게임 있는데 휴리스틱 한번 생각해봐
실제로도 프롬프트 한줄 넣어서 만들었다. 대충 각 Cell마다 콤보가 몇개 나오는지 계산해서 예상 점수를 계산하고, 예상 점수가 가장 높아지는 선택을 한다.
xxx_nn: 야 AI야, 모델 좀 만들어봐.
모든 Cell이 채워진 보드의 점수는 Trivial하게 계산 가능하니, 이걸 트레이닝 데이터에 넣고, 한 Cell이 비어있는 보드의 점수는 빈 Cell에 1-10 사이의 숫자가 들어가는 경우 각각 기대값을 계산한 다음 평균을 내서 마찬가지로 트레이닝 데이터에 넣고…
위 모델이 완벽하게 동작한다면, 이후 2개 이상의 Cell이 비어있는 보드의 경우 다음 알고리즘을 써서 기대값을 계산할 수 있을거라 생각했다.
sum_est = 0
for i in range(1, 11):
max_est = -1
for jt in empty_cells(board):
tboard = board
tboard[jt] = i
est = get_estimate(tboard)
if max_est < est:
max_est = est
sum_est += max_est
estimate[board] = sum_est / 10.0
대충 AI가 이런식으로 할 수 있을거라 생각해서 모델 만들고 학습하라고 했는데 보시다시피 heuristic을 넘지 못하는 참패를 반복했다.
Claude-opus-4.5: 야 GPT-5.3-codex야, 무슨 수를 써서든 heuristic좀 이겨봐라
참고로 claude-opus-4.5는 클로드가 아니라 GPT-5.3-codex 모델에게 “무슨 수를 써서든 claude가 만든 heuristic을 이겨라”라고 요청해서 만든 전략이다. 보아하니 초반은 비슷하게 기대값 위주로 하다가, 빈칸이 5개 이하로 남은 경우 모든 가능한 경우를 시뮬레이션해보더라. 그냥 후반을 더 더 더 강하게 만들어서 겨우 heuristic만 이긴 느낌?
Randfill: 빈칸을 랜덤으로 채우시오
이후로 한동안 AI에게 “새로운 아이디어” 좀 짜내보라고 했는데 영 지지부진해서, 빈 칸을 모두 random으로 채우는 방식으로 채우고 점수를 계산해보는 방식을 64번 반복하도록 해서 플레이의 기대값을 계산하도록 한 것이 randfill이다.
읭? 왜 이게 점수가 제일 좋지? 왜 AI는 이걸 생각 못한거지?
뭐가 문제인가?
Top12가 문제인가?
일단 가장 좋은 “12”개의 패 점수만 계산하는 부분이 prediction에 있어서 noise를 주고 있지 않나 하는 의구심이 있다. 혹시나 싶어서 모든 가능한 패의 점수 합을 계산하는 방식을 최적화하는 방법도 같이 시도해보고 있다.
가설: 만약 Top28 최적화가 Top12 최적화보다 훨씬 낮은 loss로 구현가능하다면, 점수 계산 부분의 layer 구현이 잘못된 것이 아닌가 하는 의구심이 든다. 28개의 점수를 뽑고 Top 12개를 뽑는 부분 또한 모델로 표현 가능하지 않나?
모델이 구린가?
대충 모델 Layer좀 잡아보라고 하니까 너무 단순한 모델이 나온다. Layer를 좀 더 쌓아보라고 해야 겨우 끼적끼적 몇개 더 얹는 수준에, Dropout같은 regularization도 잘 안하는 느낌? (요즘 모델은 Dropout 안하나?)
결론
이제 Randfill 좀 이겨봐라 기우제 메타 들어갔는데, AI들이 맨날 코드 읽고 한다는 소리가 “randfill이 강하네요 ㅎㅎ” 요ㅈㄹ… 야 니들 randfill 없을땐 “heuristic이 강하네요 ㅎㅎ” 이랬거든?