1: 词向量是什么, 有哪些方式生成词向量, 句子的词向量是什么?
答:
词向量
将词汇为表示成向量,称作词向量
生成词向量的方式
生成词向量的方法有很多,这些方法都依照一个思想:任一词的含义可以用它的周边词来表示。生成词向量的方式可分为:基于统计的方法和基于语言模型(language model)的方法。
句向量
将不定长的句子用定长的向量表示,可以将句子整体输入BERT, 得到统一编码的矩阵作为句子向量; 也可以对每一个词单独生成词向量, 在做加权平均, 甚至直接求和。句向量为NLP下游任务提供服务。可以有如下应用:
2: Bert为啥能解决一词多意?怎么做到的?
答:同一个字在转换为bert的输入,虽然embedding的向量是一样,但是通过bert中的多层transformer encoder之后,attention关注不同的上下文,就会导致不同句子输入到bert之后,相同字输出的字向量是不同的,这样就解决了一词多义的问题。
3: 请说明Bert的注意力和seq2seq的注意力不同之处?
答:bert 的根基源于Transformer,所以其注意力机制是多头注意力机制,相比传统的RNN等模型更加高效,可以并行化处理同时能捕捉长距离的语义和结构依赖.提取的特征也更加丰富,而seq2seq的注意力Encoder端的所有信息压缩成一个固定长度的语义向量中, 用这个固定的向量来代表编码器端的全部信息. 这样既会造成信息的损耗, 也无法让Decoder端在解码的时候去用注意力聚焦哪些是更重要的信息,也无法并行处理问题
4: 我们一直在说ReLU比sigmoid好, 但是你能说说ReLU有什么问题呢? 你说的问题请深入到数学本质来阐述你的解释.
答: 虽说ReLU比sigmoid好,但是ReLU也有不可避免的缺陷,它有一个被称为 “ReLU 死区” 的问题:在训练过程中,一些神经元会“死亡”,即它们停止输出 0 以外的任何东西。在某些情况下,你可能会发现你网络的一半神经元已经死亡,特别是使用大学习率时。 在训练期间,如果神经元的权重得到更新,使得神经元输入的加权和为负,则它将开始输出 0 。当这种情况发生时,由于当输入为负时,ReLU函数的梯度为0,神经元就只能输出0了。
5: batch_size参数是如何影响模型的训练效果? 收敛速度? 过拟合的? 出现对应的问题你是如何解决的? 你用过哪些方法?
答:模型每次更新时,计算梯度是计算整个Batch的平均梯度,大的batch_size减少训练时间,提高稳定性。但是过大的batch_size泛化能力下降,在一定范围内,增加batchsize有助于收敛的稳定性,但是随着batchsize的增加,模型的性能会下降,收敛速度变慢。通过对训练步数的影响,小的batch_size使模型迭代次数增多,提前到达拟合点,但是epoch没结束,继续学习训练数据,容易导致过拟合于原始数据。
解决方法:增加了BN 层,dropout,更换了梯度下降的优化方法
6: CRF和HMM的区别.
1.HMM模型存在隐马假设, 而CRF不存在, 因此HMM的计算速度要比CRF模型快很多, 适用于对预测性能要求较高的场合.
2.同样因为隐马假设, 当预测问题中隐含序列单元并不是只与上一个单元有关时, HMM的准确率会大大降低, 而CRF不受这样限制, 准确率明显高于HMM.
7:CRF是如何训练的? 损失函数是什么?
(1)CRF层能从训练数据中获得约束性的规则.
(2)CRF层可以为最后预测的标签添加一些约束来保证预测的标签的合法性.
在训练数据训练的过程中, 这些约束可以通过CRF层自动学习到.从而大大降低标签序列在预测中非法序列出现的概率。
损失函数:
CRF损失函数由实际路径分数和所有可能路径的总分数组成。
(1)对于输入序列X对应的输出tag序列y, 定义分数如下(本质上就是发射概率和转移概率的累加和)
(2)利用softmax函数, 为每一个正确的tag序列y定义一个概率值, 在真实的训练中, 只需要最大化似然概率p(y|X)即可, 具体使用对数似然如下
(3)真实路径在所有可能的路径中有最高的分数。在训练过程中,模型的参数值将会一次又一次的更新,以继续增加真实路径的分数百分比。
8: 位置编码的作用, 从数学公式角度详细说下如何实现位置编码的?
答:作用:因为在Transformer的编码器结构中, 并没有针对词汇位置信息的处理,因此需要在Embedding层后加入位置编码器,将词汇位置不同可能会产生不同语义的信息加入到词嵌入张量中, 以弥补位置信息的缺失.
实现:最简单思路就是先将max_len x 1的绝对位置矩阵, 变换成max_len x d_model形状,然后覆盖原来的初始位置编码矩阵即可,要做这种矩阵变换,就需要一个1xd_model形状的变换矩阵div_term,我们对这个变换矩阵的要求除了形状外,还希望它能够将自然数的绝对位置编码缩放成足够小的数字,有助于在之后的梯度下降过程中更快的收敛. 这样我们就可以开始初始化这个变换矩阵了.首先使用arange获得一个自然数矩阵, 但是细心的同学们会发现, 我们这里并没有按照预计的一样初始化一个1xd_model的矩阵, 而是有了一个跳跃,只初始化了一半即1xd_model/2 的矩阵。 为什么是一半呢,其实这里并不是真正意义上的初始化了一半的矩阵, 我们可以把它看作是初始化了两次,而每次初始化的变换矩阵会做不同的处理,第一次初始化的变换矩阵分布在正弦波上, 第二次初始化的变换矩阵分布在余弦波上, 并把这两个矩阵分别填充在位置编码矩阵的偶数和奇数位置上,组成最终的位置编码矩阵.
9: bert为什么是双向的, 双向是如何体现的? 和BiLSTM的双向有何不同?
答:bert 是基于transformer的,预训练任务是一个mask LM ,通过随机的把句子中的单词替换成mask标签, 然后对单词进行预测。对于模型,输入的是一个被挖了空的句子, 而由于Transformer的特性, 它是会注意到所有的单词的,这就导致模型会根据挖空的上下文来进行预测, 这就实现了双向表示, 说明BERT是一个双向的语言模型。而BiLSTM模型,网络结构上, 每个单词都从正向和反向都得到一个表示, 然后将此表示进行连接, 则此时认为这就是单词的双向表示
10: Transformer的encoder与decoder中的mask, attention分别有什么区别? 如何理解?
答:encoder端:首先确定mask的形状是 batch_size*seq_length,对于小于最大长度的句子进行补0操作,对于大于最大长度的句子进行截断操作。虽然对少于最大长度的句子进行了补零操作但是这些0仍然会参与注意力分数的计算。这里需要将mask中的0变成负无穷,1变成0,与计算的注意力矩阵相加,原来有单词的注意力不变,没有单词的位置变换成负无穷,之后在进行softmax运算
attention多头自注意力层采用的是一种Scaled Dot-Product Attention的计算方式, 实验结果表明, Mul ti-head可以在更细致的层面上提取不同head的特征, 比单一head提取特征的效果更佳.
decoder端的mask形状是一个下三角矩阵,解码器在翻译单词时只能看到前面已经翻译的单词,不能看到后面的答案,所以使用一个下三角矩阵进行遮盖,每一次解码只给解码器看前面的单词。
多头自注意力层采用和Encoder模块一样的Scaled Dot-Product Attention的计算方式, 最大的 区别在于需要添加look-ahead-mask, 即遮掩"未来的信息".
Encoder-Decoder Attention层和上一层多头自注意力层最主要的区别在于Q != K = V, 矩阵Q来源于上一层Decoder Block的输出, 同时K, V来源于Encoder端的输出.
11: 详细说说FastText的工作原理和Word2Vec的相似处, 不同处?
答:原理:fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。
序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。
fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
相似处:
图模型结构很像,都是采用embedding向量的形式,得到word的隐向量表达。
都采用很多相似的优化方法,比如使用Hierarchical softmax优化训练和预测中的打分速度。
不同处:
模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而fasttext的输出层对应的是分类的label。不过不管输出层对应的是什么内容,起对应的vector都不会被保留和使用。
模型的输入层:word2vec的输出层,是 context window(上下文) 内的term;而fasttext 对应的整个sentence(句子)的内容,包括term,也包括 n-gram的内容。
两者本质的不同,体现在 h-softmax的使用:
Word2vec的目的是得到词向量,该词向量 最终是在输入层得到,输出层对应的 h-softmax
也会生成一系列的向量,但最终都被抛弃,不会使用。
fastText则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)
12: 深入到Fasttext的架构级别, 几层网络? 字符级别n-gram的sub_word如何构造的?
答:3层网络,输入层,隐含层,输出层,所谓subword,就是取一个介于字符和单词之间成分为基本单元建立的模型。而所谓Byte Pair Encoding(一下简称BPE),就是寻找经常出现在一起的Byte对,合并成一个新的Byte加入词汇库中。即若给定了文本库,若我们的初始词汇库包含所有的单个字符,则我们会不断的将出现频率最高的n-gram的pair作为新的n-gram加入词汇库中,直到达到我们的要求。
13: Fasttext的输出层是如何加速的?
答:采用了一个softmax层级(利用了类别不均衡分布的优势)来加速运算过程。
fastText 也利用了类别(class)不均衡这个事实(一些类别出现次数比其他的更多),通过使用 Huffman 算法建立用于表征类别的树形结构。因此,频繁出现类别的树形结构的深度要比不频繁出现类别的树形结构的深度要小,这也使得进一步的计算效率更高。
14: 关于Glove词向量的理解和认识? 它和Word2Vec的区别是什么?
答:GloVe是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具,它可以把一个单词表达成一个由实数组成的向量,这些向量捕捉到了单词之间一些语义特性,比如相似性(similarity)、类比性(analogy)等。我们通过对向量的运算,比如欧几里得距离或者cosine相似度,可以计算出两个单词之间的语义相似性。
区别:
Word2Vec 是一种基于预测的模型,即 predictive model
GloVe 是一种基于统计的模型,即 count-based model
具体来说:
基于预测的模型,其目标是不断提高对其他词的预测能力,即减小预测损失,从而得到词向量。
而基于统计的模型,是通过对词的共现计数矩阵进行降维,来得到词向量;首先需要根据整个语料建立一个大型的体现词共现情况的矩阵,其目标是优化减小重建损失(reconstruction loss),即降维之后的向量能尽量表达原始向量的完整信息。
实际使用中,两种向量的对下游任务的效果并没有太大差别。
GloVe 相对于 Word2Vec 有一个优点是更容易并行化执行,可以更快,更容易地在大规模语料上训练。
15:BERT为什么做这两个预训练任务呢? 分别详细说明, 并详细解释MASK机制中80%, 10%, 10%的原因?
答:BERT加入两个预训练任务是为了强化BERT处理不同问题的能力
next sentence prediction:输入[CLS]a[SEP]b[SEP],预测b是否为a的下一句,即二分类问题;
mask prediction:输入[CLS]我 mask 中 mask 天 安 门[SEP],预测句子的mask,多分类问题
MASK机制中80%, 10%, 10%的原因:
首先, 如果所有参与训练的token被100%的[MASK], 那么在fine-tunning的时候所有单词都是已知的, 不存在[MASK], 那么模型就只能根据其他token的信息和语序结构来预测当前词, 而无法利用到这个词本身的信息, 因为它们从未出现在训练过程中, 等于模型从未接触到它们的信息, 等于整个语义空间损失了部分信息. 采用80%的概率下应用[MASK], 既可以让模型去学着预测这些单词, 又以20%的概率保留了语义信息展示给模型。保留下来的信息如果全部使用原始token, 那么模型在预训练的时候可能会偷懒, 直接照抄当前token信息. 采用10%概率下random token来随机替换当前token, 会让模型不能去死记硬背当前的token, 而去尽力学习单词周边的语义表达和远距离的信息依赖, 尝试建模完整的语言信息.最后再以10%的概率保留原始的token, 意义就是保留语言本来的面貌, 让信息不至于完全被遮掩, 使得模型可以"看清"真实的语言面貌。
16:BERT中为什么要除以根号下dk?
答:Q和K点积后的结果大小是跟维度成正比的,所以经过softmax以后,梯度就会变很小,除以根号dk后可以让attention的权重分布方差为1,而不是dk。
17:你的项目中使用降维的方法有哪些? 维度由多少降低到多少?
答:数据降维的方法降维方法分为线性核非线性降维,非线性降维又分为基于核函数和基于特征值的方法。线性降维方法:PCA ICA LDA LFA LPP(LE的线性表示)基于核函数的非线性降维方法:KPCA KICA KDA基于特征值的非线性降维方法(流型学习):ISOMAP LLE LE LPP LTSA MVU
缺失值比率 (Missing Values Ratio)低方差滤波 (Low Variance Filter)高相关滤波 (High Correlation Filter)随机森林/组合树 (Random Forests)主成分分析 (PCA)反向特征消除 (Backward Feature Elimination)前向特征构造 (Forward Feature Construction)其它:随机投影(Random Projections)、非负矩阵分解(No-negative MatrixFactorization)、自动编码(Auto-encoders)、卡方检测与信息增益(Chi-square andinformation gain)、多维标定(Multidimensional Scaling)、相关性分析(CoorespondenceAnalysis)、因子分析(Factor Analysis)、聚类(Clustering)以及贝叶斯模型(BayesianModels)。
18:随机森林和XGboost的原理和区别? 怎么用的呢? XGBoost怎么挑选的最优参数, 参数有哪些?
答:RandomForest使用Bagging和聚合,并使用完全生长的树木,而XGBoost使用Boosting,并使用弱者。 RandomForest更快,计算量更少,并且需要的参数也更少。
19:讲一下多头注意力机制? Dropout的优缺点和原理? 避免过拟合的方法?
答:多头注意力机制是将自注意力拓展到多个子空间中,多头的本质是多个独立的attention计算,作为一个集成的作用,增强语义信息的提取能力,防止过拟合;
Dropout的优缺点和原理:
优点:dropout具有平均作用,每轮训练时,将部分神经元死亡,也就是说每轮的模型的都不同,假设有n个神经元,那么一共有2的n次方种组合方案(粗略计算,实际不是)。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。缺点:dropout会导致训练时间增长,而测试时间几乎不变。主要原因是训练时需要通过伯努利分布生成每一个神经元drop掉的概率,此外多余的乘运算和rescale运算也会增加时间。而dropout目前在全连接层中使用较多,参数设置可选0.3或者0.5,原因在于卷积神经网络隐藏层中由于卷积本身的稀疏性,以及ReLU函数带来的稀疏性,使用dropout效果并不好。
避免过拟合的方法:
Early stopping:在每一个Epoch结束时计算validation data的accuracy,当accuracy不再提高时,就停止训练。
数据集扩增:从数据源采集更多数据复制原有数据并加上随机噪声重采样根据当前数据集估计数据分布参数,使用该分布产生更多数据等正则化方法
正则化方法:正则化方法是指在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等。
Dropout:修改ANN中隐藏层的神经元个数来防止ANN的过拟合。
20:你做过哪⼏个案例属于⽣成式任务? ⽤了什么模型架构? 有何优缺点?
答:莎士比亚文本生成任务:使用的是RNN模型,模型简单训练速度快,但是容易生成一模一样的内容,因此在里面添加了随机因子,使得每次预测的字根据rnn输出概率分布随机产生。
21:传统seq2seq架构在解决⽣成式任务时有什么优点? 有什么缺点? 如何改进, 请详细说明。
答:缺点:编码器阶段将输入内容压缩到一个文本向量中,容易出现开始内容信息丢失的情况,解码时只使用了编码器阶段的压缩向量,没有考虑输入与输出内容之间的对应关系。
改进:在解码阶段增加注意力机制。
22:linear nomolization和batch nomolization的差别?
答:BN的重点是在于针对整个batch中的样本在同一维度特征在做处理,而linear norm做的是针对每一个样本,做特征的缩放。
linear norm和BN的区别在于一句话中的每个单词都可以归到一个名字叫“语义信息”的一个特征中,也就是说,linear norm也是对同一个特征下的元素做归一化,只不过对应的 不再是batch size 而是对应的文本长度。
23:说一下层次softmax和负采样?
答:层级softmax涉及到一个叫做哈夫曼树的东西,哈夫曼树是带权路径和最短的最优二叉树,所以通过对词表中的词进行树构造,可以生成一个哈夫曼树,越接近根节点的词,其词频是越高的,我们需要优先更新,越向下,词频越低,更新频率也小一点,通过这样的方式就可以实现训练速度的加快。
正常情况下的预测结果是包括大量正样本和负样本的,但是若词表非常大,为了降低复杂度,所以我们每次只随机采样一定数量个负样本参与到损失函数的计算,这就是所谓的负采样。