深度学习

  1. 如何处理神经网络中的过拟合?

(1)L1/L2正则。L1正则化与L2正则化 正则化之所以能够降低过拟合的原因在于,正则化是结构风险最小化的一种策略实现。给loss function加上正则化项,能使得新得到的优化目标函数h = f+normal,需要在f和normal中做一个权衡(trade-off),让解更加简单,符合奥卡姆剃刀理论,同时也比较符合在偏差和方差(方差表示模型的复杂度)分析中,通过降低模型复杂度,得到更小的泛化误差,降低过拟合程度。
结构化风险最小化:在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,以此提高泛化预测精度

  • L1正则化就是在loss function后边所加正则项为L1范数,加上L1范数容易得到稀疏解(0比较多)。
  • L2正则化就是loss function后边所加正则项为L2范数的平方,加上L2正则相比于L1正则来说,得到的解比较平滑(不是稀疏),但是同样能够保证解中接近于0(但不是等于0,所以相对平滑)的维度比较多,降低模型的复杂度。

(2)提前停止(Early stop)。在每次迭代时,将新得到的模型在验证集省进行测试,并计算错误率,如果在验证集上的错误率不再下降,就停止迭代。
(3)dropout。在神经网络的训练过程中,对于神经单元按一定的概率将其随机从网络中丢弃,从而达到对于每个mini-batch都是在训练不同网络的效果, 相当于对多个不同神经网络取平均,一些互为反向的拟合相互抵消就可以达到整体上减少过拟合。
Dropout 为什么需要进行缩放呢?
因为训练的时候会随机的丢弃一些神经元,但预测的时候没法随机丢弃,如果丢弃会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a ,有时候输出 b,结果不稳定。补偿的方案就是每个神经元权重都乘以一个p,这样在总体上使得测试数据和训练数据大致一样,比如一个神经元输出是x,那么训练的时候有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)*0=px。测试的时候把这个神经元的权重乘以p可以得到同样的期望。
拓展:Dropout和R-Dropout的使用技巧
(4)数据增强。

  1. 常见的损失函数有哪些?

0-1损失函数、平方损失函数、绝对值损失函数、对数损失函数、交叉熵损失函数(等价于负对数似然函数)、Hinge损失函数。损失函数和风险函数(需要自己梳理)
为什么LR不用均方差损失?
为什么分类问题的损失函数采用交叉熵而不是均方误差MSE?
对MSE进行求导是与sigmoid函数求导相关的,sigmoid在输出接近0和1的时候是非常小的,故导致在使用最小均方差Loss时,模型参数w会学习的非常慢,使用交叉熵Loss则没有这个问题,交叉熵受误差的影响,当误差较大的时候,权重更新就快,当误差小的时候,权重的更新就慢。为了更快的学习速度,分类问题一般采用交叉熵损失函数,交叉熵损失不仅可以很好的衡量模型的效果,又可以很容易的进行求导计算。
交叉熵的缺点:sigmoid(softmax) + cross-entropy loss 擅长学习类间的信息,因为它采用了类间竞争机制,只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。

  1. 常用的优化算法有哪些?

深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
梯度下降法。首先初始化参数面试问题准备 - 图1,然后根据迭代公式来计算训练集上的风险函数最小值。
面试问题准备 - 图2
(1)批量梯度下降(Batch Gradient Descent, BGD)。目标函数是整个训练集上的风险函数,在每次迭代时需要计算每个样本上损失函数的梯度并求和。缺点:当训练集中的样本数量 N 很大时,空间复杂度较高,计算开销很大。
(2)随机梯度下降(Stochastic Gradient Descent, SGD)。从真实数据分布中随机采集 N 个样本,并由它们计算出来的经验风险的梯度来近似期望风险的梯度。优点:收敛速度较快。
(3)小批量梯度下降法(Mini-Batch Gradient Descent)。每次迭代时,随机选取一小部分训练样本来计算梯度并更新参数。实际上是批量梯度下降和随机梯度下降的一个折中。

  1. 常见的激活函数有哪些?

Sigmoid函数、Tanh函数、ReLU函数、Leaky ReLU函数、Maxout函数、softmax函数(用于多分类神经网络输出)。激活函数(需要自己梳理)

  1. ReLU激活函数的优缺点?

优点:缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度;
缺点:输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。

  1. 怎么避免梯度爆炸和梯度消失问题?
  • 梯度爆炸:当间隔面试问题准备 - 图3比较大时,梯度变大,造成系统不稳定。解决方案:权重衰减或梯度截断。
  • 梯度消失:由于sigmoid函数的饱和性,饱和区的导数趋近于0。误差经过每一次传递,梯度都会不停衰减,使得整个网络很难训练。解决方案:使用使用导数比较大的激活函数,比如ReLU。

7.神经网络参数初始化为0可以吗?为什么?
谈谈神经网络权重为什么不能初始化为0

权重w初始化为0,偏置b为0 权重w初始化为0,偏置b不为0 权重w不为0,偏置b初始化为0
在前向传播计算过程中,a1=g(0),a2=g(0), a3=g(0)在反向传播进行参数更新时,a1和a2均相等,会导致权重参数相等,出现权重的对称性。无论训练多少次以及隐藏神经元有多少个,由于权重的对称性,隐藏层的神经单元输出始终不变,出现隐藏神经元的对称性。不同神经元能够有不同的输出,这样神经网络才有意义。 同上,第一个batch 只能更新部分参数;第2个 batch 导致所有参数都能得到更新,但存在更新较慢、梯度消失、梯度爆炸等问题。 在前向传播计算过程中,a1=g(0),a2=g(0), a3=g(0)在反向传播过程中所有权重的导数都不相同,所以权重和偏置都能得到更新。

在训练神经网络的时候,权重初始化要谨慎,不能初始化为0。参数是无法更新的,那么结果也就导致模型无法很好的拟合,这个现象类似于“梯度弥散”,即当偏导数为0时,无法对模型参数进行求解,也就导致模型训练失败 。
对于逻辑回归来说,把参数初始化为0是很ok的。但是对于一个神经网络,如果我们将权重或者是所有参数初始化为0,梯度下降算法将不会起到任何作用。

CNN\RNN\LSTM\GRU

卷积神经网络一般由卷积层、池化层和全联接层构成。

  1. CNN 中 padding 的作用是什么?

卷积层(滤波器)按照步长移动的时候可能会不够,因此需要填充。

  1. MM的特征图经过NN的卷积后的大小为多少?(填充为p,步长为s)

面试问题准备 - 图4

  1. 一次卷积的计算量是多少?

假设输入是面试问题准备 - 图5,使用一个大小为面试问题准备 - 图6的卷积核,卷积后的输出特征图size为面试问题准备 - 图7,则乘法计算量为面试问题准备 - 图8。如果使用面试问题准备 - 图9个不同大小的卷积核,那么输出特征图大小为面试问题准备 - 图10,一次卷积的计算量为面试问题准备 - 图11

  1. 两层面试问题准备 - 图12的卷积核级联和一层面试问题准备 - 图13的卷积核那个更好?

两层面试问题准备 - 图14的卷积核更好。(1)两者具有相同的感受野,输出的特征图大小是一样的。(2)小卷积核的参数量更少,前者是面试问题准备 - 图15,后者是面试问题准备 - 图16。(3)小卷积级联增强了非线性特征表示,使得决策函数更具有区分性,一定程度上提升了精度。

  1. 卷积层相比全连接层(Fully Connection Layer)有哪些优势?

全连接层:1*1卷积等价于全连接层;跟原特征图一样大小的卷积核等价于全连接层;FC参数多且冗余。
卷积层:没有全连接并且参数共享,减少参数量的同时保留了空间的位置信息。减少了神经元之间的依赖性,从而促使神经元学习更鲁棒的特征。

  1. 1*1卷积的作用?

(1)实现跨通道的交互和信息整合。假设输入为面试问题准备 - 图17的特征图,面试问题准备 - 图18的卷积核能把面试问题准备 - 图19个通道的信息进行融合。(2)实现卷积核通道数的降维和升维。使用面试问题准备 - 图20个不同的面试问题准备 - 图21的卷积核,那么通道数就得到降维,反之,通道数增加。(3)实现与全连接层的等价效果。(5)实现多个特征图的线性组合。(6)不影响卷积层的感受野,conv层后会跟一层激活层,能增强决策函数的非线性特征表示能力。

  1. 卷积层的作用和特性?

作用:对原始幸好进行特征增强,降低噪声,提取特征;不同的卷积核可以提取不同的特征。卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。
特性:权值共享、局部连接。

  1. 池化层的作用?

主要是进行特征选择,降低特征数量,并从而减少参数数量

  1. 池化层的反向传播机制?
  • Mean pool:池化层的每个像素的梯度平均分配给前一卷积层参与该位置像素计算的像素。
  • Max pool:池化层每个像素的梯度传给前一卷积层中得到该像素的像素,其他梯度为0。
  1. 什么是长距离依赖问题?

在循环神经网络中,如果时刻 面试问题准备 - 图22 的输出 面试问题准备 - 图23 依赖于时刻 面试问题准备 - 图24 的输入面试问题准备 - 图25,当时间间隔面试问题准备 - 图26比较大时,简单神经网络很难对这种长距离的依赖关系进行建模,称为长期依赖问题。

  1. 为什么LSTM记忆时间长?

为了缓解RNN梯度消失和长距离依赖问题。因为LSTM增加了门控和长期记忆状态,通过遗忘门去除上一层记忆状态不必要的信息,通过输入门控制当前输入的候选记忆状态信息有多少需要保存,通过输出门控制记忆状态需要输出的信息。而RNN前面的信息会随着时间步的推移慢慢减少。

  1. 假设输入维度是x_dim,输出维度是y_dim,LSTM的参数量是多少?

面试问题准备 - 图27

  1. LSTM/GRU为什么用的是Sigmoid/Tanh函数,而不用其他的激活函数?

因为LSTM中的三个门是用的sigmoid作为激活函数,生成候选记忆时候用的才是tanh,门的激活函数如果用relu的话会有个问题,就是relu是没有饱和区域的,那么就没法起到门的作用。候选记忆用tanh是因为tanh的输出在-1~1,是0中心的,并且在0附近的梯度大,模型收敛快。

  1. GRU的原理是什么?

GRU是一种比网络更简单的循环神经网络,不引入额外的记忆单元,而是引入一个更新门来控制当前状态需要从历史状态中保留多少信息,以及需要从候选状态中保留多少信息。主要包括重置门 面试问题准备 - 图28(用来控制面试问题准备 - 图29的计算是否依赖上一时刻的状态)、更新门 面试问题准备 - 图30、候选状态面试问题准备 - 图31

  1. ResNet(Residual Network,残差网络)为什么能解决梯度消失问题?

通过给非线性的卷积层增加直连边,提高信息的传播效率。残差连接可以避免过深的网络造成的梯度消失问题,从而增加网络深度提升模型性能。恒等映射函数H(x) = F(x) + x,把问题转化为学习一个残差函数 F(x) = H(x) - x。在输出引入一个输入 x的恒等映射,则梯度也会对应引入一个常数 1,这样网络不容易出现梯度异常值,起到稳定梯度的作用。

Attention

nlp中的Attention注意力机制+Transformer详解

  1. 根据通用近似定理,CNN\RNN都有很强的能力。为什么引入Attention机制?

(1)计算能力的限制:当要记住很多“信息”,模型就要变得更复杂,然后目前计算能力依然是限制神经网络发展的瓶颈;(2)优化算法的限制:虽然局部连接、权重共享以及pooling等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是如循环神经网络中的长距离依赖问题,信息“记忆”能力并不高。

  1. Attention 机制有哪些?

聚焦式(focus)注意力(自上而下有意识的注意力,主动注意)、显著性(saliency-based)注意力(自下而上的有意识的注意力,被动注意)。可以将max-pooling和门控(gating)机制近似地看作是自下而上的基于显著性的注意力机制。

  1. Attention机制的计算流程?

Attention机制的实质就是一个寻址过程,给定一个和任务相关的查询Query向量q,通过计算与key的注意力分布并附加在value上,从而计算 attention value。这个过程实质上是 Attention机制缓解神经网络模型复杂度的体现:不需要将所有N个输入信息都输入到神经网络中进行计算,只需从X中选择一些和任务相关的信息输入给神经网络。
注意力机制可分为三步:信息输入;计算注意力分布a;根据注意力分布来计算输入信息的加权平均。

  1. Attention有哪些打分机制?

s(key,query):加性模型、点积模型、缩放点积模型、双线性模型。

  1. Attention机制有哪些变种?

硬性注意力(只关注到某一位置上的信息)、键值对注意力、多头注意力(利用多个查询来平行地计算从输入信息中选取多个信息,每个注意力关注输入信息的不同部分,然后进行拼接)等。

  1. 如何解决CNN/RNN短距离依赖的“局部编码”问题,从而对输入序列建立长距离依赖关系,有哪些方法呢?

一种是增加网络的层数,通过一个深层网络来获取远距离的信息交互,另一种方法是使用全连接网络。但是全连接网络无法处理变长的输入序列,因为不同的输入长度,其连接权重的大小也是不同的。因此可以利用自注意力机制来动态生成不同连接的权重,从而可以处理变长的信息序列。

  1. Self-attention的计算流程是怎样的?

给出输入信息X表示N个输入信息;通过线性变换得到查询向量序列,键向量序列和值向量序列。然后计算注意力分布(通常使用缩放点积来作为注意力打分函数);根据注意力分布来计算输入信息的加权平均。

  1. MASK的作用?

NLP 中的Mask全解
(1)处理非定长序列,比如RNN中的MASK、Attention中的MASK(self-attention中,Q和K在点积之后,需要先经过mask再进行softmax,因此,对于要屏蔽的部分,mask之后的输出需要为负无穷,这样softmax之后输出才为0)
(2)防止标签泄露:Transformer-decoder中的MASK(即在 t 时刻不能看到 t 时刻之后的信息)、BERT中的MASK(使用上下文信息又不泄露标签信息)、XLNet的MASK。

  1. 为什么Transformer 中attention计算点积要进行缩放?为什么使用面试问题准备 - 图32

transformer中的attention为什么scaled?

  • 对于一个输入向量面试问题准备 - 图33,softmax函数将其归一化到一个分布面试问题准备 - 图34。在这个过程中 softmax 先用一个自然底数 面试问题准备 - 图35将输入中的元素差距先拉大,然后归一化为一个分布。在输入数量级较大时,softmax将几乎全部的概率分布都分配给了最大值对应的标签,那么就会产生一个接近One-hot的向量,梯度消失为0,造成参数更新困难。
  • 假设q和k的各个分量是相互独立的随机变量,均值为 0 ,方差是 1,那么点积的均值是 0, 方差为 面试问题准备 - 图36。方差越大说明点积的数量级越大,便会以越大的概率取大值。那么一个自然的做法就是把方差稳定到一,即将点积除以面试问题准备 - 图37,将方差控制为一,有效的控制了梯度消失的问题。
  1. self-attention 不乘QKV参数矩阵会有什么问题?

self-attention的核心是用文本中的其它词来增强目标词的语义表示,从而更好的利用上下文信息。一般会说q=k=v,这里的相等指的是它们来自同一个基础向量,而在实际计算时,是不一样的,都乘了QKV参数矩阵。如果不乘,每个词对应的q,k,v是完全一样的,在相同量级的情况下,面试问题准备 - 图38面试问题准备 - 图39点积的值会是最大的,在softmax后的加权平均中,该词本身所占的比重将会是最大的,使得其他词的比重很少,无法利用上下文信息来增强当前词的语义表示。乘以QKV参数矩阵,会使得每个词的 qkv都不一样,能很大程度上减轻上述的影响,去捕获更丰富的特征。

Transformer

  1. Trandformer的整体架构是怎样的?由哪些部分组成?

Transformer 其实就是一个seq2seq模型,左边一个Encoder把输入读进去,右边一个Decoder得到输出。由12层多头self-Attention+前馈神经网络组成,构建的时候还有残差连接以及层归一化。编码器的输出会作为解码器的输入。

  1. Transformer 为什么采用 attention机制,而不采用CNN或RNN?

RNN(或LSTM、GRU等)的计算限制是顺序的,只能从左到右依次计算或从右到左依次计算,存在两个问题:(1)时间片 t 的计算依赖 t-1 时刻的计算结果,限制了模型的并行能力;
(2)顺序计算过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖问题,但仍然存在特别长期的依赖现象。无论是卷积还是循环神经网络其实都是对变长序列的一种“局部编码”:卷积神经网络是基于n-gram的局部编码;而对于循环神经网络,由于梯度消失等问题也只能建立算距离依赖。
Transformer 的提出解决了上面两个问题,首先它使用了 Attention机制将序列中的任意两个位置之间的距离缩小为一个常量,可以缓解长距离依赖问题;其次不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架。

  1. Transformer Encoder 和 Transformer Decoder 有哪些不同?

(1)多头self-attention 机制不同,encoder中不需要使用MASK,decoder需要使用MASK;(2)Decoder中多了一层Encoder-Decoder attention,这与 self-attention机制不同。

  1. Encoder-Decoder attention 和 self-attention机制有什么不同?

它们都使用了multi-head来计算,不过Encoder-Decoder attention采用传统的 attention机制,查询值Query是 self-attention 机制已经计算出的上一时间 i处的编码值,Key和value值都是Encoder的输出,这与self-attention不同。

  1. Transformer 有什么优点和缺点?

优点:可并行;特征抽取能力强;自编码上下文双向编码;弱归纳偏置,通用性强。
缺点:(1)Self-attention的时间复杂度是 面试问题准备 - 图40面试问题准备 - 图41是句子长度;计算复杂度高,序列长度上升,复杂度指数级上升。(2)Transformer 单凭 attention无法学到位置信息,需要显示的加入位置编码。

  1. Transformer 结构为什么引入位置编码?

简单来说,主要是为了区分 token 在句子中不同位置的表达。比如一个句子出现了两个同样的单词,但在不同的位置上,如果没有添加新的量来区分两个位置上的 token 的话,那么这两个 token 的表达应该是一致的。显然不符合实际情况。加入位置信息[显示/隐式]是一种简单邮箱的方法可以区分相同token在不同位置上的不同表述。
(1)对于任何一门语言,单词在句子中的位置以及排列顺序是非常重要的,不仅是一个句子的语法结构的组成部分,更是表达语义的重要概念。一个单词在句子的位置或排列顺序不同,可能整个句子的意思就发生了偏差。
举例如下,上面两句话所使用的单词完全一样,但是所表达的意思却截然相反。那么,引入词序信息有助于区别这两句话的不同意思。

I do not like the story of the movie, but I do like the cast. I do like the story of the movie, but I do not like the cast.

(2)Transformer 模型抛弃了 RNN、CNN作为序列学习的基本模型。我们知道RNN本身就是一种顺序结构,天生包含了词在序列中的位置信息(隐式的),CNN则是通过滤波器 Filter 来获取局部特征,蕴含了隐式的位置信息。Transformer 采用 Attention 机制,这些词序信息将会丢失,模型不能知道每个词在句子中的相对和绝对的位置信息。因此有必要把词序信息加到词向量上帮助模型学习这些信息(显示的)。位置编码(Position Embedding)就是用来解决这种问题的办法。

  1. Transformer 使用了什么样的位置编码?

采用的是三角函数位置编码。给定一个长度为 n 的输入序列, 让 t 表示词在序列中的位置,面试问题准备 - 图42 表示 t位置对应的向量,d 是向量的维度。面试问题准备 - 图43是生成位置向量面试问题准备 - 图44的函数:
image.pngimage.png

Transformer/CNN/RNN 时间复杂度对比

Transformer/CNN/RNN的对比(时间复杂度,序列操作数,最大路径长度)
面试问题准备 - 图47

ELMo\GPT\BERT

  1. 为什么进行预训练?

深度学习时代,为了充分训练深层模型参数并防止过拟合,通常需要更多的标注数据喂养。在NLP领域,众所周知,标注数据是一个昂贵资源。预训练从大量的无标注数据中进行预训练使很多NLP任务获得显著的性能提升。总的来说,预训练的优势包括:
(1)在庞大的无标注数据上进行预训练可以获取更通用的语言表示,并有利于下游任务;
(2)为模型提供了一个更好的初始化参数,在目标任务上具备更好的泛化性能、并加速收敛;
(3)是一种有效的正则化手段,避免在小数据集上过拟合(一个随机初始的深层模型容易对小数据集过拟合)。

  1. PTMs有哪两大范式?
  • 浅层词嵌入:即词向量,学习到的是上下文独立的静态词嵌入,主要代表为 NNLM、word2vec(CBOW、Skip-Gram)、Glove等。这一类通常采用浅层网络进行训练,而应用于下游任务时,整个模型的其余部分仍需要从头开始学习。缺点:词嵌入与上下文无关,每个单词的嵌入向量始终一样,不能解决一词多义的问题。通常会出现OOV问题。 | 词嵌入 | 训练目标 | 全局/局部语料 | 特点 | | —- | —- | —- | —- | | NNLM | 语言模型 | 局部语料 | 基于语言模型进行训练,词嵌入不过是NNLM的一个产物而已 | | word2vec | 非语言模型 | 局部语料 | 1)为加速训练舍弃NNLM中的隐藏层、词嵌入直接sum;
    2)采用分层softmax和负采样进行运算优化
    3)损失函数:带权重的交叉熵,权重固定 | | Glove | 非语言模型 | 全局语料 | 1)基于全局语料构建词共现矩阵然后进行高效矩阵分解算法;
    2)损失函数:最小平方损失函数,权重可以做映射变换。 |
  • 预训练编码器:通过一个预训练的编码器能够输出上下文相关的词向量,解决一词多义的问题。主要代表有ELMO、GPT、BERT、XLNet等。 | 编码器 | PTMs代表 | 计算方式 | 特点 | | —- | —- | —- | —- | | MLP | NNLM/word2vec | 前馈+并行 | 不考虑序列位置信息,不能处理变长序列 | | CNNs | | 前馈+并行 | 考虑序列位置信息,不能处理长距离依赖,聚焦于n-gram
    的局部上下文编码,pooling操作会导致序列位置丢失。 | | RNNs | ELMo | 循环+串行 | 适合处理序列位置信息,但不能处理长距离依赖。LSTM为较长的短期记忆单元。 | | Transformer | GPT(Decoder)、BERT(Encoder) | 前馈+并行 | self-attention解决长距离依赖,无位置偏差;可看作是权重动态调整的全连接网络。 | | Transformer-XL | XLNet | 前馈+串行 | 基于Transformer引入循环机制+相对位置编码,增强长距离建模能力。 | | 长距离依赖建模能力 | | | Transformer-XL>Transformer>RNNs>CNNs |
  1. 基于上下文PTMs的语言模型有哪些类型?

(1)自回归语言模型(Auto-Regression)(LM)面试问题准备 - 图48
优点:语言模型联合概率的无偏估计,即为传统的语言模型,考虑被适合单词之间的相关性,天然适合处理自然生成任务。
缺点:联合概率按照文本序列顺序拆解,无法获取双向上下文信息表征;
代表模型:ELMo、GPT、ULMFit、SiATL等。
(2)自编码语言模型(DAE) 面试问题准备 - 图49
优点:本质为降噪自编码(DAE)特征表示,通过引入噪声[MASK]构建MLM,获取双向上下文信息表征。
缺点:引入独立性假设,为语言模型联合概率的有偏估计,没有考虑token之间的相关性。预训练时的[MASK]噪声在finetune阶段不会出现,造成两阶段不匹配问题;为解决这个问题,在15%被预测的token中,80%被替换为[MASK],10%被随机替换,10%被替换为原词。
代表模型:BERT、MASS、RoBERTa、UNiLM、XLM、E-BERT等。
(3)排列语言模型(Permuted LM):PLM将传统的自回归语言模型进行推广,将顺序拆解变为随机拆解,产生上下文相关的双向特征表示。代表典型代表XLNet。

  1. PTMs通常包含至少数亿个参数,很难部署在现实应用程序中的在线服务器和资源受限的设备上。如何解决?

模型压缩是减小模型尺寸并提高计算效率的有效方法。5种压缩方法:剪枝(Pruning)、量化(Quantization)、参数共享(Parameter sharing)、模块替换(Module replacing)、知识蒸馏(Knowledge Distillation)。

  1. 下游任务在使用word embedding时的做法?

(1)Frozen,就是word embedding那层网络参数固定不动;
(2)Fine-Tuning,word embedding这层参数使用新的训练集合训练也要跟着训练过程更新掉。

  1. BERT的原理是什么?

BERT 采用了 Transformer 的Encoder部分,是一个自编码语言模型。并设计了两个自监督任务来预训练该模型:
(1)第一个任务是采用 MaskLM 的方式来训练语言模型。也就是在输入一句话的时候,从需要预测的词中,随机选取 15% 的词,用[MASK]来代替,之后让模型根据所给定的标签去学习这些被mask的词。预训练时的[MASK]噪声在finetune阶段不会出现,造成两阶段不匹配问题;为解决这个问题,在15%被预测的token中,80%被替换为[MASK],10%被随机替换,10%被替换为原词。
(2)第二个任务是在双向语言模型的基础上增加了一个句子级别的连续性预测任务,即预测输入 BERT的两段文本是否为连续的文本。引入这个任务可以更好地让模型学到连续的文本片段之间的关系。
最后的实验证明了BERT模型的有效性,并在11项NLP任务中取得了SOTA结果。
BERT相较于ELMO和GPT,可以做到并发执行,同时提取词在句子中的关系特征,并且能在多个不同层次提取关系特征,进而更全面反映句子语义。相较于 word2vec,其又能根据句子上下文获取词义,从而避免歧义出现。缺点:模型参数较多,模型太大。

  1. BERT有哪些Embedding?

(1)Token Embedding 文本特征输入
(2)Position Embedding 位置编码输入
(3)Segment Embedding 分段编码表示(值取0或1, 0代表第一段文本的占位符,1代表第二段文本的占位符)
与Transformer本身的Encoder相比,输入的向量表示多了 Segment Embedding。

  1. 为什么BERT的三个 Embedding 是相加?

Embedding 的数学本质是以 one-hot 为输入的单层全连接层。现将 BERT的 token、position、segment embedding表示用 one-hot表示,然后 concat 起来,再经过一个单层全连接,等价的效果就是三个 Embedding相加。

  1. BERT的局限性?(待改进)
  • 性能问题
  • BERT 在第一个预训练阶段,假设句子中多个单词被 Mask 掉,这些被 Mask 掉的单词之间没有任何关系,是条件独立的,然而有时候这些单词之间是有关系的,比如”New York is a city”,假设我们 Mask 住”New”和”York”两个词,那么给定”is a city”的条件下”New”和”York”并不独立,因为”New York”是一个实体,看到”New”则后面出现”York”的概率要比看到”Old”后面出现”York”概率要大得多。
  • BERT 的在预训练时会出现特殊的 [MASK],但是它在下游的 fine-tune 中不会出现,这就出现了预训练阶段和 fine-tune 阶段不一致的问题。(其实这个问题对最后结果产生多大的影响也是不够明确的,因为后续有许多 BERT 相关的预训练模型仍然保持了[MASK]标记,也取得了很大的结果,而且很多数据集上的结果也比 BERT 要好。但是确确实实引入[MASK]标记,也是为了构造自编码语言模型而采用的一种折中方式。)
  1. BERT怎么用于下游任务?

通过fine-tuning的方式,在BERT上接一个任务相关的全连接层。
主要有两种应用于具体领域的方法,一种是微调(fine-tune)方法,一种是特征抽取(fature-extract)方法。

  • 微调(fine-tune):利用 Bert 模型初始化了一个网络的初始权重,在网络上继续反向传播训练,不断调整原有模型的权重,获得一个适用于新的特定任务的模型。
  • 特征抽取(fature-extract):调用预训练好的 Bert 模型,对新任务的句子做句子编码,将任意长度的句子编码成定长的向量。
  1. BERT 应用于有空格丢失的数据是否还是有效?

按照常理推断可能会无效了,因为空格都没有的话,那么便成为了一长段文本,但是具体还是有待验证。
改进方法:而对于有空格丢失的数据要如何处理呢?一种方式是利用 Bi-LSTM + CRF 做分词处理,待其处理成正常文本之后,再将其输入 BERT 做下游任务。

  1. BERT 应用于单词拼写错误的数据是否还是有效?

如果有少量的单词拼写错误,那么造成的影响应该不会太大,因为 BERT 预训练的语料非常丰富,而且很多语料也不够干净,其中肯定也还是会含有不少单词拼写错误这样的情况。
改进方法:但是如果单词拼写错误的比例比较大,比如达到了 30%、50%这种比例,那么需要通过人工特征工程的方式,以中文中的同义词替换为例,将不同的错字/别字都替换成同样的词语,这样减少错别字带来的影响。例如花被、花珼、花呗、花呗、花钡均替换成花呗。

  1. BERT为什么使用MASK?

BERT 通过在输入 X 中随机 Mask 掉一部分单词,然后预训练过程的主要任务之一是根据上下文单词来预测这些被 Mask 掉的单词。其实这个就是典型的 Denosing Autoencoder 的思路,那些被 Mask 掉的单词就是在输入侧加入的所谓噪音。
类似 BERT 这种预训练模式,被称为 DAE LM。因此总结来说 BERT 模型 [Mask] 标记就是引入噪音的手段。 关于 DAE LM 预训练模式,优点是它能比较自然地融入双向语言模型,同时看到被预测单词的上文和下文,然而缺点也很明显,主要在输入侧引入[Mask]标记,导致预训练阶段和 Fine-tuning 阶段不一致的问题。

  1. BERT如何进行MASK?

给定一个句子,会随机 Mask 15%的词,然后让 BERT 来预测这些 Mask 的词,由于在输入侧引入[Mask]标记,会导致预训练阶段和 Fine-tuning 阶段不一致的问题,论文中为了缓解这一问题,采取了如下措施: 如果某个 Token 在被选中的 15%个 Token 里,则按照下面的方式随机的执行:

  • 80%的概率替换成[MASK],比如 my dog is hairy → my dog is [MASK]
  • 10%的概率替换成随机的一个词,比如 my dog is hairy → my dog is apple
  • 10%的概率替换成它本身,比如 my dog is hairy → my dog is hairy

这样做的好处是,BERT 并不知道[MASK]替换的是这 15%个 Token 中的哪一个词(「注意:这里意思是输入的时候不知道[MASK]替换的是哪一个词,但是输出还是知道要预测哪个词的」),而且任何一个词都有可能是被替换掉的,比如它看到的 apple 可能是被替换的词。这样强迫模型在编码当前时刻的时候不能太依赖于当前的词,而要考虑它的上下文,甚至对其上下文进行”纠错”。比如上面的例子模型在编码 apple 是根据上下文 my dog is 应该把 apple(部分)编码成 hairy 的语义而不是 apple 的语义。

  1. MASK跟CBOW有什么异同点?
  • 相同点:CBOW 的核心思想是:给定上下文,根据它的上文 Context-Before 和下文 Context-after 去预测 input word。而 BERT 本质上也是这么做的,但是 BERT 的做法是给定一个句子,会随机 Mask 15%的词,然后让 BERT 来预测这些 Mask 的词。
  • 不同点:
    • 首先,在 CBOW 中,每个单词都会成为 input word,而 BERT 不是这么做的,原因是这样做的话,训练数据就太大了,而且训练时间也会非常长。
    • 其次,对于输入数据部分,CBOW 中的输入数据只有待预测单词的上下文,而 BERT 的输入是带有[MASK] token 的“完整”句子,也就是说 BERT 在输入端将待预测的 input word 用[MASK] token 代替了。
    • 通过 CBOW 模型训练后,每个单词的 word embedding 是唯一的,因此并不能很好的处理一词多义的问题,而 BERT 模型得到的 word embedding(token embedding)融合了上下文的信息,就算是同一个单词,在不同的上下文环境下,得到的 word embedding 是不一样的。
  1. 词袋模型到 word2vec 改进了什么?

词袋模型(Bag-of-words model)是将一段文本(比如一个句子或是一个文档)用一个“装着这些词的袋子”来表示,这种表示方式不考虑文法以及词的顺序。「而在用词袋模型时,文档的向量表示直接将各词的词频向量表示加和」。缺点: 词向量化后,词与词之间是有权重大小关系的,不一定词出现的越多,权重越大。 词与词之间是没有顺序关系的。
而 word2vec 是考虑词语位置关系的一种模型。通过大量语料的训练,将每一个词语映射成一个低维稠密向量,通过求余弦的方式,可以判断两个词语之间的关系,word2vec 其底层主要采用基于 CBOW 和 Skip-Gram 算法的神经网络模型。
因此,综上所述,词袋模型到 word2vec 的改进主要集中于以下两点:

  • 考虑了词与词之间的顺序,引入了上下文的信息
  • 得到了词更加准确的表示,其表达的信息更为丰富
  1. woed2vec 到BERT改进了什么?

word2vec 到 BERT 的改进之处其实没有很明确的答案,如同上面的问题所述,BERT 的思想其实很大程度上来源于 CBOW 模型,如果从准确率上说改进的话,BERT 利用更深的模型,以及海量的语料,得到的 embedding 表示,来做下游任务时的准确率是要比 word2vec 高不少的。实际上,这也离不开模型的“加码”以及数据的“巨大加码”。再从方法的意义角度来说,BERT 的重要意义在于给大量的 NLP 任务提供了一个泛化能力很强的预训练模型,而仅仅使用 word2vec 产生的词向量表示,不仅能够完成的任务比 BERT 少了很多,而且很多时候直接利用 word2vec 产生的词向量表示给下游任务提供信息,下游任务的表现不一定会很好,甚至会比较差。

  1. 为什么BERT选择mask15%这个比例的词,可以是其他的比例吗?

论文中表示是受到完形填空任务的启发,其实与CBOW有异曲同工之妙。从CBOW的角度,在一个大小为1/p的窗口中随机选一个词,类似CBOW窗口的中心词,区别是这里的窗口是非重叠的,从CBOW的滑动窗口角度,10%~20%都还是ok的比例。

  1. 为什么BERT在第一句前会加一个[CLS]标志?

BERT在第一句前加入[CLS]标志,最后一层该位置对应的向量可以作为整句话的语义表示,从而用到下游的分类任务等。[CLS]本身不具有语义,经过12层,得到的是attention后所有词的加权平均,相比其他词可以更好的表征句子语义。

  1. BERT得到的句子向量可以直接用于句子相似度计算吗?有什么方法可以使得BERT支持相似度计算?

BERT模型可以使用无监督的方法做文本相似度任务吗?
Sentence-BERT算法概述
理论上是不可以的,因为 BERT的自监督任务重并没有句子相似度计算这个任务。可以通过finetune来增加句子相似度计算的任务,或者使用 sentence-bert(一个双塔模型,可用于句子相似度任务.)


  1. XLNet

    XLNet:运行机制及和Bert的异同比较

  2. XLNet的原理?

基本思想:通过排列组合的方式将一部分下文单词放到上文单词的位置,但实际形式上还是一个从左到右预测的自回归语言模型。
XLNet采取了Attention MASK的机制,从X的输入单词里面,也就是Ti的上文和下文单词中,随机选择i-1个,放到Ti的上文位置中,把其它单词的输入通过Attention MASK隐藏掉,于是就能够达成我们期望的目标. 对于要屏蔽的部分,mask之后的输出需要为负无穷,这样softmax之后输出才为0)
优点:采用自回归模型 (AR , Autoregressive) 替代自编码 (AE , Autoencoding ) 模型,解决 bert 中 mask 带来的负面影响(预训练和微调数据的不统一)
2)双流注意力机制(新的分布计算方式,来实现目标位置感知)
3)引入 transformer-XL
双流注意力机制

  1. XLNet与BERT的区别:

Bert是直接在输入端显示地通过引入Mask标记,在输入侧隐藏掉一部分单词,让这些单词在预测的时候不发挥作用,要求利用上下文中其它单词去预测某个被Mask掉的单词;而XLNet则抛弃掉输入侧的Mask标记,通过Attention Mask机制,在Transformer内部随机Mask掉一部分单词(这个被Mask掉的单词比例跟当前单词在句子中的位置有关系,位置越靠前,被Mask掉的比例越高,位置越靠后,被Mask掉的比例越低),让这些被Mask掉的单词在预测某个单词的时候不发生作用。本质上没有太大不同。XLNet抛掉了表面[MASK]标记,解决了预训练带有MASK标记和finetuning过程不一致的问题。
(1) 与Bert采取De-noising Autoencoder方式不同的新的预训练目标:Permutation Language Model(简称PLM);这个可以理解为在自回归LM模式下,如何采取具体手段,来融入双向语言模型。
(2)引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制。实践已经证明这两点对于长文档任务是很有帮助的;
(3)加大增加了预训练阶段使用的数据规模。

  1. XLNet如何实现在不加 [Mask] 情况下利用上下文信息呢?

XLNet 中神奇的 Attention Mask

word2vec\Fasttext\Glove

  1. 为什么提出 word2vec?

主要是由于 one-hot编码的局限性,(1)one-hot 高维稀疏,词向量维度随着词表大小成正比;(2)one-hot表征的每个词之间都是正交的,即词与词之间没有任何关联表示,无法进行语义计算。而word2vec 认为具有相同上下文的词语包含相似的语义,使得语义相近的词在映射到欧式空间后具有很高的余弦相似度。

  1. 简要介绍一下 word2vec的原理?

Word2Vec通过学习文本然后用词向量的方式表征词的语义信息,然后使得语义相似的单词在嵌入式空间中的距离很近。而在Word2Vec模型中有Skip-Gram和CBOW两种模式,Skip-Gram是给定输入单词来预测上下文,而CBOW与之相反,是给定上下文来预测输入单词。

  1. 模型优化有哪些?
  • 欠采样:像“是”、“的”这种词在任何场景中都可能出现,它们并不包含多少语义,而且出现的频率特别高,如果不加处理会影响词向量的效果。欠采样就是为了应对这种现象。

主要思想:对每个词都计算一个采样概率,根据概率值来判断一个词是否应该保留,概率计算方法为如下,词语出现的概率越高,其被采样到的概率就越低。欠采样是为了降低词的采样概率。
面试问题准备 - 图50

  • 负采样

Negative Sampling是对于给定的词,并生成其负采样词集合的一种策略,已知有一个词,这个词可以看做一个正例,而它的上下文词集可以看做是负例,但是负例的样本太多,而在语料库中,各个词出现的频率是不一样的,所以在采样时可以要求高频词选中的概率较大,低频词选中的概率较小,这样就转化为一个带权采样问题,大幅度提高了模型的性能。
负采样是加快训练速度的一种方法。针对训练样本(ant,able),able 这个词是正样本,词表中除了able这个词之外的所有词都是负样本。负采样是对负样本进行采样,只需挑出几个负样本,Google给出的建议是 5-20个,根据词在语料中出现的概率,概率越大越有可能被选中,具体公式为:
面试问题准备 - 图51

  • 层次softmax

层次 softmax 的目的和负采样一样,也是为了加快训练速度,但它相对复杂,没有负采样这种简单粗暴。具体来说,模型输出层不再是使用one-hot加softmax,而是使用Huffman树加 softmax回归。在训练的时候首先统计语料中词语的词频,然后根据词频来构建Huffman树,树的根节点为输入词的词向量,叶子节点表示词表中的词,其他节点没什么实际含义,仅起辅助作用。
注:softmax regression 做二分类的时候就退化为了logistic regression,因此虽然叫层次softmax但公式中其实用的是logistic function。根据上述公式就可构建根据Huffman树来进行softmax回归的cost function,进而根据梯度下降对模型进行训练求解。

  1. 为什么使用Huffman树可以加快训练速度?

Hierachical softmax 的基本思想是首先将词典中的每个词按照词频大小构建出一颗哈夫曼树,保证词频较大的词处于相对较浅的层,词频较低的词处于哈夫曼树较深的叶子节点,每一个词都处于这棵树的某个叶子节点。将原来的|V|分类问题转换成log|V|次的二分类,本质上是一个LR分类器,计算量大大减少。

  1. word2vec具体如何实施?

词向量其实是将词映射到一个语义空间,得到的向量。而word2vec是借用神经网络方式实现的,考虑文本的上下文关系,有两种模型 CBOW和Skip-gram,这两种模型在训练的过程中类似。CBOW模型是输入一个词的上下文来预测当前词;Skip-gram是用当前词作为输入来预测它周围的上下文。
词向量训练的预处理步骤:
(1)对输入的文本生成一个词汇表,每个词统计词频,按照词频从高到低排序,取最频繁的 V 个词构成一个词汇表。每个词存在一个 one-hot 向量,向量的维度为 V ,如果该词在词汇表中出现过,则向量中词汇表中对应的位置为 1, 其他位置为 0 。如果词汇表中不出现,则向量全为 0 。
(2)将输入文本的每个词生成一个 one-hot 向量;
(3)确定词向量的维度 N。

  • Skip-gram 处理步骤:

面试问题准备 - 图52
(1)确定窗口的大小 window,对每个词生成 2 window 个训练样本
(2)确定 batch_size,大小必须是 2
window的整数倍;
(3)训练算法:层次softmax和Negative Sampling;
(4)神经网络迭代训练一定次数,得到输入层到隐藏层的参数矩阵,矩阵中的每一行的转置即是对应词的词向量。
面试问题准备 - 图53

  • CBOW处理步骤:

面试问题准备 - 图54
(1)确定窗口的大小 window,对每个词生成 2 window 个训练样本
(2)确定 batch_size,大小必须是 2
window的整数倍;
(3)训练算法:层次softmax和Negative Sampling;
(4)神经网络迭代训练一定次数,得到输入层到隐藏层的参数矩阵,矩阵中的每一行的转置即是对应词的词向量。
面试问题准备 - 图55

  1. word2vec 有哪些加速技巧?

(1)删除隐藏层,得到上下文c的表示后,直接输入到 softmax分类器来预测输出;
(2)使用层次化 softmax或负采样进行加速训练;
(3)去除低频词;
(4)对高频词进行降采样;
(5)动态上下文窗口大小。

  1. FastText的原理是什么?和CBOW有什么异同点?

技术干货丨fastText原理及实践
fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。使用了字符级别的n-gram特征来表示一个单词,在输入时将单词的字符级别的 n-gram 向量作为额外的特征;将句子中的每个词通过映射成词向量,对词向量叠加取平均作为句子的向量,然后直接用线性分类器softmax进行分类。FastText 中没有非线性的隐藏层,结构相对简单而且模型训练的更快。
相同点:和CBOW一样,Fasttxt模型也只有三层(输入层、隐藏层、输出层),输入都是多个经向量表示的单词,输出是一个特定的target,隐藏层都是对多个词向量的叠加平均。
不同点:CBOW的输入是目标单词的上下文,Fasttext输入的是多个单词和n-gram特征,这些特征用来表示单个文档;CBOW的输入单词是one-hot编码,Fasttext的输入特征是被embedding过;CBOW的输出是目标词汇,fasttext的输出是文档对应的类别。

  1. Glovec原理

Glove 本质是加权最小二乘回归模型,引入了共现概率矩阵。基本思想:引入了词-词共现矩阵 面试问题准备 - 图56 , 面试问题准备 - 图57 表示语料中面试问题准备 - 图58的上下文中出现 面试问题准备 - 图59 的次数。面试问题准备 - 图60。融合了矩阵分解和全局统计信息的优势,加快模型的训练速度并且可以控制词的相对权重。

文本分类

  1. 文本分类分为哪几种?之间的区别。
  • 单标签分类和多标签分类:
  • 二分类和多分类

  1. 机器学习

    百面机器学习算法工程师带你去面试.pdf

    HMM 隐马尔可夫模型

    HMM描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。隐马尔可夫模型由初始状态分布、状态转移概率矩阵以及观测概率矩阵所确定。初始状态分布就是每一个标注作为句子第一个字标注的概率;状态转移概率矩阵就是由某一个标注转移到下一个标注的概率(设状态转移矩阵为 面试问题准备 - 图61,那么若前一个词的标注为 面试问题准备 - 图62,则下一个词的标注为 面试问题准备 - 图63的概率为面试问题准备 - 图64);观测概率矩阵指在某个标注下,生成某个词的概率。
    面试问题准备 - 图65
    解码用的Viterbi,计算有向无环图的一条最大路径。

    MEMM 最大熵马尔可夫模型

    MEMM属于判别式模型,直接对条件概率建模。与HMM的 面试问题准备 - 图66依赖 面试问题准备 - 图67 不一样,MEMM当前隐藏状态面试问题准备 - 图68 应该是依赖当前时刻的观测节点面试问题准备 - 图69 和上一时刻的隐藏节点 面试问题准备 - 图70
    面试问题准备 - 图71
    (1)先预定义特征函数,
    (2)在给定的数据上,训练模型,确定参数,即确定了MEMM模型
    (3)用确定的模型做序列标注问题或者序列求概率问题。
    面试问题准备 - 图72
    缺点:MEMM倾向于选择拥有更少转移的状态。

    CRF

    白话条件随机场(conditional random field)
    crf损失
    条件随机场是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场。
    面试问题准备 - 图73

    HMM vs MEMM vs CRF

  2. HMM模型中存在两个假设:输出观测值之间严格独立;状态转移过程中当前状态只与前一状态有关。但实际序列标注问题不仅和单个词有关,还和观测序列的长度、单词的上下文有关。MEMM解决了HMM输出独立性假设的问题,引入自定义特征函数,不仅可以表达观测之间的依赖,还可表示当前观测与前后多个状态之间的依赖。

  3. CRF不仅解决了HMM输出独立性假设的问题,还解决了MEMM的标记偏置问题。MEMM容易陷入局部最优是因为只在局部做了归一化,而CRF统计了全局概率,在做归一化时考虑了数据在全局的分布,而不仅仅是局部归一化,这样就解决了MEMM的标记偏置的问题,使得序列标注的解码变得最优解。
  4. HMM、MEMM属于有向图,所以考虑了X与Y的影响,但HMM没将X作为整体考虑进去。CRF属于无向图,没有这种依赖性,可以克服该问题。

    Veterbi

    主要思想是通过局部最优找到全局最优,得到最优路径。即从时刻t=1开始,递推地计算在时刻 t 状态为 i的各条部分路径的最大概率,直至得到时刻 t= T状态为 i 的各条路径的最大概率,即为最优路径的概率P。

    高频问题

  5. 数据不平衡怎么解决?

(1)通过数据增强(如同义词替换,seq2seq 将其他语言的数据翻译成当前语言)的方式增加样本较少的数据;
(2)适当减少样本数比较多得类别数据(不推荐,会损失信息)(欠采样)
(3)使用可以缓解数据不平衡的loss,如focal loss 何恺明大神的「Focal Loss」,如何更好地理解?
欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响?
过采样:重复少的样本,会过分强调已有的正例。最大的风险是过拟合。
欠采样:去掉多得样本,会造成偏差很大的模型。
Focal loss 如何处理一些离群点?
让模型过多的关注特别难分类的样本是会有问题的。样本中有一些异常点、离群点(outliers)。所以模型为了拟合这些非常难拟合的离群点,就会存在过拟合的风险。
Focal Loss是从置信度p的角度入手衰减loss的。而GHM是一定范围内置信度p的样本数量来衰减loss的。首先定义了一个变量g,叫做梯度模长(gradient norm)。GHM对易分类样本和难分类样本都衰减,那么真正被关注的样本,就是那些不难不易的样本。而抑制的程度,可以根据样本的数量来决定。

  1. 人工标注数据不准确怎么处理?

(1)过滤掉错误样本,重新调整样本类别权重,重新训练。
(2)融合比较通用的标注数据进行联合训练,提升模型的预测精度。

  1. 如何获取更多的数据(数据增强)?

(1)从数据源头获取更多的数据,但是很多情况下,大幅增加数据本身就不容易,另外不清楚获取多少数据才算够。
(2)根据当前数据集估计数据分布参数,使用该分布产生更多数据,一般不采用,因为估计分布参数的过程也会代入抽样误差。
(3)数据增强:通过一定的规则扩充数据,比如通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充。

  1. 与联合抽取相比,Pipeline方法有哪些缺点?

Pipeline的方法指先抽取实体、再抽取关系,易于实现,但是存在以下缺点:
(1)误差积累:实体抽取的错误会影响下一步关系抽取的性能;
(2)实体冗余:由于先对抽取的实体进行两两配对,然后再进行关系分类,没有关系的候选实体对所带来的冗余信息,会提升错误率、增加计算复杂度。
(3):交互损失:忽略了这两个任务之间的内在联系和依赖关系。

  1. NER除了LSTM+CRF,还有哪些解码方式?
  • 针对CRF解码慢的问题,LAN提出一种逐层改进的基于标签注意力机制的网络,在保证效果的前提下比CRF解码速度更快。Bi-LSTM-CRF在复杂类别情况下相比BiLSTM-softmax并没有显著的优势。
  • span抽取:指针网络。(1)MRC-QA+单层指针网络,构建query问题指代所要抽取的实体类型,同时也引入了先验语义知识。除了使用指针网络预测实体开始位置、结束位置外,还基于开始和结束位置对构成的所有实体span预测实体概率。此方法也适用于给定时间类型下的事件主体抽取。(2)多层label指针网络。由于只使用单层指针网络时,无法抽取多类型的实体,可以构建多层指针网络,每一层对应一个实体类型。
  1. 如何解决嵌套实体问题?
  • 多标签分类。采取token-level的多标签分类,将softmax替换成sigmoid,可能会导致label之间依赖关系的缺失,可采取后处理规则进行约束。
  • 合并标签层。依然采用CRF,但设置多个标签层,对于每一个token给出其所有的label,然后将所有标签层合并。这可能会增加label数量,导致label不平衡问题。
  1. 为什么会有梯度爆炸和梯度消失?

梯度消失的原因:一是在深层网络中,二是使用了不合适的激活函数,比如sigmoid。
梯度爆炸的原因:一般出现在深层网络和权值初始化值太大的情况。前面层会比后面层变化的更快,就会导致权值越来越大,就会发生梯度爆炸现象。
解决梯度消失/梯度爆炸的方法:(1)使用ReLU激活函数,求偏导是1,所以不会发生梯度消失、梯度爆炸;(2)采用权重L2正则化;(3)重新设计层数更少的网络来解决。

  1. Batch Normalization 和 Layer Normalization的区别?

#深入理解# BN LN IN GN几种标准化的区别
Batch Norm是通过对batch size这个维度标准化让分布稳定,Layer Norm则是通过对hidden size这个维度标准化。经过标准化再输入激活函数,得到的值大部分会落入非线性激活函数的线性区,导数远离导数饱和区,避免了梯度消失,这样可以加速训练收敛过程。
BN适用场景:每个mini-batch比较大,数据分布比较接近。在进行训练之前,要做好充分的shuffle,否则效果会差很多。由于BN需要在运行过程中统计每个mini-batch的一阶统计量和二阶统计量,因此不适用于动态的网络结构和RNN网络。
LN针对单个训练样本进行,不依赖其他数据,因此可以避免BN中受mini-batch数据分布影响的问题,可以用于小mini-batch场景、动态网络场景和RNN,特别是自然语言处理领域。
9.归一化和标准化的区别.
#深入理解# BN LN IN GN几种标准化的区别
归一化:将训练集中某一列数值特征的值缩放到0和1之间。
标准化:将训练集中某一列数值特征的值缩放成均值为 0 ,方差为 1 的状态。
10.如何构建大规模知识图谱?
首先要结合一些自动化的技术,如实体识别、关系抽取、事件抽取等,结合特定领域专家进行搭建和评估,并且可以通过质量评估技术,比如知识表示学习中的三元组分类来判断生成的知识是否合理。知识图谱的应用场景非常广泛,比如搜索、问答、推荐系统、反欺诈、不一致性验证、异常分析、客户管理等。
构建知识图谱的成本需要考虑三大因素:人、模型、数据。首先由人来创建正确有效的本体,标注少量数据,利用数据增强等方式来训练机器学习模型,再利用模型处理有标注和无标注数据。最后人工查验,在保证标注精度的情况下最大程度减少人工干预,最终实现控制成本,做大规模,同时保证知识图谱的质量。
11.为什么BERT输入的最大长度要限制512?
BERT由于position-embeding的限制只能处理最长的512个词的句子。如果文本长度超出512,有以下几种方式进行处理:
(1)直接截断:从长文本中截取一部分,具体截取哪些片段需要观察数据,如新闻数据一般第一段比较重要就可以截取前边部分;
(2)抽取重要片段:抽取长文本的关键句子作为摘要,然后进入BERT;
(3)分段:把长文本分成几段,每段经过BERT之后再进行拼接或求平均或者接入其他网路如LSTM.
12.BERT中,多头注意力机制 7686412与直接用768 *768矩阵统一计算有什么区别?
直接 面试问题准备 - 图74算注意力矩阵,很可能跟 面试问题准备 - 图75效果是差不多的,但计算量大很多,不如直接将 面试问题准备 - 图76分割成12个 面试问题准备 - 图77,然后计算12次 Attention 矩阵,再以某种方式整合,这样以来计算量其实跟直接 面试问题准备 - 图78算单个注意力差不多,相当于某种模型的融合,因此有课多头注意力机制。
13.position embedding是什么,为什么要用?
对于长度为T的文本,最简单的方式就是计数来作为每个字的位置编码,缺点是编码序列没有上界,最后一个字的编码会比第一个位置的大很多,和字嵌入合并会对模型造成一定的干扰。
14.NER如何进行数据增强,给你一个badcase的词典{‘喷泉’, ‘游泳馆’},怎么去处理?
(1)同标签token替换,对于每一token通过二项分布来选择是否被替换;如果被替换,则从训练集中选择相同的token进行替换。
(2)同义词替换,利用WordNet查询同义词,然后根据二项分布随机替换。如果替换的同义词大于1个token,那就依次延展BIO标签。
(3)实体提及替换,与同义词方法类似,利用训练集中的相同实体类型进行替换,如果替换的mention大于1个token,那就依次延展BIO标签
(4)按照mention来切分句子,然后再对每个切分后的片段进行shuffle。

  • 在垂直领域,一个不断积累、不断完善的实体词典对NER性能的提升是稳健的,基于规则+词典也可以快速应急处理一些badcase;
  • 对于通⽤领域,可以多种分词工具和多种句法短语⼯具进行融合来提取候选实体,并结合词典进行NER。

15.如何构建引入词汇信息(词向量)的NER?NER通常是基于字符进行标注的,这是由于基于词汇标注存在分词误差问题。但词汇边界对于实体边界是很有用的,我们该怎么把蕴藏词汇信息的词向量“恰当”地引入到模型中呢?
将词向量引入到模型中,一种简单粗暴的做法就是将词向量对齐到相应的字符,然后将字词向量进行混合,但这需要对原始文本进行分词(存在误差),性能提升通常是有限的。
工业界如何解决NER问题?12个trick,与你分享~
16.随机森林如何处理缺失值?

  • 暴力填补:对于训练集中处于同一个类别下的数据,如果是类别变量缺失,则用众数补全,如果是连续变量,则用中位数。
  • 相似度矩阵填补:使用上述填补后的训练集来训练随机森林模型,并统计相似度矩阵(proximity matrix),然后再看之前缺失值的地方,如果是分类变量,则用没有缺失的观测实例的相似度中的权重进行投票;如果是连续性变量,则用相似度矩阵进行加权求均值。相似度矩阵就是任意两个观测实例间的相似度矩阵,原理是如果两个观测实例落在同一棵树的相同节点次数越多,则这两个观测实例的相似度越高。
  1. 大规模多标签分类如何处理?

大规模多标签分类

  • 1-vs-all classifier 把多标签分类看成多个二分类,为每一个label训练一个二分类模型,其缺点是,各个标签之间相互无关,当标签数量非常非常多的时候,难以训练与标签数量相同的模型。
  • Label Tree based 其思想类似决策树,把所有的标签按树状结构组织起来,从上到下分类,每层只需要训练一个小的分类器,最终分类的叶子节点。这样的缺点是,从上到下的分类过程中,误差可能会累积,导致性能较差。这种方法经常会用到ensemble的模型。
  • Embedding based 假设最后的特征维度是h,类别标签数量是C,当C非常大的时候,网络最后一层的参数数量h C会非常大。这种方法的思想是,把h映射到一个比较小的维度d<<h,再映射到标签,这样参数量=h d + d * C会减少很多。当然这种方法也会用到模型ensemble。
  • Deep Learning based 1).把多标签分类看成seq2seq任务,把生成多个标签看成一个序列生成的过程,一步一步地生成标签,直到生成end为止;2). discriminative learning-based用某种方法(CNN、LSTM、Transformer的encoder)把文本处理成一个向量,再用概率标签树(Probalistic Label Tree)得到最终的概率。

常见大数据题

手撕字节跳动面试时出现过的算法题
1.从1亿个ip中找出访问次数最多的IP
思路:IP地址最多有2^32=4G种取值情况,使用Hash(IP)%1024值,那么把海量IP地址分别存储到1024个小文件中。这样每个小文件最多包含4M个IP地址。如果使用2048个小文件,那么每个小文件会最多包含 2M个IP地址。对于每一个小文件,可以构建一个IP为key,出现次数为 value 的Hash Map,同时记录当前出现次数最多的IP地址;得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得出总体上出现次数最多的IP. 要统计所有文件的topK,首先用K个数据构造最小堆,后面的数据依次判断是否入堆,入堆则进行调整,最后可以得到次数最多的top个IP.
2.有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
思路:顺序读文件,对于每个词x,取hash(x) % 5000,然后按照该值存到5000个小文件中,这样每个小文件大概是200k左右。如果其中有的文件超过了1M大小,还可以按照的方法继续往下分,直到分解得到的小文件的大小不超过1M。对于每个小文件,统计每个文件中出现的词以及相应的频率,并取出频率最大的100个词(可以用含100个结点的最小堆),并把100个词和相应频率存入文件,这样又得到5000个文件。下一步就是把这5000个文件进行归并。
3.有10万首歌曲,每首歌曲由句号分割的歌词组成,现在给你一首歌,怎么快速找到跟这首歌有同样歌词的歌曲。
为每句歌词建立倒排索引,统计每句歌词对应的歌曲id。给新的歌曲之后,进行分句后,然后查找词典就可以得到有相同歌词的歌曲。
4.有10万个词向量,给你一个词向量,找到它相近的词向量。
向量检索:https://zhuanlan.zhihu.com/p/336694120

  • KDTree

kd树是二叉树,核心思想是对 k 维特征空间不断以中值递归切分构造树,每一个节点是一个超矩形,小于结点的样本划分到左子树,大于结点的样本划分到右子树。检索时:从根结点出发,递归地向下访问kd树,直至到达叶结点;以此叶结点为“最近点”,递归地向上回退,查找该结点的兄弟结点中是否存在更近的点,若存在则更新“最近点”,否则回退;直至到根结点结束。
缺点:kd树在维数小于20时效率最高,一般适用于训练实例数远大于空间维数时的k近邻搜索;当空间维数接近训练实例数时,它的效率会迅速下降,几乎接近线形扫描。

  • BallTree

KD 树沿坐标轴分割数据,BallTree将在一系列嵌套的超球面上分割数据,即使用超球面而不是超矩形划分区域。
具体来说就是利用三角不等式,比如我们想找q点的近邻点。假设q的半径r1,f的半径r2,q-f的距离l,如果r1+r2 优缺点:虽然在构建数据结构的花费上大过于KDtree,但是在高维甚至很高维的数据上都表现的很高效

  • Annoy

    Annoy 同样通过建立一个二叉树来使得每个点查找时间复杂度是O(log n),和kd树不同的是,annoy没有对k维特征进行切分,Annoy的每一次空间划分,可以看作聚类数为2的KMeans过程。查询过程和kd树类似,先从根向叶子结点递归查找。Annoy接口中一般需要调整的参数有两个:查找返回的topk近邻和树的个数。一般树越多,精准率越高但是对内存的开销也越大,需要权衡取舍

  • NSW(Navigable Small World graphs)是基于图存储的数据结构。

  • HNSW加入了跳表结构做了进一步优化。最底层是所有数据点,每一个点都有50%概率进入上一层的有序链表。这样可以保证表层是“高速通道”,底层是精细查找。