哈喽哈喽大家好,这里是大数学极客,我是今天的值班主页菌高三六班牛义义。
上一篇机器学习系列我好像答应了大家要写朴素贝叶斯分类器,但最近事情真是太多了,只能鸽了.....,恰逢这两周入坑神经网络模型和Tensorflow框架,那就先写这方面吧,朴素贝叶斯那件事看心情。
这一篇主要目的是介绍一下全连接神经网络的结构、参数训练原理、评估指标以及tensorflow的实现。
需要的数学基础:会求导…..
需要的编程基础:会简单的使用python…..
好,门槛贼低。下面正式开始。
全连接神经网络结构
全连接神经网络是为了区分于后续著名的卷积神经网络(CNN)、循环神经网络(RNN)等结构而提的,是一种较早提出的、结构被应用广泛的网络。主要思路是模拟人脑对于事物特征的重组、抽象能力。方式是通过将一些零散的特征进行加权线性组合、非线性函数的激活,逐层整合,完成我们期待的监督学习任务。
下面我以两个输入节点,一个神经元的例子来说明全连接神经网络的工作流程。
图1全连接神经网络结构示意图
如图1所示,x1,x2为输入节点,z为隐层神经元,所谓全连接的意思就是,每个输入节点都要和中间的神经元连接,进行线性加权组合运算。即:
然后对上述线性组合进行去线性化激活,目的是解决线性不可分问题,以及使得多层网络更有意义,否则多层网络与一层线性网络将没有区别。激活函数一般有softmax, Relu, tanh.
即:
全连接神经网络参数训练过程
经过一系列的网络学习可以得到模型的输出,如我们在前作《机器并不想学习》中提到的那样,为了使得输出值与真实值尽可能接近,我们构造损失函数,以平方损失函数为例:
那后面又到了最熟悉的路子,找一组w,使得平方损失最小,最粗暴的办法其实也是他们这帮搞机器学习的人信服的办法——梯度下降,什么意思呢。其实就是对w求导,然后让导数为,进而求得极小值点。既然说到求导,又涉及到多元函数,那就是顺着图1,逆着神经网络前向传播反向逐层求导,这个过程称为反向传播算法,翻译成中国话叫复合求导法则。具体过程如下:
通常这个求导链非常复杂,一般很难用解析的办法去求解。在这个基础下,随机梯度下降算法、Adam、动量这些数值迭代方法层出不穷,本期就不赘述了。因为,我已经憋不出了!我要开始用Tensorflow框架来实现了!!
全连接网络的TensorFlow实现
Tensorflow是谷歌公司基于图结构来实现深度学习的一个框架。说简单点就是你要先把神经网络结构画出来,然后再创建一个程序会话来运行它。针对上述这个全连接网络,我们来用tensorflow框架来描述一下这个结构。
首先在python3.6中引入tensorflow模块(版本为tensorflow1.4):
然后我们来定义一个网络结构:
这时候我们发现,有了这个结构以后,还需要权重矩阵w、偏执项(也就是线性组合的截距)b和输入x。那就先构造一下权重矩阵和偏执项的生成函数:
然后是生成输入的数据变量,注意在tensorflow中,这些都是静态的占位变量,需要实际的输入真正的数据才能运行。
根据上述的逻辑,我们生成网络的学习输出:
根据输出设计损失函数,这里面使用交叉熵损失函数:
为了求解损失函数的最小值,选择优化器,这里选择随机梯度下降法,设置学习率为0.5(学习率是什么你给我后台留言吧!!反正我也不一定看得见):
完成上述的建模过程以后,一定要注意!!这些都只是静态过程,需要如下的一个程序会话创建过程来运行他们。
关于x_train 和y_train大家可以自己选择,我是用的著名的手写识别数字mnist,具体的代码可以看我拙略的码云仓库:
https://gitee.com/wangyi666/tensorflow-learning/blob/master/netModel.py
至此,一个简单的全连接神经网络就写完了,如果你还没明白,赶紧点一下关注,因为下次,我要录个短视频,应该不鸽。
谢谢你的浏览。
愚人节快乐
封面图片: 新浪微博-冯提莫
领取专属 10元无门槛券
私享最新 技术干货