天天看點

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

編輯:Aeneas 好困

【新智元導讀】沖鋒在AI輔助數學研究第一線的陶哲軒,近日又有「神總結」:ChatGPT提升的,是我們在編碼、圖表等次要任務上的能力;而真要搞好數學研究,基礎不紮實的話,AI也是沒用的。

使用ChatGPT一年半了,陶哲軒的感想如何?

最近,一直沖鋒在探索AI輔助研究功能前線的數學大神陶哲軒,總結了ChatGPT對自己數學研究過程的幫助。

有趣的是,他發現AI輔助在數學方面的用處倒是有限,但它大大提升的,是自己在次要任務上的能力,比如編碼和制作圖表。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

是以說,想要搞好數學研究,還是需要紮實的數學基礎,純靠AI是沒用的。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

數學不好的人,其實AI的幫助可能也沒那麼大

陶哲軒表示,使用#Python的matplotlib.pyplot庫的一個額外收獲是,自己現在可以相對輕松地建立定性圖表,來說明更多非正式關系了。

在以前,他隻能用文字或者草草繪制的手寫草圖來表達這種非正式關系。

為此,陶哲軒發現了一個有效的工作流:向ChatGPT請求一個簡化示例的代碼,然後自己調整和修改代碼,直到輸出符合預期為止。

比如,通過下面這幾輪對話,在幾分鐘内他就得到了自己想要的圖表。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

最後陶哲軒總結道,AI輔助在自己主要研究的數學領域倒是用處有限,但它大大提高了自己在編碼、制作圖表這類次要任務中的能力,同時也将自己在一般任務中的能力,提升到了至少是初學者的水準。

同時他也點出,在自己看來,對于那些精通程式設計但并不那麼精通數學的人來說,AI輔助可能就不會起到這麼大的作用。

陶哲軒和ChatGPT的對話,具體如下——

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

https://chatgpt.com/share/064ae58d-7400-4589-a027-d66a8a8a236e

陶哲軒問:「在Python中,我知道如何使用pyplot軟體包制作圖形的單個圖像。有什麼方法可以讓我用Python制作多個圖形的幻燈片或其他動畫圖像嗎?比如,制作一個幻燈片,展示函數$x$, $x^2$, $x^3$, $x^4$對于$x \in [0,1]$的圖形。」

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

ChatGPT回答說:「是的,你可以使用matplotlib包中的matplotlib.animation子產品,在Python中建立多個圖形的幻燈片或動畫圖像。 」

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

接下來,ChatGPT就給出了建立該函數動畫的具體步驟,詳細給出了代碼——

1. Install matplotlib if you haven't already:

pip install matplotlib           

2. Use the following code to create an animation:

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.animation as animation




# Define the range for x

x = np.linspace(0, 1, 400)




# Define the functions

functions = [lambda x: x, lambda x: x**2, lambda x: x**3, lambda x: x**4]




# Create a figure and axis

fig, ax = plt.subplots()

line, = ax.plot(x, functions[0](x))




# Set axis labels and title

ax.set_xlabel('x')

ax.set_ylabel('f(x)')

ax.set_title('Animated Functions')




# Initialize the animation function

def init():

    line.set_ydata([np.nan] * len(x))

    return line,




# Update the animation function

def update(frame):

    line.set_ydata(functions[frame](x))

    ax.set_title(f'Function: $x^{frame+1}#39;)

    return line,




# Create the animation

ani = animation.FuncAnimation(

    fig, update, frames=len(functions), init_func=init, blit=True, repeat=True, interval=1000

)




# Save the animation as a gif

ani.save('animated_functions.gif', writer='imagemagick')




plt.show()
           

同時, ChatGPT還給出了相應解釋:首先要導入必要子產品,比如導入numpy進行數值運算,導入pyplot進行繪圖,導入animation建立動畫。

然後需要定義x的範圍,建立一個從0到1的數組x,包含400個點。

接着需要定義函數、建立圖形和坐标軸、初始化動畫函數等等。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

ChatGPT給出的答案很好,但每個動畫中隻能顯示一個函數。

為了達到目的,陶哲軒進一步提問道:「如果我想讓每個動畫顯示兩個函數呢?例如,第一幀顯示$x$和$x^2$,第二幀顯示$x^2$和$x^3$,第三幀顯示$x^3$和$x^4$。」

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

ChatGPT表示:「要在動畫的每一幀顯示兩個函數,可以修改代碼,為每一幀繪制兩條線。」

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

接下來,ChatGPT還是給出了詳細的代碼。

1. Install matplotlib if you haven't already:

pip install matplotlib           

2. Use the following code to create the animation with two functions per frame:

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.animation as animation




# Define the range for x

x = np.linspace(0, 1, 400)




# Define the functions

functions = [lambda x: x, lambda x: x**2, lambda x: x**3, lambda x: x**4]




# Create a figure and axis

fig, ax = plt.subplots()

line1, = ax.plot(x, functions[0](x), label='$x#39;)

line2, = ax.plot(x, functions[1](x), label='$x^2#39;)




# Set axis labels and title

ax.set_xlabel('x')

ax.set_ylabel('f(x)')

ax.legend()

ax.set_title('Animated Functions')




# Initialize the animation function

def init():

    line1.set_ydata([np.nan] * len(x))

    line2.set_ydata([np.nan] * len(x))

    return line1, line2




# Update the animation function

def update(frame):

    line1.set_ydata(functions[frame](x))

    line2.set_ydata(functions[frame+1](x))

    ax.legend([f'$x^{frame+1}#39;, f'$x^{frame+2}#39;])

    return line1, line2




# Create the animation

ani = animation.FuncAnimation(

    fig, update, frames=len(functions)-1, init_func=init, blit=True, repeat=True, interval=1000

)




# Save the animation as a gif

ani.save('animated_double_functions.gif', writer='imagemagick')




plt.show()           

随後ChatGPT照例給出了詳細解釋:為了在「0,1」的區間上建立($x$和$x^2$,$x^2$和$x^3$,$x^3$和$x^4$)的函數,需要定義x的範圍、定義函數、建立圖形和坐标軸、初始化動畫函數等。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

陶哲軒表示:「這樣就差不多可以了,但圖例似乎無法随動畫更新,它會停留在x^3和 x^4。有沒有辦法在每一幀都更新圖例?」

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

針對這個問題,ChatGPT給出了對策,就是通過清除現有圖例并建立新的圖例,來更新每一幀的圖例。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

随後,ChatGPT貼心地給出了可以正确更新圖例的修改後的代碼。

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.animation as animation




# Define the range for x

x = np.linspace(0, 1, 400)




# Define the functions

functions = [lambda x: x, lambda x: x**2, lambda x: x**3, lambda x: x**4]




# Create a figure and axis

fig, ax = plt.subplots()

line1, = ax.plot(x, functions[0](x), label='$x#39;)

line2, = ax.plot(x, functions[1](x), label='$x^2#39;)




# Set axis labels and title

ax.set_xlabel('x')

ax.set_ylabel('f(x)')

ax.set_title('Animated Functions')




# Initialize the animation function

def init():

    line1.set_ydata([np.nan] * len(x))

    line2.set_ydata([np.nan] * len(x))

    return line1, line2




# Update the animation function

def update(frame):

    line1.set_ydata(functions[frame](x))

    line2.set_ydata(functions[frame+1](x))

    ax.legend([f'$x^{frame+1}#39;, f'$x^{frame+2}#39;])

    return line1, line2




# Create the animation

ani = animation.FuncAnimation(

    fig, update, frames=len(functions)-1, init_func=init, blit=True, repeat=True, interval=1000

)




# Save the animation as a gif

ani.save('animated_double_functions.gif', writer='imagemagick')




plt.show()           

ChatGPT解釋道:更新函數中的ax.legend()調用,就可以清除現有圖例,并且使用每幀的新标簽進行更新了。這樣就可以確定,圖例反映的是目前顯示函數的功能。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

陶哲軒繼續提問——

「我想讓Python繪制一個用數字描述,但用字元串标注的函數圖。例如,我想繪制這樣一幅圖:橫軸上标有『今天』、『下周』和『明年』,分别代表x=1、x=2和x=3的位置,縱軸上标有『初級』、『中級』和『專家』,分别代表y=1、y=4和y=9的位置(是以縱向标簽的間距并不相等),要繪制的圖形是抛物線y=x^2的圖形。如何繪制?」

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

ChatGPT回答:「要繪制橫軸和縱軸用字元串标注但與特定數值相對應的圖表,可以使用matplotlib庫并自定義刻度标簽。」

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

1. Install matplotlib if you haven't already:

pip install matplotlib           

2. Use the following code to create the plot:

import numpy as np

import matplotlib.pyplot as plt




# Define the numerical values for the x and y positions

x_values = [1, 2, 3]

y_values = [1, 4, 9]




# Define the corresponding string labels for x and y axes

x_labels = ["Today", "Next week", "Next year"]

y_labels = ["Beginner", "Intermediate", "Expert"]




# Define the function to be plotted (y = x^2)

x = np.linspace(1, 3, 100)

y = x**2




# Create a figure and axis

fig, ax = plt.subplots()




# Plot the function

ax.plot(x, y, label='$y=x^2#39;)




# Set the x and y axis labels

ax.set_xlabel('Time')

ax.set_ylabel('Level')




# Set the x and y axis tick positions and labels

ax.set_xticks(x_values)

ax.set_xticklabels(x_labels)

ax.set_yticks(y_values)

ax.set_yticklabels(y_labels)




# Add a legend

ax.legend()




# Set the title

ax.set_title('Parabola $y=x^2$ with Custom Axis Labels')




# Display the plot

plt.show()           

并且給出了相應解釋。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

至此,陶哲軒的問題就被ChatGPT完美解決了。

網友:圖表存在「幻覺」

在陶哲軒的評論區,有網友指出了此圖的準确性有問題:兩條線之間的山谷意味着什麼?那裡的相對位移應該更大才對。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

在他看來,用手繪塗鴉來表達這類非正式想法是比較合适的,可以讓形式與内容相比對,避免了使用和标準化這些AI工具過程中的缺點。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

對于這名網友的「找茬」,陶哲軒進行了詳盡的回複。

他解釋道,如果自己想要傳達複雜關系的圖像,手繪圖是很不友善的,一方面原因是自己不擅長手繪,另一方面,也是因為無法很輕松地編輯出一個草圖,讓它部分地傳達自己的想法。

而借助Python,自己就可以輕松地循環,進行十幾次嘗試,然後找到一個能捕捉到自己想要的細微差别的方法了。

例如,他确實有意讓初級領域和次級領域之間的山谷在AI的幫助下獲得更高的推動力(這個山谷代表着兩個相鄰的領域)。

在陶哲軒看來,純數學是自己的主要領域,而計算機程式設計是次要技能;自己對于設定和安裝機器學習軟體包并沒有直接經驗,但後者與這兩個專業相鄰,是以他會把它放在這個圖的中間位置。

而對于圖表不夠精确這個問題,陶哲軒解釋道,數軸上沒有數字标簽,應該就已經意味着這是一張非正式圖像。

或者,他建議我們可以建立其他信号,來更加強調圖形的非正式性,比如讓線條更厚、更模糊,同時選擇不那麼「專業」的字型。

這些在Python中是很容易做到的,但如果要手工完成,就隻能重繪圖像了。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

同時,針對這位網友的建議,陶哲軒也表示,在使用ChatGPT/Python之前,自己的确也提前手繪了草圖。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

随後,陶哲軒又在圖表上進行了一些調整,添加了一些不建議使用AI輔助的情況:在幾乎沒有先驗知識的情況下嘗試用AI進行中等難度的任務,或者在隻有中等先驗知識的情況下嘗試處理專家難度的任務。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

陶哲軒表示,在這種特殊情況下,此類更新在手繪圖像上是可行的,并且隻需要添加新繪圖就可以了,而不是删除或修改現有繪圖。

但他強調,對于許多其他類型的修訂,使用手繪圖像作為主圖像來源會很不友善。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

「資深使用者」陶哲軒

其實早在2023年3月,陶哲軒就開始探索如何将AI加入到自己的工作流裡了。

起初,陶哲軒想讓ChatGPT根據他的描述直接得到「Kummer定理」這個名字。不過,AI給出的結果卻是一個Legendre公式。好在,後續可以根據這個線索,通過傳統搜尋引擎輕松找到答案。

據此,陶哲軒認為,AI在數學中的作用是提供一個初步解答,然後可以通過更傳統的方法進行細化。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

接下來,陶哲軒從原理上對比了傳統計算機軟體工具和AI工具,發現二者的工作流極為不同。

例如,對于傳統的LaTeX到PDF編譯器來說,隻要輸入的代碼正确,那麼一定可以得到一份完美的PDF。但如果輸入的代碼有格式錯誤,結果要麼是編譯錯誤,要麼是一份嚴重混亂的PDF。

而AI LaTeX編譯器則可以更加優雅地處理噪聲或格式錯誤的輸入,但它不能以「一鍵完成」的方式使用,而是需要進行大量的互動。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

随後,在大量的嘗試中,陶哲軒又發現了一些ChatGPT在處理數學問題時的小亮點。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

比如,一旦AI「學會」了使用者的需求,使用者就可以用最少的解釋或預格式化來提供進一步的資料,而AI依然可以推斷出一個令人滿意的輸出。

例如,在随後的此類請求中,即使輸入不是MathSciNet格式,AI仍然能夠繼續我在附加請求中隐含引入的參考命名約定。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!
陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

總的來說,這些AI工具并不能幫助直接攻克未解的數學問題,但它們在各種相關的任務中相當有用,盡管之後常常需要一些手動調整。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

2023年4月,在經過一段時間的使用之後,陶哲軒針對AI和人類(主要是自己)各自的優勢進行了一波總結。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

1. 對于每天都要做的任務,陶哲軒已經掌握了足夠的技術來優化工作流。在這方面,AI工具的幫助不大。最明顯的就是在研究數學,同時也包括他已經極為熟練的郵件撰寫。

2. 對于有一些專業知識但很少實踐的任務,AI工具是有幫助的。比如建立初稿或者提供靈感,然後陶哲軒自己再去進行驗證和完善。這一類的例子包括資料處理、翻譯成外語,或以很少使用的格式編寫文本(比如,公開演講、規則檔案等)。

3. 對于幾乎沒有專業知識且不需要極高品質和可靠輸出的任務,也可以詢問AI工具,并或多或少地聽從它的建議。在這裡,AI的功能相當于一個操作更簡便的搜尋引擎。

4. 對于沒有專業知識但需要品質和可靠性的任務,就必須咨詢人類專家了。一個例子是修理複雜、昂貴且精密的裝置。

比如,第二類任務:

陶哲軒讓GPT用LaTeX輸出流程圖後,得到了下面這張圖檔。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

可以看到,這張流程圖還比較粗糙,不過對于熟練使用LaTeX的陶哲軒來說,隻需簡單修改一下,即可得到下面這個成品。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

再比如,第三類任務:

陶哲軒讓GPT把自己之前的文章總結為流程圖,結果如下。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

2023年9月,陶哲軒對ChatGPT的探索,已經深入到用它來寫代碼了。

作為實驗,他要求ChatGPT寫一段Python代碼,為每個自然數n計算1,...,n的最長子序列的長度() ,其中歐拉全能函數ϕ不遞減。

很快,AI便生成了一段極其巧妙的代碼。雖然還存在一些偏差,但距離最終答案已經非常接近了。

随後,陶哲軒基于這段初始代碼作為起點,手動生成了自己想要的代碼,這大概節省了他半個小時的工作量。

因為ChatGPT給出的結果非常好,陶哲軒表示,自己以後還會經常使用它,為類似的計算提供初始代碼。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

一看陶哲軒對AI的嘗試已經來到了代碼領域,坐不住的網友們便給他安利一波AI加持的VSCode。

對此,陶哲軒本人十分「聽勸」,竟然放下了自己已經用了近10年的TeXnicCenter+MiKTeX,立刻将工作流更新到了VSCode+TeX Live+LaTeX workshop+GitHub Copilot。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

在初次嘗試中,他主要用的是很基礎的代碼片段功能(code snippets feature)——

通過輸入觸發詞(比如「cor」),并按下Tab鍵來建立整個推論環境(corollary environment),非常節省時間。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

就在不到一個月之後,陶哲軒表示,他已經在用Github Copilot為自己的部落格文章撰寫提供助力了。

比如在下面這個例子中,陶哲軒将一個積分分成三部分,并描述了如何估計第一部分,随後Copilot正确地給出了剩下兩部分的估計方法。

他預計,在最終的成稿中,大約有十幾句來自Copilot的建議會以某種形式呈現出來。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

随着AI自身的進化,以及愈發熟練的掌握,陶哲軒發現AI已經不再局限于外圍的任務,而是可以涉足數學領域本身了。

比如,在使用Lean進行自然數遊戲研究時,他便通過GPT-4的輔助得到了關于有限多個實變量不等式理論的成果。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

并且,随着關卡變得越來越難,GPT的作用也越加能夠凸顯出來。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

而在這波體驗之後,大神本人也算是徹底「入坑」了。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!
OK,自然數遊戲已經完成,現在我要去安裝Lean并編寫一個「hello world」程式了。

幾天之後,又是一大波心得總結:

- Github Copilot在完成簡短論證時非常有用,盡管它的較長建議通常是錯誤的。但即使是錯誤的建議也能幫助我學到正确的文法。

- GPT-4在澄清Lean文法的細微差别并提供我用數學英語解釋的步驟的Lean翻譯建議方面有一定幫助。然而,它似乎更受Lean3文法和最佳實踐的影響,而不是Lean4。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

終于,在經過差不多100個小時的努力之後,陶哲軒用Lean4完成了Maclaurin型不等式論文的形式化。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

大神畢竟是大神,陶哲軒很快又再一次跑通了用AI工具輔助數學研究——形式化多項式Freiman-Ruzsa猜想的證明,大獲成功。

陶哲軒點破天機:不懂數學别想靠ChatGPT飛升!

參考資料:

https://mathstodon.xyz/@tao/112735110429475270

https://mathstodon.xyz/@tao/110250470289337319

繼續閱讀