來源 | AI小白入門
作者 | 文傑
編輯 | yuquanle
完整代碼見:原文鏈接
1. Logistic迴歸
分類問題可以看作是在迴歸函數上的一個分類。一般情況下定義二值函數,然而二值函數構成的損失函數非凸,一般採用sigmoid函數平滑擬合(當然也可以看作是一種軟劃分,概率劃分):從函數圖像我們能看出,該函數有很好的特性,適合二分類問題。至於爲何選擇Sigmoid函數,後面可以從廣義線性模型導出爲什麼是Sigmoid函數。
邏輯迴歸可以看作是在線性迴歸的基礎上構建的分類模型,理解的角度有多種(最好的當然是概率解釋和最小對數損失),而最直接的理解是考慮邏輯迴歸是將線性迴歸值離散化。即一個二分類問題如下:(二值函數)
hθ(x(i))=g(θTx)={1,ifθTx≥t0,ifθTx<t
1.1 sigmoid函數
g(z)=1+e−z1,g‘(z)=g(z)(1−g(z))
0−1損失的二分類問題屬於一種硬劃分,即是與否的劃分,而sigmoid函數則將這種硬劃分軟化,以一定的概率屬於某一類(且屬於兩類的加和爲1)。Sigmoid函數將線性迴歸值映射到 [0,1]的概率區間,從函數圖像我們能看出,該函數有很好的特性,適合二分類問題。 因此邏輯迴歸模型如下:
hθ(x(i))=g(θTx)=1+e−θTx1
這裏對於目標函數的構建不再是最小化函數值與真實值的平方誤差了,按分類原則來講最直接的損失因該是0-1損失,即分類正確沒有損失,分類錯誤損失計數加1。但是0-1損失難以優化,存在弊端。結合sigmoid函數將硬劃分轉化爲概率劃分的特點,採用概率hθ(x(i))的對數損失(概率解釋-N次伯努利分佈加最大似然估計),其目標函數如下:
J(θ)=i=1∑m−(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))minJ(θ)
同樣採用梯度下降的方法有:
θj:=θj−α∂θj∂J(θ)=θj−α∂θj∂∑i=1m−(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))=θj−α(−hθ(x(i))y(i)+(1−hθ(x(i)))(1−y(i)))∂θj∂hθ(x(i))=θj−α(hθ(x(i))(1−hθ(x(i)))y(i)−hθ(x(i)))∂θj∂hθ(x(i))
又:
∂θ∂hθ(x)=(1+e−θTx1)′=(1+e−θTx1)2(e−θTx)x=(1+e−θTx1)(1−1+e−θTx1)x=hθ(x)(1−hθ(x))x
所以有:
θj=θj−α(y(i)−hθ(x(i)))x
1.2 概率解釋
邏輯迴歸的概率解釋同線性迴歸模型一致,只是假設不再是服從高斯分佈,而是p(y∣x;θ)服從0-1分佈,由於 ,假設隨機變量y服從伯努利分佈是合理的 。即:
p(y=1∣x;θ)=hθ(x)p(y=0∣x;θ)=1−hθ(x)p(y∣x;θ)=(hθ(x))y.(1−hθ(x))(1−y)
所以最大化似然估計有:
maxL(θ)=p(y∣x;θ)=i=1∏mp(y(i)∣x(i);θ)=i=1∏m(hθ(x(i)))y(i).(1−hθ(x(i)))(1−y(i))⇔maxlogL(θ)⇔min−logL(θ)=i=1∑m−(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))
1.3 logistic採用對數損失原因
採用對數損失的原因有二:
1) 從概率解釋來看,多次伯努利分佈是指數的形式。由於最大似然估計導出的結果是概率連乘,而概率(sigmoid函數)恆小於1,爲了防止計算下溢,取對數將連乘轉換成連加的形式,而且目標函數和對數函數具備單調性,取對數不會影響目標函數的優化值。
2)從對數損失目標函數來看,取對數之後在求導過程會大大簡化計算量。
2. SoftMax迴歸
2.1 SoftMax迴歸
Softmax迴歸可以看作是Logistic迴歸在多分類上的一個推廣。考慮二分類的另一種表示形式:
[k1,1−k1]→[k1k2]
當logistic迴歸採用二維表示的話,那麼其損失函數如下:
J(θ)=−i=1∑mk=1∑2(y(ik)log(∑k=1Khθk(x(i))hθk(x(i))))minJ(θ)
其中,在邏輯迴歸中兩類分別爲k1,1−k1二在softmax中採用k1,k2兩個隨機變量組成二維向量表示,當然隱含約束k1+k2=1.爲了更好的表示多分類問題,將y∈{1,2,..K}(不一定理解爲y的取值爲k,更應該理解爲y可以取k類)多分類問題進行如下表示:
T(k)=⎣⎢⎢⎢⎢⎢⎢⎡00.1.0⎦⎥⎥⎥⎥⎥⎥⎤
其中向量的第k位爲1,其他位爲0,也就是當y=k 時將其映射成向量時對應第k位爲1。採用多維向量表示之後,那麼對於每一維就變成了一個單獨的二分類問題了,所以softmax函數形式如下:
hθ(x(i))=∑k=1Kexp(θkTx(i))1⎣⎢⎢⎡exp(θkTx(i))exp(θkTx(i)).exp(θkTx(i))⎦⎥⎥⎤
其中函數值是一個K維的向量,同樣採用對數損失(N元伯努利分佈和最大似然估計),目標函數形式是logistic迴歸的多維形式。
J(θ)=−i=1∑mk=1∑K(y(ik)log(∑k=1Khθk(x(i))hθk(x(i))))minJ(θ)
其中yik表示第i個樣本的標籤向量化後第k維的取值0或者1.可以看出Softmax的損失是對每一類計算其概率的對數損失,而logistic迴歸是計算兩類的迴歸,其本質是一樣。Logistic迴歸和Softmax迴歸都是基於線性迴歸的分類模型,兩者無本質區別,都是從伯努利分結合最大對數似然估計。只是Logistic迴歸常用於二分類,而Softmax迴歸常用於多分類。而且Logistic迴歸在考慮多分類時只考慮n−1類。
2.2 二分類轉多分類思想
對於多分類問題,同樣可以借鑑二分類學習方法,在二分類學習基礎上採用一些策略以實現多分類,基本思路是“拆解法”,假設N個類別C1,C2,.Ci.,Cn,經典的拆分算法有“一對一”,“一對多”,“多對多”,
一對一的基本思想是從所有類別中選出兩類來實現一個兩分類學習器,即學習出CN2=N(N−1)/2個二分類器,然後對新樣本進行預測時,對這 CN2個分類器進行投票最終決定屬於那一類。
一對多的基本思想是把所有類別進行二分類,即屬於Ci類和非Ci兩類,這樣我們就需要N個分類器,然後對新樣本進行預測時,與每一個分類器比較,最終決定屬於哪一類。這其實就是Softmax的思想,也是SVM多分類的思想。
3. 最大熵模型
之所以把最大熵模型放到這講,是因爲它和Logistic迴歸和SoftMax迴歸實在是驚人的相似,同屬於對數線性模型。
3.1 熵的概念
信息熵:熵是一種對隨機變量不確定性的度量,不確定性越大,熵越大。若隨機變量退化成定值,熵爲0。均勻分佈是“最不確定”的分佈 。
假設離散隨機變量X的概率分佈爲P(X),則其熵爲:
H(X)=−x∑P(x)logP(x)
其中熵滿足不等式0≤H(P)≤log∣X∣,∣X∣爲X取值數。
聯合熵:對於多個隨機變量的不確定性可以用聯合熵度量
假設離散隨機變量X,Y的聯合概率分佈爲P(X,Y),則其熵爲:
H(X,Y)=−x∑y∑P(x,y)logP(x,y)
條件熵:在給定條件下描述隨機變量的不確定性
假設離散隨機變量X,Y,在給定Y的條件下X的不確定性爲條件熵H(X|Y),也就等於H(X,Y)−H(Y)
H(X∣Y)=−x,y∑P(x,y)log(P(x∣y))
互信息:衡量兩個隨機變量相關性的大小I(X,Y)=H(X)+H(Y)−H(X,Y)
I(X,Y)=−x,y∑P(x,y)logP(x)P(y)P(x,y)
相對熵(KL散度):衡量對於同一個隨機變量兩個概率分佈p(x),q(x)的差異性
D(p∣∣q)=x∑p(x)logq(x)p(x)=Ep(x)logq(x)p(x)
有互信息和相對熵的定義有下式:
I(X,Y)=D(P(X,Y)∣∣P(X)P(Y))
關於熵的介紹就到此,不細究,雖然上面的這些定義在機器學習中都會遇到,不過後面涉及到的主要還是熵和條件熵,互信息。
3.2 最大熵模型
最大熵原理是概率模型學習中的一個準則。最大熵原理認爲,學習概率模型時,在所有可能的概率模型分佈中(滿足所有條件下),熵最大的模型是最好的模型。熵最大即爲最均勻的分佈,從某種角度講均勻分佈總是符合我們理解的損失風險最小,也就是“不要不所有的雞蛋放到一個籃子裏,均勻的放置”。
給定訓練集T={(x1,y1),(x2,y2)..(xm,ym)},假設X∈χ⊆Rn表示輸入,y∈ϕ表示輸出,分類模型是一個以條件概率分佈P(Y∣X)輸出Y,也就是說在滿足條件的所有可能集中,條件熵P(Y∣X)最大的模型即爲最好的模型。其中條件爲隱藏在數據的期望。
一般來講,最大熵模型常用於處理離散化數據集,定義隨機變量X,Y的特徵模板,從數據中統計他們的期望作爲最大熵模型的條件
特徵函數:
f(x,y)={1,x,y滿足某一事實0,否則
約束條件:對於任意的特徵函數f,我們可以統計其在數據中的經驗分佈P(x,y)的期望:
Ep(f)=x,y∑P(x,y)f(x,y)
特徵函數f關於模型P(Y∣X)和先驗P(X)的條件期望:
Ep(f)=x,y∑P(x)P(y∣x)f(x,y)
所以,滿足約束條件的模型集合爲:
Ω≡{P∈P∣Ep(fi)=Ep(fi),i=1..n}
因此最大熵模型的形式化表示如下:
P∈CmaxH(P)=−x,y∑P(x)P(y∣x)logp(y∣x)⇔P∈Cmin−H(P)=x,y∑P(x)P(y∣x)logp(y∣x)s.t.Ep(fi)=Ep(fi),i=1..ny∑P(y∣x)=1
由拉格讓日乘子法,引入拉格讓日乘子,定義拉格讓日函數:
L(P,w)=−H(P)+w0(1−y∑P(y∣x))+i∑wi(Ep(fi)−Ep(fi))=x,y∑P(x)P(y∣x)logp(y∣x)+w0(1−y∑P(y∣x))+i∑wi(x,y∑(P(x)P(y∣x)fi(x,y)−x,y∑P(x,y)fi(x,y))s.t.▽L(P,w)=0(1−y∑P(y∣x))=0x,y∑(P(x)P(y∣x)fi(x,y)−x,y∑P(x,y)fi(x,y)=0,i=1..nwi≥0,i=1..n
根據拉格朗日乘子法,L(P)≥L(P,w),當且僅當滿足拉格朗日乘子法的所有必要條件等式成立,原問題也就是一個最小化最大問題
P∈CminwmaxL(P,w)
裏層是max最大化L(P,w),外層的min最小化L(P)。
對偶問題是:
wmaxP∈CminL(P,w)
求解對偶問題,第一步最小化內部minP∈CL(P,w),minP∈CL(P,w)是關於w的函數,最優解記爲Pw:
Pw=argP∈CminL(P,w)=Pw(y∣x)
那麼外層最大化目標函數爲:
wmaxΦ(w)Φ(w)=p∈CminL(P,w)=L(Pw,w)
爲了求解Pw(y∣x),根據KKT條件對P(y∣x)求偏導:
∂P(y∣x)∂L(P,w)=x,y∑P(x)(logP(y∣x)+1)−y∑w0−x,y∑(P(x)i∑wifi(x,y))=x,y∑P(x)(logP(y∣x)+1−w0−i∑wifi(x,y))=0
求解得:
P(y∣x)=exp(i∑wifi(x,y)+w0−1)=exp(1−w0)(exp∑iwifi(x,y))
這裏,雖然我們不知道w0,但是由於∑yP(y∣x)=1,所以分母一定是對y的所有可能的歸一化因子
Pw(y∣x)=zw(x)1(expi∑wifi(x,y))zw(x)=y∑exp(i∑wifi(x,y))
因此,maxwΦ(w)的最優解爲:
w∗=argwmaxΦ(w)
代回Pw(y∣x),我們可以得到最終的分類模型,同樣我們發現最大熵模型也是一個對數線性模型。
回顧對偶函數,內部最小化求解得到了Pw(y∣x),回到外部目標maxwΦ(w),將Pw(y∣x)代回拉格朗日函數有:
Φ(w)=x,y∑P(x)Pw(y∣x)logPw(y∣x)+i=1∑nwi(x,y∑P(x,y)fi(x,y)−x,y∑P(x)Pw(y∣x)fi(x,y))=x,y∑P(x,y)i=1∑nwifi(x,y)+x,y∑P(x)Pw(y∣x)(logPw(y∣x)−i=1∑nwifi(x,y))=x,y∑P(x,y)i=1∑nwifi(x,y)−x,y∑P(x)Pw(y∣x)logzw(x)=x,y∑P(x,y)i=1∑nwifi(x,y)−x∑P(x)logzw(x)y∑Pw(y∣x)=x,y∑P(x,y)i=1∑nwifi(x,y)−x∑P(x)logzw(x)
3.3 概率解釋
已知訓練集的經驗概率分佈P(x,y),條件概率分佈P(y∣x)的對數似然函數爲:
LP(Pw)=logx,y∏P(y∣x)P(x,y)=x,y∑P(x,y)logP(y∣x),特徵統計Logistic:maxlogL(θ)=p(y∣x;θ)=logi=1∏mk=1∏K(hθ(x(i)))y(i),樣本統計
其中,我們發現對數似然函數與條件熵的形式一致,最大熵模型目標函數前面有負號(這與最大化對數似然函數完全相反),同時最大熵模型中有約束條件。也正是因爲約束條件,我們將原問題轉化爲對偶問題後發現,在滿足約束條件的對偶函數的極大化等價於最大化對數似然函數。
當條件概率P(y∣x)滿足約束條件,在對偶問題求解過程中我們有:
Pw(y∣x)=zw(x)1(expi∑wifi(x,y))zw(x)=y∑exp(i∑wifi(x,y))
代入到對數似然函數,同樣有:
LP(Pw)=x,y∑P(x,y)logP(y∣x)=x,y∑P(x,y)(i=1∑nwifi(x,y)−logzw(x))=x,y∑P(x,y)i=1∑nwifi(x,y)−x,y∑P(x,y)logzw(x)=x,y∑P(x,y)i=1∑nwifi(x,y)−x∑P(x)logzw(x)=Φ(w)
最後,我們再來看對偶函數表達式,我們發現,第一項其實是X,Y的聯合熵H(X,Y),第二項是X的信息熵H(X),回看熵的示意圖,我們發現,我們的目標還是最大化條件熵H(Y∣X)。
下面再來對比下Logistic迴歸,SoftMax迴歸,最大熵模型:
1)同屬於對數線性模型;
2)Logistic迴歸和SoftMax迴歸都基於條件概率P(y∣x),滿足一個伯努利分佈,N重伯努利分佈;而最大熵模型以期望爲準,沒有該假設;
3)由於都採用線性模型,三者都假設特徵之間是獨立的。
3.4 最大熵模型的優化問題
最大熵模型從拉格朗日乘子法最大化對偶函數,還是從最大化對數似然函數,其目標函數如下:
LP(Pw)=x,y∑P(x,y)i=1∑nwifi(x,y)−x∑P(x)logZw(x)
常用的梯度優化算法都可以,另外對於最大熵模型也有專門的算法有GIS IIS 算法 。
代碼
Logistic迴歸
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]);
}
}
}
SoftMax迴歸
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;
}
}
歡迎關注【AI小白入門】,這裏分享Python、機器學習、深度學習、自然語言處理、人工智能等技術,關注前沿技術,求職經驗等,陪有夢想的你一起成長。