对比第三节中的 Adaline 和 Logistic Regression,可以发现它们只有两点不同:1、激活函数,Adaline 中的激活函数是恒等函数(线性),而 Logistic Regression 中的激活函数是 Sigmoid 函数(非线性);2、损失函数,Adaline 中的损失函数是均方误差,而 Logistic Regression 中的损失函数则是交叉熵。
Sigmoid 函数如图所示,其值域为 0 到 1,输入为 0 时取值为 0.5
h 即 hypothesis,就是我们的模型,由于 h(x) 也是 Sigmoid 激活函数的输出,取值为 0 到 1,所以可以将其视为概率,还是给定输入 x 的条件下输出 y = 1 的后验概率。在二分类的情况下,显然 y = 0 的后验概率就是 1 - h(x)。我们希望的,就是当实际标签 y = 1 时,其后验概率 h(x) 越接近 1 越好;当实际标签 y = 0 时,其后验概率 1 - h(x) 也是越接近 1 越好。即最大化后验概率。
y 在不同取值下的后验概率,实际上可以写成一条式子,如图所示,a 就是 h(x)。
我们希望的不止是某个训练样本,而是整个训练集上样本的后验概率(乘积)最大化,想求得当模型参数取什么值时,能达到这个目标,这也称为最大似然估计。
用一个符号 L(w) 来表示当参数为 w 时,整个训练集上的后验概率乘积,这称为似然损失。
方便起见,对似然损失取对数,使其变为对数似然损失,就可以将乘法转化为加法。
由于习惯上是进行梯度下降来最小化某个函数,所以得将最大化对数似然损失,加个负号,变成最小化负对数似然损失。
简单小结一下,Logistic Regression 和 Adaline 只有激活函数和损失函数不相同,而最大化似然损失 = 最大化对数似然损失 = 最小化负对数似然损失。
Sigmoid 函数及其导数的公式与图像
负对数似然损失的图像,可以看到,当实际标签为 y = 1 时,预测值 h (即激活函数的输出)越大(接近 1),损失就越小(接近 0)。
求取损失关于参数的偏导数(即梯度),使用链式法则,分别求损失(负对数似然损失)关于激活值的导数、激活函数(Sigmoid 函数)关于加权和输入的导数、以及加权和关于参数的导数。
非常巧妙地,Sigmoid 函数的导数是可以抵消负对数似然函数导数的分母部分的,最后的偏导数(梯度)就十分简单了。
(b) 部分用的就是上面求梯度的结果,(c) 部分还是用负梯度乘上学习率进行参数的更新。
到目前为止介绍的都是训练部分,用的是激活函数的输出 + 实际标签来求取梯度,然后更新参数,并没有进行激活函数的输出到预测标签的转换。
转换的方法其实也很简单,就是阈值函数。既可以将激活函数的输出是否大于 0.5 作为阈值,也可以将加权和(激活函数的输入)是否大于 0 作为阈值,这是因为 Sigmoid 函数输入 0 时正好取值为 0.5
最后是对两个术语的解释,首先是 “Logits”,在深度学习中,logits 就是输出层的输入;在统计学和 logistic regression 中, logits 是 log-odds 的简写,也就是对数几率 logp1−p\log {p \over {1 - p}}log1−pp(几率就是概率 p 和 1- p 的比),然后用线性回归 wTx{w^T}xwTx 去拟合它,得到 logp1−p=wTx=z\log {p \over {1 - p}} = {w^T}x = zlog1−pp=wTx=z,最后可以得到 p=11+e−zp = {1 \over {1 + {e^{ - z}}}}p=1+e−z1,即为 logistic sigmoid 函数。
其次就是交叉熵,负对数似然函数来自统计学,二元交叉熵来自信息论,它们实际上是一样的,多分类中的多元交叉熵公式也是类似。
实现代码在这里。