准备NLP面试问题
文章目录
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
- 首先基于语料库构建词的共现矩阵,然后基于共现矩阵和GloVe模型学习词向量。
- glove代价函数
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(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。
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及之后所有词的信息, 防止了前后文信息的丢失。 - attention说白了就是权重计算和加权求和。图上的循环神经网络中的每一步都会输出一个向量,在预测目标语言到某一步时,用当前步的向量去和源语言中的每一步的向量去做内积,然后经过softmax得到归一化后的权重,再用权重去把源语言上的每一步的向量去做加权平均。然后做预测的时候也作为输入进入全连接层。
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
- 你说现在transformer逐渐替代了lstm,比较一下现有的attention模型?
- 能介绍一下预训练模型,或者说词向量的发展史吗?
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的生成器与判别器中的输入中加入额外信息。额外信息可以是任何信息,例如标签。因此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),尤其是潜在语义索引,能够解决同义问题,但缺点是某些添加的术语可能与预期的含义不同,从而导致推荐性能的快速下降。
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的时间跨度很大,并且网络又很深,这个计算量会很大,很耗时。
处理文本分类中样本不均衡的问题
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先验知识。
L2正则化给出的最优解 w∗是使解更加靠近原点,也就是说L2正则化能降低参数范数的总和,使得模型的解偏向于 norm 较小的 W,通过限制 W 的 norm 的大小实现了对模型空间的限制,从而在一定程度上避免了 overfitting 。不过 L2正则化并不具有产生稀疏解的能力,得到的系数 仍然需要数据中的所有特征才能计算预测结果,从计算量上来说并没有得到改观。
L1正则化给出的最优解w∗是使解更加靠近某些轴,而其它的轴则为0,所以L1正则化能使得到的参数稀疏化。稀疏的解除了计算量上的好处之外,更重要的是更具有“可解释性”。比如说,一个病如果依赖于 5 个变量的话,将会更易于医生理解、描述和总结规律,但是如果依赖于 5000 个变量的话,基本上就超出人肉可处理的范围了。
因此正则化是通过约束参数的范数使其不要太大,使其在一定程度上减少过拟合情况。
L1 正则化的特点:
不容易计算, 在零点连续但不可导, 需要分段求导
L1 模型可以将 一些权值缩小到零(稀疏)
执行隐式变量选择。这意味着一些变量值对结果的影响降为 0, 就像删除它们一样
其中一些预测因子对应较大的权值, 而其余的(几乎归零)
由于它可以提供稀疏的解决方案, 因此通常是建模特征数量巨大时的首选模型
它任意选择高度相关特征中的任何一个,并将其余特征对应的系数减少到 0**
L1 范数对于异常值更具提抗力
L2 正则化的特点:
容易计算, 可导, 适合基于梯度的方法
将一些权值缩小到接近 0
相关的预测特征对应的系数值相似
当特征数量巨大时, 计算量会比较大
对于有相关特征存在的情况,它会包含所有这些相关的特征, 但是相关特征的权值分布取决于相关性。
对异常值非常敏感
相对于 L1 正则会更加准确
优化方式总结 Adam
- GD 梯度下降
- SGD 随机梯度下降
- minibatchGD 小样本梯度下降
- 带动量的SGD:它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,动量方法的收敛速度更快并且还有一定摆脱局部最优的能力。
- Nesterov动量:上一种的改良,Nesterov动量中,梯度计算在施加当前速度之后。因此,Nesterov动量可以解释为往标准动量方法中添加了一个校正因子。扩展了动量方法, 顺着惯性方向, 计算未来可能位置处的梯度而非当前位置的梯度, 这个“提前量”的设计让算法有了对前方环境预判的能力。
- Adagrad :在应用中, 我们希望更新频率低的参数可以拥有较大的更新步幅, 而更新频率高的参数的步幅可以减小。AdaGrad方法采用“历史梯度平方和”来衡量不同参数的梯度的稀疏性, 取值越小表明越稀疏。
- Adam方法:Adam记录梯度的一阶矩(first moment) , 即过往梯度与当前梯度的平均, 这体现了惯性保持; 另一方面, Adam还记录梯度的二阶矩(second moment) , 即过往梯度平方与当前梯度平方的平均, 这类似AdaGrad方法, 体现了环境感知能力, 为不同参数产生自适应的学习速率。 一阶矩和二阶矩采用类似于滑动窗口内求平均的思想进行融合, 即当前梯度和近一段时间内梯度的平均值, 时间久远的梯度对当前平均值的贡献呈指数衰减。 具体来说, 一阶矩和二阶矩采用指数衰退平均 技术, 计算公式为
- AdaDelta和RMSProp。 这两个方法非常类似, 是对AdaGrad方法的改进。 AdaGrad方法采用所有历史梯度平方和的平方根做分母, 分母随时间单调递增, 产生的自适应学习速率随时间衰减的速度过于激进。 针对这个问题, AdaDelta和RMSProp采用指数衰退平均的计算方法, 用过往梯度的均值代替它们的求和。