成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【DL-CV】損失函數(shù),SVM損失與交叉熵?fù)p失

DevTalking / 605人閱讀

摘要:需要注意的是正則化損失并不是加在每個(gè)數(shù)據(jù)的損失上,而是加在所有一組訓(xùn)練集個(gè)數(shù)據(jù)損失的平均值上,這樣我們得到最終的損失函數(shù),是正則化強(qiáng)度。這不會(huì)影響損失函數(shù)的輸出,自然也不會(huì)影響損失,但這一下解決了溢出問(wèn)題。

【DL-CV】線性分類器<前篇---后篇>【DL-CV】反向傳播,(隨機(jī))梯度下降

現(xiàn)在有一個(gè)模型,能對(duì)輸入的圖像各種可能的類別進(jìn)行評(píng)分。我們會(huì)引入損失函數(shù)Loss Function(或叫代價(jià)函數(shù) Cost Function)定量的衡量該模型(也就是權(quán)重W)的好壞,其原理是——輸出結(jié)果與真實(shí)結(jié)果之間差異越大,損失函數(shù)輸出越大,模型越糟糕(需要訓(xùn)練讓損失變?。?/p>

根據(jù)差異定義的不同,損失函數(shù)有不同的計(jì)算公式,這里介紹在圖像識(shí)別中最常用的兩個(gè)損失——多類別SVM損失(或折葉損失hinge loss)和交叉熵?fù)p失,分別對(duì)應(yīng)多類別SVM分類器和Softmax分類器
而且為了方便介紹,我們繼續(xù)以圖片評(píng)分的例子為例

多類別SVM損失

第i個(gè)數(shù)據(jù)中包含圖像xi 的像素和代表正確類別的標(biāo)簽yi(一個(gè)代表類別的數(shù)字),xi經(jīng)過(guò)模型后輸出sj (j對(duì)應(yīng)某個(gè)類別的數(shù)字,sj對(duì)應(yīng)該類別的分?jǐn)?shù)),了解這些后我們先拋出每個(gè)數(shù)據(jù)損失計(jì)算公式:

模型越好,正確類別的得分應(yīng)該要比其他錯(cuò)誤類別的得分高,至于高多少,這個(gè)閾值(Δ)由我們來(lái)定,如果高出閾值,我們認(rèn)為正確類別和某個(gè)類別的區(qū)分很好,我們給一個(gè)0損失給這兩個(gè)類別的區(qū)分。相反如果某個(gè)錯(cuò)誤類別比正確類別的得分高,說(shuō)明該模型對(duì)這兩類別的區(qū)分很糟,我們把高多少這個(gè)值加上閾值作為其損失。求正確類別和其他錯(cuò)誤類別兩兩的損失值的和作為該數(shù)據(jù)的總損失。
一個(gè)具體例子如下圖

這種損失也叫折葉損失,因其使用max(0,-)而得名,是標(biāo)準(zhǔn)常用的用法。有時(shí)候也會(huì)使用平方折葉損失SVM(L2-SVM),它使用的是max(x,-)2,這會(huì)放大損失(對(duì)壞的方面更加敏感),有些數(shù)據(jù)集使用L2-SVM會(huì)有更好的效果,可以通過(guò)交叉驗(yàn)證來(lái)決定到底使用哪個(gè)。

正則化!!

這里插入講下正則化的問(wèn)題

上面損失函數(shù)有一個(gè)問(wèn)題。假設(shè)有一個(gè)數(shù)據(jù)集和一個(gè)權(quán)重集W能夠正確地分類每個(gè)數(shù)據(jù)(對(duì)于所有的i都有Li=0)時(shí),這個(gè)W并不唯一,比如當(dāng)λ>1時(shí),任何數(shù)乘λW都能使得損失值為0,因?yàn)檫@個(gè)變化將所有分值的大小都均等地?cái)U(kuò)大了;又比如可能存在W的某一部分很大,另外一部分幾乎為0。我們并不想要一堆擴(kuò)大了N倍的W或者極不均勻的W,這時(shí)候就要向損失函數(shù)增加一個(gè)正則化懲罰(regularization penalty)R(W)來(lái)抑制大數(shù)值權(quán)重了。
需要注意的是正則化損失R(W)并不是加在每個(gè)數(shù)據(jù)的損失上,而是加在所有一組訓(xùn)練集(N個(gè)數(shù)據(jù))損失的平均值上,這樣我們得到最終的損失函數(shù)L,λ是正則化強(qiáng)度。

最常用的正則化懲罰是L2范式,L2范式通過(guò)對(duì)所有參數(shù)進(jìn)行逐元素的平方懲罰來(lái)抑制大數(shù)值的權(quán)重:

正則化很重要,正則化的作用也不止于此,更多作用后面會(huì)在介紹,在此你只要知道正則化的作用是提升分類器的泛化能力,每個(gè)損失函數(shù)都應(yīng)該引入 λR(W)

關(guān)于閾值Δ

Δ是一個(gè)超參數(shù),該超參數(shù)在絕大多數(shù)情況下設(shè)為Δ=1.0就行了。
權(quán)重W的大小對(duì)于類別分值有直接影響(當(dāng)然對(duì)他們的差異也有直接影響):當(dāng)我們將W中值縮小,類別分值之間的差異也變小,反之亦然。因此,不同類別分值之間的邊界的具體值(比如Δ=1或Δ=100)從某些角度來(lái)看是沒(méi)意義的,因?yàn)闄?quán)重自己就可以控制差異變大和縮小。也就是說(shuō),真正的權(quán)衡是我們?cè)试S權(quán)重能夠變大到何種程度(通過(guò)正則化強(qiáng)度λ來(lái)控制)。

交叉熵?fù)p失

先來(lái)了解Softmax函數(shù),這是一種壓縮函數(shù),實(shí)現(xiàn)歸一化的
$$P(s)={e^{s_k}over sum_je^{s_j}}$$
Softmax函數(shù)接收一組評(píng)分輸出s(有正有負(fù)),對(duì)每個(gè)評(píng)分sk進(jìn)行指數(shù)化確保正數(shù),分母是所有評(píng)分指數(shù)化的和,分子是某個(gè)評(píng)分指數(shù)化后的值,這樣就起到了歸一化的作用。某個(gè)類的分值越大,指數(shù)化后越大,函數(shù)輸出越接近于1,可以把輸出看做該類別的概率值,所有類別的概率值和為一。如果正確類別的概率值越接近0,則該模型越糟,應(yīng)用這個(gè)特性,我們通過(guò)對(duì)正確類別的概率值取-log來(lái)作為損失(正確類別的概率越小,損失越大),于是我們得到
$$L_i=-log({e^{s_{y_i}}over sum_je^{s_j}})$$
這就是交叉熵?fù)p失計(jì)算公式(有時(shí)也叫非正式名Softmax損失),具體例子如下圖,使用上不要忘記加正則化λR(W)哦

防止計(jì)算溢出

因?yàn)榻徊骒負(fù)p失涉及指數(shù)函數(shù),如果遇上很大或很小的分值,計(jì)算時(shí)會(huì)溢出。s很大es會(huì)上溢出;s是負(fù)數(shù)且|s|很大,es會(huì)四舍五入為0導(dǎo)致下溢出,分母為0就不好了。為解決這個(gè)潛在的問(wèn)題,我們要在計(jì)算前對(duì)得分?jǐn)?shù)據(jù)處理一下。取所有得分的最大值M = max(sk), k=1,2,3...,令所有得分都減去這個(gè)M。這不會(huì)影響損失Softmax函數(shù)的輸出,自然也不會(huì)影響損失,但這一下解決了溢出問(wèn)題。要證明也很簡(jiǎn)單:es-M = es / eM , 而分子分母會(huì)約掉 eM

但仍然存在一個(gè)問(wèn)題,如果分子發(fā)生下溢出導(dǎo)致Softmax函數(shù)輸出0,取對(duì)數(shù)時(shí)就會(huì)得到?∞,這是錯(cuò)誤的。為解決這個(gè)問(wèn)題,其實(shí)我們把上面的變換代進(jìn)去繼續(xù)算就會(huì)發(fā)現(xiàn)自己解決了

求和項(xiàng)里一定會(huì)有一個(gè)e0=1,最終對(duì)大于1和取對(duì)數(shù)不會(huì)發(fā)生溢出了,最后損失公式變成這樣:
$$L_i=-log({e^{s_{y_i}}over sum_je^{s_j}})=-log({e^{({s_{y_i}}-M)}over sum_je^{({s_j}-M)}})=log(sum_j{e^{(s_j-M)}})-(s_{y_i}-M)$$

兩者比較

我們用一組數(shù)據(jù)來(lái)探究它們的區(qū)別(假設(shè)SVM損失中的Δ=1),有三組輸出分?jǐn)?shù)[10,-2,3], [10,9,9],[10,-100,-100],正確類別的得分都是10,易得三組數(shù)據(jù)的SVM損失都是0,但它們的交叉熵?fù)p失明顯是有高低之分的。對(duì)于SVM損失,它關(guān)心的是邊界區(qū)分,正確類別的得分其他得分高出Δ就完事了,損失為0了。但對(duì)于交叉熵?fù)p失,由于正確類別的概率與分?jǐn)?shù)間的差異是有關(guān)的,損失不可能等于0,正確類別的得分無(wú)窮大,其他得分無(wú)窮小,損失才趨于0。換句話說(shuō),交叉熵?fù)p失永遠(yuǎn)有縮小的空間,它希望評(píng)分模型完美;而SVM損失只需要評(píng)分模型好到一定程度就行了。

但實(shí)際使用上,它們經(jīng)常是相似的,通常說(shuō)來(lái),兩種損失函數(shù)的表現(xiàn)差別很小,大可不必糾結(jié)使用哪個(gè)

代碼實(shí)現(xiàn)

注:以下代碼基于單層網(wǎng)絡(luò)并且不考慮激活函數(shù)(圖像數(shù)據(jù)與權(quán)重相乘得到分?jǐn)?shù))進(jìn)行損失統(tǒng)計(jì),目的是為了集中介紹損失函數(shù)的numpy實(shí)現(xiàn)。x是二維數(shù)組,是N個(gè)樣本的數(shù)據(jù),每行是該樣本的像素?cái)?shù)據(jù)(已展開),因此這里采用x*W。y是一維數(shù)組,包含每個(gè)樣本的真實(shí)類別(一個(gè)數(shù)字)。

import numpy as np
# SVM損失函數(shù)實(shí)現(xiàn)
def svm_loss_naive(W, x, y, reg):
    """
    循環(huán)實(shí)現(xiàn)
    """
    train_num = x.shape[0] # 樣本數(shù)量
    classes_num = W.shape[1]  # 類別數(shù)量
    loss = 0.0
    for i in range(train_num):  # 計(jì)算某個(gè)樣本的損失值
        scores = x[i].dot(W) 
        correct_class_score = scores[y[i]]  # 提取該樣本的真實(shí)類別分?jǐn)?shù)

        for j in range(classes_num):  # 正確類別得分與其他得分比較
            if j == y[i]:
                continue
            margin = scores[j] - correct_class_score + 1  # 這里設(shè)閾值為1
            if margin > 0:  # 造成損失,將其計(jì)入
                loss += margin
                
    loss /= train_num
    loss += reg * np.sum(W * W)  # 加上正則化損失
    return loss

def svm_loss_vectorized(W, x, y, reg):
    """
    最高效向量化運(yùn)算,維持x的二維結(jié)構(gòu)運(yùn)算
    """
    train_num = x.shape[0]
    classes_num = W.shape[1]

    scores = x.dot(W)  # 二維結(jié)構(gòu),每行是該樣本各個(gè)類別的得分
    correct_class_scores = scores[np.arange(train_num), y]  # 提取每個(gè)樣本的真實(shí)類別分?jǐn)?shù)
    correct_class_scores = np.repeat(correct_class_scores,classes_num).reshape(train_num,classes_num)  # 擴(kuò)展至二維結(jié)構(gòu)(與scores同形狀),每一行都是該樣本真實(shí)類別的得分

    margins = scores - correct_class_scores + 1.0
    margins[range(train_num), y] = 0  # 令正確類別與自身相比的loss為0 抵消 +1.0

    loss = (np.sum(margins[margins > 0])) / train_num  # 把正數(shù)(loss)全加起來(lái)除以樣本數(shù)得最終損失
    loss += reg * np.sum(W*W)  # 加上正則化損失
    return loss
import numpy as np
# Softmax 損失函數(shù)實(shí)現(xiàn)
def softmax_loss_naive(W, x, y, reg):
    """
    循環(huán)實(shí)現(xiàn)
    """
    loss = 0.0
    classes_num = W.shape[1]  # 類別數(shù)量
    train_num = x.shape[0]  # 樣本數(shù)量 
    for i in range(train_num):  # 計(jì)算某個(gè)樣本的損失值
        score = x[i].dot(W)
        score -= np.max(score)  # 減去最大值防指數(shù)運(yùn)算溢出
        correct_class_score = score[y[i]]  # 提取該樣本的真實(shí)類別分?jǐn)?shù)
        exp_sum = np.sum(np.exp(score))
        loss += np.log(exp_sum) - correct_class_score   # 每個(gè)樣本的損失疊加


    loss /= train_num
    loss += 0.5 * reg * np.sum(W*W)  # 加上正則化損失
    return loss


def softmax_loss_vectorized(W, x, y, reg):
    """
    最高效向量化運(yùn)算,維持x的二維結(jié)構(gòu)運(yùn)算
    """
    classes_num = W.shape[1]
    train_num = x.shape[1]

    scores = x.dot(W)  # 二維結(jié)構(gòu),每行是該樣本各個(gè)類別的得分
    scores -= np.repeat(np.max(scores, axis=1), classes_num).reshape(scores.shape)  # 減去最大值防指數(shù)運(yùn)算溢出
    exp_scores = np.exp(scores)  # 指數(shù)化
    correct_class_scores = scores[range(train_num), y]  # 提取每個(gè)樣本的真實(shí)類別分?jǐn)?shù)
    sum_exp_scores = np.sum(exp_scores, axis=1)  # 每個(gè)樣本的指數(shù)和

    loss = np.sum(np.log(sum_exp_scores) - correct_class_scores)  # 所有樣本總損失
    loss /= train_num
    loss += reg * np.sum(W*W)

    expand_sum_exp_scores = np.repeat(sum_exp_scores, classes_num).reshape(scores.shape)  # 對(duì)每個(gè)樣本的指數(shù)和進(jìn)行擴(kuò)展,與scores進(jìn)行除法運(yùn)算

    return loss

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42199.html

相關(guān)文章

  • DL-CV損失函數(shù),SVM損失交叉損失

    摘要:需要注意的是正則化損失并不是加在每個(gè)數(shù)據(jù)的損失上,而是加在所有一組訓(xùn)練集個(gè)數(shù)據(jù)損失的平均值上,這樣我們得到最終的損失函數(shù),是正則化強(qiáng)度。這不會(huì)影響損失函數(shù)的輸出,自然也不會(huì)影響損失,但這一下解決了溢出問(wèn)題。 【DL-CV】線性分類器【DL-CV】反向傳播,(隨機(jī))梯度下降 現(xiàn)在有一個(gè)模型,能對(duì)輸入的圖像各種可能的類別進(jìn)行評(píng)分。我們會(huì)引入損失函數(shù)Loss Function(或叫代價(jià)函數(shù) ...

    thekingisalwaysluc 評(píng)論0 收藏0
  • DL-CV】線性分類器

    摘要:每傳遞一層,就相當(dāng)于執(zhí)行一次線性分類器和激活函數(shù),其輸出可作為下一個(gè)線性分類器的輸入繼續(xù)往下傳遞。像這樣多個(gè)線性分類器疊加起來(lái),那種網(wǎng)絡(luò)結(jié)構(gòu)就成型了。 【DL-CV】計(jì)算機(jī)視覺(jué)前置了解【DL-CV】損失函數(shù),SVM損失與交叉熵?fù)p失 神經(jīng)網(wǎng)絡(luò)的變種很多,各種模型滿天飛,但是相信大家見得最多的是這種showImg(https://segmentfault.com/img/bVbeWOO?w...

    Muninn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

DevTalking

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<