国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

thekingisalwaysluc / 3162人閱讀

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

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

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

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

多類別SVM損失

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

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

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

正則化?。?/strong>

這里插入講下正則化的問題

上面損失函數(shù)有一個(gè)問題。假設(shè)有一個(gè)數(shù)據(jù)集和一個(gè)權(quán)重集W能夠正確地分類每個(gè)數(shù)據(jù)(對于所有的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)來抑制大數(shù)值權(quán)重了。
需要注意的是正則化損失R(W)并不是加在每個(gè)數(shù)據(jù)的損失上,而是加在所有一組訓(xùn)練集(N個(gè)數(shù)據(jù))損失的平均值上,這樣我們得到最終的損失函數(shù)L,λ是正則化強(qiáng)度。

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

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

關(guān)于閾值Δ

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

交叉熵?fù)p失

先來了解Softmax函數(shù),這是一種壓縮函數(shù),實(shí)現(xiàn)歸一化的
$$P(s)={e^{s_k}over sum_je^{s_j}}$$
Softmax函數(shù)接收一組評分輸出s(有正有負(fù)),對每個(gè)評分sk進(jìn)行指數(shù)化確保正數(shù),分母是所有評分指數(shù)化的和,分子是某個(gè)評分指數(shù)化后的值,這樣就起到了歸一化的作用。某個(gè)類的分值越大,指數(shù)化后越大,函數(shù)輸出越接近于1,可以把輸出看做該類別的概率值,所有類別的概率值和為一。如果正確類別的概率值越接近0,則該模型越糟,應(yīng)用這個(gè)特性,我們通過對正確類別的概率值取-log來作為損失(正確類別的概率越小,損失越大),于是我們得到
$$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è)潛在的問題,我們要在計(jì)算前對得分?jǐn)?shù)據(jù)處理一下。取所有得分的最大值M = max(sk), k=1,2,3...,令所有得分都減去這個(gè)M。這不會(huì)影響損失Softmax函數(shù)的輸出,自然也不會(huì)影響損失,但這一下解決了溢出問題。要證明也很簡單:es-M = es / eM , 而分子分母會(huì)約掉 eM

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

求和項(xiàng)里一定會(huì)有一個(gè)e0=1,最終對大于1和取對數(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ù)來探究它們的區(qū)別(假設(shè)SVM損失中的Δ=1),有三組輸出分?jǐn)?shù)[10,-2,3], [10,9,9],[10,-100,-100],正確類別的得分都是10,易得三組數(shù)據(jù)的SVM損失都是0,但它們的交叉熵?fù)p失明顯是有高低之分的。對于SVM損失,它關(guān)心的是邊界區(qū)分,正確類別的得分其他得分高出Δ就完事了,損失為0了。但對于交叉熵?fù)p失,由于正確類別的概率與分?jǐn)?shù)間的差異是有關(guān)的,損失不可能等于0,正確類別的得分無窮大,其他得分無窮小,損失才趨于0。換句話說,交叉熵?fù)p失永遠(yuǎn)有縮小的空間,它希望評分模型完美;而SVM損失只需要評分模型好到一定程度就行了。

但實(shí)際使用上,它們經(jīng)常是相似的,通常說來,兩種損失函數(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)全加起來除以樣本數(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)  # 對每個(gè)樣本的指數(shù)和進(jìn)行擴(kuò)展,與scores進(jìn)行除法運(yùn)算

    return loss

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/19784.html

相關(guān)文章

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

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

    DevTalking 評論0 收藏0
  • DL-CV】線性分類器

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

    Muninn 評論0 收藏0

發(fā)表評論

0條評論

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