什么是神经网路
我们这里讲的是人工神经网络,这是一种机器学习算法,简单的说就是一种模拟人脑的学习算法,它能通过学习一定的数据,从而对相同事物的具有一定的判断能力。
神经元
我们的神经网络就是相当于多个神经元的连接。下图是一个神经元:
下图是三个输入的神经元模型
对比两图,细胞核部分就是我们的输入a1,a2,a3,而轴突部分就是我们的权重w1,w2,w3,Sum就是下一个神经元,我们称为输出,也是此神经元的输入。
感知机
感知机是最简单的神经网络,它只有输入和输出两层。上图的神经元模型就是一个感知机。
接下来是计算。
首先我们要给模型上的权重随机赋值,为了计算的方便,我们都用矩阵进行计算,所以w=[w1,w2,w3],然后和线性回归一样,和输入a=[a1,a2,a3]相乘并带入激活函数,得到输出z。然后还没有结束,我们还要对权重进行优化,类似于线性回归中的寻找最优的系数theta,反复此操作,直到我们得到较好的权重,这样我们的训练就完成了。
多层神经网络
感知机简单,但只能做简单的线性分类问题。所以人们摸索出了多层的神经网络。
多层神经网络其实就是在输入和输出层之间增加了隐藏层,例如下图:
这个神经网络就是多了一层隐藏层,计算过程和感知机是类似的。
神经网络的算法中包括两种算法,一种是前向传播算法,一种是反向传播算法。
前向传播算法
前向传播算法是比较简单的,就是输入层的数据和随机得到的权重进行矩阵乘法,从而得到第二层的值,并把这些值作为输入去计算第三层的值,以此类推。这就是前向传播算法
反向传播算法
开始时,我们的权重是随机得到的,这肯定不能满足我们的精度要求,而反向传播算法就是用于更新权重的。
当一次前向传播算法完成,我们的到了对于训练集的预测值,这时就要用反向传播算法。
首先是求输出层的误差:
err=f'(Oj)*(y-Oj)
(err表示当前神经元的误差,f'表示激活函数的导数,y是样本对应的label,Oj是用对应样本计算出的预测值。)
然后是隐藏层的误差:
err=f'(Oj)*errk*wk
(errk表示上面计算出的与此神经元相连的那个神经元的误差,wk表示这两个相连神经元之间的权重)
接下来就是更新我们的权重了:
w=w+l*err*Oj
(w表示权重;l表示学习率,因为这其实是采用了梯度下降的方法进行权重的更新,所以我们要设计学习率来疗伤我们的移动步长;err和Oj就是对应位置的误差和预测)
这样我们就得到了反向传播的使用方法。
另外,我们一般会设计编置节点,编置节点是没有输入的,且存储值永远为1,如下图中是b(1),b(2),
考虑了偏置节点后,我们的计算也会有点小是差异,
并且,在更新权重的我们也要更新偏置节点,方法为:
b=b+l*err
现在,结合前向传播算法和反向传播算法,我们就可以写一个简单的神经网络了。