2.1、Softmax Regression模型


Softmax Regression模型

  由於Logistics Regression算法復雜度低,容易實現等特點,在工業中的到廣泛的使用,但是Logistics Regression算法主要用於處理二分類問題,若需要處理的是多分類問題,如手寫字的識別,即識別{0,1,2,3,4,5,6,7,8,9}中的數字,此時需要使用能夠處理多分類問題的算法。

  Softmax Regression算法是Logistics Regression算法在多分類問題上的推廣,主要用於處理多分類問題,其中,任意兩個類之間是線性可分的。

  多分類問題,他的類標簽y的取值個數大於2,如手寫字識別,即識別{0,1,2,3,4,5,6,7,8,9}中的數字,手寫字如圖所示:

1、Softmax Regression算法模型用於解決多分類問題

  Softmax Regression算法是Logistics Regression算法的推廣,即類標簽y的取值大於或等於2.假設有m個訓練樣本{(X(1),y(1)),(X(2),y(2)),........(X(m),y(m))},對於Softmax Regression算法,其輸入特征為X(i)€Rn+1,類標簽記為:y(i)€{0,1,.......,k}。假設函數為每一個樣本估計其所屬的類別的概率P(y=j |X),具體假設函數為:

為了方便起見,我們同樣使用符號θ來表示全部的模型參數。在實現softmax回歸時,你通常會發現,將θ用一個k×(n+1)的矩陣來表示會十分便利,該矩陣是將θ1,θ2,...,θk按行羅列起來得到的,如下所示:

                                           

則對於每一個樣本估計其所屬的類別的概率為:

2、Softmax Regression算法的代價函數

  類似於logistic Regression 算法,在Softmax Regression算法的損失函數中引入指示函數I(.),其具體形式為;

 

那么對於Softmax Regression算法的損失函數為;

其中,I{y(i)=j}表示的是當y(i)屬於第j類時,I{y(i)=j}=1,否則I{y(i)=j}=0.

可以看出softmax是logistic的一個泛化版。logistic是k=2情況下的softmax回歸。

3、Softmax Regression算法的求解

  對於上述問題,可以使用梯度下降法對其進行求解,首先對其進行求梯度:

最終結果為:

注意,此處的θj表示的是一個向量,通過梯度下降法的公式更新:

 

 

現在,來使用Python實現上述Softmax Regression的更新過程

def gradientAscent(feature_data,label_data,k,maxCycle,alpha):
    '''利用梯度下降法訓練Softmax模型
    :param feature_data: 特征
    :param label_data: 標簽
    :param k: 類別個數
    :param maxCycle: 最大迭代次數
    :param alpha: 學習率
    :return weights: 權重
    '''
    m,n = np.shape(feature_data)
    weights = np.mat(np.ones((n,k)))#初始化權重
    i = 0
    while i<=maxCycle:
        err = np.exp(feature_data*weights)
        if i % 100 == 0:
            print("\t--------iter:",i,\
                  ",cost:",cost(err,label_data))
            rowsum = -err.sum(axis=1)
            rowsum = rowsum.repeat(k,axis = 1)
            err = err/rowsum
            for x in range(m):
                err[x,label_data[x,0]]+=1
            weights = weights+(alpha/m)*feature_data.T*err
            i+=1
        return  weights

cost函數:

 1 def cost(err,label_data):
 2     '''
 3     :param err: exp的值
 4     :param label_data: 標簽的值
 5     :return: 損失函數的值
 6     '''
 7     m = np.shape(err)[0]
 8     sum_cost = 0.0
 9     for i in range(m):
10         if err[i,label_data[i,0]]/np.sum(err[i,:])>0:
11             sum_cost -=np.log(err[i,label_data[i,0]]/np.sum(err[i,:]))
12         else:
13             sum_cost -= 0
14     return sum_cost / m

4、Softmax Regression與Logistics Regression的關系

有一點需要注意的是,按上述方法用softmax求得的參數並不是唯一的,因為,對每一個參數來說,若都減去一個相同的值,依然是上述的代價函數的值。證明如下:

  

這表明了softmax回歸中的參數是“冗余”的。更正式一點來說,我們的softmax模型被過度參數化了,這意味着對於任何我們用來與數據相擬合的估計值,都會存在多組參數集,它們能夠生成完全相同的估值函數hθ將輸入x映射到預測值。因此使J(θ)最小化的解不是唯一的。而Hessian矩陣是奇異的/不可逆的,這會直接導致Softmax的牛頓法實現版本出現數值計算的問題。

為了解決這個問題,加入一個權重衰減項到代價函數中:

有了這個權重衰減項以后(對於任意的λ>0),代價函數就變成了嚴格的凸函數而且hession矩陣就不會不可逆了。

此時的偏導數:

 

對於上面的Softmax Regression過度參數化問題可以參考博客:https://www.cnblogs.com/bzjia-blog/p/3366780.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM