--- title: Google MLCC 講義 tags: 資源, Google MLCC --- <style> .center { text-align: center; } </style> :::success 本講義由 NPC (NTUT Programming Club) 整理 ::: :::info 課程 Exercise - [MLCC Train](https://www.desmos.com/calculator/dlzvxl7wb5) - [MLCC Gradient Descent](https://www.desmos.com/calculator/omnhra5sei) ::: # 機器學習速成 (Machine Learning Crash Course) # 1. 機器學習介紹 機器學習就是**不斷地使用演算法解析數據,從中學習,然後對世上的事物做出決定或預測** 如果再將機器學習想的更簡單一點,那就是從 data 中去尋找一個適合的 function ![](https://i.imgur.com/q3q0mt0.png) - 人工智慧:是人類長久以來的**目標**,希望機器可以跟人類一樣聰明 - 機器學習:達成目標的**手段** - 深度學習:機器學習的**一種方法** :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 有一些 AI 是許多由規則 ( if ) 構成的,我們稱之為 hand-crafted rules。 因此人類想不到的東西,機器就會不知道要怎麼辦。 也就是說,這個沒有 free-style 的機器,沒有辦法超越人類。 而我們現在要做的,就是讓機器有自主學習的能力 ![](https://i.imgur.com/tRwjTEL.png) ::: - 機器學習的大致流程: 1. 訓練 1. **準備一個模型 ( Model,可以想成是 function set )** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模型 ( Model )裡面裝有很多很多的 function ($f_1, f_2, f_3...$),例如: - $f_1$( 這裡輸入 貓的圖片 給 $f_1$ ) = "則 function 輸出 cat" - $f_2$( 這裡輸入 貓的圖片 給 $f_2$ ) = "則 function 輸出 dog" - $f_3$( 這裡輸入 貓的圖片 給 $f_3$ ) = "則 function 輸出 papaya" 2. **準備一些訓練資料 ( Training data )** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;這些訓練資料告訴模型:一個好的 function,它的輸入輸出應該長什麼樣子,又會有什麼樣的關係,而我們稱這件事情為監督式學習 ( Supervised Learning ),例如: - 第一筆訓練資料:輸入 貓 的圖片,function 應該要輸出 "cat" - 第二筆訓練資料:輸入 猴子 的圖片,function 應該要輸出 "mokey" - 第三筆訓練資料:輸入 木瓜 的圖片,function 應該要輸出 "papaya" 3. **挑選最好的 function** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由於模型裡面有著無窮無盡的 function,因此為了效率,我們會使用演算法,從模型裡面挑出一個最好的 function 2. 測試與驗證 3. 做出預測或決定 P.S. 測試與驗證 及 做出預測或決定,後面會有更詳細的說明 :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 機器學習的 scenario ( 情境 ) 有: - 監督式學習 ( Supervised Learning ) - 半監督式學習 ( Semi-supervised Learning ) - 非監督式學習 ( Un-supervised Learning) - 強化學習 (Reinforcement Learning ) - 遷移學習 ( Transfer Learning ) ::: :::success 以下的內容都是 監督式學習 ( Supervised learning ) ::: # 2. 什麼是監督式學習 ( Supervised Learning )? 剛剛有提到,監督式學習就是告訴模型: 一個好的 function,它的輸入輸出應該長什麼樣子,又會有什麼樣的關係 如果再將它更特色化一點,你可以想成: **在監督式學習中,訓練資料包含 特徵 ( feature ) 與 標籤 ( label )** P.S. 特徵 ( feature ) 與 標籤 ( label ) 在下列表格會提到 ![](https://i.imgur.com/FtMqMKA.png) 假設有一台 AI 烤麵包機, 你給烤麵包機兩片吐司,並且告訴烤麵包機:烤完後,吐司應該會有一點焦焦的感覺, 但是烤完吐司後,竟然變成了黑炭! 我們把上文翻譯成 Machine Learning 領域裡的詞彙: | 上文 | Machine Learning | | --- | ------ | |你給了烤麵包機一片吐司|你把 訓練資料裡的 **特徵 ( feature )** 給了 模型 ( Model )<br /><br />**特徵 ( feature )**:輸入的數據| |告訴烤麵包機:烤完後,吐司應該會有一點 脆脆的感覺|你把 訓練資料裡的 **標籤 ( label )** 給了 模型 ( Model )<br /><br />**標籤 ( label )**:Model 中的 function &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的輸入與輸出的關係| |烤完吐司後,吐司變成一團黑炭| 模型中的 function 的輸出 ( output ),即預測值 | 模型輸出預測值後,就會去與 原本輸入的 標籤 ( label ) 對應,查看現在 模型 ( Model ) 裡的 function 是不是一個好的 function, 如果不是一個好的 function,模型 ( Model ) 就會使用其他的 function 只要重複這些步驟,就有很大的機率去找出最好的 function 而上面講的這些事情,就是機器學習中的 **訓練 ( Training )** :::info <i class="fa fa-pencil fa-fw"></i> 更好了解 假設你現在要訓練一個 **辨識垃圾郵件** 的模型,那麼你的輸入的 feature 可能會包含下列幾項: - 在信中的文字 - 寄件者的信箱地址 - 電子郵件發送的時間 <br /> 輸入這些 特徵 ( feature ) 後,模型就可以嘗試判斷是不是垃圾郵件 ::: 等等,我們剛剛一直提到 模型 ( Model ) 中的 function 到底都是些什麼呢? 事實上,Model 可以分為兩個 task: - **回歸 ( Regression )**:Model 輸出的數值是連續的,例如: - 在臺灣,一個房屋的價錢是多少? - 使用者點擊廣告的機率為多少? - **分類 ( Classification )**:Model 輸出的數值不連續 (離散),例如: - 這個郵件是不是垃圾郵件? - 這是一隻狗,還是一隻貓,或者是一隻倉鼠的圖片? P.S. 回歸 ( Regression ) 與 分類 ( Classification ) 會再後面詳細說明 # 3. 回歸 ( Regression ) - 線性回歸 ( Linear Regression ) 回歸 ( Regression ) 有很多方法,而我們先介紹其中一種: 線性回歸 ( Linear Regression ) 線性回歸 ( Linear Regression ) 的方程式為:$$y = b+ \sum w_ix_i$$ 而方程式中的代號的意思是: - $b$:**偏差 ( bias )** - $w_i$:**權重 ( weight )**,你可以想成是斜率 - $x_i$: **特徵 ( feature )**,輸入值 :::warning 如果有點難以理解,你可以先把它想成是一個 線性方程式:$y = wx +b$ ::: 假設現在我們有一筆訓練資料,並且想要訓練出一個模型 不過在訓練前,我們得先看看訓練資料的圖表,嘗試了解訓練資料的關係 下面的圖表是關於 蟋蟀叫聲的頻率 ( feature ) 與 溫度 ( label ) 的圖表: ![](https://developers.google.com/machine-learning/crash-course/images/CricketPoints.svg) 這時候發現,如果我們畫出一條直線,好像能大約地表示兩者的關係: ![](https://developers.google.com/machine-learning/crash-course/images/CricketLine.svg) 那麼,我們怎麼知道這一個 function 是不是最好的呢? 這時候,我們就可以使用 **損失值 ( Loss )** 來判斷 function 的好壞 # 4. 損失值 ( Loss ) Loss:用來判斷 function 的好壞,一個完美模型的預測中, Loss 為 0,同時也代表著好的損失值,下圖是 Loss 的範例: - 紅色箭頭代表著 Loss - 藍色線條代表著 function ![](https://i.imgur.com/nwES2Zl.png) 我們可以明顯地看出,左圖有著較高的 loss, 右圖有著較低的 loss :::warning <i class="fa fa-hand-stop-o fa-fw"></i> 思考時間 你覺得 Loss 要怎麼計算會比較好呢? <br /> 提示:一個好的 Loss function 應該會反映兩種情況 - 在預測值改善時,Loss 應該變得更小 - 在預測值變得更糟時,Loss應該變得更大 ::: :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 在訓練模型中,透過不斷地嘗試,試著找到最小的損失,而這個過程被稱為:**ERM ( 經驗風險最小化 )** ::: :::warning - 用途: - 我們需要一個可微分的指標,來評斷這個 Model 表現的好壞。在 Model 的訓練中,我們經常會需要去觀察權重參數的損失函數作微分。 - 定義起來跟正確率很像,那為甚麼要多一個損失函數呢? 由於正確率是一個不可微分的一個常數,非0及1。所以才有了一個損失函數 ::: ## 4.1 損失值 (Loss) - MSE 只要你想到一個 Loss function,是符合 <i class="fa fa-hand-stop-o fa-fw"></i> **思考時間中的提示**的話,你就可以去使用它, 不過在線性回歸裡,最常使用的 Loss function 叫做:MSE ( Mean-squared Loss ) $$MSE =\frac{1}{N}\sum_{(x,y)\in D}^{N}(y - prediction(x))^2$$ 不過因為在梯度下降(稍後會提到)會針對 Loss 作微分,因此我們會乘上 $\frac{1}{2}$,變成:$$MSE =\frac{1}{2} \cdot\frac{1}{N}\sum_{(x,y)\in D}^{N}(y - prediction(x))^2$$ - $y$:標籤 ( label ) - $prediction(x)$:模型的預測值 ( 輸出 ) 我們剛剛提到,Loss 用來判斷 function 的好壞,且 Loss 越低,function 越好 那麼為了找到最好的 function,要怎麼減少 Loss 呢? 這時候,我們就會使用 **梯度下降 ( Gradient Descent )** ## 4.2 梯度下降 ( Gradient Descent ) 假設我們有非常多的時間訓練模型,那麼線性回歸的 Loss 微分後,會像下圖一樣: ![](https://i.imgur.com/uJ3itbX.png) 你會發現 Loss 有一個最小值,也就是 最低點 ( 斜率為0 ) 的地方 那麼要如何利用 梯度下降 ( Gradient Descent ) 去找到最小值的地方呢? 1. 首先,進行梯度下降時,我們需要先定義一個起始點: ![](https://i.imgur.com/EVc5oTF.png) 2. 進行微分,就能找到梯度 (即找到方向),並自動往低點 ( 斜率為負 ) 的方向,並跨出一步的距離: ![](https://i.imgur.com/Csl7z8x.png) 3. 因此就能找到下一個點: ![](https://i.imgur.com/MQcjV7g.png) 只要不斷地進行循環,就可以找到 Loss 的最小值 等等,跨出一步的距離?一步是多大呢? 事實上,在梯度下降中,會先定義一個 超參數 ( Hpyerparameter ):**學習率 ( Learning Rate )** 而前進一步的距離就是根據 學習率 ( Learning Rate ) 的大小而增減,也就是說: - 學習率 ( Learning Rate ) 越大,前進一步的距離越多 - 學習率 ( Learning Rate ) 越小,前進一步的距離越少 不過,如果學習率 過大 或 過小,都會產生一些問題: - 學習率過大:就好像泰山在山谷裡盪來盪去,永遠找不到最低點 ![](https://i.imgur.com/xjwAA6g.png) - 學習率過小:就好像一隻螞蟻往山下走,可能過了八十七年後,依然走不到最低點 ![](https://i.imgur.com/3EzlI9J.png) :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 梯度下降 距離前進 的公式為:$𝑤_{(𝑖+1)}=𝑤_𝑖+∆𝑤=𝑤_𝑖-η\cdot𝛻𝐿$ - η 為 學習率 (Learning Rate) - w 為 權重 (weight) - $𝛻𝐿$ 代表梯度下降 即:\[$\frac{𝜕L}{𝜕w_1}, \frac{𝜕L}{𝜕w_2}, ...$\] ::: :::success <i class="fa fa-leaf fa-fw"></i> Exercise [學習率 ( Learning Rate )](https://developers.google.com/machine-learning/crash-course/reducing-loss/playground-exercise) 在這個網頁裡,你可以使用不同的 學習率 ( Learning Rate ),並且觀察 Loss 的變化 ::: 我們剛剛提到的 Loss 圖形,都是長這樣子的,所以很容易找到最小值: ![](https://i.imgur.com/pdwS2D7.png) 但是,如果模型變得比較複雜,導致 Loss function 微分後長的像這樣子的話: ![](https://i.imgur.com/mcNc6M9.png) 遇到這樣的情形,我們要怎麼找到最低點呢? 這時候,你可以使用兩種方法: - 隨機梯度下降 ( SGD ):每次只訓練一筆資料,因此每次的 初始值 都不一樣,所以每次 Loss 的最小值也都會不一樣 ![](https://i.imgur.com/1exNAHX.png) - 批次梯度下降 ( Mini-batch Grandient Descent ):將訓練資料分組,每次只訓練 10~1000 筆資料,因此每次的 初始值 都不一樣,所以每次 Loss 的最小值也都會不一樣 ![](https://i.imgur.com/Qb1wxzz.png) P.S. 批次大小 ( Batch-size ):與學習率一樣,Batch-size 也是超參數 ( Hyperparameter ) 之一 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,表示每次訓練多少筆資料 :::success 我們並不打算詳細介紹 SGD 與 Mini-Batch Grandient Descent, 不過有興趣的話,可以參考這些網站: - [點我1 (English)](http://ruder.io/optimizing-gradient-descent/) - [點我2](https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E6%95%B8%E5%AD%B8-%E4%B8%89-%E6%A2%AF%E5%BA%A6%E6%9C%80%E4%BD%B3%E8%A7%A3%E7%9B%B8%E9%97%9C%E7%AE%97%E6%B3%95-gradient-descent-optimization-algorithms-b61ed1478bd7) ::: :::info <i class="fa fa-umbrella fa-fw"></i> 放鬆一下 梯度下降,就好像玩世紀帝國一樣,一開始看不見其他地方長什麼樣子,只有在探索過後才知道:[點我](https://www.youtube.com/watch?v=1_HBTJyWgNA&t=3s) ::: :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 在訓練模型前,就需要定義超參數,而超參數值的大小,需要根據 你的經驗 ( **經驗法則** ) 才能找出最佳的超參數值 ::: # 5. 正規化 ( Regularization ) 在提到正規化之前,我們先想一個問題: 1. 假如我們今天以下列的訓練資料,去訓練一個模型: ![](https://i.imgur.com/90ZPq14.png) 2. 模型訓練完畢,並將它可視化,看起來這似乎是一個好的模型: ![](https://i.imgur.com/qUTtPWj.png) 3. 不過當我們拿出模型在訓練時沒有看過的資料,並以其來測試,會發生什麼事情呢? ![](https://i.imgur.com/dqDY2El.png) 從右下角的區域可以發現,明明是藍色的區域,但大部分卻是橘色的圓點 如果發生這種情況,我們將其稱為:過度擬和 ( Overfittng ) :::warning 你可以把 過度擬和 ( Overfitting ) 想成是: 台北有一個學生,叫做阿明,只會背題庫,到了考試當天,才發現老師出的是申論題,老師看到後,把講台上的杯子拿給他,拍拍阿明的肩膀,開心的道:「同學,明年見!這個杯具就送你吧!」 ::: 而在發生 過度擬和(Overfitting) 時,我們就可以使用 正規化(Regularization) 來盡量解決這樣的問題。 以 $L_2$正規化 為例,正規化 (Regularization) 其實就只是在 $Loss$ 後面多了一項變數 (所有權重平方的總和):$$Loss = \sum(y - prediction(x))^2 + λ\sum(w_i)^2$$ - λ (lambda):在正規化裡,必須要給予的**超參數**,又稱 Regularization Rate - 正規化 (Regularization) 能確保遇到未知資料時,依然能保持預測準確度 - 減少資料的雜訊 (noise) :::danger <i class="fa fa-columns fa-fw"></i> 補充說明 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**過度擬和 OverFitting** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![](https://i.imgur.com/3KKiLIY.png) 即 Model 在 Training 時的 Loss 很低,但使用 Testing Data 測試模型時,Loss 卻很高。 - 可能原因 - 雜訊過大 - 資料量太少 - Model 過於複雜 (即資料中有 不重要的feature,影響模型的預測結果) - 解決方法 - 減少 feature (即減低維度) - 在資料集中分出一些資料,並用來驗證 (後面會提到) - 使用正規化 (Regularization) <br /> <br /> 另外一種常使用的正規化為:$L_1$正規化 - $L_1$ 只是在 $Loss$ 後面多了一項變數 (所有權重絕對值的總和):$$Loss = \sum(y - prediction(x))^2 + λ\sum\mid w_i \mid$$ - $L_1$ 正規化容易使權重變為 - 參數 λ (lambda) 的大小對於 Loss 的影響: - λ 較大時,會鼓勵更多 weight 變為 0: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![Distribution of weights with higher regularization rate](https://developers.google.com/machine-learning/crash-course/images/HighLambda.svg =500x) - λ 較小時則相反: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![Distribution of weights with lower regularization rate](https://developers.google.com/machine-learning/crash-course/images/LowLambda.svg =500x) ::: :::success <i class="fa fa-leaf fa-fw"></i> Exercise - [使用 $L_1 / L_2$ Regularization 解決 Overfitting 的問題](https://developers.google.com/machine-learning/crash-course/regularization-for-simplicity/playground-exercise-examining-l2-regularization) 在這個網頁裡,你可以使用 $L_1 / L_2$ 與 Regularization Rate (λ),觀察模型是否 Overfitting ::: :::warning <i class="fa fa-pencil fa-fw"></i> 更好了解 - $L_1$ Regularization 為什麼容易使權重變為 0:[中文版](https://developers.google.com/machine-learning/crash-course/regularization-for-sparsity/l1-regularization?hl=zh-cn)、[English](https://developers.google.com/machine-learning/crash-course/regularization-for-sparsity/l1-regularization) - 如果你對於 $L_1 / L_2$ 正規化想要有更深入的了解,可以參考:[莫凡 Python](https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/3-09-l1l2regularization/) - 如果你對於 損失函數 (Loss function) 有興趣的話,可以參考:[損失函數](https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E4%BB%8B%E7%B4%B9-%E6%90%8D%E5%A4%B1%E5%87%BD%E6%95%B8-loss-function-2dcac5ebb6cb) ::: # 6. 訓練 / 測試集 (Training / Test Set) - Training Set:即訓練資料,用來訓練 Model - Test Set:即測試資料,用來測試 Model - 測試資料能夠模擬現實的預測、觀察模型對於**未知的資料**的預測準確度 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![使用 Training Set 及 Test Set 的訓練流程](https://i.imgur.com/ACsXIcm.png =500x) :::danger <i class="fa fa-columns fa-fw"></i> 補充說明 - 資料集 (Data set) 在分割時,需確保所有資料已經進行**隨機打散** - Training Set 與 Test Set 需**完全隔離**,且沒有**重複內容** ::: :::success <i class="fa fa-leaf fa-fw"></i> Exercise [Training / Test Set 的比例對於訓練模型的影響](https://developers.google.com/machine-learning/crash-course/training-and-test-sets/playground-exercise) 在這個網頁裡,你可以使用不同的 Training data 比例、雜訊 (Noise),觀察對於訓練模型的影響 ::: # 7. 驗證集 (Validation Set) 先前提到使用測試集 (Test set) 測試模型是否過度擬和 (Overfitting),其實有一個問題: - 在反覆的測試過程中,很可能間接的訓練到模型 而為了防止這樣的問題,我們還會再將原本的資料集 (Data set) 再分割出一些資料,變成: - Training Set - Test Set - Validation Set 假設現在要測試一個訓練完畢的模型, 在前期的測試中,我們會使用 驗證集 (Validation Set) 測試模型,並調整模型的超參數 直到 $Loss_{training}$ 與 $Loss_{validation}$ 皆達到你的預期結果後, 最後才使用 測試集 (Test Set) 做驗證, 這樣一來,就可以確保 Test Set 不會影響到模型 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![加入 Validation Set 後的訓練流程](https://i.imgur.com/9bzirSv.png =500x) # 8. 表示 (Representation) 在機器學習中,模型 (Model) 對於有些資料 (這裡的資料指的是 feature) 的處理是比較困難的,以預測房價的模型為例: - 你輸入了一個 {房子地址:中正路 } 的 feature - 你輸入了一個 {房子位於在哪個城市:台北市 } 的 feature 雖然我們看的懂,但是機器處理起來可是很麻煩啊! 除此之外,如果在輸入的資料裡面,包含著一些無關緊要的 feature,那麼模型可能就沒辦法達到良好的訓練結果,同樣以預測房價的模型為例: - 在輸入的資料裡面,有著一個 {今天的天氣:晴天} 的 feature - 在輸入的資料裡面,有著一個 {昨天是否看到外星人:是的} 的 feature 因此,為了使 feature 們濃縮再濃縮、提煉再提煉、成為資料中的菁英,而後讓璞玉的 Model 訓練成璧玉的 Model, 我們得**先了解手中的資料**,並**清理不需要的數據,最後針對資料做特徵工程 (feature engineering)** ## 8.1 Know You Data - 這個 feature,好嗎? 將原始資料轉換成更好的訓練資料後,我們還得需從中挑選出好的 feature,以利我們訓練模型: 1. 良好的 feature 數值應該在 Data set 中出現超過 5 次,以預測房價模型為例: - where_is_house: '台北市' (這很可能是一個良好的 feature, 不過尚未經 one-hot encoding 處理) - id:'F123456789' (這是一個極差的 feature,因為同樣的身分證字號只會出現一次) 2. 良好的 feature 盡量以明確且明顯的意義來表示: - house_age: 54878741 (這是一個完全不合理的值,房子有可能經過 54878741 年後還屹立不搖嗎?) - HA: 12 (這裡的 HA 指的是 house_age,除了創建它的工程師以外,其他人可能都不知曉 HA 的意義,因此這是一個不佳的命名方式) 3. 不將奇怪的數值與真實數據混合 - house_age: -1 (房子的年齡不可能是 -1 歲) - 若你要以 -1 表示 房子尚未建成的話,建議另建一個新的 feature,代表房子是否建成 4. 良好的 feature 不會隨時間改變 - 城市名稱通常不會改變,但城市代號可能會更改: - city_id: "台北市" (文字仍需使用 One-hot encoding 轉換) - city_number: 666 (在未來,city_number 可能會變成: 789) ## 8.2 清理 Data 現在有一堆蘋果, 在高級市場的訂購人員買的是 100% 完美的蘋果, 然而在果園或一般市場中,可能有人買的是看起來還可以挽救的蘋果, 並且花費大量時間在蘋果上塗蠟 而作為一名 ML 工程師,你將要花費大量的時間,拋棄 糟糕 或是 勉強可以挽救 的例子,以避免訓練出不佳的模型: 1. 縮放 feature 的數值,盡量將 feature 的數值縮放在一定的範圍內 (例如: 0 ~ 1,-1 ~ 1) - 能避免 NaN 值 (NaN:若 feature 的數值超過浮點數的精度時,則此 feature 的數值將變為 NaN) - 幫助 梯度下降(Gradient Descen) 更快速找到最小值 - 利於訓練模型 2. 處理極端的數值 - 透過下列的圖片可以看出,這是一個極端的資料![](https://i.imgur.com/vkhBQJM.png) - 這時,我們可以將資料範圍縮小成 (0, 5),使得資料不那麼的極端![](https://i.imgur.com/6bztBoS.png) 3. 將資料分箱 (Binning) - 以預測房價為例,現在有一個 緯度 的 feature,不過,此 feature 的數值若是浮點數的話,將會是沒有意義的,因為緯度越高,房價不可能是越高或越低的趨勢。但緯度是一個好的 feature,因此遇到上述的情況時,我們會對此 feature 做分箱 (Binning) 處理:![](https://developers.google.com/machine-learning/crash-course/images/ScalingBinningPart2.svg) 4. 將資料變得更正確 - 由於資料中可能包含不可信的數據 (noise),因此我們不能將所有的數據都作為 feature - 沒有數據 - 重複輸入 - label 錯誤 - 數據 錯誤 - 發生上述情況時,可以將數據轉換成直方圖,透過觀察直方圖,我們就可以快速找到資料中的錯誤 - 最大值、最小值 - 平均值、中位數 - 標準差 ## 8.3 特徵工程 (feature engineering) 資料處理中,最重要的一環之一就是特徵工程, 特徵工程是 **將原始資料轉換成更好的訓練資料 (feature Vector),而使得機器學習起作用的過程** 而原始資料 (如: {房子地址:中正路 }) 大部分都得經過處理後,才能轉換成 **feature vector** 而 feature vector 裡的數值,都是由 **浮點數 (float)** 組成的 ![](https://i.imgur.com/g0JDQX3.png) 等等,為什麼像是: {房子地址:中正路} 這樣的資料,需要轉換成更好的訓練資料呢? 事實上,在機器學習中,數值 比 文字 還要更容易處理及運算, 因此,我們常常將 文字 轉為 數值, 這種方式我們稱為: One-hot encoding ### 8.3.1 One-hot encoding 假設房子的地址在`興安街`和`遼寧街`街口,我們就可以轉換成: ```python vector = ['新生南路', '興安街', '遼寧街', '復興北路'] # Raw Data,而房子在 興安街 與 遼寧街 的 路口 = [0, 1, 1, 0] # 轉換成 Feature Vector ``` :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 假如現在有幾千條街:[0 (第1筆), 0 , 1, ... , 1, ... , 0 (第8765筆) ], 因此 feature Vector 裡面只有兩個的數值為 1,其他皆為 0 發生這種情況時,我們得必須以另一種方式處理 如果你有興趣的話,可以參考:[稀疏矩陣表示法](https://developers.google.com/machine-learning/glossary/#sparse_representation) ::: # 9. 特徵交叉 (feature cross) 在提到特徵交叉之前,我們先思考一個問題: 我們之前提到的模型,皆為 線性模型 (Linear Model),像是下列的資料圖表可以用一條直線分為兩個區域: ![](https://i.imgur.com/DoAOGNq.png =500x) 但是,如果遇到這種情況呢? ![](https://i.imgur.com/3LqDkTo.png =500x) 這種情況沒辦法以一條直線 (Linear) 表示, 因此它就是一個非線性 (Non-Linear) 的問題,這有點像是 binary (非黑即白) 的道理 Linear 能處理的情況極其有限,因為在現實中的資料,大部分都是 Non-Linear 的問題 而如果你想要**使用線性模型**,卻遇到資料沒辦法以一條直線表示的時候, 這時候,就可以使用 **特徵交叉(feature crosses)**,幫助 線性模型 表達 非線性的問題 <br /> 特徵交叉 (feature cross):兩個或以上的 feature 組合,變成一個新的 feature,即: $$ feature_{new_1} = feature_1 \times feature_1\\ feature_{new_2} = feature_1 \div feature_2\\ feature_{new_3} = feature_1 + feature_3\\ \cdot\\ \cdot\\ \cdot\\ $$ 另外,假設兩個 feature 皆為向量 (Vector),且你想要使用 feature crosses 的話,則可以表示成: 1. 假設現在有兩個 feature ``` python # feature 1 居住地區 = [ 北部, 中部, 南部, 東部 ] # feature 2 對飲食的偏好 = [ 中式, 西式, 其他 ] ``` 2. 如果做 feature crosses 的話,則會產生新的 feature: ``` 居住地區的飲食偏好 = [ 北部 AND 偏好中式, 北部 AND 偏好西式, 北部 AND 偏好其他口味, 中部 AND 偏好中式, 中部 AND 偏好西式, 中部 AND 偏好其他口味, 南部 AND 偏好中式, 南部 AND 偏好西式, 南部 AND 偏好其他口味, 東部 AND 偏好中式, 東部 AND 偏好西式, 東部 AND 偏好其他口味 ] ``` :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 - 特徵交叉 為 非線性 (Nonlinear) - 在線性模型使用 特徵交叉時,是為了 協助模型 表達 非線性的問題 ::: :::success <i class="fa fa-leaf fa-fw"></i> Exercise [feature crosses 是否能夠真的解決非線性的問題](https://developers.google.com/machine-learning/crash-course/feature-crosses/playground-exercises) 在這個網頁裡,你可以使用藉由使用 feature crosses 產生的新 feature,來觀察模型是否能解決非線性的問題 ::: # 10. 分類 (Classification) 在介紹監督式學習時,我們提到了 分類 (Classification) 與 迴歸 (Regression),且你可以將兩者的差別認為是: - 分類 (Classification) 預測 **種類(類別)** - 迴歸 (Regression) 預測 **數值** 而分類 (Classification) 主要可以分為兩種形式: - 二元分類 (Binary classification) - 多元分類 (Mullticlass classification) ![](https://i.imgur.com/Wo1yF8d.png) 假設現在有一個垃圾郵件辨識器,模型的輸出則是 yes / no (垃圾郵件 / 非垃圾郵件), 那麼要如何去辨別某個郵件是不是垃圾郵件呢? 事實上,遇到像這樣的情況時,我們常常將 機率 作為模型的輸出,並經過 你設定的閾值(threshold) 後,轉換成 1 or 0 (在這裡,1 代表是垃圾郵件, 0 代表不是垃圾郵件) :::info <i class="fa fa-columns fa-fw"></i> 知識補充 閾值 (threshold) 是什麼? 不知道你有沒有聽過魚躍龍門的故事, 很久很久以前,在某個森林中,有一個龍門,只要魚兒們能夠躍過,就能夠變成龍,但是,如果魚兒跳不過,就永遠都是魚兒。 <br /> 而你可以把 閾值 (threshold) 當作是 龍門。 <br /> 假設現在有一個 spam filter,且指定 閾值 (threshold) 為 0.8: - 如果模型的預測值為 0.62,則輸出變為 0,且代表 not spam - 如果模型的預測值為 0.87,則輸出變為 1,且代表 spam ::: 而遇到 分類 (Classification) 的問題時,使用 **邏輯迴歸 (Logistic Regression)** 是一個很有效的方法 ## 10.1 邏輯迴歸 (Logistic Regression) 等等,我們現在不是在介紹 分類 嗎?怎麼還提到 迴歸 呢? 事實上,邏輯迴歸 (Logistic Regression) 的輸出值為 0~1,因此被歸類於迴歸的形式,不過也因為它的輸出特性,使得 邏輯迴歸 常常被用在 分類 的預測 而邏輯迴歸 (Logistic Regression) 模型的 function 為:$$y = \frac{1}{1+e^{-(w^Tx+a)}}$$ - T:轉置 (transpose),以矩陣轉置為例子: - $\begin{bmatrix}1&2\end{bmatrix}^T = \begin{bmatrix}1\\2\end{bmatrix}$ - 邏輯迴歸的圖表:![](https://i.imgur.com/Qks0fn0.png) 而這個 function 又稱為 S型函數 (Sigmoid function), 且 Sigmoid function 的輸出永遠都在 0~1 之間, :::info 假設現在有一個分辨垃圾郵件的模型, 且 function 為 Sigmoid function,因此輸出值永遠在 0~1 之間, 不過,要怎麼判斷是不是垃圾郵件? 我們得先設定 **閾值 (threshold)**, 假設我們將閾值設定為 0.9, 那麼模型的預測值高於 0.9,即表示其為垃圾郵件;預測值低於 0.9,即表示其為非垃圾郵件: - 模型的預測值為 0.46,則表示非垃圾郵件 - 模型的預測值為 0.92,則表示垃圾郵件 ::: 你還記得一開始提到的機器學習三大步驟嗎? 忘記了?沒關係,我們現在來複習一下吧: 1. 找一個模型,而現在的模型是 邏輯迴歸 (Logistic Regression) 2. 要有個訓練資料 3. 找到一個最好的 function 有了訓練資料後,我們就可以觀察損失值 (Loss) 並判斷 function 的好壞 邏輯迴歸 (Logistic Regression) 同樣有常使用的 Loss function,不過與 線性迴歸 (Linear Regression) 常使用的 MSE 有一些差別: - 線性迴歸 (Linear Regression) 中,Loss function 使用的是 MSE - 邏輯回歸 (Logistic Regression) 的 Loss 則使用 $Log\ Loss$ (**即交叉熵,Cross entropy**):&nbsp;&nbsp;&nbsp;![](https://i.imgur.com/6bnxYbv.png)$$Log\ Loss = \sum_{(x,y)\in D} -y\cdot log(y') - (1-y)\cdot log(1-y')$$ - $(x,y)\in D$:即 資料 (Data set) 中的 (feature, label) - $y$:真實值,即 label - $y'$:預測值 我們在前面提到,Loss 越小,function 越佳,因此我們需要盡可能地降低 Loss, 而 邏輯迴歸的 Loss 一樣也需要使用 梯度下降 (Gradient Descent) 找到最小值,且與 線性迴歸的 梯度下降 的公式相同:$$𝑤_{(𝑖+1)}=𝑤_𝑖+∆𝑤=𝑤_𝑖-η\cdot𝛻𝐿$$ 若以垃圾郵件辨識器為例的話,則: - target value = 0:即 label 為 不是垃圾郵件 - target value = 1:即 label 為 是垃圾郵件 不過,如果以 $Log\ Loss$ (即 Cross entropy) 作為判斷 function 的好壞,會出現這個問題: - $Log\ Loss_1$ = 40 - $Log\ Loss_2$ = 200 以我們前面所學到的知識來判斷,Loss 越小代表 function 越好, 所以 $Log\ Loss_1$ 是比較好的, 那麼,$Log\ Loss_1$ = 40 的 function 到底是多好呢? 如果我們將 $Log\ Loss = 40$ 代入上圖 ($Log\ Loss - predicted$),會發現已經超出圖片的範圍 所以 $Log\ Loss$ 對於判斷 function 的好壞並**不直觀**, 因此,我們在判斷二元分類的 function 好壞時,會改為使用其他的判斷指標,而最常使用的指標,非 **精確度 (accuracy)** 莫屬 :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 - 如果不知道 $e$ (自然對數) 是什麼的話,可以參考:[$e$?那是什麼?](https://talkupday.com/%E5%A2%9E%E9%95%B7%E7%9A%84%E6%A5%B5%E9%99%90-%E6%95%B8%E5%AD%B8%E4%B8%AD%E7%9A%84%E5%A5%87%E5%A6%99%E5%B8%B8%E6%95%B8%E6%AD%90%E6%8B%89%E6%95%B8-e/) - 如果想要更深入 Cross entropy 的話,可以參考:[Cross entropy](https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E4%BB%8B%E7%B4%B9-%E6%90%8D%E5%A4%B1%E5%87%BD%E6%95%B8-loss-function-2dcac5ebb6cb#a692) ::: ### 10.1.1 準確度 (accuracy) 在提到 精確度 (accuracy) 以前,我們得先知道 混淆矩陣 (confusion martix) 是什麼樣的東西, 不過,在聽到 混淆矩陣 的名字就可以知道,這個矩陣真的很讓人混淆, 所以,如果你覺得很難理解的話,沒關係的,你可以先跳過 混淆矩陣 (confusion martix) 的部分 不知道你有沒有聽過 **狼來了 · 極簡** 的故事: :::success 有一位牧童要看顧鎮上的羊群,過了不久,他開始厭煩這一份工作,為了找點樂子,他大喊道:「狼來了!狼來了!」村民們趕緊抄上傢伙,迅速跑來保護羊群,但他們發現牧童竟是在開玩笑後,非常的生氣。 [這樣的情形重複了很多次] 一天晚上,牧童看到真的有一頭狼靠近羊群,他大聲喊道:「狼來了!狼來了!」村民們不想再被他捉弄,都待在家裡不出來,於是這頭飢餓的狼隊羊群大開殺戒,美美地飽餐一頓。這下子,整個鎮子都揭不開鍋了。恐慌也隨之而來 ::: 我們先定義四種詞彙: - 牧童道「狼來了」:代表 P (Positive) - 牧童道「狼沒有來」:代表 N (Negative) - 牧童說的是正確的 代表 T (True) - 牧童說的是不正確的:代表 F (False) 再來: - 將 P、N 想像成 function 的輸出 - 將 T、F 想像成 label 想像現在是 function 輸出後,要與 label 對答案的情形,下面是混淆矩陣(confusion matrix): | | T | F | | :------: | :--------: | :-----: | | P | TP | FP | | N | TN | FN | - TP:牧童道「狼來了!」,而事實上,狼也確實來了 (即 True Positive,簡稱 TP) - FP:牧童道「狼來了!」,但事實上,狼卻沒有來 (即 Flase Posiitive,簡稱 FP) - TN:牧童道「狼沒有來」,而事實上,狼也確實沒有來 (即 True Negaitive,簡稱 TN) - FN:牧童道「狼沒有來」,但事實上,狼卻來了 (即 False Negaitive,簡稱 FN) 所以判斷 function 的好壞就可以使用 **精確度 (accuracy)**:$$Accuracy = \frac{TP + TN}{TP + FP + TN + FN}$$ 另外,我們有時候也會使用其他兩種判斷指標:$$Precision = \frac{TP}{TP+FP}$$ $$Recall (True postive rate) = \frac{TP}{TP+FN}$$ :::info <i class="fa fa-pencil fa-fw"></i> 更好了解 班上有 100 人,且有 Positive (70個男生),Negative (30 個女生),假設今天模型要預測 Positive (班上有幾個男生),結果模型預測出的結果為: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![](https://i.imgur.com/UI3sIBP.png) - 模型預測班上有 60 個男生,但事實上,只有正確判斷出 40 個男生,所以: - $Accuracy = \frac{TP +FN}{TP+FP+TN+FN} = \frac{分類正確的樣本}{全部樣本} = \frac{40+10}{100} = 50\%$ - $Precsion = \frac{TP}{TP+FP} = \frac{判斷性別為男生且正確的樣本}{判斷為性別為男生的樣本} = \frac{40}{60}=66.67\%$ - $Recall = \frac{TP}{TP + FN} = \frac{判斷性別為男生且正確的樣本}{性別為男生的樣本} = \frac{40}{70} = 57.14\%$ 因此你可以理解成: - $Accuracy$:在全部的樣本中,分類正確 (TP、FN) 的樣本數有多少? - $Precsion$:在模型預測為 Positive 的樣本中,分類正確 (TP) 的樣本數有多少? - $Recall$:對原本的 Positive 樣本而言,有多少樣本 (TP) 被分類正確? ::: :::success <i class="fa fa-leaf fa-fw"></i> Exercise - [理解 Accuracy、Precision、Recall (中文)](https://developers.google.com/machine-learning/crash-course/classification/check-your-understanding-accuracy-precision-recall?hl=zh-cn) - [Check you understanding: Accuracy, Precision, Recall (English)](https://developers.google.com/machine-learning/crash-course/classification/check-your-understanding-accuracy-precision-recall) ::: :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 - 如果你想要更理解二元分類模型的三個指標,可以參考:[Accuracy、Precsion、Recall 三者的差別](https://my.oschina.net/stanleysun/blog/1499856) ::: ### 10.1.2 ROC & AUC 介紹 ROC曲線 (receiver operating characteristic curve) 與 AUC (Area under the ROC Curve) 也常被使用在判斷 二元分類模型 的優劣 不過,前面都已經介紹三種判斷指標了,為什麼還要使用 ROC 與 AUC 呢? 因為在現實中經常會出現 class imbalance (即 Negative 樣本 比 Positive 樣本多很多,或者相反的情況下),ROC 曲線依然能夠保持不變,下圖是 ROC曲線 與 Precision-Recall曲線 的對比: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![](https://i.imgur.com/issesPX.png) - (a)、(c\) 是 ROC曲線 - (b)、(d) 是 Precision-Recall曲線 - (a)、(b) 展示的是 Positive 與 Negative 樣本數平衡的時候 - (c\)、(d) 展示的是 Negative 樣本數增加到原來的 10 倍 那麼,ROC曲線 到底是什麼呢? ROC曲線 其實是由兩個參數組成的: - TP率 (True Positive Rate): $TPR = \frac{TP}{TP+FN}$ ,你可以先想成模型預測正確 - FP率 (False Positive Rate): $FPR = \frac{FP}{FP+TN}$,你可以先想成模型預測不正確 我們將其畫成圖表,且圖中的虛線即為典型的 ROC曲線: ![](https://i.imgur.com/4jVMCCo.png) - 假設今天 ROC曲線 經過 (0, 1),則代表模型是完美的![](https://i.imgur.com/SrjvjTG.png) - 假設今天 ROC曲線 經過 (1, 0),則代表模型是最糟的![](https://i.imgur.com/dgVBflW.png) 如果 ROC曲線 越接近 左上角,就代表著模型越佳 但是 ROC曲線 並不能直觀的了解模型的好壞,因此就有了 **AUC (ROC曲線下的面積)**: - ROC曲線 越接近左上角,AUC 越大,代表有不佳的模型 - ROC曲線 越接近右下角,AUC 越小,代表有較佳的模型 :::success <i class="fa fa-leaf fa-fw"></i> Exercise - [理解 ROC curve 與 AUC (Chinese)](https://developers.google.com/machine-learning/crash-course/classification/check-your-understanding-roc-and-auc?hl=zh-cn) - [Check you understanding: ROC curve & AUC (English)](https://developers.google.com/machine-learning/crash-course/classification/check-your-understanding-roc-and-auc) ::: :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 **預測偏差** - 預測偏差 (Prediction bias) 並不等於 偏差 (bias,$y=wx+b$ 中的 $b$ ) - 邏輯迴歸 沒有 bias 我們先來想像一個情境: 所有電子郵件中,平均只有 1% 的垃圾郵件, 因此一個好的 垃圾郵件辨識器 預測應該是電子郵件平均有 1% 的可能性是垃圾郵件, 而現在有一個 垃圾郵件辨識器 (spam filter) 要分辨郵件是否為 垃圾郵件, 但如果這一個 垃圾郵件辨識器 預測電子郵件平均有 20% 的可能性是垃圾郵件 那麼就可以說,這一個 模型 出現了 **預測偏差 (Prediction bias)** 而出現預測偏差的可能原因包括: - feature 不完整 - data set 的 noise 過大 - 訓練資料有 bias - regularization 的 lambda值 過大 ::: 我們剛剛提到的,皆為 二元分類 (binary classification), 不過,為什麼都不提到多元分類 (multi-class classification)? 事實上,多元分類是由許多的 二元分類 所組成的, 什麼意思呢? 假設今天我們要預測 3 個類別:a、b、c 則可以先利用 第一個 logistic regression 將 a 分類成 **a類** 與 **非a類**, 再來就可以利用 第二個 logistic regression 將 非a類 分類成 **b類** 與 **c類**,以此類推 現在,我們再次複習 邏輯迴歸 (Logistic Regression),並使其整理為下圖: ![](https://i.imgur.com/Xcm5zc9.png) - 輸入的數據 (input,即左邊三個箭頭) 與 偏差 (bias,即藍色方框) 的總和: $\sum feature_n + b$ - 這裡的 $σ(z)$ 代表的是 S形函數 (sigmoid fuction) 重點來了,邏輯迴歸的 輸出 (ouput) 可以當成其他邏輯迴歸 的 輸入 (input), 所以,邏輯迴歸的輸入,也可以是來自其他邏輯迴歸的輸出,因此可以整理為下圖: ![](https://i.imgur.com/uZYJfYO.png) 看起來是不是很 Powerful! 所以,它有一個聽起來很酷的名字,那就是:**類神經網路 (Neural Network)** # 11. 類神經網路(Neural Networks) 在 AI 領域中,類神經網路是常被使用的一種 **模仿生物神經網路的結構和功能的模型** 在上一節,我們粗淺地提到類神經網路,不過這並不夠, 那麼,現在就讓我們從最簡單的 Linear Model 講起吧! 假設我們今天想要用如下圖的資料集,訓練模型: ![](https://i.imgur.com/FgVFJN4.png) 如果使用線性模型 (如下圖),完全沒有辦法解決問題 (不考慮特徵交叉): ![](https://i.imgur.com/z5UAbbM.png =400x) 如果我們把它變得看起來更複雜一點,想想看,能不能解決這樣的問題?(不考慮特徵交叉): ![](https://i.imgur.com/TFxx7XE.png =400x) - 你可以將 input 與 hidden layer 看成一體 - 事實上,這樣的模型,輸出依然是線性,因此並沒有辦法解決問題 這時候,我們就會使用 **激勵函數**,將模型的輸出從 線性 (Linear) 轉為 非線性 (Nonlinear): ![](https://i.imgur.com/EN0QaJp.png) :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 如果你想要了解更多 類神經網路 (NN),可以參考: - [cs231n Note](http://cs231n.github.io/neural-networks-1/) 如果對英文不是那麼熟悉,那麼你可以參考簡體版本 - [cs231n Note 翻譯 (上)](https://zhuanlan.zhihu.com/p/21462488?refer=intelligentunit) - [cs231n Note 翻譯 (下)](https://zhuanlan.zhihu.com/p/21513367?refer=intelligentunit) ::: ## 11.1 激勵函數(activation function) 激勵函數是為了模擬 非線性 (Nonlinear) 的問題,也是 深度學習 (DL) 中最重要的環節之一,而常使用的 activation function 有: - Sigmiod &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![](https://i.imgur.com/fmBI9W8.gif =300x) - ReLU &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;![](https://i.imgur.com/4zoZmqy.png =300x) :::danger <i class="fa fa-columns fa-fw"></i> 知識補充 雖然我們只提到較兩種激勵函數,但事實上,還有許多其他的激勵函數 如果你對於激勵函數想要了解更多的話,可以參考: [26種不同的激勵函數介紹](https://www.jiqizhixin.com/articles/2017-10-10-3) ::: :::success <i class="fa fa-leaf fa-fw"></i> Exercise - [試著建立個類神經網路吧!(中文版)](https://developers.google.com/machine-learning/crash-course/introduction-to-neural-networks/playground-exercises?hl=zh-cn) - [A First Neural Network (English)](https://developers.google.com/machine-learning/crash-course/introduction-to-neural-networks/playground-exercises) ::: 我們在前面提到的機器學習三大步,你還記不記得呢? 那麼現在就來複習一下吧: 1. 選一個模型:現在是 類神經網路 (NN) 2. 準備訓練資料 3. 找到最好的 function 找到最好的 function?要怎麼找呢?跟我們剛剛提到的 Loss 一樣嗎? 沒錯,NN 也需要使用 梯度下降 來找到最好的 function, 不過比較不同的是,NN 的參數可能有幾百萬個, 如果要一個又一個將 NN 的參數更新 (即梯度下降),所要花費的時間將會非常久, 因此,Geoffrey Hinton 就提出了 **反向傳播** 的概念 ## 11.2 反向傳播 (Backpropagation) :::info 由於反向傳播需要 **偏微分** 的基礎,如果你對於微積分不是很熟悉的話,可以看完大致介紹,並跳過這一小節 ::: :::warning <i class="fa fa-columns fa-fw"></i> 大致介紹 簡單來說,反向傳播即 **微分連鎖率** 的應用, 事實上,如果要讓 NN模型 的 Loss 值變小,必須對所有參數基於某個參數做偏微分,不過,假如 NN模型裡 有 100萬 個 權重參數,那麼計算量會非常的大, 因此,神經網絡之父(Geoff Hinton) 就提出了 **反向傳播**,解決大量計算的問題 ::: 在提到 反向傳播 (Backpropagation) 前,我們得先了解 正向傳播 (Forward propagation) 是什麼: 正向傳播 (Forward propaation),你可以先想成是,從左到右的計算,即預測的動作 而 反向傳播 與 正向傳播的方向相反,反向傳播 的順序是從 **輸出層 → 隱藏層 → 輸入層** 並傳遞 **局部偏微分值**,最後就能輕易的找到各權重與損失函數的關係 由於反向傳播解釋較為麻煩,因此我們推薦你使用 stanford CS231n 的課堂筆記理解 反向傳播 的觀念: - [cs231n-原文](http://cs231n.github.io/optimization-2/) - [cs231n-簡體翻譯](https://injuryholmes.me/2018/02/09/optimization2/) :::danger <i class="fa fa-columns fa-fw"></i> 延伸閱讀 - 反向傳播 - [Yes you should understand backprop](https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b) - [深度學習-反向傳播](https://www.jianshu.com/p/25888f34c280) - [正反向傳播動畫 (英文版)](https://google-developers.appspot.com/machine-learning/crash-course/backprop-scroll/) - [正反向傳播動畫 (中文版)](https://google-developers.appspot.com/machine-learning/crash-course/backprop-scroll/?hl=zh-cn) ::: ## 11.3 類神經網路的輸出層 (Output layer) 事實上,我們會依據不同的預測需求,而更改 NN輸出層 的 function: - 迴歸 (Regression) 問題:使用恆等函數,即 $f(x)=x$ - 分類 (Classification) 問題:使用 Softmax function ### 11.3.1 Softmax function Softmax fuction,實際上是有限項離散機率分布的梯度對數歸一化。$$P(y=j \mid x) = \frac{e^(x^Tw_j)}{\sum_{k=1}^{K} e^(x^Tw_k)}$$ 舉個例子,假設現在有一個模型要辨識手寫數字 0~9,並在輸入一張數字的圖片後, 經由 Softmax (以及隱藏層),將會輸出該圖片分別屬於 0 ~ 9 的機率為何,且所有的機率總和為 1 ![](https://developers.google.com/machine-learning/crash-course/images/SoftmaxLayer.svg?hl=zh-cn =450x) ## 11.4 讓模型變得更穩健的方式 - Dropout - Batch Normalization # 實作 Coding 你可以參考 Google MLCC 的 Programming 練習 - [中文版](https://developers.google.com/machine-learning/crash-course/exercises?hl=zh-cn) [英文版](https://developers.google.com/machine-learning/crash-course/exercises) # 延伸教材 我們提到的只是機器學習基礎中的基礎,因此不會有太多深入的了解,如果你對 ML/DL領域有興趣,想了解更多知識,可以觀看下列的教學: - 台大田神(林軒田)的 既基礎又重要的課程 - [機器學習的基石](https://www.youtube.com/playlist?list=PLXVfgk9fNX2I7tB6oIINGBmW50rrmFTqf) - [機器學習的技法](https://www.youtube.com/playlist?list=PLXVfgk9fNX2IQOYPmqjqWsNUFl2kpk1U2) - [name= ] 適合對象:有大學微積分基礎 者 - [cs156](https://work.caltech.edu/telecourse) - 這是田神的指導教授 在加州理工大學所開 機器學習入門課程,不過跟田神所開的課程,內容可以說是大同小異 - [name= ] 適合對象:有大學微積分基礎、英文能力較佳 者 - [李宏毅 ML lecture](https://www.youtube.com/watch?v=CXgbekl66jc&list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49) - 同樣是台大的大神教授,其清楚且幽默的教學方式,使艱澀的觀念變得簡單易懂 - [name= ] 適合對象:有大學微積分基礎、欲參加 寶可夢發表大會 者 - [cs231n](http://cs231n.stanford.edu/) - 由史丹佛大學所開,是一個介紹 圖像辨識 的課程,不需任何 DL (深度學習) 的知識,因為講師會從零開始講起,且課程內容非常的充實 - [name= ] 適合對象:英文能力較佳 者 - [cs224n](http://web.stanford.edu/class/cs224n/) - 由史丹佛大學所開的基礎課程,用來介紹 NLP (自然語言處理) 的基礎課程 - [name= ] 適合對象:英文能力較佳、攻讀研究所 者 # 引用文獻 (Reference): 1. [莫凡的python](https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/3-09-l1l2regularization/) 2. [26种神经网络激活函数可视化](https://www.jiqizhixin.com/articles/2017-10-10-3) 3. [cs231n](http://cs231n.stanford.edu/) 4. [斯坦福 cs231n课程整理 Convolutional Neural Networks for Visual Recognition](https://www.jianshu.com/p/182baeb82c71) 5. [Yes you should understand backprop](https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b) 6. [Google Machine Learning Crash Course](https://developers.google.com/machine-learning/crash-course/) 7. [ML Lecture by 李宏毅](https://www.youtube.com/watch?v=CXgbekl66jc&list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49) 8. Deep Learning:用 Python 進行深度學習的基礎理論實作 - 斎藤康毅 著 - 吳嘉芳 譯 9. [反向傳播演算法](https://www.itread01.com/content/1543244283.html) 10. [自動微分](https://blog.csdn.net/aws3217150/article/details/70214422)