機器學習演算法
截至目前為止,我覺得還是沒有其他對機器學習演算法的定義比得上 Tom Mitchell 的版本,更簡短的版本解釋能力不足、篇幅更長的版本不夠精練,在解釋能力與精練程度上,這段話現階段居於各種版本定義之首,Well…it is definitely “In My Humble Opinion.”
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.
Tom Mitchell
一段具備預測數值、預測類別或挖掘特徵的電腦程式(也就是我們日常俗稱的模型),應該符合「三個要素」、「一個但書」的特性。其中,三個要素依序為經驗(Experience)、任務(Task)與效能評估(Performance measure);一個但書(Condition)則為隨著歷史資料觀測值數量增加,在其他條件不變前提下模型的表現應該要變得更優秀,也就是預測的誤差降低、挖掘資料特徵的能力提升。
對於 Tom Mitchell 有興趣的讀者,可以觀看他的 Wikipedia 頁面:https://en.wikipedia.org/wiki/Tom_M._Mitchell,或者他在卡內基美隆大學(Carnegie Mellon University, CMU)的頁面:https://www.cs.cmu.edu/~tom。
任務
機器學習演算法的需求、動機源自於軟體工程師在撰寫程式解決現實世界的問題時,碰到了「固定程式」難以解決的問題,因此尋求能夠讓電腦程式基於如人工智慧一般的能力來面對這類型問題,常見的機器學習任務有多種:
分類(Classification):分類任務會要求電腦程式產生一個函數,這個函數能夠將輸入的資料歸屬成為 k 類別中的其中一個,輸出的資料為離散的形式,例如物件辨識、貸款申請核准與否或疾病診斷陰性陽性等。
\(f: \mathbb{R}^n \rightarrow \{ 1, ..., k \} \)迴歸(Regression):迴歸任務會要求電腦程式產生一個函數,這個函數能夠將輸入的資料預測某個數值,輸出的資料為連續的形式,例如貸款核准金額、金融商品價格預測或房屋成交價格預測等。
\(f: \mathbb{R}^n \rightarrow \mathbb{R}\)轉錄(Transcription):轉錄任務會要求電腦程式產生一個函數,這個函數能夠將輸入的非結構化特徵(Unstructured features)轉換為離散的文字格式,例如光學字元辨識(Optical Character Recognition, OCR)或語音辨識。
機器翻譯(Machine translation):機器翻譯任務會要求電腦程式產生一個函數,這個函數能夠將輸入語言的文字符號序列轉換成另一種語言的文字符號序列。
結構化輸出(Structured output):結構化輸出任務會要求電腦程式產生一個函數,這個函數能夠將輸入的非結構化特徵轉換為有效、能夠被自然語言理解的文字格式,例如影像標註(Image captioning)、詞性標註。
異常偵測(Anomaly detection):異常偵測任務會要求電腦程式產生一個函數,這個函數能夠將輸入一組事件序列輸出為異常標記,例如信用卡詐欺偵測。
合成與抽樣(Synthesis and sampling):合成與抽樣任務會要求電腦程式產生一個函數,這個函數能夠將輸入的資料輸出特定類型的格式,例如語音合成能夠從提供的文字輸出一段與該文字相符的語音,目前我們在 Medium 看到每一篇英文文章都有語音合成的功能,將文章轉換為有聲書形式。
遺漏值填補(Imputation of missing values):遺漏值填補任務會要求電腦程式產生一個函數,這個函數能夠將輸入的遺漏值資料輸出其預測值。
去雜訊(Denoising):去雜訊任務會要求電腦程式產生一個函數,這個函數能夠將輸入的混雜樣本輸出為預測純淨樣本,或更廣泛地輸出預測條件機率分佈。
\(\begin{gather} f: \tilde{x} \rightarrow x \\ f: \tilde{x} \rightarrow p( x | \tilde{x} ) \end{gather}\)密度估計(Density estimation)或機率質量函數估計(Probability mass function estimation):密度估計任務會要求電腦程式產生一個函數,這個函數能夠將輸入的連續資料輸出為機率密度函數,或者將輸入的離散資料輸出為機率質量函數。
\(p : \mathbb{R}^n \rightarrow \mathbb{R} \)
效能評估
當電腦程式依照程式設計者(包含軟體工程師、資料科學家或資料分析師等)的要求順利產生了一個函數,下一步自然要針對這個函數是否能達成任務、能達成多少制定衡量的尺度。對於分類、轉錄等任務而言,常用來做效能評估的是準確率(Accuracy)或者誤差率(Error rate),兩者都是以介於 0 與 1 之間的比率計算,因此又稱為預期的 0-1 損失(Expected 0-1 loss),本質上準確率與誤差率是相同的概念,前者是正面表列而後者是負面表列,如此而已。
對於迴歸、密度估計等任務而言,常用來做效能評估的則是平均平方誤差(Mean squared Error, MSE)或者平均對數機率。
機器學習演算法的效能評估著重在「先前沒有遇過」的資料,因此作為效能評估時所使用的測試資料集(Test data)跟訓練機器學習演算法的訓練資料集(Train data)是分開的。效能評估的概念看似簡單、直觀,但是在評估的過程常會遭遇到許多需要抉擇的場景,例如異常偵測任務面對的輸出分佈有極大的落差,是否能夠使用與輸出分佈相對均勻的分類任務同樣的效能評估度量方式?
經驗
機器學習演算法大致上分為非監督式(Unsupervised)或監督式(Supervised),兩者的差異就在於訓練過程中所使用的訓練資料集類型之不同,資料集(Dataset)是許多樣本的集合,而樣本也稱為資料點(Data points)。
年代最久遠的資料集之一是家喻戶曉的鳶尾花(Iris dataset),由 150 株鳶尾花不同部位的數值測量集合而成作為特徵,包含三種不同的物種:Setosa、Versicolor 與 Virginica 集合而成作為目標。
from sklearn.datasets import load_iris
iris = load_iris()
print(iris.data)
print(iris.target)
print(iris.feature_names)
print(iris.target_names)
描述資料及的常見方法是使用設計矩陣(Design matrix),每列對應不同特徵、每欄含有不同樣本的矩陣,例如鳶尾花資料集包含 150 個樣本,每個樣本有四個特徵,因此我們就可以描述一個設計矩陣來表示該資料集。
print(iris.data.shape)
然而若要將資料集描述為設計矩陣,必須將每個樣本都描述成相同長度的向量,這在實務上並非一件容易的事情,例如資料集是不同長、寬、解析度的影像,就不能以相同長度的向量描述,必須要改描述為含有 m 個元素的集合。
非監督式學習演算法涵蓋資料集的特徵部分,而監督式學習則涵蓋資料集的特徵與目標部分。具體來說,非監督式學習演算法試圖在觀測隨機向量 x 之後,學習其中的機率分佈 p(x)。
而監督式學習演算法則試圖在觀測隨機向量 x 以及其對應向量 y 之後,學習透過估計 p(y | x) 從而達成由 x 預測 y。
傳統上,機器學習領域的人們將迴歸、分類與結構化輸出歸納為監督式學習;將密度估計或機率質量函數估計歸納為非監督式學習。此外,也有其他變異型的學習演算法,例如在半監督式學習(Semi-supervised learning)某些樣本涵蓋目標、其他樣本則沒有涵蓋。
第四十週約維安計畫:機器學習基礎來到尾聲,希望您也和我一樣期待下一篇文章。對於這篇文章有什麼想法呢?喜歡😻、留言🙋♂️、訂閱📨或者分享🙌
約維安計畫學員專區
約維安計畫學員可以點選下列連結將本篇文章完整的 Google Colab 複製到自己的 Google Drive 之中。