NLP面试知识点汇总

请你说说CNN,RNN,LSTM,Transformer之间的优缺点
CNN:
优点:并行化处理数据,捕捉局部信息能力强
缺点:1)不能表达时序信息。2)网络层数过深时,接近输入层的参数会更新变慢
RNN:
优点:可以表达时序信息。
缺点:1)不能并行处理数据。2)随着网络层数的增加,rnn在处理长序数据时容易出现梯度爆炸和梯度消失现象。
LSTM:
优点: lstm一定程度上解决了rnn中的梯度消失问题。
Transformer:
优点:1)相对于rnn,可以并行化处理数据。2)解决了长程依赖问题。3)计算两个token之间相似度的操作不会随着距离增加而变复杂。

为什么会出现梯度消失,梯度爆炸
梯度消失产生的原因:
梯度消失通常来源于激活函数的过饱和现象,由于在反向传播的过程中,为了求得参数的梯度,需要对激活函数多次链式求导,sigmoid在饱和区导数非常小,连乘操作会导致最终的梯度过小,产生梯度消失的现象,最后导致浅层的神经元更新速度非常慢,无法进行有效的学习,这种现象在深层网络更为突出。
后果:
梯度消失会导致前面网络层的参数更新幅度很小;梯度爆炸会导致学习过程很不稳定,最坏的结果导致权重更新导数为NaN,无法更新参数。
梯度爆炸产生的原因
由于再反向传播的过程中,为了求得参数的梯度,需要进行多次链式求导,当每一层的神经元对上一层的输出再乘权重大于1时,连乘操作会使得最终的梯度越来越大,产生梯度爆炸现象。
梯度下降原理: w i + 1 = w i + α ∂ l o s s ∂ w i w_{i+1}=w_i+\alpha\frac{\partial loss}{\partial{w_i}} wi+1=wi+αwiloss
推导:
假设激活函数是f,在每一层经激活函数激活后的输出值为 f i f_i fi f 4 f_4 f4是最后一层网络的输出值,现在我们要更新 w 2 w_2 w2这个参数:
∂ l o s s ∂ w 2 = ∂ l o s s ∂ f 4 ∂ f 4 ∂ f 3 ∂ f 3 ∂ f 2 ∂ f 2 ∂ w 2 \frac{\partial loss}{\partial w_2}=\frac{\partial loss}{\partial f_4}\frac{\partial f_4}{\partial f_3}\frac{\partial f_3}{\partial f_2}\frac{\partial f_2}{\partial w_2} w2loss=f4lossf3f4f2f3w2f2
随着层数的增加,最终的值和 ∂ f i + 1 ∂ f i \frac{\partial f_{i+1}}{\partial f_i} fifi+1连乘有很大的关系, f i f_i fi是前一层输出然后经激活函数f得到 f i + 1 f_{i+1} fi+1,即 f i + 1 = s i g m o i d ( f i w i + 1 ) f_{i+1}=sigmoid(f_iw_{i+1}) fi+1=sigmoid(fiwi+1)
∂ f i + 1 ∂ f i = s i g m o i d ( 1 − s i g m o i d ) ⋅ w i + 1 \frac{\partial f_{i+1}}{\partial f_i}=sigmoid(1-sigmoid)\cdot w_{i+1} fifi+1=sigmoid(1sigmoid)wi+1
∂ f 2 ∂ w 2 = s i g m o i d ( 1 − s i g m o i d ) ⋅ x \frac{\partial f_2}{\partial w_2}=sigmoid(1-sigmoid)\cdot x w2f2=sigmoid(1sigmoid)x
所以当 ∂ f i + 1 ∂ f i \frac{\partial f_{i+1}}{\partial f_i} fifi+1>1时,连乘操作会使梯度变得越来越大,导致梯度爆炸;反之,梯度会变得很小,导致梯度消失。
解决:
梯度消失:ReLU代替sigmoid,LSTM,BatchNormlization
梯度爆炸:梯度裁剪
各种激活函数比较
为什么sigmoid,tanh容易出现梯度消失的现象
s i g m o i d = 1 1 + e − x sigmoid=\frac{1}{1+e^{-x}} sigmoid=1+ex1 求导: s i g m o i d ( 1 − s i g m o i d ) sigmoid(1-sigmoid) sigmoid(1sigmoid)
sigmoid激活函数在输入值很大或很小时的导数为0,而且导数最大为0.25,所以sigmoid导数连乘很容易为0,从而出现梯度消失现象,tanh激活函数同理
ReLU有什么优点,局限性
优点:
将小于0的神经元输出为0,从而将这些神经元灭活,可以达到稀疏网络来拟合函数的效果。
relu的线性特点可以保证经多层网络传递后保持原来的梯度,避免了梯度消失现象。
relu计算简单,不涉及指数运算。
局限性:
由于单侧抑制,训练过程中会导致神经元死亡的问题(当relu的输出为0时,其导数也为0,进而导致该权重永久不会更新)
改进:Leaky ReLU
RNN梯度消失和MLP梯度消失的区别
MLP网络中各个层之间的参数是独立的,不同层之间的梯度也是独立的。
RNN中每个时间步都共享相同的权重参数,最终的梯度等于各个时间步梯度之和,随着梯度的传导,最终的梯度被近距离的梯度主导,近距离的梯度不会消失,远距离的梯度越传越小,导致模型学习不到远距离的依赖关系。
RNN梯度消失,梯度爆炸的原因
损失函数的导数小于1,当隐状态矩阵很小时,随着梯度的传递,远距离的梯度越传越小,最终梯度被近距离的梯度主导,模型学习不到远距离的依赖关系;当隐状态矩阵很大时,梯度会越传越大。
rnn前向传播:
S 1 = x 1 W x + S 0 W s , S_1=x_1W_x+S_0W_s, S1=x1Wx+S0Ws, O 1 = S 1 W o O_1=S_1W_o O1=S1Wo
S 2 = x 2 W x + S 1 W s , S_2=x_2W_x+S_1W_s, S2=x2Wx+S1Ws, O 2 = S 2 W o O_2=S_2W_o O2=S2Wo
S 3 = x 3 W x + S 2 W s , S_3=x_3W_x+S_2W_s, S3=x3Wx+S2Ws, O 3 = S 3 W o O_3=S_3W_o O3=S3Wo
O 3 → l o s s O_3→loss O3loss

∂ l o s s ∂ W o = ∂ l o s s ∂ O 3 ∂ O 3 ∂ W o \frac{\partial loss}{\partial W_o}=\frac{\partial loss}{\partial O_3}\frac{\partial O_3}{\partial W_o} Woloss=O3lossWoO3

∂ l o s s ∂ W x = ∂ l o s s ∂ O 3 ∂ O 3 ∂ S 3 ∂ S 3 ∂ W x + ∂ l o s s ∂ O 3 ∂ O 3 ∂ S 3 ∂ S 3 ∂ S 2 ∂ S 2 ∂ W x + ∂ l o s s ∂ O 3 ∂ O 3 ∂ S 3 ∂ S 3 ∂ S 2 ∂ S 2 ∂ S 1 ∂ S 1 ∂ W x \frac{\partial loss}{\partial W_x}= \frac{\partial loss}{\partial O_3}\frac{\partial O_3}{\partial S_3}\frac{\partial S_3}{\partial W_x}+ \frac{\partial loss}{\partial O_3}\frac{\partial O_3}{\partial S_3}\frac{\partial S_3}{\partial S_2}\frac{\partial S_2}{\partial W_x}+ \frac{\partial loss}{\partial O_3}\frac{\partial O_3}{\partial S_3}\frac{\partial S_3}{\partial S_2}\frac{\partial S_2}{\partial S_1}\frac{\partial S_1}{\partial W_x} Wxloss=O3lossS3O3WxS3+O3lossS3O3S2S3WxS2+O3lossS3O3S2S3S1S2WxS1

∂ l o s s ∂ W s = ∂ l o s s ∂ O 3 ∂ O 3 ∂ S 3 ∂ S 3 ∂ W s + ∂ l o s s ∂ O 3 ∂ O 3 ∂ S 3 ∂ S 3 ∂ S 2 ∂ S 2 ∂ W s + ∂ l o s s ∂ O 3 ∂ O 3 ∂ S 3 ∂ S 3 ∂ S 2 ∂ S 2 ∂ S 1 ∂ S 1 ∂ W s \frac{\partial loss}{\partial W_s}= \frac{\partial loss}{\partial O_3}\frac{\partial O_3}{\partial S_3}\frac{\partial S_3}{\partial W_s}+ \frac{\partial loss}{\partial O_3}\frac{\partial O_3}{\partial S_3}\frac{\partial S_3}{\partial S_2}\frac{\partial S_2}{\partial W_s}+ \frac{\partial loss}{\partial O_3}\frac{\partial O_3}{\partial S_3}\frac{\partial S_3}{\partial S_2}\frac{\partial S_2}{\partial S_1}\frac{\partial S_1}{\partial W_s} Wsloss=O3lossS3O3WsS3+O3lossS3O3S2S3WsS2+O3lossS3O3S2S3S1S2WsS1

由此可见:随着rnn序列长度的增加,权重更新的幅度和 ∂ S t ∂ S t − 1 \frac{\partial S_t}{\partial S_{t-1}} St1St的连乘有关, S t = t a n h ( S t − 1 W s ) S_t = tanh(S_{t-1}W_s) St=tanh(St1Ws), ∂ S t ∂ S t − 1 = Δ t a n h W s \frac{\partial S_t}{\partial S_{t-1}}=\Delta tanhW_s St1St=ΔtanhWs,当tanh的导数和 W s W_s Ws相乘小于1时,连乘使结果趋向于0,导致梯度消失。

LSTM模型结构,和RNN的区别
遗忘门:决定上一时刻的细胞状态 c t − 1 c_{t-1} ct1有多少传递到当前时刻细胞状态 c t c_t ct
f t = δ ( W f [ h t − 1 , x t ] ) f_t=\delta(W_f[h_{t-1},x_t]) ft=δ(Wf[ht1,xt])
输入门:决定当前时刻的输入(候选细胞状态)有多少传递到当前细胞状态 c t c_t ct
i t = δ ( W i [ h t − 1 , x t ] ) i_t=\delta(W_i[h_{t-1},x_t]) it=δ(Wi[ht1,xt])
输出门:决定当前细胞状态 c t c_t ct有多少传递到当前隐状态 h t h_t ht
o t = δ ( W o [ h t − 1 , x t ] ) o_t=\delta(W_o[h_{t-1},x_t]) ot=δ(Wo[ht1,xt])
当前候选细胞状态: c ⃗ = δ ( W c [ h t − 1 , x t ] ) \vec c=\delta(W_c[h_{t-1},x_t]) c =δ(Wc[ht1,xt])
当前细胞状态: c t = f t c t − 1 + i t c ⃗ c_t=f_tc_{t-1}+i_t\vec c ct=ftct1+itc
当前隐状态: h t = o t c t h_t=o_tc_t ht=otct
LSTM是怎么缓解梯度消失问题的
原始的lstm没有遗忘门,这样 c t c_t ct c t − 1 c_{t-1} ct1的偏导为1,梯度可以无损的在每个时间步传递,远距离的梯度不会消失,可以学习到远距离的依赖关系。
增加遗忘门后,输出的值区间在[0,1]之间,当前一时刻的信息对当前时刻没有帮助时,遗忘门可以值为零,那么梯度也是0。
梯度爆炸可以用梯度裁剪来缓解:

你可能感兴趣的:(NLP面经,自然语言处理,深度学习,人工智能)