神经网络是一种模拟人脑的以及能够实现类人工智能的机器学习技术,它是目前最为火热的研究方向--深度学习的基础。
神经元:一个神经元通常具有多个树突,主要用来接受传入信息;而轴突只有一条,轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。
神经元模型:神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。
单层神经网络:在“感知器”中,有两个层次,分别是输入层和输出层。输入层里的“输入单元”只负责传输数据,不做计算。输出层里的“输出单元”则需要对前面一层的输入进行计算。我们把需要计算的层次称之为“计算层”,并把拥有一个计算层的网络称之为“单层神经网络”。
神经网络架构分类:
前馈神经网络:第一层是输入,中间是多个隐藏层、最后一层是输出。
前馈的意思是指在这个神经网络里信息只是单方向的向前传播而没有反馈机制。
循环神经网路:即一个序列当前的输出与前面的输出也有关。 具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
特点:1、中间层的输出作为输入和下一个样本数据一起作为输入,也叫循环层 2、具有记忆样本之间相关联系的能力 场景:常用于文本填充、时间序列、语音识别等序列数据
对称连接网络:对称连接网络有点像循环网络,但是单元之间的连接是对称的(它们在两个方向上权重相同)。比起循环网络,对称连接网络更容易分析。这个网络中有更多的限制,因为它们遵守能量函数定律。没有隐藏单元的对称连接网络被称为“Hopfield 网络”。有隐藏单元的对称连接的网络被称为玻尔兹曼机。
Keras中的两种模型:Sequential和Model
在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model)。
序列模型 序列模型各层之间是依次顺序的线性关系,模型结构通过一个列表来制定。
通用模型Model 通用模型可以设计非常复杂、任意拓扑结构的神经网络,例如有向无环网络、共享层网络等。相比于序列模型只能依次线性逐层添加,通用模型能够比较灵活地构造网络结构,设定各层级的关系。
编译模型:
使用model.compile()函数,用于在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准
语法:model.compile( optimizer = 优化器, loss = 损失函数,metrics = ["准确率”])
optimizer可以是字符串形式给出的优化器名字,也可以是函数形式,使用函数形式可以设置学习率等参数。 例如:“adagrad” 或者 tf.keras.optimizers.Adagrad(lr = 学习率, decay = 学习率衰减率) loss可以是字符串形式给出的损失函数的名字,也可以是函数形式。 例如: ”mse" 或者 tf.keras.losses.MeanSquaredError() 或model.compile(loss='mean_squared_error', optimizer='sgd') metrics标注网络模型评价指标 例如: metrics=['accuracy']
优化器:
优化器是在深度学习反向传播过程中,指引损失函数(目标函数)的各个参数往正确的方向更新合适的大小,使得更新后的各个参数让损失函数(目标函数)值不断逼近全局最小。
keras内置优化器
深度学习优化算法大概经历了 SGD -> SGDM -> NAG ->Adagrad -> Adadelta(RMSprop) -> Adam -> Nadam 这样的发展历程。
1、 SGD (随机梯度下降法)
随机梯度下降算法每次从训练集中随机选择一个样本来进行学习,SGD没有动量的概念。
优点: 随机梯度下降所带来的波动有利于优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样对于非凸函数,最终收敛于一个较好的局部极值点,甚至全局极值点。
缺点: (1)当遇到局部最优点或鞍点时,梯度为0,无法继续更新参数;
(2)沿陡峭方向震荡,而沿平缓维度进展缓慢,难以迅速收敛
2、SGDM
SGDM即为SGD with momentum,它加入了动量机制
为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。
SGDM相比SGD优势明显,加入动量后,参数更新就可以保持之前更新趋势,而不会卡在当前梯度较小的点了。美中不足的是,SGDM没有考虑对学习率进行自适应更新,故学习率的选择很关键。
3.NAG
NAG全称Nesterov Accelerated Gradient(牛顿动量梯度下降),是在SGD、SGD-M的基础上的进一步改进。在计算梯度时计算的是向前走一步所在位置的梯度。
因为加入了动量因素,SGD-M缓解了SGD在局部最优点梯度为0,无法持续更新的问题和振荡幅度过大的问题,但是并没有完全解决,当局部沟壑比较深,动量加持用完了,依然会困在局部最优里来回振荡。
改进点:我们知道在时刻 t 的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。
特点:有利于跳出当前局部最优的沟壑,寻找新的最优值,但是收敛速度慢。
4、Adagrad(自适应梯度下降)
它利用迭代次数和累积梯度,对学习率进行自动衰减。从而使得刚开始迭代时,学习率较大,可以快速收敛。而后来则逐渐减小,精调参数,使得模型可以稳定找到最优点。其参数迭代公式如下:
与SGD的区别在于,学习率除以 前t-1 迭代的梯度的平方和。故称为自适应梯度下降。此前的SGD及其变体的优化器主要聚焦在优化梯度前进的方向上,而AdaGrad首次使用二阶动量来关注学习率(步长),开启了自适应学习率算法的里程。
缺点是:学习率单调下降,会使得学习率单调递减至0,可能会使得训练过程提前结束。
5、RMSProp
它对Adagrad进行了优化,加入了迭代衰减。
与Adagrad的区别在于:在RMSProp中,梯度累积不是简单的前t-1次迭代梯度的平方和了,而是加入了衰减因子。简单理解就是学习率除以前t-1次迭代的梯度的加权平方和。
优点: 避免了二阶动量持续累积、导致训练过程提前结束的问题。
6、Adadelta
Adadelta是对RMSProp算法进一步优化,自适应性更强。
Adadelta算法与RMSProp算法一样,是为了解决Adagrad中学习率不断减小的问题,RMSProp是通过移动加权平均的方式,Adadelta也一样,并且Adadelta不需要学习率这个参数。
特点: 训练初中期,加速效果不错,很快;
训练后期,反复在局部最小值附近抖动。
7、Adam
Adam(自适应低阶矩估计)是SGDM和RMSProp的结合,它基本解决了之前提到的梯度下降的一系列问题,比如随机小样本、自适应学习率、容易卡在梯度较小点等问题。
优点: 通过一阶动量和二阶动量,有效控制学习率步长和梯度方向,防止梯度的振荡和在鞍点的静止。
缺点: 可能不收敛,可能错过全局最优解。
9、Nadam
Nadam是在Adam基础上进一步考虑了 Nesterov Acceleration。
常用损失函数:
1.mean_squared_error(y_true, y_pred)【MSE,均方误差】
2.mean_absolute_error(y_true, y_pred)【MAE,平均绝对误差】
3.mean_absolute_percentage_error【MAPE,平均绝对百分比误差】
4.mean_squared_logarithmic_error【MSLE,均方对数误差】
5.categorical_crossentropy【分类交叉熵,适用多类模式】
6.binary_crossentropy 【二进制交叉熵,该损失函数更适用于二分类问题】