Ⅰ mlp是什麼意思
mlp是移動定位協議。
移動定位協議(Mobile Location Protocol)簡稱MLP,是LIF指定的一個用於獲取移動終端設備位置信息的傳輸協議。詳細定義了定位伺服器(Location server)和LSC(Location Service Client)之間的數據傳輸方式(is)。
相關信息:
最基本的MLP服務是根據3GPP提出的定位服務定義的[10][161,另外,還有高級的MLP服務和附加的MLP服務,這 些服 務是根據一些被MLP確認的服務協議制定。
服務層分為兩個子層,上面的一層管理服務類型和內容,下面的一層管理支持上層服務的元素,如果某個元素 支持多項服務,那麼這個元素就放在元素層定義。
Ⅱ 從Siamse孿生網路到Sentence-BERT綜述
文兄空本匹配一直是自然語言處理(NLP)領域一個基礎且重要的方向,一般研究兩段文本之間的關系。文本相似度計算、自然語言推理、問答系統、信息檢索等,都可以看作針對不同數據和場景的文本匹配應用。
最近,我和小夥伴們參與了阿里天池「「新冠疫情相似句對判定大賽」,比賽任務:根據真實場景下疫情相關的肺炎、支原體肺炎等患者提問句對,識別相似的患者問題,就是典型的文本相似匹配應用。 截止3月18日,我們團隊在942支參賽隊伍中排名第四。
藉助比賽的機會,我重新系統梳理、總結了文本匹配的經驗方法。本文將著重介紹文本匹配任務中的經典網路Siamse Network,它和近期預訓練語言模型的組合使用,一些論文提及的調優技巧以及在此次比賽數據集上的效果檢驗等。
在正式開始介紹之前,我們先來看一個有趣的故事: 孿生網路的由來!
「Siamse」中的「Siam」襲塵森是古時泰國的稱呼,中文譯作暹羅,所以「Siamese」就是指「暹羅」人或「泰國」人。而「Siamese」在英語中是「孿生」的意思,這又是為什麼呢?請看下圖
十九世紀,泰國出生了一對連體嬰兒「恩」和「昌」,當時的醫學技術無法使兩人分離出來,於是兩人頑強地生活了一生。1829年他們被英國商人發現,進入馬戲團,在全世界各地演出,1839年他們訪問美國北卡羅萊那州成為「玲玲馬戲團」 的台柱,最後成為美國公民。1843年4月13日跟英國一對姐妹結婚,恩生了10個小孩,昌生了12個。1874年,兩人因病均於63歲離開了人間。他們的肝至今仍保存在費城的馬特博物館內。從此之後「暹羅雙胞胎」(Siamese twins)就成了連體人的代名詞,也因為這對雙胞胎全世界開始重視這項特殊疾病。
由於結構具有鮮明的對稱性,就像兩個孿生兄弟,所以下圖這種神經網路結構被研究人員稱作「Siamese Network」,即孿生網路。
其中最能體現「孿生」的地方,在於網路具有相同的編碼器(sentence encoder),即將文本轉換為高維向量的部分(詞嵌入)。網路隨後對兩段文本的特徵進行交互,最後完成分類/相似預測。「孿生網路」結構簡單,訓練穩定,是很多文本任務不錯的baseline模型。
孿生網路的具體用途是衡量兩個輸入文本的相似程度。例如,現在我們有兩個文本 text1 和 text2,首先將文本分別輸入 sentence encoder 進行特徵提取和編碼,將輸入映射到新的空間得到特徵向量 u和v;最終通過u、v的拼接組合,經過下游網路(比如全連接網路mlp)和激活函數來計算文本1和2的相似性。
整個過程有2個值得關注的點:
(1)在訓練和測試過程中, 模型的編碼器(sentence encoder)部分是權重共拍畝享的 ,這也是「孿生」一詞的體現之處。編碼器的選擇非常廣泛,傳統的CNN、RNN和Attention、Transformer都可以。
(2)得到特徵u、v後,可以直接使用距離公式,如cosine距離、歐式距離等得到兩個文本的相似度。不過更通用的做法是,基於u和v構建用於建模兩者匹配關系的特徵向量,然後用額外的模型(mlp等)來學習通用的文本關系函數映射;畢竟我們的場景不一定只是衡量相似性,可能還有問答、蘊含等復雜任務。
基於孿生網路,還有人提出了 Triplet network 三連體網路。顧名思義,輸入由三部分組成,文本1,和1相似的文本2,和1不相似的文本3。訓練的目標非常樸素,期望讓相同類別間的距離盡可能的小,讓不同類別間的距離盡可能的大,即減小類內距,增大類間距。
自從2018年底Bert等預訓練語言模型橫空出世,NLP屆的游戲規則某種程度上已經被大大更改了。在計算資源允許的條件下,Bert成為很多問題的優先選擇;甚至有的時候,拿Bert跑一跑baseline,發現問題已經被解決了十之八九。
但是Bert的缺點也很明顯,1.1億參數量(base版本)使得預測、推理速度明顯比CNN等傳統網路慢了不止一個量級,對資源要求更高,也不適合處理某些任務。例如,從10000條句子中找到最相似的一對句子,由於可能的組合眾多,需要完成49,995,000次推理計算;在一塊現代V00GPU上使用Bert計算,將消耗65小時。
考慮到孿生網路的簡潔有效,有沒有可能將它和Bert強強聯合取其精華呢?
當然可以,這正是論文 《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》 的工作,首次提出了 Sentence-Bert模型(以下簡稱SBert) 。SBert在眾多文本匹配工作中(包括語義相似性、推理等)都取得了最優結果。更讓人驚訝的是,前文所述的從10000條句子找最相似pair的任務,SBert僅需5秒就能完成!
讓我們簡短回顧此前Bert是怎麼處理文本匹配任務的。
常規做法是將匹配任務轉換成二分類任務(相似/不相似)。輸入的兩個文本拼接成一個序列(中間用一個特殊的符號「SEP」分割),經過12層(base-model)或24層(large-model)的multi-head Transformer模塊編碼後,將輸出層的字向量取平均或者取第一個token位置「CLS」的特徵作為句向量,經softmax完成最終分類。
但是論文作者 Nils Reimers 在實驗中指出,這樣的做法產生的結果並不理想(至少在處理語義檢索和聚類問題時是如此),甚至往往比Glove詞向量取平均的效果還差。
為了讓Bert更好地利用文本信息,作者們在論文中提出了如下的SBert模型結構。是不是非常眼熟?對,這不就是之前見過的孿生網路嘛!
SBert沿用了孿生網路的結構,文本的encoder部分用同一個Bert來處理。之後,作者分別實驗了CLS-token和2種池化策略(Avg-Pooling、Mean-Pooling),對Bert輸出的字向量進行進一步特徵提取、壓縮,得到u、v。最後的u、v整合,作者提供了3種策略:
(1)針對分類任務,對u、v拼接組合,最後接入一個mlp網路,使用softmax進行分類輸出,損失函數使用交叉熵;
(2)直接計算、輸出餘弦相似度;訓練損失函數採取了均方根誤差;
(3)如果輸入的是三元組,論文種也給出了相應的損失函數。
總的來說,SBert直接使用Bert的原始權重進行初始化,在具體數據集上微調,訓練過程和傳統Siamse Network差異不大。但是這種訓練方式能讓Bert更好的捕捉句子之間的關系,生成更優質的句向量。在評估測試階段,SBert直接使用餘弦相似度來比較兩個句向量之間的相似度,極大提升了推理速度。
有實驗為證!作者在7個文本匹配相關的任務上做了對比實驗,結果在其中的5個任務上,SBert都有更優表現。
此外,作者還做了一些有趣的消融實驗。使用NLI和STS為代表的匹配數據集,在進行分類目標函數訓練時,作者們測試了不同的整合策略,結果顯示「(u, v, |u-v|)」的組合效果最好,這裡面最重要的組成部分是元素差: (|u - v|) 。句向量之間的差異度量了兩個句子嵌入的維度間的距離,確保相似的對更近,而不同的對更遠。
此外,在Pool方法中,平均池化的效果要比另兩種方法更好。
完善的實驗過程幫助我們避免了不少坑。文章最後,作者對SBert和傳統的一些句嵌入方法做了對比,SBert的計算效率要更高一些。其中的smart-batching是論文中的一個小trick,先將輸入的文本按長度排序,這樣同一個mini-batch的文本長度更加統一,padding填充處理時能顯著減少填充的token。
我們將SBert模型在本次比賽的數據集上做了測試。使用數據增強後,線下的訓練集和驗證集數量分別是13,500和1000條句子組合。預訓練模型權重選擇的是roberta_wwm_large,訓練過程中加入了對抗訓練,通過在embedding層額外增加一些雜訊點提升模型的泛化能力。
最終SBert單模型在線下驗證集上的准確率是95.7%。直接使用Bert微調的方式,准確率為95.3%。
總的來說,我們做這次比賽的目的是為了積累更多的經驗,盡可能將學術界的前沿演算法和工業界結合,從而更好的將相關技術在實際項目中落地。
本文總體介紹了文本匹配任務中常用的網路結構Siamse Network,以及在此基礎上改進而來的Sentence-BERT模型。
Siamse Network 簡潔的設計和平穩高效訓練非常適合作為文本匹配任務的baseline模型,包括不限於問答對話、文本蘊含、文本相似等任務;如果孿生網路不能有效解決,可以再嘗試其他更復雜的模型。SBert則充分利用了孿生網路的優點和預訓練語言模型強大的特徵抽取優勢,在眾多匹配任務上取得了最優實驗結果。
拋開具體任務不談,SBert 可以幫助我們生成更好的句向量,在一些任務上可能產生更優結果。在推理階段,SBert直接計算餘弦相似度的方式,大大縮短了預測時間;在語義檢索、信息搜索等任務中預計會有不錯表現。同時, 得益於生成的高質量句嵌入特徵,SBert也非常適合做文本聚類、新FAQ發現等工作。
Ⅲ 神經網路原理
神經網路是一種受到人類神經系統啟發而設計的機器學習模型。它由多個稱為神經元的單元組成,這些神經元通過連接權重相互連接。神經網路利用輸入數據和這些連接權重來進行信息處理和模式識別。以下是神經網路的基本原理:
結構:神經網路由多個層級組成,包括輸入層、隱藏層(可以有多個)和輸出層。輸入層接收外部輸入數據,輸出層產生最終的預測結果或輸出。隱藏層位於輸入層和輸出層之間,其中每個隱藏層由多個神經元組芹銀成。
神經元:神經網路的基本單元是神經元。每個神經元接收來自上一層神經元的首首旁輸入,並通過連接權重對這些輸入進行加權求和。然後,應用一個激活函數來確定神經元的輸出。激活函數可以是簡單的閾值函數、Sigmoid函數、ReLU函數等,用於引入非線性特性。
前向傳播:神經網路的前向傳播是指從輸入層到輸出層的信息傳遞過程。輸入數據通過網路中的連接和加權求和,逐層傳遞到輸出層,最終生成預測結果。
反向傳播:反向傳播是神經網路用於訓練和調整連接權重的過程。它基於損失函數來度量預測結果與真實標簽之間的誤差。通過計算誤差梯度,反向傳播將誤差從輸出層向後傳播到隱藏層和輸入層,然後根據梯度更新連接權重,以減小誤差。
訓練:神經網路的訓練是通過不斷迭代前向傳播和反向傳播來調整連接權重,以使網路的預測結果與真實標簽更加接近。常用的訓練演算法包括梯度下降和其變體,以最小化損失函數。
通過逐漸調整連接權重者橡,神經網路能夠學習到輸入數據中的模式和特徵,從而實現識別、分類、預測等任務。它在各個領域中都有廣泛的應用,如圖像識別、自然語言處理、語音識別等。
Ⅳ sklearn 神經網路 MLPClassifier簡單應用與參數說明
MLPClassifier是一個監督學習演算法,下圖是只有1個隱藏層的MLP模型 ,左側是輸入層,右側是輸出層。
上圖的整體結構可以簡單的理解為下圖所示:
MLP又名多層感知機,也叫人工神經網路(ANN,Artificial Neural Network),除了輸入輸出層,它中間可以有多個隱藏層,如果沒有隱藏層即可解決線性可劃分的數據問題。最簡單的MLP模型只包含一個隱藏層,即三層的結構,如上圖。
從上圖可以看到,多層感知機的層與層之間是全連接的(全連接的意思就是:上一層的任何一個神經元與下一層的所有神經元都有連接)。多層感知機最底層是輸入層,中間是隱藏層,最後是輸出層。
輸入層沒什麼好說,你輸入什麼就是什麼,比如輸入是一個n維向量,就有n個神經元。
隱藏層的神經元怎麼得來?首先它與輸入層是全連接的,假設輸入層用向量X表示,則隱藏層的輸出就是
f(W1X+b1),W1是權重(也叫連接系數),b1是偏置,函數f 可以是常用的sigmoid函數或者tanh函數:
最後就是輸出層,輸出層與隱藏層是什麼關系?其實隱藏層到輸出層可以看成是一個多類別的邏輯回歸,也即softmax回歸,所以輸出層的輸出就是softmax(W2X1+b2),X1表示隱藏層的輸出f(W1X+b1)。
MLP整個模型就是這樣子的,上面說的這個三層的MLP用公式總結起來就是,函數G是softmax
因此,MLP所有的參數就是各個層之間的連接權重以及偏置,包括W1、b1、W2、b2。對於一個具體的問題,怎麼確定這些參數?求解最佳的參數是一個最優化問題,解決最優化問題,最簡單的就是梯度下降法了(sgd):首先隨機初始化所有參數,然後迭代地訓練,不斷地計算梯度和更新參數,直到滿足某個條件為止(比如誤差足夠小、迭代次數足夠多時)。這個過程涉及到代價函數、規則化(Regularization)、學習速率(learning rate)、梯度計算等。
下面寫了一個超級簡單的實例,訓練和測試數據是mnist手寫識別數據集:
from sklearn.neural_network import MLPClassifier
import gzip
import pickle
with gzip.open('./mnist.pkl.gz') as f_gz:
train_data,valid_data,test_data = pickle.load(f_gz)
clf = MLPClassifier(solver='sgd',activation = 'identity',max_iter = 10,alpha = 1e-5,hidden_layer_sizes = (100,50),random_state = 1,verbose = True)
clf.fit(train_data[0][:10000],train_data[1][:10000])
print clf.predict(test_data[0][:10])
print(clf.score(test_data[0][:100],test_data[1][:100]))
print(clf.predict_proba(test_data[0][:10]))
參數說明:
參數說明:
1. hidden_layer_sizes :例如hidden_layer_sizes=(50, 50),表示有兩層隱藏層,第一層隱藏層有50個神經元,第二層也有50個神經元。
2. activation :激活函數,{『identity』, 『logistic』, 『tanh』, 『relu』}, 默認relu
- identity:f(x) = x
- logistic:其實就是sigmod,f(x) = 1 / (1 + exp(-x)).
- tanh:f(x) = tanh(x).
- relu:f(x) = max(0, x)
3. solver: {『lbfgs』, 『sgd』, 『adam』}, 默認adam,用來優化權重
- lbfgs:quasi-Newton方法的優化器
- sgd:隨機梯度下降
- adam: Kingma, Diederik, and Jimmy Ba提出的機遇隨機梯度的優化器
注意:默認solver 『adam』在相對較大的數據集上效果比較好(幾千個樣本或者更多),對小數據集來說,lbfgs收斂更快效果也更好。
4. alpha :float,可選的,默認0.0001,正則化項參數
5. batch_size : int , 可選的,默認』auto』,隨機優化的minibatches的大小batch_size=min(200,n_samples),如果solver是』lbfgs』,分類器將不使用minibatch
6. learning_rate :學習率,用於權重更新,只有當solver為』sgd』時使用,{『constant』,』invscaling』, 『adaptive』},默認constant
- 『constant』: 有』learning_rate_init』給定的恆定學習率
- 『incscaling』:隨著時間t使用』power_t』的逆標度指數不斷降低學習率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t)
- 『adaptive』:只要訓練損耗在下降,就保持學習率為』learning_rate_init』不變,當連續兩次不能降低訓練損耗或驗證分數停止升高至少tol時,將當前學習率除以5.
7. power_t: double, 可選, default 0.5,只有solver=』sgd』時使用,是逆擴展學習率的指數.當learning_rate=』invscaling』,用來更新有效學習率。
8. max_iter: int,可選,默認200,最大迭代次數。
9. random_state:int 或RandomState,可選,默認None,隨機數生成器的狀態或種子。
10. shuffle: bool,可選,默認True,只有當solver=』sgd』或者『adam』時使用,判斷是否在每次迭代時對樣本進行清洗。
11. tol:float, 可選,默認1e-4,優化的容忍度
12. learning_rate_int:double,可選,默認0.001,初始學習率,控制更新權重的補償,只有當solver=』sgd』 或』adam』時使用。
14. verbose : bool, 可選, 默認False,是否將過程列印到stdout
15. warm_start : bool, 可選, 默認False,當設置成True,使用之前的解決方法作為初始擬合,否則釋放之前的解決方法。
16. momentum : float, 默認 0.9,動量梯度下降更新,設置的范圍應該0.0-1.0. 只有solver=』sgd』時使用.
17. nesterovs_momentum : boolean, 默認True, Whether to use Nesterov』s momentum. 只有solver=』sgd』並且momentum > 0使用.
18. early_stopping : bool, 默認False,只有solver=』sgd』或者』adam』時有效,判斷當驗證效果不再改善的時候是否終止訓練,當為True時,自動選出10%的訓練數據用於驗證並在兩步連續迭代改善,低於tol時終止訓練。
19. validation_fraction : float, 可選, 默認 0.1,用作早期停止驗證的預留訓練數據集的比例,早0-1之間,只當early_stopping=True有用
20. beta_1 : float, 可選, 默認0.9,只有solver=』adam』時使用,估計一階矩向量的指數衰減速率,[0,1)之間
21. beta_2 : float, 可選, 默認0.999,只有solver=』adam』時使用估計二階矩向量的指數衰減速率[0,1)之間
22. epsilon : float, 可選, 默認1e-8,只有solver=』adam』時使用數值穩定值。
屬性說明:
- classes_:每個輸出的類標簽
- loss_:損失函數計算出來的當前損失值
- coefs_:列表中的第i個元素表示i層的權重矩陣
- intercepts_:列表中第i個元素代表i+1層的偏差向量
- n_iter_ :迭代次數
- n_layers_:層數
- n_outputs_:輸出的個數
- out_activation_:輸出激活函數的名稱。
方法說明:
- fit(X,y):擬合
- get_params([deep]):獲取參數
- predict(X):使用MLP進行預測
- predic_log_proba(X):返回對數概率估計
- predic_proba(X):概率估計
- score(X,y[,sample_weight]):返回給定測試數據和標簽上的平均准確度
-set_params(**params):設置參數。
Ⅳ 深度前饋網路
看過西瓜書和李航的《統計學習方法》,對機器學習的基本演算法算是有了初步的理解。機器學習的演算法和思想固然重要,在實際中也有很多應用場景,但在超大數據集的表現上,深度學習才是當下效果最好的工具。可惜的是,花書這樣一本經典著作的中文版翻譯和機翻差不多水平,因此看的時候只能放慢速度。閑言少敘,下面是第六章的學習記錄。
深度前饋網路(deep feedforward network) ,也叫作前饋神經網路(feedforward neural network)或者多層感知機(multilayer perceptron, MLP),是典型的深度學習模型。 前饋網路的目標是近似某個函數 。例如,對於分類器, 將輸入 映射到一個類別 。前饋網路定義了一個映射 ,並且學習參數 的值使它能夠得到最佳的函數近似。
下面我們把「深度前饋網路」這個詞拆開來看:
那麼深度前饋網路的各層之間有什麼區別呢?從功能來講,訓練樣本直接指明了 輸出層 在每一點x上必須做什麼,它必須產生一個接近 y 的值。但訓練數據並沒有給出其它層中的所需的輸出,所以這些層被稱為 隱藏層(hidden layer) 。
一種理解前饋網路的方式是從線性模型開始,並考慮如何克服它的局限性。如果各層的函數 都是線性函數,那麼復合後的函數依然是線性的,此時我們的網路模型等價於線性模型。為了提高模型的表示能力,我們需要將各層的 設置為非線性的,從而得到一個非線性映射 。我們可以認為 提供了一組描述 的特徵,或者認為它提供了 的一個新的表示。
設計和訓練神經網路與使用梯度下降訓練其他任何機器學習模型並沒有太大不同。神經網路和線性模型等演算法的最大區別,在於神經網路的非線性導致大多數我們感興趣的代價函數都變得 非凸 。這意味著神經網路的訓練通常使用迭代的、基於梯度的優化, 僅僅使得代價函數達到一個非常小的值 ;而不是像用於訓練線性回歸模型的線性方程求解器或者用於訓練邏輯回歸或 SVM 的凸優化演算法那樣保證全局收斂。
用於非凸損失函數的隨機梯度下降沒有這種收斂性保證,並且 對參數的初始值很敏感。對於前饋神經網路,將所有的權重值初始化為小隨機數是很重要的。偏置可以初始化為零或者小的正值。
大多數現代的神經網路使用最大似然來訓練。這意味著代價函數就是負的對數似然,它與訓練數據和模型分布間的 交叉熵 等價。這個代價函數表示為
使用最大似然來導出代價函數的方法的一個優勢是,它減輕了為每個模型設計代價函數的負擔。明確一個模型 則自動地確定了一個代價函數 。
用於實現最大似然估計的交叉熵代價函數有一個不同尋常的特性,那就是當它被應用於實踐中經常遇到的模型時,它 通常沒有最小值。 如果模型可以控制輸出分布的密度(例如,通過學習高斯輸出分布的方差參數),那麼它可能對正確的訓練集輸出賦予極其高的密度,這將導致交叉熵趨向負無窮。 正則化技術提供了一些不同的方法來修正學習問題,使得模型不會通過這種方式來獲得無限制的收益。
一種簡單的輸出單元是基於仿射變換的輸出單元,仿射變換不具有非線性。這些單元往往被直接稱為 線性單元 。給定特徵 ,線性輸出層產生一個向量 ,線性輸出層經常被用來 產生條件高斯分布的均值 :
最大化其對數似然此時等價於最小化均方誤差。
許多任務需要預測二值型變數 的值。具有兩個類的分類問題可以歸結為這種形式。此時最大似然的方法是定義 在 條件下的 Bernoulli 分布。為保證模型給出了錯誤答案時,總能有一個較大的梯度。可以使用 sigmoid輸出單元 結合最大似然來實現。sigmoid 輸出單元定義為:
這種在對數空間里預測概率的方法可以很自然地使用最大似然學習。因為用於最大似然的代價函數是 ,代價函數中的 抵消了 中的 。如果沒有這個效果,sigmoid 的飽和性會阻止基於梯度的學習做出好的改進。因此, 最大似然幾乎總是訓練 輸出單元的優選方法。
當我們想要表示一個具有 n 個可能取值的離散型隨機變數的分布時,我們可以使用 函數。它可以看作是 函數的擴展。
函數最常用作分類器的輸出,來表示 個不同類上的概率分布。比較少見的是, 函數可以在模型內部使用,例如如果我們想要在某個內部變數的 個不同選項中進行選擇。 函數的形式為:
和 一樣,當使用最大化對數似然訓練 來輸出目標值 時,使用指數函數工作地非常好。
隱藏單元的設計是一個非常活躍的研究領域,並且還沒有許多明確的指導性理論原則。
整流線性單元(Rectified Linear Unit, ReLU)是隱藏單元極好的默認選擇。許多其他類型的隱藏單元也是可用的。決定何時使用哪種類型的隱藏單元是困難的事(盡管整流線性單元通常是一個可接受的選擇)。我們這里描述對於每種隱藏單元的一些基本直覺。這些直覺可以用來建議我們何時來嘗試一些單元。 通常不可能預先預測出哪種隱藏單元工作得最好。設計過程充滿了試驗和錯誤,先直覺認為某種隱藏單元可能表現良好,然後用它組成神經網路進行訓練,最後用驗證集來評估它的性能。
大多數的隱藏單元都接受輸入向量 x,計算仿射變換 ,然後使用一個逐元素的非線性函數 。大多數隱藏單元的區別僅僅在於激活函數 的形式。
整流線性單元使用激活函數:
整流線性單元通常作用於仿射變換之上:
當初始化仿射變換的參數時,可以將 b 的所有元素設置成一個小的正值,例如 0.1。這使得整流線性單元很可能初始時就對訓練集中的大多數輸入呈現激活狀態,並且允許導數通過。
整流線性單元的一個缺陷是它們不能通過基於梯度的方法學習那些使它們激活為零的樣本。整流線性單元的各種擴展保證了它們能在各個位置都接收到梯度。
整流線性單元的三個擴展基於當 時使用一個非零的斜率 :
絕對值整流(absolute value rectification) 固定 來得到: ,它用於圖像中的對象識別 (Jarrett et al., 2009a); 滲漏整流線性單元(Leaky ReLU) (Maas et al., 2013) 將 固定成一個類似 0.01 的小值; 參數化整流線性單元(parametric ReLU) 將 作為學習的參數 (He et al., 2015)。
maxout 單元(maxout unit) (Goodfellow et al., 2013a) 進一步擴展了整流線性單元。maxout單元將 劃分為每組有 個值的組,而不是使用作用於每個元素的函數 。每個maxout單元則輸出每組中的最大元素:
這里 是組 的輸入索引集 。因為激活函數中有了max操作,所以整個maxout網路也是一種非線性的變換。
maxout的擬合能力是非常強的,它可以擬合任意的的凸函數。最直觀的解釋就是任意的凸函數都可以由分段線性函數以任意精度擬合,而maxout又是取k個隱隱含層節點的最大值,這些」隱隱含層"節點也是線性的,所以在不同的取值范圍下,最大值也可以看做是分段線性的(分段的個數與k值有關)。
整流線性單元和它們的這些擴展都是基於一個原則,那就是如果它們的行為更接近線性,那麼模型更容易優化。
在引入整流線性單元之前,大多數神經網路使用 logistic sigmoid 激活函數:
或者是雙曲正切激活函數:
這些激活函數緊密相關,因為:
我們已經看過 sigmoid 單元作為輸出單元用來預測二值型變數取值為 1 的概率。與分段線性單元不同,sigmoid 單元在其大部分定義域內都飽和——當 z 取絕對值很大的正值時,它們飽和到一個高值,當 z 取絕對值很大的負值時,它們飽和到一個低值,並且僅僅當 z 接近 0 時它們才對輸入強烈敏感。sigmoid 單元的廣泛飽和性會使得基於梯度的學習變得非常困難。因為這個原因,現在不鼓勵將它們用作前饋網路中的隱藏單元。當使用一個合適的代價函數來抵消 sigmoid 的飽和性時,它們作為輸出單元可以與基於梯度的學習相兼容。
當必須要使用 sigmoid 激活函數時,雙曲正切激活函數通常要比 logistic sigmoid 函數表現更好。在 而 的意義上,它更像是單位函數。因為 tanh 在 0 附近與單位函數類似。
架構(architecture) 一詞是指網路的整體結構: 它應該具有多少單元,以及這些單元應該如何連接。
在鏈式架構中,主要的架構考慮是選擇網路的深度和每一層的寬度。我將會看到,即使只有一個隱藏層的網路也足夠適應訓練集。 更深層的網路通常能夠對每一層使用更少的單元數和更少的參數,並且經常容易泛化到測試集,但是通常也更難以優化。 對於一個具體的任務,理想的網路架構必須通過實驗,觀測在驗證集上的誤差來找到。
萬能近似定理(universal approximation theorem)
一個前饋神經網路如果具有線性輸出層和至少一層具有任何一種 『『擠壓』』 性質的激活函數(例如logistic sigmoid激活函數)的隱藏層,只要給予網路足夠數量的隱藏單元,它可以 以任意的精度來近似任何從一個有限維空間到另一個有限維空間的 Borel 可測函數 。前饋網路的導數也可以任意好地來近似函數的導數 (Hornik et al., 1990)。
萬能近似定理意味著無論我們試圖學習什麼函數,我們知道一個大的MLP一定能夠表示這個函數。
然而,我們不能保證訓練演算法能夠學得這個函數。即使 MLP能夠表示該函數,學習也可能因兩個不同的原因而失敗。 首先,用於訓練的優化演算法可能找不到用於期望函數的參數值。其次,訓練演算法可能由於過擬合而選擇了錯誤的函數。
總之,具有單層的前饋網路足以表示任何函數,但是網路層可能大得不可實現,並且可能無法正確地學習和泛化。在很多情況下,使用更深的模型能夠減少表示期望函數所需的單元的數量,並且可以減少泛化誤差。
存在一些函數族能夠在網路的深度大於某個值d時被高效地近似,而當深度被限制到小於或等於d時需要一個遠遠大於之前的模型。在很多情況下,淺層模型所需的隱藏單元的數量是n的指數級。
Montufar et al. (2014) 的主要定理指出, 具有 個輸入深度為 每個隱藏層具有 個單元的深度整流網路可以描述的線性區域的數量是 :
根據經驗,更深的模型似乎確實在廣泛的任務中泛化得更好。
目前為止,我們都將神經網路描述成層的簡單鏈式結構,主要的考慮因素是網路的深度和每層的寬度。在實踐中,神經網路顯示出相當的多樣性。
一般的,層不需要連接在鏈中,盡管這是最常見的做法。許多架構構建了一個主鏈,但隨後又添加了額外的架構特性,例如從層 i 到層 i + 2 或者更高層的 跳躍連接 。這些跳躍連接使得梯度更容易從輸出層流向更接近輸入的層。
架構設計考慮的另外一個關鍵點是如何將層與層之間連接起來。默認的神經網路層採用矩陣 W 描述的線性變換,每個輸入單元連接到每個輸出單元。許多專用網路具有較少的連接,使得輸入層中的每個單元僅連接到輸出層單元的一個小子集。這些用於 減少連接數量 的策略減少了參數的數量以及用於評估網路的計算量,但通常高度依賴於問題。
當我們使用前饋神經網路接收輸入 並產生輸出 時,信息通過網路向前流動。輸入 提供初始信息,然後傳播到每一層的隱藏單元,最終產生輸出 。這稱之為 前向傳播(forward propagation) 。在訓練過程中,前向傳播可以持續向前直到它產生一個標量代價函數 。 反向傳播(back propagation) 演算法 (Rumelhart et al., 1986c),經常簡稱為backprop,允許來自代價函數的信息通過網路向後流動,以便計算梯度。
將計算形式化為圖形的方法有很多。這里,我們使用圖中的每一個節點來表示一個變數。變數可以是標量、向量、矩陣、張量、或者甚至是另一類型的變數。為了形式化我們的圖形,我們還需引入操作(operation)這一概念。操作是指一個或多個變數的簡單函數。我們的圖形語言伴隨著一組被允許的操作。我們可以通過將多個操作復合在一起來描述更為復雜的函數。
如果變數 y 是變數 x 通過一個操作計算得到的,那麼我們畫一條從 x 到 y 的有向邊。我們有時用操作的名稱來注釋輸出的節點,當上下文很明確時,有時也會省略這個標注。計算圖的實例如下:
使用符號到符號的方法計算導數的示例如下。在這種方法中,反向傳播演算法不需要訪問任何實際的特定數值。相反,它將節點添加到計算圖中來描述如何計算這些導數。通用圖形求值引擎可以在隨後計算任何特定數值的導數。 本例從表示 的圖開始,運行反向傳播演算法,指導它構造表達式 對應的圖。
這部分花書上講了很多內容……我看得有些失去耐心……可能是講得太細致了吧……我對反向傳播演算法的認識很簡單,就是一個鏈式法則,一層一層計算梯度然後向後傳播。這里根據之前上課時候的課件內容做下簡單回顧:
總之反向傳播演算法的要點就是 以恰當的順序計算梯度,從而充分利用鏈式法則來提高計算效率 。我個人認為理解BP的最佳方式就是自己畫個圖手推一遍。