這是我參與8月更文挑戰的第2天,活動詳情查看:8月更文挑戰算法
常見的損失函數:0-1損失函數,絕對值損失函數,log對數損失函數,平方損失函數,指數損失函數,hinge損失函數,交叉熵損失函數等。編程
0-1損失函數數組
絕對值損失函數markdown
log對數損失函數網絡
平方損失函數dom
指數損失函數函數
hinge損失函數oop
交叉熵損失函數post
常見的激活函數有:Sigmoid、Tanh、ReLU、Leaky ReLU學習
Sigmoid函數:
特色:
它可以把輸入的連續實值變換爲0和1之間的輸出,特別的,若是是很是大的負數,那麼輸出就是0;若是是很是大的正數,輸出就是1。
缺點:
缺點1:在深度神經網絡中梯度反向傳遞時致使梯度消失,其中梯度爆炸發生的機率很是小,而梯度消失發生的機率比較大。
缺點2:Sigmoid 的 output不是0均值(即zero-centered)。
缺點3:其解析式中含有冪運算,計算機求解時相對來說比較耗時。對於規模比較大的深度網絡,這會較大地增長訓練時間。
Tanh函數:
特色:它解決了Sigmoid函數的不是zero-centered輸出問題,收斂速度比sigmoid要快,然而,梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。
ReLU函數:
特色:
1.ReLu函數是利用閾值來進行因變量的輸出,所以其計算複雜度會比剩下兩個函數低(後兩個函數都是進行指數運算)
2.ReLu函數的非飽和性能夠有效地解決梯度消失的問題,提供相對寬的激活邊界。
3.ReLU的單側抑制提供了網絡的稀疏表達能力。
ReLU的侷限性:在於其訓練過程當中會致使神經元死亡的問題。
這是因爲函數f(x)=max(0,x)致使負梯度在通過該ReLU單元時被置爲0,且在以後也不被任何數據激活,即流經該神經元的梯度永遠爲0,不對任何數據產生響應。在實際訓練中,若是學習率(Learning Rate)設置較大,會致使超過必定比例的神經元不可逆死亡,進而參數梯度沒法更新,整個訓練過程失敗。
Leaky ReLu函數:
LReLU與ReLU的區別在於, 當z<0時其值不爲0,而是一個斜率爲a的線性函數,通常a爲一個很小的正常數, 這樣既實現了單側抑制,又保留了部分負梯度信息以至不徹底丟失。但另外一方面,a值的選擇增長了問題難度,須要較強的人工先驗或屢次重複訓練以肯定合適的參數值。
基於此,參數化的PReLU(Parametric ReLU)應運而生。它與LReLU的主要區別是將負軸部分斜率a做爲網絡中一個可學習的參數,進行反向傳播訓練,與其餘含參數網絡層聯合優化。而另外一個LReLU的變種增長了「隨機化」機制,具體地,在訓練過程當中,斜率a做爲一個知足某種分佈的隨機採樣;測試時再固定下來。Random ReLU(RReLU)在必定程度上能起到正則化的做用。
ELU函數:
ELU函數是針對ReLU函數的一個改進型,相比於ReLU函數,在輸入爲負數的狀況下,是有必定的輸出的,並且這部分輸出還具備必定的抗干擾能力。這樣能夠消除ReLU死掉的問題,不過仍是有梯度飽和和指數運算的問題。
LR的基本表達形式以下:
使用交叉熵做爲損失函數的梯度降低更新求導的結果以下:
首先獲得損失函數以下:
若是咱們使用MSE做爲損失函數的話,那損失函數以及求導的結果以下所示:
使用平方損失函數,會發現梯度更新的速度和sigmod函數自己的梯度是很相關的。sigmod函數在它在定義域內的梯度都不大於0.25。這樣訓練會很是的慢。使用交叉熵的話就不會出現這樣的狀況,它的導數就是一個差值,偏差大的話更新的就快,偏差小的話就更新的慢點,這正是咱們想要的。
在使用 Sigmoid 函數做爲正樣本的機率時,同時將平方損失做爲損失函數,這時所構造出來的損失函數是非凸的,不容易求解,容易獲得其局部最優解。若是使用極大似然,其目標函數就是對數似然函數,該損失函數是關於未知參數的高階連續可導的凸函數,便於求其全局最優解。(關因而否是凸函數,由凸函數的定義得,對於一元函數,其二階導數老是非負,對於多元函數,其Hessian矩陣(Hessian矩陣是由多元函數的二階導數組成的方陣)的正定性來判斷。若是Hessian矩陣是半正定矩陣)
要計算F1score,首先要計算 Precision 和 Recall,公式以下:
FM和SVM最大的不一樣,在於特徵組合時權重的計算方法
FM模型有兩個優點:
在高度稀疏的狀況下特徵之間的交叉仍然可以估計,並且能夠泛化到未被觀察的交叉參數的學習和模型的預測的時間複雜度是線性的
隨機森林的隨機性體如今每顆樹的訓練樣本是隨機的,樹中每一個節點的分裂屬性集合也是隨機選擇肯定的。有了這2個隨機的保證,隨機森林就不會產生過擬合的現象了。
思路:貪心算法
依次遍歷數組中的每個位置,並實時維護最遠能夠到達的位置 rightMost,注意當前遍歷到的位置 i 要在最遠能夠到達的位置範圍內(也就是知足 i <= rightMost),當rightMost 大於或等於 數組最後一個位置時,就表示能夠到達,返回 True,不然就要返回 False。
代碼以下:
class Solution:
def canJump(self, nums: List[int]) -> bool:
n = len(nums)
rightMost = 0
for i in range(n):
if i <= rightMost:
rightMost = max(rightMost, i + nums[i])
if rightMost >= n-1:
return True
return False
複製代碼
時間複雜度:O(n),其中 n 爲數組的大小。只須要訪問 nums 數組一遍,共 n 個位置。
空間複雜度:O(1),不須要額外的空間開銷。