参考为什么神经网络需要解决多层和非线性问题 - 云+社区 - 腾讯云
维基百科对深度学习的精确定义为“一类通过多层非线性变换对高复杂性数据建模算法的合集”。因为深度神经网络是实现“多层非线性变换”最常用的一种方法,所以在实际中基本上可以认为深度学习就是深度神经网络的代名词。从维基百科给出的定义可以看出,深度学习有两个非常重要的概念,并将通过具体样例------多层和非线性。那么为什么要强调这两个性质?先说明线性模型的局限性,再给出去线性化的方法,最后再说明使用多层的原因。
1、线性模型的局限性
在线性模型中,模型的输出为输入的加权和。假设一个模型的输出y和输入xi满足以下关系,那么这个模型就是一个线性模型。
其中 为模型参数。被称之为线性模型是因为当模型的输入只有一个的时候,x和y形成了二维坐标系上的一条直线。类似地,当模型有n个输入时,x和y形成了n+1维空间中的一个平面。而一个线性模型中通过输入得到输出的函数被称之为一个线性变换。上面的公式就是一个线性变换。线性模型的最大特点是任意线性模型的组合仍然还是线性模型。因为线性模型就能解决线性可分问题,而在深度学习面对的问题至少是无法通过直线(或者高维空间的平面)划分的。在现实世界中,绝大部分的问题都是无法线性分割的。
2.激活函数实现去线性化
如果将每一个神经元(也就是神经网络中的节点)的输出通过一个非线性函数,那么整个神经网络的模型就不再是线性了。这个非线性函数就是激活函数。下图显示了加入激活函数和偏置项之后的神经元结构。
以下公式给出了神经网络结构加上激活函数和偏置项后的前向传播算法的数学定义:
相比于之前新的公式第一个改变是增加了偏置项(bias),偏置项是神经网络中非常常用的一种结构。第二个改变就是每个节点的取值不再是单纯的加权和。每个节点的输出在加权和的基础上还做了一个非线性变换。下图展示了几种常用的非线性激活函数的的函数图像。
这些激活函数的函数图像都不是一条直线。所以通过这些激活函数。每一个节点不再是线性变换,于是整个神经网络也就不再是线性的了,加入ReLU激活函数之后,神经网络的前行传播算法的计算方法为:
输出层的公式为:
目前tensorflow提供了7种不同的非线性激活函数,tf.nn.relu、tf.sigmoid和tf.tanh是其中比较常用的几个。当然,tensorflow也支持使用自己定义的激活函数,下面的代码实现了神经网络的前向传播算法。
a = tf.nn.relu(tf.matmul(x, w1) + biases1)
y = tf.nn.relu(tf.matmul(a, w2) + biases2)
3.多层神经网络解决异或问题
在神经网络的发展历史上,一个很重要的问题就是异或问题。神经网络的理论模型由 Warren McCulloch和Walter Pitts在1943年首次提出,并在1958年由Frank Rosenblatt提出感知机(perceptron)模型,从数学上完成了对神经网络的精确建模。感知机可以简单地理解为单层的神经网络。感知机会将输入进行加权和,然后再通过激活函数最后得到输出。这个结构就是一个没有隐藏层的神经网络。在上世纪60年代,神经网络作为对人类大脑的模拟算法受到了很多关注。然而到了1969年,Marvin Minsky和Seymour Papert在Perceptrons:An Introduction to Computational Geometry一书中提出感知机无法模拟异或运算。深层神经网络实际上有组合提取特征的功能。这个特征对于解决不以提取特征向量的问题(比如图片识别、语音识别等)有很大帮助。这也是深度学习在这些问题上更加容易取得突破性进展的原因。