万维百科粤语版

機械學習

跳去導覽 跳去搵嘢
機械學習大致上可以想像成拉曲線:部電腦內部有個數學模型(可以用條線表達)代表佢心目中唔同變數之間嘅關係,ML 演算法就係教部電腦點按數據建立同改變自己心目中嘅數學模型[1]
一個人工神經網絡嘅抽象圖解;人工神經網絡係機械學習上常用嘅數學模型。
機械人都可以曉學習,呢段片顯示一班機械人慢慢噉學識一齊合作推郁物件。

機械學習粵拼gei1 haai6 hok6 zaap6英文machine learning,簡稱「ML」)係人工智能嘅一個子領域,專門研究點樣設計一啲特殊嘅演算法統計模型,嚟去教電腦喺唔使個用家開口俾明文指示嘅情況下,學識有效噉樣做一啲特定嘅作業。機械學習嘅典型做法如下[2][3]:p. 2

  1. 編寫一個程式,教部電腦點樣由數據嗰度建立一個數學模型嚟描述佢對啲變數之間嘅關係嘅知識;
  2. 搵啲樣本數據(即係所謂嘅「訓練數據」)返嚟,俾個程式處理吓啲數據入面嘅個案,等部電腦按個程式建立一個數學模型;跟住
  3. 喺將來再撞到同類個案嗰時,部電腦就會曉按佢個程式,用建立咗嗰個模型,對呢啲之前未見過嘅個案作出預測-個設計者唔使明文噉教部電腦點樣應對呢啲前所未見嘅個案,部電腦都會有能力一定程度上應對。

機械學習演算法做嘅嘢係令部電腦曉「用手上資訊,自動噉預測某啲特定嘅變數嘅數值」,所以機械學習嘅技術可以將「做預測」呢家嘢自動化,而因為「做預測」呢家嘢喺好多領域都會用到,機械學習可以有好多實用價值,例如係[4]

  • 醫療:機械學習可以用嚟教電腦由手上嘅醫療數據,學識邊啲病徵同邊啲病症有關,所以可以攞嚟幫手診斷病人(用「手上病人嘅病徵」預測「佢有乜嘢病」)[5]
  • 金融:機械學習上有技術可以教電腦由手上嘅金融(例如係之前嗰幾個月嘅股價)嚟預測打後股價會點變化,呢點喺金融業上可以幫手做預測[6]
  • 市場學:機械學習可以用嚟教電腦由過去有關唔同產品嘅銷售量嘅數據,預測將來(間公司想出)嘅同類產品嘅銷售量[7]

... 等等。

機械學習同數據科學(data science)好有關係,例如係做數據探勘(data mining)噉,就可以涉及教部電腦點樣搵出數據當中嘅規律,令到部電腦曉自動化噉探勘一啲人手好難分析嘅數據,由呢啲數據嗰度抽取有用嘅資訊,而因為「由數據抽取資訊」呢樣嘢基本上無論乜嘢科學商學領域都會用到,所以機械學習對於好多領域嚟講都係一種好有用嘅技術[8][9]

概論

定位

機械學習呢個領域嘅定義如下[10]

英文原文:"A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P if its performance at tasks in T, as measured by P, improves with experience E."
粵文翻譯:如果一個電腦程式能夠喺一樣或者一類工作 T 上嘅表現-而表現以 P 呢個指標嚟量度-隨住經驗 E 而改進嘅話,噉呢個程式就可以稱得上係「有由經驗 E 嗰度對工作 T 同表現量度指標 P 作出學習」(而機械學習就係指研究點樣幫電腦程式做呢樣嘢嘅領域)。

上述呢個定義避免咗一啲歧義性嘅問題:英國數學家亞倫圖靈(Alan Turing)對於人工智能曾經問過「機械有冇能力思考?」呢條問題,所以有人提出將人工智能(包括機械學習)定義為「研究點樣令機械思考」嘅領域。但呢個定位俾好多科學家嫌佢含糊得滯(例如「思考」呢個詞應該要定義就經已好摎攪[11]),所以研究機械學習嘅科學家一般唔主張用呢個詞定義一個領域;而相比之下,上述嘅定義唔使依賴啲乜嘢零舍含糊嘅詞語-呢個定義衹係要求電腦程式有類似人類噉嘅行為,所以俾人覺得比較適合用嚟做成個科學領域嘅定位[11]

理論

一個常態分佈嘅圖解;X 軸表示研究緊嗰個變數,而 Y 軸反映咗每個變數出現嘅頻率。
睇埋:運算學習論

一個學習者(無論係機械定係人類)嘅主要目的係要將經驗普遍化(generalize)[12]-由經歷過嘅嘢當中抽取嗰啲嘢普遍具有嘅特性,並且用呢啲資訊嚟解難,例如一個人喺俾隻咬過之後,可能會產生「狗普遍傾向會咬人」嘅諗頭,並且從此之後傾向避開狗(將「呢一隻狗會咬我」普遍化成「狗普遍都會咬我」)。機械學習都係同一道理:做機械學習會俾一部電腦處理一啲數據,再要部電腦對於一啲佢之前未見過嘅同類個案作出預測,好似係一啲金融上會用嘅機械學習程式噉,設計者嘗試教部電腦用「過去嘅股價數據」預測「將來嘅股價」(將「我處理過嗰啲股票嘅股價變化法則」普遍化做「股票股價變化起上嚟普遍會跟從嘅法則」)[3][13]

用行話講嘅話,呢個過程如下:學習用嘅數據係出自一個有特定概率分佈(probability distribution)嘅現實,而假設柞數據係大致上準確噉代表到嗰個現實嘅概率分佈嘅(柞數據嘅概率分佈同個現實嘅近乎一樣),噉個機械學習程式就要靠佢嘅演算法加埋啲數據砌返個合乎現實嘅數學模型出嚟[14]

舉個例說明:想像家陣有一個常態分佈(normal distribution;睇圖),佢 X 軸表示研究緊嘅變數,而 Y 軸反映咗每個變數值出現嘅頻率,例如如果 X 軸代表「人類嘅身高」,噉個常態分佈表達嘅嘢如下:人類嘅身高最常喺中間嗰個數值(嗰個數值出現率最高),而距離中間嗰個數值愈遠嘅身高值就出現得愈少(好少有極高或者極矮嘅人)。個常態分佈條線會有一條相應嘅數學式。而家假想個常態分佈代表住全人類嘅身高,跟住研究者抽一個樣本,例如係搵 500 個人類返嚟,量度佢哋嘅身高。喺最理想嘅情況之中,個樣本會完美噉代表到人類總體嘅身高分佈-即係話如果將個樣本入面嘅「身高值」同「每個值出現嘅率」畫條線,條線嘅形狀會同總體人類嗰條完全一個板。而如果家陣話要訓練一個機械學習程式,去靠個樣本嘅數據學習人類嘅身高分佈,個程式要做嘅嘢就係由啲數據嗰度,砌返一個代表到人類總體身高分佈嗰條線嘅數學式出嚟(睇埋統計學[3]

運算學習論(computational learning theory)係專門研究機械學習演算法嘅表現嘅電腦科學子領域。呢個領域會用到大量嘅統計學技巧分析機械學習所要面對嘅問題,例如係喺抽樣本嘅過程當中,一般都假設咗個樣本代表到所研究嘅總體(例:「手上嘅股票嘅行為」大概正確噉反映到「古往今來所有嘅股票嘅行為」),而呢個假設喺最嚴格嘅邏輯基準嚟睇查實並唔正確(「我見過嘅天鵝都係白色」唔代表「古往今來嘅天鵝冚唪唥都係白色」)。因為呢啲原因,雖然話事實經已說明咗,機械學習喺實用上表現好好,但喺理論上機械學習嘅原理查實唔係冇漏洞嘅,所以研究運算學習論嘅科學家就要去思考呢啲問題[15]

基本流程

喺實用上,機械學習嘅流程基本上如下[16]

  1. 搜集數據:用某啲方法搜集一啲描述緊要預測嘅現象嘅數據,並且以某啲形式(例如係一個表)呈現啲數據,數據嘅質同量會影響最後個模型嘅準確性;
  2. 事前處理數據:處理吓啲數據先,清走啲會擾亂機械學習演算法嘅嘢,好似啲缺失數據(missing data)呀噉;
  3. 揀一個演算法:機械學習可以用好多唔同嘅演算法嚟做,唔同演算法各有利弊;
  4. 訓練個 ML 程式:將啲數據輸入去個程式嗰度,等佢按自己嘅演算法建立一個模擬個現象嘅數學模型,個數學模型會有若干個參數(parameter,);
  5. 評估個 ML 程式:用某啲指標評估個程式學得有幾好,通常嘅做法係要個程式對佢未見過嘅數據進行預測,再睇吓佢預測得準唔準;
  6. 執吓啲參數:執吓個程式啲參數(例如係學習率或者係初始化嘅數值等),睇吓呢啲改變可唔可以再改善個程式(可以睇吓最佳化[註 1]
  7. 作出預測:用個程式對現實世界嘅現象進行預測。
參數 p
誤差率
最佳選擇
X 軸表示個模型啲參數,而 Y 軸表示某個量度個模型「有幾好」嘅指標;假想而家用緊嗰個指標係數值愈低愈好嘅(例如誤差率),一個理想嘅學習演算法會將啲參數變成「最佳選擇數值」(誤差率數值最低化)嘅數值。

事前數據處理

一個典型嘅數據庫;當中每一個直行代表一個變數,每一個橫行代表一個個案,個數據庫會有每個個案喺各變數上嘅數值。
內文: 事前數據處理

事前數據處理(data preprocessing)係攞到數據之後要做嘅第一個步驟。喺搜集數據嘅過程之後,個研究者手上會有一個數據庫,個數據庫嘅數據包含咗每一個個案喺每個變數上嘅數值。現實嘅搜集數據過程都係唔完全受控嘅,所以搜集到嘅數據幾乎梗會出啲錯,例如係某幾個個案喺某個變數上嘅數值量度唔到(即係所謂嘅缺失數據)或者有啲擺明冇可能嘅數值(例:有個個案喺「年齡」呢個變數嘅數值係負數),等等。呢啲噉嘅數據直接攞去分析嘅話好多時會搞到個程式出錯,所以做機械學習嘅人喺開始俾個程式做學習之前往往會做啲事前處理先。另一方面,做事前數據處理又會涉及「將啲數據轉化成要用嘅機械學習能夠處理嘅格式」等嘅工序[17][18]

例子碼

以下係一段用 Python 程式語言寫嘅源碼,用途在於將啲數據重新縮放成 0 至 1 之間嘅數值(將每個變數,最大嘅數值設做 1,最細嘅數值設做 0,而喺中間嗰啲數值就按比例變成 0 至 1 之間嘅實數)。噉樣做係因為,有某啲機械學習演算法需要數據係 0 至 1 之間嘅數先至行得到[19]

# Python code to Rescale data (between 0 and 1) 
import pandas 
import scipy 
import numpy 
from sklearn.preprocessing import MinMaxScaler 
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data" # 指定一個網址
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] # 指定每個變數嘅名
dataframe = pandas.read_csv(url, names=names) # 由網址嗰度攞數據。
array = dataframe.values # 將數據擺入去屬於個程式一個 array 嗰度。
  
X = array[:,0:8] # X 呢個 array 包含咗用嚟做預測嘅變數。
Y = array[:,8] # Y 呢個 array 包含咗要預測嘅變數。

# 將 X 入面嘅數字重新縮放。
scaler = MinMaxScaler(feature_range=(0, 1))
rescaledX = scaler.fit_transform(X) 
  
# 將做完縮放嘅嗰柞數據 show 出嚟睇。
numpy.set_printoptions(precision=3) 
print(rescaledX[0:5,:]) 

# 跟住打後嘅碼就會開始做學習過程。

數學模型

睇埋:知識表示

喺準備好啲數據之後,個機械學習程式就要建立一個數學模型。佢要將數據當中嘅某啲變數做輸入,然後用佢內部嘅數學模型計個佢預想嘅輸出出嚟(「預想輸出」係啲輸入嘅函數)。喺最簡單嘅監督式學習裏面,個程式跟住會計吓,用佢個數學模型()計嘅「預想輸出」同實際嘅輸出差幾遠,按照呢個誤差調較自己個數學模型嘅參數( 係第 個參數),