真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python常用損失函數(shù)的簡(jiǎn)單介紹

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

平滑函數(shù)。

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

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

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

擴(kuò)展資料:

注意事項(xiàng):

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

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

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

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

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

????在使用pytorch深度學(xué)習(xí)框架,計(jì)算損失函數(shù)的時(shí)候經(jīng)常回到這么一個(gè)個(gè)函數(shù):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

下面是我仿真寫的一個(gè)例子:

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

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

[1]

[2]

[3]

更多自然語言處理、pytorch相關(guān)知識(shí),還請(qǐng)關(guān)注 AINLPer 公眾號(hào),極品干貨即刻送達(dá)。

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

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

BinaryCrossentropy是用來進(jìn)行二元分類交叉熵?fù)p失函數(shù)的,共有如下幾個(gè)參數(shù)

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

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

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

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

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

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

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

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

(4)損失函數(shù)

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

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

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

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

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

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

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

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

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

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

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

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

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

? ??目前訓(xùn)練ANN最有效的算法是 反向傳播算法 。簡(jiǎn)而言之,訓(xùn)練ANN就是通過反向傳播代價(jià),以減少代價(jià)為導(dǎo)向,調(diào)整參數(shù)。參數(shù)主要有:神經(jīng)元之間的連接權(quán)重w,以及每個(gè)神經(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ù)的曲線如下所示:

因?yàn)閟igmoid函數(shù)的性質(zhì),導(dǎo)致σ′(z)在z取大部分值時(shí)會(huì)很小(如下圖標(biāo)出來的兩端,幾近于平坦),這樣會(huì)使得w和b更新非常慢(因?yàn)棣?* a * σ′(z)這一項(xiàng)接近于0)。

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

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

(2)交叉熵?fù)p失函數(shù)

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

? ? 其公式為

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

? 這里

? ? 由于 ??勺C

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

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

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

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

在均方誤差計(jì)算中

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

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

(1)分類問題

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

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

? ? 2、Hinge損失

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

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

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

? ? ?4、Cross Entropy

(2)回歸問題

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

???當(dāng)預(yù)測(cè)值距離真實(shí)值越遠(yuǎn)時(shí),平方損失函數(shù)的懲罰力度越大,因此對(duì)異常點(diǎn)比較敏感。

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

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

? ? ? 3、Huber損失

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

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

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

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

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

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

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

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

? 一個(gè)輸入層,x

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

? 一個(gè)輸出層,?

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

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

下圖展示了 2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)(注意:我們?cè)谟?jì)算網(wǎng)絡(luò)層數(shù)時(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ò)

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

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

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

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

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

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

下面的順序圖展示了這個(gè)過程:

前向傳播

正如我們?cè)谏蠄D中看到的,前向傳播只是簡(jiǎn)單的計(jì)算。對(duì)于一個(gè)基本的 2 層網(wǎng)絡(luò)來說,它的輸出是這樣的:

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

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

損失函數(shù)

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

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

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

反向傳播

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

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

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

梯度下降法

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

但是我們不能直接計(jì)算損失函數(shù)對(duì)權(quán)值和偏置的導(dǎo)數(shù),因?yàn)樵趽p失函數(shù)的等式中并沒有顯式的包含他們。因此,我們需要運(yùn)用鏈?zhǔn)角髮?dǎo)發(fā)在來幫助計(jì)算導(dǎo)數(shù)。

鏈?zhǔn)椒▌t用于計(jì)算損失函數(shù)對(duì) W 和 b 的導(dǎo)數(shù)。注意,為了簡(jiǎn)單起見。我們只展示了假設(shè)網(wǎng)絡(luò)只有 1 層的偏導(dǎo)數(shù)。

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

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

為了更深入的理解微積分原理和反向傳播中的鏈?zhǔn)角髮?dǎo)法則,我強(qiáng)烈推薦 3Blue1Brown 的如下教程:

Youtube:

整合并完成一個(gè)實(shí)例

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

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

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

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

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

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

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

下一步是什么?

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

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

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

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

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

最后的想法

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

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

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

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

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

損失函數(shù)(loss function)是用來估量你模型的預(yù)測(cè)值f(x)與真實(shí)值Y的不一致程度,它是一個(gè)非負(fù)實(shí)值函數(shù),通常使用L(Y, f(x))來表示,損失函數(shù)越小,模型的魯棒性就越好。損失函數(shù)是經(jīng)驗(yàn)風(fēng)險(xiǎn)函數(shù)的核心部分,也是結(jié)構(gòu)風(fēng)險(xiǎn)函數(shù)重要組成部分。模型的結(jié)構(gòu)風(fēng)險(xiǎn)函數(shù)包括了經(jīng)驗(yàn)風(fēng)險(xiǎn)項(xiàng)和正則項(xiàng),通??梢员硎境扇缦率阶樱?/p>

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

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

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

log損失函數(shù)的標(biāo)準(zhǔn)形式:

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

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

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

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

邏輯回歸最后得到的目標(biāo)式子如下:

如果是二分類的話,則m值等于2,如果是多分類,m就是相應(yīng)的類別總個(gè)數(shù)。這里需要解釋一下:之所以有人認(rèn)為邏輯回歸是平方損失,是因?yàn)樵谑褂锰荻认陆祦砬笞顑?yōu)解的時(shí)候,它的迭代式子與平方損失求導(dǎo)后的式子非常相似,從而給人一種直觀上的錯(cuò)覺。

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

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

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

簡(jiǎn)單,計(jì)算方便;

歐氏距離是一種很好的相似性度量標(biāo)準(zhǔn);

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

平方損失(Square loss)的標(biāo)準(zhǔn)形式如下:

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

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

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

而在實(shí)際應(yīng)用中,通常會(huì)使用均方差(MSE)作為一項(xiàng)衡量指標(biāo),公式如下:

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

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

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

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

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

而指數(shù)損失函數(shù)(exp-loss)的標(biāo)準(zhǔn)形式如下

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

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

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

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

下面來對(duì)式子做個(gè)變形,令:

于是,原式就變成了:

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

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

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

Hinge 損失函數(shù)的標(biāo)準(zhǔn)形式

可以看出,當(dāng)|y|=1時(shí),L(y)=0。

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

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

0-線性核;

1-多項(xiàng)式核;

2-RBF核;

3-sigmoid核。

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

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

0-1損失函數(shù)

絕對(duì)值損失函數(shù)

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

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


當(dāng)前題目:python常用損失函數(shù)的簡(jiǎn)單介紹
標(biāo)題來源:http://weahome.cn/article/phpidi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部