写在前面:[本篇博文参考吴恩达的《机器学习》课程——浅层神经网络、周志华《机器学习》。
墙裂建议大家先看一下知乎里的一个博主的回答,如何简单形象又有趣的讲解神经网络是什么,非常适合入刚上路的小白。
同时推荐大家先学习机器学习之路——logistic回归后再来看这篇博客。]
今天来讲一下神经网络,神经网络这个概念很早以前就已经有人提出,目前神经网络是一个相当大的、多学科交叉的领域。许多复杂的应用(比如模式识别、自动控制)和高级模型(比如深度学习)都基于它。
神经网络中最基本的成分是神经元模型。在生物网络中,每个神经元与其他神经元互联,当它”兴奋”时,就会像其相连的神经元发生化学物质,从而改变这些神经元的电位;如果某个神经元的电位超过一个”阈值”,那么它就会被激活,即”兴奋”起来,向其他神经元发送化学物质。
如图中所示,一个神经元经过其他多个神经元的输入”刺激”,刺激达到阈值后,则该神经元则会通过发送化学物质来”刺激”其他神经元。举一个简单的例子来说明一下简单的神经网络:
假如我想到游泳馆游个泳,影响我去还是不去的有三个因素:
这就构成了一个简单的感知器,上面三个因素就是外部输入,最后的决定就是感知器的输出。如果三个因素都是 Yes(使用1表示),输出就是1(去游泳);如果都是 No(使用0表示),输出就是0(不去游泳)。
如果某些因素成立,某些因素不成立,则需要通过计算权重相加,并判断是否大于阈值来判断去还是不去游泳。假设三个输入的权重分别为 w1=4 w 1 = 4 、 w2=2 w 2 = 2 、 w3=4 w 3 = 4 ,阈值为5,只要大于阈值则最终决定去游泳,否则不去。
将上文中的例子抽象起来就如下所示,
圆圈右半部分
这里的”激活函数 σ(z) σ ( z ) ”为sigmoid函数,其表达式和函数图像如下:
通过函数图像可以看出该函数输出值在(0,1)之间,对分类的情况很友好,而且函数是连续可导的,但也有缺点,就是饱和的时候梯度太小。一般激活函数的选择较多,后面会单独写一篇博客来介绍激活函数,这里入门先用该函数来进行讲解。可以简单理解为激活函数作为非线性化的一种转换。各位可以移步我之前的博客机器学习之路——logistic回归里面有简单的相关介绍。
一般应用中神经网络都是很复杂的,一般是由输入层(input layer),隐藏层(hide layer),输出层(output layer)组成。隐藏层不是必须的,但是没有隐藏层的神经网络是线性的,只能处理线性可分的问题,就相当于线性的Logistic模型。
下图为仅有一层隐藏层的神经网络:
其中 x1,x2,x3 x 1 , x 2 , x 3 是输入的样本属性值,可以理解为文章开头的例子中的”室外温度”、”价格”、”心情”,whatever,就是训练样本属性值。样本数据通过隐藏层的处理,最终输出层导出我们模型处理后的结果。先来看红色虚线左边部分,这里数据我们用向量化进行表示,因为向量化的运算会提升效率,如果样本比较多的话一个一个的计算会消耗大量时间,
现在再来看上图中红色虚线右边部分,隐藏层输出的 a[1]1,a[1]2,a[1]3,a[1]4 a 1 [ 1 ] , a 2 [ 1 ] , a 3 [ 1 ] , a 4 [ 1 ] 作为输出层的输入,共同作用后得到 Z[2] Z [ 2 ] ,最终通过激活函数 σ(z) σ ( z ) 将结果进行非线性化,得到 a[2] a [ 2 ] ,公式如下:
以上讲述的就是神经网络中的前向传播(Forward Propagation)算法:利用已经训练出的连接权重w(或称映射权重)和神经元模型中的输出公式(激活函数)来计算出每一层每一个神经元的激活值(activation,Z),最终得到输出层的激活值,也就是输出值.
假设有m个样本数据,在利用前向传播法训练样本的时候,将以上公式用伪代码来表述的话:
for i=1 to m:
Z[1]=W[1]T⋅X+b[1] Z [ 1 ] = W [ 1 ] T ⋅ X + b [ 1 ]
A[1]=σ(Z[1]) A [ 1 ] = σ ( Z [ 1 ] )
Z[2]=W[2]T⋅A[1]+b[2] Z [ 2 ] = W [ 2 ] T ⋅ A [ 1 ] + b [ 2 ]
A[2]=σ(Z[2]) A [ 2 ] = σ ( Z [ 2 ] )
其中,
前面提到了正向传播,通过输入值及映射参数w,b得到输出的值。但是一般我们的样本都是输入x,和输出y的值,我们需要通过训练数据得到准确的映射参数w,b的值,这个时候就需要通过我们的样本数据的训练来不断的调整这些参数值,直到这些参数能够拟合这些样本数据,这个时候才能说我们的神经网络是准确的,满足误差条件的。
参数该怎么调整呢,还记得我们在Logistic回归里调参的方法吗?那就是梯度下降法,神经网络里的参数较多,同样我们对每个神经元的映射参数通过梯度下降法来进行调整,拟合样本数据。关于梯度下降法可以参考之前的博客【四】机器学习之路——线性回归。
梯度下降法中代价函数
Repeat:
{
dW[1]=∂J∂W[1],db[1]=∂J∂b[1],dW[2]=∂J∂W[2], d W [ 1 ] = ∂ J ∂ W [ 1 ] , d b [ 1 ] = ∂ J ∂ b [ 1 ] , d W [ 2 ] = ∂ J ∂ W [ 2 ] , db[2]=∂J∂b[2] d b [ 2 ] = ∂ J ∂ b [ 2 ]
W[1]=W[1]−α⋅dW[1] W [ 1 ] = W [ 1 ] − α ⋅ d W [ 1 ]
b[1]=b[1]−α⋅db[1] b [ 1 ] = b [ 1 ] − α ⋅ d b [ 1 ]
W[2]=W[2]−α⋅dW[2] W [ 2 ] = W [ 2 ] − α ⋅ d W [ 2 ]
b[2]=b[2]−α⋅db[2] b [ 2 ] = b [ 2 ] − α ⋅ d b [ 2 ]
}
这里的α称为学习率learning rate,利用梯度下降法不断重复上述过程,直至收敛。
简单的讲一个例子来推导一下这些函数,下图为一个最简单的神经元,其中 σ(z)=11+e−z σ ( z ) = 1 1 + e − z 。
本篇博客介绍了神经网络的入门知识,公式的推导主要是我们高中学的微积分,忘记的同学可以复习一下。如果各位发现博文中有错误的地方,还请指出,谢谢!觉得好的话,请帮忙点赞!