深度学习系列2:聊聊逻辑回归

深度学习系列2:聊聊逻辑回归

引言

在线性回归中,输出是连续的。而在逻辑回归中,输出非 A 即 B,解决的是二分类的问题。比如某套房子是否适合购买,明天是否有雨等。

逻辑回归

线性回归的输出是连续的,如果要预测二分类选择问题,线性回归就不好满足了。比如预测某套房子是否适合购买,通过如下的数据如何建立模型呢?

深度学习系列2:聊聊逻辑回归

回顾线性回归的方程:

Y1m=W1nXnm+b Y_{1m} = W_{1n} * X_{nm} + b

其中:

  • nn 表示变量维度
  • mm 表示样本个数
  • XX 表示变量矩阵
  • WW 表示权重矩阵
  • b 表示偏移量

线性回归的输出 Y 是连续的,如何才能把结果改造成逻辑回归要求的非 A 即 B,非 0 即 1 呢?

首先想到的是利用阶跃函数:

深度学习系列2:聊聊逻辑回归

u(x)={0x<01x>=0 \begin{aligned} u(x)= \begin{cases} 0& \text{x<0}\\ 1& \text{x>=0} \end{cases} \end{aligned}

阶跃函数是一个分段函数,当变量小于 0 时结果为 0,当变量大于等于 0 时结果为 1。

使用阶跃函数确实可以把输出固定为 0 或 1,但运算求解就比较麻烦了,因为阶跃函数是分段函数,不是连续可导的函数。

那有没有一个既连续可导又类似阶跃函数的函数呢,还真有,就是下面这个 sigmoid 函数:

深度学习系列2:聊聊逻辑回归

Sigmoid(x)=s=11+ex Sigmoid(x) = s = \frac 1 {1+e^{-x}}

可以看到,Sigmoid 函数不仅连续可导,并且随着变量的变化,在 y 轴两侧很快就趋近于 0 或 1 了。

所以我们在线性回归的基础上加上一层 Sigmoid 函数即可得到逻辑回归的方程:

Y1m=Sigmoid(W1nXnm+b) Y_{1m} = Sigmoid(W_{1n} * X_{nm} + b)

逻辑回归的损失函数

和线性回归一样,我们仍然希望方程预测的值 Y^\hat Y 与真值 YY 差异越小越好,需要给出表示误差大小的损失函数。

逻辑回归的损失函数和线性回归中有所不同。

因为对于逻辑回归而言,线性回归损失函数的形式 12i=1m(y^iyi)2\frac 12 \sum_{i=1}^m (\hat y_i - y_i)^2 过于复杂且不是凸函数(因为有sigmoid),不好求最小值点。

逻辑回归的损失函数采用的是交叉熵:

loss=(ylogy^+(1y)log(1y^)) loss = -(y\,log\,\hat y + (1-y)\,log(1-\hat y))

关于交叉熵的细节可以参考 《决策树系列1:聊聊信息熵》,这里仅给出直观的解释。

  • 当真值 y = 0 时, loss=log(1y^)loss = -\,log(1-\hat y), 希望 loss 越小越好,而 loss 越小,log(1y^)log(1-\hat y) 越大,1y^1-\hat y 越大,y^\hat y 越小,逼近真值 y=0, 符合预期。
  • 当真值 y = 1 时, loss=logy^loss = -\,log\,\hat y, 希望 loss 越小越好,而 loss 越小,logy^log\,\hat y 越大,y^\hat y 越大,逼近真值 y=1, 符合预期。

损失函数的矩阵表示为:

Loss=(YlogY^+(1Y)log(1Y^)) Loss = -(Y\,log\,\hat Y + (1-Y)\,log(1-\hat Y))

求解逻辑回归

逻辑回归的求解采用梯度下降的方法,梯度下降在线性回归中我们介绍过,采用多轮迭代逼近的方式,每轮求解偏导数 (dW,db) 然后沿偏导数减小的方向前进 α\alpha 步长并更新 (W, b)。

我们把一轮中从 X 到 Y^\hat Y 再到 Loss 的过程叫做正向传播,把从 Loss 求解 (dW,db) 的过程叫做反向传播。

深度学习系列2:聊聊逻辑回归

1. 正向传播

Z=WX+bY^=A=sigmoid(Z)Loss=(YlogY^+(1Y)log(1Y^)) \begin{aligned} Z &= W * X + b \\ \hat Y &= A = sigmoid(Z) \\ Loss &= -(Y\,log\,\hat Y + (1-Y)\,log(1-\hat Y)) \end{aligned}

这里预测值 Y^\hat Y 又写做 AA 是为了与后续篇章神经网络保持一致。

2. 反向传播

反向传播中主要利用链式求导法则,即 zx=zyyx\frac{\partial z}{\partial x} = \frac{\partial z}{\partial y}\,\frac{\partial y}{\partial x}

dA=LA=YA+1Y1AdZ=LZ=LA  AZ=(YA+1Y1A)A(1A)=AYdW=LW=LZ  ZW=1mdZXT=1m(AY)XTdb=Lb=LZ  Zb=1msum(dZ)=1msum(AY) \begin{aligned} &dA = \frac{\partial L}{\partial A} = -\frac{Y}{A} + \frac{1-Y}{1-A} \\ &dZ = \frac{\partial L}{\partial Z} = \frac{\partial L}{\partial A}\;\frac{\partial A}{\partial Z} = (-\frac{Y}{A} + \frac{1-Y}{1-A})\cdot A(1-A) = A-Y \\ &dW = \frac{\partial L}{\partial W} = \frac{\partial L}{\partial Z}\;\frac{\partial Z}{\partial W} = \frac 1m \cdot dZ\,X^T = \frac 1m(A-Y)X^T \\ &db = \frac{\partial L}{\partial b} = \frac{\partial L}{\partial Z}\;\frac{\partial Z}{\partial b} = \frac 1m \cdot sum(dZ) = \frac 1m \,sum(A-Y) \end{aligned}

求解 dZ 时用到了 sigmoid 的导数:令 sigmoid(Z) = A, 则 sigmoid’(Z) = A’ = A(1-A)

在 dW 和 db 中都有一个 1m\frac 1m, 这是因为正向计算时有 m 个样本,所以这里需要除以 m

3. 更新参数

W:=WαdWb:=bαdb \begin{aligned} W:&=W - \alpha\,dW \\ b:&=b - \alpha\,db \end{aligned}

经过 (1,2,3) 的多轮迭代即可得到最优的(W,b)。

后记

逻辑回归今天就聊到这里。铺垫了两次,下一次终于可以开始神经网络了,神经网络与人体神经有什么关系,它又是如何工作的,且听下回分解。

欢迎关注本人公众号《大数据茶馆》,用大白话畅聊大数据。

来的都是客,欢迎您常来坐坐~

深度学习系列2:聊聊逻辑回归