菜鸟学NLP(八)

自然语言常识

自然语言种的数据平滑算法

Laplace smoothing(Add-one)

于是对于n-gram的模型而言,假设V是所有可能的不同的N-gram的类型个数,那么根据贝叶斯公式有:

Add-k smoothing

由Add-one衍生出来的另一种算法就是Add-k,既然我们认为加1有点过了,那么我们可以选择一个小于1的正数k,概率计算公式就可以变成如下表达式:

它的效果通常会比Add-one好,但是依旧没有办法解决问题,至少在实践中,k必须认为的给定,而这个值到底多少该取多少都没有办法确定。

Backoff回退法

回退模型,思路实际上是:如果你自己有钱,那么就自己出钱,如果你自己没有钱,那么就你爸爸出,如果你爸爸没有钱,就你爷爷出,举一个例子,当使用Trigram的时候,如果Count(trigram)满足条件就使用,否则使用Bigram,再不然就使用Unigram.
它的表达式为:

其中d,a和k分别为参数。k一般选择为0,但是也可以选其它的值。

Interpolation插值法

插值法和回退法的思想非常相似,设想对于一个trigram的模型,我们要统计语料库中“I like chinese food”出现的次数,结果发现它没有出现,则计数为0,在回退策略中们将会试着用低阶的gram来进行替代,也就是用“like chinese food”出现的次数来替代。在使用插值的时候,我们把不同阶层的n-gram的模型线性叠加组合起来之后再使用,简单的如trigram的模型,按照如下的方式进行叠加:

NLP面试题

  1. 有哪些文本表示模型?
    所谓的文本表示模型就是能提取文本特征来表征文本
  • 词袋模型
  • TF-IDF模型
  • N-gram
  • 主题模型
  1. Word2Vec是如何工作的?它和LDA有什么区别和联系?
    CBOW和skip-gram都可以表示为有输入层、映射层、输出层组成的浅层神经网络
  2. 输入层种每个单词都由独热编码表示,所有词均表示一个N维向量,N为词汇表种单词的总数.
  3. 在映射层种,K个隐含单元的值可以由N维输入向量以及连接输入和隐含单元的N×K维权重矩阵计算得到
  4. 输出层向量的值可以由隐含层向量(K维),以及连接隐含层和输出层之间的k×N维权重矩阵计算得到.输出层也是一个N维向量,每一维与词汇表种的一个单词对应.最后对输出层向量应用Softmax函数.

接下来需要训练神经网络权重,使得所有单词的整体生成概率最大化.共有两大参数:从输入层到隐含层的一个维度为N×K的权重矩阵,从隐含层到输出层的一个维度为K×N的权重矩阵.学习权重可以使用BP算法实现.

训练得到维度为N×k和k×N的两个权重矩阵之后,可以选择其中一个作为N个词的K维向量表示.

word2vec与LDA的区别:
LDA是按照文档中单词的共现关系来对单词按照主题聚类,也可以理解为对”文档-单词”矩阵进行分解,得到”文档-主题”和”主题-单词”的两个概率分布.而word2vec实际上是对”上下文-单词”矩阵进行学习,其中上下文由周围的几个单词组成,由此学习到的词向量更多融入了上下文特征.

主题模型和词嵌入两类方法最大的不同在于模型本身。
  主题模型是一种基于概率图模型的生成式模型。其似然函数可以写为若干条件概率连乘的形式,其中包含需要推测的隐含变量(即主题)
  词嵌入模型一般表示为神经网络的形式,似然函数定义在网络的输出之上。需要学习网络的权重来得到单词的稠密向量表示。

  1. 处理文本数据时,RNN比CNN有什么特点?
    RNN更能体现时序性,以及RNN能够很好地捕捉长距离地依赖关系.而CNN只能捕捉局部特征.此外,RNN能够很好处理文本数据变长.
  2. RNN种可以采用ReLU作为激活函数吗?
    当然可以!但是需要对矩阵的初值做一定限制,否则容易引发数值问题.
    首先要搞清楚为什么CNN不会出现问题?因为CNN种每一层的权重矩阵是不同的,并且在初始化的时候它们独立同分布的,可以相互抵消,多层之后不会出现严重的数值问题.
    而在RNN中,两个不同的时刻乘的是相同的权重矩阵W.

    根据前向传播公式,向前传播一层,得到:

    如果采用ReLU,则有f(x)=x,代入:

    继续将其展开,net的表达式最终包含t个W连乘。如果W不是单位矩阵(对角线上为1,其余元素为0的矩阵),最终的结果将会趋于0或无穷,引发严重的数值问题。
    综上所述,采用ReLU作为RNN中隐含层的激活函数时,只有当W的取值在单位矩阵附近时才能取得较好结果。因此需要将W初始化为单位矩阵。实践证明,初始化W为单位矩阵并使用ReLU激活函数在一些应用中取得了与LSTM相似的结果,并且学习速度更快。

  3. LSTM中各模块分别使用什么激活函数,可以使用别的激活函数么
    LSTM中的遗忘门、输入门、输出门使用的是Sigmoid的激活函数.在生成候选记忆的时候,使用的是Tanh函数
    值得注意的是,这两个函数都是饱和的,也就是在输入达到一定值的情况下,输出不会发生明显变化.如果是非饱和的激活函数,比如ReLU,那么就难以实现门的效果.

用Tanh函数,因为其输出在-1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh在输入为0的附近比Sigmoid有更大梯度,通常使模型收敛更快。

激活函数选取不是一成不变的,例如在原始LSTM中,使用的是Sigmoid函数的变种,h(x)=2sigmoid(x)-1,g(x)=4sigmoid-2,这两个函数的范围分别是[-1,1]和[-2,2],后来发现效果不如sigmoid.

  1. 什么是Seq2Seq模型?Seq2Seq有哪些优点?
    Seq2Seq的核心思想在于通过深度神经网络将一个输入的序列映射为一个作为输出的序列。
      这一个过程由编码输入和解码输出两个环节组成。在经典的实现中,编码器和解码器各由一个循环神经网络组成,既可以选择传统RNN,也可以选择LSTM、GRU等。在Seq2Seq中,两个模型是共同训练的。

  2. Seq2Seq模型在解码时,有哪些常用的方法?
    (1)最基础的方法(greedy Search)
    就是对Decoder的输出向量,选取其最大值的位置的单词作为输出单词.
    (2)集束搜索(Beam Search)
    上面的贪心搜索只选择了概率最大的一个,而集束搜索则选择了概率最大的前k个。这个k值也叫做集束宽度(Beam Width)。
    还是以上面的例子作为说明,k值等于2,则集束搜索的过程如下图:
    pic1
    得到第一个输出的概率分布[0.1,0.1,0.3,0.4,0.1][0.1,0.1,0.3,0.4,0.1],选择概率最大的前两个,0.3和0.4,即Je和moi。

然后Je和moi分别作为Decoder的输入,得到两个概率分布,然后再选择概率和最大的前两个序列,0.3+0.8和0.4+0.6,即Je suis和moi suis。

以此类推,最终可以得到两个序列,即Je suis étudiant和moi suis étudiant,很明显前者的概率和最大,为2.2,所以这个序列是最终得到的结果。

集束搜索本质上也是贪心的思想,只不过它考虑了更多的候选搜索空间,因此可以得到更多的翻译结果。

  1. Seq2Seq模型加入注意力机制是为了解决什么问题?为什么选用了双向循环神经网络?

实际使用中,随着输入序列长度的增加,模型性能显著下降。因为编码时输入序列的全部信息被压缩到一个向量表示中去。序列越长,句子越前面的词的信息丢失就越严重。以100词的句子为例,编码时将整个句子的信息压缩到一个向量中去,而在解码时(比如翻译),目标语言第一个单词大概率与源语言第一个单词对应,这就意味着第一步的解码需要考虑到100步之前的信息。

一个小技巧是可以将源语言句子逆向输入,或者重复输入两遍,得到一定的提升,也可以使用LSTM缓解这个问题。但对于过长序列仍难以有很好表现。此外Seq2Seq的输出序列通常会损失部分输入序列信息,因为解码时丢失了当前词与对应源语言词的上下文信息和位置信息。

一个小技巧是可以将源语言句子逆向输入,或者重复输入两遍,得到一定的提升,也可以使用LSTM缓解这个问题。但对于过长序列仍难以有很好表现。此外Seq2Seq的输出序列通常会损失部分输入序列信息,因为解码时丢失了当前词与对应源语言词的上下文信息和位置信息。

  1. 深度学习的优化算法
    1) Batch Gradient Descent(BGD)
    BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:
    缺点:
    由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型
    2)Stochastic Gradient Descent(SGD)
    和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。

缺点:
SGD的噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。虽然包含一定的随机性,但是从期望上来看,它是等于正确的导数的。
SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。
3)Mini-Batch Gradient Descent (MBGD)
MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的批次。
缺点:
(1)不过 Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。
(2)所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小
4)Momentum
SGD 在 ravines 的情况下容易被困住, ravines 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:
Momentum 通过加入$\lambda v_{t-1}$,可以加速SGD,并且抑制振荡

加入这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小振荡.
5)Nesterov Momentum

6)Adagrad
主要是为了自适应学习率的.
对于出现频率高的参数采用较小的α更新,对于出现频率较低参数采用较大的α更新;Adagrad非常适合处理稀疏数据.

其中$G_t∈R^{d×d}$为对角矩阵,每个对角线位置i,i为对应参数$\theta_i$从第1轮到第t轮梯度的平方和.
7)RMSprop
RMSprop是对Adagrad做出改变.Adagrad会累加之前的所有的梯度平方,而RMSprop仅仅是计算对应的平均值.因此可缓解Adagrad算法学习率下降较快的问题.

8)Adam(Adaptive Moment Estimation)
这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum

  1. L1和L2正则的区别,如何选择L1和L2正则?
    他们都是可以防止过拟合,降低模型复杂度
    L1 会产生稀疏的特征,L2 会产生更多地特征但是都会接近于0。L1在特征选择时候非常有用,而L2就只是一种规则化而已。
    L1对应拉普拉斯分布,L2对应高斯分布。
    发现拉普拉斯分布跟正太分布很相似,但是拉普拉斯分布比正太分布有尖的峰和轻微的厚尾。

L1不可导可以使用Proximal Algorithms或者ADMM来解决。
L1范数(L1 norm)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。
比如 向量A=[1,-1,3], 那么A的L1范数为 |1|+|-1|+|3|.
简单总结一下就是:
L1范数: 为x向量各个元素绝对值之和。
L2范数: 为x向量各个元素平方和的1/2次方,L2范数又称Euclidean范数或Frobenius范数

Lp范数: 为x向量各个元素绝对值p次方和的1/p次方.
在支持向量机学习过程中,L1范数实际是一种对于成本函数求解最优的过程,因此,L1范数正则化通过向成本函数中添加L1范数,使得学习得到的结果满足稀疏化,从而方便人类提取特征。
L1范数可以使权值稀疏,方便特征提取。
L2范数可以防止过拟合,提升模型的泛化能力。

  1. 朴素贝叶斯算法解决文本分类问题
    1) 首先得到label的先验分布,通过对label语料库中出现的概率进行统计,作为label的先验概率分布.
    2)得到条件概率:P(X=x|Y=label_i)=P(X^{(1)}=x^{(1)},..,X^{(n)}=x^{(n)}|Y=label_i)=\prod_{i=1}^nP(X^{(j)}=x^{(j)}|Y=label_i)
    特征之间相互独立(朴素)
    3)预测步骤:求P(Y=label_i|X=x),这是后验概率.需要得到实例分得的最大类.

  2. Memory network
    Memory Network出现之前,大多数机器学习的模型都缺乏可以读取和写入外部知识的组件,例如,给定一系列事实或故事,然后要求回答关于该主题的问题。原则上这可以通过如RNN等模型进行语言建模来实现,因为这些模型可以被训练在阅读了一串文字之后用来预测下一个输出。然而,它们的记忆(隐藏状态和权重编码)通常太小,并且不能精确地记住过去的事实(知识被压缩成密集的向量)。
    一个Memory Network由一个记忆数组m(一个向量的数组或者一个字符串数组,index by i)和四个组件(输入I,泛化G,输出O,回答R)组成。

  • I(input feature map):用于将输入转化为网络里内在的向量.(可以利用标准化预处理,例如,文本输入的解析,共参考和实体解析.还可以将输入编码为内部特征表示,例如,从文本转化为稀疏或密集特征向量)
  • G(generalization):更新记忆.在作者的具体实现里,只是简单地插入记忆数组里。作者考虑了几种新的情况,虽然没有实现,包括了记忆地忘记,记忆地重新组织.(最简单的G形式是将I(x)存储在存储器中的”slot”中)
  • O(output feature map):从记忆里结合输入,把合适的记忆抽取出来,返回一个向量。每次获得一个向量,代表了一次推理过程.
  • R(response):将该向量转化回所需的格式,比如文字或者answer.

记忆网络在nlp的使用:
场景:给一个段落和一个问题,给出回答

  • I:输入的是一句话,简单地将I转换为一个频率的向量空间模型
  • m:记忆卡槽list
  • G:简单地把读到的对话组里的每一句话的向量空间模型,插到记忆的list里,这里默认记忆插槽比对话组句子还多.
  • O:就是输入一个问题x,将最合适的k个支持记忆,也就是top-k。做法就是把记忆数组遍历,挑出最大的值.O返回一个长度为k的数组
  • R:利用O得到的输出.返回一个词汇W

  • 打分函数:在O和R中打分函数:
    s(x,y)=\phi_x(x)^TU^T\phi_y(y)

  • 记忆网络是一个组件形式的模型,每个模型相互对立又相互影响。每个组件没有固定的模型,可以是传统的模型,也可以是神经网络。

  • 论文的缺陷没有思想端到端的训练,端到端的训练将在下面介绍。
  1. End-To-End Memory Networks
-------------本文结束感谢您的阅读-------------