2020.08.22: 附加了后续的逻辑回归部分.
逻辑回归
想要了解逻辑回归,必须了解线性回归.
线性回归 Logistcs Regression
线性回归是监督学习中最简单的模型了, 它具有非常好的可解释性, 也有一种简洁的典雅美. 在机器学习中, 不再区分一元和多元线性回归. 线性回归可以用来解决回归问题, 当然也可以通过一个函数来解决分类问题.
$$
\hat{y} = w_1x_1 + w_2x_2+\cdots + w_nx_n + b
$$
每个$x$ 代表一维度的特征, $w$ 代表这一维特征对预测目标$\hat{y}$ 影响所占的权重. $b$ 是一个偏置.
将以上方程用矩阵形式描述:
$$
Y = W^TX +b
$$
我们要求解的就是权重矩阵$W$和偏置$b$. 假设损失函数为均方误差$\rm MSE$, 代入损失函数有:
$$
\ell(w_i, b) =\frac{1}{n}\sum\limits_{i=1}^n(w_ix_i+b-\hat{y})^2
$$
那么为了最小化损失函数, 最终目标为:
$$
(w_i’, b) = \mathop{\arg\min}_{w_i, b}\ell(w_i, b)
$$
也就是求出最终能使损失最小化的解$(w_i’, b)$. 如何求出这个最优解呢? 我们需要借助优化方法.
最小二乘法 Least Squares Method
最小二乘法其实是线性回归最早的调整权重的方法(估计高中都接触过). 最小二乘法的想法非常朴实, 既然是线性问题, 想要让目标函数最小, 直接对损失函数求导, 令其导数为0, 利用和特征数量相等的样本数, 解一个多元方程组, 自然能够得到所有参数的解. 那样本不够呢? 函数不是线性的呢? 而且看起来样本数量很大时直接解这个方程组也不是很现实. 这时候就必须换一种思路, 不是一步登天, 而是通过某种迭代的方式, 慢慢逼近结果.
梯度下降 Gradient Descent
沿梯度的方向前进, 函数值上升的速度最快. 那么沿着负梯度的方向前进, 就能让函数值以最快的速度下降. 对于每个参数, 只需要求出损失函数对它的偏导数, 就能调整参数值.
$$
\nabla f(x, y)=(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y})
$$
我们可以手动设置一个学习率$\alpha$, 来分别调整每个$w_i$和每个$b$的参数值, 经过多次迭代使得其值收敛与某个能够成功拟合问题的值. 这里直接使用梯度下降, 快速调整参数.
$$
\begin{aligned}
w_i &\leftarrow w_i - \alpha\frac{\partial\ell(w_i, b)}{\partial{w_i}}\\
b&\leftarrow b - \alpha\frac{\partial\ell(w_i, b)}{\partial{b}}
\end{aligned}
$$
批量梯度下降 Batch gradient descent
逐个地在每个数据点应用均方(或绝对)误差, 并重复这一流程很多次. 它对所有样本进行迭代实现了并行, 同时用总体样本指明了下降的方向, 很有可能找到全局最优. 缺点就是当样本很多时, 每次都要对所有样本迭代导致训练缓慢.
随机梯度下降 Stochastic gradient descent
同时在每个数据点应用均方(或绝对)误差, 并重复这一流程很多次. 这样每次只对一个样本进行迭代, 训练速度会加快, 但不易于并行, 且由于个体样本的差异不容易学习到总体样本的特性.
小批次梯度下降法 Mini batch gradient descent
批量梯度下降和随机梯度下降的折中, 上述二者都是极端情况, 一个使用所有样本, 一次只使用一个样本. 所以为什么不去取折中的办法, 取一个合适的迭代样本数量batch_size , 每次都迭代batch_size个样本. 它具有上述两种算法的优点平均, 缺点仅有batch_size设置不当会导致问题.
- 如果batch_size在合理范围内增大, 有以下好处
- 内存利用率提高.
- 每个epoch所用的时间少了, 也就是训练时间减少.
- 准确率增加, 震荡情况减少.
- 盲目增大batch_size的坏处:
- 内存可能扛不住.
- 花费时间变多, 逐渐变向批次梯度下降.
- batch_size当增大到一定阈值时, 下降的方向已经不发生变化, 这时盲目增大batch_size是无用功.
逻辑回归 Logistics Regression
逻辑回归是在线性回归基础上的延伸. 逻辑回归虽然叫做回归,可是却是一个分类模型. 线性模型虽然简单, 但却含有丰富的变化. 应该考虑用某个函数来使得线性回归来适应分类问题. 不然分类会变得十分困难,比如在拟合单位阶跃函数时,回归问题就不能迁移到分类问题上来.
$$
y=
\begin{cases}
0, \quad y<z; \\
0.5, \quad z=0; \\
1, \quad z >0;
\end{cases}
$$
线性模型虽然简单,但是在预测$y$ 的衍生物时却显得有些无力. 比如在学习$y$ 的对数作为目标时就显得有些无力. 但是可以对线性回归做相应的变化,使得其容易逼近.
$$
\ln y=W^TX+b
$$
这就是对数几率回归,在形式上仍然是线性回归,但实际上已经是在求输入到输出的非线性映射了. 这里的对数起到了关联输出和输入的作用. 对于更普遍的输出,只需要考虑单调可微的函数$g(\cdot)$ :
$$
y = g^{-1}(W^TX+b)
$$
这样称为广义线性模型,对任意要逼近的目标都是适用的.
阶跃函数是不连续,不可微的. 使用对数几率函数来代替这个函数,使得其满足可微性质.
$$
y=\frac{1}{1+e^{-z}}
$$
对数几率函数也是神经网络中常说的$\sigma$ 激活函数,在神经网络中起到至关重要的作用.
它能够将任意输入放缩到$(0, 1)$ 之间,视为概率.
将$\sigma$ 函数带入广义线性模型中,能够得到:
$$
y=\frac{1}{1+e^{-(W^TX+b)}}
$$
那么将其转换为线性回归的形式:
$$
\ln\frac{y}{1-y}=W^TX+b
$$
如果预测值$y$ 是样本$x$ 为正例的可能性,那么$1-y$ 即是其反例可能性. 二者的比值称为几率,再对其取对数,对数几率函数的名字便由此诞生了. 想要训练这个分类模型,就不能单单再用之前定义过的MSE作为损失函数了. 根据极大似然,只要以类别概率的对数作为损失函数,通过迭代更新参数就行了. 设数据集中样本数为$m$损失函数是:
$$
\ell(w,b)=\sum_{i=1}^m \ln p(y_i\mid x_i;w, b)
$$
如果想要实现多分类,有多种方法可以实现.
- 将Sigmoid函数替换为Softmax函数即可,然后对应的改变损失函数.
- 采用
One vs All
的方法,假设要为三类,则要分别训练三个分类器,每个都将自己要识别的类视为正例,其余两个类全部视为反例. 最终预测时从三个分类器中取最高概率作为该样本的类别. 对于$k$ 类,只需要$k$个分类器. 这么做会导致天然的训练集样本不平衡. 当选择其中一个类为正类时,其余两个类的样本都是反类. - 采用
One vs One
的方法,假设要分三类,则像车轮战一样,每次只训练两个类的样本,最后通过三个分类器的投票来决定样本点的类别. 最终需要$C_k^2$个分类器. 这样一定程度上改善了训练集不均衡的问题,但可能会增加训练资源开销.