为了介绍神经网络的前向传播算法,需要先了解神经元的结构。神经元是构成一个神经网络的最小单元,图2 显示了一个神经元的结构。
图2 神经元结构示意图
从图2 可以看出,一个神经元有多个输入和一个输出。每个神经元的输入既可以是其他神经元的输出,也可以是整个神经网络的输入。所谓神
经网络的结构就是指的不同神经元之间的连接结构。如图2 所示,神经元结构的输出是所有输入的加权和加上偏置项再经过一个激活函数。图3 给
出了一个简单的三层全连接神经网络。之所以称之为全连接神经网络是因为相邻两层之间任意两个节点之间都有连接。这也是为了将这样的网络结
构和后面文章中将要介绍的卷积层、LSTM 结构区分。图3 中除了输入层之外的所有节点都代表了一个神经元的结构。本小节将通过这个样例来解释前向传播的整个过程。
图3 三层全连接神经网络结构图
计算神经网络的前向传播结果需要三部分信息。第一个部分是神经网络的输入,这个输入就是从实体中提取的特征向量。第二个部分为神经网
络的连接结构。神经网络是由神经元构成的,神经网络的结构给出不同神经元之间输入输出的连接关系。神经网络中的神经元也可以称之为节点。
在图3 中,a11 节点有两个输入,他们分别是x1 和x2 的输出。而a11 的输出则是节点Y 的输入。最后一个部分是每个神经元中的参数。图3 用w
来表示神经元中的权重,b 表示偏置项。W 的上标表明了神经网络的层数,比如W(1) 表示第一层节点的参数,而W(2) 表示第二层节点的参数。W 的下标表明了连接节点编号,比如W1,2(1) 表示连接x1 和a12 节点的边上的权重。给定神经网络的输入、神经网络的结构以及边上权重,就可以通过前向传播算法来计算出神经网络的输出。下面公式给出了在ReLU 激活函数下图3 神经网络前向传播的过程。
a11=f(W1,1(1)x1+W2,1(1)x2+b1(1))=f(0.7×0.2+0.9×0.3+(-0.5))=f(-0.09)=0
a12=f(W1,2(1)x1+W2,2(1)x2+b2(1))=f(0.7×0.1+0.9×(-0.5)+0.1)=f(-0.28)=0
a13=f(W1,3(1)x1+W2,3(1)x2+b3(1))=f(0.7×0.4+0.9×0.2+(-0.1))=f(0.36)=0.36
Y = f ( W 1 , 1 ( 2 ) a 1 1 + W 1 , 2 ( 2 ) a 1 2 + W 1 , 3 ( 2 ) a 1 3 + b 1 ( 2 ) ) = f ( 0 . 0 5 4 + 0 . 0 2 8 + ( -
0.072)+0.1)=f(0.11)=0.11
在TensorFlow 中可以通过矩阵乘法的方法实现神经网络的前向传播过程。
a = tf.nn.relu(tf.matmul(x, w1)+b1)
y = tf.nn.relu(tf.matmul(a, w2)+b2)
在上面的代码中并没有定义w1、w2、b1、b2,TensorFlow 可以通过变量(tf.Variable)来保存和更新神经网络中的参数。比如通过下面语句可以定义w1:
weights = tf.Variable(tf.random_normal([2, 3], stddev=2))
这段代码调用了TensorFlow 变量的声明函数tf.Variable。在变量声明函数中给出了初始化这个变量的方法。TensorFlow 中变量的初始值可以设置成随机数、常数或者是通过其他变量的初始值计算得到。在上面的样例
中,tf.random_normal([2, 3], stddev=2) 会产生一个2×3 的矩阵,矩阵中的
元素是均值为0,标准差为2 的随机数。tf.random_normal 函数可以通过
参数mean 来指定平均值,在没有指定时默认为0。通过满足正太分布的
随机数来初始化神经网络中的参数是一个非常常用的方法。下面的样例介
绍了如何通过变量实现神经网络的参数并实现前向传播的过程。
import tensorflow as tf
# 声明变量。
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
b1 = tf.Variable(tf.constant(0.0, shape=[3]))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
b2 = tf.Variable(tf.constant(0.0, shape=[1]))
# 暂时将输入的特征向量定义为一个常量。注意这里x是一个1*2的矩阵。
x = tf.constant([[0.7, 0.9]])
# 实现神经网络的前向传播过程,并计算神经网络的输出。
a = tf.nn.relu(tf.matmul(x, w1)+b1)
y = tf.nn.relu(tf.matmul(a, w2)+b2)
sess = tf.Session()
# 运行变量初始化过程。
init_op = tf.global_variables_initializer()
sess.run(init_op)
# 输出[[3.95757794]]
print(sess.run(y))
sess.close()