这篇文章是对OpenAI公开文章的翻译和解读,原文地址 https://openai.com/index/learning-to-reason-with-llms/
核心思想:LLMs + RL*CoT -> 通过慢思考实现逻辑推理:拆分目标为小步骤、每个步骤反思是否有问题、有则尝试新路径
OpenAI o1 在竞争性编程问题(Codeforces)中排名第 89 位,在美国数学奥林匹克 (AIME) 预选赛中跻身美国前 500 名学生之列,并在物理、生物和化学问题 (GPQA) 基准测试中超越人类博士级准确度。
大规模强化学习算法教会模型 如何在高度数据高效的训练过程中利用其思路 进行有效思考:随着强化学习的增加(训练时间计算)和思考时间的增加(测试时间计算),o1 的性能持续提高。
o1 性能随着训练时间和测试时间计算而平稳提升
1. 评估结果
为了突出推理能力相对于 GPT-4o 的提升,在一系列不同的人工考试和 ML 基准上测试了模型:在绝大多数推理能力较强的任务中,o1 的表现明显优于 GPT-4o。
o1 在广泛的基准测试中都比 4o 有所改进,包括 54/57 个 MMLU 子类别
在许多推理能力较强的基准测试中,o1 可与人类专家的表现相媲美,以至于这些基准测试不再能够有效区分模型。AIME 是一项旨在挑战美国最聪明的高中数学学生的考试。在 2024 年的 AIME 考试中,GPT-4o 平均仅解决了 12% (1.8/15) 的问题。o1 在每个问题单个样本中平均为 74% (11.1/15),在 64 个样本中达成共识为 83% (12.5/15),在使用学习到的评分函数对 1000 个样本重新排名时为 93% (13.9/15)。13.9 的分数使其跻身全国前 500 名学生之列,并超过了美国数学奥林匹克的分数线。
上图的成绩可以看到,O1是真的巨大提示。有些同学可能好奇为啥是理科测试,可能是刷题了,其实数学物理等理科,其实是建立在很多定理公理上的逻辑大楼,关于什么是智能,可以见我的上一篇文章 。
2. 思维连 (RL CoT)
与人类在回答难题之前会长时间思考的方式类似,o1 在尝试解决问题时会使用思路链。通过强化学习,o1 学会磨练其思路链并改进其使用的策略。它学会识别和纠正错误。它学会将棘手的步骤分解为更简单的步骤。它学会在当前方法不起作用时尝试不同的方法。这个过程极大地提高了模型的推理能力。为了说明这一飞跃,下面展示了 o1-preview 中几个难题的思路链。
这个部分有点难翻译,是一系列对比的例子,只抽取几个典型,不然内容太多了
例子1 编程
用户:编写一个 Bash 脚本,该脚本接受一个格式为 '[1,2],[3,4],[5,6]' 的矩阵字符串,并以相同的格式打印其转置矩阵。
GPT-4o: 这里是一个 Bash 脚本,它接受一个格式为 "[1,2],[3,4],[5,6]" 的矩阵字符串,并打印出其转置矩阵,格式保持一致:
#!/bin/bash
# Input matrix as a string
matrix_string=$1
# Remove square brackets
matrix_string=$(echo "$matrix_string" | tr -d '[]')
# Convert the string into an array of rows
IFS=',' read -r -a rows <<< "$matrix_string"
# Get the number of columns (length of the first row)
num_columns=$(echo "${rows[0]}" | awk -F',' '{print NF}')
# Initialize an array for the transpose
declare -a transpose
# Loop over each column
for ((i=0; i<num_columns; i++)); do
column=()
# Loop over each row and extract the i-th element
for ((j=0; j<${#rows[@]}; j+=num_columns)); do
element=${rows[$((j+i))]}
column+=("$element")
done
# Join the elements of the column with commas
transpose+=("[$(IFS=','; echo "${column[*]}")]")
done
# Print the transpose as a matrix
echo "$(IFS=','; echo "${transpose[*]}")"
GPT- O1:
[潜意识-思维链]
用户要求编写一个 Bash 脚本,该脚本能够接受一个表示矩阵的字符串(例如 '[1,2],[3,4],[5,6]'),并输出其转置矩阵,格式与输入相同。
首先,我们需要理解输入和输出格式。
输入:'[1,2],[3,4],[5,6]',对应的矩阵是:
1 2
3 4
5 6
所以,输入是由用逗号分隔的括号包围的行组成。
这个矩阵的转置是:
1 3 5
2 4 6
所以请求的输出是 '[1,3,5],[2,4,6]'。
总体任务:
编写一个 Bash 脚本,该脚本接受一个参数(表示矩阵的字符串),并以相同格式输出其转置矩阵。
好的,让我们考虑一下如何在 Bash 中解析输入字符串,构建矩阵(可能是数组),转置它,然后以预期的格式输出转置后的矩阵。
限制条件:
由于是 Bash,我们需要小心解析字符串。
脚本应该接受输入字符串作为参数。
方法:
解析输入字符串以提取矩阵元素。
将矩阵构建为数组的数组。
转置矩阵。
以相同格式输出转置后的矩阵。
实现步骤:
捕获输入字符串作为参数。
移除任何空格(如果有)。
解析输入字符串,将数字提取到数组中。
由于输入格式为 '[1,2],[3,4],[5,6]',我们可以:
如有必要,移除外部括号。
按 '],' 分割字符串以获取每一行。
对于每一行,移除 '[' 和 ']',然后按 ',' 分割以获取元素。
在 Bash 中构建二维数组(包含数组的数组)。
由于 Bash 数组是一维的,我们需要模拟二维数组。
转置矩阵。
转置时,我们需要交换行和列。
以所需格式输出转置后的矩阵。
重建输出字符串,格式为 '[1,3,5],[2,4,6]'。
现在,开始逐步编写代码。
潜在问题:
Bash 不原生支持多维数组,因此我们需要进行模拟。
需要处理可能包含多个数字的数字。
让我尝试逐步编写 Bash 脚本。
首先,编写框架:
<这里就是bash脚本原始的>
现在让我们用示例输入 '[1,2],[3,4],[5,6]' 测试这个脚本。
让我尝试模拟一下发生的情况。
我将把这个写成一个回答。
回答:
#!/bin/bash
input="$1"
# Remove any spaces
input="${input// /}"
# Split input into rows
IFS=']' read -ra rows <<< "$input"
# Initialize an array to hold the matrix
declare -a matrix
num_rows=0
for row in "${rows[@]}"; do
# Remove leading commas and brackets
row="${row#','}"
row="${row#'['}"
row="${row//]/}"
# Skip empty rows
if [ -z "$row" ]; then
continue
fi
# Split row into elements
IFS=',' read -ra elements <<< "$row"
# Store elements in matrix
matrix[$num_rows]="${elements[*]}"
((num_rows++))
done
# Number of columns (assuming at least one row)
IFS=' ' read -ra first_row_elements <<< "${matrix[0]}"
num_cols=${#first_row_elements[@]}
# Prepare an array to hold the transposed matrix
declare -a transposed
# For each column c
for (( c=0; c<$num_cols; c++ )); do
col_elements=()
# For each row r
for (( r=0; r<$num_rows; r++ )); do
# Get elements of row r
IFS=' ' read -ra row_elements <<< "${matrix[$r]}"
col_elements+=("${row_elements[$c]}")
done
# Store the column elements as a row in transposed matrix
transposed[$c]="${col_elements[*]}"
done
# Build output string
output=""
for (( i=0; i<${#transposed[@]}; i++ )); do
IFS=' ' read -ra elements <<< "${transposed[$i]}"
# Build a string '[elem1,elem2,...]'
row_string="[${elements[0]}"
for (( j=1; j<${#elements[@]}; j++ )); do
row_string="$row_string,${elements[$j]}"
done
row_string="$row_string]"
if [ -z "$output" ]; then
output="$row_string"
else
output="$output,$row_string"
fi
done
echo "$output"
保存到一个文件, 例如 transpose.sh, 让它可执行 chmod +x transpose.sh, 运行:
./transpose.sh '[1,2],[3,4],[5,6]'
将会输出:
[1,3,5],[2,4,6]
例子2 解密 (建议看原文,20000字的思维链让我佩服)
用户:oyfjdnisdr rtqwainr acxz mynzbhhx -> Think step by step 使用这个例子解码字符串 oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz
ChatGPT-4o:
让我们根据示例一步步分解:
- 给出的例子:
- 输入:oyfjdnisdr rtqwainr acxz mynzbhhx
- 输出:Think step by step
通过观察这些单词:
- 模式可能涉及选择特定字母或对字母进行转换。
- 现在,让我们解码新的短语:
- 输入:oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz
逐步解码过程:
识别可能的单词分隔。
第一个短语可能遵循与示例相同的结构。输入文本似乎可以根据自然的分隔或模式被分组。
可能的分隔可以是:
oyekaijzdf
aaptcg
suaokybhai
ouow
aqht
mynznvaatzacdfoulxxz
然而,要进行有意义的解码,我需要更多关于可能涉及的转换或字母位移的上下文。
你能提供任何有关此密码的解码规则或使用的转换方法吗?
ChatGPT-o1:
[思维链]
首先,这里发生了什么?
我们得到的是:
首先,一个例子:
“oyfjdnisdr rtqwainr acxz mynzbhhx -> Think step by step”
我们可以看到,"oyfjdnisdr rtqwainr acxz mynzbhhx" 被转换成了 "Think step by step"。
我们的任务是:使用上述示例来解码:"oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz"
所以第一步是弄清楚 "oyfjdnisdr rtqwainr acxz mynzbhhx" 是如何解码为 "Think step by step" 的。
观察1:短语 "Think step by step" 一共是 18 个字母(不包括空格)。让我们数一数字母的数量。
类似地,数一数 "oyfjdnisdr rtqwainr acxz mynzbhhx" 中的字母。
原始密文:
oyfjdnisdr rtqwainr acxz mynzbhhx
明文:
Think step by step
首先,分解这些字母:
密文字母:o y f j d n i s d r r t q w a i n r a c x z m y n z b h h x
省略余下的近20000文字 --- 推测思维链的存储有长度限制
回答 :
要使用给定的示例解码密文,我们将使用在示例中识别出的模式。
密文示例:
密文:
oyfjdnisdr rtqwainr acxz mynzbhhx解码为:
Think step by step解码方法:
- 将密文中的字母配对。
- 将每个字母转换为其在字母表中的数值位置(A=1,B=2,…,Z=26)。
- 将每对字母的数值相加。
- 计算该和的平均值(除以 2)。
- 将平均值转换回字母(1=A,2=B,…,26=Z)。
- 对给定的密文应用此方法。
给定密文:
oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz将密文拆分为字母对:
- 第一个单词:“oyekaijzdf”
字母对:oy, ek, ai, jz, df
解码字母:
- oy → (15+25)/2 = 20 → T
- ek → (5+11)/2 = 8 → H
- ai → (1+9)/2 = 5 → E
- jz → (10+26)/2 = 18 → R
- df → (4+6)/2 = 5 → E
解码单词:THERE
- 第二个单词:“aaptcg”
字母对:aa, pt, cg
解码字母:
- aa → (1+1)/2 = 1 → A
- pt → (16+20)/2 = 18 → R
- cg → (3+7)/2 = 5 → E
解码单词:ARE
- 第三个单词:“suaokybhai”
字母对:su, ao, ky, bh, ai
解码字母:
- su → (19+21)/2 = 20 → T
- ao → (1+15)/2 = 8 → H
- ky → (11+25)/2 = 18 → R
- bh → (2+8)/2 = 5 → E
- ai → (1+9)/2 = 5 → E
解码单词:THREE
- 第四个单词:“ouow”
字母对:ou, ow
解码字母:
- ou → (15+21)/2 = 18 → R
- ow → (15+23)/2 = 19 → S
解码字母:R’S
- 第五个单词:“aqht”
字母对:aq, ht
解码字母:
- aq → (1+17)/2 = 9 → I
- ht → (8+20)/2 = 14 → N
解码单词:IN
- 第六个单词:“mynznvaatzacdfoulxxz”
字母对:my, nz, nv, aa, tz, ac, df, ou, lx, xz
解码字母:
- my → (13+25)/2 = 19 → S
- nz → (14+26)/2 = 20 → T
- nv → (14+22)/2 = 18 → R
- aa → (1+1)/2 = 1 → A
- tz → (20+26)/2 = 23 → W
- ac → (1+3)/2 = 2 → B
- df → (4+6)/2 = 5 → E
- ou → (15+21)/2 = 18 → R
- lx → (12+24)/2 = 18 → R
- xz → (24+26)/2 = 25 → Y
解码单词:STRAWBERRY最终解码信息:
THERE ARE THREE R'S IN STRAWBERRY
答案:
THERE ARE THREE R'S IN STRAWBERRY
3. 编码
OpenAI训练了一个模型,该模型在 2024 年国际信息学奥林匹克 (IOI) 比赛中获得 213 分,排名 49 %。方法是从 o1 开始初始化,然后进行训练以进一步提高编程技能。该模型在与人类参赛者相同的条件下参加了 2024 年 IOI 比赛。它有 10 个小时来解决六个具有挑战性的算法问题,每个问题允许提交 50 份答案。
对于每个问题,OpenAI的系统都会抽取许多候选提交,并根据测试时间选择策略提交其中的 50 个。提交是根据 IOI 公共测试用例、模型生成的测试用例和学习的评分函数的表现来选择的。如果随机提交,平均只能得到 156 分,这表明在比赛限制下,这种策略值近 60 分。
OpenAI发现,在放宽提交限制后,模型性能显著提高。当允许每个问题提交 10,000 次时,即使没有任何测试时间选择策略,该模型也能获得 362.14 分,高于金牌门槛。
最后,OpenAI模拟了 Codeforces 主办的竞争性编程竞赛,以展示该模型的编码技能。OpenAI的评估与竞赛规则非常接近,允许提交 10 份作品。GPT-4o 的 Elo 评级为 808 分 ,位于人类竞争对手的第 11 个百分位。该模型远远超过了 GPT-4o 和 o1——它的 Elo 评级为 1807 分,表现优于 93% 的竞争对手。
编程竞赛进一步微调,o1在2024年国际信息学奥林匹克竞赛排名在第49个百分点
4. 人类偏好评估
除了考试和学术基准之外,我们还在广泛领域的具有挑战性的开放式提示上评估了人类对 o1-preview 和 GPT-4o 的偏好。在这次评估中,人类训练师看到了对 o1-preview 和 GPT-4o 提示的匿名回答,并投票选出他们更喜欢的回答。在数据分析、编码和数学等推理能力较强的类别中,o1-preview 的受欢迎程度远远高于 gpt-4o。然而,o1-preview 在某些自然语言任务上并不受欢迎,这表明它并不适合所有用例。
在能够从更好的推理中受益的领域,人们更喜欢 o1-preview
5. 隐藏的思维链 - 理解潜意识
OpenAI认为隐藏的思路链为监控模型提供了独特的机会。假设它是忠实且清晰的,隐藏的思维链使我们能读懂大模型的“潜意识”并了解其思维过程。谁也也不想让用户直接看到不一致的思维链。
因此,在权衡了用户体验、竞争优势以及是否要继续进行思路链监控等多种因素后,OpenAI决定不向用户展示原始思路链。OpenAI承认这一决定有弊端,但会努力通过教导模型在答案中重现思维链中的任何有用想法来部分弥补这一缺点。对于 o1 模型系列,OpenAI展示了模型生成的思路链摘要。
6. 结论
o1 显著提升了 AI 推理的最新水平。OpenAI计划在不断迭代的过程中发布此模型的改进版本,期望这些新的推理能力将提高我们将模型与人类价值观和原则相结合的能力。OpenAI相信 o1 及其后续产品将在科学、编码、数学和相关领域为 AI 解锁许多新用例。很高兴用户和 API 开发人员能够发现它如何改善他们的日常工作。