假设今天希望将机器学习应用到医院中去, 比如对于某一个患了心脏病的病人, 求他 3 个月之后病危的概率. 那么我们该选择哪一个模型, 或者可以尝试已经学过的线性回归?
但是很遗憾的是, 如果我们要利用线性回归, 我们收集到的资料中应当包含病人 3 个月后病危的概率. 这在实际中是很难得到的, 因为对于一个患病的病人, 你只能知道他 3 个月后到底是病危或者存活. 所以线性回归并不适用这种场景.
logistic 函数
上面提到我们最终的目标是一个概率值 \(P(y|x)\), 这里 \(y=+1\)指代病人 3 个月后病危这个事件;\(y=-1\)指代病人 3 个月后存活这个事件. 显然 \(P(-1|x) = 1 - P(1|x)\).
我们先前学过线性回归, 知道可以通过加权的方式求出各项特征的'分数', 那这个分数怎么转换为一个概率值? 这里就需要引入一个 logistic 函数. 它的表达式为:\[ \theta(s)=\frac{1}{1+e^{-s}} \]
它的图像如下所示:
可以看到这个函数有十分不错的性质:
- \(\theta(-∞)=0, \ \theta(+∞)=1\)
- \(1-\theta(s)=\theta(-s)\)
也就是说我们可以把加权得到的'分数'通过 logistic 函数转化为一个概率值, 并且加权得到的'分数'越大, 这个概率值也越大. 这真的还蛮有道理的.
好了, 我们的模型已经定义完毕了, 称它为逻辑回归模型:\[ \begin{equation} h(x) = \frac{1}{1+e^{-w^Tx}} \ \ \ \ \ w,x 都是向量 \end{equation} \]
也就是说, 我们获取到一个病人的特征 \(x\), 将它输入模型, 就能知晓这个病人 3 个月后病危的概率. 但是, 还有最重要的一步, 这个模型的参数 \(w\)如何确定? 不同的参数 \(w\)会带来不同的模型 \(h(x)\). 经验告诉我们可以从已获得的资料中找到一些端倪获取最合适的 \(w\).
损失函数
线性回归中, 我们定义了一个平方损失函数, 通过对损失函数求导数得到最后的参数. 那依样画葫芦, 我们也为逻辑回归定义一个损失函数, 然后试着对损失函数求梯度, 是不是能解出最后的参数了. 那么想一下, 逻辑回归的损失函数如何定义? 还用最小二乘法么? 这显然不符合场景, 毕竟已有的资料只告诉我们每一组数据对应的结果是哪一类的.
我们还是从数据的产生来分析, 现在已有的数据是这些:\[ D = {(x_1, 1), (x_2, 1), (x_3, 1), ... , (x_n, -1)} \]
当然, 这些数据的产生是相互独立的, 所以获得 \(D\)这笔资料的概率就是 \[ \begin{equation} P(x_1, 1) * P(x_2, 1) * P(x_3, 1) * ... * P(x_n, -1) \end{equation}\]
再将 (2) 式写为条件概率分布 \[ \begin{equation} P(x_1)P(1|x_1) * P(x_2)P(1|x_2) * P(x_3)P(1|x_3) * ... * P(x_n)P(-1|x_n) \end{equation}\]
再者, 假设每一笔数据的产生服从 0-1 分布.\[\begin{equation} P(y|x_i) = \left \{ \begin{array}{lr} f(x_i) \ \ \ \ \ \ \ \ \ \ y=+1 \\ 1 - f(x_i) \ \ \ \ \ y=-1 \end{array} \right. \end{equation}\]
所以最后写成的形式:\[\begin{equation} P(x_1)f(x_1) * P(x_2)f(x_2) * P(x_3)f(x_3) * ... * P(x_n)(1-f(x_n)) \end{equation}\]
也就说这笔资料 \(D\)由真正的模型 \(f(x)\)产生的话, 概率是 (5) 这么大. 但是我们不知道真正的模型 f(x)长什么样子, 我们现在只知道我们自己定义了一个模型 \(h(x)\), 它长成 (1) 这个样子. 所以现在的任务就是从很多的 \(h(x)_1, h(x)_2, h(x)_3, ..., h(x)_m\)中找到其中一个最接近真正的模型 \(f(x)\)并将它作为我们最后的 \(h(x)\).
所以如何衡量 \(h(x)\)与 \(f(x)\)的接近程度? 如果我们现在用 \(h(x)\)代替 \(f(x)\)去产生这组数据集 \(D\)也能得到一个概率(6).\[\begin{equation} P(x_1)h(x_1) * P(x_2)h(x_2) * P(x_3)h(x_3) * ... * P(x_n)(1-h(x_n)) \end{equation}\]
使得 (6) 式的概率最大的那个 \(h(x)\)我们会认为它与 \(f(x)\)最相似, 这就是最大似然的思想. 又因为对于所有的 \(h(x)_i\)产生的概率:\[\begin{equation} P(x_1) * P(x_2) * P(x_3) * ... * P(x_n) \end{equation}\]
这部分都是相同的, 所以我们认为最接近 \(f(x)\)的 \(h(x)\)能使 (8) 最大即可
\[\begin{equation} h(x_1) * h(x_2) * h(x_3) * ... * (1-h(x_n)) \end{equation}\]
再由于 logistic 函数的第 2 个性质, 可以将 (8) 变形:
\[\begin{equation} h(x_1) * h(x_2) * h(x_3) * ... * h(-x_n) \end{equation}\]
最终的目标是解出下面这个优化问题:\[\begin{equation} \mathop{max}\limits_{w} \ \ \prod_{i=1}^{n}h(y_ix_i) \end{equation}\]
再次变形, 求一个式子的最大值, 相当于求它相反数的最小:\[\begin{equation} \mathop{min}\limits_{w} \ \ -\prod_{i=1}^{n}h(y_ix_i) \end{equation}\]
接下来我们要对 (11) 式取对数, 一方面原因是因为对数函数的单调特性, 另一方面是能将原来的连乘简化到连加, 所以取对数后:\[\begin{equation} \mathop{min}\limits_{w} \ \ -\sum_{i=1}^{n}\ln{h(y_ix_i)} \end{equation}\]
将 \(h(x)\)展开, 能得到 \[\begin{equation} \mathop{min}\limits_{w} \ \ -\sum_{i=1}^{n}\ln{\frac{1}{1+e^{-y_iw^Tx_i}}} \ \ \ \ \ \ \ \ \ \ w 与 x_i 都是向量, x_i 表示第 i 笔数据 \end{equation}\]
再一次 \[\begin{equation} \mathop{min}\limits_{w} \ \ \sum_{i=1}^{n}\ln{(1+e^{-y_iw^Tx_i})} \ \ \ \ \ \ \ \ \ \ w 与 x_i 都是向量, x_i 表示第 i 笔数据 \end{equation}\]
大功告成, 我们得到了逻辑回归的损失函数, 它长成 (15) 式这个样子 \[\begin{equation} J(w)= \sum_{i=1}^{n}\ln{(1+e^{-y_iw^Tx_i})} \ \ \ \ \ \ \ \ \ \ w 与 x_i 都是向量, x_i 表示第 i 笔数据 \end{equation}\]
我们的目标就是找到最小化 \(J(w)\)的那个 \(w\). 就像在线性回归中做的那样, 接下来我们要利用链式法则对它求导:\[\begin{equation} \frac{\partial J(w)}{\partial w_j} = \sum_{i=1}^{n}\frac{\partial \ln{(1+e^{-y_iw^Tx_i})}}{\partial (-y_iw^Tx_i)} * \frac{\partial (-y_iw^Tx_i)}{\partial w_j} \end{equation}\]
化解得到 \[\begin{equation} \frac{\partial J(w)}{\partial w_j} = \sum_{i=1}^{n}\frac{e^{-y_iw^Tx_i}}{1+e^{-y_iw^Tx_i}} * (-y_ix_{i,j}) \ \ \ \ x_{i,j}是个标量, 是第 i 笔数据中第 j 个分量 \end{equation}\]
所以对于整个向量 \(w\)的梯度为 \[ \begin{equation} \frac{\partial J(w)}{\partial w} = \sum_{i=1}^{n}\frac{e^{-y_iw^Tx_i}}{1+e^{-y_iw^Tx_i}} * (-y_ix_i) \ \ \ \ 想象将对单个 w_i 的结果笔直堆成一个向量 \end{equation}\]
而 \(\frac{e^{-y_iww^Tx_i}}{1+e^{-y_iww^Tx_i}}\)正好是逻辑回归函数, 所以最终对 \(w\)的梯度写成下面这个样子 \[ \begin{equation} \frac{\partial J(w)}{\partial w} = \sum_{i=1}^{n}h(-y_iw^Tx_i)(-y_ix_i) \end{equation}\]
很遗憾, 我们令 (19) 等于 0 的话, 很难求解出 \(w\). 为此, 我们需要用额外的方法求解这个问题.
梯度下降
这个可学习的资料太多了, 思想就是假设函数上有一个点, 它沿着各个方向都有它的方向导数, 那么总是沿着方向导数最大的反方向走, 也就是梯度的反方向走, 这个点总是能走到最低点. 每一次移动的距离用一个系数 lr 来表示, 每次更新 \(w\), 数次迭代之后,\(w\)趋近于最优解:\[ \begin{equation} w_{i+1} := w_{i} - lr * \sum_{i=1}^{n}\frac{e^{-y_iw^Tx_i}}{1+e^{-y_iw^Tx_i}} * (-y_ix_i) \ \ \ \ \ lr 是大于 0 的系数 \end{equation}\]
来源: https://www.cnblogs.com/shayue/p/10520414.html