注:本文总结自rumor(面经酱)的思维导图,如有侵权,即可删除。
一、DNN:梯度消失与梯度爆炸
学习的大佬链接: https://zhuanlan.zhihu.com/p/76772734
1. 结论
梯度消失(爆炸),是由于网络层数过深,导致多个小于(大于)1的梯度值连乘,网络在bp回到接近输入层时,其梯度接近0(无穷大)造成的参数不更新(更新太大)。
说明:对于每一层的o1有来年两种表示,其中NETo1经过线性变换后的值,OUTo1表示NETo1经过激活函数后的值。此处我们直接直接sigmoid激活函数,其它的激活函数类似。
首先计算sigmoid激活函数的导数:令,
则其导数为:
2.原因解释
使用均方误差MSE作为损失函数,则
因此有loss对w5的导数为:
loss对w1的导数为:
可以看出,loss对w5的导数主要与Co1、激活函数的导数,以及权重w5、w7有关(如果是中间层,则没有输入的事,因此不考虑i),由于Co1作为输出层的计算,一般不作考虑。
在这里,影响导数的主要是激活函数的导数和权重。已知sigmoid函数的导数范围为(0, 0.25),而我们在初始化权重时,一般都是服从均值为0,方差为1的正态分布,因此有, 经过连乘,则接近输入层的导数趋向于0,会导致几乎不更新,即梯度消失。
反之,若, 通过连乘,则接近输入层的导数会很大,导致参数很剧烈,即梯度爆炸。但是一半不会出现梯度爆炸,因为,当w很大时,会很小,是的梯度不易爆炸。
3.解决方案:
a.梯度爆炸
使用梯度截断/正则化
b.梯度消失
1).改变激活函数
relu(tanh的导数也小于1,因此只能缓解),但直接的relu会有0区间不更新的问题。
2).batchnorm
通过归将输入输出一化到均值为0,方差为1的区间,使权重落在激活函数敏感的区域,梯度变化大,避免梯度消失,同时加快收敛
3).残差结构
保证总有线性通路
4. 与RNN中梯度消失的区别
a. DNN中的梯度消失:网络接近输入层的梯度几乎不更新,导致网络退化为固定前几层网络,只更新后几层网络的浅层网络。
b. RNN中的梯度消失:
可以发现,随着网络层数的增加,W0的梯度一直正常更新。但是由于连乘的效应,在接近输入层的Wx和Ws的梯度, 会发生梯度消失;但在接近输出层的Wx和Ws不会发生梯度消失。由于RNN中一次任务的损失值为每一时刻损失值的叠加,因此在任一时刻整体的梯度不会消失(因为当下的梯度还在),只是前面的信息用不到了,即前面的梯度消失了,所以叫做梯度消失。
注:有人证明过:RNN的总梯度 = 每一时刻的梯度之和。
二、CNN:
1. 归纳偏置:特征的局部重要性(locality)和平移不变形(spatial invariance);与之对应的,RNN的归纳偏置为信息的顺序处理重要性;深度神经网络为层次化处理信息很重要。
注:归纳偏置会促使学习算法优先考虑具有某些属性的解(即在多种可行的拟合曲线中选择具有某种属性的曲线)
2.卷积核:
1)卷积核的尺寸实际上是3维的,即filter_size * filter_size * in_channel,通过这样的卷积核,才能使通道数由in_channel变为out_channel。
2)卷积过程的计算:
a. CV领域:
前提: 假设输入为64*64*3, filter_size为3*3,卷积核个数为100,步长为1,no padding。
则: 输出大小为:62*62*100
参数量为:(3*3*3 +1) * 100 = 2800(一般默认在卷积之后使用偏置b)
计算量: (3*3*3+26)*100 = 5300(每个元素都要进行乘法,得到的27个元素还要进行加法,最终变为一个元素 -> 这是一个卷积核的计算量。然后 * 卷积核的个数100)
b. NLP领域:
前提:假设输入为64*300,filter_size为3,卷积核个数为100, 步长为1,no padding。
则:输出大小为: 62*100(filter_size 默认为3*300(embedding的维度))
参数量为: (3*300 + 1) * 100 = 90100
计算量为:(3*300 *2 -1)* 100 = 179900
注:卷积之后的尺寸:out = (input - filter + 2*padding) / stride + 1
3. 1*1卷积:(实际卷积尺寸为1*1*in_channel)
a.作用:1)进行通道的升降维
2) channel间信息的交互
3)增加非线性特征:1*1可以保持尺寸不变,但是feature map已经变了,通过后面的非线性激活函数,即可以得到不同的非线性特征。
b.与全连接层的区别:
全连接层的输入尺寸是固定的,但是1*1卷积核的输入尺寸可以是任意的。
4.反向传播:https://zhuanlan.zhihu.com/p/81675803
avg-pooling:相当于w=[1/4, 1/4, 1/4, 1/4]的卷积核
5.稀疏交互与权重共享
a.稀疏交互:每个输出神经元仅与前一层特定局部区域的神经元存在连接权重
b.权重共享:使得卷积层具有高度的平移不变性。
6.池化本质:降采样 https://zhuanlan.zhihu.com/p/136192775
a.平均池化:避免估计方差过大,提取背景信息
b.最大池化:避免估计均值偏移,提取纹理信息,减少无用信息的影响。
c.全局池化:获取全局上下文信息。
三、RNN:
1. 归纳偏置:时序不变性
2. BPTT(back propogation through time): 按照时间序列的反向传播,本质上还是BP
3.梯度消失与梯度爆炸:DNN的时候已经说过了
4. LSTM:https://zhuanlan.zhihu.com/p/34203833
5. GRU:结构比LSTM简单,因此比LSTM收敛的快,但是如果数据量很大,LSTM是略优于GRU的
四、Bert:
1.token Embedding:
1)为什么attention is all you need中要乘上sqrt(embedding)?
因为位置编码使用的是sin/cos,值域比xavier初始化的token embedding大很多[-0.13, 0.13],所以需要乘以sqrt(embedding)做增强。但是bert中使用的是position embedding的方式,就没有必要了。
2. Scaled Dot Product:
1)为什么是缩放点积,而不是点积模型?
当输入信息的维度d比较大时,点积模型的值通常有比较大的方差,从而导致数据分布由均值0方差d -> 均值0方差d^2.另一方面,点积得到的数较大时,会落在softmax函数的饱和区,导致反向传播的梯度比较小,甚至接近于0。因此需要使用缩放点积。
2)加法模型和乘法模型的区别:
乘法模型的优势:直接利用矩阵的乘积,计算效率更高
缺陷:会产生较大的输出,一方面改变了输入的分布,一方面使输出落入了softmax函数的饱和区。
3. QKprojection:为什么是双线性点积模型?
双线性点积模型,引入非对称性,更具健壮性(使得当前位置对自身的注意力得分不一定最高)
4. multi-head为什么有效?
1)类似于CNN中的多通道,能够得到更多的特征,每个头都相当于在原来维度上的一种线性组合
2)先切头再缩放点积,这样的点积维度d较小,避免梯度消失,通过注意力矩阵较小。最终能够实现在相同计算量下得到更多的特征信息。
5. FFN的作用
FFN中的relu等激活函数是非线性变换的主要来源。
6.解读transformer的细节(https://www.zhihu.com/people/tang-pan-43-83)
1)TWWT(权重共享)
原因:1.embedding矩阵U是指定抽取,pre- softmax矩阵V是逐个点积,因此U没有V训练的充分。通过绑定,可以得到质量更高的embedding矩阵。(为什么可以绑定,两者的一列都是对某一单词的向量化表示,语义是相通的)
2. 此表大小比隐层的维度H高出一个数量级,这样能较低参数量,使模型收敛的更快。
2) position encoding
注:必须要用正弦和余弦,因为这样通过三角函数的和角才能得到相对位置编码;但不是必须得是奇偶下标来分开使用sin和cos,只要分成两段就可以,因为后面的全连接层会重排坐标。
3) LayerNormlization(LN):
好处:1.使输出落在梯度敏感区,加快模型的训练
2.保证每次数据的分布相同,消除极端值,提高模型的稳定性
注:在梯度敏感区域,隐层的输出接近线性,模型表达能力会下降,因此引入gi和bi,对输出进行线性变换,稍稍改变输出的分布。(gi和bi是学习的参数)
4) label smoothing(regularization):
主要思想:一种正则化手段,避免过拟合,防止模型对某些样本过于confident。
与dropout的区别:dropout用于隐层,LSR用于softmax层。
具体实现:LSR为了让模型不过于贴合单点分布,会在真实分布中加入噪音,并叠加一个独立于样本数据的均匀分布。所以有
其中q(k)表示样本的类别为y(真实值)的概率,原文中均匀分布的参数为0.1。因此损失函数(交叉熵)变为 5)warmup (也叫做noam)
好处:1. 模型在初始阶段不稳定,如果学习率过大,可能会不收敛,因此需要预热
2. 使用gradual warmup(线性warmup),在大batch size下能够更好的拟合出类似小batch size的梯度效果(bs放大k倍,则学习率也类似放大k倍)
7.Bert的优缺点:
1.优点
bert作为预训练模型,利用了文本的双向信息,效果更好,而transformer在decoder部分使用了mask,让第i时刻只能获得前i-1个时刻的信息。
2.缺点
1)因为使用了mask,bert在预训练和微调时的结构不匹配
2)只有15%的token被mask掉,模型收敛的比较慢
3)bert在在做分词的时候,将每个token切分了,因此可能仅mask一个词的一部分,这样做预测任务会变的很容易 --> 改进:使用wwm
8. Bert的激活函数
Gelu: