# 深度學習 報告一 (深度學習)
# 機器學習 (machine learning)
> 從資料中分析獲得規律,面對未曾學習過的資料,也能夠進行預測,這樣的過程稱為 機器學習
>
## ( 一 ) 監督式學習
監督式學習是針對有答案的資料進行學習 , 舉例來說 , 輸入 狮子 老虎 花豹
等動物的圖片 , 機器可以回覆正確的答案
### 例子:
現在進入收費停車場時,原本領取代幣的方式都已殺改成車牌辫識,在柵欄附
近都會架設照相機來拍攝汽車的車牌並進行數字辨識
這也是屬於監督式學習的一種應用
## ( 二 ) 非監督式學習
相對於監督式學習 , 這是不需要答案的學習 , 最常見的技術稱為對抗生成網路
(Generative Adversarial Network . 簡稱 GAN)
### 例子:
例如圖片的畫風轉換或者是創造從沒見過的人臉圖,將影片中的主角換成自己的臉等
## ( 三 ) 強化學習
透過獎懲機制進行訓練 , 讓電腦能夠減少被懲罰的次數 , 得到更多的獎勵來完成任務
### 例子:
例如自動停車 , AlphaGO 的下棋赢過人類, AlphaStar 在星海爭霸2勝過人類頂尖玩家等
---
# 深度學習
## 概論
近年來 , 監督式學習,非監督式學習與強化學習的高速發展都歸功於深度學習的強大學習能力
深度學習是以類神經網路為架構進行的學習方式
## 類神經網路 - 神經元結構 ( Neuron )
主要分成四個部分
- 接收區 : 接收訊號 , 訊號可以是多個來源
- 觸發區 : 決定是否產生神經衝動
- 傳導區 : 當產生動作電位 . 遵守全有全無定律來傳導神經衝動
- 輸出區 : 讓突觸的神經物質釋出 , 影響下一個接收的細胞
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7c0b5bae-dd58-46e5-a65c-f5c70c38c9ec%2FUntitled.png?table=block&id=7e7e53dd-2ae1-4730-820d-e128e90ca29f&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
## 類神經網路 - 模擬神經元單位
先以單一神經元搭配單一輸入與單一輸出來看 , 一樣使用 Y=ax +b,X 就是相當
於接收區的輸入訊號,原本方程式的 a 改成神殺網路常用的 w .
意思是輸入訊號的權重 ( weight ),b 則是偏移值 ( bias ) , Y 就等於 wX+b
如下圖所示
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F86150ef4-c4bf-4679-9ee6-a72843b40d75%2FUntitled.png?table=block&id=7955da55-ecec-4c4b-89dc-27dcdfbb0ca1&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=1560&userId=&cache=v2)
不過這個 Y 並不是我們最後輸出的結果 ( Yout ) 在中間還要加上一個激勵函數( activation ),因為在現實生活中,問題不會是線性(理想型),而是以非線性的方式呈現,引此加上激勵函數可以使結果變成非線性
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F92132311-a8da-4a96-b07b-a0edef135941%2FUntitled.png?table=block&id=26b73659-233b-4cb5-b24c-fe9ec598075b&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=1500&userId=&cache=v2)
而使用數學來模擬出的神經元結構就出來了
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fc325dcc9-d3b8-4a08-9729-c61d4e43a271%2FUntitled.png?table=block&id=57e540f2-2e5e-4af2-9c6d-98fdf7a9db12&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=1560&userId=&cache=v2)
## 激勵函數 ( activation )
剛剛有提到 Y = wX+b,而 Y 需要再經過一個激勵函數才會是頁正的輸出
這個激勵函數是為神經元導入非線性 , 稱之為激勵函數
有了激勵函數,就可以判斷 Y 的重要性而決定傳遞給下一層神經元的數值要大或
是小,若是重要,輸入相對大的数值,若不重要,輸出相對小的值 ( 0 或是負值 )
激勵函數有很多種,這邊只講兩種分別是
- Sigmoid 函數
Sigmoid 函數又稱為 S 函數,他的公式是 $f( Y ) = \frac {1} {1+e ^ {-Y}}$ 其值會介於 0 ~ 1 之間
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F091eba59-8ad0-4df5-98fe-d901197f86aa%2FUntitled.png?table=block&id=02973873-2dc6-44db-a4af-77db2916e354&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=1450&userId=&cache=v2)
當 Y 為不同時,經過激勵函數的狀況如下:
- Y = -6 ⇒ 0.0024
- Y = -4 ⇒ 0.018
- Y = 0 ⇒ 0.5
- Y = 4 ⇒ 0.9933
- Y = 6 ⇒ 0.9975
> ⚠️ 不過 Sigmoid 函數 會有個缺點,就是當 Y ≥ 5 之後,$Yout$ 的數值都差不多,
就是當 Y ≤ -5 之後,$Yout$ 的數值也都差不多,不會有太大的變化
- Relu 函數
Relu 函數的規則是,當 Y ≥ 0 時,$Yout$ 的數值等於 Y ,而當 Y < 0 , 則 $Yout$ 一律為 0
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F831d1f8c-08ea-4e11-83d9-c0fdbf49faff%2FUntitled.png?table=block&id=2d65dd7f-31e9-4941-9336-73b4795a835a&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=1360&userId=&cache=v2)
>⚠️ 雖然當 Y ≥ 0 時 $Yout$ 是線性,但以整體來看,函數的表現依舊是線性的
## 多層結構的神經網路
神經網路是可以多層的,如下圖
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F95577567-863f-42be-9bd1-16f4d6d9c978%2FUntitled.png?table=block&id=265b314d-7b32-45e6-aae6-559dca1619c6&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
而為了能更好的理解,因此可以簡化設計圖
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F77e51d10-faa2-4337-b2f5-c866b39d24db%2FUntitled.png?table=block&id=28ababf9-2b91-4347-ba78-3e6984939000&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
## 練習題
![IMG_20220811_142103.jpg](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F096528e8-c60c-4a78-a380-c022fa3e948a%2FIMG_20220811_142103.jpg?table=block&id=2d1b2a62-e526-44ff-896d-a6e7b9b4a771&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
## 深度學習
> 當隱藏層裡建立多層的神經元,把神經網路疊得越來越深,就稱之為深度學習
>
深度學習其實就是類神經網路
只是將網路建構的極其錯粽複雜並讓電腦學習所有輸入資料的內容與關聯性
### 類神經網路的目的
機器學習其實就是在做 Y = formula(x) ,而formula 的建立是使用類神經網路,
類神經網路裡有很多的神經元,這神經元含有眾多的 w 與 b,其目的就是求出所有 w 與 b 的最佳解
## 損失值 ( Loss )
不過電腦要怎麼去知道自己是對是錯呢?那就是直接拿正確的答案進行比對,而比對後會得到與正確答案的差距,這時這個就是損失值 ( 最終的輸出資料稱為類神經網路的預測值 (prediction) )
不過要計算損失值,就會需要用到損失函數,而描述損失的函數就稱為損失函數
>📌 預測值與正確答案比對的誤差( Error )就是損失( loss )
描述損失的函數就稱為損失函數( loss function or cost function )
並且根據誤差,就會對 weight ( 權重 ) 進行調整,並產生出新的預測值 (prediction)
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fbff42555-89ad-4fb9-80b5-e3979fe1296a%2FUntitled.png?table=block&id=8f5d6769-7a9b-4d8e-b80a-9cef12039f16&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=1510&userId=&cache=v2)
## 正確答案 ( labels )
使用類神經網路學習圖像分類之前,要準備好已知資料,其包含圖片與正確答案
而這些正確答案就是人類看過關片後給予正確的標籤 ( labels )
那標記圖片的過程就稱為 labeling ( 標籤化 )
## 類神經網路的預測值
類神經網路的原始輸出並不是最終的預測值,會經過處理,而因為每個輸出值可能大或小,這會導致不能用同個基準點來判斷,於是便提出將該數值轉成每個類別的機率值,而這個轉換的方法就是
softmax 函數
## softmax 函數
softmax 展開後為 $S(yi) = \frac {e ^ {yj}} {\sum e ^ {yj}}$ j是指輸出資料的索引值,若輸出有10個,j = 0 ~ 9
分子就是輸出資料裡的每個元素再徑過指數函數 ( $e ^ {x}$ )後的數值
numpy 程式為 `exp(x)`
分母的意思是將輸出資料裡的每個元素經過指數函數後的加總
利用softmax 函數就能使數值一定是 0 ~ 1 , 而加總起來一定為 1 ( 變成同一基準點 )
>📌 使用 softmax 函數還有一個好處,就是可以拉開 ( 加大 ) 每個類別間的差距
在原始數據中比重大的類別經過 softmax 函數後比重會更大
在原始數據中比重小的類別經過 softmax 函數後比重會更小
## 損失函數 ( loss function )
在類神經網路、深度學習領域裡的損失函數有非常多種,
如交叉熵( Crossentropy )、MSE、COCO loss、Center loss、Sphere loss、Cosine loss、Arc loss、
Circle loss、Proxy anchor loss 等各種學者提出來的損失函數。
在分類問題最常用到的就是交叉熵( Cross entropy )
### 交叉熵 ( **Cross entropy** )
熵有種說法是系統混亂程度的度量,應用在分類問題上則可以想做類神經網路預測錯誤程度的度量,當預測錯誤,熵會增加;預測對了,熵會下降
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fc817bf57-6a3a-4b45-9533-e817cc6bcac8%2FUntitled.png?table=block&id=089939d8-7580-43d1-a0bb-8beafdadbb96&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F21d26b82-d4c1-4894-9262-6df86b7b4334%2FUntitled.png?table=block&id=ddf482f6-2cd8-4951-8e51-1267d4340193&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
### One-hot 編碼
不過因為預測資料會有多個數值,但是正確答案只有一個,因此就會對數值進行 One-hot encoding 簡單來說,就是把對的答案數值變成 1 ,不對的答案數值變成 0 ,這樣就能繼續運算交叉熵了
範例:
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F296ff067-9a1c-479a-9265-31c7ba7aecd9%2FUntitled.png?table=block&id=30c540a9-0809-4e24-b96a-b0e02458b5c9&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
## 權重最佳化
為了讓類神經網路的預測結果正確,要讓損失值不斷地降低,因此就需要持續最佳化所有的 w 與 b !
最佳化的理論主要是反向傳播( Backpropagation )與結合梯度下降 ( Gradientdescent )
將神經網路所有w與b計算損失函數的梯度,反饋給最佳化方法,更新權重來降低損失值。
最佳化的演算法有很多種,而最常用的便是 Adam 演算法
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F684973fd-e182-4fa2-b798-5e994afb06b9%2FUntitled.png?table=block&id=d100b96d-ca5d-470e-8dd5-36a461f0f96e&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=670&userId=&cache=v2)
## 學習率 ( learning Rate )
學習率就是在每次進行權重最佳化時修改權重內容的**幅度**
不同的學習率會造成不同的效果
- 當學習率較大時,每次修改權重的幅度就較大,
- 當學習率較小時,每次修改權重的幅度就較小,其損失值下降就慢
但會比較容易達到區域最小的損失值
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9181cc3c-a5c8-450a-90e7-4d4ac7b3e72b%2FUntitled.png?table=block&id=9b06b921-3a48-4d6c-b30f-f14045cb1ea7&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
好的學習率如下圖
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4fd1e451-5c9c-4bbf-ba2a-5092b3560770%2FUntitled.png?table=block&id=b1717a09-23f6-497e-ae96-56807876a501&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=770&userId=&cache=v2)
![Untitled](https://lockowl-study.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F179bada2-d247-4d80-a132-f6fc4cf62d98%2FUntitled.png?table=block&id=4978e337-4e26-4b2a-b40a-29545cf6054d&spaceId=5b32f493-ae77-4a08-bcaa-f1e77c715bb0&width=2000&userId=&cache=v2)
>📌 訓練模型 ( model training ) 指的就是類神經網路進行最佳化權重的過程
## 批次數量,迭代次數與訓練週期
設定批次資料的多寡稱為批次數量( batch size ),當設定批次數量小的時候,最佳化的次數多,
所需時間長;設定批次數量大的時候,所需時間少,但耗用的電腦資源就相對較多。
使用批次資料進行一次最佳化演算法更新權重稱為迭代( iteration )
### 已知資料總數 = 批次數量 x 迭代次數
當類神經網路學過一次已知資料稱為一個訓練週期( epoch )。
訓練週期的設定不會是固定值,依照資料集、模型大小、分類數量、損失值下降程度等因素而不同。