3.1 前向传播功能
3.1.1 从TensorFlow的可视化运行过程理解前向传播功能
如图3-1所示,在TensorFlow的可视化示意图中,左侧是输入层,右侧是输出层,中间是隐藏层,输入层的数据经过若干层的处理后到达输出层。神经网络从输入层数据中提取特征值,输入给神经网络系统。图3-1中,输入层有2个神经元节点,中间是2个隐藏层,第一个隐藏层有4个神经元节点,第二个隐藏层有2个神经元节点,输出层有1个神经元节点。
图3-1 TensorFlow的可视化示意图(2个隐藏层)
所有的数据在神经网络中从左到右训练一次称为一次时代。随着不断的迭代,神经网络的预测精度会越来越高,训练损失度和测试损失度会越来越小。在TensorFlow可视化示意图中,隐藏层的层数及神经元的个数可以调节,例如新增加一个隐藏层,第一个隐藏层增加到8个神经元,第2个隐藏层为4个神经元,第3个隐藏层为2个神经元,如图3-2所示。
图3-2 TensorFlow的可视化示意图(3个隐藏层)
图3-3是神经网络数据处理的过程,第一个隐藏层的第一个节点,有2个输入节点,分别是输入层的x1节点和x2节点,第一个隐藏层的第一个节点根据输入计算出一个值,这个值将作为第二个隐藏层的输入。例如第2个隐藏层的第2个节点,接收上一个隐藏层的8个神经元节点的数据的结果。8个神经元节点数据可能有一部分不重要,这8个数据输入产生一个输出,而不是产生8个输出。
图3-3 TensorFlow计算值示意图
第二个隐藏层的第二个节点对8个输入值经过激活函数算法产生一个输出,从变换的角度看,这是非线性变换。不同的神经网络层之间,从多个输入变成一个输出的过程就是非线性变换。非线性变换是神经网络层到达下一层的动力,也就是激活函数。
3.1.2 从架构层面理解前向传播功能
神经网络前向传播的过程是,从第一层处理,到第二层处理,再到第三层处理,然后到第四层处理……,如图3-4所示,对输入层的输入数据首先进行线性处理,然后进行非线性处理,然后到下一层,把上一层的所有神经元的数据抓取过去,再进行线性处理,然后进行非线性处理。这里只进行了1个隐藏层的处理。
图3-4 神经网络处理过程
神经网络处理过程是从左到右见天机的过程,所谓“见天机”是指通过神经网络得到一个预测结果。如图3-5所示,如果只看其中的一个过程,从输入层输入数据,将数据的值乘以它的权重(权重体现输入值的重要性),然后加上第二个神经元的值乘以它的权重,然后再加上第三个神经元的值乘以它的权重;把数据累加后收集起来,收集的过程就是线性转换的过程;然后进行某种激活函数处理。处理的过程是非线性的,会产生一个结果。如果这是隐藏层一个神经元的处理过程,那么这个结果会作为下一个隐藏层的输入数据之一。
图3-5 神经元的处理过程
3.1.3 理解前向传播原理
如图3-6所示,输入层输入数据x1、x2;神经网络第一个隐藏层的第一个神经元接收所有的特征,经过线性变换、非线性变换得出一个结果,神经网络第一个隐藏层的第二个神经元接收所有的特征,经过线性变换、非线性变换得出一个结果,相应的第三个、第四个……一直到第8个神经元,按照前面的输入进行一定的处理,将处理的结果作为第二个隐藏层的数据的输入;第二个隐藏层的第一个神经元接收前一个隐藏层8个神经元的值,通过线性变换及非线性处理函数,将8个接收的数据变成1个输出的结果,第二个隐藏层的第二个神经元进行相应的处理,第二个隐藏层的第三个神经元也进行相应的处理,第二个隐藏层的第四个神经元也进行相应的处理;然后第三个隐藏层的神经元接收上一个隐藏层4个神经元的所有结果。每个神经元都是这样,接收数据的过程是线性变换的过程,进行非线性的函数处理后,得出一个结果,隐藏层的计算就完成了。然后是输出层,输出层只有一个神经元,接收数据的过程是线性的过程,得出最终结果的过程是非线性的过程。
图3-6 前向传播计算
对于前向传播而言,精髓在于激活函数。对于激活函数不同的人工智能框架有不同的实现,可能激活函数的名称是一样的,机制也是一样的,但不同的人工智能框架实现的性能可能不一样。本节使用的是Sigmoid激活函数。从最简单的架构角度讲,Sigmoid激活函数把前面的输入数据变成0~1的数据。Sigmoid函数作为激活函数,是最基本、最简单的激活函数,无论是开发人工智能框架,还是应用人工智能框架,它可能都是接触到的第一个激活函数,如图3-7所示。
图3-7 Sigmoid激活函数
如图3-8所示,TensorFlow的可视化图中提供的激活函数(Activation)包括ReLU、Tanh、Sigmoid、Linear等。不同的激活函数有不同的适用场景,这里应用的是分类场景。使用Sigmoid激活函数进行测试,发现其收敛速度非常快,但是不太适用于分类这个场景,因为使用Sigmoid激活函数后测试损失度和训练损失度基本上没变化。接下来使用ReLU激活函数进行测试,ReLU激活函数对于分类场景应用效果很不错,收敛速度非常快,测试损失度变成了0.001,训练损失度也变成了0.001。然后再对Tanh激活函数进行测试,发现其收敛速度没有ReLU激活函数速度快。
图3-8 激活函数