过拟合
过拟合:模型过度拟合数据,使得在面对新的数据时预测效果不好,即模型的泛化能力不强
过拟合原因:1. 样本数量太少 2. 数据中噪声过大
解决过拟合:1. 增加数据(不容易做到)2. 正则化技术
为什么需要深层网络
对于比较复杂的任务,深层网络(DNN)的优势:
- DNN具有更多神经元,因此具有更多参数,这使得它可以拟合更加复杂的各种函数
- 现实世界的数据大多都是以分层的结构构造的,比如人脸识别任务,较低层次是各种形状和方向的线条(轮廓),中间层次就是这些线条组成的方形或圆形(五官),高层次的特征就是五官组成的人脸了,DNN的不同层从浅层到高层可以依次提取不同层级的特征
- DNN在新数据集上更具有健壮的泛化能力
一般来说,深层网络可以学到更多的东西,模型的灵活度更好,但缺点是也容易出现过拟合情况。因此,在设计网络结构时,应该设计出比你实际需要的更多层数、更多神经元的网络结构,然后使用规范化技术去防止过拟合。这样可以节省做实验去寻找最佳层数最佳神经元个数的时间,也能更快的得到更好的结果。
深度学习中的正则化技术
L1-Norm
标准正则化目标函数:
L1 规范化就是给目标函数加上一个参数的绝对值的和:
L1 正则化在零点不可微,因此权重以趋近于零的常数因子增长。很多神经网络在权重衰减公式中使用一阶步骤来解决非凸 L1 正则化问题,此时 L1 范数的近似变体是:
L1正则会让参数变得更稀疏,即让更多的参数变为0,这样可以达到类似特征选取的功能
L2-Norm
L2 规范化就是给目标函数加上一个参数的平方的和:
L1 和 L2 正则化的基本思想都是希望通过限制权重的大小(惩罚大权重),使得模型不能拟合任意的噪声数据,从而达到防止过拟合的目的。
数据增强
数据增强是提升算法性能、满足深度学习模型对大量数据的需求的重要工具。
数据增强通过向训练数据添加转换或扰动来人工增加训练数据集,如水平或垂直翻转图像、裁剪、色彩变换、扩展和旋转通常应用在视觉表象和图像分类中。
Dropout
Dropout 的思想和L1 norm,L2 norm 不同,它并不是通过学习到较小的权重参数来防止过拟合的,它是通过在训练的过程中随机丢掉部分神经元来减小神经网络的规模从而防止过拟合,一种简易的示意图:
这里的丢掉不是永远的丢掉,而是在某一次训练中丢掉一些神经元,这些丢掉的神经元有可能在下一次迭代中再次使用的,因此这里需要和Relu激活函数来做一下区分,Relu激活函数是永久的杀死取值为负的神经元
实际上Dropout 使得大规模的神经网络在训练时,把总体的那个大的神经网络分成了很多个小规模的神经网络在训练,也就是我们最终得到的模型就是很多个小规模的网络 ensemble 起来的,而 ensemble 的效果是可以提升模型性能也能防止过拟合
Early stopping
早停法可以限制模型最小化代价函数所需的训练迭代次数。早停法通常用于防止训练中过度表达的模型泛化性能差。如果迭代次数太少,算法容易欠拟合(方差较小,偏差较大),而迭代次数太多,算法容易过拟合(方差较大,偏差较小)。早停法通过确定迭代次数解决这个问题,不需要对特定值进行手动设置
神经网络初始化方法
random initialization
随机初始化是一种简单常用的初始化方法。
缺点:若随机分布选择不当,会导致网络优化陷入困境,尤其是位于深层次的网络的参数难以得到更新(梯度消失问题)
Xavier initialization
Xavier初始化的基本思想:为了使得网络中信息更好的流动,则应该保持输入和输出的方差一致,以避免所有输出值都趋向于0。其权重的初始化方法为:
He initialization
He initialization的基本思想:在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以要保持variance不变,只需要在Xavier的基础上再除以2
Batch Normalization(纵向规范化)
BN通过将每一层网络的输入进行normalization,保证输入分布的均值与方差固定在一定范围内,减少了网络中的Internal Covariate Shift问题,并在一定程度上缓解了梯度消失,加速了模型收敛;并且BN使得网络对参数、激活函数更加具有鲁棒性,降低了神经网络模型训练和调参的复杂度;最后BN训练过程中由于使用mini-batch的mean/variance作为总体样本统计量估计,引入了随机噪声,在一定程度上对模型起到了正则化的效果
BN 缺点:
- 十分依赖batch size:batch过小效果不好,batch过大显存不够
- 无法处理序列化数据的动态网络:如RNN
- 只在训练的时候用
Layer Normalization(横向规范化)
与 BN 不同,LN 是一种横向的规范化,它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
LN的操作类似于将BN做了一个“转置”,对同一层网络的输出做一个标准化。注意,同一层的输出是单个图片的输出,比如对于一个batch为32的神经网络训练,会有32个均值和方差被得出,每个均值和方差都是由单个图片的所有channel之间做一个标准化。这么操作,就使得LN不受batch size的影响。同时,LN可以很好地用到序列型网络如RNN中。同时,LR在训练过程和inference过程都会有,这就是和BN很大的差别
fastText
fastText 介绍
fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点:
- fastText在保持高精度的情况下加快了训练速度和测试速度
- fastText不需要预训练好的词向量,fastText会自己训练词向量(fastText可以用于文本分类、训练词向量)
fastText的核心思想:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类(fastText两个重要的优化)。
字符级别的N-gram(Subword model)
word2vec把语料库中的每个单词当成原子的,它会为每个单词生成一个向量。这忽略了单词内部的形态特征,比如:“apple” 和“apples”,“达观数据”和“达观”,这两个例子中,两个单词都有较多公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了。
为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词。对于单词“apple”,假设n的取值为3,则它的trigram有
“<ap”, “app”, “ppl”, “ple”, “le>”
其中,<表示前缀,>表示后缀。于是,我们可以用这些trigram来表示“apple”这个单词,进一步,我们可以用这5个trigram的向量叠加来表示“apple”的词向量。
Subword model 这带来两点好处:
-
对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享。subword model 使用字母 n-gram 作为单位,为了提高效率一般会过滤低频的 ngram 词,fasttext 中 n 取值为 3~6。这样每个词汇就可以表示成一串字母 n-gram,一个词的 embedding 表示为其所有 n-gram 的和。
-
对于训练词库之外的单词,仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量。
fastText 模型架构
fastText的模型架构类似于CBOW,两种模型都是基于Hierarchical Softmax,word2vec中的CBOW是通过上下文预测中间词,而fastText则是通过上下文(包括CBOW中的中间词)预测标签(这个标签就是文本的类别,是训练模型之前通过人工标注等方法事先确定下来的)。fastText的模型则是将整个文本作为特征去预测文本的类别。
注意:此架构图没有展示词向量的训练过程。
对比CBOW模型
- 模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而fasttext的输出层对应的是分类的label的概率。不过不管输出层对应的是什么内容,其对应的vector都不会被保留和使用;
- 模型的输入层:word2vec的输出层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容;
相同点:和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。
不同点:CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。
安装fastText
法一:pip install fasttext
法二:在Python扩展包网站上面搜索 fastText(Ctrl + f
),下载对应版本的 whl 文件,再使用pip install
安装此 whl 文件