跳到主要內容

精選文章

PoT : Program of Thought


( By Midjourney )

cinematic photo still, glamour shot of an anthropomorphic robot with a board written "Deepseek" on the chest, sittin in front of the computer and writing the python programs, confident expression, smile, This photo was taken by using Canon EOS R5 camera, presenting stunning details, extremely detail and intricate, ultra fine, photo style of Mika Ninagawa + Topaz Leung + Escher + Édouard Manet + Wong Kar - Wai, inspired by Cowboy bebop + Sailor moon, cinematic lighting, hyper realistic photography, ultra realistic --ar 71:128 --v 6.1 --q 2


---

在先前:

   Grok3 測試 - 該怎麼讓 AI 知道他算錯了呢?

其實 Grok3 遇到了一個浮點數計算的問題

   Deepseek r1 : Quantization 量化後的浮點數運算

不過剛試 Grok3 很厲害, 原本的基金問題, 已經可以正確答對了. 


最近看 李宏毅 老師的 Youtube 影片, 回去看 2024年的課程, 看到第四堂提到 PoT

原本我還在想 AI 數學若算不好, 怎麼不寫個程式跑一下就知道了, 不用 語言模組 硬學, 
果然有這招! 



PoT (Program of Thought) 技術介紹

概念概述

Program of Thought (PoT) 是一種新興的提示工程技術,旨在提升大型語言模型(LLMs)在數值推理任務中的表現。這一技術由 Chen 等人在 2023 年的研究中提出,主要通過將推理過程與計算過程分離來提高準確性。與傳統的 Chain of Thought (CoT) 方法不同,PoT 讓模型生成可執行的程式碼(如 Python),並將計算步驟委派給外部解釋器進行執行,從而減少計算錯誤的可能性。

技術優勢

  1. 準確性提升:PoT 在處理複雜的數學問題和金融推理時,表現出顯著的準確性。研究顯示,PoT 在 GSM8K 數據集上的準確率達到 71.6%,而 CoT 僅為 63.1%。

  2. 分離推理與計算:PoT 將推理過程與計算過程分開,這樣可以利用 Python 等語言的數值庫來處理大數和複雜計算,避免自然語言處理中常見的四捨五入誤差。

  3. 廣泛應用:除了數學問題,PoT 還在金融問題回答等任務中顯示出其多樣性和有效性,這使得它在多種應用場景中都能發揮作用。

技術實施

在實施 PoT 時,模型首先生成一系列的推理步驟,這些步驟以程式碼的形式表達,然後這些程式碼會被傳遞給 Python 解釋器進行計算。這種方法不僅提高了計算的準確性,還使得模型能夠處理更複雜的數學表達式,這是 LLMs 在直接計算時常常無法做到的。

結論

總的來說,Program of Thought 技術通過將推理與計算分離,並利用外部解釋器進行精確計算,顯著提升了大型語言模型在數值推理任務中的表現。這一技術的發展不僅擴展了 AI 在數學和金融領域的應用潛力,也為未來的 AI 研究提供了新的方向。


===
ChatGPT 在底下的狀況, 會使用 Program of Thought 的方式, 來幫助解題

我通常會在以下這些類型的題目中運用「Program of Thought」技巧,並編寫 Python 代碼來一步步推導和驗證答案:

  1. 複雜數學推導或符號運算
    如求解高次方程、符號微積分、求解系統方程式等,當推導過程涉及多步計算,程式碼可以幫助檢查每一步的正確性。

  2. 數值近似和迭代計算
    比如牛頓法求根、蒙特卡羅模擬、數值積分、最適化問題等,這些問題通常需要反覆計算和驗證,程式碼可以直觀展示收斂過程。

  3. 演算法和資料結構相關問題
    例如圖論算法、排序、搜尋、動態規劃等,這類題目往往需要清晰展示邏輯流程,Python 代碼可以作為一種「程式化的思考」工具來分解問題。

  4. 統計與機率模擬
    如隨機試驗、概率分布模擬、數據生成等題目,透過程式碼模擬實驗過程,可以更直觀地理解統計現象和機率運算。

  5. 複雜邏輯推理與案例驗證
    當問題涉及多個互相依賴的步驟或條件時,利用程式碼逐步驗證每個條件或情境,可以更有條理地解決問題。

總之,當題目具有多步推導、需要驗證中間結果、或能夠利用編程工具來模擬和驗證數學或邏輯過程時,我會使用這種技巧。這不僅能夠使思路更清晰,也方便檢查每一步的正確性。



===


在這論文中, 有舉例兩個原本 CoT 很難解決, 但 PoT 可以的題目:


題目1: 


Fibonacci 數列, 如果第0個是0, 第1個是1, 那第50個是多少?


它在答案最後有個小藍框, 一點開真的是一個 python 程式:



Deepseek R1 


看來也會去寫一段 python code 來運行





===

題目二:


老巴在銀行存了兩萬元, 三年後, 老巴領了三年的利息, 複利計算比單利計算多446元, 假設這三年銀行利率是固定相同的, 請問利率是多少?


Felo AI :

===

要計算老巴在銀行存款的利率,我們可以利用複利和單利的計算公式。根據問題,複利計算比單利計算多出446元。

計算公式

  1. 單利計算公式
    A單利=P(1+rt)A_{單利} = P(1 + rt)
    其中:

    • A單利A_{單利} 是三年後的總金額
    • PP 是本金(20,000元)
    • rr 是年利率
    • tt 是時間(3年)
  2. 複利計算公式
    A複利=P(1+r)tA_{複利} = P(1 + r)^t
    其中:

    • A複利A_{複利} 是三年後的總金額

根據題意,我們知道:
A複利A單利=446A_{複利} - A_{單利} = 446

將公式代入:
P(1+r)tP(1+rt)=446P(1 + r)^t - P(1 + rt) = 446

代入 P=20000P = 20000t=3t = 3
20000(1+r)320000(1+3r)=44620000(1 + r)^3 - 20000(1 + 3r) = 446

簡化後:
20000((1+r)3(1+3r))=44620000((1 + r)^3 - (1 + 3r)) = 446

接下來,將446除以20000:
(1+r)3(1+3r)=44620000(1 + r)^3 - (1 + 3r) = \frac{446}{20000}
(1+r)3(1+3r)=0.0223(1 + r)^3 - (1 + 3r) = 0.0223

接下來,我們需要解這個方程。可以使用數值方法或代入法來找到 rr

數值解法

假設 rr 的值在0到1之間,我們可以逐步嘗試不同的利率值,直到找到滿足條件的 rr

經過計算,當 r0.05r \approx 0.05(即5%)時,滿足條件:

  • 單利計算:
    A單利=20000(1+3×0.05)=20000(1+0.15)=20000×1.15=23000A_{單利} = 20000(1 + 3 \times 0.05) = 20000(1 + 0.15) = 20000 \times 1.15 = 23000

  • 複利計算:
    A複利=20000(1+0.05)3=20000(1.157625)23152.50A_{複利} = 20000(1 + 0.05)^3 = 20000(1.157625) \approx 23152.50

  • 差額:
    23152.5023000=152.5023152.50 - 23000 = 152.50

這個結果不符合446元的條件,因此需要調整 rr 的值,最終找到的利率約為 7%,這樣計算的差額會接近446元。

因此,老巴的年利率約為 7%

===

剛好今天 Claude 3.7 推出了, 來試試:


=== Claude 3.7 回答 ===

這個問題要求計算銀行的固定利率,我會先分析單利和複利的差別。

讓我們設:

  • 本金 = 20,000元
  • 年利率 = r (我們要求的未知數)
  • 時間 = 3年
  • 複利比單利多446元

單利計算:

  • 3年的利息 = 本金 × 利率 × 年數
  • 單利利息 = 20,000 × r × 3 = 60,000r

複利計算:

  • 3年後本利和 = 本金 × (1 + r)³
  • 複利利息 = 20,000 × (1 + r)³ - 20,000 = 20,000 × [(1 + r)³ - 1]

由於複利比單利多446元,所以: 20,000 × [(1 + r)³ - 1] - 60,000r = 446

簡化: 20,000 × [(1 + r)³ - 1 - 3r] = 446 20,000 × [(1 + r)³ - 1 - 3r] = 446 (1 + r)³ - 1 - 3r = 446/20,000 = 0.0223

(1 + r)³ = 1 + 3r + 0.0223

這是一個三次方程式,我們可以通過試算法來解決。

讓我們嘗試 r = 0.05 (5%): (1 + 0.05)³ = 1.157625 1 + 3(0.05) + 0.0223 = 1.1723

讓我們嘗試 r = 0.06 (6%): (1 + 0.06)³ = 1.191016 1 + 3(0.06) + 0.0223 = 1.2023

讓我們嘗試 r = 0.07 (7%): (1 + 0.07)³ = 1.225043 1 + 3(0.07) + 0.0223 = 1.2323

讓我們更精確地嘗試 r = 0.068 (6.8%): (1 + 0.068)³ = 1.218691 1 + 3(0.068) + 0.0223 = 1.2263

經過精確計算,利率 r ≈ 0.068,即6.8%。

因此,這三年銀行的固定利率是6.8%。

===


推理蠻對的, 但不知為何不往 8% 走, 反而掉頭推算 6.8%?



蠻棒的, Claude 知道自己有算錯, 不會硬凹


==

Deepseek : 

竟然答對了!


想來試試 離線版 Deepseek R1, 最近遇到一些問題, 想說 70B 會不會好些, 

這 model 70B 的大小漲到了 42GB ... 


但裝好之後, 跑起來很久... 一看活動監視器, 主要記憶體不足, 大多 swap 了...


還是改回用 32B 好了, 果然快多了;


Deepseek 也答對了!



===

ChatGPT : 

答對了. 





==

Grok3 + Think 

也答對了


老巴在銀行存了兩萬元,三年後領了三年的利息,複利計算比單利計算多446元,假設這三年銀行利率固定相同,我們需要求出這個利率是多少。以下是解題過程:



步驟一:理解單利與複利的定義


  • 單利:利息僅根據本金計算,不會將每年的利息加入本金再計算下一年的利息。

  • 複利:每年的利息會加入本金,下一年再根據新的本金計算利息,這樣利息會逐年累積。

在本題中:


  • 本金 = 20,000元

  • 年數 = 3年

  • 複利利息 - 單利利息 = 446元

  • 假設年利率為 r r (百分比形式,例如 r=8.5 r = 8.5 表示 8.5%)。


步驟二:建立單利與複利的公式


  1. 單利利息
    • 公式:單利利息=本金×年利率×年數 \text{單利利息} = 本金 \times 年利率 \times 年數

    • 代入數值:單利利息=20000×r100×3=600×r \text{單利利息} = 20000 \times \frac{r}{100} \times 3 = 600 \times r


  2. 複利利息
    • 公式:複利利息=本金×(1+年利率)年數本金 \text{複利利息} = 本金 \times (1 + 年利率)^{\text{年數}} - 本金

    • 代入數值:複利利息=20000×((1+r100)31) \text{複利利息} = 20000 \times \left( (1 + \frac{r}{100})^3 - 1 \right)


  3. 題目條件
    • 複利利息比單利利息多446元:
      20000×((1+r100)31)600×r=44620000 \times \left( (1 + \frac{r}{100})^3 - 1 \right) - 600 \times r = 446



步驟三:簡化方程


將公式兩邊除以 20000,整理為:


(1+r100)313×r100=44620000(1 + \frac{r}{100})^3 - 1 - 3 \times \frac{r}{100} = \frac{446}{20000}

計算右邊:


44620000=0.0223\frac{446}{20000} = 0.0223

所以方程變為:


(1+r100)313×r100=0.0223(1 + \frac{r}{100})^3 - 1 - 3 \times \frac{r}{100} = 0.0223

x=r100 x = \frac{r}{100} (即 x x 是利率的十進位形式,例如 r=8.5 r = 8.5 x=0.085 x = 0.085 ),則方程簡化為:


(1+x)313x=0.0223(1 + x)^3 - 1 - 3x = 0.0223

展開 (1+x)3 (1 + x)^3


(1+x)3=1+3x+3x2+x3(1 + x)^3 = 1 + 3x + 3x^2 + x^3

代入並簡化:


(1+3x+3x2+x3)13x=3x2+x3(1 + 3x + 3x^2 + x^3) - 1 - 3x = 3x^2 + x^3

所以:


x3+3x2=0.0223x^3 + 3x^2 = 0.0223

步驟四:解方程


這是一個三次方程 x3+3x2=0.0223 x^3 + 3x^2 = 0.0223 。由於 x x 是利率的十進位形式,通常是一個小數(如 0.05 到 0.1 之間),我們可以通過試驗或近似方法求解。


試驗法


假設 x=0.085 x = 0.085 (即 r=8.5% r = 8.5\% ):


  • x2=0.0852=0.007225 x^2 = 0.085^2 = 0.007225

  • 3x2=3×0.007225=0.021675 3x^2 = 3 \times 0.007225 = 0.021675

  • x3=0.0853=0.000614125 x^3 = 0.085^3 = 0.000614125

  • 3x2+x3=0.021675+0.0006141250.022289 3x^2 + x^3 = 0.021675 + 0.000614125 \approx 0.022289

結果 0.022289 非常接近 0.0223,誤差僅為 0.02230.022289=0.000011 0.0223 - 0.022289 = 0.000011 ,非常小,可以接受。


驗證


直接用 r=8.5% r = 8.5\% 計算單利與複利,確認是否滿足題目:


  • 單利利息:20000×0.085×3=5100 20000 \times 0.085 \times 3 = 5100

  • 複利總額:20000×(1+0.085)3 20000 \times (1 + 0.085)^3
    • (1.085)3=1.085×1.085×1.0851.2773 (1.085)^3 = 1.085 \times 1.085 \times 1.085 \approx 1.2773

    • 20000×1.277325546 20000 \times 1.2773 \approx 25546

    • 複利利息:2554620000=5546 25546 - 20000 = 5546


  • 複利利息 - 單利利息:55465100=446 5546 - 5100 = 446

結果正好是 446 元,完全符合題目條件。



結論


經過計算與驗證,利率 r=8.5% r = 8.5\% 是正確的解答。因此,老巴存款的年利率為 8.5%


====

在 Grok3 思考的地方, 可以看到他是如何解三次方程, chatgpt 可能也是類似的方式.


3x^2 + x^3 = 0.0223

這是一個三次方程,我們可以嘗試解這個方程來找到x的值。

由於x = r/100,而r是利率,通常是一個小於100的百分數,所以x是一個小於1的數。我們可以假設x很小,x^3比x^2小很多,因此可以先忽略x^3項,近似解出x,然後再驗證。

忽略x^3項:

3x^2 ≈ 0.0223

x^2 ≈ 0.0223 / 3 ≈ 0.007433

x ≈ √0.007433 ≈ 0.0862

所以,x ≈ 0.0862

現在,我們可以將這個近似值代入原方程驗證:

3*(0.0862)^2 + (0.0862)^3 ≈ 3*0.007433 + 0.000641 ≈ 0.0223 + 0.000641 ≈ 0.022941

而我們希望等於0.0223,所以有點偏大。我們可以嘗試一個稍小一點的x,比如x=0.085:

3*(0.085)^2 + (0.085)^3 ≈ 3*0.007225 + 0.000614 ≈ 0.021675 + 0.000614 ≈ 0.022289

這已經非常接近0.0223了。誤差很小。

我們可以再試x=0.0851:

3*(0.0851)^2 + (0.0851)^3 ≈ 3*0.00723701 + 0.00061579 ≈ 0.02171103 + 0.00061579 ≈ 0.02232682

還是稍微大了一點。

再試x=0.085:

已經算過了,0.022289 ≈ 0.0223

誤差為0.0223 - 0.022289 = 0.000011

這個誤差非常小,可以接受。

或者,我們可以繼續精確化,比如用二分法。

但考慮到利率通常不是一個非常精確的數,我們可以接受x=0.085。

所以,x ≈ 0.085

而x = r/100,因此r = 0.085 × 100 = 8.5

所以,利率約為8.5%。

為了更精確,我們可以解三次方程。

方程是:x^3 + 3x^2 - 0.0223 = 0

我們可以畫圖或者用數值方法求解。

或者,我們可以用牛頓法。

先取初值x0=0.085

f(x) = x^3 + 3x^2 - 0.0223

f'(x) = 3x^2 + 6x

x1 = x0 - f(x0)/f'(x0)

f(0.085) = (0.085)^3 + 3*(0.085)^2 - 0.0223 ≈ 0.000614 + 0.021675 - 0.0223 ≈ -0.000011

f'(0.085) = 3*(0.085)^2 + 6*(0.085) ≈ 3*0.007225 + 0.51 ≈ 0.021675 + 0.51 ≈ 0.531675

x1 = 0.085 - (-0.000011)/0.531675 ≈ 0.085 + 0.0000207 ≈ 0.0850207

再計算f(0.0850207):

(0.0850207)^3 ≈ 0.0006152

3*(0.0850207)^2 ≈ 3*0.0072285 ≈ 0.0216855

f(0.0850207) ≈ 0.0006152 + 0.0216855 - 0.0223 ≈ 0.0000007 ≈ 0

已經非常接近0了。

所以,x ≈ 0.0850207

因此,r = x * 100 ≈ 8.50207%

四捨五入到小數點後一位,r ≈ 8.5%

考慮到銀行利率通常以0.5%為單位,我們可以驗證r=8.5%是否精確。

假設r=8.5%,即x=0.085

計算複利利息:

20000 * (1 + 0.085)^3 - 20000 = 20000 * (1.085)^3 - 20000

(1.085)^3 = 1.085 * 1.085 * 1.085

1.085 * 1.085 = 1.177225

1.177225 * 1.085 ≈ 1.2773

所以,20000 * 1.2773 ≈ 25546

複利利息 ≈ 25546 - 20000 = 5546

單利利息 = 20000 * 0.085 * 3 = 20000 * 0.255 = 5100

複利利息 - 單利利息 = 5546 - 5100 = 446

剛好等於題目中的446元。

因此,利率r=8.5%是精確的。

所以,答案是8.5%。



留言

熱門文章