以前,來自世界各地的高中生每年都會參加國際數學奧林匹克競賽(IMO),解決代數、幾何和數論等領域的六個極具挑戰性的問題。今年4月,一項全新的競賽——AI數學奧林匹克獎(AIMO)橫空出世,由模型來回答這些困難數學問題,目標是推動能夠進行複雜數學推理的AI模型的開發。
不知道大家之前有沒有看到一個新聞:問大語言模型 9.11 和 9.9 這兩個數字哪一個比較大,幾家主流大模型都答錯了.......
(👆🏻圖片來源)
那我們還拿奧數題目來考這些大模型,會不會有點難為它們了呢?
當然這些問題的難度是低於 IMO 的水平的,不過也不容易,大概有 IMO 的預選水平。
下面展示一個範例問題,相比 IMO 的問題來說簡單許多,很多高中生不需要是培訓選手也能解出來,但對許多 LLM 而言卻還是非常棘手:
讓 𝑘,𝑙 >0 為參數。拋物線 𝑦=𝑘𝑥^2−2𝑘𝑥+𝑙與線 𝑦=4相交於兩個點 𝐴和𝐵,2個點相距為6,那麽從𝐴、𝐵到原點的距離的平方和是多少?
答案是 52~
這次的比賽為期 2 個多月,為了避免訓練資料污染,主辦方團隊創建一份全新、未公開的高中程度數學競賽試題集,共有 110 道題目,其中 10 題會提供給參賽者當作訓練資料,另外 100 題會平均分配到 public test set 和 private test set 中,每一題的數學公式都用 latex 的語法表達。
下面再展示一些公開題目給大家看:
題目:Each of the three-digits numbers $111$ to $999$ is coloured blue or yellow in such a way that the sum of any two (not necessarily different) yellow numbers is equal to a blue number. What is the maximum possible number of yellow numbers there can be?(每個從 $111$ 到 $999$ 的三位數字都被塗成藍色或黃色,並且滿足以下條件:任意兩個黃色數字(不一定是不同的)之和等於一個藍色數字。請問最多可以有多少個黃色數字?)
答案:250
題目:Suppose that we roll four 6-sided fair dice with faces numbered 1 to~6. Let $a/b$ be the probability that the highest roll is a 5, where $a$ and $b$ are relatively prime positive integers. Find $a + b$.(假設我們擲四顆有六個面的公平骰子,每個面的數字是 1 到 6。設 $a/b$ 表示擲出的最大數字是 5 的概率,其中 $a$ 和 $b$ 是互質的正整數。求 $a + b$。)
答案:185
(如果有朋友只對解這些新題目有興趣的話,可以參考這個連結,裡面有熱心網友把每一題的解法都寫好囉!)
大家有注意到嗎?答案都是整數~
本次賽題的答案不需要寫推論、證明,只要回答一個「數字」就好,而且答案被嚴格限制在介於 0~999 的整數(包含0和99)。所以如果模型真的答不出來,在這範圍間隨機抽取1個整數,還是有0.1%的機率答對的呦xdd
因為答案形式很單純,這次的評估指標採用準確率 Accuracy 的方式計算。
同時本次賽題還是以 code competition 的形式進行,所以我們看不到 test data 的那些題目,每次提交都分配一個 P100 GPU 或 2xT4 GPU,最多 9 小時來解決 50 個問題。
好了!目前為止,你已經了解比賽的目標、資料的數量及其 input 與 output 的格式了,還有評分所使用的 metric 了。老問題又來了~
❓❓可以暫停一下,思考看看,如果你是參賽者,你會如何設計你的第一個解題方案呢?你的第一步是什麼❓❓
有別於前幾天我們剛討論過的「讓模型回答STEM問題」的議題,之前的題目比較像「檢索比賽」,只要提供模型和問題足夠相關的參考資料,模型基本上像「開書考」一樣,從參考資料裡面挑出答案就好了;但接下來這幾天要討論的 AIMO 可遠不止是這樣,模型除了要有和數學定理、公式相關的知識儲備,還需要根據題目的敘述,「推理」出正確答案!
沒錯,AIMO 這個賽題的重點,就在開發具有邏輯推理能力的「開源」模型。
在開始思考解法前,我們可以先看看主流的閉源大模型,也是當今最新進的大語言模型,他們在這10題公開競賽題解答能力為何呢?
我們以 GPT-4 和 Gemini Pro 為例,將 temperature 調到 0,每個題目只問模型一次:
Model | Accuracy |
---|---|
GPT-4 | 40% |
Gemini Pro | 0% |
即便是現在 SOTA 的大模型,都只有 40% 的準確率,Gemini Pro 甚至一題都沒答出來...我們該如何讓其他參數量更少的開源模型具有競賽選手水平的數理推演能力呢?
也許你第一個想法是:開課後加強班「特訓」我們的模型選手呀!
確實,因為現在的模型都是往通用模型、支持多輪對話的方向設計,數學競賽題回答不出來好像可以理解,畢竟就連我們遠離高中智商巔峰時期的普通人,沒經過訓練,能準確地回答出一題就很有成就感了xdd
所以如果往「訓練模型」的思路邁進的話,由於主辦方給的訓練資料太少只有10題,所以無法避免地,我們又要自己生成訓練數據集了。接下來就要集中火力在「擴增高品質的數據集」->「挑選合適的開源預訓練模型」->「選擇訓練模型的演算法和相關參數設定」。
但是除了擴增資料、訓練模型之外,從 CoT(Chain-of-Thoughts)這篇論文開始,人們發現比起直接給定問題叫模型「輸出答案就好」,透過適當地設計 prompt,例如在 prompt 前面加上“Think step by step.",逼迫模型把每一步驟都詳細地說出來,就好像能讓模型慢慢思考一樣,透過這種方式可以大幅度地激發模型推理能力,進而提升模型的準確性。
(👆圖片來源)
後續還有很多相關研究,例如 Tree-of-Thoughts, Self-Consistency 等等。
所以也許另外一個思路是我們挑選能看得懂 latex、預訓練資料有大量數學相關material的pretrained model,例如:deepseek-math
,然後我們發展一個能有效激發模型潛在推理能力的「思考鏈路」,也許就可以在不訓練模型參數的情況下取得好成績。
我們來看下面一個有趣的實驗。
SymPy
是一個用於符號計算的 Python 庫,專為解決數學符號問題而設計。它能處理數學中的代數運算、方程求解、微積分、矩陣運算等。SymPy 提供了一個強大的數學符號處理工具,使得用戶可以像使用計算器一樣進行數學運算,不需要進行數值近似計算。
下面是訓練資料中的第一題:
Let $k, l > 0$ be parameters. The parabola $y = kx^2 - 2kx + l$ intersects the line $y = 4$ at two points $A$ and $B$. These points are distance 6 apart. What is the sum of the squares of the distances from $A$ and $B$ to the origin?
解方程式的問題,我們其實可以用 SymPy 寫 code 來解:
from sympy import *
# Define symbols
x, y, k, l = symbols('x y k l', real=True)
# Define the parabola and line equations
parabola = k*x**2 - 2*k*x + l
line = 4
# Solve for the intersection points
intersection_points = solve(Eq(parabola, line), x)
# Extract the x-coordinates of the intersection points
x1, x2 = intersection_points
# Calculate the y-coordinate (it's the same for both points)
y1 = line
# Calculate the distance between the two points
distance = sqrt((x2 - x1)**2 + (y1 - y1)**2)
# Set up the equation for the distance
distance_eq = Eq(distance, 6)
# Solve the equation for k
k_sol = solve(distance_eq, k)[0]
# Substitute the value of k into the x-coordinates
x1_sol = x1.subs(k, k_sol)
x2_sol = x2.subs(k, k_sol)
# Calculate the distances from the points to the origin
dist1 = sqrt(x1_sol**2 + y1**2)
dist2 = sqrt(x2_sol**2 + y1**2)
# Calculate the sum of the squares of the distances
sum_of_squares = simplify(dist1**2 + dist2**2)
print(sum_of_squares)
52
SymPy 計算結果為 52 和正解一樣。
我們再來看第四題:
What is the minimum value of $5x^2+5y^2-8xy$ when $x$ and $y$ range over all real numbers such that $|x-2y| + |y-2x| = 40$?
一樣可以用 SymPy 來表示:
from sympy import *
# Define symbols
x, y = symbols('x y', real=True)
# Define the objective function
f = 5*x**2 + 5*y**2 - 8*x*y
# Use the constraint to eliminate one variable
eq = Eq(abs(x - 2*y) + abs(y - 2*x), 40)
y_sol = solve(eq, y)
# Substitute the solution into the objective function
f_x = f.subs(y, y_sol[0])
# Find the critical points
df_dx = diff(f_x, x)
critical_points = solve(df_dx)
# Evaluate the objective function at the critical points and the boundary points
min_val = f_x.subs(x, critical_points[0])
for i in range(1, len(critical_points)):
min_val = min(min_val, f_x.subs(x, critical_points[i]))
# Print the minimum value
print(min_val)
# 800
得出結果 800 和正確答案一樣。
(以上代碼參考這裡)
透過分析這 10 題公開的訓練題目,可以發現裡面有4題是確定可以用 SymPy 表示並得到解答的,有 3 題可能可以,剩下的沒辦法。
那這是不是代表,如果我們使用的模型具有很強的"coding"能力,可以把題目轉化成類似 SymPy 的語法的結構,我們直接執行轉化出來的程式碼,就可以得到大部分題目的解答了!
真是激動人心的時刻🎉!數理推理能力聽起來很抽象,但現在我們好像能把「解數學問題」和「將問題用代碼表達」掛鉤在一起了,因此接下來我們就可以將問題轉化為「如何提升模型的 coding 能力」。
回到我們開頭提到的 9.11 > 9.9 之亂,AI 李白老師對於「為什麼大型語言模型(LLM)有時會在比較 9.11 和 9.9 這樣簡單的數字大小時出錯?」有一個淺顯易懂的解釋:
LLM 如 GPT-3、ChatGPT 等基於 Transformer 架構,從大量文本中學習預測下一個單詞或符號的機率。它們擅長生成流暢、連貫的文本,而非進行精確數學運算。
比較數字時,LLM 執行的是「接龍」任務,根據上下文生成最可能的結果。例如,當問 "9.11 or 9.9 is greater?",模型可能回答 9.11,因為它可能見過 "11 or 9 is greater?" 後接 11。
對於罕見數的比較,模型更可能依賴其對數字模式的學習,而非實際數值比較,導致錯誤。
(👆🏻出處請參考這裡)
因此當我們要進行精確數字計算時,與其讓 LLM 直接輸出一個答案,不如串聯LLM 和其他計算工具和演算法(例如:SymPy),能得到更值得信賴的回答呦~
明天我們會繼續從一些 baseline 的嘗試,逐步探索出金牌解法的脈絡!
我們明天見~
謝謝讀到最後的你,希望你會覺得有趣!
如果喜歡這系列,別忘了按下訂閱,才不會錯過最新更新,也可以按讚⭐️給我鼓勵唷!
如果有任何回饋和建議,歡迎在留言區和我說✨✨