2.1 盘古人工智能框架
盘古人工智能框架实现了多层次神经网络,这里神经网络是指它的架构,如图2-1所示,分为神经网络的输入层、隐藏层和输出层,相当于一个程序的输入、中间的处理和输出过程。
图2-1 神经网络骨架
左侧是数据的输入,最右侧是数据的输出,中间是处理的过程,有线条连接输入层、隐藏层、输出层,这就是TensorFlow数据处理的过程。这种处理的思路和用Java语言写一个“Hello World”的程序是类似的,即使用一个main入口,接着是一行打印“Hello World”语句,在代码编写上没有任何区别,只不过神经网络把数据处理代码分成几个步骤,而且这几个步骤是循环迭代的。首先是数据输入,这是第一步,任何一个程序都有数据输入的过程;第二步进行初步的处理;第三步进一步的处理,然后得出一个中间结果(注意是中间结果),然后开始循环遍历中间处理的过程,每一次都会对上一次的处理进行一点改进。重复的次数越多,理论上效果就越好。在TensorFlow网站运行一下,可视化运行图右侧是输出的效果,代表训练的误差和测试的误差,可以看到有值的变化,多次运行后会达到值变化不太明显的状态。网页左上方有个时代(Epoch)项,时代是指所有的数据都处理了一遍,一遍就是一次时代,不断重复数据的处理过程,以最大化减少误差。误差越来越小,最后变化基本停止了,基本停止或者变化非常缓慢的时候,可以停止训练,进行优化。数据有流动,通过前向传播算法从左侧流动到右侧,然后通过反向传播算法从右侧流动到左侧,不断地循环迭代,关键在于每个步骤处理完以后,下一步重复这个步骤的时候能改进上一个步骤的表现,这是人工智能的核心,也是和传统编程不同的地方。
要想实现图1-1所示从左到右的功能,其中又有循环,首先要有一个结构体或者对象去实现循环。这里所谓的结构体或者对象就是输入层、隐藏层、输出层,这个过程和人类学习的过程一样。人类的感知系统如图2-2所示,人有各种感知系统,类似于人工智能的数据输入,人所感知的疼痛就类似于人工智能的激活函数,这将得出一个结果供下一步去处理。人工智能的认知过程和人的认知过程是一样的。
图2-2 人类的感知系统与人工智能的认知系统
如图2-3所示,神经元对外界感知并做出决定,很多时候需考虑不同的因素,并且不同因素的重要性优先级不同。权衡的因素从神经网络的角度讲是特征(Features),从数学的角度讲是维度(Dimension)。例如,预测一下读者会不会喜欢这本书。书有很多特征:出版的时间、价格、作者、出版社等,这些都是权衡的因素特征。CNN、RNN之所以强大,就在于其可以自动提取特征,而对于普通的机器学习来讲提取特征则是一个非常麻烦的过程。
图2-3 神经元
如图2-4所示,不同的特征有不同的权重,如x1、x2、x3、x4、x5等权重。例如,是否需要深厚的数学基础及编程语言基础是学习人工智能课程的一个权重,如果你选择如需要这些基础就放弃,说明这个权重对你影响很大,所以权重系数就很大,可能为0.9或者0.85;另一个因素是上课时间,如果上课时间无所谓,它的权重可能就为0.1;课程中是否有足够的项目案例,这个特别重要,它的权重可能就是0.99。构建一个神经网络有几个点:输入层、输出层、中间的隐藏层,前面的层对于后面的层次都有特征及权重的影响。
图2-4 神经网络结构
不同的权重可能还会加一个偏爱因子(Bias),例如,项目案例非常重要,则在项目案例权重0.99的基础上,可能会加一个偏爱因子。偏爱因子是额外的一个权重。
图2-5所示是阿尔法狗的训练过程,围棋专家给出落子位置数据,阿尔法狗通过监督学习的算法进行了一定程度的学习,也就是神经网络的深度学习;学到一定程度以后再进行增强学习。
图2-5 阿尔法狗的训练过程
接下来进行盘古人工智能框架代码实战。
首先,我们看一下盘古人工智能框架版本的整体迭代结构图。整个盘古人工智能框架从第一个版本迭代到第五个版本,迭代版本分别为chapter2_Create_AI_Framework、chapter3_Create_AI_Framework、chapter4_Create_AI_Framework、chapter5_Create_AI_Framework、chapter6_Create_AI_Framework。最终的版本chapter6_Create_AI_Framework包括入口主程序Neuron_Network_Entry.py;service目录里面包括BackPropagation.py、FeatureNormalization.py、ForwardPropagation.py、LossComputation.py、NetworkConnection.py、NetworkStructure.py等模块;entity目录里面包括Node.py、Weight.py等Python模块,如图2-6所示。
图2-6 盘古人工智能框架整体迭代版本
本节将实现盘古人工智能框架的神经元网络骨架,要实现的目录结构如图2-7所示。
图2-7 chapter2_Create_AI_Framework目录结构
读者可以自行安装Anaconda的开发环境(https://www.anaconda.com/download/)。进入Anaconda的控制台,启动Spyder,Anaconda Spyder是一个机器学习的集成开发环境,如图2-8所示。
进入Spyder的File explorer窗口,创建自定义的神经网络项目目录chapter2_Create_AI_Framework,如图2-9所示。
选择chapter2_Create_AI_Framework目录,单击齿轮图标,然后单击Set console working directory命令,设置其为工作目录,如图2-10所示。这一步很重要,因为后续的所有代码都将放在这个目录中,该工作目录包括了上下文信息。
图2-8 Anaconda的控制台
图2-9 创建目录
图2-10 设置工作目录
实现盘古人工智能框架的多层次神经网络,需要以下四个步骤:
(1)实现神经网络的节点结构。
(2)实现神经网络层之间节点的连接。
(3)初始化神经网络的权重。
(4)实现多个隐藏层。
我们要实现的人工智能框架和TensorFlow的类似,可以调整神经元的数量。第1步我们要实现神经网络的节点结构。从Java开发者的角度讲,节点结构就是JavaBean。
我们先在chapter2_Create_AI_Framework工作目录中建立一个子目录entity,entity的含义是实体,如图2-11所示。
图2-11 创建entity子目录
在entity子目录下创建一个节点文件Node.py,如图2-12所示。
图2-12 创建Node.py文件
接下来通过代码来实现多层次神经网络功能。