当前位置:   article > 正文

自然语言处理面试题集_自然语言处理方向博士面试

自然语言处理方向博士面试

1. 为什么rnn循环神经网络会有梯度消失的情况,而lstm可以避免这种情况的发生?

首先来想想循环神经网络的结构是什么样的。

a. 它是由几十个甚至上百的神经元连接而成,这些神经元都是串行连接的。

b. 当计算完损失函数之后,需要逆向去更新神经网络中的权重。而且是从神经网络的尾部向前去更新,而rnn中输出值转隐层的激活函数一般使用的双曲正切函数tanc。其实在一般的rnn网络结构当中存在着3个权重参数,输出转隐层的参数w,隐层转隐层的参数的参数u,隐层转输出层的参数v。其实像v这种不依赖之前状态的参数,可以直接求导得到梯度。而像w,u这种依赖之前状态的参数需要连续求导得到。而像tanc和sigmoid函数的导函数都是要小于1的,而小于1的数如果连乘太多的话就会越来越趋近0。

下面是tanc的函数和导函数的图:

有人说是否可以使用relu函数代替tanc函数作为激活函数。这也是不行的,因为relu函数大于0时,函数的导数值是1。如果很多w的系数大于1,连乘之后就会产生梯度爆炸的结果。

relu函数如图所示

那么lstm又是如何解决梯度消失问题的呢?

这个问题在我看过很多的文章之后依然是非常模糊。如果想通过求导的方式去证明太麻烦了,非常难理解。但又有很多人说什么lstm的机构天然就是可以防止梯度消失的情况。

下面的解释可以稍微让人理解一下,什么lstm是怎样防止梯度消失和控制梯度下降。

但是在其他路径上,LSTM 的梯度流和普通 RNN 没有太大区别,依然会爆炸或者消失。由于总的远距离梯度 = 各条路径的远距离梯度之和,即便其他远距离路径梯度消失了,只要保证有一条远距离路径(就是上面说的那条高速公路)梯度不消失,总的远距离梯度就不会消失(正常梯度 + 消失梯度 = 正常梯度)。因此 LSTM 通过改善一条路径上的梯度问题拯救了总体的远距离梯度

同样,因为总的远距离梯度 = 各条路径的远距离梯度之和,高速公路上梯度流比较稳定,但其他路径上梯度有可能爆炸,此时总的远距离梯度 = 正常梯度 + 爆炸梯度 = 爆炸梯度,因此 LSTM 仍然有可能发生梯度爆炸。不过,由于 LSTM 的其他路径非常崎岖,和普通 RNN 相比多经过了很多次激活函数(导数都小于 1),因此 LSTM 发生梯度爆炸的频率要低得多。实践中梯度爆炸一般通过梯度裁剪来解决。

总结:

1. 为什么rnn会发生梯度消失的情况?当神经元构成的链太长,当使用梯度下降的方式来更新,神经元链中靠前面部分的神经元参数时,因为隐层之间的信息传递,必定会通过一个tanc函数处理,而tanc函数的导数是[0,1]之间的数,如果有很多个这样的数相乘的话,就会使得梯度趋近于0.

2.为什么LSTM可以解决梯度消失的问题?首先要知道梯度消失会导致什么问题,它导致的问题其实是权重w几乎不更新,这样就很难找到一个合适的权重w,去映射输入值与输出值之间的关系。lstm能够解决这个问题的巧妙之处在出(相对rnn而言),神经元之间的连接不仅仅有h, 还有信息C, h在神经元之间的传递会经过sigmoid函数处理,但是C不会。所以与C相关的权重W的更新不会因为神经元链过长而产生梯度消失的现象(指的是,遗忘门,信息增益门的权重w)。但是输出门的权重w,是可能会出现梯度消失的。所以可以说是高速通道C,掩盖了通道h的梯度消失的现象,所以从整体上看是没有梯度消失现象的。

2. 交叉熵函数是什么?在什么地方用过?

首先交叉熵损失函数如下所示:

L=ylog2y^+(1y)log2(1y^)

交叉熵损失函数可以用在二分类算法中的损失函数。其实由上述的公式可以知道不管是正例还是反例,当预测正确的可能性越高产生的损失就越低。它经常会和sigmoid函数一起使用。

3. Dropout的原理是什么?

除了输入和输出层外,使其它层的神经元的个数暂时性的减少,以达到一致过拟合的一种方法。

3. 什么是GBDT算法?

在介绍gbdt算法前,有必要先简单介绍一下boosting算法,它每步会产生一个弱预测模型,最后会将所有的弱预测模型累加汇总得到一个总模型,每个弱预测模型的生成都会依赖损失函数梯度递减的方式生成的,boosting被称为提升学习。

gdbt和adaboost都是boosting提升学习中的方法,不同的adaboost可以采用的弱分类器可以有很多。但是gbdt只能采用决策树(CART)作为弱分类器。GBDT采用的损失函数依然是最小二乘的损失函数。

4. 什么是xgboost算法?

xgboost本身就是GBDT算法,它是在gbdt算法的基础上进行了一系列的优化,从而使算法拥有了更好的性能。

下面简单总结一下,GBDT算法和xgboost之间的不同点:

除了算法上与传统的GBDT有一些不同外,XGBoost还在工程实现上做了大量的优化。总的来说,两者之间的区别和联系可以总结成以下几个方面。

  1. GBDT是机器学习算法,XGBoost是该算法的工程实现。
  2. 在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模 型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
  3. GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代 价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
  4. 传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类 器,比如线性分类器。
  5. 传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机 森林相似的策略,支持对数据进行采样。
  6. 传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺 失值的处理策略。弱分类器采用决策树

5. 什么是随机森林算法?

在了解随机森林算法前,我们先来了解一下bagging算法。bagging算法是集成算法下面的一个分支,与boosting方法合称为集成学习算法下面的两大分支。bagging它综合多个弱分类器形成一个强分类器,弱分类器之间没有联系,它的多样性体现在分类器的选择和样本的选择上。而随机森林算法,它是在bagging的算法基础上做了改动,引入了特征的随机选择。相对于bagging而言,它的效率和准确率都会更高。

  boosting集成学习,由多个相关联的决策树联合决策,什么叫相关联,举个例子,有一个样本[数据->标签]是[(2,4,5)-> 4],第一棵决策树用这个样本训练得预测为3.3,那么第二棵决策树训练时的输入,这个样本就变成了[(2,4,5)-> 0.7],也就是说,下一棵决策树输入样本会与前面决策树的训练和预测相关。

  与之对比的是random foreast(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有啥毛线关系。

6. 介绍一下Word2vec,CBOW和Skip-gram的区别是什么?

word2vec也叫做词嵌入表示,它能用密集矩阵表示一个词,相对于独热编码用稀疏矩阵表示词而言,他能大大的减少内存的使用量和运算的复杂度。

CBOW ,连续词袋法,它是word2vec方法中的一种。它的核心思想是利用它周边的词来预测该词。

skip-gram,的核心思想正好相反,它是利用一个词去预测它周边的词。

那么word2vec是如何做到减少矩阵维度的呢?

如上图所示,这i种场景是利用一个单词来预测一个单词的情况,它是利用了神经网络结构中隐层的性质,隐层可以不受输入层和输出层的影响自由控制大小。这里的隐层就是word2vec最终的矩阵表示。而利用多个单词来预测一个单词的情况如下图所示,他其实是将所以隐层的参数相加得到的。

word2vec这里还有一个知识点就是,它使用的损失函数是nec函数。在训练词嵌入矩阵的时候,它使用2分类问题去代替n分类问题。nec损失函数会随机从词库选取一些单词作为负例,其他的单词作为正例。我认为之所以这样做可行是因为,我们现在要做的事情是想用一个矩阵去表示单词而已,并不是真正做预测。所以这个简单的二分类可以满足我们的要求。

7. 深度学习优化算法有哪些,随便介绍一个(说的Adagrad,优缺点明显,进退自如); 

AdaGrad算法介绍

表示第i个参数的梯度,对于经典的SGD优化方法,参数θth的更新为:

再来看AdaGrad算法表示为:

其中,r为梯度累积变量,r的初始值为0。ε为全局学习率,需要自己设置。δ为小常数,为了数值稳定大约设置为

 

AdaGrad算法分析
 (1)从AdaGrad算法中可以看出,随着算法不断迭代,r会越来越大,整体的学习率会越来越小。所以,一般来说AdaGrad算法一开始是激励收敛,到了后面就慢慢变成惩罚收敛,速度越来越慢。

(2)在SGD中,随着梯度的增大,我们的学习步长应该是增大的。但是在AdaGrad中,随着梯度g的增大,我们的r也在逐渐的增大,且在梯度更新时r在分母上,也就是整个学习率是减少的,这是为什么呢?
这是因为随着更新次数的增大,我们希望学习率越来越慢。因为我们认为在学习率的最初阶段,我们距离损失函数最优解还很远,随着更新次数的增加,越来越接近最优解,所以学习率也随之变慢。
(3)经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。AdaGrade在某些深度学习模型上效果不错,但不是全部。
 

8. 深度学习优化算法用过哪些?讲讲Sgd和gd,bgd的区别? 

sgd是随机梯度下降,使用一个样本来求梯度,很省内存,但

是不稳定。

gd是梯度下降,使用所有的样本来求梯度。

bgd是小批量梯度的下降,使用一部分样本来求梯度,普遍采用bgd比较多。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/629640
推荐阅读
相关标签
  

闽ICP备14008679号