原 machine learning个人笔记系列(五)
向Andrew Ng的机器学习课程致敬
神经网络(非线性模型)
背景
神经网络最开始的想法是模拟人的大脑运行规律的算法。在上世纪八十年代以及九十年代早期非常火,九十年代后期热度下降。现在又被重新发掘出新的价值,目前依然是许多应用的最尖端的技术。
模型
人脑模型
为了更好的理解神经网络模型,我们先来看看人的大脑是怎么工作的。
如上图所示, 人的大脑主要由神经树突(dendrite),细胞体(cell body),神经轴突(Axos), 髓鞘(Myelin sheath), 轴突末梢(axon terminal)组成。
其中,神经树突相当于输入单元,神经轴突相当于输出单元,细胞体相当于处理单元。神经网络就是这样的一个一个单元拼接起来构成一个网络状,从而担负起我们日常思考的任务。
神经网络模型
而神经网络算法就是模拟的人的大脑,抽象起来,它的模型如下图所示:
其中x1, x2, x3是输入层,a1, a2, a3是隐藏层,是输出的模型。除了输出层,输入层和隐藏层都有偏置单元(bias unit),这个类似于线性方程y=wx+b中b的作用,控制函数偏离原点的距离。
整个模型的运转机制就是,将数据从输入层喂给模型,数据经过中间的隐藏层计算后,到最后的输出层输出模型。
那么,模型到底是怎么计算的呢?
如下图所示:
在上一层单元到下一层单元的每一条连线上都有一个权重参数。
我们用来表示从j层映射到j+1层的参数向量。而每个计算单元表示为。
当前层的输入是上一层所有单元的输出与参数的加权和。通过一个称之为**函数的映射函数,当输入映射为当前计算单元的输出。
最普遍使用的**函数是信号函数:
神经网络前向传播算法
给定所有参数组合起来的矩阵,如何通过训练数据来求出模型的预测值呢?
如图所示,我们使用一种称之为前向传播的算法来求解模型预测值。直观的就是,将每个输入数据一层一层求解,每一层求解的时候需要加上一个偏置单元。中间的计算单元则需要用**函数将输入映射为输出。即
模型应用举例
AND
逻辑与操作,使用神经网络模型来模拟,如下图所示:
OR
逻辑或操作,使用神经网络模型来模拟,如下图所示:
XNOR
复杂一点的逻辑非异或操作,使用神经网络模型来模拟,如下图所示:
多分类问题
神经网络模型还可以用来解决多分类问题,如下图所示:
将输出层由一个输出单元扩到多个输出单元,模型输出值演变成一个向量,向量的每个值表示该数据该数据被模型分类为某类的概率。如图中所示,当
表示模型预测为pedestrain。真实值可能是第一个小于1,其他的都大于0,取概率最大的为其分类即可。
损益函数
我们以多分类模型来计算损益函数,二分类是多分类的一个特例,因此多分类模型的损益函数具有普适性。
多分类模型如下图所示:
则损益函数如下图所示:
相当于输出的k个逻辑回归损益函数,再加上所有参数的平方和作为正则项。
优化方法
之前是给定参数,使用前向传播算法求出样例的预测值。现在再来看看,如何求解最优参数使模型达到一个比较好的效果。
神经网络参数求解有一个著名的算法,叫做后向传播算法(Backpropagation algorithm),其算法逻辑如下:
其基本思想就是先用前向传播算法求解输出,然后根据输出预测值与真实值的差异来一层一层反向调整参数的值。
推导建议看这篇博客
梯度校验
为了能判断是否我们的计算参数值使损益函数在收敛过程中,需要一个直观简单的方式来验证是否计算的损益函数是正常收敛中。后向传播算法实际上也是类似用梯度下降的方式来优化参数,即使用偏导来求解。我们知道,导数实际上是以公式的极限值:
因此使用反向传播每次迭代求出来的参数差值应该跟使用上面公式右边是相近的。
根据这层关系,可以在每次迭代求解参数时,用这个公式计算一下值,然后跟后向传播算法计算的值比较一下,如果相近,说明没有计算错。
计算过程如下:
随机初始化
考虑到参数初始时,如果全部初始化为0,则没有训练效果。因此将其初始化为
模型训练
如下图所示:
先构造一个神经网络模型,输入层单元个数是特征维度,输出层单元个数是分类个数,中间是需要构造的隐藏层。一般越多隐藏层越好,但是计算量也会更大。
训练模型时,有6个步骤,分别列在下面两张图里。