写在前面:[本篇博文参考吴恩达的《机器学习》课程——浅层神经网络、周志华《机器学习》。
墙裂建议大家先看一下知乎里的一个博主的回答,如何简单形象又有趣的讲解神经网络是什么,非常适合入刚上路的小白。
同时推荐大家先学习机器学习之路——logistic回归后再来看这篇博客。]
今天来讲一下神经网络,神经网络这个概念很早以前就已经有人提出,目前神经网络是一个相当大的、多学科交叉的领域。许多复杂的应用(比如模式识别、自动控制)和高级模型(比如深度学习)都基于它。
神经网络中最基本的成分是神经元模型。在生物网络中,每个神经元与其他神经元互联,当它”兴奋”时,就会像其相连的神经元发生化学物质,从而改变这些神经元的电位;如果某个神经元的电位超过一个”阈值”,那么它就会被激活,即”兴奋”起来,向其他神经元发送化学物质。
如图中所示,一个神经元经过其他多个神经元的输入”刺激”,刺激达到阈值后,则该神经元则会通过发送化学物质来”刺激”其他神经元。举一个简单的例子来说明一下简单的神经网络:
假如我想到游泳馆游个泳,影响我去还是不去的有三个因素:
- 室外温度是否合适;( x1 x 1 )
- 价格是否合适;( x2 x 2 )
- 心情是否美滋滋;( x3 x 3 )
这就构成了一个简单的感知器,上面三个因素就是外部输入,最后的决定就是感知器的输出。如果三个因素都是 Yes(使用1表示),输出就是1(去游泳);如果都是 No(使用0表示),输出就是0(不去游泳)。
如果某些因素成立,某些因素不成立,则需要通过计算权重相加,并判断是否大于阈值来判断去还是不去游泳。假设三个输入的权重分别为 w1=4 w 1 = 4 、 w2=2 w 2 = 2 、 w3=4 w 3 = 4 ,阈值为5,只要大于阈值则最终决定去游泳,否则不去。
神经网络表示
将上文中的例子抽象起来就如下所示,
图中 x1,x2,x3 x 1 , x 2 , x 3 为感知机的输入,
为加权后的结果,图中采用的是 wT w T 是将权重w矢量化表示,后面会再介绍矢量化。
圆圈右半部分
则是将加权值通过”激活函数 σ(z) σ ( z ) ”非线性化的最终输出结果。因为现实中,很多分类是非线性的,因此需要通过”激活函数”将其非线性化。
这里的”激活函数 σ(z) σ ( z ) ”为sigmoid函数,其表达式和函数图像如下:
通过函数图像可以看出该函数输出值在(0,1)之间,对分类的情况很友好,而且函数是连续可导的,但也有缺点,就是饱和的时候梯度太小。一般激活函数的选择较多,后面会单独写一篇博客来介绍激活函数,这里入门先用该函数来进行讲解。可以简单理解为激活函数作为非线性化的一种转换。各位可以移步我之前的博客机器学习之路——logistic回归里面有简单的相关介绍。
单层隐藏层的神经网络
一般应用中神经网络都是很复杂的,一般是由输入层(input layer),隐藏层(hide layer),输出层(output layer)组成。隐藏层不是必须的,但是没有隐藏层的神经网络是线性的,只能处理线性可分的问题,就相当于线性的Logistic模型。
下图为仅有一层隐藏层的神经网络:
其中 x1,x2,x3 x 1 , x 2 , x 3 是输入的样本属性值,可以理解为文章开头的例子中的”室外温度”、”价格”、”心情”,whatever,就是训练样本属性值。样本数据通过隐藏层的处理,最终输出层导出我们模型处理后的结果。先来看红色虚线左边部分,这里数据我们用向量化进行表示,因为向量化的运算会提升效率,如果样本比较多的话一个一个的计算会消耗大量时间,