4.1 从逻辑回归说起

第2章提到传统机器学习算法时,就提到了逻辑回归算法。

(1)随机初始化一组ω,比如可以全设为0,当然实际上不推荐这样。

(2)训练集中,逻辑回归函数里,输入特征x,计算ωTx,得到预测结果ŷ。

(3)计算全部训练集中逻辑回归的结果ŷ和实际y的差别。

(4)根据上一步的差别更新ω。

(5)重复(2)~(4)若干次(iterations)。

这个算法,可以用如下简单的框架表示:

注意,在第2章的代码中,为了省事,将这里的x输入换成了[x, 1],加了一个维度,此时两个输入ω、b就合并成了一个新的ω。

其次图中的双箭头代表了两个过程:

  • 从左到右、从下到上的箭头代表了算法第二步得到预测结果的过程(MSE处与y比较除外,是第三步)。
  • 从右往左、从上往下的箭头代表了算法第四步中更新算法ω、b的过程。

这里将算法框架化之后,我们有一个想法,就是能不能把这个框架加点东西,比如变成这样:

或者这样:

当然,读者还可以继续思考,设计新的框架。这里,以上两种模型成了逻辑回归的“并联”“串联”形式。其中,“并联”形式类似民主投票,即可以训练多个逻辑回归模型,每个模型给一个测试样本预测一个结果,然后多个模型汇总结果,比如70%的模型都通过这个样本属于某个分类,则这个结果就被预测成这种分类。这种思路逐渐发展成了模型的聚合(Ensemble)方法,即通过多个弱分类器进行组合,形成一个强分类器。我们在第9、10章时使用的模型融合策略就是基于这种思想。这部分更多的内容,有兴趣的可以继续阅读周志华老师的《机器学习》一书做更深入了解。“串联”形式则不断加大同一模型的复杂程度,继而通过更复杂的模型实现单一分类器表现的提升。这个思路逐渐发展成为神经网络算法,并且随着网络深度逐步提升,模型中零件由乘法+sigmoid激活函数,换成卷积池化+relu激活函数,更是进一步奠定了目前火热的深度学习算法的基石。

本章讲一讲如何用简单的代码来实现“串联”形式的计算过程。我们先来说算法,仍然基于之前逻辑回归的算法:

(1)随机初始化一组ω,比如可以全设为0,当然实际上不推荐这样。

(2)训练集中,逻辑回归函数里输入特征x,计算ωTx,得到预测结果ŷ。

(3)计算全部训练集中逻辑回归的结果ŷ和实际y的差别。

(4)根据上一步的差别更新ω。

(5)重复(2)~(4)若干次(iterations)。

这里第二步、第四步有所改动。其中第二步无非是加了一层计算,比较好办,麻烦的其实是第四步,怎么更新多组数字?之前一组数字可以直接求损失函数对应参数的导数,然后乘以一个很小的学习率,减去这个数,就更新了。现在换成多组数字,怎么分别求损失函数对这些数字的导数?如果说,这里只是多了一层,直接数学推导还比较容易的话,再多几层,又应该怎么办?

仔细想一想,这个推导的过程也并非无规律可循。上一级的神经网络梯度输出会被用作下一级计算梯度的输入,同时下一级计算梯度的输出会被作为上一级神经网络的输入。于是就思考能否将这一过程抽象化,做成一个可以自动求导的框架?OK,以TensorFlow为代表的一系列深度学习框架正是根据这一思路诞生的。