感謝李宏毅老師qwq
1. 基礎概念
1.1 Machine Learning
- 問題引出:預測后面幾天的觀看人數;
- 初步構建模型:擬合效果不好,就是在原數據上平移了一段距離;
- 此處構建模型的本質:利用特征工程,將“多維特征模型”解決“時間序列問題”,根據原數據每隔 5 天就會下跌 2 天的特性,將一周的觀看人數作為多維特征輸入;
1.2 Deep Learning
Step1.Model
- 通過引入 S 函數使得模型對非線性數據預測更準確:
- 設置不同參數對 S 函數圖像的變化:
- 利用多個 S 函數組合一個完整模型,彌補線性模型無法擬合缺陷:
- 再利用上一節學的多維特征輸入(輸入 j 個特征,用到了 i 個 function),得到最終模型:
- 模型參數的集合:
Step2.Loss
- 計算損失函數:
Step3.Optimization
- 最優化:
- 利用 batch 訓練:
Neural Network
- 不同的激活函數:
- 兩個 relu 合成一個 hard sigmoid:
- 構建神經網絡:
2. 模型調優
2.1 機器學習任務攻略
- 根據訓練集損失和測試集損失調節模型:
- 選擇模型:
Model bias
- 訓練集損失大 - 原因1:高偏差,通常是模型過于簡單,彈性不足;
Optimization
- 訓練集損失大 - 原因2:優化沒做好,只能到達局部最優點;
- 如何判別屬于哪個原因:假設初始為一個小模型,當將模型變復雜后,損失沒有更小甚至更大,說明與模型彈性無關,而問題在于優化不好;
Overfitting
- 解決過擬合:數據增強,反轉、截取圖片等等,但不能隨意(比如倒過來當成只蝙蝠 qwq);
- 法二:增加條件限制模型,例如固定模型為二次函數,但不能過多限制(會欠擬合);
Cross Validation
- 為什么需要交叉驗證集:我們可能會根據訓練集,包括公開測試集損失去調試模型,但是可能會導致在私人測試集上的損失很大,因為這里相當于把公開測試集并入了訓練集(過擬合);
- 將訓練集分為訓練集+交叉驗證集,根據交叉驗證集上的損失來調試模型;
- 怎么分割訓練集和交叉驗證集:
Mismatch
- 問題來源:預測 2.26 觀看 lhy 老師機器學習的人數,所以有很多同學特地去刷播放量,想讓模型預測不準確(qwq);
- 問題本質:訓練集與測試集分布不同;
2.2 神經網絡無法訓練
Local minima & Saddle point
- 停止優化情況:Critical Point,局部最低點、鞍點(不同方向上為局部最大、最小值);
- 泰勒展開,利用二階導數下的凹凸性(一階導為 0);
- 數學方法:利用計算得到的 Hessian 矩陣判斷局部最低點還是鞍點;
- 黑塞判別式(多元函數二階偏導數構成的矩陣):求多元函數極值點;
- 從高維度觀察低維度,驗證 local minima 和 saddle point 哪個更常見;
- 縱軸是訓練時卡住的 loss,橫軸是最小比率 = 正數特征值 / 特征值總數;
- 如果所有特征值都是正數,則此處為 local minima,但是這種情況很少見;
Batch & Momentum
- 小 batch 的作用:由于數據的 shuffle,每個 batch 的數據會有差異,導致得到的損失函數也不同,梯度不會保持為0,就有機會跳出鞍點;
- 由于計算機的并行計算,batch 在沒有很大的時候,更新時間是仍然比較小的;
- batch 大小對不同訓練時間的影響:
- 利用 Momentum 本質:根據?慣性(上一次更新方向,可以沖出鞍點)和梯度的組合方向進行更新;
- 圖示更新方向:
Learning Rate
- 問題引出:loss 不再下降,但是梯度在震蕩,原因為學習率過大導致卡在了山谷中間;
- 解決方法:給不同的參數配置不同的學習率,以此來調節更新跨度;
- AdaGrad(自適應學習率):AdaGrad 的本質是給更新頻繁(歷史梯度大)的參數一個越來越小的學習率,給更新稀疏(歷史梯度小)的參數一個相對較大的學習率。
- 法一:采用均方差進行計算;
- 采用法一的嚴重問題:學習率爆炸;
- 原理:隨著模型逐漸收斂,它會越來越接近損失函數谷底,梯度在不斷下降,均方差不斷減小,也就是分母不斷減小,導致學習率爆炸;
- 但是學習率爆炸后由梯度的增大,學習率也會自調節減小;
- 法二:RMSProp,采用加權平均進行計算;
- 通過調節?
?來決定剛算出來的梯度有多重要;
- 梯度較大時,為了增加?
?從而放慢更新速度,選擇減小?
,反之同理;?
- Adam = RMSProp + Momentum;
- Learning Rate Scheduling:隨著訓練時間增大不斷減小學習率?
,這一操作解決了學習率爆炸的問題;
- 法二:隨著訓練時間增大,學習率先增后減;
- 參數最優化中學習率更新的最終版本:
- 除以一個參數:確定學習的“速率”;乘以一個參數:確定學習的“方向”;
Batch Normalization
- 目的:把非常崎嶇的 error sufface(誤差曲面)直接鏟平;神羅天征!!!!QAQ!!!!!
- 在做最優化時,由于不同方向的輸入值大小不同,所以有的方向梯度很大,也有的方向梯度很小,因此需要對輸入數據做歸一化;
- 特征歸一化:對不同向量相同維度上的數值做歸一化;
- 深度學習中:我們方向對輸入值做歸一化后,經過變換或激活后,得到的新輸入應該還要繼續做歸一化;
- 歸一化計算公式(正態分布):
- 沒有歸一化時:
?變化只會導致它對應的向量變化;
- 在做歸一化時:
?變化則
?和
?會變化,那么其它?
?(
,
)也會變化;
- 由于整個訓練集太大了,于是引出了 batch,每次只對 batch 個變量進行歸一化;
- 在歸一化之后,這里又做了一次線性變換,通常?
?和?
?初始化為 1;
- 原因:?
?歸一化后的輸出被限制在均值為 0 且方差為 1 的分布中,對模型有一定限制,所以此操作可以增加模型自由度;
- 測試過程中:
- 我們發現測試過程沒有 batch,那么怎么計算?
?和?
?呢:這個在 pytorch 里面已經幫我們處理好了;在訓練過程中,會將計算出來的
?和
?都保存下來,進行迭代更新,p 為權重也是超參數;
3. 神經網絡
3.1 CNN
- 卷積神經網絡圖像識別:將圖片像素特征連接成 tensor 進行輸入;
Receptive field (感受野)
- 觀察 1:分類問題中,往往只需要通過幾個重要的模式(pattern)去識別圖像,神經元不需要輸入整張圖片;
- 簡化:每個神經元的輸入大小只有一個 kernel size 的感受野;
- stride 為步頻,padding 為填充,感受野之間需要重疊防止遺漏重疊處的 pattern;
Parameter Sharing
- 觀察 2:一些相同的模式會出現在圖片的不同位置,但是肯定會有對應的神經元在該感受野處提取特征;
- 但這些檢測鳥嘴的神經元做的事情是一樣的,只是它們守備的范圍不一樣。既然如此,其實沒必要每個守備范圍都去放一個檢測鳥嘴的神經元。
- 參數共享就是兩個神經元的權重完全是一樣的;
- 假設每個感受野都有 64 個神經元在守備,那么令每個感受野對應神經元參數相同(這些參數稱為濾波器);
Convolutional Layer
- 全連接層可以自己設定參數(如果它只想看一個范圍,可以把很多權重設成 0),感受野只能看一個范圍,參數共享繼續增加對神經元的限制;
- 感受野 + 參數共享就是卷積層(convolutional layer),用卷積層的網絡就叫卷積神經網絡;
- 卷積神經網絡的偏差比較大,但模型偏差大不一定是壞事,因為當模型偏差大,模型的靈活性較低時,比較不容易過擬合;
- 卷積神經網絡第二種說法:利用卷積計算,對位相乘累加;
- 網絡越深,可以檢測的模式越大:
Pooling
- 觀察 3:下采樣不影響模式檢測;
- 把一張比較大的圖像做下采樣(down sampling),把圖像偶數的列都拿掉,奇數的行都拿掉,圖像變成為原來的 1/4,但是不會影響里面是什么東西;
- 最大池化:在每一組里面選一個代表,選的代表就是最大的一個;(還有平均池化)
- 經典的圖像識別的網絡:
- 一般架構就是卷積加匯聚,池化是可有可無的。如果做完幾次卷積和匯聚以后,把匯聚的輸出做扁平化(flatten),再把這個向量丟進全連接層里面,最終還要過個 softmax 來得到圖像識別的結果;
- 扁平化就是把圖像里面本來排成矩陣的東西“拉直”,即把所有的數值“拉直”變成一個向量;
3.2 RNN
One-hot(獨熱編碼)
- Slot Filling(槽填充):將句子里的詞匯進行篩選,并填入對應槽中;(如這里的目的地,到達時間)
- 利用獨熱編碼輸入語句,每個詞匯對應類別為 1,其余為 0;
- 因為很多單詞可能都沒有見過,所以需要在獨熱編碼里面多加維度,用一個維度代表 other;
- 還可以用詞匯的字母來表示對應向量;
Memory
- 這里相同的單詞“臺北”表示的意義是不一樣的,需要根據前面的單詞來判斷;
- 如果讓神經網絡是有記憶力,其就可以解決輸入不同的單詞,輸出不同的問題;
- 這種有記憶的神經網絡就叫做循環神經網絡(Recurrent Neural Network);
- 每一次隱藏層的神經元產生輸出的時候,該輸出會被存到記憶元(memory cell);
- 下一次有輸入時,這些神經元不僅會考慮輸入 x1, x2,還會考慮存到記憶元里的值;
- 記憶元可簡稱為單元(cell),記憶元的值也可稱為隱狀態(hidden state)。
- 運算示例:為了便于計算,假設所有的激活函數都是線性的;
RNN 架構
- RNN 處理槽填充:分別輸入每一個詞匯,輸出得到該詞匯屬于每個槽的概率向量;
- 注意:這個不是三個網絡,這是同一個網絡在三個不同的時間點被使用了三次,同樣的權重用同樣的顏色表示了;
- 有了記憶元以后,輸入同一個單詞,希望輸出不同的問題就有可能被解決;
- 比如這里輸入地點都是臺北,但是記憶元內的值不同(離開,到達),輸出也就不相同;
- RNN 也可以是深層的,擁有多個隱藏層:
其它 RNN
- Jordan 網絡存的是整個網絡輸出的值,它有目標,比較清楚記憶元里面存儲的是什么東西:
- 雙向循環神經網絡:產生
?的時候,網絡不只是看過
?到?
?的輸入,它也看了句尾到?
的輸入;
- 假設考慮的是槽填充,網絡就等于看了整個句子后,才決定每一個單詞的槽;
- 長短期記憶網絡(Long Short-Term Memory network,LSTM):
- 運算公式:
- 輸入門和輸出門使用 sigmoid 函數計算,計算得到正數則?f 的輸出是 1,表示為被打開的狀態,反之代表這個門是關起來的;
- 遺忘門輸出為 1,則進行初始值與新輸入值的加法計算;遺忘門為 0 則相當于保持新輸入值并替換初始值;
- 計算舉例:
LSTM 原理
- 把 LSTM 想成是一個神經元:
- 每個 LSTM 都需要 4 個輸入,且 4 個輸入均不相同:
- 單個 LSTM 的計算流程圖:
- 真正的 LSTM 會把上一個時間的輸出接進來,當做下一個時間的輸入,即下一個時間點操控這些門的值不是只看那個時間點的輸入
,還看前一個時間點的輸出
?;
- 其實還不止這樣,還會添加 peephole 連接。peephole 就是把存在記憶元里面的值也拉過來。操控 LSTM 四個門的時候,同時考慮了
,
,
,把這三個向量并在一起乘上不同的變換得到四個不同的向量再去操控 LSTM;
- 多層 LSTM:
RNN 學習方式
- 計算損失函數:輸出 y 和參考向量([0……1……0])的交叉熵的和;
- 隨時間反向傳播(BackPropagation Through Time,BPTT):
- RNN 的訓練是很困難的,經常遇到 loss 突然上升再下降的情況:
- RNN 的誤差表面是總損失的變化是非常陡峭的或崎嶇的,如果梯度下降過程中 loss 剛好落到了懸崖壁上,那么下一次的梯度下降就有可能導致整個參數飛出去了;
- 所以這里采用“裁剪”方法,限制了梯度的最大閾值,超過閾值則該處梯度設為閾值;
- RNN 訓練的問題不是來自激活函數,而是因為時間序列同樣的權重在不同的時間點被反復的使用;
- 這里的 RNN 只有一個神經元,可以看出?w 只要一有變化,它完全由可能沒有造成任何影響,一旦造成影響,影響很大,梯度會很大或很小;
- 梯度消失(gradient vanishing,把那些平坦的地方拿掉)解決方法:利用 LSTM;
- 補充:做 LSTM 時,大部分地方變化的很劇烈,所以可以把學習率設置的小一點,保證在學習率很小的情況下進行訓練;
- GRU 只有兩個門,所需參數更少,訓練得到的模型更健壯,相比 LSTM 不易過擬合;
- GRU 特性:舊的不去,新的不來。它把輸入門跟遺忘門聯動起來,也就是說當輸入門打開的時候,遺忘門會自動的關閉 (格式化存在記憶元里面的值),當遺忘門沒有要格式化里面的值,輸入門就會被關起來;
3.3 RNN 其它應用
多對一序列
- 1. 情感分析:
- 序列是指一組按特定順序排列、前后存在關聯的元素組合;
- 2. 關鍵術語抽取:
多對多序列
- 1. 語音識別:輸入是聲音序列,一句話就是一段聲音信號,處理時用向量表示;每一個輸入對應的時間間隔是很小的(0.01 秒),所以通常是好多個向量對應到同一個字符;
- 修剪(trimming):把重復的東西拿掉,但是無法識別疊字;
- CTC 方法:在輸出時候,不只是輸出所有中文的字符,還可以輸出一個符號”null”,其代表沒有任何東西;
- CTC 訓練:不知道字對應哪個字符,這時候要窮舉所有可能的對齊,也有算法可以處理;
- 2. 英文識別:
序列到序列
- 1. 機器翻譯(machine translation):輸入英文單詞序列把它翻譯成中文的字符序列;
- 和之前 CTC 不同的是,這里英文和中文(輸入輸出)序列的長短是未知的;
- 使用 RNN 讀入序列,在最后一個時間點,這個記憶元里面就存了所有輸入序列的信息;
- 運行機制:這里開始輸出,輸出一個字符后,把之前輸出的字符當做輸入,再把記憶元里面的值讀進來;
- 怎么停下來:多加一個符號“斷”;
- 2. 句法解析:讓機器看一個句子,得到句子結構樹,只要把樹狀圖描述成一個序列;
4.? 自注意力機制
4.1 self-attention 原理
輸入輸出
- 輸入是一組向量序列,且向量的數目會發生改變:
- 將輸入詞匯轉換為向量的方法:獨熱編碼、詞嵌入;
- 將輸入語音轉換為向量:取聲音信號的一個范圍(窗口),將其包含信息轉換為一個向量(幀),兩段信號之間通常取 10ms(前人調好的);
- 輸出有三種形式:
- 類型 1:輸入與輸出數量相同;如:詞性標注;
- 類型 2:輸入是一個序列,輸出是一個標簽;如:情感分析;
- 類型 3:序列到序列;如:翻譯;
運作原理
- 問題引出:在詞性標注中,一個詞的詞性往往需要對整個句子進行分析,雖然可以使用全連接提供前后向量的信息,但是意味著全連接網絡需要非常多的參數,不只運算量很大,還容易過擬合;
- 自注意力機制:輸入幾個向量,它就輸出幾個向量,且這些向量都是考慮整個序列后得到的;
- 自注意力模型可以疊加很多次:
- 運作方式:考慮向量之間的相關度,設為?
;
- 相關度的計算:輸入向量乘以不同矩陣得到兩個向量 q(查詢),k(鍵),再進行點積(逐元素相乘累加)得到標量?
;
- 套用在自注意力模型中:計算?
?和每一個向量的相關度(也會跟自己算關聯性),再對所有的關聯性做一個 softmax 操作;
- 注意:不一定要用 Softmax,還可以用別的激活函數,如 ReLU;
- 最后根據計算得到的關聯性去抽取序列的重要信息,
?到?
?分別乘上一個?
,再分別乘上對應的關聯性,求和得到?
;同理,可以計算出
到
;
- 由于是做求和運算,所以誰的注意力分數最大,誰的 v 就主導(dominant)抽出來的結果;
矩陣乘法
- 第一步:計算向量 q、k、v 組成的矩陣 Q、K、V;
- 第二步:將?
?與 Q 相乘,計算每組計算出來的關聯性組成的矩陣 A';
- 第三步:將 A' 與 V 相乘,得到由 b 組成的向量組 O;
- 綜上所述:自注意力層里面唯一需要學的參數就只有
、
跟
;
4.2 自注意力進階
Multi-head self-attention
- 多頭自注意力:q、k、v 分別乘上兩個矩陣分裂為兩個頭,然后對應 q、k 進行自注意力操作,得到兩個 b;
- 把
跟
接起來,再通過一個變換,即再乘上一個矩陣然后得到
,再送到下一層去;
Positional encoding
- 為什么需要位置信息:
- 位置編碼:每一個位置設定一個向量,即位置向量(positional vector);
- 位置向量用
來表示,上標 i 代表位置。把
加到
上面就結束了,這相當于告訴自注意力位置的信息;下圖的每一列都代表一個
;
?Tuncated self-attention
- 截斷自注意力機制:在語音識別中,一段聲音序號對應的向量是非常長的,需要很大內存,所以截斷自注意力計算時,只需要看一個范圍內的內容即可;
4.3 自注意力與神經網絡
對比 CNN
- 每一個位置的像素可看作是一個三維的向量,整張圖像是5 × 10 個向量;
- 自注意力:假設圈內 1 是要考慮的像素(pixel),那么它會發出查詢,其它像素產生鍵,計算時考慮的是整張圖片的內容;
- CNN:只考慮感受野中的信息;
- 簡單來說:CNN 就是自注意力的一個特殊情況,自注意力只要通過某些設計、某些限制就會變成卷積神經網絡。;
- CNN 與自注意力訓練得到準確率對比:
- 自注意力的彈性比較大,所以需要比較多的訓練數據,訓練數據少的時候就會過擬合。而卷積神經網絡的彈性比較小,在訓練數據少的時候結果比較好。
對比 RNN
- 差異一:RNN 通常只考慮該位置前面的輸入(除了雙向 RNN),而自注意力前后均考慮到;
- 差異二:RNN 對最開始的輸入是很難考慮到的,必須存在 memory 里面;而自注意力輸出一個查詢,輸出一個鍵,只要它們匹配(match)得起來,“天涯若比鄰”,可以輕易地從整個序列上非常遠的向量抽取信息。
- 差異三:RNN 的計算是順序執行下去的,而自注意力可以并行計算,速度更快;
4.4 GNN
- 前面說過自注意力還可以用在圖上,圖上面的邊已經暗示了節點跟節點之間的關聯性,所以只需要只計算有邊相連的節點間的關聯性即可;
5. Transformer
5.1 Transformer 原理
應用場景
- Transformer 是一個基于自注意力的序列到序列模型,與基于循環神經網絡的序列到序列模型不同,其可以能夠并行計算;
- 常見應用:語音識別、機器翻譯與語音翻譯;
- 既然語言識別 + 機器翻譯? = 語言翻譯,為什么還要語言翻譯:有些語言是沒有文字的;
- 其它應用:語音合成(文字生成語音),聊天機器人,問答任務(翻譯,情感分析),句法分析,多標簽分類(multi-label classification);
Transformer 結構
- 序列到序列模型:編碼器負責處理輸入的序列,再把處理好的結果“丟”給解碼器,由解碼器決定要輸出的序列;
- 序列到序列典型的模型就是 Transformer,其有一個編碼器架構和一個解碼器架構;
5.2 編碼器和解碼器
編碼器
- 編碼器功能:輸入向量序列,輸出相同數目的向量序列,內部就是由 n 個處理塊組成的;
- 塊內結構:
- 殘差連接(residual connection):假設某向量原始映射為 H(x),將原始輸入 x 加到輸出上,最終輸出變為 H(x) + x;H(x) 被稱為“殘差函數”;
- 注意:這里的歸一化為 Layer Norm(層歸一化),是在同特征不同維度進行歸一化;
- 最終得到的編碼器結構如下:
自回歸解碼器(AT)
- 要讓解碼器產生輸出,首先要先給它一個代表開始的特殊符號 <BOS>,即 Begin Of Sequence,這是一個特殊的詞元(token);
- 解碼器的輸入是它在前一個時間點的輸出,其會把自己的輸出當做接下來的輸入(注意:只是在測試集這樣做);
- 誤差傳播:
- 解碼器結構:相比編碼器不一樣的是第一層的掩蔽自注意力(masked self-attention);
- 掩蔽自注意力對比自注意力:通過一個掩碼(mask)來阻止每個位置選擇其后面的輸入信息,例如產生 b1 的時候,只能考慮 a1 的信息,不能再考慮 a2、a3、a4;
- 由于輸出長度未知,所以應該如何讓解碼器停止運作:添加 EOS 字符;
非自回歸解碼器(NAT)
- 特點:解碼器吃的是一排的 BOS,輸出也是一次產生產生一排詞元;
- 輸出長度如何確定:1.用分類器接收輸入產生應該輸出的長度;2.假設輸出不會超過 300,則輸入 300 個 BOS,舍棄 EOS 之后的輸出;
- 優點:1.一次性輸出,速度快;2.可以控制輸出長度;
Cross Attention
- 編碼器和解碼器直接怎么進行連接呢:
- 譯碼器輸出變換為?q,而編碼器輸出變換為 k,v,將兩者進行自注意力運算;
- 后續計算同理:
5.3 Transformer 訓練
- 其實解碼器每輸出一次,就是做一次分類,計算標準答案的獨熱向量與輸出的交叉熵;
- 訓練的輸入是標準答案,測試的輸入是自己的輸出(Mismatch),要做的是最小化交叉熵(包括 EOS);
5.4 訓練 Tips
Copy Mechanism
- 復制機制:讓模型在面對一些人名或生詞時可以直接進行復制,還有做摘要等情況下;
Guided Attention
- 引導注意力:有時候機器無法處理非常短的句子,所以要求機器在做注意力的時候有固定的方式,比如語音識別需要從左往右;
Beam Search
- 這種每次找分數最高的詞元來當做輸出的方法稱為貪心搜索(greedy search),紅色路徑就是通過貪心解碼得到的路徑。
- 但貪心搜索不一定是最好的方法,第一步可以先稍微舍棄一點東西;
- 束搜索:用比較有效的方法找一個近似解,在某些情況下效果不好;
加入噪聲
- 李宏毅老師:不完美也許才是真正的完美 QAQ;
使用強化學習訓練
- 評估用的是 BLEU(BiLingual Evaluation Under-study)分數,是兩個句子之間做比較算出的。但訓練的時候每一個詞匯是分開考慮的。最小化交叉熵不一定可以最大化 BLEU 分數;
- BLEU 分數很復雜,如果要計算兩個句子之間的 BLEU 分數,損失根本無法做微分;
- 遇到優化無法解決的問題,可以用強化學習訓練。具體來講,遇到無法優化的損失函數,把損失函數當成強化學習的獎勵,把解碼器當成智能體;
Scheduled Sampling
- 測試的時候,解碼器看到的是自己的輸出,因此它會看到一些錯誤的東西。但是在訓練的時候,解碼器看到的是完全正確的,這種不一致的現象叫做曝光偏差(exposure bias);
- 計劃采樣:偶爾給解碼器的輸入加一些錯誤的東西,它反而會學得更好;
6. 自監督學習
6.1 Self-Supervised Learning
- 自監督學習(Self-Supervised Learning,SSL)是一種無標注的學習方式;
- 原理:假設我們有未標注的文章數據,則可將一篇文章 x 分為兩部分:模型的輸入 x′ 和模型的標簽 x′′,將 x′ 輸入模型并讓它輸出?
,想讓
?盡可能地接近它的標簽 x′′(學習目標);
- 自監督學習可以看作是一種無監督學習方法;
- 自監督學習的模型大多都是以芝麻街的角色命名;
- Bert:進擊的巨人 QAQ;
- 模型參數量的變化:
6.2 初識 Bert
架構
- BERT 的架構與 Transformer 的編碼器完全相同,里面有很多自注意力和殘差連接、歸一化;
- 假設這里輸入是文字,需要隨機掩碼(masking)一些詞元(token);
- 做掩碼的方式:1. 替換為特殊詞元 MASK;2. 替換為隨機字;
訓練(掩碼)
- 1. 掩碼:我們知道掩碼字符是什么,但是 Bert 不知道,所以需要它去預測該字符(填空),本質就是分類問題,計算輸出與答案獨熱向量間的交叉熵并進行最優化;
- 2. 下一句預測:判斷第二句是不是第一句的后一句(二分類);
- 特殊詞元分類符號 [CLS],分隔符 [SEP];訓練時只取 CLS 的輸出;
- 后面研究方向下一句預測對模型沒有什么用,所以引出了句序預測(Sentence Order Prediction,SOP),輸出兩個句子是什么樣的順序的可能性;
微調與預訓練
- 如何使用 Bert:在訓練時,讓 Bert 完成兩個任務(掩碼下的詞元預測,下一句預測(沒啥用)),使得它具有填空的能力;接著利用它去實現一些下游任務(downstream task);
- 當 Bert 完成這些下游任務時,還是需要給它提供一些標注的數據;
- 微調(fine-tuning):對 Bert 進行微調,使得可以完成某些任務;
- 預訓練(pre-train):產生 Bert 的過程就是預訓練;
GLUE
- Bert 就像一個胚胎干細胞,可以進行分化成很多能力不同的子細胞;
- 在對 Bert 微調前,需要對它的能力進行評估:GLUE 就是測試它在 9 個不同任務上的準確率取平均值來評估的;
- 通用語言理解評估(General Language UnderstandingEvaluation,GLUE);
- 隨著越來越多的技術被提出,越來越多的其他任務可以比人類做得更好;
6.3 Bert 使用場景
情感分析
- BERT 沒有辦法從頭開始解決情感分析問題,其仍然需要一些標注數據,需要提供很多句子以及它們的正面或負面標簽來訓練 BERT 模型;
- Bert 內的參數不是隨機初始化的,是預訓練好的,隨機初始化的參數只有線性變換里的;
- 半監督學習:Semi-supervised learning;
- 輸入句子及 CLS,只取 CLS 輸出做變換得到分類;
詞性標注
- 輸入句子及 CLS,取除了 CLS 之外的詞對應輸出做變換,得到每個詞的詞性分類;
自然語言推理(NLI)
- 任務目標:分析兩個句子(前提和假設)間的關系(矛盾和不矛盾);
- 輸入兩個句子及 CLS,SEP,輸出只取 CLS 輸出做變換得到分類;
問答系統
- 任務目標:輸入文章,提供問題給機器回答(這里的輸出只從原文中截取),輸出為兩個數字,代表答案的起始和結束詞下標;
- 輸入問題和文章,CLS 和 SEP,唯一需要從頭開始訓練的只有兩個向量(“從頭開始訓練”是指隨機初始化),我們使用橙色向量和藍色向量來表示它們;
- 將文章輸出與兩個向量分別計算內積(類似自注意力,橙色部分視為查詢,黃色部分視為鍵),再經過 Softmax 得到每個詞的概率,取最大概率的詞作為答案的起始,結束;
Seq2Seq
- BERT 只有預訓練編碼器,有沒有辦法預訓練 Seq2Seq 模型的解碼器?
- 對編碼器的輸入做一些擾動,訓練模型可以去修復擾動,輸出和原文一樣的內容;
- 其實有多種方法可以損壞句子:例如刪除一些單詞,打亂詞匯順序(語序),把單詞的順序做個旋轉,或既插入 MASK,又刪除某些單詞;
- 總之,有各種方法把輸入句子損壞,再通過 Seq2Seq 模型把它還原;
6.4 Bert 有用的原因
Word Embedding
- 當輸入一串文字時,每個文字都有一個對應的向量,這個向量稱為嵌入(embedding);
- 嵌入可以代表對應的 token 的意思,而且考慮了上下文;
- 相同的字,上下文不同,嵌入也不同;意思相近的字,嵌入更接近;
- 計算這些向量之間的余弦相似度,即計算它們的相似度;
- 每一格代表兩個“果”的嵌入之間的相似度,相似度的值越大,顏色越淺;前五句中的“果”接近黃色,自己跟自己算相似度,一定是最大的;
- BERT 知道前五個“果”指的是可以吃的蘋果,所以它們比較像;后五個“果”指的是蘋果公司的“果”,所以它們比較像;
- 結論:BERT 在訓練填空的過程中,學會了每個字的意思;
- 為什么 BERT 這種完型填空的形式可以學習到字的意思呢?因為有研究者說過,要了解一個字或者詞的意思,需要通過他的上下文來體現;
- BERT 架構是 transformer 的 encoder,而 transformer 主要用了 self-attention 的構架,self-attention 就考慮了整個序列,也就是所遮住部分的上下文;
- 其實這種完形填空的思路很早就有,比如 CBOW,但是 CBOW 考慮到模型的復雜性,用的簡單的線性模型;
- BERT 也被稱為上下文的詞嵌入;
6.5 Bert 變種
Multi-lingual BERT
- 多語言 Bert:通過使用不同的語言作為輸入,發現對用 English 作為輸入訓練得到的模型進行微調,居然可以回答中文問題;
- 為什么會這樣:不同語言但是相同意思的詞匯,他們的 Embedding 距離很近;
6.6 GPT
- BERT 做的是填空題,而 GPT 要做的任務是預測接下來會出現的詞元;
- GPT 模型建立在 Transformer 的解碼器的基礎上,不過其會做 mask 的注意力,給定 <BOS> 預測“深”的時候,不會看到接下來出現的詞匯;
- 自監督學習不僅可以用在文字上,還可以用在語音和計算機視覺(CV)上;