基本概念:
人工神经网络是根据生物神经网络构造的一种数据模型,每一层包含大量神经元。每两层神经元间的连接都存在一个初始参数,这个参数用来衡量神经元间相连接的重要程度。神经网络的每一层都具有多个节点,每个节点都与下层的所有节点相连,并且每一层的输出可以作为下一层的输入,每层神经网络中的节点只与其上一层和下一层的节点相连。
BP(Back Propagation)神经网络:
它是最常用的一种多层神经网络,它的训练过程由数据的前向传播和误差的反向传播构成。原始数据经过输入层、中间层和输出层后得到实际输出结果,若实际结果与预期结果不同,则需要残差反向传播。残差的反向传播过程就是模型的学习过程,通过不断缩小实际输出和预期输出的差值来优化BP神经网络中节点的参数,直到误差大小小于预先设置的阀值或学习次数,其中缩小误差的方法通常采用梯度下降法。BP神经网络的前向传播是先计算出输入向量与下层节点间参数的内积,计算结果经过下层节点的激活函数得到一个局部向量,然后再与下一层的参数算内积和激活函数,一直传递到最后的输出层。图1是典型的BP神经网络,该神经网络分为三层,第一层是输入层(Input Layer),中间层是隐藏层(Hidden Layer),最后一层是输出层(Output Layer),+1是偏置节点。输入层接受原始数据特征后,每个节点经过权值累加传递给下一层节点。中间层对数据特征进一步处理,中间层可设置单层或多层。最后隐藏层传递给输出层经过目标函数的运算得到实际输出结果。
神经网络分为前向传播和后向传播:
前向传播是神经元接受前一层的输入,经计算输出到下一层,直到输出层得出输出结果。而神经网络的训练需要误差的后向传播,若训练数据经过前向传播后与正确结果不同,根据结果误差对输出层进行参数调整并层层回退直到输入层,再继续测试模型,直到与预测结果的误差较小为止。
前向传播:
后向传播:
其中,表示输出层对最后输出结果的误差影响。表示每一层各个节点对最终结果的误差影响。人工神经网络中每个节点都是独立运算,具有较强的并行计算能力且容错率较高,因此在近些年来发展迅速,在模式识别、预测估计、生物医学、经济金融等领域取得了突破性的进展,解决了大量人工无法解决的数据问题。
三层神经网络(输入、隐藏、输出)代码如下:
import numpy as np
def nonlin(x, deriv=False):
if (deriv == True):
return x * (1 - x)
return 1 / (1 + np.exp(-x))
X = np.array([[0, 0, 1],
[0, 1, 1],
[1, 0, 1],
[1, 1, 1]])
y = np.array([[0],
[1],
[1],
[0]])
np.random.seed(1)
# randomly initialize our weights with mean 0
syn0 = 2 * np.random.random((3, 4)) - 1
syn1 = 2 * np.random.random((4, 1)) - 1
for j in range(60000):
# Feed forward through layers 0, 1, and 2
l0 = X
l1 = nonlin(np.dot(l0, syn0))
l2 = nonlin(np.dot(l1, syn1))
# how much did we miss the target value?
l2_error = y - l2
if (j % 10000) == 0:
print("Error:" + str(np.mean(np.abs(l2_error))))
print(syn0,syn1)
# in what direction is the target value?
# were we really sure? if so, don't change too much.
l2_delta = l2_error * nonlin(l2, deriv=True)
# how much did each l1 value contribute to the l2 error (according to the weights)?
l1_error = l2_delta.dot(syn1.T)
# in what direction is the target l1?
# were we really sure? if so, don't change too much.
l1_delta = l1_error * nonlin(l1, deriv=True)
syn1 += l1.T.dot(l2_delta)
syn0 += l0.T.dot(l1_delta)