我们最近讨论了一个谜团:所有大型语言模型(LLM)在国际象棋方面都很糟糕。所有,也就是说,除了gpt-3.5-turbo-instruct
之外,由于某种原因它可以达到高级业余水平。尽管该模型已有一年多的历史,而且比最近的模型小得多。这是怎么回事?
我提出了四种可能的解释:
-
理论 1:足够大的基础模型擅长国际象棋,但是通过对聊天模型的指令调整,这一点不会持续下去。
-
理论 2 :出于某种原因,
gpt-3.5-turbo-instruct
接受了更多国际象棋数据的训练。 -
理论 3:某些 LLM 架构有一些神奇之处。
-
理论4:不同类型的数据之间存在“竞争”,因此法学硕士要下好棋,需要很大一部分数据是棋局。
互联网提供了其他几种理论。最常见的是:
-
理论 5 :OpenAI 正在作弊。
-
理论 6 :法学硕士实际上不会下棋。
-
理论 7 :足够大的基础模型擅长国际象棋,但是通过对聊天模型的指令调整,这并不能持续下去,Dynomight 你太愚蠢了,没有提出这一点,你怎么这么愚蠢和糟糕?
我现在做了新的实验——好消息——每个人都错了!
在这里,我将展示最近的聊天模型可以很好地下棋,只要你愿意经历足够极端的扭曲来弄清楚如何提示它们。然后我将给出我对正在发生的事情的理论。
但首先……
我真的不认为OpenAI在作弊
令我惊讶的是,一半的互联网人都相信 OpenAI 正在作弊。很多很多人认为gpt-3.5-turbo-instruct
中一定有一些特殊情况可以识别国际象棋符号并调用外部国际象棋引擎。
我认为这是极不可能的。因为:
-
OpenAI 的许多人都表示他们没有这样做。当然,人们会撒谎,但阴谋是很难的,为什么要撒谎呢?
-
在国际象棋中,您可以通过不同的移动顺序达到相同的棋盘状态。国际象棋引擎并不关心,但
gpt-3.5-turbo-instruct
确实关心,并且对于不同的移动序列来说, 玩法非常不同。 -
虽然
gpt-3.5-turbo-instruct
按照国际象棋业余爱好者的标准来说很棒,但按照专家的标准来看它很糟糕,并且按照国际象棋引擎的标准来看它很可怜。如果你要作弊,为什么 Elo 停留在 1800 呢? -
如果您更改提示
gpt-3.5-turbo-instruct
方式,这将巧妙地改变它的播放方式。是否有一些神经网络可以查看文本并动态设置国际象棋引擎的技能水平? -
后来的 OpenAI 模型默认情况下要糟糕得多。他们删除了作弊吗?
-
我将(在下面)展示,如果您使用正确的咒语,以后的 OpenAI 模型也可以发挥良好的作用。
如果 OpenAI di* 作弊,他们就会疯狂地作弊,其方式看起来就像法学硕士正在选择动作,而根本不像调用外部国际象棋引擎。
是的,法学硕士可以下棋
我也很惊讶地看到这么多人认为法学硕士不能真正下棋,他们所做的只是记住空缺,然后随机下棋。
这是错误的。法学硕士绝对可以下棋,我们需要接受这一点。
其一, gpt-3.5-turbo-instruct
很少建议非法走法,即使在游戏后期也是如此。这需要“理解”国际象棋。如果这不能说服您,我鼓励您编写一个程序,可以采用1. e4 d5 2. exd5 Qxd5 3. Nc3
等字符串,然后说最后一步是合法的。
我不同意你在看过一些实际比赛后会坚持认为法学硕士不会下棋。这里有十个: 1 2 3 4 5 6 7 8 9 10 。即使在历史上任何游戏中从未存在过的全新棋盘状态下,它也能表现得很好。
那么发生了什么事?
为什么一个法学硕士很棒,而其他的都很糟糕?
让我提醒你我在说什么。首先,使用gpt-3.5-turbo-instruct
。这是一个“完成”模型,意味着它所做的只是获取一些文本并生成随后可能出现的新文本。我给了它这样的文字:
[Event "Shamkir Chess"]
[White "Anand, Viswanathan"]
[Black "Topalov, Veselin"]
[Result "1-0"]
[WhiteElo "2779"]
[BlackElo "2740"]
1. e4 e5 2. Nf3 Nc6 3.
然后我拿了前几个角色并将它们用作动作。
接下来,采用gpt-4o-mini
和gpt-4o
。这些是“聊天”模型,这意味着您给他们一个“系统提示”,说明他们应该做什么,然后给他们一个“用户提示”,然后他们尝试回答您。我用的是这个系统提示:
You are a chess grandmaster.
You will be given a partially completed game.
After seeing it, you should choose the next move.
Use standard algebraic notation, eg "e4" or "Rdf8" or "R1a3".
NEVER give a turn number.
NEVER explain your choice.
我使用了这样的用户提示(重复系统提示):
You are a chess grandmaster.
You will be given a partially completed game.
After seeing it, you should choose the next move.
Use standard algebraic notation, eg "e4" or "Rdf8" or "R1a3".
NEVER give a turn number.
NEVER explain your choice.
[Event "Shamkir Chess"]
[White "Anand, Viswanathan"]
[Black "Topalov, Veselin"]
[Result "1-0"]
[WhiteElo "2779"]
[BlackElo "2740"]
1. e4 e5 2. Nf3 Nc6 3.
以下是这三个模型在第 1 级与 Stockfish(标准国际象棋人工智能)对抗的结果,每步棋的最大时间为 0.01 秒。游戏结束后,我用“centipawns”计算每回合后的分数,一个棋子值100分,±1500表示输赢。以下是超过 50 场比赛的平均值(点击放大):
注意:上次我发现gpt-3.5-turbo-instruct
赢得了每场比赛,而gpt-4o
输掉了每场比赛。我认为现在的区别只是我有 50 个样本而不是 10 个。
这就是谜团: gpt-3.5-turbo-instruct
很棒,而其他模型很糟糕。上次我测试了很多开放模型,它们也很糟糕。为什么?
为了回答这个问题,让我们看看是否能让这些其他模型下棋更好。
我们应该摆弄提示吗?
你可以挑剔我如何提示聊天模型。在用户提示符顶部重复系统提示符是个好主意吗?在开始列出动作之前添加所有元数据(例如用户名)是个好主意吗?
据我所知,没有人知道。所以我尝试了打开或关闭这些东西的每一种组合。对于gpt-4o-mini
(小型型号)来说,似乎没有什么区别。
有了gpt-4o
(更大的型号),它……也许会有所不同?
从表面上看,这表明重复系统提示有一点帮助,但元数据有一点伤害。但我不确定这是真实的还是只是噪音。为简单起见,我决定不再重复系统提示并关闭所有进一步实验的元数据。
我们应该添加示例吗?
如果你希望法学硕士做某事,标准建议是提供一些例子。所以我做到了。
- 输入 A :
1.
- 输出A :
e4
- 输入B :
1. e4
- 输出 B :
d5
- 输入 C :
1. e4 e5 2. Nf3 Nc6 3.
- 输出C :
Nf3
这就是我所用的全部,只是这三个例子。我使用 API“正确”地提供了这些内容,而不是将它们塞到用户提示中。结果是:
非常好。
这令人惊讶吗?我认为这很令人惊讶。
我的意思是,当然,这种“情境学习”是法学硕士如此令人兴奋的一个重要组成部分。例子可能是从业者最标准的建议。
尽管如此,三个小例子却能对性能产生如此深远的影响,这让我感到震惊。更多(或不同)的例子可能会更好。我没有检查,因为生成这些数字中的每一个都需要大量的查询。
我们应该微调吗?
提高法学硕士的另一种标准(尽管更困难)方法是微调——优化权重,以擅长使用该任务的数据来完成任何任务。
所以我对gpt-4o-mini
和gpt-4o
都这样做了。
为了生成微调数据,我让 Stockfish 在最高难度级别上与自己进行了 100 场比赛。对于每场比赛,我随机选择一个动作并将其用作示例。这是一个例子:
- 系统提示:(同上)
- 用户提示:
1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 a6 6. Be2 e5 7. Nb3 Be7 8. Be3 Be6 9. f4 exf4 10. Bxf4 Nc6 11. Qd3 Ne5 12. Qg3 Nh5 13. Qe3
- 所需输出:
Nxf4
然后我让 Stockfish 玩了另外 100 场比赛作为验证数据。结果是:
好的!微调有帮助。
注意:我第一次微调gpt-4o
时,结果似乎很糟糕,所以我以较小的步长再次运行它。这让我很紧张。
我们应该结合示例和微调吗?
如果例子好,微调也好,把它们放在一起是不是更好?
我的直觉是否定的,因为与 100 个微调示例相比,三个上下文示例似乎微不足道。一旦完成微调,我认为这些示例将是多余的。
答案是否定的,但出于不同的原因:
根据该数字,微调会有所帮助。例子有帮助。示例可以更好地进行微调。但微调加上例子仍然比单独例子差。
哦,好吧。
我们应该提供合法的行动吗?
法学硕士有时很难提供合法的行动。在这些实验中,我尝试了 10 次,如果仍然没有合法的举动,我就随机选择一个。所以我想:也许我可以在提供游戏历史之前列出合法的动作来帮助法学硕士?也许有人会说这是“作弊”,但我们还是尝试一下吧。
我用的是这个系统提示:
You are a chess grandmaster.
You will be given a list of legal moves and a partially completed game.
After seeing it, you should choose the next move.
Use standard algebraic notation, eg "e4" or "Rdf8" or "R1a3".
NEVER give a turn number.
NEVER explain your choice.
我发送了这样的用户提示:
Here are the current legal moves:
Bxh6 Bxf6 Bh4 Bf4 Be3 Bd2 Bc1 Nd5 Nb5 Na4 Nce2 Nb1 Nh3 Nf3 Nge2 Ba6 Bb5+ Bc4 Bd3 Be2 Ke2 Kd2 Qh5 Qg4 Qf3 Qd3 Qe2 Qd2 Qc1 Qb1 Rc1 Rb1 e5 d5 h3 g3 f3 b3 a3 h4 g4 f4 b4 a4
Here is the game so far:
1. e4 d6 2. d4 g6 3. Nc3 Nf6 4. Bg5 h6 5.
结果如下:
灾难。列出合法的动作会让模型发挥得更糟。他们不仅赢得更少的比赛,而且在回合数少得多后开始犯错误。
噢凯。我想我们不要这样做。
我有一个主意
想到上面的事情,我有了一个想法。我认为这个想法……相当不错。
让我们倒退一下。要获得法学硕士学位,您首先要创建一个“基础”模型。基本模型所做的就是获取一个字符串并继续它。给定The best tea is
,他们有一定的概率产出green tea
或oolong
或其他茶。 (正确答案是oolong
。)
如果你想要一个可以与你交谈的法学硕士,你可以通过向他们发送如下所示的字符串来获得一个基本模型来做到这一点:
(Transcript of chat between USER and ASSISTANT who is super chill and answers all questions without judgment.)
USER: How do I know if squirrels like me?
ASSISTANT:
受过一般文本训练的法学硕士足够聪明,能够认识到接下来发生的事情可能是超级冷静剂会对神经质用户说的话。所以他们通常会做一些合理的事情。但在实践中,它们并不是很好。这些回应往往反映了互联网的混乱,这并不是你想要从助理那里得到的。
聊天模型在两个方面更进一步。首先,他们创建特殊标记来指示对话的不同部分,有点像这样(除非您应该将<|SYSTEM|>
等视为单个特殊字符)。
<|SYSTEM|>
You are a chatbot that is super chill and answers all questions without judgement.
<|USER|>
How do I know if squirrels like me?
<|ASSISTANT|>
然后,他们进行“指令调整”——重新训练权重,以便模型能够很好地响应以这种格式给出的提示。
因此,当我要求gpt-4o
预测国际象棋的走法时,实际呈现给系统的字符串看起来有点像这样:
<|SYSTEM|>
You are a chess grandmaster.
You will be given a list of legal moves and a partially completed game.
After seeing it, you should choose the next move.
Use standard algebraic notation, eg "e4" or "Rdf8" or "R1a3".
NEVER give a turn number.
NEVER explain your choice.
<|USER|>
1. e4 e5 2. Nf3 Nc6 3.
<|ASSISTANT|>
为了制作gpt-4o
,OpenAI 首先制作了一个基础模型。据我所知,该模型没有名称,所以我们将其称为gpt-4-base
。然后它进行指令调整并将指令调整后的模型粘贴在聊天界面后面,为我们提供gpt-4o
。 (它还做了一些其他的事情,比如蒸馏,但没关系。)
我已经了解了所有这些背景知识,因为它让我们能够提出一个核心问题: gpt-4-base
在国际象棋方面有多好? gpt-3.5-turbo-instruct
也同样好吗?如果是的话,那么为什么gpt-4o
更糟糕?是因为指令调整的原因吗?或者仅仅是因为聊天模板的原因, <|USER|>
和<|ASSISTANT|>
标记以 PGN 符号书写的国际象棋游戏中不会发生的方式浮动?
我不确定,因为 OpenAI 不打算共享gpt-4-base
,也不允许在完成模式下查询gpt-4o
。但也许我们可以帮助gpt-4o
记住它的进化历史。也许我们可以以某种方式提示gpt-4o
,使其更像完成模式一样做出响应。
我们应该反胃吗?
因此我的想法是:我们不只是要求走一步,而是要求模型重复整个游戏,然后给出一步,怎么样?
我把系统提示改成了这样:
You are a chess grandmaster.
You will be given a partially completed game.
After seeing it, you should repeat the ENTIRE GAME and then give ONE new move.
Use standard algebraic notation, eg "e4" or "Rdf8" or "R1a3".
ALWAYS repeat the entire representation of the game so far.
NEVER explain your choice.
给出像1. e4 e5 2.
这样的提示,我希望模型返回像1. e4 e5 2. Nf7
这样的输出。我检查以确保它在给出新的合法动作之前成功地重复了整个游戏。
这有效:
通过强制模型重复整个移动序列,您可以强制模型为自己创建一个上下文,在该上下文中它更有可能选择好的移动。
这使得gpt-4o-mini
和gpt-4o
更好。这似乎也是强有力的证据,表明如果我们能够以补全模式查询gpt-4-base
,那就太好了。
注意:当使用这种类型的提示时,我首先给模型十次尝试来重复整个序列,然后在最后给出合法的移动。如果这些尝试都没有成功,我会再尝试十次,至少在新的回合数之后产生合法的移动,即使它没有完美地重复整个游戏。如果还是不行,我就随机选择了一步。
我们可以更好地反胃吗?
微调就好了。反流是好的。他们在一起好吗?
为了测试这一点,我需要进行一次新的、独立的微调。我使用了完全相同的游戏和动作序列,但输出在给出新动作之前重复输入。例如:
- 系统提示:(同上)
- 用户提示:
1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 a6 6. Be2 e5 7. Nb3 Be7 8. Be3 Be6 9. f4 exf4 10. Bxf4 Nc6 11. Qd3 Ne5 12. Qg3 Nh5 13. Qe3
- 所需输出:
1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 a6 6. Be2 e5 7. Nb3 Be7 8. Be3 Be6 9. f4 exf4 10. Bxf4 Nc6 11. Qd3 Ne5 12. Qg3 Nh5 13. Qe3 Nxf4
这……也许有一点帮助?
例子又如何呢?它们会改善反流吗?
我只用了两个例子:
- 输入A:
1. d4
- 输出A:
1. d4 d5
- 输入 B:
1. e4 e5 2. Nf3 Nc6 3.
- 输出 B:
1. e4 e5 2. Nf3 Nc6 3. Nf3
和以前一样,鉴于它们包含的信息很少,它们产生了显着的影响。
我们应该结合示例和微调吗?
这里我们得到了与没有反流时相同的(奇怪的)结果。如果您进行微调,那么添加示例会有所帮助。但它仍然比没有微调的示例更糟糕。
我们站在哪里?
到目前为止我们学到了什么?
- 好:反流、示例、微调(无示例)
- 不清楚:元数据,重复系统提示,微调(带示例)
- BAD :提供合法动作列表
因此,如果我们使用反流和示例并关闭其他所有内容,效果有多好?它会像我们的老对手一样发挥作用吗?
不。它很不错,但仍然不如gpt-3.5-turbo-instruct
。
为了更直接地比较这些,我让gpt-4o + regurgitate + examples
与gpt-3.5-turbo-instruct
玩了 50 场游戏。在所有情况下, gpt-4o
都是白色的。
gpt-4o + regurgitate + examples 的结果 |
数数 |
---|---|
赢 | 9 |
领带 | 4 |
损失 | 37 |
根据此计算器,这与 -220 的 Elo 差异一致。但您需要考虑到gpt-4o
始终是白色的事实,据报道价值约为35 Elo 。由于gpt-3.5-turbo-instruct
测量值约为 1800 Elo,这表明gpt-4o
存在反流,示例命中值约为 1800 – 220 – 35/2 ≈ 1560 Elo,这仍然是“中级业余”领域。
以下是 10 场gpt-4o + regurgitate + examples
: 1 2 3 4 5 6 7 8 9 10
这里有 10 场gpt-4o + regurgitate + examples
与gpt-3.5-turbo-instruct
比赛的例子: 1 2 3 4 5 6 7 8 9 10
这是我目前的理论
这是我对正在发生的事情的最佳猜测:
第 1 部分: OpenAI 在数据集上训练其基本模型,其中的国际象棋游戏比开放模型使用的棋局更多/更好。
第 2 部分:最近的 OpenAI基础模型在国际象棋方面表现出色(在完成模式下,如果我们可以访问它们的话)。但我们实际访问的聊天模型却并非如此。
我认为第 1 部分是正确的,因为所有开放模型在国际象棋方面都很糟糕,无论它们是基础模型还是聊天模型。我怀疑这不是某种架构限制——如果你在数十亿的专家国际象棋游戏上微调llama-3.1-70b
,如果它无法击败gpt-3.5-turbo-instruct
(据传只有大约200 亿个参数)。
同时,在本文的 A.2 部分 (h/t Gwern) 中,一些 OpenAI 作者提到 GPT-4 是在 PGN 表示法的国际象棋游戏上进行训练的,经过过滤仅包括 Elo 至少 1800 的玩家。我还没有看到任何公开确认gpt-3.5-turbo-instruct
使用相同的数据,但这似乎是合理的。 gpt-3.5-turbo-instruct
以 PGN 表示法玩游戏,测得的 Elo 为 1800,这真的是巧合吗?
我找不到任何关于训练 Llama 等人时包含了多少国际象棋数据的详细信息。我确信许多游戏都是通过开放互联网进入的。但专门策划一个巨大的高质量游戏数据库可能只会带来更好的结果,而开放模型可能无法做到这一点。
(顺便说一句,我鼓励所有人工智能公司的人向我泄露秘密。如果您使用匿名反馈表,请写出足够的技术性内容,以便我可以验证您的专业知识。秘密将只用于善良,而不是邪恶。)
也可以想象,某些模型的棋艺较差是因为它们拥有太多的国际象棋数据。开放互联网可能有太多来自低技能玩家的游戏,如果你不过滤掉这些,那么模型就会正确预测玩家会做出低质量的动作。但我怀疑不会,因为聪明的模型会认识到,如果到目前为止的移动顺序是高技能的,那么玩家就不是一个十足的白痴,可能不会扔掉他们的皇后。但模型似乎并没有这样做。
我认为我的理论的第二部分是正确的,主要是因为我在这篇文章中所做的实验:如果你做一些奇怪的扭曲来“欺骗”OpenAI 聊天模型,使其表现得更像完成模型,那么它们会表现得更好。所以我怀疑底层的基础模型(我们无法触及)是好的。
现在,第 2 部分存在重大不确定性。如果聊天模式下的gpt-4o
比完成模式下的gpt-4-base
更差,那么为什么?是聊天界面还是指令调整,还是两者兼而有之?换句话说, gpt-4-base
在模拟聊天模式下会擅长下棋吗?如果我们可以在完成模式下查询gpt-4o
会好吗?
这很难说,因为我们无法做那些实验。
离别的思念
-
现在人工智能有多少是宫廷阴谋,这不是很棒吗?
-
很可能有一些方法可以让
gpt-4o
表现出更好的行为。事实上,我在这里仅仅触及了表面。 -
找到提示和示例以及微调等的最佳组合非常困难。这是一个非常大的空间,没有简单的抽象可以让你在空间中搜索,法学硕士是不可预测和脆弱的,而且这些实验很慢而且很贵。
-
我尝试使用
gpt-4
(而不是gpt-4o
)运行最终配方,但效果不佳。我怀疑原因是我发现的技巧组合是gpt-4o
特定的。也许gpt-4
需要不同的提示?或者更多例子?或者对微调的反应会更好?谁知道呢。 -
从很多方面来说,这感觉不像工程,而更像是对咒语的搜索。
聚苯乙烯
感谢Automator 的重要指导和无限的耐心。感谢 Daniel Gross 支付了所有电子费用。以下是之前关于法学硕士和国际象棋的一些很好的工作:
-
Adam Karvonen 的国际象棋 gpt eval repo仔细测试了
gpt-3.5-turbo-instruct
性能。 -
Adam Karvonen 的国际象棋 llm 可解释性存储库和论文“国际象棋语言模型中的涌现世界模型和潜在变量估计”除其他外,表明
gpt-3.5-turbo-instruct
似乎确实建立了某种内部表示董事会状态。 -
Matheiu Archer 对
gpt-3.5-turbo-instruct
、gpt-3.5-turbo
和gpt-4
的 ELO 估计。这也用不同的温度进行了实验。 -
超越:生成模型可以超越训练它们的专家(h/t WTFwhatthehell)
-
Nicholas Carlini 的《使用大型语言模型下棋》 。