# 機器學習超級復習筆記
> 原文:[Super Machine Learning Revision Notes](https://createmomo.github.io/2018/01/23/Super-Machine-Learning-Revision-Notes/#negative_sampling)
>
> 譯者:[飛龍](https://github.com/wizardforcel/)
>
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
### [最后更新:06/01/2019]
本文旨在概述:
* **機器學習中的基本概念**(例如,梯度下降,反向傳播等)
* **不同的算法和各種流行的模型**
* 一些**實用技巧**和**示例**是從我自己的實踐和一些在線課程(如[DeepLearningAI](https://www.deeplearning.ai/) )中學習的。
**如果您是正在學習機器學習的學生**,希望本文可以幫助您縮短復習時間并給您帶來有益的啟發。 **如果您不是學生**,希望本文在您不記得某些模型或算法時會有所幫助。
此外,您也可以將其視為“**快速檢查指南**”。 請隨意使用`Ctrl + F`搜索您感興趣的任何關鍵字。
任何意見和建議都非常歡迎!
* * *
### 激活函數
| 名稱 | 函數 | 導數 |
| --- | --- | --- |
| Sigmoid |  |  |
| tanh |  |  |
| | | 如果為,則為 0 |
| ReLU |  | 如果  則為 1 |
| | | 如果  則未定義 |
| | | 如果  則 0.01 |
| LReLU |  | 如果  則為 1 |
| | | 如果  則未定義 |
### 梯度下降
梯度下降是找到目標函數(例如損失函數)的局部最小值的一種迭代方法。
```
Repeat{ W := W - learning_rate * dJ(W)/dW}
```
符號表示更新操作。 顯然,我們正在更新參數的值。
通常,我們用表示學習率。 訓練神經網絡時,它是超參數之一(我們將在另一部分介紹更多的超參數)。 是我們模型的損失函數。 是參數的梯度。 如果是參數(權重)的矩陣,則將是每個參數(即)的梯度矩陣。
**問題**: **為什么在最小化損失函數時減去梯度而不加梯度?**
答案:
例如,我們的損失函數為,可能看起來像:

當時,梯度為。 顯然,如果我們要找到的最小值,則梯度的相反方向(例如)是找到局部最低點(即)的正確方向。
但是有時,梯度下降法可能會遇到局部最優問題。
#### 計算圖
該計算圖示例是從[DeepLearningAI](https://www.deeplearning.ai/) 的第一門課程中學到的。
假設我們有 3 個可學習的參數,和。 成本函數為。 接下來,我們需要計算參數的梯度:,和。 我們還定義:,和。 該計算可以轉換成下面的計算圖:

#### 反向傳播
從上圖可以明顯看出,參數的梯度為:,和。
計算每個節點的梯度很容易,如下所示。 (提示:實際上,如果您正在實現自己的算法,則可以在正向過程中計算梯度以節省計算資源和訓練時間。因此,在進行反向傳播時,無需再次計算每個節點的梯度 。)

現在,我們可以通過簡單地組合節點梯度來計算每個參數的梯度:




#### L2 正則化的梯度(權重衰減)
通過添加可以稍微改變梯度。
```
Repeat{ W := W - (lambda/m) * W - learning_rate * dJ(W)/dW}
```
#### 梯度消失/爆炸
如果我們有一個非常深的神經網絡并且未正確初始化權重,則可能會遇到梯度消失或爆炸的問題。 (有關參數初始化的更多詳細信息:[參數初始化](https://createmomo.github.io/2018/01/23/Super-Machine-Learning-Revision-Notes/#parameters_initialization))
為了解釋什么是消失或爆炸梯度問題,將以一個簡單的深度神經網絡架構為例。 (同樣,很棒的例子來自在線課程[DeepLearningAI](https://www.deeplearning.ai/) )
神經網絡具有層。 為簡單起見,每層的參數為 0,所有激活函數均為。 此外,每個參數具有相同的值。
根據上面的簡單模型,最終輸出將是:

因為權重值,我們將在某些易爆元素中獲得。 同樣,如果權重值小于 1.0(例如 0.5),則某處會有一些消失的梯度(例如)。
**這些消失/爆炸的梯度會使訓練變得非常困難。 因此,仔細初始化深度神經網絡的權重很重要。**
#### 小批量梯度下降
如果我們擁有龐大的訓練數據集,那么在單個周期訓練模型將花費很長時間。 對于我們而言,跟蹤訓練過程將非常困難。 在小批量梯度下降中,基于當前批量中的訓練示例計算成本和梯度。
代表整個訓練集,分為以下幾批。 是訓練示例的數量。

小批量的過程如下:
```
For t= (1, ... , #Batches):
Do forward propagation on the t-th batch examples;
Compute the cost on the t-th batch examples;
Do backward propagation on the t-th batch examples to compute gradients and update parameters.
```
在訓練過程中,當我們不應用小批量梯度下降時,與使用小批量訓練模型相比,成本趨勢更加平滑。

#### 隨機梯度下降
當批量大小為 1 時,稱為隨機梯度下降。
#### 選擇小批量
批量大小:
1)如果大小為,即整個訓練集中的示例數,則梯度下降就恰好是“批量梯度下降”。
2)如果大小為 1,則稱為隨機梯度下降。
實際上,大小是在 1 到 M 之間選擇的。當時,該數據集應該是較小的數據集,使用“批量梯度下降”是可以接受的。 當時,可能小批量梯度下降是訓練模型的更好方法。 通常,小批量大小可以是 64、128、256 等。

#### 具有動量的梯度下降(總是比 SGD 更快)
在每個小批量迭代上:
1)在當前小批量上計算和
2)
3)
4)
5)
動量的超參數是(學習率)和。 動量方面,是先前梯度的歷史信息。 如果設置,則意味著我們要考慮最近 10 次迭代的梯度來更新參數。
原始的來自[指數加權平均值](https://www.youtube.com/watch?v=NxTFlzBjS-4)的參數。例如 表示我們要取最后 10 個值作為平均值。 表示考慮最后 1000 個值等。
#### RMSprop 的梯度下降
在每個小批量迭代上:
1)在當前小批量上計算和
2)
3)
4)
5)
#### Adam(將動量和 RMSprop 放在一起)
,,,
在每個小批量迭代中:
1)在當前小批量上計算和。
2)
3)
4)
5)
6)
7)








“校正”是指數加權平均值中的[“偏差校正”](https://www.youtube.com/watch?v=lWzo8CajF5s) 的概念。 該校正可以使平均值的計算更加準確。 是的權重。
通常,默認的超參數值為:,和。
學習率需要調整。 或者,應用學習率衰減方法也可以很好地工作。
#### 學習速率衰減方法
如果在訓練期間固定學習率,則損失/成本可能會波動,如下圖所示。 尋找一種使學習速率具有適應性的方法可能是一個好主意。

##### 基于周期數的衰減

根據周期數降低學習率是一種直接的方法。 以下是速率衰減公式。
例如,初始和衰減率是 1.0。 每個周期的學習率是:
| 周期 |  |
| --- | --- |
| 1 | 0.1 |
| 2 | 0.67 |
| 3 | 0.5 |
| 4 | 0.4 |
| 5 | … |
當然,還有其他一些學習率衰減方法。
| 其他方法 | 公式 |
| --- | --- |
| 指數衰減 |  |
| 周期相關 |  |
| 小批量相關 |  |
| 離散階梯 |  |
| 手動衰減 | 逐日手動或逐小時降低學習率等。 |
#### 批量規范化
##### 訓練時的批量規范化
使用批量規范化可以加快訓練速度。
步驟如下。

每層中的批量規范化的詳細信息是:



和是此處可學習的參數。
##### 測試時的批量規范化
在測試時,我們沒有實例來計算
和,因為每次可能只有一個測試實例。
在這種情況下,最好使用跨小批量的指數加權平均值來估計和的合理值。
### 參數
#### 可學習的參數和超參數
| 可學習的參數 |
| --- |
|  |
| 超參數 |
| --- |
| 學習率 |
| 迭代次數 |
| 隱藏層數 |
| 每一層的隱藏單元的數量 |
| 選擇激活函數 |
| 動量參數 |
| 小批量 |
| 正則化參數 |
#### 參數初始化
(**注意**:實際上,機器學習框架(例如 tensorflow,chainer 等)已經提供了強大的參數初始化功能。)
##### 小初始值
例如,當我們初始化參數時,我們設置一個小的值(即 0.01)以確保初始參數很小:
```
W = numpy.random.randn(shape) * 0.01
```
這樣做的原因是,如果您使用的是 Sigmoid 且初始參數較大,則梯度將非常小。
##### 隱藏單元更多,權重更小
同樣,我們將使用偽代碼來顯示各種初始化方法的工作方式。 我們的想法是,如果隱藏單元的數量較大,我們更愿意為參數分配較小的值,以防止訓練階段的消失或爆炸。下圖可能會為您提供一些了解該想法的見解。

基于上述思想,我們可以使用與隱藏單元數有關的項對權重進行設置。
```
W = numpy.random.randn(shape) * numpy.sqrt(1/n[l-1])
```
相乘項的公式為。 是上一層中隱藏單元的數量。
如果您正在使用 Relu 激活函數,則使用項可能會更好。
##### Xavier 初始化
如果您的激活函數是,那么 Xavier 初始化(或)將是一個不錯的選擇。
#### 超參數調整
調整超參數時,有必要嘗試各種可能的值。 如果計算資源足夠,最簡單的方法是訓練具有各種參數值的并行模型。 但是,最有可能的資源非常稀少。 在這種情況下,我們只能照顧一個模型,并在不同周期嘗試不同的值。

除了上述方面,如何明智地選擇超參數值也很重要。
如您所知,神經網絡架構中有各種超參數:學習率,動量和 RMSprop 參數(,和),層數,每層的單元數,學習速率衰減參數和小批量大小。
Ng 推薦以下超參數優先級:
| 優先級 | 超參數 |
| --- | --- |
| 1 | 學習率 |
| 2 | ,和(動量和 RMSprop 的參數) |
| 2 | 隱藏單元數 |
| 2 | 批量大小 |
| 3 | 層數 |
| 3 | 學習率衰減數 |
(通常,動量和 RMSprop 的默認值為:,和)
##### 隱藏單元和層的均勻樣本
例如,如果層數的范圍是 2-6,我們可以統一嘗試使用 2、3、4、5、6 來訓練模型。 同樣,對于 50-100 的隱藏單元,在這種比例下選擇值是一個很好的策略。
例:

##### 對數刻度上的樣本
您可能已經意識到,對于所有參數而言,均勻采樣通常不是一個好主意。
例如,讓我們說學習率的合適范圍是。 顯然,均勻選擇值是不明智的。 更好的方法是在對數刻度(,,,和)上進行采樣。
至于參數和,我們可以使用類似的策略。
例如

因此,

下表可能有助于您更好地了解該策略。
| | | | |
| --- | --- | --- | --- |
|  | 0.9 | 0.99 | 0.999 |
|  | 0.1 | 0.01 | 0.001 |
|  | -1 | -2 | -3 |
例:

### 正則化
正則化是防止機器學習出現過擬合問題的一種方法。 附加的正則項將添加到損失函數中。
#### L2 正則化(權重衰減)

在新的損失函數中,是正則項,是正則參數(超參數)。 L2 正則化也稱為權重衰減。
對于邏輯回歸模型,是一個向量(即的維數與特征向量相同),正則項應為:
。
對于具有多層(例如層)的神經網絡模型,層之間存在多個參數矩陣。 每個矩陣的形狀是。 在等式中,是層,是層中的隱藏單元數。 因此,L2 正則化項將是:

(也稱為 Frobenius 范數)。
#### L1 正則化

。
如果我們使用 L1 正則化,則參數將是稀疏的。
#### Dropout(反向 Dropout)
為了直觀地了解 Dropout,Dropout 正則化的目的是使受監督的模型更加健壯。 在訓練短語中,激活函數的某些輸出值將被忽略。 因此,在進行預測時,模型將不依賴任何一項特征。
在 Dropout 正則化中,超參數“保持概率”描述了激活隱藏單元的幾率。 因此,如果隱藏層具有個單元,并且概率為,則將激活左右的單元,并關閉左右的單元。
**示例**:

如上所示,丟棄了第二層的 2 個單元。 因此,第三層的線性組合值(即)將減小。 為了不降低的期望值,應通過除以保持概率來調整的值。 也就是說:
**注意**:在測試時進行預測時,不需要進行 Dropout 正則化。
#### 提前停止
使用提前停止以防止模型過擬合。

### 模型
#### Logistic 回歸
給定實例的特征向量,邏輯回歸模型的輸出為。 因此,概率為。 在邏輯回歸中,可學習的參數為和。
x 軸是的值,y 軸是。
(圖片從[維基百科](https://en.wikipedia.org/wiki/Sigmoid_function)下載)

**一個訓練實例的損失函數**:
是預測,是真實答案。 整個訓練數據集的
**成本函數**(是訓練數據集中的示例數):
**最小化成本函數實際上是最大化數據的似然。**

#### 多類別分類(Softmax 回歸)

softmax 回歸將 logistic 回歸(二元分類)概括為多個類(多類分類)。
如上圖所示,它是 3 類分類神經網絡。 在最后一層,使用 softmax 激活函數。 輸出是每個類別的概率。
softmax 激活如下。
1)
2)


##### 損失函數


是訓練實例的數量。 是第 j 類。
#### 遷移學習
如果我們有大量的訓練數據或者我們的神經網絡很大,那么訓練這樣的模型會很費時(例如幾天或幾周)。 幸運的是,有一些模型已發布并公開可用。 通常,這些模型是在大量數據上訓練的。
遷移學習的思想是,我們可以下載這些經過預先訓練的模型,并根據自己的問題調整模型,如下所示。

如果我們有很多數據,我們可以重新訓練整個神經網絡。 另一方面,如果我們的訓練小,則可以重新訓練最后幾層或最后幾層(例如,最后兩層)。
**在哪種情況下我們可以使用遷移學習?**
假設:
預先訓練的模型用于任務 A,而我們自己的模型用于任務 B。
* 這兩個任務應具有相同的輸入格式
* 對于任務 A,我們有很多訓練數據。 但是對于任務 B,數據的大小要小得多
* 從任務 A 中學到的低級特征可能有助于訓練任務 B 的模型。
#### 多任務學習
在分類任務中,通常每個實例只有一個正確的標簽,如下所示。 第 i 個實例僅對應于第二類。
但是,在多任務學習中,一個實例可能具有多個標簽。
在任務中,損失函數為:


是訓練實例的數量。 是第 j 類。
**多任務學習提示**:
* 多任務學習模型可以共享較低級別的特征
* 我們可以嘗試一個足夠大的神經網絡以在所有任務上正常工作
* 在訓練集中,每個任務的實例數量相似
#### 卷積神經網絡(CNN)
##### 濾波器/內核
例如,我們有一個濾波器(也稱為內核),下圖描述了濾波器/內核如何在 2D 輸入上工作。 輸入的大小為,應用濾波器/內核時的輸出大小為。
濾波器/內核中的參數(例如)是可學習的。

而且,我們可以同時具有多個濾波器,如下所示。

同樣,如果輸入是一個 3 維的體積,我們也可以使用 3D 濾波器。 在此濾波器中,有 27 個可學習的參數。

通常,濾波器的寬度是奇數(例如,,…)
濾波器的想法是,如果它在輸入的一部分中有用,那么也許對輸入的另一部分也有用。 而且,卷積層輸出值的每個輸出值僅取決于少量的輸入。
#### 步幅
步幅描述了濾波器的步長。 它將影響輸出大小。

應當注意,一些輸入元素被忽略。 這個問題可以通過填充來解決。
#### 填充(有效和相同卷積)
如上所述,有效卷積是我們不使用填充時的卷積。
相同卷積是我們可以使用填充通過填充零來擴展原始輸入,以便輸出大小與輸入大小相同。
例如,輸入大小為,濾波器為。 如果我們設置`stride = 1`和`padding = 1`,我們可以獲得與輸入相同大小的輸出。

通常,如果濾波器大小為`f * f`,輸入為`n * n`,步幅為`s`,則最終輸出大小為:

#### 卷積層
實際上,我們還在卷積層上應用了激活函數,例如 Relu 激活函數。

至于參數的數量,對于一個濾波器,總共有 27 個(濾波器的參數)+1(偏置)= 28 個參數。
#### `1 * 1`卷積
如果不使用 1X1 轉換層,則計算成本存在問題:

使用 1X1 轉換層,參數數量大大減少:

#### 池化層(最大和平均池化)
池化層(例如最大池化層或平均池化層)可以被認為是一種特殊的濾波器。
最大池化層返回濾波器當前覆蓋區域的最大值。 同樣,平均池層將返回該區域中所有數字的平均值。

在圖片中,是濾波器的寬度,是步長的值。
**注意:在池化層中,沒有可學習的參數。**
#### LeNet-5

(模型中有約 60k 參數)
#### AlexNet

(模型中有約 60m 的參數;使用 Relu 激活函數;)
#### VGG-16

(模型中有大約 138m 的參數;所有濾波器中,并使用相同的填充;在最大池化層中和)
#### ResNet(功能更強大)


#### Inception

#### 對象檢測
##### 本地化分類

**損失函數**:

##### 地標檢測

##### 滑動窗口檢測算法

首先,使用訓練集來訓練分類器。 然后將其逐步應用于目標圖片:

問題是計算成本(按順序計算)。 為了解決這個問題,我們可以使用滑動窗口的卷積實現(即將最后的完全連接層變成卷積層)。

使用卷積實現,我們不需要按順序計算結果。 現在我們可以一次計算結果。

##### 區域提議(R-CNN,僅在幾個窗口上運行檢測)
實際上,在某些圖片中,只有幾個窗口具有我們感興趣的對象。在區域提議(R-CNN)方法中,我們僅在提出的區域上運行分類器。
**R-CNN** :
* 使用一些算法來提出區域
* 一次對這些提出的區域進行分類
* 預測標簽和邊界框
**Fast R-CNN** :
* 使用聚類方法提出區域
* 使用滑動窗口的卷積實現對提出的區域進行分類
* 預測標簽和邊界框
另一種更快的 R-CNN 使用卷積網絡來提出區域。
##### YOLO 算法
###### 邊界框預測(YOLO 的基礎)
每張圖片均分為多個單元。

對于每個單元格:
* 指示單元格中是否存在對象
* 和是中點(0 到 1 之間)
* 和是相對的高和寬(該值可以大于 1.0)。
* ,和表示對象所屬的類別。

###### IOU

按照慣例,通常將 0.5 用作閾值,以判斷預測的邊界框是否正確。 例如,如果 IOU 大于 0.5,則可以說該預測是正確的答案。
也可以用作一種方法來衡量兩個邊界框彼此之間的相似程度。
###### 非最大抑制

該算法可以找到對同一物體的多次檢測。 例如,在上圖中,它為貓找到 2 個邊界框,為狗找到 3 個邊界框。 非最大抑制算法可確保每個對象僅被檢測一次。
步驟:
1)丟棄所有帶有的框
2)對于任何剩下的框:
a)選擇具有最大的框作為預測輸出
b)在最后一步中,將所有帶有的剩余框與選中的框一起丟棄,然后從 a 開始重復。
##### 錨定框
先前的方法只能在一個單元格中檢測到一個對象。 但是在某些情況下,一個單元中有多個對象。 為了解決這個問題,我們可以定義不同形狀的邊界框。

因此,訓練圖像中的每個對象都分配給:
* 包含對象中點的網格單元
* 具有最高的網格單元的錨定框

**做出預測**:
* 對于每個網格單元,我們可以獲得 2 個(錨定框的數量)預測邊界框。
* 擺脫低概率預測
* 對于每個類別(,和),都使用非最大抑制來生成最終預測。
#### 人臉驗證
##### 一次性學習(學習“相似性”函數)
在這種情況下,一次性學習就是:從一個例子中學習以再次認識這個人。
函數表示 img1 和 img2 之間的差異程度。

###### Siamese 網絡(學習差異/相似程度)

如果我們相信編碼函數可以很好地表示圖片,則可以定義距離,如上圖底部所示。
**學習**:
可學習的參數:定義編碼的神經網絡參數
學習這些參數,以便:
* 如果和是同??一個人,則較小
* 如果和是不同的人,則很大
###### 三重損失(一次查看三張圖片)

這三張圖片是:
* 錨圖片
* 正圖片:錨圖片中同一個人的另一張圖片
* 負圖片:錨圖片中另一張不同人的圖片。
但是,僅學習上述損失函數將存在問題。 該損失函數可能導致學習。
為避免出現此問題,我們可以添加一個小于零的項,即。
要對其進行重組:

匯總**損失函數**:

**選擇 A,P,N 的三元組**:
在訓練期間,如果隨機選擇 A,P,N,則很容易滿足。 學習算法(即梯度下降)不會做任何事情。
我們應該選擇難以訓練的三元組。

當使用困難三元組進行訓練時,梯度下降過程必須做一些工作以嘗試將這些量推離。
##### 人臉識別/驗證和二元分類

我們可以學習一個 Sigmoid 二元分類函數:

我們還可以使用其他變量,例如卡方相似度:

#### 神經風格轉換

內容圖像來自電影 Bolt。
樣式圖像是“百馬圖”的一部分,這是中國最著名的古代繪畫之一。
[https://deepart.io](https://deepart.io) 支持生成的圖像。
損失函數包含兩部分:和。 為了得到生成的圖像:
1. 隨機初始化圖像
2. 使用梯度下降來最大程度地降低
**內容成本函數,** :
內容成本函數可確保不會丟失原始圖像的內容。
1)使用隱藏層(不太深也不太淺)來計算內容成本。 (我們可以使用來自預訓練的卷積神經網絡的層)

2)

3)

**樣式成本函數,** :
1)假設我們正在使用層激活來衡量樣式。

2)將圖片樣式定義為跨通道激活之間的相關性

矩陣中的元素反映了跨不同通道的激活之間的相關性(例如,高級紋理成分是否傾向于同時出現或不出現)。
對于樣式圖片:

對于生成的圖像:

**樣式函數**:

您也可以考慮合并不同層的樣式損失。

#### 1D 和 3D 卷積概括

### 序列模型
#### 循環神經網絡模型
**前向**:

在此圖中,紅色參數是可學習的變量和。 在每個步驟的最后,將計算該步驟的損失。
最后,將每個步驟的所有損失匯總為整個序列的總損失。
這是每個步驟的公式:

總損失:

**時間上的反向傳播**:

#### 門控循環單元(GRU)
##### GRU(簡化)

##### GRU(完整)

#### 長期短期記憶(LSTM)

* :更新門
* :遺忘門
* :輸出門
#### 雙向 RNN

#### 深度 RNN 示例

#### 詞嵌入
##### 單熱

##### 嵌入矩陣()

是代表未知詞的特殊符號。 所有未見過的單詞將被強制轉換為。
矩陣由表示。 如果我們想獲取單詞嵌入,可以按如下所示使用單詞的單熱向量:

通常,可以將其公式化為:

##### 學習單詞嵌入

在該模型中,可以像其他參數(即和)一樣學習嵌入矩陣(即)。 所有可學習的參數均以藍色突出顯示。
該模型的總體思想是在給定上下文的情況下預測目標單詞。 在上圖中,上下文是最后 4 個單詞(即 a,玻璃,of,橙色),目標單詞是“ to”。
另外,有多種方法可以定義目標詞的上下文,例如:
* 最后個字
* 目標詞周圍個
* 附近的一個字(Skip-gram 的思路)
* …
##### Word2Vec & SkipGram
**句子**:
```
I want a glass of orange juice to go along with my cereal.
```
在此詞嵌入學習模型中,**上下文**是從句子中隨機選擇的詞。 **目標**是用上下文詞的窗口隨機拾取的詞。
例如:
讓我們說上下文詞為`orange`,我們可能會得到以下訓練示例。

**模型**:

softmax 函數定義為:

是與輸出關聯的參數,是上下文字的當前嵌入。
使用 softmax 函數的**問題**是分母的計算成本太大,因為我們的詞匯量可能很大。 為了減少計算量,負采樣是不錯的解決方案。
##### 負采樣
**句子**:
```
I want a glass of orange juice to go along with my cereal.
```
給定一對單詞(即上下文單詞和另一個單詞)和標簽(即第二個單詞是否為目標單詞)。 如下圖所示,(`orange`)是一個正例,因為單詞`juice`是橙色的真正目標單詞。 由于所有其他單詞都是從詞典中隨機選擇的,因此這些單詞被視為錯誤的目標單詞。 因此,這些對是負例(如果偶然將真實的目標單詞選作負例,也可以)。

至于每個上下文詞的負面詞數,如果數據集很小,則為;如果數據集很大,則為。
**模型**:

我們僅訓練 softmax 函數的 logistic 回歸模型。 因此,計算量低得多且便宜。
**如何選擇負例?** :

是單詞頻率。
如果使用第一個樣本分布,則可能總是選擇諸如`the, of`等之類的詞。但是,如果使用第三個分布,則所選詞將是非代表性的。 因此,第二分布可以被認為是用于采樣的更好的分布。 這種分布在第一個和第三個之間。
##### GloVe 向量
**表示法**:單詞在單詞的上下文中出現的次數
**模型**:

測量這兩個詞之間的關聯程度以及這兩個詞在一起出現的頻率。 是權重項。 它給高頻對帶來了不太高的權重,也給了不太常見的對帶來了不太小的權重。
如果我們檢查和的數學運算,實際上它們起著相同的作用。 因此,詞的最終詞嵌入為:

##### 深度上下文化的詞表示形式(ELMo,語言模型的嵌入)
預訓練雙向語言模型
正向語言模型:給定個符號的序列,正向語言模型計算序列概率,通過建模給定歷史的的概率,即,

反向語言模型:類似地,

雙向語言模型:它結合了正向和反向語言模型。 共同最大化正向和后向的似然:

LSTM 用于建模前向和后向語言模型。

就輸入嵌入而言,我們可以只初始化這些嵌入或使用預先訓練的嵌入。 對于 ELMo,通過使用字符嵌入和卷積層,會更加復雜,如下所示。

訓練了語言模型之后,我們可以得到句子中單詞的 ELMo 嵌入:

在 ELMo 中,是 softmax 歸一化的權重,而是標量參數,允許任務模型縮放整個 ELMo 向量。 可以在任務特定模型的訓練過程中學習這些參數。
參考:
[1] [https://www.slideshare.net/shuntaroy/a-review-of-deep-contextualized-word-representations-peters-2018](https://www.slideshare.net/shuntaroy/a-review-of-deep-contextualized-word-representations-peters-2018)
[2] [http://jalammar.github.io/illustrated-bert/](http://jalammar.github.io/illustrated-bert/)
[3] [https://www.mihaileric.com/posts/deep-contextualized-word-representations-elmo/](https://www.mihaileric.com/posts/deep-contextualized-word-representations-elmo/)
#### 序列到序列模型示例:翻譯
任務是將一個序列轉換為另一個序列。 這兩個序列可以具有不同的長度。


##### 選擇最可能的句子(集束搜索)
###### 集束搜索
使用序列對模型進行序列化在機器翻譯中很流行。 如圖所示,翻譯是逐個標記地生成的。 問題之一是如何挑選最可能的整個句子? 貪婪搜索不起作用(即在每個步驟中選擇最佳單詞)。 集束搜索是一種更好的解決方案。

讓我們假設集束搜索寬度為 3。因此,在每一步中,我們只保留了前 3 個最佳預測序列。
例如(如上圖所示),
* 在第 1 步中,我們保留` in, June, September`
* 在第 2 步中,我們保留以下順序:` (in, September), (June is), (June visits)`
* …
至于集束搜索寬度,如果我們有一個較大的寬度,我們可以獲得更好的結果,但是這會使模型變慢。 另一方面,如果寬度較小,則模型會更快,但可能會損害其性能。 集束搜索寬度是一個超參數,最佳值可能是領域特定的。
###### 長度標準化
翻譯模型的學習將最大化:

在對數空間中,即:

上述目標函數的問題在于對數空間中的分數為 始終為負,因此使用此函數將使模型偏向一個很短的句子。 我們不希望翻譯實際上太短。
我們可以在開頭添加一個長度標準化項:

###### 集束搜索中的錯誤分析(啟發式搜索算法)
在調整模型的參數時,我們需要確定它們的優先級(即,更應該歸咎于 RNN 或集束搜索部分)。 (通常增加集束搜索寬度不會損害性能)。
**示例**
從開發集中選擇一個句子并檢查我們的模型:
**句子**:`Jane visite l’Afrique en septembre.`
**來自人類的翻譯**:`Jane visits Africa in September. `()
**算法的輸出(我們的模型)**:`Jane visited Africa last September. ` ()
為了弄清楚應該歸咎于哪個,我們需要根據 RNN 神經網絡計算并比較和。
如果:
獲得更高的概率,則可以得出結論,集束搜索存在故障。
如果 :
RNN 預測,但實際上比更好,因為它來自真實的人。 因此,RNN 模型應該有問題。
通過在開發集中的多個實例上重復上述錯誤分析過程,我們可以得到下表:

根據該表,我們可以找出是由于集束搜索/ RNN。
如果大多數錯誤是由于集束搜索造成的,請嘗試增加集束搜索寬度。 否則,我們可能會嘗試使 RNN 更深入/添加正則化/獲取更多訓練數據/嘗試不同的架構。
##### Bleu 得分
如果一個句子有多個出色的答案/推薦,我們可以使用 Bleu 得分來衡量模型的準確性。
**示例(二元組的 Bleu 得分)**:
**法語**:` Le chat est sur le tapis.`
**參考 1**:`The cat is on the mat.`
**參考 2**:`There is a cat on the mat.`
**我們模型的輸出**:`The cat the cat on the cat.`

**計數**是輸出中出現的當前二元組的數量。 **截斷計數**是二元組出現在參考 1 或參考 2 中的最大次數。
然后可以將二元組的 Bleu 分數計算為:

上面的等式可以用來計算 unigram,bigram 或 any-gram Bleu 分數。
##### 組合 Bleu
合并的 Bleu 分數合并了不同 Gram 的分數。 僅表示 n-gram 的 Bleu 分數。 如果我們具有,,和,則可以組合為以下內容:

簡短的懲罰會懲罰簡短的翻譯。 (我們不希望翻譯得太短,因為簡短的翻譯會帶來很高的精度。
##### 注意力模型
RNN(例如 lstm)的一個問題是很難記住超長句子。 模型翻譯質量將隨著原始句子長度的增加而降低。

有多種計算注意力的方法。 一種方法是:

在這種方法中,我們使用小型神經網絡將之前和當前的信息映射到注意力權重。
已經證明注意力模型可以很好地工作,例如歸一化。

### 轉換器(“Attention Is All You Need”)
**架構**:

**詳細信息**:
輸入嵌入:
模型的輸入嵌入是單詞嵌入及其每個單詞的位置編碼的總和。 例如,對于輸入句子。 是句子中每個單詞的單詞嵌入(可以是預訓練的嵌入)。 輸入嵌入應為。
是每個單詞的位置編碼。 有許多方法可以對單詞位置進行編碼。 在本文中,使用的編碼方法是:


是單詞在句子中的位置。 是位置編碼的元素位置。 是模型中編碼器的輸出尺寸大小。
解碼器
* 頂部編碼器的輸出將轉換為注意力向量和。 這些用于多頭注意力子層(也稱為編解碼器注意力)。 注意力向量可以幫助解碼器專注于輸入句子的有用位置。
* 掩碼的自注意只允許專注于輸出句子的較早位置。 因此,通過在 softmax 步驟之前將它們設置為-inf。
* “多頭注意”層類似于編碼器中的“自注意”層,除了:
* 它從頂部編碼器的輸出中獲取和
* 它從其下一層創建
參考: [https://jalammar.github.io/illustrated-transformer/](https://jalammar.github.io/illustrated-transformer/)
### 轉換器的雙向編碼器表示(BERT)
BERT 是通過堆疊轉換器編碼器構建的。

對未標記的大文本進行預訓練(預測被掩蓋的單詞)

“帶掩碼的語言模型會隨機掩蓋輸入中的某些標記,目的是為了 僅根據上下文來預測被屏蔽單詞的原始詞匯 ID。” [2]
使用受監督的訓練對特定任務(例如, 分類任務,NER 等

BERT 論文的下圖顯示了如何將模型用于不同的任務。

如果特定任務不是分類任務,則可以忽略[CLS]。
參考:
[1] http://jalammar.github.io/illustrated-bert/
[2] Devlin, J., Chang, M.W., Lee, K. and Toutanova, K., 2018. Bert: Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805.
### 實用提示
#### 訓練/開發/測試數據集
* 通常,我們將數據集的 **70%** 用作訓練數據,將 30%用作測試集; 或 **60%**(訓練)/ **20%**(開發)/ **20%**(測試)。 但是,如果我們有一個大數據集,則可以將大多數實例用作訓練數據(例如 1,000,000, **98%**),并使開發和測試集的大小相等(例如 10,000( **1% 用于開發**),測試集使用 10,000( **1%**)。 由于我們的數據集很大,因此開發和測試集中的 10,000 個示例綽綽有余。
* 確保開發和測試集來自同一分布
**我們可能遇到的另一種情況**:
1)我們要為特定域構建系統,但是在該域中我們只有幾個標記數據集(例如 10,000)
2)我們 可以從類似的任務中獲得更大的數據集(例如 200,000 個實例)。
在這種情況下,如何構建訓練,開發和測試集?
最簡單的方法是將兩個數據集組合在一起并對其進行隨機排序。 然后,我們可以將合并的數據集分為三個部分(訓練,開發和測試集)。 但是,這不是一個好主意。 因為我們的目標是為我們自己的特定領域構建系統。 將沒有來自我們自己域的一些實例添加到開發/測試數據集中以評估我們的系統是沒有意義的。
合理的方法是:
1)將所有更容易使用的實例(例如 200,000)添加到訓練集中
2)從特定域數據集中選擇一些實例并將它們添加到訓練集中
3)將我們自己領域的其余實例分為開發和測試集

#### 過擬合/欠擬合,偏差/方差,與人類水平的表現比較,解決方案
##### 過擬合/欠擬合,偏差/方差
對于分類任務,人類分類誤差應該在 0%左右。 監督模型在訓練和開發集上的各種可能的表現分析如下所示。
| | | | | |
| --- | --- | --- | --- | --- |
| 人為錯誤 | 0.9% | 0.9% | 0.9% | 0.9% |
| 訓練集錯誤 | 1% | 15% | 15% | 0.5% |
| 測試集錯誤 | 11% | 16% | 30% | 1% |
| 評價 | 過擬合 | 欠擬合 | 欠擬合 | 良好 |
| | 高方差 | 高偏差 | 高偏差和方差 | 低偏差和方差 |
**解決方案**:

##### 與人類水平的表現比較
您可能已經注意到,在上表中,人為水平的誤差設置為 0.9%,如果人為水平的表現不同但訓練/開發誤差相同,該怎么辦?
| | | |
| --- | --- | --- |
| 人為錯誤 | **1%** | **7.5%** |
| 訓練集錯誤 | 8% | 8% |
| 測試集錯誤 | 10% | 10% |
| 評價 | 高偏差 | 高方差 |
盡管模型誤差相同,但在左圖中人為誤差為 1%時,我們有高偏差問題,而在右圖中有高方差問題。
至于模型的性能,有時它可能比人類的模型更好。 但是只要模型的性能不如人類,我們就可以:
1)從人類獲得更多的標記數據
2)從手動誤差分析中獲得見解
3)從偏差/方差分析中獲得見解
#### 數據分布不匹配
當我們為自己的特定領域構建系統時,針對我們自己的問題,我們只有幾個帶標簽的實例(例如 10,000 個)。 但是我們很容易從另一個類似的領域中收集很多實例(例如 200,000 個)。 此外,大量容易獲得的實例可能有助于訓練一個好的模型。 數據集可能看起來像這樣:

但是在這種情況下,訓練集的數據分布與開發/測試集不同。 這可能會導致副作用-數據不匹配問題。
為了檢查我們是否存在數據不匹配問題,我們應該隨機選擇訓練集的一個子集作為名為訓練-開發數據集的驗證集。 該集合具有相同的訓練集分布,但不會用于訓練。

| | | | | |
| --- | --- | --- | --- | --- |
| 人為誤差 | 0% | 0% | 0% | 0% |
| 訓練誤差 | 1% | 1% | 10% | 10% |
| 訓練-開發誤差 | 9% | 1.5% | 11% | 11% |
| 開發誤差 | 10% | 10% | 12% | 20% |
| 問題 | 高方差 | 數據不匹配 | 高偏差 | 高偏差+數據不匹配 |
總結一下:

##### 解決了數據分布不匹配的問題
首先,進行手動錯誤分析以嘗試了解我們的訓練集和開發/測試集之間的區別。
其次,根據分析結果,我們可以嘗試使訓練實例與開發/測試實例更相似。 我們還可以嘗試收集更多與開發/測試集的數據分布相似的訓練數據。
#### 輸入標準化
我們有一個包含示例的訓練集。 代表示例。 輸入標準化如下。
,
,

**注意**:必須使用相同的和訓練數據來標準化測試數據集。
使用輸入標準化可以使訓練更快。
假設輸入是二維。 范圍分別是和的[1-1000]和[1-10]。 損失函數可能看起來像這樣(左):

#### 使用單一數字模型評估指標
如果我們不僅關心模型的表現(例如準確性,F 分數等),還關心運行時間,則可以設計一個數字評估指標來評估我們的模型。
例如,我們可以結合表現指標和運行時間,例如。
另外,我們還可以指定可以接受的最大運行時間:


#### 錯誤分析(優先考慮后續步驟)
進行錯誤分析對于確定改善模型性能的后續步驟的優先級非常有幫助。
##### 執行錯誤分析
例如,為了找出模型為什么錯誤標記某些實例的原因,我們可以從開發集中獲取大約 100 個**錯誤標記的**示例并進行錯誤分析(手動逐個檢查)。
| 圖片 | 狗 | 貓 | 模糊 | 評價 |
| --- | --- | --- | --- | --- |
| 1 |  | | | |
| 2 | | |  | |
| 3 | |  |  | |
| … | … | … | … | … |
| 百分比 | 8% | 43% | 61% | |
通過手動檢查這些標簽錯誤的實例,我們可以估計錯誤的出處。 例如,在上述表格中,我們發現 61%的圖像模糊,因此在下一步中,我們可以集中精力改善模糊圖像的識別性能。
##### 清除標簽錯誤的數據
有時,我們的數據集很嘈雜。 換句話說,數據集中存在一些不正確的標簽。 同樣,我們可以從開發/測試集中選取約 100 個實例,然后手動逐個檢查它們。
例如,當前開發/測試集上的模型錯誤為 10%。 然后,我們手動檢查從開發/測試集中隨機選擇的 100 個實例。
| 圖片 | 標簽不正確 |
| --- | --- |
| 1 個 | |
| 2 |  |
| 3 | |
| 4 | |
| 5 |  |
| … | … |
| 百分比 | 6% |
假設,最后我們發現 6%實例的標簽錯誤。 基于此,我們可以猜測由于標簽錯誤而導致的錯誤以及由于其他原因而導致的錯誤。
因此,如果我們下一步專注于糾正標簽,那么可能不是一個好主意。
- TensorFlow 1.x 深度學習秘籍
- 零、前言
- 一、TensorFlow 簡介
- 二、回歸
- 三、神經網絡:感知器
- 四、卷積神經網絡
- 五、高級卷積神經網絡
- 六、循環神經網絡
- 七、無監督學習
- 八、自編碼器
- 九、強化學習
- 十、移動計算
- 十一、生成模型和 CapsNet
- 十二、分布式 TensorFlow 和云深度學習
- 十三、AutoML 和學習如何學習(元學習)
- 十四、TensorFlow 處理單元
- 使用 TensorFlow 構建機器學習項目中文版
- 一、探索和轉換數據
- 二、聚類
- 三、線性回歸
- 四、邏輯回歸
- 五、簡單的前饋神經網絡
- 六、卷積神經網絡
- 七、循環神經網絡和 LSTM
- 八、深度神經網絡
- 九、大規模運行模型 -- GPU 和服務
- 十、庫安裝和其他提示
- TensorFlow 深度學習中文第二版
- 一、人工神經網絡
- 二、TensorFlow v1.6 的新功能是什么?
- 三、實現前饋神經網絡
- 四、CNN 實戰
- 五、使用 TensorFlow 實現自編碼器
- 六、RNN 和梯度消失或爆炸問題
- 七、TensorFlow GPU 配置
- 八、TFLearn
- 九、使用協同過濾的電影推薦
- 十、OpenAI Gym
- TensorFlow 深度學習實戰指南中文版
- 一、入門
- 二、深度神經網絡
- 三、卷積神經網絡
- 四、循環神經網絡介紹
- 五、總結
- 精通 TensorFlow 1.x
- 一、TensorFlow 101
- 二、TensorFlow 的高級庫
- 三、Keras 101
- 四、TensorFlow 中的經典機器學習
- 五、TensorFlow 和 Keras 中的神經網絡和 MLP
- 六、TensorFlow 和 Keras 中的 RNN
- 七、TensorFlow 和 Keras 中的用于時間序列數據的 RNN
- 八、TensorFlow 和 Keras 中的用于文本數據的 RNN
- 九、TensorFlow 和 Keras 中的 CNN
- 十、TensorFlow 和 Keras 中的自編碼器
- 十一、TF 服務:生產中的 TensorFlow 模型
- 十二、遷移學習和預訓練模型
- 十三、深度強化學習
- 十四、生成對抗網絡
- 十五、TensorFlow 集群的分布式模型
- 十六、移動和嵌入式平臺上的 TensorFlow 模型
- 十七、R 中的 TensorFlow 和 Keras
- 十八、調試 TensorFlow 模型
- 十九、張量處理單元
- TensorFlow 機器學習秘籍中文第二版
- 一、TensorFlow 入門
- 二、TensorFlow 的方式
- 三、線性回歸
- 四、支持向量機
- 五、最近鄰方法
- 六、神經網絡
- 七、自然語言處理
- 八、卷積神經網絡
- 九、循環神經網絡
- 十、將 TensorFlow 投入生產
- 十一、更多 TensorFlow
- 與 TensorFlow 的初次接觸
- 前言
- 1.?TensorFlow 基礎知識
- 2. TensorFlow 中的線性回歸
- 3. TensorFlow 中的聚類
- 4. TensorFlow 中的單層神經網絡
- 5. TensorFlow 中的多層神經網絡
- 6. 并行
- 后記
- TensorFlow 學習指南
- 一、基礎
- 二、線性模型
- 三、學習
- 四、分布式
- TensorFlow Rager 教程
- 一、如何使用 TensorFlow Eager 構建簡單的神經網絡
- 二、在 Eager 模式中使用指標
- 三、如何保存和恢復訓練模型
- 四、文本序列到 TFRecords
- 五、如何將原始圖片數據轉換為 TFRecords
- 六、如何使用 TensorFlow Eager 從 TFRecords 批量讀取數據
- 七、使用 TensorFlow Eager 構建用于情感識別的卷積神經網絡(CNN)
- 八、用于 TensorFlow Eager 序列分類的動態循壞神經網絡
- 九、用于 TensorFlow Eager 時間序列回歸的遞歸神經網絡
- TensorFlow 高效編程
- 圖嵌入綜述:問題,技術與應用
- 一、引言
- 三、圖嵌入的問題設定
- 四、圖嵌入技術
- 基于邊重構的優化問題
- 應用
- 基于深度學習的推薦系統:綜述和新視角
- 引言
- 基于深度學習的推薦:最先進的技術
- 基于卷積神經網絡的推薦
- 關于卷積神經網絡我們理解了什么
- 第1章概論
- 第2章多層網絡
- 2.1.4生成對抗網絡
- 2.2.1最近ConvNets演變中的關鍵架構
- 2.2.2走向ConvNet不變性
- 2.3時空卷積網絡
- 第3章了解ConvNets構建塊
- 3.2整改
- 3.3規范化
- 3.4匯集
- 第四章現狀
- 4.2打開問題
- 參考
- 機器學習超級復習筆記
- Python 遷移學習實用指南
- 零、前言
- 一、機器學習基礎
- 二、深度學習基礎
- 三、了解深度學習架構
- 四、遷移學習基礎
- 五、釋放遷移學習的力量
- 六、圖像識別與分類
- 七、文本文件分類
- 八、音頻事件識別與分類
- 九、DeepDream
- 十、自動圖像字幕生成器
- 十一、圖像著色
- 面向計算機視覺的深度學習
- 零、前言
- 一、入門
- 二、圖像分類
- 三、圖像檢索
- 四、對象檢測
- 五、語義分割
- 六、相似性學習
- 七、圖像字幕
- 八、生成模型
- 九、視頻分類
- 十、部署
- 深度學習快速參考
- 零、前言
- 一、深度學習的基礎
- 二、使用深度學習解決回歸問題
- 三、使用 TensorBoard 監控網絡訓練
- 四、使用深度學習解決二分類問題
- 五、使用 Keras 解決多分類問題
- 六、超參數優化
- 七、從頭開始訓練 CNN
- 八、將預訓練的 CNN 用于遷移學習
- 九、從頭開始訓練 RNN
- 十、使用詞嵌入從頭開始訓練 LSTM
- 十一、訓練 Seq2Seq 模型
- 十二、深度強化學習
- 十三、生成對抗網絡
- TensorFlow 2.0 快速入門指南
- 零、前言
- 第 1 部分:TensorFlow 2.00 Alpha 簡介
- 一、TensorFlow 2 簡介
- 二、Keras:TensorFlow 2 的高級 API
- 三、TensorFlow 2 和 ANN 技術
- 第 2 部分:TensorFlow 2.00 Alpha 中的監督和無監督學習
- 四、TensorFlow 2 和監督機器學習
- 五、TensorFlow 2 和無監督學習
- 第 3 部分:TensorFlow 2.00 Alpha 的神經網絡應用
- 六、使用 TensorFlow 2 識別圖像
- 七、TensorFlow 2 和神經風格遷移
- 八、TensorFlow 2 和循環神經網絡
- 九、TensorFlow 估計器和 TensorFlow HUB
- 十、從 tf1.12 轉換為 tf2
- TensorFlow 入門
- 零、前言
- 一、TensorFlow 基本概念
- 二、TensorFlow 數學運算
- 三、機器學習入門
- 四、神經網絡簡介
- 五、深度學習
- 六、TensorFlow GPU 編程和服務
- TensorFlow 卷積神經網絡實用指南
- 零、前言
- 一、TensorFlow 的設置和介紹
- 二、深度學習和卷積神經網絡
- 三、TensorFlow 中的圖像分類
- 四、目標檢測與分割
- 五、VGG,Inception,ResNet 和 MobileNets
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻