【NLP面试QA】基本策略
防止过拟合的方法
- 根据验证集分数设置 early_stoping
- 数据增强
- dropout
- 正则化:正则化会使得参数值更小,模型更简单,从而避免过拟合,即奥卡姆剃刀原理
- 还有一些其他的方法,比如采用对抗训练的方法可以增强模型的鲁棒性和抗干扰能力,也能一定程度上防止过拟合
什么是梯度消失和梯度爆炸?如何解决?
- 由于梯度反向传播遵循链式求导法则,浅层网络的梯度包含深层网络梯度的累乘项,当多个梯度远小于 1 时,使得浅层神经网络的梯度趋向于 0,难以训练。相对的,若多个梯度远大于 1,将使得浅层网络的梯度远大于 1,不断对梯度进行修正,使得网络权重不断增大从而导致上溢,无法被训练。
- 梯度爆炸:
- 产生原因:(1)隐藏层的层数过多;(2)权重的初始化值过大
- 解决方案:(1)梯度裁剪;(2)采用 ReLU 等激活函数
- 梯度消失:
- 产生原因:(1)隐藏层的层数过多;(2)激活函数梯度较小
- 解决方案:(1)采用残差网络;(2)合适的权重初始化策略;(3)采用 Relu 等激活函数(梯度为1);(4)BatchNorm 等规范化方法
在深度学习中,网络层数增多会伴随哪些问题,怎么解决?
- 计算资源的消耗(GPU)
- 模型容易过拟合(Dropout)
- 梯度消失/梯度爆炸问题的产生(批量归一化BN):归一化操作能对各层的输出做归一化,这样梯度在反向层层传递后仍能保持大小稳定,不会出现过小或过大的情况。
- 退化问题:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大(残差网络ResNet)
关于模型参数
模型参数初始化的方法
- 均匀分布
- 正态分布
- 正交初始化
- 稀疏初始化
- Xavier 正态分布(Xavier 根据每一层的神经元个数来设置每层权值初始化的方差,防止梯度消失的情况出现,对于中心对称的激活函数十分有效)
- Kaiming 正态分布(针对于 ReLU 激活函数,Xavier 还是会出现梯度消失的情况,因此提出了Kaiming 分布)
模型参数初始化为 0、过大、过小会怎样?
- 初始化为 0,前向计算时,所有的隐层神经元的激活值都相同。这样会导致所有神经元都是对称的而没有区分性,无法提取不同特征。不仅仅在初始化为 0 的时候会出现这种情况,严格上来说不能将网络参数初始化为一个常数值
- 参数过小或过大:对于 sigmoid 和 tanh 这一类激活函数,初始化参数过小,意味着激活函数将丢失非线性能力。而当参数初始化过大的时候,将导致参数的激活值变得饱和,从而导致梯度变为零,导致模型难以训练
为什么说模型参数越小,模型越简单
- 模型参数越小,使得某些维度上的特征受到抑制难以表达,类似于 dropout 的作用
- 另一方面,对于 sigmoid 以及 tanh 这一类的激活函数,模型参数过小,将使得模型丢失非线性能力
正则化 Regularization
正则化方法
- 正则化是在损失函数中加入一个正则化项,正则化项表明,模型参数越大,对损失函数的惩罚越大,迫使模型参数在低损失的同时尽量变小。
- L1正则化:\(J = \frac{1}{m} \sum_{i=1}^m L(f(x_i), y) + \frac{\lambda}{2m} \sum_{j}|w_j|\)
- L2正则化:\(J = \frac{1}{m} \sum_{i=1}^m L(f(x_i), y) + \frac{\lambda}{2m} \sum_{j}w_j^2\)
- L1正则化会是的网络稀疏的原因:由于L正则化中绝对值的引入,使得当权重 \(w_i=0\) 的时候,其反向传播梯度在\(0^+\)和\(0^-\)是非连续的,当两侧的梯度异号时,\(w_i=0\) 则成为了一个极小值,从而不再更新。多个权重发生这个情况的话,就使得网络变得稀疏了。
正则化如何解决过拟合的
- 正则化在损失函数中加上了权值相关的惩罚项,对解空间加了额外的约束,避免模型过度拟合数据
- 另一方面正则化会使得模型参数尽量小,参数越小,对于 sigmoid 和 tanh 等激活函数的激活值容易落在线性区间,使得模型的非线性能力减弱(模型越简单越能避免过拟合即奥卡姆剃刀原理——“如无必要,勿增实体”,即“简单有效原理”)
如何在代码中加入正则化
- 通常加正则化不会直接加在 loss 函数上,在 pytorch 的 optimization 中有一个 weight_decay 的关键字,可以对其进行设置,等效为 L2 正则化
关于梯度下降
Batch/Mini-Batch/SGD梯度下降
- Batch 梯度下降:训练所有样本,累加loss之后,再进行梯度反向传播,更新模型参数。通常在小数据集时采用这种方法,因为越多的数据越能代表样本总体
- SGD随机梯度下降:
- 每次仅训练单个样本传播一次梯度
- 容易受到单个样本噪声的影响
- 训练速度较慢
- 最终通常在最优点附近持续震荡,难以收敛
- mini-Batch梯度下降:训练mini-batch个样本,累加 loss 之后,进行梯度反向传播,更新参数,如果 mini-batch 为1,则是随机梯度下降算法,如果 mini-batch 为 m(数据集大小),即是 batch 梯度下降法。当数据量足够大,m 足够大时,可以等价于 Batch 梯度下降
增大 batch size 的影响
- 增大内存利用率,并行效率提高,训完一个 epoch 的迭代次数减少
- 各个样本之间的梯度相互抵消,减小单个样本噪声的影响,下降方向更接近样本总体的方向
- 但过大的 batch size 会使得迭代次数减少,想要达到相同的精度的时间大大增加,
- batch size 增大到一定程度梯度下降方向基本不再改变
优化算法(Momentum/RMSProp/Adam)
动量梯度下降算法(Momentum)
- 额外维护了参数梯度的一个滑动平均值,更新参数的不直接利用权重的梯度,而是利用当前的一个滑动平均值来进行更新,这样的做法使得多次迭代的梯度在非收敛方向上的分量相互抵消,而收敛方向上的分量不断叠加,使得收敛速度更快。
\[\begin{aligned}
&v_{dW^{l}} = \beta v_{dW^{l}} + (1-\beta)dW^{l}\\
&v_{db^{l}} = \beta v_{db^{l}} + (1-\beta)db^{l}\\
&W^{l} = W^{l} - lr v_{dW^{l}}\\
&b^{l} = b^{l} - lr v_{db^{l}}
\end{aligned}\]RMSProp算法(Root Mean Square Prop,均方根支):
- RMSProp算法额外维护了参数梯度二阶动量的滑动平均,二阶动量记载了历史梯度的变化幅度大小,利用二阶动量信息对梯度的更新做了一个限制作用,如果二阶动量的平均信息较大,说明该时段的梯度变化范围较大,我们在该时段的梯度更新幅度就应该更小,减少在前往最小值路径上的摆动情况
\[\begin{aligned}
&s_{dW^{l}} = \beta s_{dW^{l}} + (1-\beta)(dW^{l})^2\\
&s_{db^{l}} = \beta s_{db^{l}} + (1-\beta)(db^{l})^2\\
&W^{l} = W^{l} - lr \frac{dW}{\sqrt{s_{dW}} + \epsilon}\\
&b^{l} = b^{l} - lr \frac{dW}{\sqrt{s_{db}} + \epsilon}
\end{aligned}
\]Adam优化算法:结合了动量梯度下降算法以及 RMSProp 算法,能够有一个超越两者单独的一个效果
归一化 Normalization
深度学习中的 Internal Covariate Shift(内部协变量偏移)
深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。Google 将这一现象总结为 Internal Covariate Shift,简称 ICS。
ICS 会导致什么问题
- 上层参数需要不断适应新的输入数据分布,降低学习速度。
- 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
- 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
Normalization 的基本思想与通用框架
- 基本思想:在将 输入数据 送给神经元之前,先对其做平移和伸缩变换, 将 输入数据 的分布规范化成在固定区间范围的标准分布。
- 通用变换框架:
\]
其中 \(\mu\) 和 \(\sigma\) 是平移和缩放参数,用于将数据转化为标准正态分布。而 \(b\) 和 \(\sigma\) 为再平移和再缩放参数,为可学习的,用于将数据转化为相应的非标准正态分布。再平移和再缩放的操作是为了保证模型的表达能力不因为规范化而下降,或者说,在一定程度上尊重了神经元的学习结果。
Batch Normalization —— 纵向规范化
- 其规范化针对单个维度的输出 \(x_i\)(单个神经元的输出)进行的,利用网络训练时一个 mini-batch 该神经源的输出来计算 \(x_i\) 的均值和方差,因而称为 Batch Normalization。
\[\mu_i = \frac{1}{M}\sum x_i, \sigma_i = \sqrt{\frac{1}{M}\sum (x_i-\mu_i)^2+\epsilon}
\]其中,\(M\) 是 Mini-batch 的大小。BN 比较适用的场景是:每个 mini-batch 比较大,数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多。该方法在CNN中表现良好,但是在RNN中表现欠佳
Layer Normalization —— 横向规范化
- 层规范化就是针对 BN 的上述不足而提出的。与 BN 不同,LN 是一种横向的规范化,同一个规范化操作来转换所有维度的输入。
\[\mu = \sum x_i, \sigma = \sqrt{\sum (x_i-\mu_i)^2+\epsilon}
\]参数均为标量(BN中是向量),所有输入共享一个规范化变换。LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
为什么 NLP 中用 Layer Normalization 效果较好而 CV 中 Batch Normalization 的效果较好
LN 和 BN 的主要区别在于 normalization的方向不同。
对于 RNN 等时序模型,具有两个特点:
- 同一个 batch 内部的训练实例长度不一(不同长度的句子),样本间的数据分布差别较大
- 另外对于文本数据同一个词很可能出现在不同的位置,即同一位置的数据分布会非常不一致
数据分布差异大是 BatchNorm 无法解决的问题,因此不适用。而对于句子方向上的归一化更为合适的,不会引入样本间的差异,而且句子的基本成分都是固定的,因此 LayerNorm 更为合适。
【NLP面试QA】基本策略的更多相关文章
- 【NLP面试QA】预训练模型
目录 自回归语言模型与自编码语言 Bert Bert 中的预训练任务 Masked Language Model Next Sentence Prediction Bert 的 Embedding B ...
- 【NLP面试QA】激活函数与损失函数
目录 Sigmoid 函数的优缺点是什么 ReLU的优缺点 什么是交叉熵 为什么分类问题的损失函数为交叉熵而不能是 MSE? 多分类问题中,使用 sigmoid 和 softmax 作为最后一层激活函 ...
- 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse
<设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...
- 如何面试QA(面试官角度)
面试是一对一 或者多对一的沟通,是和候选人 互相交换信息.平等的. 面试的目标是选择和雇佣最适合的人选.是为了完成组织目标.协助人力判断候选人是否合适空缺职位. 面试类型: (1)预判面试(查看简历后 ...
- Android -- 面试 -- 数据库升级策略
升级:重写onUpgrade方法 确定 相邻版本 的差别,从版本1开始依次迭代更新,先执行v1到v2,再v2到v3…… 为 每个版本 确定与现在数据库的差别,为每个case撰写专门的升级代码. 降级 ...
- 【面试QA】Attention
目录 Attention机制的原理 Attention机制的类别 双向注意力 Self-Attention 与 Soft-Attention 的区别 Transformer Multi-Head At ...
- [转]9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...
- 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...
- (转)9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
原文:http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html 1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也 ...
随机推荐
- 使用Navicat或者其他数据库工具连接阿里云EDS(数据库服务器)实例过程详解
使用Navicat或者其他数据库工具连接阿里云EDS(数据库服务器)实例过程详解 背景:这几天从阿里云上面购买了云服务器,最垃圾的那种,还送oss和EDS数据库服务器,只不过EDS数据库服务器只有一个 ...
- OpenCV读一张图片并显示
Java 版本: JavaCV 用OpenCV读一张图片并显示.只需将程序运行时的截图回复.如何安装配置创建项目编写OpenCV代码,可参考何东健课件和源代码或其他资源. package com.gi ...
- MySQL之单表多表查询
#1.单表查询 #单表查询语法 select <字段1,字段2....> from <表名> where <表达式> group by field 分组 havin ...
- vue+webpack工程环境搭建
使用Vue-cli脚手架(属于vue全家桶)快速构建一个项目: [1]首先需要安装好node.js; [2]安装webpack,指令$npm install -g webpack; //如果之前有安装 ...
- 2653 区间xor
前言 这个题目在我之前那篇c++位运算的的随笔中提到过. 有兴趣的话去看看吧! 飞机场:https://www.cnblogs.com/laoguantongxiegogofs/p/12444517. ...
- Ctrl+F5和F5区别
F5刷新的内容是从本地缓存中读取刷新,刷新本地缓存 Ctrl+F5直接读取服务器上的最新的内容—— Ctrl+F5会把Internet 临时文件夹的文件删除再重新从服务器下载,也就是彻底刷新页面了.. ...
- Simulink仿真入门到精通(十一) 模块的封装
当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...
- Vue2.0 【第二季】第8节 Component 父子组件关系
目录 Vue2.0 [第二季]第8节 Component 父子组件关系 第8节 Component 父子组件关系 一.构造器外部写局部注册组件 二.父子组件的嵌套 Vue2.0 [第二季]第8节 Co ...
- Antd 表格内通过rowClassName实现隔行变色的显示方法(转载)
ant design中 table组件很方便,在项目中遇到了需要实现奇偶行颜色不同以方便阅读的功能,主要用到了rowClassName这一api,通过判断index的奇偶来实现不同的样式分配. row ...
- 【MyBatis笔记】mapper文件的配置以及说明
<!doctype html>[MyBatis笔记]mapper文件的配置以及说明 figure:last-child { margin-bottom: 0.5rem; } #write ...