機器學習的運作原理
本文說明神經網路是如何學習資料的,這包括探索這個學習過程及其相關的術語,並且評估機器的學習成果。在深入建立 ML 模型之前,讓我們先了解神經網路是如何學習的。
上圖是大家應該都聽過的各類的神經網路詞彙,而它們分別解決不同的問題。所有這些模型都源自最基本的模型:人工神經網路( ANN)。
ANN
ANN 也稱為神經網路或淺層神經網路(shallow neural networks)。讓我們聚焦神經網路的學習方式。 ANN 有三層:輸入層、隱藏層和輸出層(如上圖),而圖中每一個節點代表一個神經元。神經元之間的線路刺激了概要(synopses),這是訊息在人類大腦中傳遞的方式。
上圖中,假設有兩個輸入神經元或節點、一個隱藏神經元和一個輸出神經元。
權重(Weight)保留了神經網路在訓練過程中學習到的資訊,也是神經網路想要探索。第一步是計算加權總和(如上圖)。這是透過將每個輸入值乘以其對應的權重,然後對乘積求和來實現的。
這是透過將每個輸入值乘以其對應的權重,然後對乘積求和來實現的。它通常包含一個偏移分量 bi。不過,為了集中精力於核心思想,現在先忽略它。
第四步是將activation function套用於加權和。此activation function可以與套用於隱藏層的activation function不同。結果是預測的 y,由輸出層組成。哪Activation function是幹嘛用的呢?
它是用於防止線性或添加非線性( prevent linearity or add non-linearity)
如果沒有activation functions,預測結果 y hat 永遠是輸入 x 的線性函數,不管輸入和輸出之間有多少層。
沒有activation functions,隱藏層h的值就等於w1乘以x1和w2乘以x2的總和。請注意,為了使此說明簡單,我們忽略了偏差分量 b,這個參數其實我們會在很多ML文件中看到它。
因此輸出 y hat 等於 w3 乘以 h,最終等於常數 a 乘以 x1 和常數 b 乘以 x2 的總和。如果 y 是 x 的線性函數,則不需要所有隱藏層,而只需要一個輸入和一個輸出。如同我們大家都知道的,並不是所有問題都是線性的。
這就是為什麼必須使用 activation functions將線性網路轉換為非線性網路的原因。
Activation functions可以用的地方有很多。我們可以使用ReLU(rectified linear unit) 函數,如果輸入值為負,則將其變為零,如果輸入值為正,則保留原始值。
我們可以使用sigmoid function,它將輸入轉換為 0 到 1 之間的值。
並且Tanh(hyperbolic tangent)函數,它會移動 S 形曲線並產生一個介於 -1 和 +1 之間的值。另重要的activation function稱為softmax。
Sigmoid:它產生一個從零到一的值,並用於邏輯迴歸模型( logistic regression models)中的二元分類(binary classification)。一個例子是判斷電子郵件是否是垃圾郵件。如果需要多個類別,該怎麼辦?這裡必須使用softmax,它是多類別分類的activation function。
它將每個輸出映射到 [0,1] 範圍,以使總數加起來為 1。因此,softmax的輸出是一個機率分佈(probability distribution)。跳過上圖的數學公式,我們可以得出結論:
softmax用於多類別分類,而sigmoid用於邏輯迴歸模型中的二元類別分類
還要注意,我們不需要在不同的層上使用相同的activation function。例如,可以使用 ReLU 作為隱藏層,使用 softmax 作為輸出層。現在我們已經理解activation function並得到了預測的 y,那麼如何知道結果是否正確?
成本函數與損失函數
我們可以使用稱為損失函數(Loss function)或成本函數(Cost function)的評估來衡量"預測的 y 和實際 y "之間的差異。
損失函數用於計算單一訓練實例的誤差,而成本函數用於計算整個訓練集的誤差。
因此,我們要計算成本函數以最小化差異。如果差異很大,神經網路就知道它的預測很糟糕,必須回去學習更多並調整參數。實務上會用到許多不同的成本函數。
對於迴歸問題(regression problems),MSE(mean squared error)是線性迴歸模型中常用的誤差。MSE 等於 y hat 和 y 之間平方差和的平均值。
對於分類問題(classification problems),交叉熵(cross-entropy)通常用於衡量邏輯迴歸模型中預測"機率分佈和實際機率分佈"之間的差異。如果預測結果和實際結果之間的差異很大,則必須回過頭來調整權重和偏差,以最小化成本函數。
如果預測結果和實際結果之間的差異很大,則必須回過頭來調整權重和偏差(weights and biases),以最小化成本函數。這個可能需要進行的步驟稱為反向傳播(backpropagation)。麻煩是如何調整權重。解決方案稍微複雜,但確實是神經網路中最有趣的部分。這個想法是採用成本函數並將其轉化為搜尋策略(search strategy)。這就是梯度下降(gradient descent)的就出現了(如下圖)。
梯度下降(gradient descent)
梯度下降是指沿著成本函數形成的表面往下走,找到底部的過程。就像從一群山的山頂,找到這 一群山最低的低谷。尋找底部的問題可以分成兩個不同又重要的問題:
1. 該朝哪個方向走?
答案涉及導數(derivative)。
計算成本函數的導數並發現它為負數。這表示斜率的角度為負,且我們位於曲線的左邊。要到往底部,必須向下並向右走。
然後,在某一點,我們位於曲線的右側,再次計算導數。這次值為正,必須再次向左移動。
每次都會計算成本函數的導數來決定要採取哪個方向。重複這個過程,按照梯度下降,最終會到達區域底部。
2. 每一步要跨多大?
步伐取決於學習率( learning rate),它決定了我們跳到達底部的速度。步伐或「學習率」是在訓練前設定的超參數,學習率也決定了學習速度。
如果步伐太小,訓練可能會花太長時間。
如果步伐太大,可能會從一面牆彈到另一面牆,甚至完全彈出曲線,而不會收斂。
當步伐恰到好處時,就大功告成了。
模型一旦完成,最後就需要對整個流程進行迭代(iteration)。可以將 epoch 的數量設定為訓練中的超參數。不斷調整權重或參數,直到成本函數達到最優值。當經過多次迭代之後,值仍然停止下降時,就可以知道成本函數已經達到最優值。這就是神經網路的學習方式。它透過不斷調整權重來迭代學習以改善行為,直到達到最佳結果。