机器学习笔记——神经网络(neural networks)

神经网络

非线性假设

对于非线性假设而言,当特征足够多的时候,如果我们仍采用多项式进行线性拟合,那么我们将获得数量非常庞大的高次项,这使得计算变得非常复杂。出于这个原因,我们受到人脑的启发,提出了神经网络

我们可以将logistic单元表示成神经元的形式,中间的神经元代表假设函数h,左侧是输入,右侧是输出

如果我们的输入输出之间经过了多层计算,这样一种结构我们就叫做神经网络

前向传播

为了计算最终的输出,我们可以用前向传播的方法,顾名思义就是由输入一层层向右迭代计算输出

我们把输入特征的层叫做输入层,输出结果的层叫输出层,而中间的层我们统一称为隐藏层

多元分类

对于分类问题,如果输出是多元的,那我们需要构建一个向量来表示输出属于哪一类

反向传播

代价函数

我们已经讲了神经网络的大致结构,那么它的代价函数是什么呢?我们以多元分类问题举例,实际上神经网络的代价函数就是把每一个输出的代价函数求和就得到了最终的代价函数(其中还包括正则化的项)

那么有了代价函数,我们怎么求它的最小值呢?我们知道要计算最小值,需要计算代价函数以及代价函数对各个系数的偏导,那么这个计算的过程就叫做反向传播。我们可以由如下过程求出偏导数。我们可以看出我们先定义了输出层的误差δ,也就是最后的输出结果与实际值(1或0)的差值,然后再根据一系列公式(在此就不再推到了)计算出代价函数对每个参数的偏导数

以上是一组数据的情况,那么对于m组训练数据,我们可以采用如下的算法计算偏导数

让我们再来回顾一下上面的过程:首先我们根据一组训练数据从左到右正向计算出输出的值

然后我们再根据输出结果与偏导数计算公式从右到左反向一级级计算出δ,最后计算出偏导数

在得到了代价函数与代价函数对参数的偏导数之后我们就可以利用一些集成的来计算出代价函数的最小值了。需要注意的是我们在表示系数的时候我们一般将系数写成矩阵的形式(每一层有一个系数矩阵),但是在matlab中调用这些高级函数(例如fminunc)需要我们将这些矩阵展开成向量的形式

梯度检测

由于反向传播算法比较复杂,很多时候它很多时候容易出问题。正是这样,我们需要梯度检测来证明我们的结果是否正确。我们会采用导数逼近的形式来观察我们的梯度求得是否正确

以下是高维的情况

由于梯度检测的过程远比神经网络的计算过程计算量大,因此我们一般只进行一次梯度检测,之后将其关闭,再来运行反向传播的代码

还需要注意的是我们在初始化参数的时候不能像logistic回归一样简单地将每个参数置0,因为这会导致对称性权重(symmetry weight)问题,因此我们需要随机化初始参数来进行初始化

总结

下面让我们来对训练神经网络的过程做一个总结。首先我们需要选择一个网络结构,一般来说我们选择一层隐藏层就行

之后我们按以下几个步骤对神经网络进行训练

很多时候代价函数是非凸函数,算法会收敛到局部最小值,但是我们在实操的时候可以知道就算收敛到局部最小值我们仍能取得很好的效果

猜你喜欢

转载自blog.csdn.net/shanwenkang/article/details/85006604
今日推荐