機械學習縮圖.png

前言

晚上好,我是原本超級文組(ゴリ文)的 miruky。

一提到機械學習,半年前的我會立刻產生「咦——」的排斥反應。因為我一直以為那是大學裡主修 CS(電腦科學)的人才碰的領域,再加上先入為主地覺得它會不斷冒出複雜數學式。不過實際學下來,雖然在大學、研究所的學術層級確實可能如此,但入門階段其實不需要太複雜的數學也能理解。

本文會從機械學習的全貌,一路整理到生成式 AI 的最新研究,讓剛開始學的人也能看懂。雖然會用到一點數學式,但我會盡量把式子的意思翻回中文,讓只要還記得國中代數和一次函數就能跟上。

那麼,就讓我們進入機械學習的世界吧!

目錄

  1. 機械學習的全貌
  2. 資料的處理方式
  3. 學習的種類
  4. 用公式確認預測
  5. 損失函數
  6. 最佳化
  7. 分類的想法
  8. 評估指標
  9. 泛化與過擬合
  10. 代表性模型
  11. 神經網路
  12. Transformer 與生成式 AI
  13. 通往現今生成式 AI 的研究脈絡
  14. 學習方法

1. 機械學習的全貌

1-1. 人類寫規則的方法與差異

一般程式會由人類先寫好規則。例如把「分數 80 分以上就及格,80 分以下就不及格」這種規則直接寫進程式碼。

機械學習則不會一開始就把所有規則寫死。它會餵給模型過去的資料,讓模型自己學出趨勢。像租金預測時,模型會根據距離車站的遠近、坪數、屋齡、樓層等資訊,自行調整預測租金的公式或判斷邊界。

這裡所謂的「學習」,和人類理解語意的學習有點不同。模型只是把輸入和答案之間的關係轉成數值並持續調整。白話來說,就是預測錯了就修正一點,又錯了再修正一點,這個過程反覆進行。這很機械化,對吧。

例如,考慮一個把電子郵件判斷成垃圾信或正常信的普通程式,人類會寫下像「如果包含這些字就是垃圾信」「如果來自這個寄件者就有風險」之類的條件與規則。條件少時還能應付,但真實郵件的表達會變、寄件者會變,正常郵件裡也可能出現類似字詞。規則越多,人類維護的負擔就越大。

機械學習則是把大量垃圾信與正常信的例子餵給模型,讓它自己調整邊界。人類通常不會把「每個字詞該怎麼加權」全部手寫出來。大多數情況下,我們是靠直覺在分類。機器則是從資料中,組合出表示「像垃圾信」的數值模式。

當然,機械學習不是什麼都能自動解決。資料品質差,模型就會學到差的傾向;輸入與答案關係很弱的問題,即使用再高級的模型也有極限。機械學習不是把所有規則都消滅,而是把能從資料中調整的部分交給模型處理的技術。

1-2. AI、機械學習、深度學習、生成式 AI

2.png

先來定義一下名詞。其實 AI、機械學習、深度學習、生成式 AI 並不是同一件事,而是範圍大小不同。

名詞 大致意思
AI 用機器處理人類的智慧型工作,範圍很廣的領域
機械學習 從資料中學習規律並做預測的方法
深度學習 使用多層神經網路的機械學習
生成式 AI 能生成文字、圖片、語音、程式碼等內容的 AI

深度學習是機械學習的一部分,而很多生成式 AI 也都是建立在深度學習之上。現在的大型語言模型並不是突然從另一個世界冒出來的技術,而是機械學習的延伸。很多在大學主修 CS、尤其是機械學習的人也常這麼說,這完全沒錯。

1-3. 能做的事與不擅長的事

機械學習也有擅長與不擅長的地方,就像人一樣。它擅長的是利用過去資料中的趨勢,對相似情況進行預測。像需求預測、影像分類、異常偵測、文本分類、推薦系統、語音辨識這類從大量例子中找模式的問題,就很適合。

但如果是過去資料沒出現過的情境、資料蒐集方式改變的情境,或是答案本來就很模糊的情境,它就比較不擅長。比如只靠過去的銷售資料,要精準預測突然的法規變動、天災、社群爆紅潮流,就很困難。模型並不知道未來,它只是使用從訓練資料裡找到的關係。

3.png

另一個重要觀念是:機械學習的輸出通常只是判斷依據,不一定是最終決策。像醫療、金融、招募、資安這類影響重大的場景,不只要看預測值,還要嚴格確認是用哪些資料訓練、會錯多少、錯了會造成什麼影響。

1-4. 模型、演算法、參數

在機械學習入門中,常會出現模型、演算法、參數這些字。它們常一起出現,但角色不同。有些詞和一般直覺的意思會有點落差,這裡要稍微注意。

名詞 意思 租金預測例子
模型 從輸入產生預測的機制 用來預測租金的公式
演算法 訓練模型的方法 讓誤差變小、更新權重的方法
參數 會在訓練中調整的數字 面積、屋齡所對應的權重
超參數 人類先決定的設定 學習率、樹深、epoch 數

模型是負責輸出預測的主體。線性迴歸的模型,是把輸入乘上權重再加總的公式;決策樹的模型,是條件分支的樹;神經網路的模型,則是由許多帶權重的層所組成。

4.png

演算法則是「如何建立與調整這個模型」的步驟。像梯度下降法,就是讓參數朝著損失變小的方向更新的演算法。

參數就是在訓練過程中會改變的數字。以租金預測來說,面積的權重、車站距離的權重、屋齡的權重就是這些參數。相對地,學習率、決策樹最大深度這種由人事先決定的值,就叫做超參數。這些名詞非常重要,請務必趁這個機會記住。

2. 資料的處理方式

2-1. 特徵量與標籤

在機械學習中,作為輸入的資訊叫做特徵量,想要預測的答案叫做標籤。以租金預測為例,輸入資訊如坪數、距離車站遠近、屋齡就是特徵量,而答案租金就是標籤。

5.png

在這個表格中,模型會看坪數、距離車站的遠近、屋齡,來預測租金。模型會學到一些傾向,例如坪數越大租金越高、離車站越近租金越高、屋齡越老租金越低。

不過,沒放進資料中的資訊基本上就學不到。如果日照、治安、裝潢新舊、附近噪音等也會影響租金,那就最好也把它們當成特徵量,預測才會穩定。

如果把資料看成表格,1 列是一個案例,1 欄是一個項目。像房屋 A、房屋 B、房屋 C 是列,而坪數、距離車站遠近、屋齡是欄。在機械學習中,這張表裡用來預測的欄叫做特徵量,要預測的欄叫做標籤。

這種看法對影像和文字也一樣。影像分類時,一張圖片相當於一列,而標籤可以是狗、貓、車等類別。文字分類時,一段文字相當於一列,而標籤可以是垃圾信、客服問題類型、情緒等等。

2-2. 訓練資料、驗證資料、測試資料

6.png

資料分成訓練用與確認用非常重要。若把全部資料都拿去訓練,就無法判斷模型只是把過去題目背起來,還是真的能處理新題目。

資料 角色
訓練資料 用來調整模型
驗證資料 用來挑選模型或設定
測試資料 最後確認性能時使用

測試資料可以想成接近正式考試的資料。若一邊看測試資料一邊修模型,就會變成對測試結果做調整。實務上,比起做出看起來漂亮的數字,更重要的是誠實測出模型在未知資料上的誤差有多大。這部分既重要又困難。

2-3. 前處理與資料洩漏

但現實資料往往不能直接拿來訓練。常會遇到空值、格式不一致、單位混雜、類別名稱不統一、離群值等問題。也就是資料很髒。

作業 內容
缺失值處理 補空值,或刪除列、欄
標準化 統一數值尺度
類別轉換 把文字類別轉成數字
離群值確認 判斷極端值要不要直接使用

特別要注意的是資料洩漏。這是指原本在預測時點不應該知道的資訊,混進了訓練資料。比方說在流失預測中,把「流失後才知道」的欄位當成特徵放進去,訓練時成績會很好看,但實際上無法使用。

7.png

在機械學習裡,資料的做法和模型選擇一樣重要。即使模型看起來很聰明,若只是偷偷看到了未來資訊,實務上也不會有用,這點應該不難想像。

2-4. 特徵量設計

特徵量設計,就是把要餵給模型的資訊設計出來。同樣的原始資料,特徵量做法不同,性能就可能差很多。以租金預測來說,不只可以用距離車站本身,也可以加上最近車站的路線數,把屋齡分成新成屋、屋齡淺、老屋等區間,或是建立「坪數 × 車站距離」這種組合特徵。

再強調一次,特徵量設計時不能直接把答案丟給模型。像流失預測中,把流失日、解約原因這種只有流失後才知道的資訊放進去,訓練分數就會虛高。這就是前面提過的資料洩漏。

而且特徵量不是越多越好;太多無關特徵會讓模型連偶然關係都學進去。如果在訓練資料上看起來很好,但在未知資料上表現變差,就要懷疑特徵量設計是否有問題。

2-5. 數值、類別、文本、影像

機械學習處理的資料有幾種型態。數值資料很多時候可以直接使用,但類別、文本、影像在丟給模型前通常要先轉成數字。

資料類型 例子 轉換想法
數值 年齡、價格、距離 做標準化或檢查離群值
類別 地區、職業、方案名稱 以 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 大。

9.png

文本與影像還需要更進一步的轉換。文章會轉成 token 或嵌入向量,影像則會處理成像素值或神經網路中的中間表示。使用哪種轉換,會影響模型能抓到什麼資訊。

2-6. 標籤的製作方式

複習一下,標籤就是想要預測的答案。不過在真實資料裡,標籤本身怎麼定義有時很難。

像流失預測,就必須決定「多少天內沒來算流失」。購買預測中,用點擊代替購買可不可以,還是只能看真正購買,意思都不一樣。客服分類時,不同承辦人員對類別的判定也可能不同。

10.png

標籤基準如果不穩定,模型就會學到不穩定的答案。模型準確率提不上去時,問題有時不是演算法,而是標籤的定義或標註方式。對機械學習來說,製作正確答案的工作本身也是設計的一部分。

3. 學習的種類

3-1. 監督式學習

這一段應該很多人都聽過。監督式學習是從「輸入+正解」的配對資料學習的方法。像銷售預測、租金預測、影像分類、垃圾信判斷等都很常用。你可以把它想成老師把題目和答案一起教給你,這樣比較容易記住。

任務 輸入 正解
租金預測 坪數、車站距離、屋齡 租金
垃圾信判斷 郵件本文、寄件者 是否為垃圾信
影像分類 圖片 狗、貓、車等

如果正解是數值,叫做迴歸;如果正解是類別,叫做分類。預測租金、銷售額這種數值,就是迴歸;判斷是垃圾信還是正常信,就是分類。

迴歸可以理解成「直接預測數值」的任務,例如租金是 9 萬還是 11 萬、下個月營收是 100 萬還是 120 萬,這類連續量的預測。分類則是「屬於哪一群」的任務,例如狗或貓、垃圾信或正常信。只要先記住:同樣是監督式學習,但答案是數字還是類別,名稱就不同。

11.png

監督式學習因為有正解,所以能建立評估標準;但相對地,製作正解資料也需要成本。像是為圖片標註狗、貓、車,替客服訊息標上類別,或為語音加上逐字稿,都需要人類判斷。

此外,監督式學習很依賴過去的正解。如果過去的判斷有偏差,模型也會把偏差學進去。像招募、審核、授信這種會用到人類判斷紀錄的場景,就必須確認過去資料是否真的代表理想的判斷。

3-2. 無監督式學習

無監督式學習是在沒有正解標籤的情況下,尋找資料結構的方法。像是把顧客依購買傾向分群、把文章依主題整理、找出異常資料等等。跟前面不同的是,這裡沒有老師先告訴你答案,所以要自己找出模式。

代表例子就是分群(clustering)。分群會根據資料彼此之間的相似程度,把資料分成幾群。即使人類事先沒有給 A 群、B 群的答案,模型也能把相似的東西聚在一起。

12.png

在無監督式學習裡,結果的解讀很重要。即使分成 3 群,也不代表那 3 群在業務上就有意義。若是購買傾向的分群,就要再確認每群常買什麼商品、是否有年齡或地區偏差等。

降維也是無監督式學習的代表。它會在盡量保留資訊的前提下,把大量特徵量整理成較少的軸。這常用於高維資料視覺化或減少重複資訊。

順帶一提,降維就是把很多欄位(特徵量)在盡量保留意思的情況下,整理成較少的軸。比如你有數學、物理、化學、國文、社會、英文 6 科成績時,可能只用「偏理組還是偏文組」和「整體強不強」兩個軸,就能大致看出趨勢。把 6 欄變成 2 欄,但重要差異仍保留,這就是降維的感覺。欄位少了之後,圖也比較好畫、好看;某些方法與資料下,也可能減少重複資訊或雜訊。不過重要資訊也可能一起被捨棄,所以不是降得越多越好。

3-3. 強化學習

這裡開始就有點複雜了。強化學習是根據行動後得到的回饋,學習更好的行動方式的方法。遊戲 AI、機器人控制、廣告投放、推薦系統,最近甚至大型語言模型提升推理能力的研究也會用到。關鍵字就是「給獎勵」。

在強化學習裡,答案不一定一開始就排好。你先選一個行動,收到結果,再調整下一步。它不是像考試一樣直接批改,而是透過不斷嘗試,朝著獎勵增加的方向前進。像你對狗狗說「坐下」,如果狗狗真的坐下了,就給牠零食(獎勵)這種概念。狗狗會學到:當主人說坐下時,做出指定動作就會得到零食。就是這種感覺。

強化學習常出現的詞有代理人、狀態、行動、報酬、策略。雖然有點繞,但名詞上來說:代理人是執行行動的主體,狀態是目前情況,行動是可選操作,報酬是結果分數,策略則是在各種狀態下選哪個行動的規則。

名詞 意思 遊戲例子
代理人 執行行動的主體 玩家 AI
狀態 目前情況 場面、HP、位置
行動 可選操作 移動、攻擊、防禦
報酬 行動結果的分數 勝利、得分、傷害
策略 行動選擇方式 這個局面就攻擊

13.png

強化學習難的地方在於,眼前看起來有利的行動,長期可能反而不利。只追眼前得分,之後可能會輸;如果不探索,就找不到更好的策略。最近的推理模型中,強化學習也跟答案驗證與思考流程改善有關。

3-4. 自我監督式學習

在理解最近的大型語言模型時,自我監督式學習也很重要。這種方法不需要人類一筆一筆人工標註正解,而是直接拿資料的一部分當作答案來學習。因為是自己扮演老師,所以叫自我監督式。

對文章來說,可以用前文預測下一句,或把句子的一部分遮住,再從上下文還原。因為可以直接從原文產生問題與答案,所以非常適合用來做大量文本的預訓練。看到這裡,應該有人會有「喔,原來如此」的感覺。沒錯,就是 token 的機制。token 是把文章切成小單位的東西,細節會在第 12 章說明。先要理解的是:它其實是在用文章本身來做「預測下一個字」這種題目。這種不必另外人工準備答案,而是由資料本身自動生成問題與答案的機制,就是後來大型語言模型的基礎。

14.png

這種方法不只減少人工標籤成本,也能從大量資料學到更通用的表示。大型語言模型就是透過這種預訓練學會語言規律,再進一步接受指令回應與對話調整。

自我監督式學習除了能降低標籤成本,也常用來學習通用表徵。文字可以學到詞與詞之間的關係、上下文脈絡;影像則可以透過遮住一部分再還原、讓同一張圖的不同變形彼此接近等方式學習。

在這個階段學到的表示,可以拿去做後續任務。比方說,以預訓練語言模型為基礎,再調整成客服分類、摘要、聊天回應、程式碼生成。大型模型的強大之處,不是只學單一任務,而是先從廣泛資料建立表示,再針對用途做調整。

4. 用公式確認預測

4-1. 當作一次函數

機械學習的入口可以從一次函數開始。這就是國中數學常見的公式。

$$
y = ax + b
$$

在這個式子裡,x 是輸入,y 是預測結果。a 是斜率,b 是截距。是不是很熟悉。

如果只看坪數來預測租金,可以寫成:

$$
租金 = a \times 坪數 + b
$$

a = 0.2b = 3,而坪數是 30 坪,則租金是:

$$
0.2 \times 30 + 3 = 9
$$

這裡的預測租金就是 9 萬元。實際上只靠坪數還不夠,所以還要加入車站距離與屋齡。

$$
租金 = a \times 坪數 + b \times 車站距離 + c \times 屋齡 + d
$$

雖然字母變多了,但做的事情一樣:把輸入乘上權重後加總,最後再加上一個調整值。

在這裡,坪數車站距離屋齡 就是特徵量;abc 是各特徵量的權重;d 則是把整體上下平移的調整項。

例如,坪數權重大的模型,會讓坪數強烈影響租金;車站距離權重若為負,代表越遠租金越低;屋齡權重若為負,代表越老的物件租金越低。這樣想是不是就很有感了。

15.png

線性模型雖然簡單,但很值得先學。它能讓你用公式看懂預測怎麼來,從權重正負也能看出特徵量影響方向。先用線性模型建立概念,之後再學損失函數與最佳化會更容易,所以才先介紹它。

4-2. 參數是會被調整的數字

公式中的 abcd 這些在訓練中會被調整的數字,就叫做參數。機械學習的訓練,本質上就是把這些參數調整到比較好的值。

如果由人手動決定「坪數對租金影響要大一點、屋齡越大租金要越低,所以權重要是負的」,雖然也能做,但很麻煩。於是就讓模型利用過去資料自己調整。

前面說過,參數和超參數不要混淆。參數是訓練中由模型自己調整的數字;超參數則是訓練前由人決定的設定。

種類 誰決定 例子
參數 訓練中決定 權重、截距、神經網路權重
超參數 人類設定 學習率、epoch 數、樹深

16.png

如果模型表現不好,通常不會直接手動改參數,而是改特徵量、重新檢查訓練資料、換模型或調整超參數。

4-3. 權重的正負與大小

在線性模型中,看權重的正負就能知道特徵量對預測是往哪個方向作用。坪數的權重若為正,代表坪數越大租金越高;車站距離的權重若為負,代表離車站越遠租金越低。

不過,直接比較權重大小有時不安全。因為坪數是坪、車站距離是分鐘、屋齡是年,單位不同。這就像不能直接拿 100 分滿分的考試和 5 分制問卷直接比大小一樣。

因此會用標準化來統一數值尺度。標準化是把數值轉成「離平均有多遠」這種形式。這樣模型就不會被某個單位過大的特徵量牽著走。

17.png

這裡最重要的是:標準化也只能用訓練資料計算。若把測試資料一起拿去算平均與標準差,就會把測試資料資訊洩漏到訓練流程中。

解讀權重時,也要分清楚相關和因果。就算離車站近的物件租金通常比較高,也不能只憑模型權重就斷言「車站距離就是租金上漲的原因」。實際上可能還有商圈、熱門區域集中在車站周邊、屋齡分布不同等其他因素。

機械學習模型學的是資料中的關係。若要證明因果,還需要實驗設計與統計驗證。模型係數可以是很強的線索,但不要直接把它當成原因。

4-4. 殘差

在迴歸中,正解與預測的差叫做殘差。名字聽起來是不是很帥。

$$
殘差 = 正解 - 預測
$$

如果租金正解是 10 萬,預測是 9 萬,殘差就是 1 萬;如果正解是 10 萬,預測是 12 萬,殘差就是 -2 萬。

看殘差可以知道模型偏向往哪裡錯。如果整體殘差偏正,模型可能普遍低估;如果殘差偏負,模型可能普遍高估。

18.png

檢查殘差是改善模型的起點。如果只有某個地區常常出錯、只有老屋常常出錯、只有高租金物件常常出錯,就要回頭檢查特徵量或模型。

5. 損失函數

5-1. 將錯誤量化為數字

損失就是衡量模型預測錯得有多離譜的數字。損失越小,代表預測越接近正解;損失越大,代表離正解越遠。

例如,實際租金是 10 萬,預測是 8 萬,差了 2 萬;預測成 12 萬,也差了 2 萬。兩者外得一樣多,若直接把差值相加,正負會互相抵消。

因此通常會把差平方化。

$$
(正解 - 預測)^2
$$

差是 2 的話,平方後是 4;差是 5,平方後就是 25。這會讓偏差很大的預測受到更重的懲罰。

使用損失函數,是為了把模型好壞變成一個可比較的數字。當有 100 筆預測時,只看每一筆的差異很難判斷哪個模型更好;但如果計算損失,就能比較模型 A 的損失是 10,模型 B 的損失是 6。

19.png

不過損失小不代表一定是好模型。如果只在訓練資料上損失很小,可能就是過擬合。過擬合是指模型幾乎把訓練資料的答案背起來,遇到新資料就變弱。就像考試前只背歷屆試題答案,正式考試題目稍微變一下就答不出來。更詳細內容會在第 9 章說明,這裡只要先記住:不能只相信訓練資料上的小損失,真正要看的是模型在沒看過的資料上損失是否也小。

5-2. 平均平方誤差

這一段先別緊張。平均平方誤差是迴歸常用的損失函數,英文是 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

20.png

因為要平方,所以正負不會互相抵消,而且大的偏差會被放大。這既是優點也是缺點。如果你希望強烈避免大誤差,MSE 很適合;但它也會比較容易被離群值拉著走。

5-3. 分類用的交叉熵

分類問題通常比起 MSE,更常使用交叉熵。名字雖然難,但其實是在衡量「預測機率」和正解差多遠。

熵大致可以理解成「結果有多難預測」,也就是不確定性或混亂程度。像骰子每面機率都差不多時,就很難猜結果,因此熵高;如果幾乎已經確定會出某個結果,熵就低。交叉熵就是把這個概念拿來衡量模型的預測機率與正解之間的差距。正解類別的機率越高,損失越小;如果模型對錯誤類別還很有自信,損失就很大。

例如,若一張貓的圖片,模型預測它是貓的機率是 0.9,那就是很好的預測;如果只給 0.1,就代表明明很確定卻猜錯了,因此會被重罰。

分類時,不只看有沒有猜對,還會看你有多有把握。交叉熵就是把這份把握的方向與大小也算進損失裡。

例如,若正解是貓,模型 A 預測貓 0.51、狗 0.49;模型 B 預測貓 0.99、狗 0.01。兩者最終都會判成貓,但模型 B 對正解類別給了更高機率,因此交叉熵會認為它更好。

21.png

反過來說,如果正解是貓,模型卻非常自信地給出狗 0.99,那就會被大幅懲罰。因為在分類問題中,自信地猜錯是很危險的。像醫療與反詐騙這類場景,機率的解讀會直接影響實際決策。

5-4. 損失函數是目標的翻譯

損失函數決定模型要把什麼視為「好預測」。回歸用 MSE 時,會強烈懲罰大偏差;分類用交叉熵時,則要求對正解類別給出高機率。

如果選錯損失函數,模型會毫不知情地往錯方向最佳化。例如,在反詐騙中如果只最大化正確率,模型可能會學成「幾乎都判正常」就有很高分。但實務上真正需要的是不要漏掉詐騙,而損失或評估指標沒有反映這點,就會出問題。

22.png

可以把損失函數看成把業務上「哪種錯誤比較嚴重」翻成數學語言的工具。損失函數本身不會自己讀懂你的目標,而是人類要先思考:什麼錯誤最麻煩?哪種誤判最重?多大的誤差可以接受?然後再選適合的損失函數與評估指標。

5-5. 損失函數與評估指標的差異

損失函數和評估指標很像,但用途不同。損失函數是訓練時用來調整模型的數字;評估指標則是在訓練後,用來判斷模型好壞的數字。你可以把它想成學習中的計分方式 vs. 考完後的成績單。

項目 使用時機 例子
損失函數 訓練中 MSE、交叉熵
評估指標 評估時 正確率、F1、MAE、RMSE

有時兩者會用同一種,但不一定完全一致。分類可能用交叉熵訓練、用 F1 分數評估;迴歸可能用 MSE 訓練、再看 MAE 評估。

原因是:適合訓練的數字,和人類真正想看的數字,不一定相同。訓練時需要平滑、可微分、能幫助調整參數的損失;實務上則可能更關心漏判數、誤報數、平均誤差、人工審查量等更貼近決策的指標。

下面表中的評估指標,現在先知道名字與用途就好,細節會在第 8 章說明。

  • 正確率:整體有多少筆判對。但資料不平衡時可能不準。
  • F1:把後面會提到的精確率與召回率綜合成一個平衡指標。
  • MAE:看平均誤差有多大,單位和原始數值相同。
  • RMSE:和 MAE 類似,但對大誤差看得更重。

先記住:正確率與 F1 常用於分類,MAE 與 RMSE 常用於迴歸。

6. 最佳化

6-1. 梯度下降法

為了讓損失變小,將參數一點一點往適合的方向移動的方法,就是梯度下降法。Google 的 Machine Learning Crash Course 也把它介紹成一種反覆尋找能讓損失最小的權重與偏置的方法。

你可以把它想成走下坡。先看目前位置哪個方向是下坡,往那裡走一小步;到新位置後再看一次,再走一小步。反覆進行後,就會逐漸靠近損失較小的地方。

我們找的不是斜率最平緩的方向,而是損失會變小的方向,也就是下坡方向。梯度可以想成一支箭頭,告訴你目前位置往哪裡是上坡、坡有多陡;那就往相反方向走一步,損失就會下降。不管是陡坡還是緩坡,重點都是朝會下降的方向前進。

1. 用目前參數做預測
2. 根據正解差距計算損失
3. 找出讓損失下降的方向
4. 把參數稍微移動
5. 再預測一次

公式可以寫成:

$$
新權重 = 舊權重 - 學習率 \times 梯度
$$

24.png

梯度表示的是目前位置損失往哪個方向會增加。因為我們想減少損失,所以要往梯度的反方向移動。

把公式拆開看得更仔細一點:新權重是舊權重減去「學習率 × 梯度」。例如目前權重是 0.5,梯度是 +2,學習率是 0.1。梯度 +2 表示若往更大的方向走,損失會增加。這時 0.5 減去 0.1 × 2,也就是 0.2,得到新權重 0.3。因為梯度是正的,所以要往相反方向走;如果梯度是負的,減完之後就變成加,權重會朝相反方向增加。學習率就是決定這一步有多大的數字,後面馬上會講。

梯度下降法調整的不是模型輸出本身,而是產生預測所用的參數。當預測錯了,就計算哪個權重對這個錯誤影響多大,然後稍微調整。

它不會在一次更新中就變完美,而是「預測一點、看錯多少、修一點」,如此反覆。這種「慢慢修正」非常重要。動太大可能會直接跨過低損失區;動太小則可能要很久才會到達好位置。

6-2. 學習率

學習率決定每次更新要移動多大。學習率太大,可能會直接跳過好位置;太小,則學習進度會非常慢。

在前面的更新公式裡,學習率就是乘在梯度前面的那個數,負責決定一步有多大。可以把它想成下坡時的步幅。步幅太大,可能在到達谷底前就衝到另一側山坡,於是一直來回震盪;步幅太小,雖然有在下坡,但要走到谷底會慢到讓人想睡。要找到不大不小的步幅,就是在調學習率。

學習率 可能發生的事
太大 損失不穩定,甚至發散
太小 學習非常慢
適中 損失穩定下降

25.png

從這裡開始,機械學習就不只是數學,實驗技巧也非常重要。理解理論之後,還要看學習曲線與驗證資料表現來調整。

學習率通常是初學時最容易卡住的超參數之一。太大時損失不但不會下降,反而上下亂跳;太小時雖然在下降,但速度很慢,性能久久上不去。

近年的深度學習也常會使用學習率排程,也就是在訓練過程中改變學習率。可理解為前期用較大的步幅先找大概位置,後期再用較小步幅做精細調整。

6-3. Epoch、批次、小批次

在訓練時,資料會被反覆使用來更新參數。把整個訓練資料集完整跑過一輪,叫做一個 epoch。若有 1000 筆資料全都用過一次,就是 1 個 epoch。

雖然也可以一次把全部資料拿來更新,但資料太大時計算會很重。因此會把資料切成小塊來更新,這個小塊叫做 batch;用較小單位進行更新的方法,叫做 mini-batch 訓練。

例如有 1000 筆資料,每 100 筆分成一塊,共分成 10 塊,則每塊更新一次,共會更新 10 次。這 10 次剛好把全部資料跑過一輪,也就是 1 個 epoch。下圖說明了 1000 筆資料分成 10 個 mini-batch,依序更新後形成 1 個 epoch 的流程。

26.png

batch size 較小時,更新會稍微抖動,但可以用較少記憶體計算;batch size 較大時,梯度變動通常較小,但需要更多記憶體。不過 batch 越大不代表一定越快、性能也一定更好。深度學習中,學習率、batch size、epoch 數的組合,連同硬體效率,都會大幅影響結果。

6-4. 學習曲線

學習曲線是觀察損失或準確率隨著訓練進行如何變化的圖表。把訓練資料與驗證資料的損失一起看,就能判斷模型是不是真的變好了,還是已經過擬合。

狀況 訓練資料 驗證資料 可能原因
兩者都差 模型太簡單、特徵不足
訓練好、驗證差 過擬合
兩者都好 目前是良好狀態

圖中會把訓練損失與驗證損失兩條線放在一起。前期兩者通常一起下降,但某個時間點後,驗證損失可能開始上升。這就是過擬合的開端;若持續訓練,正式使用時的表現反而會變差。當驗證損失最低時附近停止訓練的技巧,叫做早停(early stopping)。

27.png

機械學習不是訓練一次就結束。要一邊看學習曲線、評估指標、誤分類案例、離群值與特徵量,一邊判斷該從哪裡修正。

6-5. 初始值、局部解、鞍點

在最佳化中,從哪裡開始也會影響結果,這就叫做初始值。像線性迴歸這種簡單問題通常影響不大,但在深層神經網路裡,初始值會改變學習進程。

損失函數的形狀不一定總是漂亮的碗狀,可能會有很多個谷底。某個位置雖然比周圍低,但不一定是全局最低,這種點叫做局部解。

另外還有鞍點。這種地方某個方向是下坡,另一個方向卻是上坡。深度學習不只要面對局部解,也要穿越這種複雜地形。

想像一下山區地形:你明明想走到最低的那個谷底,也就是全局最小損失的位置,但途中可能在一個較淺的谷底卡住,這就是局部解。鞍點則像馬鞍一樣,前後看是下坡,左右看卻是上坡,是很平、很容易迷路的位置。下圖把損失地形當作從上方看的地圖,展示不同初始值會走出不同路徑。

28.png

所以在最佳化時,損失變化、驗證性能、學習率、初始值、batch size 都要一起看,不能只看單一數字。

7. 分類的想法

7-1. 機率與門檻

在分類中,模型會預測類別。例如垃圾信判定,就是要選垃圾信或正常信。

分類模型有時會輸出機率,或是代表屬於某個類別的分數。例如垃圾信機率是 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 變動時,哪些會被判為陽性的差別。

29.png

也就是說,分類模型的輸出不只有「類別名稱」,也可以和「像機率的數值」一起看,這對實務判斷很有幫助。

7-2. 羅吉斯迴歸

羅吉斯迴歸是分類裡很常見的基本模型。雖然名字有「回歸」,但實際上常用來做分類,確實很容易混淆。

線性迴歸是直接預測數值;羅吉斯迴歸則是先把輸入變成一個分數,再轉成 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 機率,再用門檻決定陽性的流程。

30.png

羅吉斯迴歸雖然簡單,卻是分類的根基。機率、門檻、交叉熵、精確率、召回率這些概念都能串起來。

7-3. 多類別分類

分類當然不只有二選一。像把圖片分成狗、貓、鳥、車其中一類,就是多類別分類。這類問題會對每個類別輸出一個類似機率的值,然後選最高的那個。

類別 預測值
0.10
0.75
0.05
0.10

像 softmax 這類方法,會把每個類別的分數轉成總和為 1 的機率分布。在 1 筆資料只有 1 個正確答案的多類別分類中,這 4 個機率加起來會等於 1。可以把 softmax 想成把模型輸出的分數整理成「總和為 1」的機率形式。若 sigmoid 是二選一用的轉換,那 softmax 就像是三選一以上的版本。這時候類別之間是共享有限機率的,某一類提高,其他類通常就會下降。若貓是 0.75,剩下的 0.25 就分給其他類別。圖中會選最高的貓作為預測結果;下方也附了一個最高值只有 0.35、讓模型自己也不太確定的例子。

31.png

在這個例子裡,模型會選貓作為結果。但貓 0.75 和貓 0.35 的意義完全不同:前者比較有信心,後者可能還在猶豫。除了看最高機率是哪個類別,也看它有多有把握,能幫助找出模型不穩定的情況。

7-4. 門檻的調整

在二元分類中,改變門檻會改變模型的行為。像垃圾信判定,如果把門檻調低,會抓到更多垃圾信,但也更容易把正常信捲進去;如果門檻調高,誤判會減少,但可能漏掉更多垃圾信。


原文出處:https://qiita.com/miruky/items/42b892805eb1d754109c


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝7   💬2   ❤️4
225
🥈
我愛JS
📝2   💬6   ❤️3
110
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登