激活函数
概念:激活函数是对某一个隐藏层的结点进行非线性激活操作,分为以下步骤:
(1)输入该节点的值为 x1,x2 时,在进入这个隐藏节点后,会先进行一个线性变换,计算出值 z[1]=w1x1+w2x2+b[1]=W[1]x+b[1] ,上标 1 表示第 1 层隐藏层。
(2)再进行一个非线性变换,也就是经过非线性激活函数,计算出该节点的输出值(激活值) a(1)=g(z(1)) ,其中 g(z) 为非线性函数。
常用的激活函数有:sigmoid,relu,tanh等
参考:https://www.cnblogs.com/lliuye/p/9486500.html
sigmoid存在梯度下降缓慢和函数值的输出不是以0为矩阵不方便下层的计算,一般尽量不用在隐藏层。
tanh:均值为0,也会出现梯度很小的问题,
relu:弥补了梯度缓慢的问题(输入为正数)
leaky relu:改进了的relu函数
使用激活函数的原因:如果不使用非线性激活函数,我们对神经网络最后的组合就是线性组合,这与线性回归没有本质的区别,不用神经网络也一样,然而现实中的问题往往是非线性复杂的问题,所以需要激活函数增强网络的学习能力。
深度学习中的正则化
正则化就是用来降低模型复杂度的,理解为解决过拟合(,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低)的方法:
1.L1正则化,实际上就是通过向目标函数添加一个正则化项,添加的是L1范数,这很容易产生稀疏解0多(知乎很多讲解原因的)
2.L2正则化,与L1正则化类似,向目标函数添加L2范数,参数的值最终很多都很小
3.数据集增强:创建假的数据添加到训练集中,常用数据太少的情况下,在图像处理,语言识别应用不少。
4.噪声鲁棒性:
第一种,向输入中增加噪声,即上面提到的数据增强,向输入增加噪声相当于对权重施加范数惩罚。
第二种:向权重中增加噪声,鼓励要学习的函数保持稳定,主要用于循环神经网络。
第三种是向输出目标注入噪声,大多数数据集的y标签都有一定错误,对于一个小的常数 \epsilon ,训练集标记y正确的概率就是 1-\epsilon ,例如标签平滑就能把确切分类目标从0和1替换成 \frac{\epsilon}{k-1} 和1- \epsilon ,正则化具有k个输出的softmax模型。标签平滑的优势是防止模型追求而确切的概率而不影响模型学习的正确分类。
5.早停:就是在验证集评价指标在一定迭代次数不再增加的情况下,停止迭代,防止过拟合。
6.dropout:在前向传播到指定层时,层中每个单元乘以相应的掩码,是否被去掉这个单元,然后继续向前传播,后续更新参数等,然后更新完一次参数,恢复所有未更新单元,重复这个过程。
只有极少的训练样本时,Dropout可能不会很有效。**可以被认为是集成大量深层神经网络的Bagging方法。
参考:https://zhuanlan.zhihu.com/p/38200980
训练过程:
假设我们要训练这样一个神经网络,如图2所示。
图2:标准的神经网络
输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。使用Dropout之后,过程变成如下:
(1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元)
图3:部分临时被删除的神经元
(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
(3)然后继续重复这一过程:
恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
深度模型中的优化
1.权重初始化
深度学习中的权值初始化(W)对网络很重要,一般不能全为0和太小,也不能太大,都会出现梯度消失无法更新的情况,常用的初始方法有:
初始化的基本思想 方差不变,即设法对权值进行初始化,使得各层神经元的方差保持不变。
Xavier初始化 从高斯分布或均匀分布中对权值进行采样,使得权值的方差是1/n,其中n是输入神经元的个数。该推导假设激活函数是线性的。
He初始化/MSRA初始化 从高斯分布或均匀分布中对权值进行采样,使得权值的方差是2/n。该推导假设激活函数是ReLU。因为ReLU会将小于0的神经元置零,大致上会使一半的神经元置零,所以为了弥补丢失的这部分信息,方差要乘以2。
批量规范化(batch-normalization,BN) 每层显式地对神经元的激活值做规范化,使其具有零均值和单位方差。批量规范化使激活值的分布固定下来,这样可以使各层更加独立地进行学习。批量规范化可以使得网络对初始化和学习率不太敏感。此外,批量规范化有些许正则化的作用,但不要用其作为正则化手段。
2.自适应学习率算法
深度学习的优化算法一般是梯度下降法,具体的有随机梯度下降,批量梯度下降,和小批量梯度下降,根据不同的数据量和参数量,可以选择具体的一种实现形式。
mini-batch 梯度下降法:将训练集样本分成多个batch,对每个batch执行梯度下降法,一个epochs相当于进行了很多次梯度下降,这样可以提高训练速度,这样进行训练的损失函数走向朝小,但是是有波动的,
随机梯度下降(batch_size=1)收敛慢,速度快,使用全部样本进行梯度下降,速度慢,收敛比较快:
一般数据量比较大选择64到512大小的batch。
指数加权平均:
偏差修正:解决初期平均值太小的问题:
个人理解优惠器可分为两大类,一种是优化过程中学习率不受梯度的影响,全程不变或者按照一定的衰减率随训练epoch变化,比如SGD,带Momentum的SGD,带BNesterov的SGD,这些都是通过指数衰减平均的思想优化的,学习率不会受梯度的影响,还有一种就是在优化过程中,学习率随梯度的变化而变化,思想是尽力消除给定的全局学习率的影响,比如Aadm等,参考:https://zhuanlan.zhihu.com/p/58236906
fastText
1. 原理
fastText既可以用来分类,也可以训练词向量,与Word2vec的CBOW比较类似,但是输入的是字符型的一篇文章的n-gram向量,输出就是类别,结果输出是分出softmax。
fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。
参考文章:https://zhuanlan.zhihu.com/p/32965521