---
# System prepended metadata

title: Deep Learning
tags: [self-learning, ' DL']

---

---
title: Deep Learning
tags: self-learning, DL
---
{%hackmd BkVfcTxlQ %}

# **_Deep Learning_**
> [name=BessyHuang] [time=Tue, Apr 14, 2020]

# **課程大綱**
[TOC]

:::warning
**_Reference:_**
* [LeCun、Bengio、Hinton三巨頭曾合體，Nature發文綜述深度學習](https://kknews.cc/news/aaa43pg.html)
* [深度學習-LeCun、Bengio和Hinton的聯合綜述（上）](https://www.csdn.net/article/2015-06-01/2824811)
* [深度學習-LeCun、Bengio和Hinton的聯合綜述（下）](https://www.csdn.net/article/2015-06-02/2824825)
    * [深度學習 - colah's blog](http://colah.github.io/)
    * [3 分鐘搞懂深度學習到底在深什麼](https://panx.asia/archives/53209)
    * [淺談Deep Learning原理及應用](http://www.cc.ntu.edu.tw/chinese/epaper/0038/20160920_3805.html)
    * [CNN 與 RNN 之間的差異？](https://blogs.nvidia.com.tw/2018/09/whats-the-difference-between-a-cnn-and-an-rnn/)
:::

---
## **前言**
> 本篇目標：深入淺出地介紹了深度學習的基本原理和核心優勢。
> 

* 深度學習領域的三巨頭：Yann LeCun, Yoshua Bengio, Geoffrey Hinton
* 深度學習 = 機器學習的一個分支
    * 目標
        * 把資料透過多個處理層 (layer) 中的線性或非線性轉換，自動抽取出足以代表資料特性的特徵 (feature)。
            > 轉變成更高層次、更加抽象的表達！！！
    * 應用
        * 深度卷積網絡：處理圖像、影片、語音、音訊
        * 遞歸網絡：處理序列數據 (文本、語音)
    * 利用反向傳播演算法（Backpropagation）發現大數據中的複雜結構。
        * BP 演算法：指導機器如何從前一層獲取誤差，來改變本層的內部參數。


* 傳統的機器學習 VS. 深度學習
    * 傳統 ML 需要相當多該領域專門知識來設計一個特徵提取。(人工)
    * 深度學習的優勢
        * 對於分類任務，高層次的表達強化對輸入數據的區分能力，同時削弱不相關因素。
        * 特徵提取：非人工，而是從數據中學到的。

---
## **監督式學習**
> Supervised learning

* 機器學習中，不論是否是深層，最常見的形式是監督式學習。
* 監督式學習
    * 先訓練(訓練集)，再測試(測試集)。
    * 所有資料都被「標註」(label)，告訴機器相對應的值，以提供機器學習在輸出時判斷誤差使用。
        > 「標註」(label) = 標準答案
        > Output 擁有最高得分的類別，它是以向量形式的分數來表示。
        > 
    * 優/缺點
        * 準確率高。
        * 大量的事前人工作業。
        * 當範圍擴大、資訊量增加，會更難去對資料標記出所有特徵，所以在面對未知領域時，幾乎是完全無法運作。
    * 利用 誤差(真實分數 - 輸出分數) -> 調整內部參數(權重)
        * 目標：達到『損失函數最小化』，亦即誤差最小。
        * 方法：為了適當地調整權重向量，因此計算梯度向量(gradient vector)。
            > 梯度向量：表示若權重增加很小的量，誤差將增加或減少的量。
            > 沿著與梯度向量相反的方向調整權重向量。
            
            * [[深度學習講中文] 簡單解釋梯度下降法 (Gradient Descent, GD)](https://medium.com/@arlen.mg.lu/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E8%AC%9B%E4%B8%AD%E6%96%87-gradient-descent-b2a658815c72)
            * ==[隨機梯度下降法 (Stochastic gradient descent, SGD)](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)==
                > GD VS. SGD
                > * GD：每次跑「全部訓練集」計算損失函數的梯度就更新一次參數。
                > * SGD：每次跑「隨機抽取的一個樣本或是小批次(mini-batch)樣本」計算這些樣本的平均梯度後就更新一次參數。
    
* 分類器
    * 線性
        * 透過特徵的線性組合來做出分類決定。
            > Ex: 通過一個超平面把空間分成兩部分。
            > 
    * 非線性
        * 針對圖像、語音識別。
        * 因為希望對不相關因素的變化不要過於敏感(如：位置的變化、目標的方向或光照、語音中音調或語調的變化)，但是需要對一些特定的微小變化非常敏感。
            > Ex: 區分 白色的狼 VS. 像狼一樣的白狗(Samoyed薩摩耶)
            > kernel methods, Gaussian kernel

---
## **反向傳播來訓練多層架構**
> Backpropagation to train multilayer architectures

* 隱藏層的作用
    > 可看作使用一個非線性方式打亂輸入數據，
    > 來讓輸入數據對應的類別在最後一層變得線性可分。
    > 

* 反向傳播演算法 (BP)
    > 一種在神經網路中用來更新權重的方法，
    > 更新的基準是根據神經網路的實際輸出值和期望輸出值之間的關係。
    > 
    > 它建立在Gradient Descent演算法的基礎上。
    > 

    * 目的
        * 該方法對網絡中所有權重，計算損失函數的梯度。
    * [原理](https://stanford.edu/~shervine/l/zh-tw/teaching/cs-229/cheatsheet-deep-learning)：輸入 <- 輸出
        * 權重的導數是根據連鎖律 (chain rule) 來計算。

* 前饋類神經網路
    * 原理：輸入 -> 輸出
        > 每一層計算完成的輸出，只會單方向往前傳遞給下一層的輸入。
        > 通過非線性激活函數傳遞，如：rectified linear unit (ReLU)
        > ![](https://i.imgur.com/3XP3892.png)
        > 

    * 種類
        * 卷積神經網路 (Convolutional neural network, ConvNet)
            * 優點：易於訓練、比全連接的神經網絡的泛化性能更好
            * 應用：計算機視覺

:::success
* 1990年代晚期，NN 和 BP演算法 被大多數ML團隊拋棄，同時也不受計算機視覺和語音識別的重視。因為人們普遍認為，在沒有先驗知識的情況下學習有用的、多層次結構特徵提取是不可行的。
    > 確切的說，簡單的梯度下降會讓整個優化陷入到不好的局部最小解。
    > 

* 2006年，加拿大高級研究所（CIFAR）的研究人員提出「非監督的學習方法」，這些方法可創建一些網絡層來檢測特徵而不使用帶標籤的數據。通過預訓練過程，深度網絡的權重可以被初始化為合理的值。使用標準的反向傳播對整個深度系統進行微調。
    > Ex: 語音識別、手寫數字辨識、偵測行人
    > * 對於小的數據集來說，非監督的預訓練可以防止過擬合( overfitting)，
    > 同時可以帶來更好的泛化性能 當有標籤的樣本很小的時候。
:::

---
## **卷積神經網路**
> Convolutional neural networks

* ConvNet
    * 處理多維陣列形式的數據
        * 1D：信號和序列(如：語言)
        * 2D：圖像或音訊頻譜圖
        * 3D：視頻或體積圖像(volumetric images)
    * 利用自然信號之屬性的四個關鍵想法
        1. 區域連結(local connections)：使用過濾器(filters)增強與該局部圖形空間的相關性，然後堆疊許多這樣子的層，可達到非線性濾波的功能，且擴及全域。
            > 允許網路架構從原圖小區塊的較好的特徵值代表性，
            > 組合後變成大區塊的特徵值代表性。
            > 

        2. 共享權重(shared weights)：重複使用過濾器(filters)。
            > 確保在該卷積層所使用的神經元會偵測相同的特徵。
            > 即使圖像位置有旋轉，仍可被偵測。
            
            > 「全連結」的每個weight都是一個參數，此例共有9*4=36個參數
            > [「區域連結」有權重共享的好處](https://medium.com/@chih.sheng.huang821/%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-convolutional-neural-network-cnn-%E5%8D%B7%E7%A9%8D%E8%A8%88%E7%AE%97%E7%9A%84%E5%80%92%E5%82%B3%E9%81%9E%E6%8E%A8%E5%B0%8E%E8%88%87%E7%A8%80%E7%96%8F%E7%9F%A9%E9%99%A3%E8%A7%80%E9%BB%9E%E4%BE%86%E7%9C%8B%E5%8D%B7%E7%A9%8D%E8%A8%88%E7%AE%97-e82ac16e510f)，此例則會只有4個參數。
            > 
            > ![](https://i.imgur.com/oh6GWUB.png)
            > 

        3. 池化(pooling)
        4. 使用多層網絡(the use of many layers)
* [典型的 ConvNet 的架構](https://medium.com/@chih.sheng.huang821/%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-convolutional-neural-network-cnn-cnn%E9%81%8B%E7%AE%97%E6%B5%81%E7%A8%8B-ecaec240a631)
    > ConvNets中的卷積層和池化層，靈感來源於視覺神經科學中的簡單細胞和複雜細胞。
    > 

    * 卷積層
        * 作用：對圖片去做擷取特徵的動作。
        * 該局部加權和的結果，將通過非線性（如ReLU）傳遞。
    * 池化層
        * 作用：得到降維的特徵圖。

---
## **使用深度卷積網絡進行圖像理解**
> Image understanding with deep convolutional networks

* Deep convolutional nets：用於處理圖像、影片、語音。
* ConvNets 應用
    * 檢測、分割、圖像辨識 (使用大量有標籤的數據)
        > ==ConvNets幾乎是所有識別和檢測任務的主要方法(效果媲美人類)== 
        > 近年重大的成功應用：人臉辨識
        > Ex: 交通號誌、生物圖像分割(神經網路體 Connectomics)、偵測人臉.人體.文字.行人
        > 所謂神經網路體是利用先進成像技術追蹤大腦物理路徑的技術。
        > 
    * 自然語言的理解 (自然語言處理)、語音識別、影像辨識、視訊分析
    * ConvNet-based vision systems
        > Ex: 使用基於ConvNet方法的汽車視覺系統(Mobileye、NVIDIA)
        > 
    * 自動電話接聽機器人、自駕車
        > 可以在圖像的像素級別加上標註
    
:::info
* 2012：ConvNets 因為 ImageNet 競賽才開始被電腦視覺、機器學習重視。
    > 使用上百萬張圖片，1000個類，錯誤率幾乎比當時最好的方法降低了一半。
    > 技術：GPU、ReLU、dropout(正則技術)、分解現有樣本以產生更多訓練樣本。
    > 
* ConvNets 結合 recurrent neural network(RNN) 來產生圖像標題
    > From image to text.
    > ![](https://i.imgur.com/AM4RaCK.png)
    > 

* 具有10到20層ReLU(激活函數)、上百萬個權重、幾十億個連接的ConvNet架構。
    > 訓練時間：幾週 (兩年前) -> 幾個小時 (now)
    > 因為軟硬體、並行演算法(algorithm parallelization)的進步。
    > 
* ConvNets很容易在芯片或現場可編程門陣列（FPGA）中的高效實現。
    > NVIDIA、Mobileye、Intel、Qualcomm(高通)以及Samsung正在開發ConvNet芯片，以支持智慧型手機、相機、機器人、自駕車中的實時視覺應用(real-time vision applications)。
    > 

:::

---
## **分布式表示(詞向量)和語言處理**
> Distributed representations and language processing

* 深度網路的優勢
    * 優勢來自於網路中各節點的權重，並取決於由數據產生的分佈。
        * 泛化適應新學習到的特徵值的組合（如：n元特徵就有 $2^n$ 種可能的組合）
        * 指數級的深度
* 多層神經網絡的隱藏層，學習以易於預測目標輸出的方式來表示網絡的輸入。
    > 將文本的內容作為輸入，訓練多層神經網絡來預測句子中下一個單詞。
    > 內容中的每個單詞 表示為網絡中的 $1/N$ 向量。
    > 從文本習得的單詞向量表示，廣泛應用於自然語言中。
    > 

    * 在語言模型中，網絡的其他層學習將輸入的單詞向量轉換為預測的下一個單詞的輸出單詞向量，這可用於預測詞彙表中任何單詞出現為下一個單詞的機率。
        > 單詞與單詞的語義相似度越高，投影在圖的距離就越近。

* 特徵表示的爭論
    * Logic-inspired (基於邏輯啟發)
        * 以「符號」表示
            > 一個符號實體表示某一事物。
            > 沒有內部結構，並且結構與使用是相關的。
            > 
        * 規則推理
            > 理解符號的語義，就必須與變化的推理規則合理對應。
            > 
        * 統計語言模型
            * 沒有使用分佈式特徵表示
            * N-grams：統計簡短符號序列出現的頻率。
                > N-gram 將每個單詞視為一個最小單元。
                > 

    * Neural-network-inspired (基於神經網絡)
        * 大量神經元、權重(矩陣向量)、非線性
        * 直覺推理
            > 常識推理的基礎
            > 
        * 神經語言模型
            * 針對語義相似度
            * 因為每個單詞與實際特徵值的向量相關聯，語義相關的單詞會在向量空間中彼此靠近。

---
## **遞歸神經網路**
> Recurrent neural networks (RNN)
* [Recurrent nets](https://brohrer.mcknote.com/zh-Hant/how_machine_learning_works/how_rnns_lstm_work.html)：用於序列輸入的任務。(連續型資料：語言文字、語音)
    * 概念
        * RNN一次處理一個輸入序列的一個元素，在其隱藏單元中維護一個"狀態向量"，該向量隱含有關該序列所有過去元素的歷史信息。
    * 性質
       * RNN 處理越多步驟，越難保留先前步驟中的信息。
       * RNN 每個 step 中的參數(U, V, W) 是相同的，這使得學習的代價減小許多。

            > ![](https://i.imgur.com/gbzpQlA.png)
            >  | 符號   | 解釋            | 
            >  | ----- | --------------- |
            >  | x     | 某一時刻網絡的輸入 |
            >  | s     | 隱藏狀態，代表網絡的「記憶」，其捕捉在這之前所有時間的信息 |
            >  | o     | 某一時刻網絡的輸出 |
            > 

    * [短期記憶的問題](https://kknews.cc/zh-tw/tech/a4aee9x.html)
        * 短期記憶是由`梯度消失問題`所引起。
            > 梯度：用於調整網絡內部權重的值，使得網絡可進行學習。
            > 

        * 短期記憶、梯度消失是因為`反向傳播`的性質所造成。
            > 反向傳播：用於訓練和優化神經網絡的演算法。
            > 

            :::info
            ==**梯度消失的問題**==
            * 原理：
            梯度越大，調整越大，反之亦然。（問題所在）
            進行反向傳播時，層中的每個節點會計算它在其前面的層中的梯度。

            * 運作：
            如果在它之前對層的調整很小，那麼對當前層的調整將更小，導致梯度在反向傳播時呈指數級收縮。
            （由於梯度極小，內部權重幾乎沒調整，因此較早的層無法學習）
            :::
            


        * 解決方法：長短期記憶(long short-term memory, LSTM)、門控循環單位(GRU)、[神經圖靈機(Neural Turing Machine)](http://cpmarkchang.logdown.com/posts/279710-neural-network-neural-turing-machine)
            > LSTM：改進RNN的隱藏層，以解決難以長期保存信息的問題。
            > LSTM 可通過 gate 決定網絡需要記住和遺忘多長時間之前的記憶，以此聯合之前的狀態、記憶和輸入。
            > 

            > 神經圖靈機：可以學會電腦程式的邏輯控制與運算（電腦能做的事）。

    * 優勢
        * RNN 擅長預測文本中的下一個字符或句子中的下一個單詞，也可用於更複雜任務。
            > 得益於其結構和訓練方式的進步
            > 
            * English 'encoder' network（RNN）-> French 'decoder' network（RNN）
                > thought vector: 表示句子所要表達的意思或思想。
                > 總體而言，此過程是根據英語句子的機率分佈而生成法語單詞序列。
                > ![](https://i.imgur.com/NzrMvEq.png)
                > * 質疑：理解句子是否需要通過使用推理規則操縱內部符號表示？
                > 

    * 應用
        * 機器翻譯
        * 神經語言建模
        * From image to text
            > Encoder: deep ConvNet
            > Decoder: RNN

---
## **深度學習的未來**
> The future of deep learning

* 期望未來「非監督式學習」變得更加重要。
    > 「非監督式學習」在人類和動物的學習中佔據主導地位：
    > 通過觀察發現世界的內在結構，而不是通過告知每一個物體的名稱來發現它。
    > 

    * 監督式學習的成功，蓋過了非監督式學習。
        
* 期望未來在「機器視覺方面」有更多的進步。
    > 進步來自於結合ConvNets和RNNs的端對端訓練系統，採用增強學習來決定看哪裡。
    > 目前，結合深度學習和增強學習的系統正處於起步階段。
    > 

* 未來幾年，「自然語言理解」將是深度學習產生巨大影響的領域。
    > 我們預測使用RNNs的系統將會更好地理解句子或者整個文檔，當它們選擇性地學習了某時刻部分加入的策略時。
    > 

* 人工智慧的重大進步，將來自結合「複雜推理與表示學習（representation learning）的系統」
    > 儘管深度學習和簡單推理已經應用於語音和手寫字辨識很長一段時間了，但仍需要新的範例來通過對大向量進行運算來代替基於規則的符號表達式操縱。
    > 
