面试题目:记第一次NLP面试
链接:https://zhuanlan.zhihu.com/p/83080115
注:本文的答案既有参考该面试题目的答案,也有个人所学知识和网上其他文章的参考所得的答案,故而不能保证答案的准确性
1、python3中的深浅拷贝、装饰器?
答案:
浅拷贝:仅复制对象的值,但是不复制对象的元素的值,而是复制元素的引用
深拷贝:既复制对象的值,也复制元素的值
装饰器:给函数增加额外的功能,但是又不修改函数内部的代码和调用方式
2、在项目中用到了哪些激活函数,应如何选择使用哪种激活函数(为什么使用该激活函数而不是其他)?
答案(自答):分别使用了 sigmod、tanh、softmax
激活函数的图像如下:
图 2.1因为 sigmod 激活函数的值域为 [0, 1] ,因此在计算概率、比例等需要值域在 [0, 1] 之间的时候,特别是在二分类的时候,往往使用 sigmod 作为激活函数
而 tanh 激活函数的值域为 [-1, 1] ,因此在结果需要有负数的时候,则可以使用 tanh 作为激活函数
softmax 激活函数一般是用来计算多个类别的概率的,而且它能够让大的值变得更大,小的值变得更小,故而很适合用来计算多类别概率,故而在多类别任务中往往使用 softmax 作为激活函数
参考答案:https://zhuanlan.zhihu.com/p/30510596
下面是部分摘要:
如何选择正确的激活函数?
现在我们已经了解了这么多的激活函数,接下来就需要分析在哪种情况下应该使用哪种激活函数了。激活函数好或坏,不能凭感觉定论。然而,根据问题的性质,我们可以为神经网络更快更方便地收敛作出更好的选择。
用于分类器时,Sigmoid函数及其组合通常效果更好。
由于梯度消失问题,有时要避免使用sigmoid和tanh函数。
ReLU函数是一个通用的激活函数,目前在大多数情况下使用。
如果神经网络中出现死神经元,那么PReLU函数就是最好的选择。
请记住,ReLU函数只能在隐藏层中使用。
一点经验:你可以从ReLU函数开始,如果ReLU函数没有提供最优结果,再尝试其他激活函数。
3、知道什么是高方差、高偏差吗?遇到时应如何解决?
答案(自答):
高方差是指模型过拟合了,导致在测试集中的泛化能力较差。缓解过拟合的方法有:
① 降低模型的拟合能力,例如深度神经网络减少网络层数,随机森林则减小最大深度等等
② 对于深度学习可以用 dropout、批归一化、加正则化项
③对于非深度学习可以加正则化项
④增加样本,特别是某些类别的样本数量较少或没有
⑤使用集成方法
高偏差是指模型欠拟合,导致在测试集中预测值与标签值相差太大。缓解欠拟合的方法有:
①提高模型的拟合能力,例如深度神经网络可以增加网络层数、使用抽取特征更好的网络结构。而非深度学习则可以使用集成的方法
②增加训练样本
③增加输入的特征
④增加训练轮数
⑤使用适当的较小的学习率,或者使用动态的衰减的学习率
⑥对于 NLP 的深度学习模型,可以使用适当的词向量的维度、增加字典等
⑦不使用正则化项或减少正则化项系数
4、讲一下cnn中的padding,有什么用?池化呢?
答案(自答):cnn 中的 padding(填充,但也常常伴有截断操作) 是由于输入的张量大小不一样,所以需要 padding 来进行统一张量的大小,便于后续的操作。池化(Pooling) 是对张量应用卷积核操作,从而能够提取到局部的特征。
参考答案:https://zhuanlan.zhihu.com/p/36278093
padding 是为了增加各个边的像素的数量,目的是保持 feature map 不要太小,但也没必要超过原图的大小,所以不可以任意数量
padding 的上限是维持 feature map 跟原图大小一致,具体增加像素的多少,由 filter(滤波器) 的尺寸和 stride(步长) 大小共同决定。
padding 的作用是:
① 不丢弃原图信息
② 为了保持 feature map 的大小跟原图一致
③ 为了让更深层的的 layer 的 input 依旧保持有足够大的信息
为了实现上述目的,且不做多余的事情,padding 出来的像素的值都是 0,不存在引入噪声问题
pooling: 花书里有这样一段:池化函数使用某一位置的相领输出的总体统计特征来代替该网络在该位置的输出。例如最大池化(max pooling)函数给出相邻区域内的最大值。其他长常用的池化函数包括相邻矩形区域内的平均值、L2范数以及基于距中心像素距离的加权平均函数。不管采用什么样的池化函数,当输入作出少量平移时,池化能够帮助输入表示近似不变性。
5、rnn、lstm以及gru之间有什么差别?如何使用?
答案(自答):
可参考该文章:https://www.cnblogs.com/lovychen/p/9374277.html
RNN 是递归神经网络,适用于序列样本。
LSTM 则是在 RNN 的基础上增加了门结构和细胞记忆状态单元,其中门结构里主要包含遗忘门、输入门、输出门。
GRU 则是在 LSTM 的基础上简化了门结构,将遗忘门、输入门、输出门简化为更新门和重置门
使用:
LSTM 和 GRU 在很多任务上都不分伯仲,但是在数据集很大的时候,LSTM 的表达性能更好。而 GRU 由于有比 LSTM 更少的参数,故而在小数据集上的表现比 LSTM 更好
参考答案:
首先,可以确定的一件事是带有门机制的 RNN 普遍要比传统的RNN表现更佳,目前,很少有实验或论文来采用普通RNN来作为基本的单元了。对于 LSTM 与 GRU 而言, 由于 GRU 参数更少,收敛速度更快,因此其实际花费时间要少很多,这可以大大加速了我们的迭代过程。 而从表现上讲,二者之间孰优孰劣并没有定论,这要依据具体的任务和数据集而定,而实际上,二者之间的 performance 差距往往并不大,远没有调参所带来的效果明显,与其争论 LSTM 与 GRU 孰优孰劣, 不如在 LSTM 或 GRU的激活函数(如将tanh改为tanh变体)和权重初始化上功夫。一般来说,我会选择GRU作为基本的单元,因为其收敛速度快,可以加速试验进程,快速迭代,而我认为快速迭代这一特点很重要。如果实现没其余优化技巧,才会尝试将 GRU 换为 LSTM,看看有没有什么惊喜发生。所以说,深度学习就是玄学。
6、seq2seq有使用过吗?讲一讲?
答案(自答):没有,但是有了解过一点。seq2seq 主要由 Encoder 和 Decoder 组成,Encoder 负责从输入中抽取特征,并输入给 Decoder,而 Decoder 则负责根据 Encoder 的输入预测第一个节点的预测标签,再将第一个节点对应的真实标签作为第二个节点的输入,然后再输出第二个节点的预测标签,依此类推,直到最后一个节点。因此 seq2seq 被用在序列生成序列的任务中,这也是它的名称 seq2seq 的由来
7、用一到两句话说一下SVM是如何用于分类的?
答案(自答):SVM 通过根据支持向量来划分出一个超平面,从而将数据划分到超平面的两侧,从而实现分类
参考答案:引用统计学习方法(李航):支持向量机(SVM)是一种二分类模型,其基本模型是定义在特征空间上的间隔最大化的线性分类器。
8、见你在项目中用到macro-f1,是怎么计算的?为什么用f1,而不用Precision、recall、accuracy呢?
答案(自答):
macro-f1 是指按类别分别计算各个类别的 f1 值,再求算术平均。
而 accuracy 在样本不均衡的时候,不能准确反映模型的学习效果。而 f1 用到了 Precision、Recall 来计算,能比单独使用 Precision、Recall 的效果更好,因为它能够综合考虑 Precision 和 Recall
参考答案:https://www.zhihu.com/question/30643044
9、为什么你的网络有这样修改,或者说为什么这样搭建呢?有什么学术上的思考吗?
答案:暂时没有
10、既然用到了bert,那你应该有一定的理解吧,可以讲一讲bert吗?
答案(自答):BERT 是一个使用多层 Transformer 的 Encoder 作为特征抽取器,以及使用遮蔽目标单词(Mask)操作的,双向语言预训练模型,可以通过在 BERT 的最后一层添加目标任务所需的神经网络层,来实现应用于不同的任务且微调(finetune) BERT 的目的。
参考答案:https://github.com/yuanxiaosc/BERT_Paper_Chinese_Translation (BERT 的中文翻译版本)
11、cnn和rnn是如何用于自然语言处理中的?应如何选择使用?
答案(自答):CNN 有 TextCNN 模型用于文本分类,RNN 也可以用于文本分类、序列标注等 NLP 任务中。
CNN 适合用于提取局部信息的任务,而 RNN 则适合于序列模型,特别是需要用到上下文的任务,特别是 RNN 的变体 LSTM 和 GRU,能够记忆上下文的信息。
参考答案:cnn主要有textCnn,rnn就不多说了。如何选择使用:CNN比较适合一些比较依赖于某些特征的任务,进行重要特征提取(文本分类等);LSTM适合有上下文关联的,进行序列建模。
12、你应该有pytorch吧?使用的是哪个版本的呢?可以说一下什么新特性吗?
答案(自答):我使用的是 Tensorflow,版本是 1.13.1,由于 Tensorflow 是比较旧的版本,所以没有去了解有什么新特性。但是我有了解 Tensorflow 2.0 版本,将静态图修改为了动态图,方便 Debug ,调试代码;Tensorflow 2.0 大量使用了 Keras 的接口,使得使用 TF 时可以大量使用高级接口,减少代码量。
13、bert已经是去年的模型了,今年有哪些新技术有了解吗?可以讲一讲吗?
答案(自答):
XLNet 可以参考文章:https://zhuanlan.zhihu.com/p/70257427(XLNet:运行机制及和Bert的异同比较)
百度搞了个 ERNIE,通过将知识图谱引入到预训练中,使得预训练模型能够学习到更多知识。还有一个 XLNet,XLNet 类似 BERT ,采用的也是两阶段训练法,以及使用 Transformer 的 Encoder 作为特征抽取器,它改变的地方是输入数据,通过将一个句子的某个单词作为被预测的目标单词,其他的单词则被打乱顺序,然后一个句子就能变成多个句子,再从这些句子中筛选出部分的句子,作为训练集,这样模型就能够实现既能看到目标单词前的其它单词,又能看到在目标单词后的其它单词。
参考答案:
图 13.1
网友评论