定義
邏輯回歸其實就是原來的線性回歸加了激活函數,這個函數其實就是sigmoid函數,把一個回歸的連續數值壓縮到了0到1的空間,其實只要有函數能夠滿足把數值壓縮到0,1之間就可以(因為0到1之間的數值就是概率值)
對于分類問題而言,不能和回歸問題一樣,計算與真值的距離,即MSE損失(均方誤差損失),為此人們發明了交叉熵損失。
對于單個樣本,其二元交叉熵損失為:
L = ? [ y log ? ( y ^ ) + ( 1 ? y ) log ? ( 1 ? y ^ ) ] L = - [y \log(\hat{y}) + (1 - y) \log(1 - \hat{y})] L=?[ylog(y^?)+(1?y)log(1?y^?)]
其中, y y y 是真實標簽(取值為 0 或 1), y ^ \hat{y} y^? 是模型預測的概率(取值范圍在 [ 0 , 1 ] [0, 1] [0,1] 之間)。
分析:當真實值為1的時候,損失變為:
L = ? y log ? ( y ^ ) L = - y \log(\hat{y}) L=?ylog(y^?)
為了讓損失最小,預測值 y ^ \hat{y} y^?越大越好,即越為1越好
當真實值為0的時候,損失變為:
L = ? log ? ( 1 ? y ^ ) L = - \log(1-\hat{y}) L=?log(1?y^?)
為了讓損失最小,預測值 y ^ \hat{y} y^?越小越好,即越為0越好
這個是符合損失函數概念的,即越接近真實值,損失越小。
對于 N N N 個樣本的平均二元交叉熵損失為:
L = ? 1 N ∑ i = 1 N [ y i log ? ( y ^ i ) + ( 1 ? y i ) log ? ( 1 ? y ^ i ) ] L = - \frac{1}{N} \sum_{i=1}^{N} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] L=?N1?i=1∑N?[yi?log(y^?i?)+(1?yi?)log(1?y^?i?)]
對于多分類任務一樣,BCE損失函數如下:
H ( y , p ) = ? 1 n ∑ i = 1 n ∑ j = 1 C y i j log ? ( p i j ) H(y,p)=-\frac{1}{n}\sum_{i = 1}^{n}\sum_{j = 1}^{C}y_{ij}\log(p_{ij}) H(y,p)=?n1?i=1∑n?j=1∑C?yij?log(pij?)
C是類別,n是樣本數目
pytorch框架編寫
不管什么模型,其實也是只有四部
- (1)準備數據
import torch
import torch.nn.functional as F
# 準備數據
x_data = torch.tensor([[1.0],[2.0],[3.0]], dtype=torch.float32)
y_data = torch.tensor([[0.0],[0.0],[1.0]], dtype=torch.float32)
- (2)構建模型
# 構建模型
class LogiscalRegression(torch.nn.Module):def __init__(self):super(LogiscalRegression,self).__init__()self.linear=torch.nn.Linear(1,1)def forward(self,x):y_pred=F.sigmoid(self.linear(x))return y_pred
核心在于
y_pred=F.sigmoid(self.linear(x))
線性回歸的值取了一個sigmoid激活,將其壓縮到【0,1】之間。
- (3)初始化模型,并定義損失
# 實例化自己構建的模型
model=LogiscalRegression()
#定義損失函數
cretirion=torch.nn.BCELoss(reduction='sum')
# 定制優化器類型
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
- (4)開始損失
#開始訓練
for epoch in range(100):#模型結果y_pred = model(x_data)#計算損失loss=cretirion(y_pred,y_data)print("loss:",loss.item())#梯度歸零optimizer.zero_grad()#反向轉播loss.backward()#更新optimizer.step()
全部代碼如下
import torch
import torch.nn.functional as F
# 準備數據
x_data = torch.tensor([[1.0],[2.0],[3.0]])
y_data = torch.tensor([[0.0],[0.0],[1.0]])
# 構建模型
class LogiscalRegression(torch.nn.Module):def __init__(self):super(LogiscalRegression,self).__init__()self.linear=torch.nn.Linear(1,1)def forward(self,x):y_pred=F.sigmoid(self.linear(x))return y_pred
# 實例化自己構建的模型
model=LogiscalRegression()
#定義損失函數
cretirion=torch.nn.BCELoss(size_average =False)
# 定制優化器類型
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
#開始訓練
for epoch in range(100):y_pred = model(x_data)loss=cretirion(y_pred,y_data)print("loss:",loss.item())optimizer.zero_grad()loss.backward()optimizer.step()