从线性模型到神经网络

本文以 ppt 的形式讲解传统机器学习的线性模型是如何“演变”成为神经网络的。神经网络作为线性模型(神经元)的集体连接,是如何克服单个神经元的局限的。

本文的思路是先介绍线性模型,再从模型集成的视角引入(全连接前馈)神经网络 DNN 。之后介绍 DNN 的训练、实现和应用。

此为线性回归模型的示意图、计算式和训练方法。从计算式的最后一个 = 号可看出:输入向量 x 被投影到权值向量 w 的方向上。于是 x 在垂直于 w 的方向上的信息全部丢失。所以,如果用输出 y 作为分类依据,那么只能得到线性的分界面,即 p 维空间中的一个 p-1 维仿射集——超平面(Hyperplace)。如果自变量空间是 2 维的,则分界面是一条直线。

此为线性回归模型的图形。为了可以视觉呈现,令自变量空间为 2 维,即有两个特征。红色箭头是权值向量 w 的方向(长度做了缩放)。可看出,函数图形是 p+1 (2+1=3)维空间中一个平面。它沿 w 方向“上坡”。函数的等高线是垂直于权值向量 w 的直线。

对线性回归模型的输出施加一个非线性的激活函数,比如 Logistic 函数(其图形是 Sigmoid 曲线)。输出 y 被 Logistic 函数压缩到 (0,1) 区间内。将 y 作为样本为正例的概率,使用交叉熵作为损失函数进行优化,使模型判断的某样本类别分布接近观察到的类别分布(One-Hot:正确的类别概率为 1 ,其余类别概率为 0)。从贝叶斯视角来看,这种优化也使样本的似然概率达到最大。这个模型就是逻辑回归模型。

逻辑回归模型虽然在输出上施加了非线性的 Logistic 激活函数,但它仍不具备非线性分类能力。 x 在进入计算一开始就先向 w 方向做了投影。垂直于 w 的方向上的信息仍然丢失了。和线性回归一样,逻辑回归只能得到线性分界面。所不同的是逻辑回作为广义线性模型,假定目标值服从指数分布族中的二项伯努利分布,并假设分布的期望是特征的仿射函数(第二个假设是广义线性回归一致采用的假设)。这些假设导致了 Logistic 激活函数。若想超越线性分类,则必须引入模型集成。

安排 3 个逻辑回归模型,将它们的输出线性组合(并加上偏置)就得到以上展示的模型。该模型可视作 3 个逻辑回归的 ensemble ,具体来讲是 model stacking 。该模型同时也是一个两输入,单输出,单隐藏层,隐藏层激活函数为 Logistic ,输出层无激活函数的全连接神经网络。回过头来,线性回归模型和逻辑回归模型其实是多输入单输出,无隐藏层,无激活函数或激活函数为 Logistic 的“全连接”神经网络。

这样的模型可以形成非线性的分界面。要形成非线性分界面,网状结构和非线性激活函数缺一不可。如果缺乏网状结构,x 经过投影其信息只在 w 方向上有变化。若缺乏非线性激活函数,则无论有多少层,网络仍然是一个线性回归。

此处插入一个动图(gif)。呈现的就是 page 7 中的神经网络的训练过程。与 page 7 中的网络稍有不同的是:本网络的输出层有两个神经元,对这两个神经元的输出施加 softmax ,使它们成为一个二分类概率。数据采用同心圆数据集(2 维特征),外围的点为正例,中心的点为负例。以交叉熵为损失函数(softmax 和交叉熵在后文中阐述)。

左上图呈现预测概率值曲面随着训练的变化;右上图是预测概率值等高线图;右下是损失函数(交叉熵)下降曲线以及训练集和测试集上的正确率(accuracy)曲线;左下图很有意思。它展示网络的 3 个隐藏层神经元对全体样本的输出(三维空间中的点),以及由输出层神经元的权值和偏置所决定的分界面。从右上图可以看出,隐藏层 3 个神经元的权值决定了三个方向,这三个方向分别负责把该方向上一端的红色点与其它点分离开,但是另一点仍然蓝点红点混杂,这是数据呈同心圆分布所决定的。等高线图的蓝色区域大致由三条直线构成,这就是三个隐藏层的分界直线。左下图显示隐藏层输出的点在三维空间上的分布。投影到某个坐标轴:一端分离出一部分红点;另一端蓝点红点混杂。但在其它坐标轴上,这些混杂的点能被分开。在整个三维空间中红蓝点可以被一张平面分开。输出层有两个神经元,谁的输出更大决定了网络对样本点如何分类。它们输出相等的点是三维空间中一张平面,这正是一张能够把隐藏层输出点分开的平面。

激活函数不仅限于 Logistic。此处展示了几种激活函数。ReLU 是深度学习中常用的激活函数。ReLu 虽然不像 Logistic 和 Tanh 那样“弯弯绕”,但是它单边扬起的形状足以在“网络+激活”条件下提供足够的拟合能力。

多层全连接神经网络的示意图以及计算式。那个圆符号表示对向量的每个元素施加 f 。

函数在(自变量空间中)某位置的梯度向量指向原函数一阶泰勒展开(近似超平面)的上升方向。那么梯度的反方向就是该近似超平面的下降方向,也是原函数在该点小局部内下降最快的方向。

梯度下降法计算当前位置的梯度,沿反方向行走一个小距离来到新位置,再次计算梯度,重复此过程,迭代地(尽量)寻找使损失值更小的自变量位置。梯度向量的各分量是原函数对自变量各分量的偏导。

如果把梯度场视作速度场,梯度下降其实就是数值模拟质点在空间中的运动。好消息是:梯度场是保守场,原函数是该保守场的势能。保守场中的极小点是李雅普诺夫稳定的,且不存在奇异吸引子。坏消息是:该好消息无甚卵用。对于非凸函数,存在局部极小、鞍点等讨厌情况。梯度下降法有一些变体。它们在方向和步长上做文章,以求在非凸情况下尽可能加速和保证收敛。

视权值和偏置为自变量,利用梯度下降最小化全体训练样本的平均损失函数。对于回归问题,损失函数是样本的预测值和真实值之间欧式距离平方(2-范数)。对于多分类问题,常用的做法是对输出施加 softmax 后视作类别概率分布,然后最小化预测分布与观察分布的交叉熵。观察分布就是正确的类概率为 1 ,其余类概率为 0 (One-Hot)。

简述交叉熵。K-L 散度衡量分布 p 与 q 之间的相似程度。p 与 q 的交叉熵等于 p 与 q 的 K-L 散度加上 p 的熵。在分类模型的训练中,p 是观察到的分布,q 是 模型预测的分布。 因为 One-Hot 分布的概率全部集中在一个类别上,所以 p 的熵为 0 。故最小化交叉熵就是最小化 K-L 散度。这会使模型的预测分布与观察分布尽可能接近。同时交叉熵也是训练样本的对数似然(log likelihood)的相反数。

反向传播算法。以上展示的是全连接神经网络的一个局部。计算损失函数 L 对各权值 w 的偏导,最关键的是计算 L 对每一个神经元激活水平 v (输入经过线性组合,但还没有施加激活函数时那个值)的偏导,姑且叫 delta 。有了这些 delta ,每个权值的偏导就很容易计算了——就是该神经元的 delta 乘上权值所在边上当前的输入。

有了后一层各个神经元的 delta ,前一层各神经元的 delta 也容易计算。就是本页下部的公式。这里建议将图中所示这部分计算分成 3 段,第一段是第 k 层某个神经元的激活水平 v 经过 f 到输出 x 的计算;第二段是第 k 层该神经元的输出 x 到 k+1 层各神经元激活水平 v 的计算;第三段是第 k+1 层各神经元激活水平 v 到最终损失函数 L 的计算。三个函数复合在一起。根据链式法则,L 对第 k 层那个神经元的 v 的导就是三个函数的导矩阵连乘。这里注意: m 到 n 的函数的导“数”其实是一个 n x m 矩阵,表示一个 m 到 n 的线性变换。

至此,全连接神经网络的反向传播梯度下降的迭代公式就呼之欲出了。注意一点:对于分类问题,输出经 softmax 并以交叉熵为损失函数时,输出层神经元的 delta 计算推导稍复杂,但美妙的是结果的形式与损失函数是平方误差时是一致的,都是本页反向传播部分第一个式子。

作者用 python 和线性代数库 numpy 实现了一个多层全连接神经网络。以上展示用它对 3 种函数进行拟合的效果。

https://github.com/zhangjuefei/mentat/blob/master/mentat/model/dnn.py

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇