文章目录
-
- word2vec
- glove
- 你知道几种词向量的方法?
- 你认为为什么BERT能达到这么好的效果?
- 注意力机制你了解多少,或者说你了解哪几种?
- Add & Norm模块的作用: LN BN
- attention和self-attention的区别
- Seq2seq Attention
- transformer
- elmo
- bert
- gpt gpt-2
- CGAN
- PCA降维 LDA
- 协同过滤
- VGG16
- LSTM RNN 计算复杂度
- 处理文本分类中样本不均衡的问题
- 过拟合怎么办?
- L1,L2正则的特点
- 优化方式总结 Adam
- 常见的损失函数
- VQA其他的模型
- 文本生成/诗词生成其他模型
- 激活函数
- KMP
- GAN的推导
- Dropout为啥有效果
- NLP任务
- transformer-XL
- XLNet
- AR 自回归语言模型 AE 自编码语言模型
- ERNIE
emmm不知道会问啥 把简历里有的 没的都准备一遍吧呜呜呜…我是答案的搬运工…烦躁,能不能快点找到实习呜呜呜…
word2vec
- 模型结构描述:三层结构,输入层,投射层,输出层(softmax)。分为两种实现方式:skip-gram和cbow。skip-gram是给定一个input word,试图预测出窗口中的上下文单词。cbow是给定上下文单词,预测出中间词。
- 优化方式描述:层次softmax,负采样。
- 如何降采样(正采样?):为了减少训练样本,vocab_size并不是所有word的数量,首先统计所有word的出现频率,按照词频排序,取前50000的词作为词袋。(tensorflow中实现w2v)
- w2v如何负采样:https://www.cnblogs.com/pinard/p/7249903.html
比如我们有一个训练样本,中心词是w,它周围上下文共有2c个词,记为context(w)。由于这个中心词w,的确和context(w)相关存在,因此它是一个真实的正例。通过Negative Sampling采样,我们得到neg个和w不同的中心词wi,i=1,2,…neg,这样context(w)和wi就组成了neg个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归,得到负采样对应每个词wi对应的模型参数θi,和每个词的词向量。
Negative Sampling由于没有采用霍夫曼树,每次只是通过采样neg个不同的中心词做负例,就可以训练模型,因此整个过程要比Hierarchical Softmax简单。每次操作可以只让一个样本更新权重矩阵中的一小部分,减少计算压力。
-
如何层次softmax:
为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射.由于我们把之前所有都要计算的从输出softmax层的概率计算变成了一颗二叉霍夫曼树,那么我们的softmax概率计算只需要沿着树形结构进行就可以了。
我们的霍夫曼树的所有内部节点就类似之前神经网络隐藏层的神经元,其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。
使用霍夫曼树有什么好处呢?首先,由于是二叉树,之前计算量为V,现在变成了log2V。第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。(使用梯度上升进行参数更新)
-
w2v使用哈夫曼树优化后,和原模型是近似的。并不需要更新所有的值,只更新经过树的节点的相应的权重。
-
w2v使用负采样优化后,和原模型是近似的。并不需要更新所有的值,只更新选取的负样本和正样本相应的权重。
-
w2v负采样后,损失函数是什么样的?
这里的负采样不是简单的随机采样,word2vec采样的方法并不复杂,如果词汇表的大小为V,那么我们就将一段长度为1的线段分成V份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短。每个词w的线段长度由下式决定: 在word2vec中,分子和分母都取了3/4次幂如下:
在采样前,我们将这段长度为1的线段划分成M等份,这里M>>V,这样可以保证每个词对应的线段都会划分成对应的小块。而M份中的每一份都会落在某一个词对应的线段上。
在采样的时候,我们只需要从M个位置中采样出neg个位置就行,此时采样到的每一个位置对应到的线段所属的词就是我们的负例词。
-
模型总结
优点:由于Word2vec会考虑上下文,跟之前的Embedding方法相比,效果要更好;比之前的Embedding方法维度更少,所以速度更快;通用性很强,可以用在各种 NLP 任务中。
缺点:由于词和向量是一对一的关系,所以多义词的问题无法解决;此外,Word2vec是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化。
-
词袋模型到 word2vec 改进了什么?
词袋模型(Bag-of-words model)是将一段文本(比如一个句子或是一个文档)用一个“装着这些词的袋子”来表示,这种表示方式不考虑文法以及词的顺序。「而在用词袋模型时,文档的向量表示直接将各词的词频向量表示加和」。通过上述描述,可以得出词袋模型的两个缺点:
词向量化后,词与词之间是有权重大小关系的,不一定词出现的越多,权重越大。
词与词之间是没有顺序关系的。
而 word2vec 是考虑词语位置关系的一种模型。通过大量语料的训练,将每一个词语映射成一个低维稠密向量,通过求余弦的方式,可以判断两个词语之间的关系,word2vec 其底层主要采用基于 CBOW 和 Skip-Gram 算法的神经网络模型。
因此,综上所述,词袋模型到 word2vec 的改进主要集中于以下两点:
考虑了词与词之间的顺序,引入了上下文的信息
得到了词更加准确的表示,其表达的信息更为丰富
glove
https://blog.csdn.net/u014665013/article/details/79642083
奇异值分解和特征值分解:https://www.cnblogs.com/jian-gao/p/10781649.html
- LSA (潜在语义分析:与词向量有关,是文档与所有词在该文档中出现频次的矩阵(词文档矩阵),利用SVD分解之后,左边的矩阵就是词向量。)和word2vec作为两大类方法的代表,一个是利用了全局特征的矩阵分解方法,一个是利用局部上下文的方法。glove代价函数GloVe模型就是将这两中特征合并到一起的,即使用了语料库的全局统计(overall statistics)特征,也使用了局部的上下文特征(即滑动窗口)。为了做到这一点GloVe模型引入了Co-occurrence Probabilities Matrix。
Xi,j:在整个语料库中,单词i和单词j共同出现在一个窗口中的次数。
取值都是为0.75,而x_{max}为100,词对共现次数越多的,有更大的权重将被惩罚得更厉害些;次数少,有更小的惩罚权重,这样就可以使得不常共现的词对对结果的贡献不会太小,而不会过分偏向于常共现的词对。
- Glove和skip-gram、CBOW模型对比
Cbow/Skip-Gram 是一个local context window的方法,比如使用NS来训练,缺乏了整体的词和词的关系,负样本采用sample的方式会缺失词的关系信息。
另外,直接训练Skip-Gram类型的算法,很容易使得高曝光词汇得到过多的权重
Global Vector融合了矩阵分解Latent Semantic Analysis (LSA)的全局统计信息和local context window优势。融入全局的先验统计信息,可以加快模型的训练速度,又可以控制词的相对权重。
- Question1: GloVe是如何训练的?
Answer1: 虽然很多人声称GloVe是一种无监督的学习方式(因为它确实不需要人工标注label),但其实它还是有label的,这个label就是优化目标中的log(Xi,j)。而优化目标中的就是要不断更新/学习的参数vi,vi~,所以本质上它的训练方式跟监督学习的训练方法没什么不一样,都是基于梯度下降的。
具体地,这篇论文里的实验是这么做的:采用了AdaGrad的梯度下降算法,对矩阵中的所有非零元素进行随机采样,学习率(learning rate)设为0.05,在vector size小于300的情况下迭代了50次,其他大小的vectors上迭代了100次,直至收敛。
最终学习得到的是两个vector是,因为X是对称的,所以从原理上讲也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,最终会选择两者之和作为最终的vector(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。
你知道几种词向量的方法?
这里说的很详细,我带了一下传统的,如IDF、词袋、LDA,GloVe等偏统计方法,
然后具体描述了NNLM下的模型:word2vec(和一面一样,介绍的比较详细),
character level CNN Model(英文适用,中文不太适用);
转向RNN结构:传统RNN将序列压缩至向量的过程,LSTM解决RNN长依赖模型,双向语言模型(BiLSTM);
根据双向语言模型,导出了ELMo以及内部细节;
主流热门的Transformer系列:Transformer内部细节详细讲了一下
GPT(Transformer Decoder,单向模型,和之前的双向模型做了个区分),详细说了一下,
然后是BERT(Transformer Encoder,双向语言模型,和GPT的对比和ELMo的相同点,以及区别)详解。
6. n元模型了解吗,如果共现频率为零怎么解决?
大致讲了下ngram与n阶马尔可夫。共现为0的解决方案有点忘记了,但是提了一下在GloVe中有提及这个情况的解决方案,但是我也忘记了。
你认为为什么BERT能达到这么好的效果?
我认为BERT的效果很大程度上取决于Transformer的一个Attention机制,即Self-Attention,正如原文标题《Attention is all you need》,注意力机制很好地找出了文本序列的语义相关度,在语义层面上,能够提取到更关键的特征,比如理解序列中的指示代词。
其次是Transformer的结构优势,没有RNN的梯度消失问题,理论上支持任意长度的文本,用了position embedding(区别说明了下Transformer的三角函数和BERT的position embedding的不同)。
注意力机制你了解多少,或者说你了解哪几种?
- 注意力机制最初是在CV领域用的比较多,其次被应用到了NLP领域,并且取得了较好的效果。我主要研究NLP比较多,CV了解不深,所以只了解NLP的两种attention。最早的Attention是在seq2seq中提出(或者说Encoder-Decoder模型),讲了下这个模型注意力机制的细节,以及注意力获取的方式,文献名我忘记了,原始的论文应该是NMT相关场景。然后讲了BERT的Self-Attention细节,比如Q、K、V这些。
. attention说白了就是权重计算和加权求和。图上的循环神经网络中的每一步都会输出一个向量,在预测目标语言到某一步时,用当前步的向量去和源语言中的每一步的向量去做内积,然后经过softmax得到归一化后的权重,再用权重去把源语言上的每一步的向量去做加权平均。然后做预测的时候也作为输入进入全连接层。
- attention的步骤:
output矩阵:[step_len, dim_rnn]
执行encoder:将原数据以此输入encoder,执行encoder,目的在于将原序列的信心,编译成语义向量,供后续的decoder使用。
计算对齐系数a:将原序列所有step的output(h)和目标序列当前的step的output(h)逐个相乘,得到的值即为score。然后softmax归一化,得到对齐向量a,维度[step_len,1]
**计算上下文语义向量c:**将对齐系数a作为权重,对encoder的每个step的output向量进行加权求和,得到encoder当前step的上下文语义向量c[1,dim_rnn]
**更新decoder状态:**可以是h,也可是s。
**计算输出预测词:**做一个语义向量到目标词表的映射,再进行softmax
- self-attention:
这里面Multi-head Attention其实就是多个Self-Attention结构的结合,每个head学习到在不同表示空间中的特征.
我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配,看看相关度有多高。
对于decoder来讲,我们注意到有两个与encoder不同的地方,一个是第一级的Masked Multi-head,另一个是第二级的Multi-Head Attention不仅接受来自前一级的输出,还要接收encoder的输出,第一级decoder的key, query, value均来自前一层decoder的输出,但加入了Mask操作,即我们只能attend到前面已经翻译过的输出的词语,因为翻译过程我们当前还并不知道下一个输出词语,这是我们之后才会推测到的。
而第二级decoder也被称作encoder-decoder attention layer,即它的query来自于之前一级的decoder层的输出,但其key和value来自于encoder的输出,这使得decoder的每一个位置都可以attend到输入序列的每一个位置。
总结一下,key和value的来源总是相同的,query在encoder及第一级decoder中与key,value来源相同,在encoder-decoder attention layer中与k,v来源不同。
Add & Norm模块的作用: LN BN
add代表了Residual Connection,是为了解决多层神经网络训练困难的问题,通过将前一层的信息无差的传递到下一层,可以有效的仅关注差异部分,ResNet。
Norm则代表了Layer Normalization,通过对层的激活值的归一化,可以加速模型的训练过程,使其更快的收敛,.对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。(参考https://blog.csdn.net/lqfarmer/article/details/71439314)与BN不同,LN是针对深度网络的某一层的所有神经元的输入按以下公式进行normalize操作。
https://blog.csdn.net/liuxiao214/article/details/81037416
输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,
batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好,对每一层的输入做scale和shift方法,将每层神经元的输入分布强行拉回均值为0、方差为1的标准正态分布,这就使得激活层输入值落入在非线性函数对输入值比较敏感的区域,使得输入的小变化会导致损失函数较大的变化,使得梯度变大,训练速度加快,且避免梯度消失问题。
layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
BN与LN的区别在于:
LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差;
BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。
所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。
LN用于RNN效果比较明显,但是在CNN上,不如BN。
attention和self-attention的区别
在一般任务的Encoder-Decoder框架中,输入Source和输出Target内容是不一样的,比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,
Attention机制发生在Target的元素Query和Source中的所有元素之间。
而Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。
其具体计算过程是一样的,只是计算对象发生了变化而已,所以此处不再赘述其计算过程细节。
Seq2seq Attention
- Seq2Seq模型的核心思想是, 通过深度神经网络将一个作为输入的序列映射为一个作为输出的序列, 这一过程由编码输入与解码输出两个环节构成。在Seq2Seq模型中, 两个循环神经网络是共同训练的。
- Seq2Seq模型在解码时, 有哪些常用的办法?
Seq2Seq模型最核心的部分是其解码部分, 大量的改进也是在解码环节衍生的。
Seq2Seq模型最基础的解码方法是贪心法, 即选取一种度量标准后, 每次都在当前状态下选择最佳的一个结果, 直到结束。 贪心法的计算代价低, 适合作为基准结果与其他方法相比较。 很显然, 贪心法获得的是一个局部最优解, 由于实际问题的复杂性, 该方法往往并不能取得最好的效果。
集束搜索beam search是常见的改进算法, 它是一种启发式算法。 该方法会保存beam size(后面简写为b) 个当前的较佳选择, 然后解码时每一步根据保存的选择进行下一步扩展和排序, 接着选择前b个进行保存, 循环迭代, 直到结束时选择最佳的一个作为解码的结果。
解码时使用堆叠的RNN、 增加Dropout机制、 与编码器之间建立残差连接等,均是常见的改进措施。
- Seq2Seq模型引入注意力机制是为了解决什么问题? 为什么选用了双向的循环神经网络模型?
在实际使用中, 会发现随着输入序列的增长, 模型的性能发生了显著下降。这是因为编码时输入序列的全部信息压缩到了一个向量表示中。 随着序列增长,句子越前面的词的信息丢失就越严重。 而在解码时, 目标语言的第一个词大概率是和源语言的第一个词相对应的, 这就意味着第一步的解码就需要考虑100步之前的信息。 建模时的一个小技巧是将源语言句子逆序输入, 或者重复输入两遍来训练模型, 以得到一定的性能提升。 使用长短期记忆模型能够在一定程度上缓解这个问题, 但在实践中对于过长的序列仍然难以有很好的表现。 同时,Seq2Seq模型的输出序列中, 常常会损失部分输入序列的信息, 这是因为在解码时, 当前词及对应的源语言词的上下文信息和位置信息在编解码过程中丢失了。
在生成一个输出词时, 会考虑每一个输入词和当前输出词的对齐关系, 对齐越好的词, 会有越大的权重, 对生成当前输出词的影响也就越大。 图10.7展示了翻译时注意力机制的权重分布, 在互为翻译的词对上会有最大的权重。
在解码时, 每一个输出词都依赖于前一个隐状态以及输入序列每一个对应的隐状态,其中语境向量ci是输入序列全部隐状态h1,h2…hT的一个加权和.
其中注意力权重参数αij并不是一个固定权重, 而是由另一个神经网络计算得到
神经网络a将上一个输出序列隐状态si−1和输入序列隐状态hj作为输入, 计算出一个xj, yi对齐的值eij, 再归一化得到权重αij。
而使用双向循环神经网络进行建模, 第i个输入词对应的隐状态包含了和 , 前者编码x0到xi的信息, 后者编码xi及之后所有词的信息, 防止了前后文信息的丢失。
transformer
来源:Transformer: Attention的集大成者
-
Transformer模型是机器翻译领域的一个全部基于attention的模型。
-
transformer结构:
左边处理源语言,称之为Encoder,右边处理目标语言,被称为Decoder
分别由N个Block组成。然后每个block都有这么几个模块:
Multi-Head Attention,Masked Multi-Head Attention(Decoder 端多头 self-attention 模块与 Encoder 端的一致,但是「需要注意的是 Decoder 端的多头 self-attention 需要做 mask,因为它在预测时,是“看不到未来的序列的”,所以要将当前预测的单词(token)及其之后的单词(token)全部 mask 掉。」)
Add & Norm 神经网络结构残差连接,Feed Forward前馈神经网络,Positional Encoding,Linear全连接层
其中, Feed Forward和Linear是神经网络的基本操作全连接层,Add & Norm以及延伸出来的一条侧边也是一个常见的神经网络结构残差连接。
-
attention 可以被描述为「将 query 和 key-value 键值对的一组集合映射到输出」。
Multi-Head Attention是由多个Scaled Dot-Product Attention的函数组合而成的。而Multi-Head Attention则是多个独立的Scaled Dot-Product Attention计算得到的结果合并然后再经过一个全连接层。
-
Q,K,V是怎么来的?
答:输入的每个词经过Input Embedding后会变成一个向量,然后这个向量会分别经过一个矩阵变换得到Q,K,V。
-
问题2:Q,K,V分别的含义是什么,
答:Q代表Query,K代表Key,V代表Value。相对于上面的seq2seq+attention模型,这里做了一个attention概念上的拆分,Q和K去计算权重,V去和权重做加权平均。而在seq2seq+attention中相当于Q,K,V是一个向量。
-
Positional Encoding:让模型知道每个输入的位置信息,最简单的方法就是给每个位置一个固定向量,然后让这个固定向量去和随机初始化的embedding去加和。原始论文中采用的是正弦余弦交叉混编的方式去做的:「因为三角公式不受序列长度的限制,也就是可以对 比所遇到序列的更长的序列 进行表示。」
-
self-attention 的特点在于「无视词(token)之间的距离直接计算依赖关系,从而能够学习到序列的内部结构」。引入 Self Attention 后会更容易捕获句子中长距离的相互依赖的特征,因为如果是 RNN 或者 LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
但是 Self Attention 在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。
除此外,Self Attention 对于增加计算的并行性也有直接帮助作用。这是为何 Self Attention 逐渐被广泛使用的主要原因。
-
Why Multi-head Attention?
Multi-head Attention 的原因是将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。多次 attention 综合的结果至少能够起到增强模型的作用,也可以类比 CNN 中同时使用「多个卷积核」的作用,直观上讲,多头的注意力「有助于网络捕捉到更丰富的特征/信息」。
-
训练测试:
1 训练
Transformer 训练过程与 seq2seq 类似,首先 Encoder 端得到输入的 encoding 表示,并将其输入到 Decoder 端做交互式 attention,之后在 Decoder 端接收其相应的输入(见 1 中有详细分析),经过多头 self-attention 模块之后,结合 Encoder 端的输出,再经过 FFN,得到 Decoder 端的输出之后,最后经过一个线性全连接层,就可以通过 softmax 来预测下一个单词(token),然后根据 softmax 多分类的损失函数,将 loss 反向传播即可,所以从整体上来说,Transformer 训练过程就相当于一个有监督的多分类问题。
需要注意的是,「Encoder 端可以并行计算,一次性将输入序列全部 encoding 出来,但 Decoder 端不是一次性把所有单词(token)预测出来的,而是像 seq2seq 一样一个接着一个预测出来的。」
2 测试
而对于测试阶段,其与训练阶段唯一不同的是 Decoder 端最底层的输入。
训练的时候每次的输入为上次的输入加上输入序列向后移一位的 ground truth(例如每向后移一位就是一个新的单词,那么则加上其对应的 embedding)
elmo
来源:《关于elmo,面试官们都怎么问》
-
概述:ELMO采用了典型的两阶段过程,
「第一个阶段是利用语言模型进行预训练」;
「第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。」
-
预训练过程,它的网络结构采用了双层双向LSTM,其中单词(token)特征这一块采用的是单词的embedding(是否是预训练好的论文中没有告知)或者采用字符卷积得到其embedding表示。有两个编码器:左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外的上文Context-before;右端的逆向双层LSTM代表反方向编码器,输入的是从右到左的逆序的句子下文Context-after;每个编码器的深度都是两层LSTM叠加。
-
为什么emlo用的是单向的lstm而不是双向?
先看BiLSTM与两个单向LSTM的区别,两者的区别只有BiLSTM是拼接了两个单向LSTM的输出,所以说没必要使用BiLSTM。
再说也不能使用BiLSTM,因为模型需要分别对前后两个分别做最大概率似然估计,而不是两者的拼接向量。再多说一点,ELMO不是一个双向语言模型,即使它使用了两个单向的LSTM,因为这两者不共享参数,如果共享参数,就相当于【see themselves】
-
目标函数:由于ELMo结合了前后向语言模型,故其目标是同时最大化前后向语言模型的对数似然:
-
.ELMo为什么能够达到区分多义词的效果?
在ELMo第一阶段训练完成之后,将句子输入模型中在线提取各层embedding的时候,每个单词(token)对应两边LSTM网络的对应节点,那两个节点得到的embedding是动态改变的,会受到上下文单词的影响,周围单词的上下文不同应该会强化某种语义,弱化其它语义,这样就达到区分多义词的效果了。
-
ELMo的优点是什么?ELMo为什么有效?
ELMo利用了深度上下文单词表征,该模型的优点:
引入双向语言模型,其实是 2 个单向语言模型(前向和后向)的集成;
通过保存预训练好的 2 层 biLSTM,通过特征集成或 finetune 应用于下游任务;
总结来说,通过上述结构,ELMo能够达到区分多义词的效果,每个单词(token)不再是只有一个上下文无关的embedding表示。
-
那么ELMo为什么有效呢?我认为主要原因有以下几点:
首先,ELMo的假设前提是一个词的词向量不应该是固定的,所以在多义词区分方面ELMo的效果必然比word2vec要好。
另外,ELMo通过语言模型生成的词向量是通过特定上下文的“传递”而来,再根据下游任务,对原本上下文无关的词向量以及上下文相关的词向量表示引入一个权重,这样既在原来的词向量中引入了上下文的信息,又能根据下游任务适时调整各部分的权重(权重是在网络中学习得来的),因此这也是ELMo有效的一个原因。
-
如何使用elmo?
「需要注意的是,这里是将整个句子输入到双向语言模型(这里用的是双向LSTM网络)中,正向和反向LSTM网络共享token embedding的输入,源码中token embedding、正向、反向LSTM的hidden state均为512维度,一个长度为nsentences的句子,经过ELMo预训练网络,最后得到的embedding的维度为:(n_sentences, 3, max_sentence_length, 1024)」
那么下游任务如何利用这些表示呢?下游任务将所有表示都利用起来,并给他们分配权重:
bert
来源:《关于BERT,面试官们都怎么问》
-
概述:BERT 整体是一个自编码语言模型(Autoencoder LM),并且其设计了两个任务来预训练该模型。
-
BERT 模型的主要输入是文本中各个字/词的原始词向量,该向量既可以随机初始化,也可以利用 Word2Vector 等算法进行预训练以作为初始值;BERT 模型将字向量、文本向量和位置向量的加和作为模型输入
输出是文本中各个字/词融合了全文语义信息后的向量表示。
-
第一个任务是采用 MaskLM 的方式来训练语言模型,通俗地说就是在输入一句话的时候,随机地选一些要预测的词,然后用一个特殊的符号[MASK]来代替它们,之后让模型根据所给的标签去学习这些地方该填的词。「完形填空」
好处:预测一个词汇时,模型并不知道输入对应位置的词汇是否为正确的词汇( 随机选择 15% 的词汇用于预测,其中80% 情况下采用一个特殊符号 [MASK] 替换, 10% 情况下采用一个任意词替换,剩余 10% 情况下保持原词汇不变。),这就迫使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力。
缺点,就是每批次数据中只有 15% 的标记被预测,这意味着模型可能需要更多的预训练步骤来收敛。
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 是不一样的。
-
第二个任务在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务,即预测输入 BERT 的两段文本是否为连续的文本,给定一篇文章中的两句话,判断第二句话在文本中是否紧跟在第一句话之后。引入这个任务可以更好地让模型学到连续的文本片段之间的关系。
在实际预训练过程中,文章作者从文本语料库中随机选择 50% 正确语句对和 50% 错误语句对进行训练,与 Masked LM 任务相结合,让模型能够更准确地刻画语句乃至篇章层面的语义信息。
-
BERT 相较于原来的 RNN、LSTM 可以做到并发执行,同时提取词在句子中的关系特征,并且能在多个不同层次提取关系特征,进而更全面反映句子语义。相较于 word2vec,其又能根据句子上下文获取词义,从而避免歧义出现。
BERT 模型通过对 Masked LM 任务和句子连续性预测任务进行联合训练,使模型输出的每个字 / 词的向量表示都能尽可能全面、准确地刻画输入文本(单句或语句对)的整体信息,为后续的微调任务提供更好的模型参数初始值。
同时缺点也是显而易见的,模型参数太多,而且模型太大,少量数据训练时,容易过拟合。
-
BERT 只使用了 Transformer 的 Encoder 模块,原论文中,作者分别用 12 层和 24 层 Transformer Encoder 组装了两套 BERT 模型
-
为什么 BERT 比 ELMo 效果好?ELMo 和 BERT 的区别是什么?
BERT 比 ELMo 效果好主要集中在以下几点原因:
LSTM 抽取特征的能力远弱于 Transformer
拼接方式双向融合的特征融合能力偏弱(没有具体实验验证,只是推测)
其实还有一点,BERT 的训练数据以及模型参数均多于 ELMo,这也是比较重要的一点
区别:
ELMo 模型是通过语言模型任务得到句子中单词的 embedding 表示,以此作为补充的新特征给下游任务使用。因为 ELMO 给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。
而 BERT 模型是“基于 Fine-tuning 的模式”,这种做法和图像领域基于 Fine-tuning 的方式基本一致,下游任务需要将模型改造成 BERT 模型,才可利用 BERT 模型预训练好的参数。
-
BERT 的损失函数由两部分组成,第一部分是来自 Mask-LM 的「单词级别分类任务」,另一部分是「句子级别的分类任务」。
-
具体的预训练工程实现细节方面,BERT 还利用了一系列策略,使得模型更易于训练,比如对于学习率的 warm-up 策略,使用的激活函数不再是普通的 ReLu,而是 GeLu,也使用了 dropout 等常见的训练技巧。
gpt gpt-2
-
GPT就是利用Transformer进行自然语言各种任务的尝试之一,主要有以下三个要点:
Pre-Training的方式
单向Transformer模型
Fine-Tuning与不同输入数据结构的变化
什么是单向Transformer?在Transformer的文章中,提到了Encoder与Decoder使用的Transformer Block是不同的。在Decoder Block中,使用了Masked Self-Attention,即句子中的每个词,都只能对包括自己在内的前面所有词进行Attention,这就是单向Transformer。GPT使用的Transformer结构就是将Encoder中的Self-Attention替换成了Masked Self-Attention,具体结构如下图所示:
为避免Fine-Tuning使得模型陷入过拟合,文中还提到了辅助训练目标的方法,类似于一个多任务模型或者半监督学习。具体方法就是在使用最后一个词的预测结果进行监督学习的同时,前面的词继续上一步的无监督训练,使得最终的损失函数成为:
GPT-2继续沿用了原来在GPT种使用的单向Transformer模型,而这篇文章的目的就是尽可能利用单向Transformer的优势,做一些BERT使用的双向Transformer所做不到的事。那就是通过上文生成下文文本。
GPT-2的想法就是完全舍弃Fine-Tuning过程,转而使用一个容量更大、无监督训练、更加通用的语言模型来完成各种各样的任务。
拓宽并加大数据集
首先就是要让模型博览群书,如果训练样本都不够多,那还怎么进行推理?前面的工作都是针对某一个特定问题的,所以数据集都比较片面。GPT-2收集了一个规模更大、范围更广的数据集。同时呢,要保证这个数据集的质量,保留那些拥有高质量内容的网页。最终组成了一个800万个文本,40G的数据集WebText。
扩大网络容量
书多了脑袋容量也得带一些要不然记不住书里的东西。为了提高网络的容量,使其拥有更强的学习潜力,GPT-2将Transformer堆叠的层数增加到48层,隐层的维度为1600,参数量达到了15亿。
调整网络结构
GPT-2将词汇表提升到50257,最大的上下文大小 (context size) 从GPT的512提升到了1024,batchsize从512提升为1024。此外还对Transformer做出了小调整,标准化层放到没每个sub-block之前,最后一个Self-attention后又增加了一个标准化层;改变了残差层的初始化方法等等。
-
虽然BERT与GPT看上去非常的相似,但是它们的训练目标和模型结构和使用上还是有着些许的不同:
GPT采用的是单向的Transformer,而BERT采用的是双向的Transformer,也就是不用进行Mask操作;
使用的结构的不同,直接导致了它们在Pre-Training阶段训练目标的不同;
-
能介绍一下预训练模型,或者说词向量的发展史吗?
mikolov的论文、glove论文、elmo论文、gpt论文、bert论文等。然后问论文的细节,比如:hierarchical softmax的具体公式,negative sample如何抽样、概率分布怎么算,glove的损失函数知道吗(不知道,唉),。
知道em算法吗?(只知道概念,但公式太复杂不怎么会)最大熵模型介绍一下
知道提取关键词和摘要的方法吗?主题模型怎么做?
CGAN
- 概述:先说GAN,GANs的主要框架如图13.1所示, 包括生成器(Generator) 和判别器(Discriminator) 两个部分。 其中, 生成器用于合成“假”样本, 判别器用于判断输入的样本是真实的还是合成的。
具体来说, 生成器从先验分布中采得随机信号,经过神经网络的变换, 得到模拟样本; 判别器既接收来自生成器的模拟样本, 也接收来自实际数据集的真实样本, 但我们并不告诉判别器样本来源, 需要它自己判断。 生成器和判别器是一对“冤家”, 置身于对抗环境中, 生成器尽可能造出样本迷惑判别器, 而判别器则尽可能识别出来自生成器的样本。 然而, 对抗不是目的, 在对抗中让双方能力各有所长才是目的。 理想情况下, 生成器和判别器最终能达到一种平衡, 双方都臻于完美, 彼此都没有更进一步的空间。
简单的解释该方程,生成器创建一个基于噪声分布 p(z) 的分布,来学习实际数据 x 的分布,生成器 G 用于生成数据。辨别器 D 用于辨别生成器的数据是来自生成器还是真实的数据分布,当辨别器不能分辨数据的来源时,也就是说,辨别器认为该数据 50%可能性来自真实数据采样分布,50% 可能性来自生成器,学习过程就完成了。
- CGAN:
CGAN的主要贡献就是在原始GAN的生成器与判别器中的输入中加入额外信息 y y y。额外信息 y y y可以是任何信息,例如标签。因此CGAN的提出使得GAN可以利用图像与对应的标签进行训练,并在测试阶段 利用给定标签生成特定图像。
- CGAN损失函数:
CGAN与GAN不同之处在于生成器和辨别器中添加了同样的条件,该条件可以是任何标签。CGAN解决了普通的GAN生成模型时方向不确定性,使得生成的输出更加符合我们的预期。
在CGAN的论文中,网络架构使用的MLP(全连接网络)。在CGAN中的生成器,我们给定一个输入噪声p(z)和额外信息y ,之后将两者通过全连接层连接到一起,作为隐藏层输入。同样地,在判别器中输入图像 x 和 额外信息 y也将连接到一起作为隐藏层输入。
- GAN的问题:
(cv中)mode collapsing: 在生成图片中会经常出现一些重复的结果。
(cv中)mode dropping: 某些mode丢失了,也导致缺乏多样性。例如下图中的人物,虽然每张都不太一样,但其实除了肤色变化,人物没有任何变化。
- GAN的评价指标:GAN的评价指标一般都要综合评价图片的质量以及多样性,现有的方法大多都是基于样本的,即对生成样本与真实样本提取特征,然后在特征空间做距离度量。https://blog.csdn.net/qq_35586657/article/details/98478508
IS:
清晰度: 把生成的图片 x 输入 Inception V3 中,得到输出 1000 维的向量 y ,向量的每个维度的值对应图片属于某类的概率。对于一个清晰的图片,它属于某一类的概率应该非常大,而属于其它类的概率应该很小。
多样性: 如果一个模型能生成足够多样的图片,那么它生成的图片在各个类别中的分布应该是平均的,假设生成了 10000 张图片,那么最理想的情况是,1000 类中每类生成了 10 张。转换成术语,就是生成图片在所有类别概率的边缘分布 p(y) 熵很大(均匀分布)。
IS的问题:
对神经网络内部权重十分敏感。不同框架预训练的网络达到同样的分类精度,但由于其内部权重微小的不同,导致了 Inception Score 很大的变化;
通常计算 Inception Score 时,会生成 50000 个图片,然后把它分成 10 份,每份 5000 个,分别代入公式 (2) 计算 10 次 Inception Score,再计算均值和方差,作为最终的衡量指标(均值±方差)。但是 5000 个样本往往不足以得到准确的边缘分布p(y),尤其是像 ImageNet 这种包含 1000 个类的数据集;
如果某一个物体的类别本身就比较模糊,在几种类别会得到相近的分数,或者这个物体类别在ImageNet中不存在,那么p(y|x)的概率密度就不再是一个尖锐的分布;如果生成模型在每类上都生成了 50 个图片,那么生成的图片的类别边缘分布是严格均匀分布的,按照 Inception Score 的假设,这种模型不存在 mode collapse,但是,如果各类中的50个图片,都是一模一样的,仍然是 mode collapse。Inception Score 无法检测这种情况。
不能判别出网络是否过拟合。如果神经网络记住了所有的训练集图片,然后随机输出,那么它会得到一个很高的 Inception Score,但这明显不是我们希望的。
FID:FID距离计算真实样本,生成样本在特征空间之间的距离。首先利用Inception网络来提取特征,然后使用高斯模型对特征空间进行建模,再去求解两个特征之间的距离,较低的FID意味着较高图片的质量和多样性。
相比较IS来说,FID对噪声有更好的鲁棒性。因为FID只是把 Inception V3 作为特征提取器,并不依赖它判断图片的具体类别,因此不必担心 Inception V3 的训练数据和生成模型的训练数据不同。同时,由于直接衡量生成数据和真实数据的分布之间的距离,也不必担心每个类别内部只产生一模一样的图片这种形式的 mode collapse。
局限性
虽然相比IS,FID的方法有了很大改进,但是对于ImageNet这种大规模数据集上的过拟合问题,仍然没有解决。除此之外,FID基于特征提取,也就是依赖于某些特征的出现或者不出现,因此无法描述这些特征的空间关系。例如用GAN去生成人脸,如果嘴巴长在眼睛上面,FID可能也会认为它是一张较好地生成结果。
其他指标:Kernel MMD (Maximum Mean Discrepancy),Wasserstein distance衡量两个分布之间的距离,距离越小,分布越接近,效果越好。1-Nearest Neighbor classifier:整体服从50%的LOO准确率时,GAN的效果最好。特点: 理想的度量指标,且可以检测过拟合,mode collapse等问题。
PCA降维 LDA
- PCA:属于一种线性、 非监督、 全局的降维算法。
- 如何定义主成分? 从这种定义出发, 如何设计目标函数使得降维达到提取主成分的目的? 针对这个目标函数, 如何对PCA问题进行求解?
PCA旨在找到数据中的主成分, 并利用这些主成分表征原始数据, 从而达到降维的目的。 PCA的目标, 即最大化投影方差, 也就是让数据在主轴上投影的方差最大。
x投影后的方差就是协方差矩阵的特征值。 我们要找到最大的方差也就是协方差矩阵最大的特征值, 最佳投影方向就是最大特征值所对应的特征向量。 次佳投影方向位于最佳投影方向的正交空间中, 是第二大特征值对应的特征向量, 以此类推。 至此, 我们得到以下几种PCA的求解方法。
( 1) 对样本数据进行中心化处理。(因为要算协方差。单纯的线性变换只是产生了倍数缩放,无法消除量纲对协方差的影响,而协方差是为了让投影后方差最大。有时候我们在特征工程阶段,使用某些特征提取算子(eg:HOG)提取的图像特征维度很高。PCA则用于高维数据的降维,它可以将原来高维的数据投影到某个低维的空间上并使得其方差尽量大。如果数据其中某一特征(矩阵的某一列)的数值特别大,那么它在整个误差计算的比重上就很大,那么可以想象在投影到低维空间之后,为了使低秩分解逼近原数据,整个投影会去努力逼近最大的那一个特征,而忽略数值比较小的特征。因为在建模前我们并不知道每个特征的重要性,这很可能导致了大量的信息缺失。为了“公平”起见,防止过分捕捉某些数值大的特征,我们会对每个特征先进行标准化处理,使得它们的大小都在相同的范围内,然后再进行PCA。)
( 2) 求样本协方差矩阵。
( 3) 对协方差矩阵进行特征值分解, 将特征值从大到小排列。
( 4) 取特征值前d大对应的特征向量ω1,ω2,…,ωd, 通过以下映射将n维样本映射到d维
- PCA的局限性:
我们可以通过核映射对PCA进行扩展得到核主成分分析( KPCA) , 也可以通过流形映射的降维方法, 比如等距映射、 局部线性嵌入、 拉普拉斯特征映射等, 对一些PCA效果不好的复杂数据集进行非线性降维操作
- 线性判别分析(LDA) 是一种有监督学习算法,用来对数据进行降维。 LDA的中心思想——最大化类间距离和最小化类内距离。每个类数据都是高斯分布、 各个类的协方差相等。
我们将整个数据集的类内方差定义为各个类分别的方差之和, 将目标函数定义为类间距离和类内距离的比值, 于是引出我们需要最大化的目标
- 两个模型的对比:
首先从目标出发, PCA选择的是投影后数据方差最大的方向。 由于它是无监督的, 因此PCA假设方差越大, 信息量越多, 用主成分来表示原始数据可以去除冗余的维度, 达到降维。 而LDA选择的是投影后类内方差小、 类间方差大的方向。 其用到了类别标签信息, 为了找到数据中具有判别性的维度, 使得原始数据在这些方向上投影后, 不同类别尽可能区分开。
对无监督的任务使用PCA进行降维, 对有监督的则应用LDA。PCA和LDA两种降维方法的求解过程来看, 它们确实有着很大的相似性。
协同过滤
- 协同过滤:协同过滤(CF,Collaborative Filtering)的主要思想就是利用与当前用户具有相同兴趣或者历史行为的其他用户群,通过分析这些用户群目前的喜好或者行为信息来预测当前用户可能喜欢的东西或者可能产生的行为。
- 显性反馈:用户明确表示对物品喜好的行为。这要方式是评分和喜欢/不喜欢,这种显式评分的数据是比较准确的,缺点就是很难获取到,因为大多数用户是看不到对自己有益的事情,一般不会去浪费自己时间去提供评分;。隐形反馈:不能明确反应用户喜好的行为。(购买日志、阅读日志、浏览日志)
- 实现:基于用户的最近邻推荐和基于物品的最近邻推荐。原理就是根据用户对物品或者信息的偏好,发现物品本身的相关性或者发现用户之间的相关性,再基于相关性按程度得分进行排序推荐。
- 输入输出:这类算法输入的是一个用户—物品评分矩阵,而输出的数据可分为两类:一类是当前用户对物品喜欢成都的预测数值,一类是前N项的推荐物品列表,当然,这个列表不能包含当前用户已经购买过的物品。
- 基于用户的协同过滤算法(UserCF):
(1)将输入的评分数据集和当前用户ID作为输入,使用皮尔逊相关系数来表示两个用户之间的相关性,找出与当前用户过去行为历史具有相似行为或者偏好的K个其他用户,这些用户也叫对等用户或者叫最近邻;
(2)计算出当前用户和其他用户的相关性后,对当前用户未购买或者未见过的每个物品,利用用户的K个近邻对物品的评分进行预测,形成物品评分排序表;
(3)选择所需数量且物品评分最高的几个物品推荐给当前用户。
皮尔逊系数(Pearson Correlation Coefficient)表示两个用户之间相关性时,取值范围为[-1,+1],其中-1强负相关,+1表示强正相关,0表示不相关。协方差/两个方差之积
当计算出用户的相关性后,就可以选择出最相似的N个近邻用户计算对物品的评分预测值,也就是说N个近邻用户对物品均有评分值,评分预测公式如下:
- 基于物品最近邻推荐思想
是基于物品之间的相似度,而不是基于用户之间的相似度来进行评分值预测。通常采用余弦相似度来计算两个物品之间的相似度,相似度取值范围为[0,1],值越接近1,相似度也就越高。在计算出物品之间相似度后,选择出最为相似的前N个物品,用下面公式来预测用户对物品的评分。
- 协同过滤算法的优势:(1)简单性:算法实现过程简单,并且在计算过程中只有一个近邻数参数进行调整,容易进行修改调整;
(2)稳定性:当构建完相似度矩阵之后,如果有一个新用户或者新物品具有评分的话,只需要计算这个新用户或者新物品与其他用户或者物品之间的相似度就可以完成相似度矩阵的更新操作,不至于影响到其他用户或者物品之间的相似度数值;
(3)合理性:这种预测方法解释性较强,对于预测推荐提供了简洁直观的理由;
(4)高效性:基于近邻方法的推荐效果相对较高,因为可以进行离线数据预处理,提前构建出相似度矩阵,从而在实际运用过程中提供近似于实时的推荐结果,具有良好的实时性能。
- CF的缺点:
1.冷启动问题
在产品刚刚上线、新用户到来的时候,如果没有用户在应用上的行为数据,也无法预测其兴趣爱好。另外,当新商品上架也会遇到冷启动的问题,没有收集到任何一个用户对其浏览,点击或者购买的行为,也无从对商品进行推荐。
2.数据稀疏性问题
当用户仅对数据库中可用的项目中的一小部分进行评分时,就会导致这种问题。数据规模越大,一般而言越稀疏。
3.可扩展性问题
这是与推荐算法相关的另一个问题,因为计算通常随着用户和项目的数量线性增长。当数据集的量有限时,推荐技术是有效可行的,但当数据集的量增加时,生成推荐的量就不太好。在这种情况下,用于解决可扩展性问题和加速推荐生成的方法会基于降维技术,例如奇异值分解(SVD)。
4.同义问题
同义词是指名称不同但非常相似的项目。大多数推荐系统很难区分这些项目之间的不同,如婴儿服装和婴儿布料。协同过滤通常无法在两个术语之间建立匹配,也无法计算二者之间的相似性。自动术语扩展、词库构建、奇异值分解(SVD),尤其是潜在语义索引,能够解决同义问题,但缺点是某些添加的术语可能与预期的含义不同,从而导致推荐性能的快速下降。
其他模型:
- 逻辑回归(分类)
- 谷歌的两个模型 Youtube / Wide&Deep 都是基于 Embedding + MLP 的网络结构。Embedding 的应用使得深度学习算法有了强有力的离散特征处理能力,MLP(多层感知机)使得算法有了强大的非线性拟合能力。两者的配合使用,模型的拟合能力大大超越了使用 0-1 离散特征的 LR 模型。Embedding + MLP 的网络结构也成为了当前深度学习推荐算法的基础结构。
- youtube:第一层是Candidate Generation Model完成候选视频的快速筛选,这一步候选视频集合由百万降低到了百的量级。
第二层是用Ranking Model完成几百个候选视频的精排
- 基于特征组合的网络结构:DeepFM
- 基于行为序列的网络结构:
- 推荐+知识图谱:知识图谱在推荐系统中的应用一般可以带来三方面的收益:第一,多样性,基于知识图谱,可以选择不同关系的物品进行推荐;第二,可解释性,通过推荐物品与历史物品间的关系可进行解释;第三,精确性,知识图谱刻画了物品更加立体的信息,通过在模型中加入这些信息提升推荐的效果。
VGG16
- 结构:https://www.cnblogs.com/lfri/p/10493408.html
- 特点:简单,卷积层均采用相同的卷积核参数33,池化层均采用相同的池化核参数22,堆叠的方式,VGG的输入图像是 224x224x3,通道数翻倍,由64依次增加到128,再到256,直至512保持不变,不再翻倍,高和宽变减半,权重数目却很大
- 权重参数:例如,对于第一层卷积,由于输入图的通道数是3,网络必须学习大小为3x3,通道数为3的的卷积核,这样的卷积核有64个,因此总共有(3x3x3)x64 = 1728个参数
- 计算全连接层的权重参数数目的方法为:前一层节点数×本层的节点数。因此,全连接层的参数分别为:
7x7x512x4096 = 1027,645,444,4096x4096 = 16,781,321,4096x1000 = 4096000
- 输出大小的计算方式:N=(W-F+2P)/S+1//(输入大小-卷积核大小+2*填充值大小)/步长+1
- 其他的网络:https://zhuanlan.zhihu.com/p/47391705
AlexNet:多层不同大小的卷积层+全连接;VGG (16layers):多层(更多)同样大小的卷积层+全连接层;NIN:卷积层+用1X1层替代全连接层,不仅可以达到良好的效果,而且大大降低了参数;GoogLeNet,借鉴了NIN的思想,大量使用1x1的卷积层,同时也有创新,一个inception同时使用多个不同尺寸的卷积层,以一种结构化的方式来捕捉不同尺寸的信息,很大程度地降低了参数量和计算量;
- ResNet:VGG+残差结构,它采用了一种“短路”的结构:假定原来的网络结构需要学习得到函数 H(x),那么不妨让原始信号 x 接到输出部分,并修改需要学习的函数为F(x)=H(x)-x,便可得到同样的效果。
那这样的结构有什么好处呢?(为了解决网络退化问题:在神经网络可以收敛的前提下,随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降,需要注意,网络退化问题不是过拟合导致的,即便在模型训练过程中,同样的训练轮次下,退化的网络也比稍浅层的网络的训练错误更高)
通过这样的方式,原始信号可以跳过一部分网络层,直接在更深的网络层传递。从直觉上来看,深层神经网络之所以难以训练,就是因为原始信号x在网络层中传递时,越来越失真(即梯度不稳定),而这种“短路”结构使得原始信号直接传入神经网络的深层,避免了信号失真,这样一来便极大地加快了神经网络训练时的效率。
- DenseNet:用通道维上连结代替直接与原信号相加的ResNet;MobileNets:同样的卷积层,更少的参数;ShuffleNets:Group convolution+Channel Shuffle:ResNet的压缩版本。
- 这里解释下为何要做Channel Shuffle操作:
ShuffleNet的本质是将卷积运算限制在每个Group内,这样模型的计算量取得了显著的下降。然而导致模型的信息流限制在各个Group内,组与组之间没有信息交换,如图15,这会影响模型的表示能力。因此,需要引入组间信息交换的机制,即Channel Shuffle操作。同时Channel Shuffle是可导的,可以实现end-to-end一次性训练网络。
LSTM RNN 计算复杂度
- RNN:循环神经网络能够很好地处理文本数据变长并且有序的输入序列.将前面的信息编码到状态变量中去,从而具有了一些记忆功能.
RNN的问题:梯度爆炸/梯度消失,使得它很难学习到输入序列中的长距离依赖关系.
- 什么是梯度爆炸/梯度消失?
梯度消散和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。Sigmoid激活函数最容易产生梯度消散,这是由于它的函数特性决定的。
由图中可以知道,如果使用Sigmoid作为激活函数,那么其梯度不可能超过0.25,当层数叠加,经过链式求导后。很容易产生梯度消失。
- 还有那些解决梯度消失/爆炸的方法?
改换激活函数,使用relu、LeakyRelu、ELU等激活函数可以改善梯度消散或爆炸问题。relu导数的正数部分恒等于1,所以不会产生梯度消失和梯度爆炸。
BatchNormalization。对每一层的输入做scale和shift方法,将每层神经元的输入分布强行拉回均值为0、方差为1的标准正态分布,这就使得激活层输入值落入在非线性函数对输入值比较敏感的区域,使得输入的小变化会导致损失函数较大的变化,使得梯度变大,训练速度加快,且避免梯度消失问题。
ResNet残差结构。深度残差网络。通过残差学习,缓解了梯度消失的问题。
LSTM,门控循环单元GRU,通过加入门控机制,很大程度上弥补了梯度消失所带来的损失。
梯度剪切,该方法主要是针对梯度爆炸提出。其思想是设置一个梯度剪切阈值,更新梯度时,如果梯度超过这个阈值,那么限制其在这个范围之内。当梯度的范式大于某个给定值的时候,对梯度进行等比收缩.
- 循环神经网络中能用ReLU吗?
可以。但是需要对矩阵的初值做一定限制,否则容易引发数值问题。
卷积神经网络不会出现这样的问题是,因为网络中的每一层权重矩阵W是不同的,并且在初始化时它们时独立同分布的,因此可以互相抵消,多层之后一般不会严重的数值问题。
对于RNN来说,如果W不是单位矩阵,最终的结果将会趋于0/无穷。(最终包含t个W连乘)。
正确初始化:W的取值在单位阵附近。
- LSTM改进了哪里?为什么这些改进有效?
加入了输入门,遗忘门,输出门(sigmoid),一个内部记忆单元(tanh)。
输入门控制当前计算的新状态以多大程度更新到记忆单元中。
遗忘门控制前一步记忆单元中的信息有多大程度被遗忘。
输出们控制当前的输出有多大程度上取决于当前的记忆单元。
在一个训练好的网络中, 当输入的序列中没有重要信息时, LSTM的遗忘门的值接近于1, 输入门的值接近于0, 此时过去的记忆会被保存, 从而实现了长期记忆功能;
当输入的序列中出现了重要信息, 且该信息意味着之前的记忆不再重要时, 输入门的值接近1, 而遗忘门的值接近于0, 这样旧的记忆被遗忘, 新的重要信息被记忆。
经过这样的设计, 整个网络更容易学习到序列之间的长期依赖。
- LSTM各模块分别使用什么激活函数,可以用别的激活函数吗?
关于激活函数的选取, 在LSTM中, 遗忘门、 输入门和输出门使用Sigmoid函数作为激活函数; 在生成候选记忆时, 使用双曲正切函数Tanh作为激活函数。
值得注意的是, 这两个激活函数都是饱和的, 也就是说在输入达到一定值的情况下, 输出就不会发生明显变化了。 如果是用非饱和的激活函数, 例如ReLU, 那么将难以实现门控的效果。 Sigmoid函数的输出在0~1之间, 符合门控的物理定义。且当输入较大或较小时, 其输出会非常接近1或0, 从而保证该门开或关。
在生成候选记忆时, 使用Tanh函数, 是因为其输出在−1~1之间, 这与大多数场景下特征分布是0中心的吻合。 此外, Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度, 通常使模型收敛更快。
可以使用别的激活函数的,比如最开始的lstm就是用的sigmod的变体函数。
此外, 在一些对计算能力有限制的设备, 诸如可穿戴设备中, 由于Sigmoid函数求指数需要一定的计算量, 此时会使用0/1门(hard gate) 让门控输出为0或1的离散值, 即当输入小于阈值时, 门控输出为0; 当输入大于阈值时, 输出为1。 从而在性能下降不显著的情况下, 减小计算量。
- 说一下为什么lstm能解决rnn中的梯度爆炸/消失?
门控机制。
因为LSTM对记忆的操作是相加的,线性的,使得不同时序的记忆对当前的影响相同,为了让不同时序的记忆对当前影响变得可控,LSTM引入了输入门和输出门,之后又有人对LSTM进行了扩展,引入了遗忘门。
总结一下:LSTM把原本RNN的单元改造成一个叫做CEC的部件,这个部件保证了误差将以常数的形式在网络中流动 ,并在此基础上添加输入门和输出门使得模型变成非线性的,并可以调整不同时序的输出对模型后续动作的影响。
- lstm有哪些问题?
(1)RNN的梯度问题在LSTM及其变种里面得到了一定程度的解决,但还是不够。它可以处理100个量级的序列,而对于1000个量级,或者更长的序列则依然会显得很棘手。
(2)计算费时。每一个LSTM的cell里面都意味着有4个全连接层(MLP),如果LSTM的时间跨度很大,并且网络又很深,这个计算量会很大,很耗时。
- LSTM参数更新的计算复杂度:
比较,简单,隐藏状态和输入维度相同的话,对于每个门,有Uh+Vx+b,那么这里就有U、V、b三个,U和V都是xx,不看b,门里面就有32xx,再来看后面的,然后输入门里,要对输入做线性变换,即tanh(Uh+Vx+b)也有2xx,然后输入门和遗忘门相互作用得到新的C,C经过tanh再过输出门,这里没有别的额外参数了,所以每个LSTM单元就是8xx+4,b主要是三个门加输入的线性变换,如果要得到y,就还有一个tanh(Wh+b),W也是xx,加到一起就是,9x*x+5b,要结合LSTM前向传播计算,可以去看看我的之前那篇介绍RNN的文章,里面有些公式
- 门循环单元(GRU)。它将忘记门和输入门合并成一个新的门,称为更新门。GRU还有一个门称为重置门。重置门决定了如何将新的输入信息与前面的记忆相结合。更新门为定义了前面记忆保存到当前时间步的量。由于该变式的简单有效,后来被广泛应用。
处理文本分类中样本不均衡的问题
https://blog.csdn.net/simona081/article/details/80275506
- 尝试其它评价指标
样本不均衡时,loss对各类别的反映程度也不均衡,因此准确度这个评价指标在类别不均衡的分类任务中并不能work,甚至进行误导。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价
- 对数据集进行重采样以及欠采样
可以使用一些策略该减轻数据的不平衡程度。该策略便是采样(sampling),主要有两种采样方法来降低数据的不平衡性。
对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数)。
对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素)。
- 数据增强
CV中常用到数据增强的方式提升模型的效果,联系到nlp中,可以对文本进行一些句子顺序打乱以句内词序打乱加粗样式的操作进行小类的数据增强,同时这个方法对于大类也可以进行。
其他的方法还有进行同义词替换,我觉得这是一个很棒的方式。
将数据增强结合过采样是比较直观有效的做法。
- Loss解决样本不均衡问题
RBG和Kaiming给出的相当牛逼的方法,这里不做详细介绍。
详情见链接:http://blog.csdn.net/u014380165/article/details/77019084
过拟合怎么办?
过拟合指的是模型在训练数据集上表现良好,在测试数据集上表现很差。
原因:模型将对训练数据过学习,将训练数据的特性当成共性学习进去(对数据的细节刻画的过于仔细)。当过拟合模型应用在测试数据集上时,由于测试数据集并不具备有训练数据独有的特性,所以造成模型泛化能力差,在测试数据集上表现不佳。
应对方法:
- 增大网络规模
- 扩大训练集数据
- 对模型使用正则化,平衡数据集大小和模型复杂度
- Dropout,主要用于深度学习的全连接层,Dropout方法是在一定的概率上(通常设置为0.5,原因是此时随机生成的网络结构最多)隐式的去除网络中的神经元。
- Bagging和Boosting,Bagging和Boosting是机器学习中的集成方法,多个模型的组合可以弱化每个模型中的异常点的影响,保留模型之间的通性,弱化单个模型的特性
L1,L2正则的特点
正则的本质就是用来对原始问题的最小化经验误差函数(损失函数)加上某种约束,这种约束可以看成是人为引入的某种先验知识(正则化参数等价于对参数引入先验分布),从而对原问题中参数的选择起到引导作用,因此缩小了解空间,也减小了噪声对结果的影响和求出错误解的可能,使得模型由多解变为更倾向其中一个解。而L1正则项就是一个1范数,本质相当于添加一个Laplace先验知识。L2正则化项是一个2范数,本质却相当于添加一个Gaussian先验知识。
L1正则化给出的最优解w∗是使解更加靠近某些轴,而其它的轴则为0,所以L1正则化能使得到的参数稀疏化。稀疏的解除了计算量上的好处之外,更重要的是更具有“可解释性”。比如说,一个病如果依赖于 5 个变量的话,将会更易于医生理解、描述和总结规律,但是如果依赖于 5000 个变量的话,基本上就超出人肉可处理的范围了。
L2正则化给出的最优解 w∗是使解更加靠近原点,也就是说L2正则化能降低参数范数的总和,使得模型的解偏向于 norm 较小的 W,通过限制 W 的 norm 的大小实现了对模型空间的限制,从而在一定程度上避免了 overfitting 。不过 L2正则化并不具有产生稀疏解的能力,得到的系数 仍然需要数据中的所有特征才能计算预测结果,从计算量上来说并没有得到改观。
因此正则化是通过约束参数的范数使其不要太大,使其在一定程度上减少过拟合情况。
L1 正则化的特点:
不容易计算, 在零点连续但不可导, 需要分段求导
L1 模型可以将 一些权值缩小到零(稀疏)
执行隐式变量选择。这意味着一些变量值对结果的影响降为 0, 就像删除它们一样
其中一些预测因子对应较大的权值, 而其余的(几乎归零)
由于它可以提供稀疏的解决方案, 因此通常是建模特征数量巨大时的首选模型
它任意选择高度相关特征中的任何一个,并将其余特征对应的系数减少到 0**
L1 范数对于异常值更具提抗力
L2 正则化的特点:
容易计算, 可导, 适合基于梯度的方法
将一些权值缩小到接近 0
相关的预测特征对应的系数值相似
当特征数量巨大时, 计算量会比较大
对于有相关特征存在的情况,它会包含所有这些相关的特征, 但是相关特征的权值分布取决于相关性。
对异常值非常敏感
相对于 L1 正则会更加准确
L1和L2的结合:Huber损失函数,在较小的时候为平方损失,较大的时候为线性损失,处处可导,对异常点鲁棒。
优化方式总结 Adam
- BGD 梯度下降
首先求出m个样本的Loss的和,求这个和对于神经网络参数theta的梯度,并将该梯度除以样本数m,得到平均梯度。然后,利用反向梯度来更新参数theta。α是学习率。通常,学习率会随着k的增大逐渐减小。
梯度下降法主要有两个缺点:
训练速度慢:每走一步都要计算调整下一步的方向,下山的速度变慢。 在应用于大型数据集中,每输入一个样本都要进行一次参数更新,且每次迭代都要遍历所有的样本。 会使得训练过程及其缓慢,需要花费很长时间才能得到收敛。
容易陷入局部最优解:由于是在有限视距内寻找下山的方向。 当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。 所谓的局部最优解就是鞍点。 落入鞍点,梯度为0, 使得模型参数不在继续更新。
SGD 随机梯度下降:单条数据就可对参数进行一次更新。
优点:参数更新速度快。
缺点:由于每次参数更新时采用的数据量小,造成梯度更新时震荡幅度大,但大多数情况是向着梯度减小的方向。
minibatchGD 小样本梯度下降:只有所有数据的一部分进行参数的更新。
优点:相比于SGD,由于参与梯度更新的数据量大,所以梯度更新时相对平滑;相比于BGD,参与梯度更新的数据量小,参数更新速度更快一些。
缺点:没有考虑到数据集的稀疏度和模型的训练时间对参数更新的影响。同时会引入噪声。
- 带动量的SGD::SGD梯度下降时的震荡问题。它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,动量方法的收敛速度更快并且还有一定摆脱局部最优的能力。
优点:通过加入动量,使得梯度方向不变的维度上速度变快,梯度方向改变的维度上更新速度变慢,这样就可以加快收敛并减小震荡。
缺点:梯度方向不变时,参数更新速度会越来越快,但是在梯度方向改变时,梯度更新速度不能及时减小导致适应性差。
- Nesterov动量NAG:上一种的改良,Nesterov动量中,梯度计算在施加当前速度之后。因此,Nesterov动量可以解释为往标准动量方法中添加了一个校正因子。扩展了动量方法, 顺着惯性方向, 计算未来可能位置处的梯度而非当前位置的梯度, 这个“提前量”的设计让算法有了对前方环境预判的能力。
- 自适应学习率的方法:Adagrad :在应用中, 我们希望更新频率低的参数可以拥有较大的更新步幅, 而更新频率高的参数的步幅可以减小。AdaGrad方法采用**“历史梯度平方和”来衡量不同参数的梯度的稀疏性, 取值越小表明越稀疏**。
从表达式可以看出,对出现比较多的类别数据,Adagrad给予越来越小的学习率,而对于比较少的类别数据,会给予较大的学习率。因此Adagrad适用于数据稀疏或者分布不平衡的数据集。
Adagrad的主要优势在于不需要人为的调节学习率,它可以自动调节;
缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0
- Adadelta:Adagrad是累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。
训练的初中期,加速效果不错很快;后期,反复在局部最小值附近抖动。
- Adam方法:Adam记录梯度的一阶矩(first moment) , 即过往梯度与当前梯度的平均, 这体现了惯性保持; 另一方面, Adam还记录梯度的二阶矩(second moment) , 即过往梯度平方与当前梯度平方的平均, 这类似AdaGrad方法, 体现了环境感知能力, 为不同参数产生自适应的学习速率。 一阶矩和二阶矩采用类似于滑动窗口内求平均的思想进行融合, 即当前梯度和近一段时间内梯度的平均值, 时间久远的梯度对当前平均值的贡献呈指数衰减。为不同的参数计算不同的自适应学习率,也适用于大多非凸优化问题,适用于大数据集和高维空间。 具体来说, 一阶矩和二阶矩采用指数衰退平均 技术, 计算公式为
- RMSProp优化算法和AdaGrad算法唯一的不同,就在于累积平方梯度的求法不同。RMSProp算法不是像AdaGrad算法那样暴力直接的累加平方梯度,而是加了一个衰减系数来控制历史信息的获取多少。见下:
加了一个系数 ρ \rho ρ之后,作用相当于加了一个衰减系数来控制历史信息的获取多少。
好处:
1.AdaGrad算法的改进。鉴于神经网络都是非凸条件下的,RMSProp在非凸条件下结果更好,改变梯度累积为指数衰减的移动平均以丢弃遥远的过去历史。
2.经验上,RMSProp被证明有效且实用的深度学习网络优化算法。
设置全局学习率之后,每次通过,全局学习率逐参数的除以经过衰减系数控制的历史梯度平方和的平方根,使得每个参数的学习率不同,起到的效果是在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。
- AdaDelta和RMSProp。 这两个方法非常类似, 是对AdaGrad方法的改进。 AdaGrad方法采用所有历史梯度平方和的平方根做分母, 分母随时间单调递增, 产生的自适应学习速率随时间衰减的速度过于激进。 针对这个问题, AdaDelta和RMSProp采用指数衰退平均的计算方法, 用过往梯度的均值代替它们的求和。适合处理非平稳目标,对于RNN的效果很好。
常见的损失函数
有监督:(二分类)
-
0-1损失,很直观,但是无法直接优化。
-
hinge损失函数 max{0,1-fy} ,它是0-1损失函数相对紧的凸上界, 且当fy≥1时, 该函数不对其做任何惩罚。 Hinge损失在fy=1处不可导, 因此不能用梯度下降法进行优化, 而是用次梯度下降法
-
logistic损失函数: 也是0-1损失函数的凸上界, 且该函数处处光滑, 因此可以用梯度下降法进行优化。 但是, 该损失函数对所有的样本点都有所惩罚, 因此对异常值相对更敏感一些。
-
交叉熵损失函数:0-1损失函数的光滑凸上界,预测值在-1,1之间的时候
有监督-回归问题:
-
平方损失函数:光滑函数, 能够用梯度下降法进行优化,对异常值敏感
-
绝对损失函数:相当于是在做中值回归, 相比做均值回归的平方损失函数, 绝对损失函数对异常点更鲁棒一些。 但是, 绝对损失函数在f=y处无法求导数。
-
Huber损失函数:综合考虑可导性和对异常点的鲁棒性:Huber损失函数在|f−y|较小时为平方损失,在|f−y|较大时为线性损失, 处处可导,且对异常点鲁棒。
VQA其他的模型
https://zhuanlan.zhihu.com/p/57207832
数据集:
VQA一系列新的问题:
图像是更高维度的数据,比纯文本具有更多的噪声。
文本是结构化的,也具备一定的语法规则,而图像则不然。
文本本身即是对真实世界的高度抽象,而图像的抽象程度较低,可以展现更丰富的信息,同时也更难被计算机“理解”。
- Joint embedding是处理多模态问题时的经典思路,在这里指对图像和问题进行联合编码。有的工作把VQA视为序列生成问题,而有的则把VQA简化为一个答案范围可预知的分类问题。在前者的设定下,解码器是一个RNN,输出长度不等的序列;后者的解码器则是一个分类器,从预定义的词汇表中选择答案。
- 加入attention机制能获得明显的提升,从直观上也比较容易理解:在attention机制的作用下,模型在根据图像和问题进行推断时不得不强制判断“该往哪看”,比起原本盲目地全局搜索,模型能够更有效地捕捉关键图像部位。
- 设计一种模块化的模型。最大的特点是根据问题的类型动态组装模块来产生答案。
- Models using external knowledge base
- 全CNN网络: 不仅用CNN提视觉特征,连问题特征,和特征融合都用sequence CNN。(浮夸大于实际意义)
- Vis-LSTM:这个直接用视觉特征作为问题特征的LSTM初始化,这样就不用显性的做特征融合了。
目前VQA中常见的技术
Attention (毋庸置疑): Where to Look:非常暴力直接的,算question和每个visual region的attention,然后酸楚attended 的visual feature。
Module Network (常见于人工生成的数据集,但我觉得这东西潜力很大,所以仍然单独列出)
Graph-Structure Representation/Feature updating,用一个图结构,来更新视觉特征 / 问题特征。(其实目前VQA上的Graph都很扯)
Bottom-up Top-down特征,(非常实用,现在很多方法都默认使用这个特征)
Counting 问题优化
现在所有的真实数据VQA其实都只做了一件事,就是pattern matching,就是监测到特定的visual feature+特定的question question,就直接给出answer,没有任何推理。
文本生成/诗词生成其他模型
将其分为内在评价和外在评价方法。其中内在评价关注文本的正确性、流畅度和易理解性。常见的内在评价方法又可分为两类:1)采用BLEU、NIST和ROUGE等进行自动化评价,评估生成文本和参考文本间相似度来衡量生成质量。2)通过人工评价,从有用性等对文本进行打分。
- 文本生成的评价指标:
BLEU 的全称是 Bilingual evaluation understu,BLEU 的分数取值范围是 0~1,分数越接近1,说明翻译的质量越高。BLEU 主要是基于精确率(Precision)的,下面是 BLEU 的整体公式。
BLEU 计算 n-gram 精确率的方法, 但是仍然存在一些问题,当机器翻译的长度比较短时,BLEU 得分也会比较高,但是这个翻译是会损失很多信息的
- ROUGE 指标的全称是 (Recall-Oriented Understudy for Gisting Evaluation),主要是基于召回率 (recall) 的。ROUGE 是一种常用的机器翻译和文章摘要评价指标,由 Chin-Yew Lin 提出,其在论文中提出了 4 种 ROUGE 方法:
ROUGE-N: 在 N-gram 上计算召回率
ROUGE-L: 考虑了机器译文和参考译文之间的最长公共子序列
ROUGE-W: 改进了ROUGE-L,用加权的方法计算最长公共子序列
- PPL
perplexity(困惑度)用来度量一个概率分布或概率模型预测样本的好坏程度。 它也可以用来比较两个概率分布或概率模型。(译者:应该是比较两者在预测样本上的优劣)低困惑度的概率分布模型或概率模型能更好地预测样本。困惑度越小越好
- SongNet中设计的度量模板准确率(Format)、韵律准确率(Rhyme)和句子完整度(integrity)的指标。
- p-value https://www.cnblogs.com/lijingblog/p/11043513.html
【这个p-value到底是个什么鬼?】p值可通过计算chi-square后查询卡方分布表得出,用于判断H0假设是否成立的依据。
【为什么小于0.05就很重要?】大部分时候,我们假设错误拒绝H0的概率为0.05,所以如果p值小于0.05,说明错误拒绝H0的概率很低,则我们有理由相信H0本身就是错误的,而非检验错误导致。大部分时候p-value用于检验独立变量与输入变量的关系,H0假设通常为假设两者没有关系,所以若p值小于0.05,则可以推翻H0(两者没有关系),推出H1(两者有关系)。
【很重要是什么意思?】当p值小于0.05时,我们就说这个独立变量重要(significant),因为这个独立变量与输出结果有关系。
难点:
没办法evaluate,全靠人来评价,又非常的主观。大家要不就是找人来评价,要不就是只优化某个方面然后evaluate一下说你看我这个score真的变高了,感觉大局观很差。总的来说我觉得可能seq2seq之类的模型还缺乏像人类这样写文章的能力,只能做一些写一句话之类的事情。
我觉得关键的问题在于优化的目标到底是什么,至于GAN VAE什么的都只是方法上的微调,说实话我不太看得出有多大的区别。
大家一般说VAE可以加variance所以增加了生成样本的多样性,不过样本多样性的用意何在?是我们的任务关心的吗?
我们需要的是多样性还是保持**生成文字思路的连贯和有逻辑?**GAN的discriminator究竟又学到了啥?
激活函数
- sigmod 0-1 非线性函数,求导0-0.25:当我们向这个 sigmoid 函数输入一个很大的 x 值(正或负)时,我们得到几乎为 0 的 y 值——也就是说,当我们输入 w×a+b 时,我们可能得到一个接近于 0 的值。问题:梯度消失/梯度爆炸
- 避免梯度爆炸:梯度裁剪/规范:选取一个阈值——如果梯度超过这个值,则使用梯度裁剪或梯度规范;
定义是否使用梯度裁剪或规范。如果使用梯度裁剪,你就指定一个阈值,比如 0.5。如果这个梯度值超过 0.5 或 -0.5,则要么通过梯度规范化将其缩放到阈值范围内,要么就将其裁剪到阈值范围内。(无法避免梯度消失)
- 整流线性单元(ReLU) max(0,x),求导后,导数相反,它要么是 0,要么是 1。死亡 ReLU 问题。如果在计算梯度时有太多值都低于 0 会怎样呢?引入了很大的稀疏性,时间和空间复杂度更低;不涉及成本更高的指数运算;能避免梯度消失问题。
缺点:引入了死亡 ReLU 问题,即网络的大部分分量都永远不会更新。但这有时候也是一个优势;ReLU 不能避免梯度爆炸问题。
- 指数线性单元(ELU)
优点:
能避免死亡 ReLU 问题;能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化;在计算梯度时能得到激活,而不是让它们等于 0。
缺点:
由于包含指数运算,所以计算时间更长;无法避免梯度爆炸问题;神经网络不学习 α 值。
- 渗漏型整流线性单元激活函数(Leaky ReLU)
类似 ELU,Leaky ReLU 也能避免死亡 ReLU 问题,因为其在计算导数时允许较小的梯度;
由于不包含指数运算,所以计算速度比 ELU 快。
缺点:
无法避免梯度爆炸问题;
神经网络不学习 α 值;
在微分时,两部分都是线性的;而 ELU 的一部分是线性的,一部分是非线性的。
- 扩展型指数线性单元激活函数(SELU)
SELU 激活能够对神经网络进行自归一化(self-normalizing)内部归一化的速度比外部归一化快,这意味着网络能更快收敛;
- GELU高斯误差线性单元激活函数(Transformer,BERT、RoBERTa、ALBERT 等目前业内顶尖的 NLP 模型都使用了这种激活函数。)
双曲正切函数 tanh)与近似数值的组合
似乎是 NLP 领域的当前最佳;尤其在 Transformer 模型中表现最好;
能避免梯度消失问题。
KMP
int KMP(char * t, char * p)
{
int i = 0;
int j = 0;
while (i < strlen(t) && j < strlen(p))
{
if (j == -1 || t[i] == p[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j == strlen(p))
return i - j;
else
return -1;
}
void getNext(char * p, int * next)
{
next[0] = -1;
int i = 0, j = -1;
while (i < strlen(p))
{
if (j == -1 || p[i] == p[j])
{
++i;
++j;
next[i] = j;
}
else
j = next[j];
}
}
GAN的推导
居然面试官问这个 佩服呜呜呜……这么菜的我怎么可能知道呢!
https://blog.csdn.net/stalbo/article/details/79283399
Dropout为啥有效果
面试官怼了了我。。。。好吧 我再复习复习
取平均的作用: 先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。(例如 3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果)。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络(随机删掉一半隐藏神经元导致网络结构已经不同),整个dropout过程就相当于 对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。(这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况)。 迫使网络去学习更加鲁棒的特征 (这些特征在其它的神经元的随机子集中也存在)。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式(鲁棒性)。(这个角度看 dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高)
NLP任务
根据判断主题的级别, 将所有的NLP任务分为两种类型:
token-level task: token级别的任务. 如完形填空(Cloze), 预测句子中某个位置的单词; 或者实体识别; 或是词性标注; SQuAD等.
sequence-level task: 序列级别的任务, 也可以理解为句子级别的任务. 如情感分类等各种句子分类问题; 推断两个句子的是否是同义等.
token-level task
Cloze task
即BERT模型预训练的两个任务之一, 等价于完形填空任务, 即给出句子中其他的上下午token, 推测出当前位置应当是什么token.
解决这个问题就可以直接参考BERT在预训练时使用到的模型: masked language model. 即在与训练时, 将句子中的部分token用[masked]这个特殊的token进行替换, 就是将部分单词遮掩住, 然后目标就是预测[masked]对应位置的单词.
这种训练的好处是不需要人工标注的数据. 只需要通过合适的方法, 对现有语料中的句子进行随机的遮掩即可得到可以用来训练的语料. 训练好的模型, 就可以直接使用了.
SQuAD(Standford Question Answering Dataset) task
这是一个生成式的任务. 样本为语句对. 给出一个问题, 和一段来自于Wikipedia的文本, 其中这段文本之中, 包含这个问题的答案, 返回一短语句作为答案.
因为给出答案, 这是一个生成式的问题, 这个问题的特殊性在于最终的答案包含在语句对的文本内容之中, 是有范围的, 而且是连续分布在内容之中的.
因此, 我们找出答案在文本语句的开始和结尾处, 就能找到最后的答案. 通过对文本语句序列中每个token对应的所有hidden vector做softmax判断是开始的概率和是结束的概率, 最大化这个概率就能进行训练, 并得到输出的结果.
Named Entity Recognition
本质是对句子中的每个token打标签, 判断每个token的类别.
常用的数据集有:
NER(Named Entity Recognition) dataset: 对应于Person, Organization, Location, Miscellaneous, or Other (non-named entity).
sequence-level task
NLI(Natural Language Inference) task
自然语言推断任务, 即给出一对(a pair of)句子, 判断两个句子是entailment(相近), contradiction(矛盾)还是neutral(中立)的. 由于也是分类问题, 也被称为sentence pair classification tasks.
在智能问答, 智能客服, 多轮对话中有应用.
常用的数据集有:
MNLI(Multi-Genre Natural Language Inference): 是GLUE Datasets(General Language Understanding Evaluation)中的一个数据集. 是一个大规模的来源众多的数据集, 目的就是推断两个句子是意思相近, 矛盾, 还是无关的.
WNLI(Winograd NLI)
Sentence Pair Classification tasks
两个句子相关性的分类问题, NLI task是其中的特殊情况. 经典的此类问题和对应的数据集有:
QQP(Quora Question Pairs): 这是一个二分类数据集. 目的是判断两个来自于Quora的问题句子在语义上是否是等价的.
QNLI(Question Natural Language Inference): 也是一个二分类问题, 两个句子是一个(question, answer)对. 正样本为answer是对应question的答案, 负样本则相反.
STS-B(Semantic Textual Similarity Benchmark): 这是一个类似回归的问题. 给出一对句子, 使用1~5的评分评价两者在语义上的相似程度.
MRPC(Microsoft Research Paraphrase Corpus): 句子对来源于对同一条新闻的评论. 判断这一对句子在语义上是否相同.
RTE(Recognizing Textual Entailment): 是一个二分类问题, 类似于MNLI, 但是数据量少很多.
Single Sentence Classification tasks
SST-2(Stanford Sentiment Treebank): 单句的二分类问题, 句子的来源于人们对一部电影的评价, 判断这个句子的情感.
CoLA(Corpus of Linguistic Acceptability): 单句的二分类问题, 判断一个英文句子在语法上是不是可接受的.
SWAG(Situations With Adversarial Generations)
给出一个陈述句子和4个备选句子, 判断前者与后者中的哪一个最有逻辑的连续性, 相当于阅读理解问题.
transformer-XL
- motivation: 虽然transformer是有能力学习到文本的长时依赖的,但是transformer的复杂度是O(n^2),随着文本的加长,transformer的速度会下降得很快,所以大部分预训练语言模型的输入长度是有限制的(512)。
transformer-XL,不仅可以捕捉文本更长时的以来,同时可以解决文本被分成定长后产生的上下文碎片问题。
- 片段重用的循环机制:当处理新的fragment的时候,之前计算的hidden_state已经被修补存储起来,会作为context信息来进行重用。t时刻的n-1层的hidden_state和t+1时刻的n-1层的hidden_state拼接形成新的隐层向量。然后经过计算得到当前的q,k,v向量再通过transformer层来得到t+1时刻第n层的hidden_state。
最关键的区别:t+1时刻的k,v向量时包含t时刻的hidden_state信息的。两个片段之前的上下文信息可以进行有效传递。
相对位置编码:attention中,当每两个位置进行attend的时候,根据他们的相对位置关系,加入对应的位置编码。这样的话,再重用前一段文本的时候,可以通过相对位置进行区分,保持了文本的距离和相对位置信息。
- 片段重用的循环机制与循环神经网络的不同:
片段重用的循环机制不是建立在同一层上的,而是会在层间以三角形的形状向上传递。如果层数为n,片段长为l,最终最大的语义依赖距离大概为O(n*l)。
在验证时也能大大加快速度,因为在进行新的位置解码时,可以重用之前在循环机制中计算过的hidden_state。
XLNet
- motivation:bert在预训练的时候加入了mask的token,导致了pretrain和finetune在训练数据上的不一致,降低了模型效果。
- xlnet对所有可能的分解顺序排列,进行最大对数似然的优化。通过这样的操作,每个位置都能看到的context都可以包含左边和右边的tokens,每个位置能够学到所有位置的上下文信息,实习双向建模。它仅仅是改变了因式的顺序,不是序列的顺序。它保持了原来的序列顺序和位置编码,在transformer中使用了合适的attention mask达成了因式的顺序。
xlnet也不依赖于数据重建,不会像bert有pretrain和finetune之间的差异,自训练目标采用乘法原则,获得所预测的token的联合概率,避免bert中的被屏蔽词独立假设。
xlnet在预训练中融入了transformer-xl的片段循环机制及相对位置编码,提升了任务效果,特别是对长序列。
AR 自回归语言模型 AE 自编码语言模型
- AR:elmo,gpt
他们的语言模型任务时已知一段文本序列,去建模后向或前向文本的概率分布。比如,已知前t个文本序列,来获得t位置文本的条件概率分布。它是由回归分析发展而来,这里预测的是文本自己,所以被称为自回归。
AR仅能建模单项的文本的概率分布,无法有效地深层双向的context。
- AE:
它不是直接地去估计下一段文本的条件密度,而是从被掩盖或残缺的文本中来重新构建原始文本。如bert使用mask,而不是条件概率密度作为目标。
但是有pretrain-finetune discrepancy的问题:pretrain和finetune在训练数据上的不一致,降低了模型效果。还有是mask的策略导致它假设每个被预测/屏蔽的词与未被预测/屏蔽的词之间是相互独立的,但实际情况下很多并不符合的,mask的词之间也会有关系。
ERNIE
- ERNIE1.0 是通过加强bert的mask策略,引入了entity级别的masking和phrase级别的masking。
- 三个阶段的预训练:让向量包含更丰富的语义信息。
基本的masking
phrase的masking:一组词/字符
entity的masking:人名/地名/组织/产品等
- ERNIE2.0 :连续增量的训练,不断引入新的预训练任务,帮助模型持续地对知识进行增量学习。
- 预训练分为两个阶段:
利用先验知识和大量数据,构建无监督预训练模型
通过多任务训练增量地更新ERNIE模型:先用一个简单的任务来预训练模型,然后一个一个添加新任务(串行),每添加一个,都会同时训练新任务和原来任务(并行),确保从之前学到的知识不被遗忘,可以达到知识积累的效果。
其中transformer层和bert基本一致,只有在embedding中加入了task embedding,以对不同的任务提供特定特征。