知识总结
简介
该文章是在跟着《Tensorflow 实战》做练习代码的过程中出现的神经网络结构以及相关算法所遇到的知识点(尤其是原书没有解释或者没有当即解释的)的总结归纳。
此外该文章不包括详细的概念解释(已在之前的对应文章记录故不再赘述),此文仅仅起归纳和补充作用。
目前个人仅完成第四章的阅读,所做的知识记录也是对于第四章以前的内容,但将不断更新。
神经网络结构
Softmax Regression 模型
基本概念和应用
Softmax Regression 模型即是一个线性模型也是一个多分类问题模型,是在原书3.2节(内容对应个人博客Tensorflow 学习入门(二) 初级图像识别——手写数字识别)的内容。
应用特性
这个模型最大的特点就是简单易用,但是拟合能力不强,并且该结构中不包含隐含层。
隐含层
基本概念和应用
这个概念首先出现并在原书4.2节(内容对应个人博客Tensorflow 学习入门(三) 自编码器实现)但是在4.3节中才有所描述。
隐含层指的是在输入、输出层之间的那些层。相比较被称作可视层的对外可见的输入层和输出层,中间层不直接暴露出来并且比较男具有可解释性,所以才被称作隐含层(hidden layer)。
尽管Softmax 模型也具有权重和偏差值所谓中间运算,但是鉴于其有一定解释性故而不算隐含层(个人理解)。
应用特性
在引入非线性的隐含层后,理论上只要隐含层节点够多,即使只有一个隐含层的神经网络也可以拟合任意函数。当然如果隐含层的层数越多便越容易拟合更加复杂的函数。对于这个特性已有研究指出:拟合复杂函数所需要的隐含节点的数目,基本上随着隐含层的层数增多而呈指数下降趋势。(这也是深度学习的特点)。
神经网络操作问题
过拟合
基本概念
过拟合问题是在机器学习中一个常见的问题,具体指模型预测在准确率在训练集中不断上升但却在测试集上下降。出现这个问题则说明该模型泛化性不够好,仅仅是记忆了当前数据的特征而无法推广到同类数据。
解决思路
目前现有的解决思路是由Hinton教授团队提出的名为Dropout的思路。而该方法在使用复杂的卷积神经网络训练图像数据时尤其有效。具体来讲就是在训练时,将神经网络某一层的输出节点数据随机丢弃一部分(可以理解为将图片50%的点删去或者变成黑点)。这种做法实质上等于创造了新的随机样本,也就是说通过增大样本量、减少特征数量来防止过拟合。
梯度弥散及梯度爆炸
基本概念
这两种情况指的是随着神经网络(即隐含层hidden layer)的增加而导致的训练误差增大。而通过反向传播(类似于求导)产生的梯度会趋零(梯度弥散)或者无限增大(梯度爆炸)。原则上后者的才产生比较早,因为普遍发生在我们使用任意数调整神经网络的状态。而前者广泛产生与将Sigmoid Function 作为激活函数后的情况下,这种情况下产生的值在0~1之间最符合概率输出定义而且其函数图也十分近似神经元的激活图(即中央区兴奋态,两侧去抑制态)。但是正由于其所产生值都小于0在多层神经网络影响后输入层的数值更新仅能造成输出层极小的梯度变化导致学习效果变差甚至产生负优化,这就是梯度弥散(反之就是梯度爆炸)。
解决思路
更改激活函数。目前最能解决梯度弥散问题的函数就是ReLU函数( y = max ( 0 , x ) y=\max(0,x) y=max(0,x)),该函数将激活编程单侧抑制(对比Sigmoid的双侧抑制)使神经网络不局限于0~1的取值范围方便更好地调整。当然我们在自编码器一节中使用的Softplus虽然也是一种单侧抑制的激活函数但是没有稀疏及火星,因而ReLU函数成为了最符合实际神经元的模型。当然目前最主流的激活函数并非ReLU函数本身而是其变种(ElU,PReLU,RReLU)。另外实践中的大部分情况下(包括MLP,CNN和RNN)内部仍然使用Sigmoid、Tanh、Hard Sigmoid,而将这些函数替换为ReLU也可以带来训练速度和模型准确率的提升。不过神经网络的输出层仍然是 Sigmoid,因为它最接近概率分布。
参数调试
基本概念
参数难以调试是神经网络的一大痛点,尤其是SGD的参数,碎玉SGD设置不同的学习速率,所得到的结果可能差异巨大。
最优解问题
另外由于神经网络通常不是一个凸优化问题(即存在明显最优解的问题),他处处充满了局部最优。此外对于这个特性,又有研究表面,即使是多个局部最优解都可以达到比较好的分类效果,相反如果是全局最优解反而可能是一个过拟合结果。
调优问题
此外,学习速率同时影响着SGD的解决时长和解决精度。比如在训练之初我们需要比较高的学习速率来加快收敛(节省时间,加快效率),而在后期则通过调低学习速率来加大学习精度以更好的落入一个局部最优解。
解决思路
自动调优+研究定参
自动调优指的是对于SGD的这样针对学习速率的调优问题可以说使用Adagrad、Adadelta(Adagrad的优化版)以及Adam(针对Momentum
的Adadelta)等自适应的方法来减轻调试负担。而对于其他的参数则可以各自根据其中的特征来决定优化思路。一般这些参数可以由特定的研究得出。