優化器、啟用函式、評價函式
阿新 • • 發佈:2019-02-11
http://c.colabug.com/thread-1847614-1-1.html
一、優化器
機器學習包括兩部分內容,一部分是如何構建模型,另一部分就是如何訓練模型。訓練模型就是通過挑選最佳的優化器去訓練出最優的模型。
LSE-最小二乘法
按偏差平方和最小的原則選取擬合曲線,並且採取二項式方程為擬合曲線的方法,稱為最小二乘法。
它通過最小化誤差的平方和尋找資料的最佳函式匹配。
利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小。
GD-梯度下降演算法
參考tf.train.GradientDescentOptimizer
梯度下降(GD)是最小化風險函式、損失函式的一種常用方法,隨機梯度下降和批量梯度下降是兩種迭代求解思路。
學習率是GD中最關鍵的引數,代表了每個梯度的大小,大了會反覆振盪,小了會計算困難。
SGD-隨機梯度下降演算法
參考keras.optimizers.SGD
為了解決GD裡學習率的選擇問題,SGD用隨機的辦法來減少計算學習率的次數。
SGD伴隨的一個問題是噪音較多,使得SGD並不是每次迭代都向著整體最優化方向。
keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
引數:
lr:大於0的浮點數,學習率
momentum:大於0的浮點數,動量參,它模擬的是物體運動時的慣性,即更新的時候在一定程度上保留之前更新的方向,同時利用當前batch的梯度微調最終的更新方向。這樣一來,可以在一定程度上增加穩定性,從而學習地更快,並且還有一定擺脫區域性最優的能力,這個值在0-1之間,在訓練開始時,由於梯度可能會很大,所以初始值一般選為0.5;當梯度不那麼大時,改為0.9。
decay:大於0的浮點數,每次更新後的學習率衰減值
nesterov:布林值,確定是否使用Nesterov動量-為true時,啟用執行簡單的梯度下降步驟。
SGD通常訓練時間更長,容易陷入鞍點,但是在好的初始化和學習率排程方案的情況下,結果更可靠。
Adagrad
參考keras.optimizers.Adagrad
不建議修改keras Adagrad演算法任何引數。
會在學習的過程中自動調整 learning rate, 對於出現頻率低的引數使用較大的 learning rate, 出現頻率高的引數使用較小的 learning rate. 因此, 這種方法對於訓練資料比較稀疏的情況比較適用. AdaGrad 可以提高 SGD 的魯棒性。
Adagrad 的缺點是,在深度學習中, 這種方法導致學習率的調整太激進, 因此常常過早結束了學習過程。
RMSprop
參考keras.optimizers.RMSprop
RNN網路經常使用此演算法,在keras裡,推薦全部預設引數,除了學習率之外。
RMSProp是一個非常高效的演算法, 但是目前並沒有發表。他改進了AdaGrad演算法,也是一種自動調整學習率的演算法。
Adadelta
參考 keras.optimizers.Adadelta
不建議修改keras的預設引數。
AdaGrad 方法比較激進, 會過早結束優化過程, AdaDelta 的目的就是為了解決這個問題. 在 AdaGrad 中對 learning rate 進行 normalize 的引數是使用之前所有時間得到的梯度的累積, AdaDelta 的思想是通過設定視窗 w, 只使用部分時間的梯度累積.
Adam
參考keras.optimizers.Adam
adam演算法來自於RMSprop的改進,論文中推薦的超引數為 eps=1e-6,bata1=0.9,beta2=0.999,keras參考此設定,也不建議修改。其效果相當於SGD+Nesterov Momentum再加上bias的糾正機制。
在大部分實踐過程中,資料比較稀疏的情況下,此演算法比較通吃。
Adamax
參考keras.optimizers.Adamax
是adam的一個變種,他對學習率變化的上限提供了更簡單的範圍。
Nadam
參考keras.optimizers.Nadam
不推薦修改預設引數值。
Nadam對學習率有了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。
二、啟用函式
可以使得模型加入非線性因素的,如果不用激勵函式(其實相當於激勵函式是f(x) = x),在這種情況下你每一層輸出都是上層輸入的線性函式,很容易驗證,無論你神經網路有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機(Perceptron)了。sigmoid-邏輯迴歸函式
參考keras啟用函式activation-sigmoid。
由於函式影象很像一個“S”型,所以該函式又叫 sigmoid。廣義邏輯迴歸曲線可以模仿一些情況人口增長( P )的 S 形曲線。起初階段大致是 指數增長 ;然後隨著開始變得飽和,增加變慢;最後,達到成熟時增加停止。 函式。用於估計某種事物的可能性。可以用來回歸,也可以用來分類,主要是二分類。它不像SVM直接給出一個分類的結果,而是這個樣本屬於正類或者負類的可能性是多少,當然在多分類的系統中給出的是屬於不同類別的可能性,進而通過可能性來分類。
softmax-多元邏輯迴歸
參考tf.nn.softmax
如果不是在[0,1]中取值,而是在K個類別中取值,這時問題就變為一個多分類問題。
sigmoid函式只能分兩類,而softmax能分多類,softmax是sigmoid的擴充套件。
sigmoid將一個real value對映到(0,1)的區間(當然也可以是(-1,1)),這樣可以用來做二分類。
而softmax把一個k維的real value向量(a1,a2,a3,a4….)對映成一個(b1,b2,b3,b4….)其中bi是一個0-1的常數,然後可以根據bi的大小來進行多分類的任務,如取權重最大的一維。
tanh
tanh 網路的收斂速度要比sigmoid快。因為 tanh 的輸出均值比 sigmoid 更接近 0,可降低所需的迭代次數。
ReLU
與傳統的sigmoid啟用函式相比,ReLU能夠有效緩解梯度消失問題,從而直接以監督的方式訓練深度神經網路,無需依賴無監督的逐層預訓練,這也是2012年深度卷積神經網路在ILSVRC競賽中取得里程碑式突破的重要原因之一。
ReLU隨著訓練的推進,部分輸入會落入硬飽和區,導致對應權重無法更新。這種現象被稱為“神經元死亡”。
ReLU還經常被“詬病”的一個問題是輸出具有偏移現象,即輸出均值恆大於零。偏移現象和 神經元死亡會共同影響網路的收斂性。
PReLU是ReLU 和 LReLU的改進版本,具有非飽和性。RReLU是一種非確定性啟用函式,其引數是隨機的。這種隨機性類似於一種噪聲,能夠在一定程度上起到正則效果。
ELU
融合了sigmoid和ReLU,左側具有軟飽和性,右側無飽和性。右側線性部分使得ELU能夠緩解梯度消失,而左側軟飽能夠讓ELU對輸入變化或噪聲更魯棒。ELU的輸出均值接近於零,所以收斂速度更快。
Maxout
maxout網路能夠近似任意連續函式,且當w2,b2,…,wn,bn為0時,退化為ReLU。Maxout能夠緩解梯度消失,同時又規避了ReLU神經元死亡的缺點,但增加了引數和計算量。
softplus
softplus 是對 ReLU 的平滑逼近的解析函式形式。
softsign
類似tanh的非線性函式,很少被用到。
三、損失函式
損失函式(loss function),是指一種將一個事件(在一個樣本空間中的一個元素)對映到一個表達與其事件相關的經濟成本或機會成本的實數上的一種函式,在統計學中損失函式是一種衡量損失和錯誤(這種損失與“錯誤地”估計有關,如費用或者裝置的損失)程度的函式。loss function
用來評價訓練資料的好壞函式。
MSE = mean_squared_error 均方差:引數估計值與引數真值之差平方的期望值。最小二乘法的誤差度量辦法。而在實際應用中,通常會使用均方差(MSE)作為一項衡量指標。
對於迴歸任務,一般都提供了mse損失函式(基於樹的模型除外)。
MAE = mean_absolute_error 平均絕對誤差
MAPE = mean_absolute_percentage_error 相對百分誤差
在現實資料中,往往會存在異常點,並且模型可能對異常點擬合得並不好,因此提高評價指標的魯棒性至關重要,於是可以使用中位數來替代平均數,如MAPE。
MSLE = mean_squared_logarithmic_error 對MSE加一層對數的優化
KLD = kullback_leibler_divergence KL散度 從預測值概率分佈Q到真值概率分佈P的資訊增益,用以度量兩個分佈的差異。
cosine = cosine_proximity 即預測值與真實標籤的餘弦距離平均值的相反數。
binary_crossentropy(亦稱作對數損失,logloss) softmax作為最後一層常用的是代價函式是他。對數損失函式(logarithmicloss function) 或對數似然損失函式(log-likelihood loss function)都是他。
categorical_crossentropy:亦稱作多類的對數損失,注意使用該目標函式時,需要將標籤轉化為形如(nb_samples, nb_classes)的二值序列。
sparse_categorical_crossentrop:如上,但接受稀疏標籤。注意,使用該函式時仍然需要你的標籤與輸出值的維度相同,你可能需要在標籤資料上增加一個維度:np.expand_dims(y,-1)。