
晚上好,我是原本超級文組(ゴリ文)的 miruky。
一提到機械學習,半年前的我會立刻產生「咦——」的排斥反應。因為我一直以為那是大學裡主修 CS(電腦科學)的人才碰的領域,再加上先入為主地覺得它會不斷冒出複雜數學式。不過實際學下來,雖然在大學、研究所的學術層級確實可能如此,但入門階段其實不需要太複雜的數學也能理解。
本文會從機械學習的全貌,一路整理到生成式 AI 的最新研究,讓剛開始學的人也能看懂。雖然會用到一點數學式,但我會盡量把式子的意思翻回中文,讓只要還記得國中代數和一次函數就能跟上。
那麼,就讓我們進入機械學習的世界吧!
一般程式會由人類先寫好規則。例如把「分數 80 分以上就及格,80 分以下就不及格」這種規則直接寫進程式碼。
機械學習則不會一開始就把所有規則寫死。它會餵給模型過去的資料,讓模型自己學出趨勢。像租金預測時,模型會根據距離車站的遠近、坪數、屋齡、樓層等資訊,自行調整預測租金的公式或判斷邊界。
這裡所謂的「學習」,和人類理解語意的學習有點不同。模型只是把輸入和答案之間的關係轉成數值並持續調整。白話來說,就是預測錯了就修正一點,又錯了再修正一點,這個過程反覆進行。這很機械化,對吧。
例如,考慮一個把電子郵件判斷成垃圾信或正常信的普通程式,人類會寫下像「如果包含這些字就是垃圾信」「如果來自這個寄件者就有風險」之類的條件與規則。條件少時還能應付,但真實郵件的表達會變、寄件者會變,正常郵件裡也可能出現類似字詞。規則越多,人類維護的負擔就越大。
機械學習則是把大量垃圾信與正常信的例子餵給模型,讓它自己調整邊界。人類通常不會把「每個字詞該怎麼加權」全部手寫出來。大多數情況下,我們是靠直覺在分類。機器則是從資料中,組合出表示「像垃圾信」的數值模式。
當然,機械學習不是什麼都能自動解決。資料品質差,模型就會學到差的傾向;輸入與答案關係很弱的問題,即使用再高級的模型也有極限。機械學習不是把所有規則都消滅,而是把能從資料中調整的部分交給模型處理的技術。

先來定義一下名詞。其實 AI、機械學習、深度學習、生成式 AI 並不是同一件事,而是範圍大小不同。
| 名詞 | 大致意思 |
|---|---|
| AI | 用機器處理人類的智慧型工作,範圍很廣的領域 |
| 機械學習 | 從資料中學習規律並做預測的方法 |
| 深度學習 | 使用多層神經網路的機械學習 |
| 生成式 AI | 能生成文字、圖片、語音、程式碼等內容的 AI |
深度學習是機械學習的一部分,而很多生成式 AI 也都是建立在深度學習之上。現在的大型語言模型並不是突然從另一個世界冒出來的技術,而是機械學習的延伸。很多在大學主修 CS、尤其是機械學習的人也常這麼說,這完全沒錯。
機械學習也有擅長與不擅長的地方,就像人一樣。它擅長的是利用過去資料中的趨勢,對相似情況進行預測。像需求預測、影像分類、異常偵測、文本分類、推薦系統、語音辨識這類從大量例子中找模式的問題,就很適合。
但如果是過去資料沒出現過的情境、資料蒐集方式改變的情境,或是答案本來就很模糊的情境,它就比較不擅長。比如只靠過去的銷售資料,要精準預測突然的法規變動、天災、社群爆紅潮流,就很困難。模型並不知道未來,它只是使用從訓練資料裡找到的關係。

另一個重要觀念是:機械學習的輸出通常只是判斷依據,不一定是最終決策。像醫療、金融、招募、資安這類影響重大的場景,不只要看預測值,還要嚴格確認是用哪些資料訓練、會錯多少、錯了會造成什麼影響。
在機械學習入門中,常會出現模型、演算法、參數這些字。它們常一起出現,但角色不同。有些詞和一般直覺的意思會有點落差,這裡要稍微注意。
| 名詞 | 意思 | 租金預測例子 |
|---|---|---|
| 模型 | 從輸入產生預測的機制 | 用來預測租金的公式 |
| 演算法 | 訓練模型的方法 | 讓誤差變小、更新權重的方法 |
| 參數 | 會在訓練中調整的數字 | 面積、屋齡所對應的權重 |
| 超參數 | 人類先決定的設定 | 學習率、樹深、epoch 數 |
模型是負責輸出預測的主體。線性迴歸的模型,是把輸入乘上權重再加總的公式;決策樹的模型,是條件分支的樹;神經網路的模型,則是由許多帶權重的層所組成。

演算法則是「如何建立與調整這個模型」的步驟。像梯度下降法,就是讓參數朝著損失變小的方向更新的演算法。
參數就是在訓練過程中會改變的數字。以租金預測來說,面積的權重、車站距離的權重、屋齡的權重就是這些參數。相對地,學習率、決策樹最大深度這種由人事先決定的值,就叫做超參數。這些名詞非常重要,請務必趁這個機會記住。
在機械學習中,作為輸入的資訊叫做特徵量,想要預測的答案叫做標籤。以租金預測為例,輸入資訊如坪數、距離車站遠近、屋齡就是特徵量,而答案租金就是標籤。

在這個表格中,模型會看坪數、距離車站的遠近、屋齡,來預測租金。模型會學到一些傾向,例如坪數越大租金越高、離車站越近租金越高、屋齡越老租金越低。
不過,沒放進資料中的資訊基本上就學不到。如果日照、治安、裝潢新舊、附近噪音等也會影響租金,那就最好也把它們當成特徵量,預測才會穩定。
如果把資料看成表格,1 列是一個案例,1 欄是一個項目。像房屋 A、房屋 B、房屋 C 是列,而坪數、距離車站遠近、屋齡是欄。在機械學習中,這張表裡用來預測的欄叫做特徵量,要預測的欄叫做標籤。
這種看法對影像和文字也一樣。影像分類時,一張圖片相當於一列,而標籤可以是狗、貓、車等類別。文字分類時,一段文字相當於一列,而標籤可以是垃圾信、客服問題類型、情緒等等。

資料分成訓練用與確認用非常重要。若把全部資料都拿去訓練,就無法判斷模型只是把過去題目背起來,還是真的能處理新題目。
| 資料 | 角色 |
|---|---|
| 訓練資料 | 用來調整模型 |
| 驗證資料 | 用來挑選模型或設定 |
| 測試資料 | 最後確認性能時使用 |
測試資料可以想成接近正式考試的資料。若一邊看測試資料一邊修模型,就會變成對測試結果做調整。實務上,比起做出看起來漂亮的數字,更重要的是誠實測出模型在未知資料上的誤差有多大。這部分既重要又困難。
但現實資料往往不能直接拿來訓練。常會遇到空值、格式不一致、單位混雜、類別名稱不統一、離群值等問題。也就是資料很髒。
| 作業 | 內容 |
|---|---|
| 缺失值處理 | 補空值,或刪除列、欄 |
| 標準化 | 統一數值尺度 |
| 類別轉換 | 把文字類別轉成數字 |
| 離群值確認 | 判斷極端值要不要直接使用 |
特別要注意的是資料洩漏。這是指原本在預測時點不應該知道的資訊,混進了訓練資料。比方說在流失預測中,把「流失後才知道」的欄位當成特徵放進去,訓練時成績會很好看,但實際上無法使用。

在機械學習裡,資料的做法和模型選擇一樣重要。即使模型看起來很聰明,若只是偷偷看到了未來資訊,實務上也不會有用,這點應該不難想像。
特徵量設計,就是把要餵給模型的資訊設計出來。同樣的原始資料,特徵量做法不同,性能就可能差很多。以租金預測來說,不只可以用距離車站本身,也可以加上最近車站的路線數,把屋齡分成新成屋、屋齡淺、老屋等區間,或是建立「坪數 × 車站距離」這種組合特徵。
再強調一次,特徵量設計時不能直接把答案丟給模型。像流失預測中,把流失日、解約原因這種只有流失後才知道的資訊放進去,訓練分數就會虛高。這就是前面提過的資料洩漏。
而且特徵量不是越多越好;太多無關特徵會讓模型連偶然關係都學進去。如果在訓練資料上看起來很好,但在未知資料上表現變差,就要懷疑特徵量設計是否有問題。
機械學習處理的資料有幾種型態。數值資料很多時候可以直接使用,但類別、文本、影像在丟給模型前通常要先轉成數字。
| 資料類型 | 例子 | 轉換想法 |
|---|---|---|
| 數值 | 年齡、價格、距離 | 做標準化或檢查離群值 |
| 類別 | 地區、職業、方案名稱 | 以 one-hot 編碼等方式數值化 |
| 文本 | 評論、客服訊息 | 轉成詞彙、token、嵌入向量 |
| 影像 | 商品照片、醫療影像 | 當成像素值或影像特徵處理 |
對類別資料來說,如果只是把 A 方案、B 方案、C 方案直接換成 1、2、3,模型可能會誤以為「C 比 A 大」有順序關係。若方案名稱沒有大小之分,通常會考慮 one-hot 編碼。
one-hot 編碼就是為每個類別各建立一欄,符合的那欄填 1,其餘填 0。若有 A、B、C 三個方案,就建立 A、B、C 三欄。A 方案的人在 A 欄是 1,其餘是 0。這樣數字大小就不會變成錯誤的排序,模型也不會誤會 C 比 A 大。

文本與影像還需要更進一步的轉換。文章會轉成 token 或嵌入向量,影像則會處理成像素值或神經網路中的中間表示。使用哪種轉換,會影響模型能抓到什麼資訊。
複習一下,標籤就是想要預測的答案。不過在真實資料裡,標籤本身怎麼定義有時很難。
像流失預測,就必須決定「多少天內沒來算流失」。購買預測中,用點擊代替購買可不可以,還是只能看真正購買,意思都不一樣。客服分類時,不同承辦人員對類別的判定也可能不同。

標籤基準如果不穩定,模型就會學到不穩定的答案。模型準確率提不上去時,問題有時不是演算法,而是標籤的定義或標註方式。對機械學習來說,製作正確答案的工作本身也是設計的一部分。
這一段應該很多人都聽過。監督式學習是從「輸入+正解」的配對資料學習的方法。像銷售預測、租金預測、影像分類、垃圾信判斷等都很常用。你可以把它想成老師把題目和答案一起教給你,這樣比較容易記住。
| 任務 | 輸入 | 正解 |
|---|---|---|
| 租金預測 | 坪數、車站距離、屋齡 | 租金 |
| 垃圾信判斷 | 郵件本文、寄件者 | 是否為垃圾信 |
| 影像分類 | 圖片 | 狗、貓、車等 |
如果正解是數值,叫做迴歸;如果正解是類別,叫做分類。預測租金、銷售額這種數值,就是迴歸;判斷是垃圾信還是正常信,就是分類。
迴歸可以理解成「直接預測數值」的任務,例如租金是 9 萬還是 11 萬、下個月營收是 100 萬還是 120 萬,這類連續量的預測。分類則是「屬於哪一群」的任務,例如狗或貓、垃圾信或正常信。只要先記住:同樣是監督式學習,但答案是數字還是類別,名稱就不同。

監督式學習因為有正解,所以能建立評估標準;但相對地,製作正解資料也需要成本。像是為圖片標註狗、貓、車,替客服訊息標上類別,或為語音加上逐字稿,都需要人類判斷。
此外,監督式學習很依賴過去的正解。如果過去的判斷有偏差,模型也會把偏差學進去。像招募、審核、授信這種會用到人類判斷紀錄的場景,就必須確認過去資料是否真的代表理想的判斷。
無監督式學習是在沒有正解標籤的情況下,尋找資料結構的方法。像是把顧客依購買傾向分群、把文章依主題整理、找出異常資料等等。跟前面不同的是,這裡沒有老師先告訴你答案,所以要自己找出模式。
代表例子就是分群(clustering)。分群會根據資料彼此之間的相似程度,把資料分成幾群。即使人類事先沒有給 A 群、B 群的答案,模型也能把相似的東西聚在一起。

在無監督式學習裡,結果的解讀很重要。即使分成 3 群,也不代表那 3 群在業務上就有意義。若是購買傾向的分群,就要再確認每群常買什麼商品、是否有年齡或地區偏差等。
降維也是無監督式學習的代表。它會在盡量保留資訊的前提下,把大量特徵量整理成較少的軸。這常用於高維資料視覺化或減少重複資訊。
順帶一提,降維就是把很多欄位(特徵量)在盡量保留意思的情況下,整理成較少的軸。比如你有數學、物理、化學、國文、社會、英文 6 科成績時,可能只用「偏理組還是偏文組」和「整體強不強」兩個軸,就能大致看出趨勢。把 6 欄變成 2 欄,但重要差異仍保留,這就是降維的感覺。欄位少了之後,圖也比較好畫、好看;某些方法與資料下,也可能減少重複資訊或雜訊。不過重要資訊也可能一起被捨棄,所以不是降得越多越好。
這裡開始就有點複雜了。強化學習是根據行動後得到的回饋,學習更好的行動方式的方法。遊戲 AI、機器人控制、廣告投放、推薦系統,最近甚至大型語言模型提升推理能力的研究也會用到。關鍵字就是「給獎勵」。
在強化學習裡,答案不一定一開始就排好。你先選一個行動,收到結果,再調整下一步。它不是像考試一樣直接批改,而是透過不斷嘗試,朝著獎勵增加的方向前進。像你對狗狗說「坐下」,如果狗狗真的坐下了,就給牠零食(獎勵)這種概念。狗狗會學到:當主人說坐下時,做出指定動作就會得到零食。就是這種感覺。
強化學習常出現的詞有代理人、狀態、行動、報酬、策略。雖然有點繞,但名詞上來說:代理人是執行行動的主體,狀態是目前情況,行動是可選操作,報酬是結果分數,策略則是在各種狀態下選哪個行動的規則。
| 名詞 | 意思 | 遊戲例子 |
|---|---|---|
| 代理人 | 執行行動的主體 | 玩家 AI |
| 狀態 | 目前情況 | 場面、HP、位置 |
| 行動 | 可選操作 | 移動、攻擊、防禦 |
| 報酬 | 行動結果的分數 | 勝利、得分、傷害 |
| 策略 | 行動選擇方式 | 這個局面就攻擊 |

強化學習難的地方在於,眼前看起來有利的行動,長期可能反而不利。只追眼前得分,之後可能會輸;如果不探索,就找不到更好的策略。最近的推理模型中,強化學習也跟答案驗證與思考流程改善有關。
在理解最近的大型語言模型時,自我監督式學習也很重要。這種方法不需要人類一筆一筆人工標註正解,而是直接拿資料的一部分當作答案來學習。因為是自己扮演老師,所以叫自我監督式。
對文章來說,可以用前文預測下一句,或把句子的一部分遮住,再從上下文還原。因為可以直接從原文產生問題與答案,所以非常適合用來做大量文本的預訓練。看到這裡,應該有人會有「喔,原來如此」的感覺。沒錯,就是 token 的機制。token 是把文章切成小單位的東西,細節會在第 12 章說明。先要理解的是:它其實是在用文章本身來做「預測下一個字」這種題目。這種不必另外人工準備答案,而是由資料本身自動生成問題與答案的機制,就是後來大型語言模型的基礎。

這種方法不只減少人工標籤成本,也能從大量資料學到更通用的表示。大型語言模型就是透過這種預訓練學會語言規律,再進一步接受指令回應與對話調整。
自我監督式學習除了能降低標籤成本,也常用來學習通用表徵。文字可以學到詞與詞之間的關係、上下文脈絡;影像則可以透過遮住一部分再還原、讓同一張圖的不同變形彼此接近等方式學習。
在這個階段學到的表示,可以拿去做後續任務。比方說,以預訓練語言模型為基礎,再調整成客服分類、摘要、聊天回應、程式碼生成。大型模型的強大之處,不是只學單一任務,而是先從廣泛資料建立表示,再針對用途做調整。
機械學習的入口可以從一次函數開始。這就是國中數學常見的公式。
$$
y = ax + b
$$
在這個式子裡,x 是輸入,y 是預測結果。a 是斜率,b 是截距。是不是很熟悉。
如果只看坪數來預測租金,可以寫成:
$$
租金 = a \times 坪數 + b
$$
若 a = 0.2、b = 3,而坪數是 30 坪,則租金是:
$$
0.2 \times 30 + 3 = 9
$$
這裡的預測租金就是 9 萬元。實際上只靠坪數還不夠,所以還要加入車站距離與屋齡。
$$
租金 = a \times 坪數 + b \times 車站距離 + c \times 屋齡 + d
$$
雖然字母變多了,但做的事情一樣:把輸入乘上權重後加總,最後再加上一個調整值。
在這裡,坪數、車站距離、屋齡 就是特徵量;a、b、c 是各特徵量的權重;d 則是把整體上下平移的調整項。
例如,坪數權重大的模型,會讓坪數強烈影響租金;車站距離權重若為負,代表越遠租金越低;屋齡權重若為負,代表越老的物件租金越低。這樣想是不是就很有感了。

線性模型雖然簡單,但很值得先學。它能讓你用公式看懂預測怎麼來,從權重正負也能看出特徵量影響方向。先用線性模型建立概念,之後再學損失函數與最佳化會更容易,所以才先介紹它。
公式中的 a、b、c、d 這些在訓練中會被調整的數字,就叫做參數。機械學習的訓練,本質上就是把這些參數調整到比較好的值。
如果由人手動決定「坪數對租金影響要大一點、屋齡越大租金要越低,所以權重要是負的」,雖然也能做,但很麻煩。於是就讓模型利用過去資料自己調整。
前面說過,參數和超參數不要混淆。參數是訓練中由模型自己調整的數字;超參數則是訓練前由人決定的設定。
| 種類 | 誰決定 | 例子 |
|---|---|---|
| 參數 | 訓練中決定 | 權重、截距、神經網路權重 |
| 超參數 | 人類設定 | 學習率、epoch 數、樹深 |

如果模型表現不好,通常不會直接手動改參數,而是改特徵量、重新檢查訓練資料、換模型或調整超參數。
在線性模型中,看權重的正負就能知道特徵量對預測是往哪個方向作用。坪數的權重若為正,代表坪數越大租金越高;車站距離的權重若為負,代表離車站越遠租金越低。
不過,直接比較權重大小有時不安全。因為坪數是坪、車站距離是分鐘、屋齡是年,單位不同。這就像不能直接拿 100 分滿分的考試和 5 分制問卷直接比大小一樣。
因此會用標準化來統一數值尺度。標準化是把數值轉成「離平均有多遠」這種形式。這樣模型就不會被某個單位過大的特徵量牽著走。

這裡最重要的是:標準化也只能用訓練資料計算。若把測試資料一起拿去算平均與標準差,就會把測試資料資訊洩漏到訓練流程中。
解讀權重時,也要分清楚相關和因果。就算離車站近的物件租金通常比較高,也不能只憑模型權重就斷言「車站距離就是租金上漲的原因」。實際上可能還有商圈、熱門區域集中在車站周邊、屋齡分布不同等其他因素。
機械學習模型學的是資料中的關係。若要證明因果,還需要實驗設計與統計驗證。模型係數可以是很強的線索,但不要直接把它當成原因。
在迴歸中,正解與預測的差叫做殘差。名字聽起來是不是很帥。
$$
殘差 = 正解 - 預測
$$
如果租金正解是 10 萬,預測是 9 萬,殘差就是 1 萬;如果正解是 10 萬,預測是 12 萬,殘差就是 -2 萬。
看殘差可以知道模型偏向往哪裡錯。如果整體殘差偏正,模型可能普遍低估;如果殘差偏負,模型可能普遍高估。

檢查殘差是改善模型的起點。如果只有某個地區常常出錯、只有老屋常常出錯、只有高租金物件常常出錯,就要回頭檢查特徵量或模型。
損失就是衡量模型預測錯得有多離譜的數字。損失越小,代表預測越接近正解;損失越大,代表離正解越遠。
例如,實際租金是 10 萬,預測是 8 萬,差了 2 萬;預測成 12 萬,也差了 2 萬。兩者外得一樣多,若直接把差值相加,正負會互相抵消。
因此通常會把差平方化。
$$
(正解 - 預測)^2
$$
差是 2 的話,平方後是 4;差是 5,平方後就是 25。這會讓偏差很大的預測受到更重的懲罰。
使用損失函數,是為了把模型好壞變成一個可比較的數字。當有 100 筆預測時,只看每一筆的差異很難判斷哪個模型更好;但如果計算損失,就能比較模型 A 的損失是 10,模型 B 的損失是 6。

不過損失小不代表一定是好模型。如果只在訓練資料上損失很小,可能就是過擬合。過擬合是指模型幾乎把訓練資料的答案背起來,遇到新資料就變弱。就像考試前只背歷屆試題答案,正式考試題目稍微變一下就答不出來。更詳細內容會在第 9 章說明,這裡只要先記住:不能只相信訓練資料上的小損失,真正要看的是模型在沒看過的資料上損失是否也小。
這一段先別緊張。平均平方誤差是迴歸常用的損失函數,英文是 Mean Squared Error,簡稱 MSE。接下來就叫它 MSE。
$$
MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2
$$
看到這個式子可能會有點「哇」的感覺,我懂。不過意思其實很簡單。
先看那個不太熟悉的 Σ。它讀作 sigma,意思是把右邊的東西全部加起來。Σ 下方的 i=1 和上方的 n,表示從第 1 筆加到第 n 筆,也就是把 1 筆、2 筆、3 筆……全部加總。可以把它想成把全班每個人的分數一路加上去的符號化寫法。
| 記號 | 意思 |
|---|---|
n |
資料數量 |
y_i |
第 i 筆正解 |
ŷ_i |
第 i 筆預測值 |
Σ |
全部加總 |
也就是說,先算預測與正解的差,再平方,全部加起來,最後除以資料數。這就像算平均分數時,把總分除以人數一樣。
來看一個小例子。假設正解是 10, 12, 8,預測是 9, 10, 9。

因為要平方,所以正負不會互相抵消,而且大的偏差會被放大。這既是優點也是缺點。如果你希望強烈避免大誤差,MSE 很適合;但它也會比較容易被離群值拉著走。
分類問題通常比起 MSE,更常使用交叉熵。名字雖然難,但其實是在衡量「預測機率」和正解差多遠。
熵大致可以理解成「結果有多難預測」,也就是不確定性或混亂程度。像骰子每面機率都差不多時,就很難猜結果,因此熵高;如果幾乎已經確定會出某個結果,熵就低。交叉熵就是把這個概念拿來衡量模型的預測機率與正解之間的差距。正解類別的機率越高,損失越小;如果模型對錯誤類別還很有自信,損失就很大。
例如,若一張貓的圖片,模型預測它是貓的機率是 0.9,那就是很好的預測;如果只給 0.1,就代表明明很確定卻猜錯了,因此會被重罰。
分類時,不只看有沒有猜對,還會看你有多有把握。交叉熵就是把這份把握的方向與大小也算進損失裡。
例如,若正解是貓,模型 A 預測貓 0.51、狗 0.49;模型 B 預測貓 0.99、狗 0.01。兩者最終都會判成貓,但模型 B 對正解類別給了更高機率,因此交叉熵會認為它更好。

反過來說,如果正解是貓,模型卻非常自信地給出狗 0.99,那就會被大幅懲罰。因為在分類問題中,自信地猜錯是很危險的。像醫療與反詐騙這類場景,機率的解讀會直接影響實際決策。
損失函數決定模型要把什麼視為「好預測」。回歸用 MSE 時,會強烈懲罰大偏差;分類用交叉熵時,則要求對正解類別給出高機率。
如果選錯損失函數,模型會毫不知情地往錯方向最佳化。例如,在反詐騙中如果只最大化正確率,模型可能會學成「幾乎都判正常」就有很高分。但實務上真正需要的是不要漏掉詐騙,而損失或評估指標沒有反映這點,就會出問題。

可以把損失函數看成把業務上「哪種錯誤比較嚴重」翻成數學語言的工具。損失函數本身不會自己讀懂你的目標,而是人類要先思考:什麼錯誤最麻煩?哪種誤判最重?多大的誤差可以接受?然後再選適合的損失函數與評估指標。
損失函數和評估指標很像,但用途不同。損失函數是訓練時用來調整模型的數字;評估指標則是在訓練後,用來判斷模型好壞的數字。你可以把它想成學習中的計分方式 vs. 考完後的成績單。
| 項目 | 使用時機 | 例子 |
|---|---|---|
| 損失函數 | 訓練中 | MSE、交叉熵 |
| 評估指標 | 評估時 | 正確率、F1、MAE、RMSE |
有時兩者會用同一種,但不一定完全一致。分類可能用交叉熵訓練、用 F1 分數評估;迴歸可能用 MSE 訓練、再看 MAE 評估。
原因是:適合訓練的數字,和人類真正想看的數字,不一定相同。訓練時需要平滑、可微分、能幫助調整參數的損失;實務上則可能更關心漏判數、誤報數、平均誤差、人工審查量等更貼近決策的指標。
下面表中的評估指標,現在先知道名字與用途就好,細節會在第 8 章說明。
先記住:正確率與 F1 常用於分類,MAE 與 RMSE 常用於迴歸。
為了讓損失變小,將參數一點一點往適合的方向移動的方法,就是梯度下降法。Google 的 Machine Learning Crash Course 也把它介紹成一種反覆尋找能讓損失最小的權重與偏置的方法。
你可以把它想成走下坡。先看目前位置哪個方向是下坡,往那裡走一小步;到新位置後再看一次,再走一小步。反覆進行後,就會逐漸靠近損失較小的地方。
我們找的不是斜率最平緩的方向,而是損失會變小的方向,也就是下坡方向。梯度可以想成一支箭頭,告訴你目前位置往哪裡是上坡、坡有多陡;那就往相反方向走一步,損失就會下降。不管是陡坡還是緩坡,重點都是朝會下降的方向前進。
1. 用目前參數做預測
2. 根據正解差距計算損失
3. 找出讓損失下降的方向
4. 把參數稍微移動
5. 再預測一次
公式可以寫成:
$$
新權重 = 舊權重 - 學習率 \times 梯度
$$

梯度表示的是目前位置損失往哪個方向會增加。因為我們想減少損失,所以要往梯度的反方向移動。
把公式拆開看得更仔細一點:新權重是舊權重減去「學習率 × 梯度」。例如目前權重是 0.5,梯度是 +2,學習率是 0.1。梯度 +2 表示若往更大的方向走,損失會增加。這時 0.5 減去 0.1 × 2,也就是 0.2,得到新權重 0.3。因為梯度是正的,所以要往相反方向走;如果梯度是負的,減完之後就變成加,權重會朝相反方向增加。學習率就是決定這一步有多大的數字,後面馬上會講。
梯度下降法調整的不是模型輸出本身,而是產生預測所用的參數。當預測錯了,就計算哪個權重對這個錯誤影響多大,然後稍微調整。
它不會在一次更新中就變完美,而是「預測一點、看錯多少、修一點」,如此反覆。這種「慢慢修正」非常重要。動太大可能會直接跨過低損失區;動太小則可能要很久才會到達好位置。
學習率決定每次更新要移動多大。學習率太大,可能會直接跳過好位置;太小,則學習進度會非常慢。
在前面的更新公式裡,學習率就是乘在梯度前面的那個數,負責決定一步有多大。可以把它想成下坡時的步幅。步幅太大,可能在到達谷底前就衝到另一側山坡,於是一直來回震盪;步幅太小,雖然有在下坡,但要走到谷底會慢到讓人想睡。要找到不大不小的步幅,就是在調學習率。
| 學習率 | 可能發生的事 |
|---|---|
| 太大 | 損失不穩定,甚至發散 |
| 太小 | 學習非常慢 |
| 適中 | 損失穩定下降 |

從這裡開始,機械學習就不只是數學,實驗技巧也非常重要。理解理論之後,還要看學習曲線與驗證資料表現來調整。
學習率通常是初學時最容易卡住的超參數之一。太大時損失不但不會下降,反而上下亂跳;太小時雖然在下降,但速度很慢,性能久久上不去。
近年的深度學習也常會使用學習率排程,也就是在訓練過程中改變學習率。可理解為前期用較大的步幅先找大概位置,後期再用較小步幅做精細調整。
在訓練時,資料會被反覆使用來更新參數。把整個訓練資料集完整跑過一輪,叫做一個 epoch。若有 1000 筆資料全都用過一次,就是 1 個 epoch。
雖然也可以一次把全部資料拿來更新,但資料太大時計算會很重。因此會把資料切成小塊來更新,這個小塊叫做 batch;用較小單位進行更新的方法,叫做 mini-batch 訓練。
例如有 1000 筆資料,每 100 筆分成一塊,共分成 10 塊,則每塊更新一次,共會更新 10 次。這 10 次剛好把全部資料跑過一輪,也就是 1 個 epoch。下圖說明了 1000 筆資料分成 10 個 mini-batch,依序更新後形成 1 個 epoch 的流程。

batch size 較小時,更新會稍微抖動,但可以用較少記憶體計算;batch size 較大時,梯度變動通常較小,但需要更多記憶體。不過 batch 越大不代表一定越快、性能也一定更好。深度學習中,學習率、batch size、epoch 數的組合,連同硬體效率,都會大幅影響結果。
學習曲線是觀察損失或準確率隨著訓練進行如何變化的圖表。把訓練資料與驗證資料的損失一起看,就能判斷模型是不是真的變好了,還是已經過擬合。
| 狀況 | 訓練資料 | 驗證資料 | 可能原因 |
|---|---|---|---|
| 兩者都差 | 差 | 差 | 模型太簡單、特徵不足 |
| 訓練好、驗證差 | 好 | 差 | 過擬合 |
| 兩者都好 | 好 | 好 | 目前是良好狀態 |
圖中會把訓練損失與驗證損失兩條線放在一起。前期兩者通常一起下降,但某個時間點後,驗證損失可能開始上升。這就是過擬合的開端;若持續訓練,正式使用時的表現反而會變差。當驗證損失最低時附近停止訓練的技巧,叫做早停(early stopping)。

機械學習不是訓練一次就結束。要一邊看學習曲線、評估指標、誤分類案例、離群值與特徵量,一邊判斷該從哪裡修正。
在最佳化中,從哪裡開始也會影響結果,這就叫做初始值。像線性迴歸這種簡單問題通常影響不大,但在深層神經網路裡,初始值會改變學習進程。
損失函數的形狀不一定總是漂亮的碗狀,可能會有很多個谷底。某個位置雖然比周圍低,但不一定是全局最低,這種點叫做局部解。
另外還有鞍點。這種地方某個方向是下坡,另一個方向卻是上坡。深度學習不只要面對局部解,也要穿越這種複雜地形。
想像一下山區地形:你明明想走到最低的那個谷底,也就是全局最小損失的位置,但途中可能在一個較淺的谷底卡住,這就是局部解。鞍點則像馬鞍一樣,前後看是下坡,左右看卻是上坡,是很平、很容易迷路的位置。下圖把損失地形當作從上方看的地圖,展示不同初始值會走出不同路徑。

所以在最佳化時,損失變化、驗證性能、學習率、初始值、batch size 都要一起看,不能只看單一數字。
在分類中,模型會預測類別。例如垃圾信判定,就是要選垃圾信或正常信。
分類模型有時會輸出機率,或是代表屬於某個類別的分數。例如垃圾信機率是 0.8,就表示它很像垃圾信。
| 預測值 | 判定 |
|---|---|
| 0.8 | 垃圾信 |
| 0.3 | 正常信 |
從哪裡開始算垃圾信的界線,就是門檻(threshold)。如果門檻設為 0.5,那 0.5 以上就是垃圾信,0.5 以下就是正常信。
門檻當然不一定是 0.5。若想減少漏掉垃圾信,可以把門檻降到 0.3;若不想把正常信誤判成垃圾信,就可以把門檻提高到 0.8。
而且門檻不必重新訓練模型就能調整。模型本身不變,但在不同時期可以依需求調低以減少漏判,或調高以減少誤判。下圖顯示同樣的一組預測機率,門檻從 0.5、0.3 到 0.8 變動時,哪些會被判為陽性的差別。

也就是說,分類模型的輸出不只有「類別名稱」,也可以和「像機率的數值」一起看,這對實務判斷很有幫助。
羅吉斯迴歸是分類裡很常見的基本模型。雖然名字有「回歸」,但實際上常用來做分類,確實很容易混淆。
線性迴歸是直接預測數值;羅吉斯迴歸則是先把輸入變成一個分數,再轉成 0 到 1 之間的值。只要落在 0 到 1,就能像機率一樣使用。
$$
0 \leq 預測機率 \leq 1
$$
把分數轉成 0 到 1 的函數叫做 sigmoid 函數。不必硬背公式,重點是理解它能把任何分數壓進 0 到 1 的範圍。
羅吉斯迴歸內部會先像線性模型一樣算出分數:
$$
分數 = a \times x + b
$$
分數越高,越像正類;越低,越像負類。不過分數本身可能是負數,也可能很大,不適合直接當機率,所以要經過 sigmoid 轉換。
sigmoid 的 S 型曲線也有其意義:當分數接近 0 時,輸出變化最大;當分數很大正或很大負時,輸出會接近 1 或 0,變化變小。這種行為很像人類在有把握時會說得很肯定,沒把握時會落在中間值。下圖示意了把分數轉成 0 到 1 機率,再用門檻決定陽性的流程。

羅吉斯迴歸雖然簡單,卻是分類的根基。機率、門檻、交叉熵、精確率、召回率這些概念都能串起來。
分類當然不只有二選一。像把圖片分成狗、貓、鳥、車其中一類,就是多類別分類。這類問題會對每個類別輸出一個類似機率的值,然後選最高的那個。
| 類別 | 預測值 |
|---|---|
| 狗 | 0.10 |
| 貓 | 0.75 |
| 鳥 | 0.05 |
| 車 | 0.10 |
像 softmax 這類方法,會把每個類別的分數轉成總和為 1 的機率分布。在 1 筆資料只有 1 個正確答案的多類別分類中,這 4 個機率加起來會等於 1。可以把 softmax 想成把模型輸出的分數整理成「總和為 1」的機率形式。若 sigmoid 是二選一用的轉換,那 softmax 就像是三選一以上的版本。這時候類別之間是共享有限機率的,某一類提高,其他類通常就會下降。若貓是 0.75,剩下的 0.25 就分給其他類別。圖中會選最高的貓作為預測結果;下方也附了一個最高值只有 0.35、讓模型自己也不太確定的例子。

在這個例子裡,模型會選貓作為結果。但貓 0.75 和貓 0.35 的意義完全不同:前者比較有信心,後者可能還在猶豫。除了看最高機率是哪個類別,也看它有多有把握,能幫助找出模型不穩定的情況。
在二元分類中,改變門檻會改變模型的行為。像垃圾信判定,如果把門檻調低,會抓到更多垃圾信,但也更容易把正常信捲進去;如果門檻調高,誤判會減少,但可能漏掉更多垃圾信。