逻辑斯蒂回归原理及Pytorch的实现

作者: 老居搞机 | 来源:发表于2020-03-15 12:02 被阅读0次

    逻辑回归(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;θ)

    可以假设:

    损失函数

    线性回归我们使用的是最小二乘损失, 那么逻辑回归能不能也用最小二乘来做损失函数呢?

    答案是不能的, 因为逻辑回归中Sigmoid(x)-y是非线性的, 如果用最小二乘梯度下降不能够找到最优解, 很容易陷入到局部最优, 如图
    对于逻辑回归我们采用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/
    关注公众号

    相关文章

      网友评论

        本文标题:逻辑斯蒂回归原理及Pytorch的实现

        本文链接:https://www.haomeiwen.com/subject/gvjxehtx.html