【有书共读】《TensorFlow实战》之 4-深层神经网络
上周忙于做实验,没有发读书笔记。争取早日不上。
1 深度学习与深层神经网络
1.1 线性模型的局限性
首先,我们再来回顾下深度学习的定义。维基百科对深度学习的精确定义为:一类通过多层非线性变换对高复杂性数据建模算法的合集。从这个定义中我们可以了解到深度学习两个非常重要的特性:多层,非线性。
为什么强调非线性,因为线性模型在处理复杂问题时具有严重局限性。
只通过线性变换,任意层的全连接神经网络和单层神经网络模型的表达能力没有任何区别。
在现实世界中,绝大部分的问题都是无法线性分割的。因此,我们可以使用非线性激活函数来非线性化神经网络模型。
1.2 激活函数实现去线性化
激活函数在神经网络中的作用就是:如果将每一个神经元(也就是神经网络中的节点)的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了。
常见的神经网络激活函数有:
ReLU函数:f(x)=max(x, 0)
sigmoid函数:f(x)=1/(1+e^(-x))
tanh函数:f(x)=(1-e^(-2x))/(1+e^(-2x))
1.3 多层网络解决异或运算
激活函数实现非线性化,多层网络解决异或运算。当然,异或运算只是一个典型的例子。1958年由Frank Rosenblatt提出的感知机(perceptron)模型从数学上完成了对神经网络的精确建模。但是,感知机可以简单的理解为单层的神经网络,而它却不能模拟异或运算的功能。当加入隐藏层之后,异或问题就可以得到很好地解决。
从这个例子可以看出,深层神经网络实际上有组合特征提取的功能。这个特性对于解决不易提取特征向量的问题(比如图片识别,语音识别等)有很大帮助。这也是深度学习在这些问题上更加容易取得突破性进展的原因。
2 损失函数
神经网络模型的效果以及优化的目标是通过损失函数(loss function)来定义的。
2.1 经典损失函数 & 自定义损失函数
分类问题和回归问题是监督学习的两大种类。
分类问题希望解决的是将不同的样本分到事先定义好的类别中。那么,如何判断一个输出向量和期望的向量有多接近呢?交叉熵(cross entropy)是常用的评判方法之一。交叉熵刻画了两个概率分布之间的距离,它是分类问题中使用比较广的一种损失函数。
对于回归问题,最常用的损失函数就是均方误差(MSE, mean squared error)。
对于相同的神经网络,不同的损失函数会对训练得到的模型产生重要影响。因此,TF不仅支持经典的损失函数,还可以优化任意的自定义损失函数,使得神经网络优化的结果更加接近实际问题的需求。
3 神经网络优化算法
为了让深层神经网络的输出更加的准确,神经网络中各层节点的参数需要不断的优化调整。反向传播算法可以算是神经网络中核心算法。反向传播算法基于梯度下降算法。梯度下降算法主要用于优化单个参数的取值,而反向传播算法给出了一个高效的方式在所有参数上使用梯度下降算法,从而使神经网络模型在训练数据上的损失函数尽可能小。
梯度下降算法并不能保证被优化的函数达到全局最优解。在训练神经网络时,参数的初始值会很大程度影响最后得到的结果。只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解。
除了不一定能达到全局最优,梯度下降算法的另外一个问题就是计算时间太长。为了加速训练过程,可以使用随机梯度下降算法。但是,随机梯度下降算法也存在明显的问题,在某一条数据上损失函数更小并不代表在全部数据上损失函数更小,于是使用随机梯度下降优化得到的神经网络甚至可能无法达到局部最优。
4 神经网络的进一步优化
除了梯度下降算法,还可以通过学习率的设置来控制参数更新的速度。
另外,模型的训练上还可能出现过拟合问题。过拟合的常用避免方法是正则化(regularzation),正则化的思想就是在损失函数中加入刻画模型复杂度的指标。
至于本节介绍的《滑动平均模型》,没有看懂,自己过后还得好好琢磨琢磨。
笔记的最后,提醒自己。
定计划,好坚持。