乾貨 | 對數線性模型之 Logistic 回歸、SoftMax 回歸和最大熵模型

2021-02-21 AI有道

點擊上方「AI有道」,選擇「星標」公眾號

重磅乾貨,第一時間送達

本文介紹對數線性分類模型,在線性模型的基礎上通過複合函數(sigmoid,softmax,entropy )將其映射到概率區間,使用對數損失構建目標函數。首先以概率的方式解釋了logistic回歸為什麼使用sigmoid函數和對數損失,然後將二分類擴展到多分類,導出sigmoid函數的高維形式softmax函數對應softmax回歸,最後最大熵模型可以看作是softmax回歸的離散型版本,logistic回歸和softmax回歸處理數值型分類問題,最大熵模型對應處理離散型分類問題。


作者 | 文杰

編輯 | yuquanle

分類問題可以看作是在回歸函數上的一個分類。一般情況下定義二值函數,然而二值函數構成的損失函數非凸,一般採用sigmoid函數平滑擬合(當然也可以看作是一種軟劃分,概率劃分):從函數圖像我們能看出,該函數有很好的特性,適合二分類問題。至於為何選擇Sigmoid函數,後面可以從廣義線性模型導出為什麼是Sigmoid函數。

邏輯回歸可以看作是在線性回歸的基礎上構建的分類模型,理解的角度有多種(最好的當然是概率解釋和最小對數損失),而最直接的理解是考慮邏輯回歸是將線性回歸值離散化。即一個二分類問題(二值函數)如下:

0-1損失的二分類問題屬於一種硬劃分,即是與否的劃分,而sigmoid函數則將這種硬劃分軟化,以一定的概率屬於某一類(且屬於兩類的加和為1)。

Sigmoid函數將線性回歸值映射到 的概率區間,從函數圖像我們能看出,該函數有很好的特性,適合二分類問題。 因此邏輯回歸模型如下:

這裡對於目標函數的構建不再是最小化函數值與真實值的平方誤差了,按分類原則來講最直接的損失因該是0-1損失,即分類正確沒有損失,分類錯誤損失計數加1。但是0-1損失難以優化,存在弊端。結合sigmoid函數將硬劃分轉化為概率劃分的特點,採用概率的對數損失(概率解釋-N次伯努利分布加最大似然估計),其目標函數如下:

同樣採用梯度下降的方法有:

又:

所以有:

B、概率解釋

邏輯回歸的概率解釋同線性回歸模型一致,只是假設不再是服從高斯分布,而是服從0-1分布,由於 ,假設隨機變量y服從伯努利分布是合理的 。即:

所以最大化似然估計有:

logistic採用對數損失(對數似然函數)原因:

1) 從概率解釋來看,多次伯努利分布是指數的形式。由於最大似然估計導出的結果是概率連乘,而概率(sigmoid函數)恆小於1,為了防止計算下溢,取對數將連乘轉換成連加的形式,而且目標函數和對數函數具備單調性,取對數不會影響目標函數的優化值。

2)從對數損失目標函數來看,取對數之後在求導過程會大大簡化計算量。

Softmax回歸可以看作是Logistic回歸在多分類上的一個推廣。考慮二分類的另一種表示形式:

當logistic回歸採用二維表示的話,那麼其損失函數如下:

其中,在邏輯回歸中兩類分別為二在softmax中採用兩個隨機變量組成二維向量表示,當然隱含約束.為了更好的表示多分類問題,將(不一定理解為的取值為,更應該理解為可以取類)多分類問題進行如下表示:

其中向量的第位為1,其他位為,也就是當 時將其映射成向量時對應第位為。採用多維向量表示之後,那麼對於每一維就變成了一個單獨的二分類問題了,所以softmax函數形式如下:

其中函數值是一個維的向量,同樣採用對數損失(N元伯努利分布和最大似然估計),目標函數形式是logistic回歸的多維形式。

其中表示第個樣本的標籤向量化後第維的取值或者.可以看出Softmax的損失是對每一類計算其概率的對數損失,而logistic回歸是計算兩類的回歸,其本質是一樣。Logistic回歸和Softmax回歸都是基於線性回歸的分類模型,兩者無本質區別,都是從伯努利分結合最大對數似然估計。只是Logistic回歸常用於二分類,而Softmax回歸常用於多分類。而且Logistic回歸在考慮多分類時只考慮類。

概率解釋(求導推導):

二分類與多分類可以看作是二元伯努利分布到多元伯努利分布的一個推廣,概率解釋同Logistic回歸一致。詳細解釋放到廣義線性模型中。

對於多分類問題,同樣可以借鑑二分類學習方法,在二分類學習基礎上採用一些策略以實現多分類,基本思路是「拆解法」,假設N個類別,經典的拆分算法有「一對一」,「一對多」,「多對多」,

一對一的基本思想是從所有類別中選出兩類來實現一個兩分類學習器,即學習出個二分類器,然後對新樣本進行預測時,對這 個分類器進行投票最終決定屬於那一類。

一對多的基本思想是把所有類別進行二分類,即屬於類和非兩類,這樣我們就需要N個分類器,然後對新樣本進行預測時,與每一個分類器比較,最終決定屬於哪一類。這其實就是Softmax的思想,也是SVM多分類的思想。

很奇怪,為什麼會把最大熵模型放到這,原因很簡單,它和Logistic回歸和SoftMax回歸實在是驚人的相似,同屬於對數線性模型。

A、熵的概念


信息熵:熵是一種對隨機變量不確定性的度量,不確定性越大,熵越大。若隨機變量退化成定值,熵為0。均勻分布是「最不確定」的分布 。

假設離散隨機變量X的概率分布為,則其熵為:

其中熵滿足不等式取值數。

聯合熵:對於多個隨機變量的不確定性可以用聯合熵度量。

假設離散隨機變量的聯合概率分布為,則其熵為:

條件熵:在給定條件下描述隨機變量的不確定性。

假設離散隨機變量,在給定的條件下的不確定性為條件熵H(X|Y),也就等於

互信息:衡量兩個隨機變量相關性的大小。

相對熵(KL散度):衡量對於同一個隨機變量兩個概率分布的差異性。

有互信息和相對熵的定義有下式:

關於熵的介紹就到此,不細究,雖然上面的這些定義在機器學習中都會遇到,不過後面涉及到的主要還是熵和條件熵,互信息。

B、最大熵模型


最大熵原理是概率模型學習中的一個準則。最大熵原理認為,學習概率模型時,在所有可能的概率模型分布中(滿足所有條件下),熵最大的模型是最好的模型。熵最大即為最均勻的分布,從某種角度講均勻分布總是符合我們理解的損失風險最小,也就是「不要不所有的雞蛋放到一個籃子裡,均勻的放置」。

給定訓練集:

假設表示輸入,表示輸出,分類模型是一個以條件概率分布輸出,也就是說在滿足條件的所有可能集中,條件熵最大的模型即為最好的模型。其中條件為隱藏在數據的期望。

一般來講,最大熵模型常用於處理離散化數據集,定義隨機變量的特徵模板,從數據中統計他們的期望作為最大熵模型的條件

特徵函數:

約束條件:對於任意的特徵函數,我們可以統計其在數據中的經驗分布的期望:

特徵函數關於模型和先驗的條件期望:

所以,滿足約束條件的模型集合為:

因此最大熵模型的形式化表示如下:

由拉格讓日乘子法,引入拉格讓日乘子,定義拉格讓日函數:

根據拉格朗日乘子法,,若且唯若滿足拉格朗日乘子法的所有必要條件等式成立,原問題也就是一個最小化最大問題:

裡層是最大化,外層的最小化

對偶問題是:

求解對偶問題,第一步最小化內部:

那麼外層最大化目標函數為:

為了求解,根據KKT條件對求偏導:

求解得:

這裡,雖然我們不知道,但是由於,所以分母一定是對的所有可能的歸一化因子:

因此,的最優解為:

代回,我們可以得到最終的分類模型,同樣我們發現最大熵模型也是一個對數線性模型。

回顧對偶函數,內部最小化求解得到了,回到外部目標,將代回拉格朗日函數有:

C、概率解釋

已知訓練集的經驗概率分布,條件概率分布的對數似然函數為:

其中,我們發現對數似然函數與條件熵的形式一致,最大熵模型目標函數前面有負號(這與最大化對數似然函數完全相反),同時最大熵模型中有約束條件。也正是因為約束條件,我們將原問題轉化為對偶問題後發現,在滿足約束條件的對偶函數的極大化等價於最大化對數似然函數。

當條件概率滿足約束條件,在對偶問題求解過程中我們有:

代入到對數似然函數,同樣有:

最後,我們再來看對偶函數表達式,我們發現,第一項其實是的聯合熵,第二項是的信息熵,回看熵的示意圖,我們發現,我們的目標還是最大化條件熵

下面再來對比下Logistic回歸,SoftMax回歸,最大熵模型:

1)同屬於對數線性模型。

2)Logistic回歸和SoftMax回歸都基於條件概率,滿足一個伯努利分布,N重伯努利分布;而最大熵模型以期望為準,沒有該假設。

3)由於都採用線性模型,三者都假設特徵之間是獨立的。

最大熵模型的優化問題:

最大熵模型從拉格朗日乘子法最大化對偶函數,還是從最大化對數似然函數,其目標函數如下:

常用的梯度優化算法都可以,另外對於最大熵模型也有專門的算法有GIS IIS 算法 。

int LogReg()
{
    const char *file="data\\LogReg.txt";
    const string model="gradAscent";
    const double alpha=0.01;
    Matrix x;
    cout<<"loadData"<<endl;
    cout<<"--"<<endl;
    x.LoadData(file);
    Matrix y;
    y=x.getOneCol(x.col-1);
    x.deleteOneCol(x.col-1);

    if(model=="gradAscent")
        gradAscent_Log(x,y);
    if(model=="stoGradAscent")
        stoGradAscent_Log(x,y);

    return 0;
}

  int gradAscent_Log(Matrix x,Matrix y)  
      {
          if(y.col!=1)
          {
              cout<<"logReg is two class"<<endl;
              return -1;
          }
          Matrix weights(x.col,y.col,0.1,"T");
          Matrix xT = x.transposeMatrix();
  
          float alpha=0.01;
          float error=0;
          int iter=0;
          int i,j;
          Matrix z(y.row,y.col,0,"T");
          Matrix grad(x.col,y.col,0,"T");
          for(iter=0; iter<5000; iter++)
          {
              z = x * weights;
              for(i=0; i<z.row; i++)
              {
                  z.data[i][0]=sigmoid(z.data[i][0]);
              }
              z = y - z;
              error=0;
              for(i=0; i<x.row; i++)
                  error+=z.data[i][0];
              grad = xT * z;
              for(i=0; i<grad.row; i++)
                  grad.data[i][0]*= alpha;
              weights = weights + grad;
          }
  
            
          int er1=0,er2=0;
          Matrix train=x * weights;
          cout<<"test"<<endl;
          for(i=0; i<y.row; i++)
          {
              if(train.data[i][0]>0)
              {
                  cout<<1-y.data[i][0]<<endl;
                  er1+=(1-y.data[i][0]);
              }
              else  
              {
                  cout<<0-y.data[i][0]<<endl;
                  er2-=(0-y.data[i][0]);
              }
          }
      }

int SoftMaxReg()
{
    const char *file="data\\LogReg.txt";
    const string model="gradAscent";
    const double alpha=0.01;
    Matrix x;
    cout<<"loadData"<<endl;
    cout<<"--"<<endl;
    x.LoadData(file);
    Matrix y;
    y=x.getOneCol(x.col-1);
    y=one_hot(y,2);
    x.deleteOneCol(x.col-1);

    if(model=="gradAscent")
        gradAscent_SoftMax(x,y);
    if(model=="stoGradAscent")
        stoGradAscent_SoftMax(x,y);

    return 0;
}


    
int stoGradAscent_SoftMax(Matrix x,Matrix y)
      {
          Matrix xOneRow(1,x.col,0,"T");
          Matrix xOneRowT(x.col,1,0,"T");
  
          Matrix weights(x.col,y.col,0.1,"T");
          Matrix z(1,y.col,0,"T");
          Matrix grad(x.col,y.col,0,"T");
          double zRowSum=0;
          double alpha=0.001;
          double error;
          int i,j,k,iter;
          for(iter=0; iter<5000; iter++)
          {
              for(i=0; i<x.row; i++)
              {
                  xOneRow=x.getOneRow(i);
                  z = xOneRow * weights;
                  zRowSum=0;
                  for(j=0;j<z.col;j++)
                  {
                      z.data[0][j]=sigmoid(z.data[0][j]);
                      zRowSum+=z.data[0][j];
                  }
                  for(j=0;j<z.col;j++)
                  {
                      z.data[0][j]/=zRowSum;
                      if(iter%1000==0)
                          cout<<z.data[0][j] <<" s ";
                  }
                  if(iter%1000==0)
                      cout<<endl;
                  for(j=0;j<y.col;j++)
                  {
                      z.data[0][j]=y.data[i][j]-z.data[0][j];
                  }
                  xOneRowT = xOneRow.transposeMatrix();
                  grad = xOneRowT * z;
                  for(k=0; k<grad.row;k++)
                  {
                      for(j=0;j<grad.col; j++)
                      {
                          grad.data[k][j]*= alpha;
                      }
                  }
                  weights = weights + grad;
              }
          }
          
            
          Matrix test=x * weights;
          cout<<"test"<<endl;
          for(i=0; i<y.row; i++)
          {
              if(test.data[i][0]>test.data[i][1])
                  cout<<0-y.data[i][1]<<" ";
              else  
                  cout<<1-y.data[i][1]<<" ";
              cout<<endl;
          }
      }

完整代碼:

https://github.com/myazi/myLearn/blob/master/LineReg.cpp

相關焦點

  • Logistic和Softmax回歸實戰(附代碼)
    如何實現分類Logistic對樣本的概率估計類似於系列五中我們所講的線性回歸,也是計算出樣本的一系列權重,然後將該權重線性加和之後輸入到sigmoid函數中,進而計算出一個概率值。當然和其他線性模型一樣,我們也可以對Logistic進行正則化。上面我們用的數據集是有三個類別,然而我們的logistic卻只能處理二分類的問題,對多分類情況,logistic該如何處理呢?Softmax回歸在機器學習尤其是深度學習中,softmax是個非常常用而且比較重要的函數,尤其在多分類的場景中使用廣泛。
  • [PRML]線性分類模型--概率判別模型
    我們現在使用最大似然來確定logistic回歸模型的參數。與式13的比較表明,它與線性回歸模型的平方和誤差函數的梯度具有完全相同的形式。再一次,我們看到梯度的形式與線性模型的平方和誤差函數和logistic回歸模型的交叉熵誤差的形式相同,即誤差
  • 談Softmax激活函數以及Softmax回歸和Logistic回歸關係
    二、Softmax回歸與Logistic回歸關係關於Logistic回歸的詳細介紹請參考博主另一篇文章:logistic回歸原理解析及Python應用實例1、由廣義線性模型再推Logistic回歸損失函數由線性回歸的廣義線性模型和
  • 線性模型篇之Logistic Regression數學公式推導
    線性模型(Linear Model)是機器學習中應用最廣泛的模型,指通過樣本 特徵的線性組合來進行預測的模型。
  • 邏輯回歸(Logistic Regression) 模型簡介
    本文作為美團機器學習InAction系列中的一篇,主要關注邏輯回歸算法的數學模型和參數求解方法,最後也會簡單討論下邏輯回歸和貝葉斯分類的關係,以及在多分類問題上的推廣。參數求解模型的數學形式確定後,剩下就是如何去求解模型中的參數。統計學中常用的一種方法是最大似然估計,即找到一組參數,使得在這組參數下,我們的數據的似然度(概率)越大。在邏輯回歸模型中,似然度可表示為:
  • 深入廣義線性模型:分類和回歸
    雖然關於該類問題的介紹文章已經很多,但是本文詳細介紹了幾種回歸和分類方法的推導過程,內容涉及:線性回歸、最大似然估計、MAP、泊松回歸、Logistic回歸、交叉熵損失函數、多項Logistic回歸等,基本上涵蓋了線性模型中的主要方法和問題,非常適合新手入門線性模型。專知內容組編輯整理。
  • 淺談logistic函數和softmax函數
    首先介紹兩者的定義和應用,最後對兩者的聯繫和區別進行了總結。目錄1. logisitic函數2. softmax函數3. logistic函數和softmax函數的關係4.,簡稱LR)作為一種對數線性模型被廣泛地應用於分類和回歸場景中,此外,logistic函數也是神經網絡中最為常用的激活函數,即sigmoid函數 。
  • logistic函數和softmax函數
    閱讀目錄1. logistic函數2. softmax函數3. logistic和softmax的關係4. 參考內容簡單總結一下機器學習最常見的兩個函數,一個是logistic函數,另一個是softmax函數,若有不足之處,希望大家可以幫忙指正。
  • 線性模型(三)邏輯回歸
    至此,經過連結函數轉化後的原值域為正、負無窮該變換稱為logit變換,經過logit變換後可以順利地使用線性回歸模型擬合觀察值的對數機率。此時,我們稱該模型為logit regression或logistic regression,即中文翻譯的邏輯回歸,適用於分類問題。
  • 廣義線性模型與邏輯回歸
    所以我們無法直接採用線性回歸模型進行建模。對於這一類問題,可以用邏輯回歸來處理。在講邏輯回歸之前,先簡單介紹下指數族分布、廣義線性模型,因為邏輯回歸是廣義線性模型的一種,所以我們需要了解如何從廣義線性模型得到邏輯回歸。二、指數族分布之所以先介紹指數族分布,因為指數族分布是所有廣義線性模型的假設條件之一。
  • Logistic回歸分析之二元Logistic回歸
    在研究X對於Y的影響時,如果Y為定量數據,那麼使用多元線性回歸分析(SPSSAU通用方法裡面的線性回歸);如果Y為定類數據,那麼使用Logistic回歸分析。結合實際情況,可以將Logistic回歸分析分為3類,分別是二元Logistic回歸分析、多元有序Logistic回歸分析和多元無序Logistic回歸分析,如下圖。
  • 一般線性模型與廣義線性模型
    簡單線性回歸;如果有兩個或多個定量自變量,模型就是多重線性回歸;如果模型中有兩個自變量,其中研究因素是分類變量,而非研究因素是定量變量,這種模型稱為協方差分析;它與方差分析的不同之處在於多了一個協變量,協變量類似於混雜因素,它不是我們想要分析的,但是又客觀存在,需要校正它的影響才能正確分析研究因素與結果變量的關係
  • Logistic 回歸101
    Logistc 回歸    今天,我們首先聊一聊最簡單的分類問題——二分類問題。二分類問題並不是要看看誰比較「二」, 純粹只是把數據分為兩類。    既然我們上個系列詳細地聊了聊線性回歸模型,我們首先來聊一聊最重要的線性二分類器之一—— logistic 回歸模型。
  • 線性模型(一)普通線性回歸到廣義線性模型
    同時提醒讀者避免只從字面理解「線性」帶來誤會,即線性模型只能解決線性問題。本章將線性模型定位和表述為在數學表達式上具有線性的表示方式的數學模型,包含普通線性回歸模型和廣義線性模型(線性支持向量機本章不進行講述)。
  • [PRML]回歸模型--貝葉斯線性回歸
    本文包含以下內容:1 簡介在討論線性回歸模型的最大似然的參數設置中,我們已經看到由基函數的數量控制的有效模型的複雜性需要根據數據集的大小控制。一個正則化項添加到對數似然函數意味著有效的模型複雜性可以由正則化係數的值控制,但基函數的數目和形式的選擇在決定模型的整體行為時仍然很重要。這就留下了為特定問題確定適當的模型複雜度的問題,這不能簡單地通過最大化似然函數來決定,因為這總是導致模型過於複雜和過擬合。
  • 從線性回歸、邏輯回歸到圖像分類
    本文共分3大部分:安裝PyTorch和Jupyter Notebook用PyTorch實現線性回歸使用邏輯回歸實現圖像分類文章超長,秉承用代碼搞定一切的原則,內含大量代碼,建議收藏,並分享給你喜歡的人。同時如果有什麼疑問,也歡迎留言告知我們。Tips:為了方便演示,文中代碼和返回結果是用截圖形式給出。
  • [PRML]線性回歸模型--線性基函數模型
    這通常稱為線性回歸(linear regression)。,這個暗示了模型的限制。『tanh』函數的線性組合。在監督學習中如回歸和分類,我們不是尋找輸入變量的分布模型。線性模型的條件高斯噪聲的似然函數的最大化等價於最小化平方和誤差函數
  • Logistic Regression 模型簡介
    本文作為美團機器學習InAction系列中的一篇,主要關注邏輯回歸算法的數學模型和參數求解方法,最後也會簡單討論下邏輯回歸和貝葉斯分類的關係,以及在多分類問題上的推廣。參數求解模型的數學形式確定後,剩下就是如何去求解模型中的參數。統計學中常用的一種方法是最大似然估計,即找到一組參數,使得在這組參數下,我們的數據的似然度(概率)越大。在邏輯回歸模型中,似然度可表示為:
  • 廣義線性模型學習
    如果需要使用廣義線性模型進行分類,請參閱 logistic 回歸 。1.1.1. 普通最小二乘法LinearRegression 擬合一個帶有係數  的線性模型,使得數據集實際觀測數據和預測數據(估計值)之間的殘差平方和最小。
  • 從零開始學PyTorch:一文學會線性回歸、邏輯回歸及圖像分類
    本文共分3大部分:安裝PyTorch和Jupyter Notebook用PyTorch實現線性回歸使用邏輯回歸實現圖像分類文章超長,秉承用代碼搞定一切的原則,內含大量代碼,建議收藏,並分享給你喜歡的人。同時如果有什麼疑問,也歡迎留言告知我們。Tips:為了方便演示,文中代碼和返回結果是用截圖形式給出。