最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
python常用損失函數(shù)的簡單介紹

交叉熵損失函數(shù)是什么?

平滑函數(shù)。

托克遜網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),托克遜網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為托克遜上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的托克遜做網(wǎng)站的公司定做!

交叉熵損失函數(shù),也稱為對數(shù)損失或者logistic損失。當模型產(chǎn)生了預(yù)測值之后,將對類別的預(yù)測概率與真實值(由0或1組成)進行不比較,計算所產(chǎn)生的損失,然后基于此損失設(shè)置對數(shù)形式的懲罰項。

在神經(jīng)網(wǎng)絡(luò)中,所使用的Softmax函數(shù)是連續(xù)可導(dǎo)函數(shù),這使得可以計算出損失函數(shù)相對于神經(jīng)網(wǎng)絡(luò)中每個權(quán)重的導(dǎo)數(shù)(在《機器學(xué)習(xí)數(shù)學(xué)基礎(chǔ)》中有對此的完整推導(dǎo)過程和案例,這樣就可以相應(yīng)地調(diào)整模型的權(quán)重以最小化損失函數(shù)。

擴展資料:

注意事項:

當預(yù)測類別為二分類時,交叉熵損失函數(shù)的計算公式如下圖,其中y是真實類別(值為0或1),p是預(yù)測類別的概率(值為0~1之間的小數(shù))。

計算二分類的交叉熵損失函數(shù)的python代碼如下圖,其中esp是一個極小值,第五行代碼clip的目的是保證預(yù)測概率的值在0~1之間,輸出的損失值數(shù)組求和后,就是損失函數(shù)最后的返回值。

參考資料來源:百度百科-交叉熵

參考資料來源:百度百科-損失函數(shù)

Pytorch常用的交叉熵損失函數(shù)CrossEntropyLoss()詳解

????在使用pytorch深度學(xué)習(xí)框架,計算損失函數(shù)的時候經(jīng)?;氐竭@么一個個函數(shù):

????該損失函數(shù)結(jié)合了 和 兩個函數(shù)。它在做分類(具體幾類)訓(xùn)練的時候是非常有用的。在訓(xùn)練過程中,對于每個類分配權(quán)值,可選的參數(shù)權(quán)值應(yīng)該是一個1D張量。當你有一個不平衡的訓(xùn)練集時,這是是非常有用的。那么針對這個函數(shù),下面將做詳細的介紹。

???? 交叉熵主要是用來判定實際的輸出與期望的輸出的接近程度 ,為什么這么說呢,舉個例子:在做分類的訓(xùn)練的時候,如果一個樣本屬于第K類,那么這個類別所對應(yīng)的的輸出節(jié)點的輸出值應(yīng)該為1,而其他節(jié)點的輸出都為0,即[0,0,1,0,….0,0],這個數(shù)組也就是樣本的Label,是神經(jīng)網(wǎng)絡(luò)最期望的輸出結(jié)果。也就是說用它來衡量網(wǎng)絡(luò)的輸出與標簽的差異,利用這種差異經(jīng)過反向傳播去更新網(wǎng)絡(luò)參數(shù)。

在說交叉熵之前,先說一下 信息量 與 熵 。

???? 信息量: 它是用來衡量一個事件的不確定性的;一個事件發(fā)生的概率越大,不確定性越小,則它所攜帶的信息量就越小。假設(shè)X是一個離散型隨機變量,其取值集合為X,概率分布函數(shù)為 ,我們定義事件 的信息量為:

當 時,熵將等于0,也就是說該事件的發(fā)生不會導(dǎo)致任何信息量的增加。

???? 熵: 它是用來衡量一個系統(tǒng)的混亂程度的,代表一個系統(tǒng)中信息量的總和;信息量總和越大,表明這個系統(tǒng)不確定性就越大。

????舉個例子:假如小明和小王去打靶,那么打靶結(jié)果其實是一個0-1分布,X的取值有{0:打中,1:打不中}。在打靶之前我們知道小明和小王打中的先驗概率為10%,99.9%。根據(jù)上面的信息量的介紹,我們可以分別得到小明和小王打靶打中的信息量。但是如果我們想進一步度量小明打靶結(jié)果的不確定度,這就需要用到熵的概念了。那么如何度量呢,那就要采用 期望 了。我們對所有可能事件所帶來的信息量求期望,其結(jié)果就能衡量小明打靶的不確定度:

與之對應(yīng)的,小王的熵(打靶的不確定度)為: ????雖然小明打靶結(jié)果的不確定度較低,畢竟十次有9次都脫靶;但是小王打靶結(jié)果的不確定度更低,1000次射擊只有1次脫靶,結(jié)果相當?shù)拇_定。

???? 交叉熵: 它主要刻畫的是實際輸出(概率)與期望輸出(概率)的距離,也就是交叉熵的值越小,兩個概率分布就越接近。假設(shè)概率分布p為期望輸出,概率分布q為實際輸出, 為交叉熵,則 ????那么該公式如何表示,舉個例子,假設(shè)N=3,期望輸出為 ,實際輸出 , ,那么: 通過上面可以看出,q2與p更為接近,它的交叉熵也更小。

????Pytorch中計算的交叉熵并不是采用 這種方式計算得到的,而是交叉熵的另外一種方式計算得到的: 它是交叉熵的另外一種方式。

????Pytorch中CrossEntropyLoss()函數(shù)的主要是將softmax-log-NLLLoss合并到一塊得到的結(jié)果。

????1、Softmax后的數(shù)值都在0~1之間,所以ln之后值域是負無窮到0。

????2、然后將Softmax之后的結(jié)果取log,將乘法改成加法減少計算量,同時保障函數(shù)的單調(diào)性

????3、NLLLoss的結(jié)果就是把上面的輸出與Label對應(yīng)的那個值拿出來(下面例子中就是:將log_output\logsoftmax_output中與y_target對應(yīng)的值拿出來),去掉負號,再求均值。

下面是我仿真寫的一個例子:

最計算得到的結(jié)果為:

????通過上面的結(jié)果可以看出,直接使用pytorch中的loss_func=nn.CrossEntropyLoss()計算得到的結(jié)果與softmax-log-NLLLoss計算得到的結(jié)果是一致的。

[1]

[2]

[3]

更多自然語言處理、pytorch相關(guān)知識,還請關(guān)注 AINLPer 公眾號,極品干貨即刻送達。

tf.keras之損失函數(shù)

tf.keras里面有許多內(nèi)置的損失函數(shù)可以使用,由于種類眾多,以幾個常用的為例:

BinaryCrossentropy是用來進行二元分類交叉熵損失函數(shù)的,共有如下幾個參數(shù)

如果輸入的from_logits是true,那么首先就要經(jīng)過激活函數(shù)的處理。那對于一個[batch_size,num_class]的logits,進行sigmoid激活就是對將tensor中的每個元素x轉(zhuǎn)為sigmoid(x).構(gòu)成矩陣P, 代表的就是樣本i屬于標簽j概率,即:

然后在這個基礎(chǔ)上計算二分類的交叉熵,這里的二分類交叉熵是tensor中的每個元素都獨立的,所以會有[batch_size,num_class]個loss,以下 表示真實的標簽

然后在axis=-1維度做了reduce_mean操作,變成了[batch_size]維度的loss,最后再經(jīng)過reduction里面指定的處理方法,再對batch求一次平均值。另外,這個方法如果在from_logits=True的情況下,可以用tf.nn.sigmoid_cross_entropy_with_logits來代替,閱讀源碼,在tf.keras里面就是調(diào)的這個函數(shù),sigmoid_cross_entropy_with_logits返回的是[batch_size]個loss,最后我們再接一個reduce_mean就可以變成標量了。

CategoricalCrossentropy是用來處理多分類的,同樣有以上這幾個參數(shù)。但是激活函數(shù)不一樣,使用的是softmax激活函數(shù),softmax的過程如下

經(jīng)過激活函數(shù)之后,每一行的元素代表了這個樣本屬于各類別的概率,并且概率和為1,即[batch_size,num_class]里面的每一行的和為1,然后進行交叉熵計算,這里和binary_cross_entropy不同,這里中間計算出來的loss的shape只有[batch_size]了。多分類是二分類的擴展,二分類可以看成兩個互斥的標簽,而多分類則是多個互斥的標簽

SparseCategoricalCrossentropy損失函數(shù)同CategoricalCrossentropy類似,只是輸入不一樣,該損失函數(shù)的輸入的y_true是[batch_size]個標簽,每個元素是label對應(yīng)的index,沒有經(jīng)過one-hot編碼,這個方法如果在from_logits=True的情況下,和tf.nn.sparse_sigmoid_cross_entropy_with_logits再接一個reduce_mean是類似的效果。

MeanSquaredError損失函數(shù)(均方差)一般用來解決回歸問題,參數(shù)只有兩個,默認即可。

均方差就是y_pred語y_true對應(yīng)元素的差的平方,然后求和在求平均

(4)損失函數(shù)

損失函數(shù)用來表示輸出與實際值的差距。常用的損失函數(shù)為0-1損失函數(shù)、平方損失函數(shù)、絕對損失函數(shù)、對數(shù)損失函數(shù)、交叉熵損失函數(shù)。

損失函數(shù)計算得到的損失又叫期望損失。學(xué)習(xí)的目標就是選擇期望風(fēng)險最小的模型。

期望風(fēng)險 = 經(jīng)驗風(fēng)險+結(jié)構(gòu)風(fēng)險

期望風(fēng)險是模型關(guān)于聯(lián)合概率分布的期望損失;經(jīng)驗風(fēng)險是模型關(guān)于訓(xùn)練樣本集的損失,結(jié)構(gòu)風(fēng)險時在經(jīng)驗風(fēng)險的基礎(chǔ)上加上正則化。

根據(jù)大數(shù)定理,當N趨近于無窮時,經(jīng)驗風(fēng)險時趨近于期望風(fēng)險的。

當樣本數(shù)量足夠大時,經(jīng)驗風(fēng)險最小化能保證很好的學(xué)習(xí)效果。極大似然估計就是經(jīng)驗風(fēng)險最小化的例子。

ANN的設(shè)計目的之一是為了使機器可以像人一樣學(xué)習(xí)知識。人在學(xué)習(xí)分析新事物時,當發(fā)現(xiàn)自己犯的錯誤越大時,改正的力度就越大。比如投籃:當運動員發(fā)現(xiàn)自己的投籃方向離正確方向越遠,那么他調(diào)整的投籃角度就應(yīng)該越大,籃球就更容易投進籃筐。同理, 我們希望:ANN在訓(xùn)練時,如果預(yù)測值與實際值的誤差越大,那么在 反向傳播訓(xùn)練 的過程中,各種參數(shù)調(diào)整的幅度就要更大,從而使訓(xùn)練更快收斂。

(1)均方差損失函數(shù)

???然而,如果使用二次代價函數(shù)訓(xùn)練ANN,看到的實際效果是,如果誤差越大,參數(shù)調(diào)整的幅度可能更小,訓(xùn)練更緩慢。

? ??以一個神經(jīng)元的二類分類訓(xùn)練為例,進行兩次實驗(ANN常用的激活函數(shù)為sigmoid函數(shù),該實驗也采用該函數(shù)):輸入一個相同的樣本數(shù)據(jù)x=1.0(該樣本對應(yīng)的實際分類y=0);兩次實驗各自隨機初始化參數(shù),從而在各自的第一次前向傳播后得到不同的輸出值,形成不同的代價(誤差):

在實驗1中,隨機初始化參數(shù),使得第一次輸出值為0.82(該樣本對應(yīng)的實際值為0);經(jīng)過300次迭代訓(xùn)練后,輸出值由0.82降到0.09,逼近實際值。而在實驗2中,第一次輸出值為0.98,同樣經(jīng)過300迭代訓(xùn)練,輸出值只降到了0.20。

? ??從兩次實驗的代價曲線中可以看出: 實驗1的代價隨著訓(xùn)練次數(shù)增加而快速降低,但實驗2的代價在一開始下降得非常緩慢;直觀上看,初始的誤差越大,收斂得越緩慢 。、

? ? ?其實,誤差大導(dǎo)致訓(xùn)練緩慢的原因在于使用了二次代價函數(shù)。二次代價函數(shù)的公式如下: 其中,C表示代價,x表示樣本,y表示實際值,a表示輸出值,n表示樣本的總數(shù)。為簡單起見,同樣一個樣本為例進行說明,此時二次代價函數(shù)為: ,a為神經(jīng)元的實際輸出【 a=σ(z), where z=wx+b 】。

? ??目前訓(xùn)練ANN最有效的算法是 反向傳播算法 。簡而言之,訓(xùn)練ANN就是通過反向傳播代價,以減少代價為導(dǎo)向,調(diào)整參數(shù)。參數(shù)主要有:神經(jīng)元之間的連接權(quán)重w,以及每個神經(jīng)元本身的偏置b。調(diào)參的方式是采用梯度下降算法(Gradient descent),沿著梯度方向調(diào)整參數(shù)大小。w和b的梯度推導(dǎo)w為

其中,z表示神經(jīng)元的輸入, 表示激活函數(shù)。從以上公式可以看出,w和b的梯度跟激活函數(shù)的梯度成正比,激活函數(shù)的梯度越大,w和b的大小調(diào)整得越快,訓(xùn)練收斂得就越快。而神經(jīng)網(wǎng)絡(luò)常用的激活函數(shù)為sigmoid函數(shù),該函數(shù)的曲線如下所示:

因為sigmoid函數(shù)的性質(zhì),導(dǎo)致σ′(z)在z取大部分值時會很?。ㄈ缦聢D標出來的兩端,幾近于平坦),這樣會使得w和b更新非常慢(因為η * a * σ′(z)這一項接近于0)。

? ??如圖所示, 實驗2的初始輸出值(0.98)對應(yīng)的梯度明顯小于實驗1的輸出值(0.82),因此實驗2的參數(shù)梯度下降得比實驗1慢。這就是初始的代價(誤差)越大,導(dǎo)致訓(xùn)練越慢的原因。 與我們的期望不符,即:不能像人一樣,錯誤越大,改正的幅度越大,從而學(xué)習(xí)得越快。

? ??可能有人會說,那就選擇一個梯度不變化或變化不明顯的激活函數(shù)不就解決問題了嗎?那樣雖然簡單粗暴地解決了這個問題,但可能會引起其他更多更麻煩的問題。而且,類似sigmoid這樣的函數(shù)(比如tanh函數(shù))有很多優(yōu)點,非常適合用來做激活函數(shù)。

(2)交叉熵損失函數(shù)

? ? 交叉熵損失函數(shù)可以認為是真實輸出與預(yù)測輸出等結(jié)果分布等距離。其損失函數(shù)與softmax損失函數(shù)的區(qū)別在于一個標簽是否是one-hot。與二次代價函數(shù)相比,它能更有效地促進ANN的訓(xùn)練。

? ? 其公式為

其中,x表示樣本,n表示樣本的總數(shù)。那么,重新計算參數(shù)w的梯度:

? 這里

? ? 由于 ??勺C

w的梯度公式中原來的 被消掉了, 表示輸出值與實際值之間的誤差。所以,當誤差越大,梯度就越大,參數(shù)w調(diào)整得越快,訓(xùn)練速度也就越快。

???同理可得,b的梯度表示 。實際情況證明,交叉熵代價函數(shù)帶來的訓(xùn)練效果往往比二次代價函數(shù)要好。

那么交叉熵損失函數(shù)是如何提出的呢?

? ??????以偏置b的梯度計算為例,推導(dǎo)出交叉熵代價函數(shù):

在均方誤差計算中

? ? ? 可以得到 ;想要消除 ,即得到 ;等式兩邊求積分得到

二、損失函數(shù)的分類

(1)分類問題

? ? 1、0-1損失函數(shù)

? ? ? ? ? ? 0-1損失函數(shù)表示當預(yù)測不正確的時候取值為1,否則取值為0。該損失函數(shù)能夠直觀的刻畫分類的錯誤率,但是由于其非凸、非光滑的特點,使得算法很難直接對該函數(shù)進行優(yōu)化。

? ? 2、Hinge損失

???Hinge損失函數(shù)是0-1損失函數(shù)相對緊的凸上界,且當預(yù)測小于1的時候,該函數(shù)不對其做任何處罰。由于Hinge損失在f.y=1處不可導(dǎo),因此不能使用梯度下降算法優(yōu)化,而是使用次梯度下降法。

? ? 3、Logistic損失函數(shù)

???Logistic損失函數(shù)也是0-1損失函數(shù)的凸上界,且該函數(shù)處處光滑,因此可以使用梯度下降法進行優(yōu)化。但是,該函數(shù)對所有樣本點都做懲罰,因此 對異常點更為敏感 。

? ? ?4、Cross Entropy

(2)回歸問題

? ? ? 1、均方差損失函數(shù)

???當預(yù)測值距離真實值越遠時,平方損失函數(shù)的懲罰力度越大,因此對異常點比較敏感。

? ? ? 2、絕對值損失函數(shù)

???絕對損失函數(shù)對異常點更魯棒。但是,絕對損失函數(shù)在f=y處無法求導(dǎo)。

? ? ? 3、Huber損失

???Huber損失函數(shù)在|f-y|較小時為平方損失,在|f-y|較大的時采用線性損失,處處可導(dǎo),且對異常點魯棒。

從零開始用Python構(gòu)建神經(jīng)網(wǎng)絡(luò)

從零開始用Python構(gòu)建神經(jīng)網(wǎng)絡(luò)

動機:為了更加深入的理解深度學(xué)習(xí),我們將使用 python 語言從頭搭建一個神經(jīng)網(wǎng)絡(luò),而不是使用像 Tensorflow 那樣的封裝好的框架。我認為理解神經(jīng)網(wǎng)絡(luò)的內(nèi)部工作原理,對數(shù)據(jù)科學(xué)家來說至關(guān)重要。

這篇文章的內(nèi)容是我的所學(xué),希望也能對你有所幫助。

神經(jīng)網(wǎng)絡(luò)是什么?

介紹神經(jīng)網(wǎng)絡(luò)的文章大多數(shù)都會將它和大腦進行類比。如果你沒有深入研究過大腦與神經(jīng)網(wǎng)絡(luò)的類比,那么將神經(jīng)網(wǎng)絡(luò)解釋為一種將給定輸入映射為期望輸出的數(shù)學(xué)關(guān)系會更容易理解。

神經(jīng)網(wǎng)絡(luò)包括以下組成部分

? 一個輸入層,x

? 任意數(shù)量的隱藏層

? 一個輸出層,?

? 每層之間有一組權(quán)值和偏置,W and b

? 為隱藏層選擇一種激活函數(shù),σ。在教程中我們使用 Sigmoid 激活函數(shù)

下圖展示了 2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)(注意:我們在計算網(wǎng)絡(luò)層數(shù)時通常排除輸入層)

2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)

用 Python 可以很容易的構(gòu)建神經(jīng)網(wǎng)絡(luò)類

訓(xùn)練神經(jīng)網(wǎng)絡(luò)

這個網(wǎng)絡(luò)的輸出 ? 為:

你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數(shù)。

因此 W 和 b 的值影響預(yù)測的準確率. 所以根據(jù)輸入數(shù)據(jù)對 W 和 b 調(diào)優(yōu)的過程就被成為訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

每步訓(xùn)練迭代包含以下兩個部分:

? 計算預(yù)測結(jié)果 ?,這一步稱為前向傳播

? 更新 W 和 b,,這一步成為反向傳播

下面的順序圖展示了這個過程:

前向傳播

正如我們在上圖中看到的,前向傳播只是簡單的計算。對于一個基本的 2 層網(wǎng)絡(luò)來說,它的輸出是這樣的:

我們在 NeuralNetwork 類中增加一個計算前向傳播的函數(shù)。為了簡單起見我們假設(shè)偏置 b 為0:

但是我們還需要一個方法來評估預(yù)測結(jié)果的好壞(即預(yù)測值和真實值的誤差)。這就要用到損失函數(shù)。

損失函數(shù)

常用的損失函數(shù)有很多種,根據(jù)模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數(shù)。

誤差平方和是求每個預(yù)測值和真實值之間的誤差再求和,這個誤差是他們的差值求平方以便我們觀察誤差的絕對值。

訓(xùn)練的目標是找到一組 W 和 b,使得損失函數(shù)最好小,也即預(yù)測值和真實值之間的距離最小。

反向傳播

我們已經(jīng)度量出了預(yù)測的誤差(損失),現(xiàn)在需要找到一種方法來傳播誤差,并以此更新權(quán)值和偏置。

為了知道如何適當?shù)恼{(diào)整權(quán)值和偏置,我們需要知道損失函數(shù)對權(quán)值 W 和偏置 b 的導(dǎo)數(shù)。

回想微積分中的概念,函數(shù)的導(dǎo)數(shù)就是函數(shù)的斜率。

梯度下降法

如果我們已經(jīng)求出了導(dǎo)數(shù),我們就可以通過增加或減少導(dǎo)數(shù)值來更新權(quán)值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。

但是我們不能直接計算損失函數(shù)對權(quán)值和偏置的導(dǎo)數(shù),因為在損失函數(shù)的等式中并沒有顯式的包含他們。因此,我們需要運用鏈式求導(dǎo)發(fā)在來幫助計算導(dǎo)數(shù)。

鏈式法則用于計算損失函數(shù)對 W 和 b 的導(dǎo)數(shù)。注意,為了簡單起見。我們只展示了假設(shè)網(wǎng)絡(luò)只有 1 層的偏導(dǎo)數(shù)。

這雖然很簡陋,但是我們依然能得到想要的結(jié)果—損失函數(shù)對權(quán)值 W 的導(dǎo)數(shù)(斜率),因此我們可以相應(yīng)的調(diào)整權(quán)值。

現(xiàn)在我們將反向傳播算法的函數(shù)添加到 Python 代碼中

為了更深入的理解微積分原理和反向傳播中的鏈式求導(dǎo)法則,我強烈推薦 3Blue1Brown 的如下教程:

Youtube:

整合并完成一個實例

既然我們已經(jīng)有了包括前向傳播和反向傳播的完整 Python 代碼,那么就將其應(yīng)用到一個例子上看看它是如何工作的吧。

神經(jīng)網(wǎng)絡(luò)可以通過學(xué)習(xí)得到函數(shù)的權(quán)重。而我們僅靠觀察是不太可能得到函數(shù)的權(quán)重的。

讓我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)進行 1500 次迭代,看看會發(fā)生什么。 注意觀察下面每次迭代的損失函數(shù),我們可以清楚地看到損失函數(shù)單調(diào)遞減到最小值。這與我們之前介紹的梯度下降法一致。

讓我們看看經(jīng)過 1500 次迭代后的神經(jīng)網(wǎng)絡(luò)的最終預(yù)測結(jié)果:

經(jīng)過 1500 次迭代訓(xùn)練后的預(yù)測結(jié)果

我們成功了!我們應(yīng)用前向和方向傳播算法成功的訓(xùn)練了神經(jīng)網(wǎng)絡(luò)并且預(yù)測結(jié)果收斂于真實值。

注意預(yù)測值和真實值之間存在細微的誤差是允許的。這樣可以防止模型過擬合并且使得神經(jīng)網(wǎng)絡(luò)對于未知數(shù)據(jù)有著更強的泛化能力。

下一步是什么?

幸運的是我們的學(xué)習(xí)之旅還沒有結(jié)束,仍然有很多關(guān)于神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的內(nèi)容需要學(xué)習(xí)。例如:

? 除了 Sigmoid 以外,還可以用哪些激活函數(shù)

? 在訓(xùn)練網(wǎng)絡(luò)的時候應(yīng)用學(xué)習(xí)率

? 在面對圖像分類任務(wù)的時候使用卷積神經(jīng)網(wǎng)絡(luò)

我很快會寫更多關(guān)于這個主題的內(nèi)容,敬請期待!

最后的想法

我自己也從零開始寫了很多神經(jīng)網(wǎng)絡(luò)的代碼

雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學(xué)習(xí)框架方便的搭建深層網(wǎng)絡(luò)而不需要完全理解其內(nèi)部工作原理。但是我覺得對于有追求的數(shù)據(jù)科學(xué)家來說,理解內(nèi)部原理是非常有益的。

這種練習(xí)對我自己來說已成成為重要的時間投入,希望也能對你有所幫助

機器學(xué)習(xí)中的損失函數(shù)

機器學(xué)習(xí)中的損失函數(shù)

損失函數(shù)(loss function)是用來估量你模型的預(yù)測值f(x)與真實值Y的不一致程度,它是一個非負實值函數(shù),通常使用L(Y, f(x))來表示,損失函數(shù)越小,模型的魯棒性就越好。損失函數(shù)是經(jīng)驗風(fēng)險函數(shù)的核心部分,也是結(jié)構(gòu)風(fēng)險函數(shù)重要組成部分。模型的結(jié)構(gòu)風(fēng)險函數(shù)包括了經(jīng)驗風(fēng)險項和正則項,通常可以表示成如下式子:

其中,前面的均值函數(shù)表示的是經(jīng)驗風(fēng)險函數(shù),L代表的是損失函數(shù),后面的是正則化項(regularizer)或者叫懲罰項(penalty term),它可以是L1,也可以是L2,或者其他的正則函數(shù)。整個式子表示的意思是找到使目標函數(shù)最小時的值。下面主要列出幾種常見的損失函數(shù)。

一、log對數(shù)損失函數(shù)(邏輯回歸)

有些人可能覺得邏輯回歸的損失函數(shù)就是平方損失,其實并不是。平方損失函數(shù)可以通過線性回歸在假設(shè)樣本是高斯分布的條件下推導(dǎo)得到,而邏輯回歸得到的并不是平方損失。在邏輯回歸的推導(dǎo)中,它假設(shè)樣本服從伯努利分布(0-1分布),然后求得滿足該分布的似然函數(shù),接著取對數(shù)求極值等等。而邏輯回歸并沒有求似然函數(shù)的極值,而是把極大化當做是一種思想,進而推導(dǎo)出它的經(jīng)驗風(fēng)險函數(shù)為:最小化負的似然函數(shù)(即max F(y, f(x)) —- min -F(y, f(x)))。從損失函數(shù)的視角來看,它就成了log損失函數(shù)了。

log損失函數(shù)的標準形式:

L(Y,P(Y|X))=?logP(Y|X)L(Y,P(Y|X))=?log?P(Y|X)剛剛說到,取對數(shù)是為了方便計算極大似然估計,因為在MLE中,直接求導(dǎo)比較困難,所以通常都是先取對數(shù)再求導(dǎo)找極值點。損失函數(shù)L(Y, P(Y|X))表達的是樣本X在分類Y的情況下,使概率P(Y|X)達到最大值(換言之,就是利用已知的樣本分布,找到最有可能(即最大概率)導(dǎo)致這種分布的參數(shù)值;或者說什么樣的參數(shù)才能使我們觀測到目前這組數(shù)據(jù)的概率最大)。因為log函數(shù)是單調(diào)遞增的,所以logP(Y|X)也會達到最大值,因此在前面加上負號之后,最大化P(Y|X)就等價于最小化L了。

邏輯回歸的P(Y=y|x)表達式如下:P(Y=y|x)=11+exp(?yf(x))P(Y=y|x)=11+exp(?yf(x))

將它帶入到上式,通過推導(dǎo)可以得到logistic的損失函數(shù)表達式,如下:

L(y,P(Y=y|x))=log(1+exp(?yf(x)))L(y,P(Y=y|x))=log?(1+exp(?yf(x)))

邏輯回歸最后得到的目標式子如下:

如果是二分類的話,則m值等于2,如果是多分類,m就是相應(yīng)的類別總個數(shù)。這里需要解釋一下:之所以有人認為邏輯回歸是平方損失,是因為在使用梯度下降來求最優(yōu)解的時候,它的迭代式子與平方損失求導(dǎo)后的式子非常相似,從而給人一種直觀上的錯覺。

這里有個PDF可以參考一下:Lecture 6: logistic regression.pdf.

二、平方損失函數(shù)(最小二乘法, Ordinary Least Squares )

最小二乘法是線性回歸的一種,OLS將問題轉(zhuǎn)化成了一個凸優(yōu)化問題。在線性回歸中,它假設(shè)樣本和噪聲都服從高斯分布(為什么假設(shè)成高斯分布呢?其實這里隱藏了一個小知識點,就是中心極限定理,可以參考【central limit theorem】),最后通過極大似然估計(MLE)可以推導(dǎo)出最小二乘式子。最小二乘的基本原則是:最優(yōu)擬合直線應(yīng)該是使各點到回歸直線的距離和最小的直線,即平方和最小。換言之,OLS是基于距離的,而這個距離就是我們用的最多的歐幾里得距離。為什么它會選擇使用歐式距離作為誤差度量呢(即Mean squared error, MSE),主要有以下幾個原因:

簡單,計算方便;

歐氏距離是一種很好的相似性度量標準;

在不同的表示域變換后特征性質(zhì)不變。

平方損失(Square loss)的標準形式如下:

(Y,f(X))=(Y?f(X))2L(Y,f(X))=(Y?f(X))2

當樣本個數(shù)為n時,此時的損失函數(shù)變?yōu)椋?/p>

Y-f(X)表示的是殘差,整個式子表示的是殘差的平方和,而我們的目的就是最小化這個目標函數(shù)值(注:該式子未加入正則項),也就是最小化殘差的平方和(residual sum of squares,RSS)。

而在實際應(yīng)用中,通常會使用均方差(MSE)作為一項衡量指標,公式如下:

MSE=1n∑i=1n(Yi~?Yi)2MSE=1n∑i=1n(Yi~?Yi)2

上面提到了線性回歸,這里額外補充一句,我們通常說的線性有兩種情況,一種是因變量y是自變量x的線性函數(shù),一種是因變量y是參數(shù)的線性函數(shù)。在機器學(xué)習(xí)中,通常指的都是后一種情況。

三、指數(shù)損失函數(shù)(Adaboost)

學(xué)過Adaboost算法的人都知道,它是前向分步加法算法的特例,是一個加和模型,損失函數(shù)就是指數(shù)函數(shù)。在Adaboost中,經(jīng)過m此迭代之后,可以得到:

Adaboost每次迭代時的目的是為了找到最小化下列式子時的參數(shù) 和G:

而指數(shù)損失函數(shù)(exp-loss)的標準形式如下

可以看出,Adaboost的目標式子就是指數(shù)損失,在給定n個樣本的情況下,Adaboost的損失函數(shù)為:

關(guān)于Adaboost的推導(dǎo),可以參考Wikipedia:AdaBoost或者《統(tǒng)計學(xué)習(xí)方法》P145.

四、Hinge損失函數(shù)(SVM)

在機器學(xué)習(xí)算法中,hinge損失函數(shù)和SVM是息息相關(guān)的。在線性支持向量機中,最優(yōu)化問題可以等價于下列式子:

下面來對式子做個變形,令:

于是,原式就變成了:

如若取,式子就可以表示成:

可以看出,該式子與下式非常相似:

前半部分中的就是hinge損失函數(shù),而后面相當于L2正則項。

Hinge 損失函數(shù)的標準形式

可以看出,當|y|=1時,L(y)=0。

更多內(nèi)容,參考Hinge-loss。

補充一下:在libsvm中一共有4中核函數(shù)可以選擇,對應(yīng)的是-t參數(shù)分別是:

0-線性核;

1-多項式核;

2-RBF核;

3-sigmoid核。

五、其它損失函數(shù)

除了以上這幾種損失函數(shù),常用的還有:

0-1損失函數(shù)

絕對值損失函數(shù)

下面來看看幾種損失函數(shù)的可視化圖像,對著圖看看橫坐標,看看縱坐標,再看看每條線都表示什么損失函數(shù),多看幾次好好消化消化。

OK,暫時先寫到這里,休息下。最后,需要記住的是:參數(shù)越多,模型越復(fù)雜,而越復(fù)雜的模型越容易過擬合。過擬合就是說模型在訓(xùn)練數(shù)據(jù)上的效果遠遠好于在測試集上的性能。此時可以考慮正則化,通過設(shè)置正則項前面的hyper parameter,來權(quán)衡損失函數(shù)和正則項,減小參數(shù)規(guī)模,達到模型簡化的目的,從而使模型具有更好的泛化能力。


文章題目:python常用損失函數(shù)的簡單介紹
網(wǎng)站地址:http://fisionsoft.com.cn/article/phpidi.html