逻辑回归(logistics regression)应该是业界使用最广泛的模型了, 虽然名字中带了回归, 实际上解决的是分类问题, 有了它我们就可以预测诸如一个东西是属于A类, 还是属于B类, 明天下不下雨, 股市是涨还是跌, 本篇一起来看一看逻辑回归是怎么工作的吧
假设函数
之前我们讲到线性回归的假设函数是: 逻辑回归就是在这个线性回归基础上再做一个Sigmoid变换:所以逻辑回归的假设函数h(x)就是: 那么为什么要使用Sigmoid函数呢? 下图看一下这个函数的特性:
- 函数中当z>=0的时候, g(z) >= 0.5,
- 当z<0的时候g(z) <0.5, 而利用这个特性可以很好的变成分类模型*
用概率来表示就是集合 y ∈ {0, 1}
假设函数表示y=1的概率为: h(x) = P(y=1 | x;θ)
又 P(y=0 | x;θ) + P(y=1 | x;θ) = 1
所以P(y=0 | x;θ) = 1 - P(y=1 | x;θ)
损失函数
线性回归我们使用的是最小二乘损失, 那么逻辑回归能不能也用最小二乘来做损失函数呢?
对于逻辑回归我们采用log损失函数, 这样可以很好的拟合出一个凸函数,从而对它进行梯度下降找到最优化解
-
当y=1时损失函数cost(h(x), y) = -log(h(x)), 如图
-
当y=0时损失函数cost(h(x), y) = -log(1-h(x)), 如图
log y=0.png
当样本中y=1 或 y=0 时, 为了方便可以把两个损失函数合并成一个公式:
cost(h(x), y) = -ylog(h(x)) - (1-y)(log(1-h(x)))
- 当样本中y=1时后面 (1-y)为0, 所以cost(h(x), y) = -log(h(x))
- 当样本中y=0时前面y为0, 所以cost(h(x), y) = -log(1-h(x))
全量样本极大似然损失(是不是很眼熟? 又回到了信息熵的公式):
现在的目标就是要极小化这个损失函数找到θ的值: minimize L(θ)
这个时候又到了梯度下降出场-->
梯度下降
- 参数更新梯度下降迭代(参考梯度下降那一篇):
- 逻辑回归的原函数:
-
而Sigmoid函数的导数有个很好的特性:
g'(z) = g(z)(1-g(z))
- 所以可以根据链式法则来对L(θ)求导:
- 最终参数的更新梯度下降变为:
用Pytorch简洁实现LR
- 逻辑回归是在线性回归基础上加一个sigmoid变化, 所有建立模型的时候只需要用到Linear+sigmoid两个方法就能构建逻辑回归了:
import torch
import torch.nn as nn
class LR(nn.Module):
def __init__(self):
super(LR, self).__init__()
self.fc = nn.Linear(4, 1)
def forward(self, x):
out = self.fc(x)
out = torch.sigmoid(out)
return out
- 训练的时候定义使用信息熵损失, 再加上梯度下降更新参数, 是不是特别简单?
def train(x, y):
lr = LR()
criterion = nn.BCELoss()
optm = torch.optim.SGD(lr.parameters(), lr=0.001)
for epoch in range(100):
lr.train()
y_output = lr(x)
loss = criterion(y_output, y)
optm.zero_grad()
loss.backward()
optm.step()
if (epoch+1) % 10 == 0:
print "Epoch: {}, Loss: {:.4f}".format(epoch+1, loss.item())
return lr
参考
- [1] 吴恩达.机器学习视频
- [2] 李沐.<<动手学深度学习>> https://zh.d2l.ai/
网友评论