JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

機器究竟是怎樣"學習"的

機器既不像你那樣學習,也不只是聽從程式設計師寫下的規則。本指南拆解現代人工智慧最核心的一個想法:透過調整一堆數字、讓模型的錯誤越來越小,從而把模型擬合到樣例上。

讓電腦做事的兩條路

在本階段前面的內容裡,你已經把人工智慧當作一個領域來認識,也看到了它與普通軟體的區別。現在我們聚焦到一個動作上——它幾乎驅動著今天所有的人工智慧;而誠實的起點,是把它和更古老的做法對照來看。在電腦歷史的大部分時間裡,要讓機器完成某項任務,你得寫下規則:由程式設計師事先想清楚的、明確的一步步指令。"如果郵件裡出現'中獎'這個詞,就標為垃圾郵件。"智慧完全寄居在寫規則的人身上;電腦只是服從。

這種寫規則的做法,正是經典符號人工智慧的核心,也是專家系統的核心——後者把人類知識手工編成成千上萬條"如果-那麼"規則。當任務清晰、規則可知時,它運作得極為漂亮。但想想看:在照片裡認出一隻貓,或者分辨一條訊息是友善還是諷刺。你能把每一條規則都寫下來嗎?鬍鬚嗎?可有很多貓躲在沙發後面。事實是:你毫不費力就能認出貓,卻無法完整說清自己是怎麼做到的——於是你也沒法把這些規則交給電腦。

機器學習把箭頭反了過來。你不再自己寫規則,而是給機器看大量樣例——成千上萬張已經標好"是貓"或"不是貓"的照片——再讓一套程序替你找出規則。程式設計師不再規定"是什麼"讓一隻貓成其為貓;他們搭建的是一個能從資料中發現那種模式的系統。目標相同,方向相反:是從樣例裡得出規則,而不是從規則裡得出答案。

樣例、特徵與標籤

要從樣例中學習,機器需要把樣例變成它能咀嚼的形式:數字。以預測房價為例。每一套房子變成一行可度量的輸入——面積(平方公尺)、臥室數量、房齡、到市中心的距離。每一個這樣的輸入就是一個特徵。你想預測的東西——價格——則是標籤(也叫目標值)。一套房子,連同它的特徵和已知價格,就是一個訓練樣例。

當每個樣例都帶著已知標籤時——每套房子都已經有價籤,每張照片都已經寫明是不是貓——機器就能把自己的猜測和正確答案對照,從而自我糾正。這就是監督學習,迄今最常見、研究得最透徹的一類,也是本指南餘下部分要追隨的那一類。(還有別的類型——從無標籤資料裡找模式,或從試錯的獎勵中學習——但那些你會在下一篇裡遇到。)

模型是一台帶可調旋鈕的機器

這一切的中心坐著一個模型。別把它想得多神秘:模型不過是一個內部帶著若干可調數字的數學函數。它把特徵輸進去,輸出一個預測。那些可調的數字就是參數。所謂學習,不多也不少,就是為這些參數找到合適的取值。

最樸素而誠實的例子:把價格預測成各特徵的加權和。價格 = w1 x 面積 + w2 x 臥室數 + ... + b。每個 w 都是一個參數——一個旋鈕,表示那個特徵有多重要——而 b 是一個偏移量。擰動旋鈕,同一個模型就變成了不同的價格預測器。一個現代的大語言模型不過是同一個想法被荒誕地放大:它不是四個旋鈕,而是數千億個,但每一個仍舊只是一個正在被調的數字。

把兩類數字分開會很有幫助。參數是機器在學習過程中自己設定的——就是上面的那些 w 和 b。超參數則是在學習開始之前做出的選擇——允許有多少個旋鈕、每次調整時邁多大的步子。參數是學出來的;超參數是由操盤的人手動撥定的。把這兩者混為一談,是初學者最常見的困惑之一。

訓練:擰旋鈕去擬合資料

那麼旋鈕是怎麼被設定的呢?一開始你給它隨機值——模型最初的猜測純屬胡來。你餵給它一個訓練樣例,它做出預測,你再衡量它錯得有多離譜:它的預測與真實標籤之間的差距。把這種錯誤程度在整批資料上取平均,就得到一個單一的數字,叫作損失——越低越好。訓練,就是去尋找能讓損失變小的那組參數取值。這正是人們所說的"把模型擬合到資料上"。

這種搜尋本身美妙地機械。對每一個旋鈕你都問:要是我把它往上輕推一點,損失是升還是降?然後你就讓每個旋鈕都朝著能降低損失的方向輕輕挪一下,再重複——成千上萬、乃至上百萬次。這種耐心的下坡行走就是梯度下降,而幾乎所有現代訓練靠的都是它的某個版本。沒有頓悟,沒有理解——只有"哪個微小的調整能讓我少錯一點",不停地做下去。

  1. 把參數初始化為隨機值。
  2. 讓樣例通過模型,得到預測。
  3. 衡量損失——預測離真實標籤有多遠。
  4. 把每個參數朝著能降低損失的方向輕推一點。
  5. 重複第 2 到 4 步,直到損失幾乎不再改善。
params = random()
repeat many times:
    pred  = model(features, params)
    loss  = how_wrong(pred, labels)
    grad  = which_way_lowers(loss, params)
    params = params - step_size * grad   # nudge downhill
# params now "fit" the training data
訓練迴圈的精神全貌:預測、衡量誤差、把參數往下坡輕推、重複。

訓練與使用——以及死記硬背的陷阱

旋鈕一旦設定,訓練便告結束,模型就可以被使用了:遞給它一套從沒見過的全新房子,它在一次前向計算裡就給出一個價格——不再擰任何旋鈕。這一分界就是訓練與推理。訓練是尋找參數的那個緩慢、昂貴、一次性(或偶爾進行)的過程;推理則是把訓練好的模型跑在新輸入上的那個快速、廉價、反覆進行的動作。正在回答你的聊天機器人做的是推理;它那幾個月的訓練早已完成,旋鈕已被凍結。

這裡也最需要誠實。我們的目標從來不是在那些已經知道價格的房子上表現好——我們想預測的是房子。一個只是把訓練資料死記下來的模型,就像一個背下了答案卻沒真正學懂學科的學生,在見過的東西上拿滿分,碰到任何新東西就垮掉。這種失敗叫作過擬合,而與它搏鬥是整個領域最核心的較量之一。

所以,當有人說某台機器"學會了",你現在可以精確地翻譯它:一個帶可調參數的模型被展示了帶標籤的樣例,一場下坡搜尋不斷調整這些參數,直到它在樣例上的預測變得準確——並且理想情況下,這種準確能遷移到新情形上。沒有魔法,沒有理解,沒有內在生命。只有資料、一個函數,以及大量微小的修正。把這幅圖景牢牢記住;這條階梯上後面所有更重的東西,都建在它之上。