1. 为什么FastText没有考虑语序,然而效果仍然很好?
FastText其实也是用了一种词袋模型,语序的特征确实没有考虑,不过鉴于CNN在文本分类的表现也比较优秀,对于分类任务,我觉得上下文的特征还是比语序的特征更加重要。
2. 如何理解LDA VS PLSA
PLSA中,主题分布和词分布都是唯一确定的。但是,LDA的作者们采用的是贝叶斯派的思想,认为它们应该服从一个分布,所以主题分布和词分布是不确定的。这里相当于抛硬币,对于PLSA,所以这个参数是固定的唯一的;而贝叶斯学派(LDA)看来事实上有很多很多硬币,各有不同的参数, 服从一个分布,从这个分布中先选择一个硬币,再拋,相当于分布的参数也服从一个分布,所以这个硬币的参数也是不确定的。
对于LDA来说,就是当采样一个主题时,会有多个主题分布,首先采样一个主题分布,然后再采样一个主题?狄利克雷分布就是指主题分布的参数所服从的分布,去这个分布里取值 当然有无穷多的参数可能性。PLSA只用了多项分布的思想,所以没有分布的不确定性。
LDA模型和PLSA的联系非常紧密,都是概率模型(LSA是非概率模型) , 是利用概率生成模型对文本集合进行主题分析的无监督学习方法。不同在于,PLSA是用了频率学派的方法,用极大似然估计进行学习,而LDA是用了贝叶斯学派的方法,进行贝叶斯推断,所以LDA就是在pLSA的基础上加了贝叶斯框架,即LDA就是pLSA的贝叶斯版本。LDA和PLSA都假设存在两个多项分布:话题是单词的多项分布,文本是话题的多项分布。不同在于, LDA认为多项分布的参数也服从-个分布,而不是固定不变的,使用狄利克雷分布作为多项分布的先验分布,也就是多项分布的参数服从狄利克雷分布。
为啥引入先验分布呢?因为这样能防止过拟合。为啥选择狄利克雷分布呢作为先验分布呢?因为狄利克雷分布是多项分布的共轭先验分布,那么先验分布和后验分布的形式相同,便于由先验分布得到后验分布。
3. 为很么RNN里普遍用tanh()而不是用relu()
本质问题上是说为什么CNN用relu()效果不错,而RNN不是很理想。
曾经看过一篇论文,里面提到图像信息是稠密的,文本信息是稀疏的。而实际情况中,对于我上面提到那个简单的情感分类问题中,可能一句话里面也就几个字或者一个词就能判断出来情感,如果使用relu再把这个信息给弄没了,那模型也没法去进行正常的分类了。而就像某位答主说的,lstm和gru加入的门控机制更多的是为了解决长期依赖问题。而relu怎么去充当门控结构,其本身就是一刀切的去剔除信息,而不是按需求就剔除信息。
从梯度上来说Relu可能会发生梯度爆炸。
例如sigmoid的函数,它的导数的取值范围是(0, 0.25],也就是说对于导数中的每一个元素,小于1的数乘在一起,必然是越乘越小的,就是所谓的“梯度消失”。ReLU函数的改进就是它使得 梯度等于1,这样的话只要一条路径上的导数都是1,无论神经网络是多少层,这一部分的乘积都始终为1,因此深层的梯度也可以传递到浅层中。
RNN这在某种程度上相当于对参数矩阵
W
W
W作连乘,很显然,只要 有一个大于1的特征值,在经过若干次连乘后都会导致结果是一个数值非常庞大的矩阵。
4. 为什么LSTM做的层次深了效果是很理想
越接近输入层的lstm层,更新速度越慢,慢到令人发指。lstm最大的优势是在时序上反向传播不容易出现梯度消失,但是它不能保证层与层之间传播过深不会出现梯度消失。在很多次实验之后,还是一两层的lstm能够更加快速地收敛,而在很多过深的lstm网络训练中,几乎无一例外地出现了梯度消失,局部收敛,训练效果极差的情况。
Transformer的解决方式是利用了残差的思想。
5. Layer Normalization 和 Batch Normalization(RNN)
Batch 顾名思义是对一个batch进行操作。假设我们有 10行 3列 的数据,即我们的batchsize = 10,每一行数据有三个特征,假设这三个特征是【身高、体重、年龄】。那么BN是针对每一列(特征)进行缩放,例如算出【身高】的均值与方差,再对身高这一列的10个数据进行缩放。体重和年龄同理。这是一种“列缩放”。而layer方向相反,它针对的是每一行进行缩放。即只看一笔数据,算出这笔所有特征的均值与方差再缩放。这是一种“行缩放”。
BN (64,j, k)
j代表一句话的某一位置 0 ~ seq_len 左闭右开。
k代表embedding dim范围 0 ~ 100维左闭右开。
因此,对于BN而言,batchsize的大小会影响BN效果。
如果我们输入batchsize = 128,即 BN (128,j, k)
LN (i, j, 100)
i代表 batchsize的范围, 0~64 左闭右开。
j代表一句话的某一位置 0 ~ seq_len 左闭右开。
因此batchsize的大小不影响LN。
但是如果我们换成了glove300d,则会影响~
那么我们为什么还要使用LN呢?因为NLP领域中,LN更为合适。
如果我们将一批文本组成一个batch,那么BN的操作方向是,对每句话的第一个词进行操作。但语言文本的复杂性是很高的,任何一个词都有可能放在初始位置,且词序可能并不影响我们对句子的理解。而BN是针对每个位置进行缩放,这不符合NLP的规律。
而LN则是针对一句话进行缩放的,且LN一般用在第三维度,如[batchsize, seq_len, dims]中的dims,一般为词向量的维度,或者是RNN的输出维度等等,这一维度各个特征的量纲应该相同。因此也不会遇到上面因为特征的量纲不同而导致的缩放问题。
6. Dropout/BN 在训练和测试的时候的区别
对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和方差。而在测试时,比如进行一个样本的预测,就并没有batch的概念,因此,这个时候用的均值和方差是全量训练数据的均值和方差,这个可以通过移动平均法求得。对于BN,当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差,gamma和bata。 BN一般要求将训练集完全打乱,并用一个较大的batch值,去缩小与全量数据的差别。
Dropout 是在训练过程中以一定的概率的使神经元失活,即输出为0,以提高模型的泛化能力,减少过拟合。Dropout的核心思想是训练时以一定的概率p(通常是50%)关闭隐藏层神经元的输出,也就是输出为0。这种策略可以从不同角度理解:首先这使得每次训练的模型并不是相同的结构,可以认为是原网络的子集,最终的输出是这些不同模型不同结构共同作用的结果(类似于集成学习中Bagging的策略);另外Dropout方法可以让神经元之间减小依赖性,因为随机的关闭可以使得神经元之间不会总是同时作用。
而在测试时,应该用整个训练好的模型,因此不需要dropout。测试时,全部神经元都使用,但是他们的输出乘上了系数(1-p)。
PyTorch也提供了区分训练和测试的方法:
训练时
model.train()
测试时
model.eval()
7. 递归和递推的区别
递推:从初值出发反复进行某一运算得到所需结果。-----从已知到未知,从小到达(比如每年长高9cm,20年180,30后270)。
递归:从所需结果出发不断回溯前一运算直到回到初值再递推得到所需结果----从未知到已知,从大到小,再从小到大。递归(Recursion)是从归纳法(Induction)衍生出来的
8. 防止过拟合
- 数据集扩增(Data Augmentation)
- Early Stopping的做法就是运行优化方法直到若干次在验证集上的验证误差没有提升时候停止。
- 正则项通常选择 L 1 L1 L1或者 L 2 L2 L2正则化
- Dropout方法通过修改隐藏层神经元的个数来防止网络的过拟合
- 多任务学习
9. 对于卷积核,两个3x3的卷积核与1个5x5的卷积核相比优点在哪里
大尺寸的卷积核可以带来更大的感受野,但也意味着更多的参数,为此,《Rethinking the Inception Architecture for Computer Vision》的作者提出可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,这样既保持感受野范围的同时又减少了参数量。2个3x3的卷积层拥有比1个5x5的卷积层更多的非线性变换。
10. 处理OOV问题的方法
- Wordpiece方式/BPE算法
- FastText中的subword方式
- 词典中加入<\UNKNOWN>
- 存在来自输入的OOV可以用指针网络
11. 梯度消失及解决方法
- 更换网络结构,例如RNN换成LSTM
- 激活函数的使用,例如换成Relu函数
- 使用梯度截断可以防止梯度爆炸
- BatchNorm具有加速网络收敛速度,提升训练稳定性的效果,本质上是解决反向传播过程中的梯度问题。
- 使用正则化(的梯度爆炸问题很多都是参数权重过大)
- 预训练+finetunning 此思想相当于是先寻找局部最优,然后整合起来寻找全局最优。
- 残差结构
12. 为什么神经网络越深越好?
数学理解:通过如下5种对输入空间(输入向量的集合)的操作,完成 输入空间 —> 输出空间 的变换 (矩阵的行空间到列空间)。1. 升维/降维2. 放大/缩小3. 旋转4. 平移5. “弯曲。从线性可分来看,设想网络拥有很多层时,对原始输入空间的“扭曲力”会大幅增加,如下图,最终我们可以轻松找到一个超平面分割空间。