NLP实习笔试面试题汇总一

一、NLP领域里的8种文本表示方式及优缺点

1、概述

文本表示可以分为:

  • 离散式表示(Discrete Representation);
  • 分布式表示(Distributed Representation);

2、离散式表示(Discrete Representation

2.1 One-Hat(独热编码)

将词或字表示成一个向量,该向量的维度是词典(或字典)的长度,词典是通过语料库生成的,该向量中,当前词的位置为1,其余位置为0。

编码步骤:

  • 根据语料库创建词典,并创建词和索引的映射
  • 将句子转换为用索引表示
  • 创建One-Hot编码器
  • 使用One-Hot编码器对句子进行编码

One-Hot编码特点:

  • 词向量长度是字典长度
  • 在向量中,该单词的索引位置的值为1,其余的值都是0
  • 使用One-Hot进行编码的文本,得到的矩阵式稀疏矩阵(sparse matrix)

One-Hot编码缺点:

  • 不同词的向量表示互相正交,无法衡量不同词的关系
  • 该编码只能反映某个词是否在句中出现,无法衡量不同词的重要程度
  • 使用One-Hot对文本进行编码后得到的是高维稀疏矩阵,会浪费计算和存储资源

2.2 词袋模型(Bag of Word,BOW)

在词袋模型中不考虑语序和词法的信息,每个单词都是相互独立的,将词语放入一个“袋子”里,统计每个单词出现的频率

词袋模型编码特点:

  • 词袋模型是对文本,而不是字或词进行编码
  • 编码后的向量长度是词典的长度
  • 该编码忽略词出现的次序
  • 在向量中,该单词的索引位置的值为单词在文本中出现的次数;如果索引位置的单词没有在文本中出现,则该值为0

词袋模型缺点:

  • 该编码忽略了词的位置信息,位置信息在文本中是一个很重要的信息,词的位置不一样语义会有很大的差别
  • 该编码虽然统计了词在文本中出现的次数,但是仅仅通过词出现的次数这个属性无法区分常用词和关键词在文本中的重要程度,因为有些关键词可能出现的次数比较少

2.3 TF-IDF(词频-逆文档频率)

为了解决词袋模型无法区分常用词(“是”,“的”)和关键词、专有名词对文本的重要性问题

  • TF(Term Frequency): 某个词在当前文本中出现的频率
  • IDF(Inverse Document frequency): 逆文本频率,文本频率指含有某个词的文本在整个语料库中所占的比例。逆文本频率是文本频率的倒数
    NLP实习笔试面试题汇总一
    NLP实习笔试面试题汇总一
    NLP实习笔试面试题汇总一
    优点:
  • 不能反映词的位置信息,对关键词进行提取的时候,词的位置信息(如:标题、句首、句尾的词应该赋予更高的权重)
  • IDF是一种试图抑制噪声的加权,本身倾向于文本中频率比较小的词,这使得IDF的精度不高
  • TF-IDF严重依赖语料库,尤其是在训练同类语料库时,往往会掩盖一些同类型的关键词,比如,在进行TF-IDF训练时,语料库中的娱乐新闻较多,则与娱乐相关的关键词的权重就会偏低,因此需要选取质量高的语料库进行训练

3 分布式表示(Distributed Representation)

3.1 n-gram

n-gram是一种语言模型(Language Model,LM)语言模型是一种基于概率的判别式模型,该模型的输入是一句话(单词打的序列),输出的是这句话的概率,也就是这些单词的联合概率
(语言模型就是判断一句话是不是正常人说的话)

3.2 共现矩阵(Co-Occurrence Matrix)

首先指定窗口大小,然后统计内词语共同出现的次数作为词的向量

语料库:

  1. I like deep learning
  2. l like NLP
  3. l enjoy flying

若指定窗口大小为1(bi-gram),则语料库的共现矩阵如下:
NLP实习笔试面试题汇总一
优点

考虑了句子中词的顺序

缺点

  • 词表的长度很大,导致词的向量长度也很大
  • 共现矩阵也是稀疏矩阵,可以使用SVD、PCA等算法进行降维,但是计算量很大

3.3 Word2Vec

woed2vec有两种模型:CBOW和SKIP-GRAM

  • CBOW:利用上下文的词预测中心词
    NLP实习笔试面试题汇总一
  • SKIP-GRAM:利用中心词预测上下文的词
    NLP实习笔试面试题汇总一
    优点
  • 考虑到词语的上下文,学习到了语义和语法的信息
  • 得到的词向量维度小,节省存储和计算资源
  • 通用性强,可以应用到各种NLP任务中

缺点

  • 词与向量是一对一的关系,无法解决多义词的问题
  • word2vec是一种静态的模型,虽然通用性强,但无法做动态优化

3.4 GloVe
是一个基于全局词频统计的词向量表示算法,该算法综合了全局矩阵分解和局部上下文窗口两种方法的优点

优点

  • 考虑到词语的上下文和全局语料库的信息,学习到额语义和语法的信息
  • 得到的词向量维度小,节省存储和计算资源
  • 通用性强,可以应用到各种NLP任务中

缺点

  • 词和向量是一对一的关系,无法解决多义词的问题
  • glove也是一种静态的模型,虽然通用性强,但无法做动态优化

3.5 ELMO(Embedding from Language Models)
word2vec和glove算法得到的词向量都是静态词向量,静态词向量会把多义词的语义进行融合,训练结束后不会根据上下文进行改变,而ELMO模型进行训练词向量可以解决多义词的问题

算法精髓:用语言模型训练神经网络,在使用词向量的时候,单词已经具备上下文信息,这时神经网络可以根据上下文信息对词向量进行调整,经过调整后的词向量更能表达上下文中的具体含义,就可以解决静态词向量无法表达多义词的问题。

网络模型
NLP实习笔试面试题汇总一
过程:

  1. 上图中的结果使用字符级卷积神经网络(CNN)来将文本中的词转换成原始词向量
  2. 将原始词向量输入双向语言模型中第一层
  3. 前向迭代中包含了该词以及该词之前的一些词汇或语境的信息(即上文)
  4. 后向迭代中包含了该词以及该词之后的一些词汇或语境的信息(即下文)
  5. 这两种迭代的信息组成了中间词向量
  6. 中间词向量被输入到模型的下一层
  7. 最终向量就是原始词向量和两个中间词向量的加权和

备注

  • 现在深度学习在NLP领域中使用的大多是分布式词向量
  • 分布式词向量的理论基础时语言模型
  • 在进行词向量选择时,要考虑到具体任务的特性,word2vc、glove、elmo训练的词向量各有优缺点

二、Word2vec是如何工作的?它和LDA有什么区别和联系?

word2vec分为CBOW和skip-gram

CBOW目标是根据上下文出现的单词预测当前词的生成概率,而Skip-gram根据当前词预测上下文各词的生成概率
NLP实习笔试面试题汇总一
其中w(t)w(t)w(t)是当前所关注的词,w(t−2),w(t−1),w(t+1),w(t+2)是上下文单词,这里前后滑动窗口大小均设为2。
  CBOW和skip-gram都可以表示为有输入层、映射层、输出层组成的浅层神经网络。
  输入层中每个单词是由独热编码表示。所有词均表示一个N维向量,N为词汇表中单词的总数。在向量中,每个单词对应的维度为1,其余维度为0。
  在映射层中,K个隐含单元的值可以由N维输入向量以及连接输入和隐含单元的NK维权重矩阵计算得到。
  输出层向量的值可以由隐含层向量(K维),以及连接隐含层和输出层之间的KN维权重矩阵计算得到。输出层也是一个N维向量,每一维与词汇表中的一个单词对应。最后对输出层向量应用Softmax函数,可以得到每个单词的生成概率。
  接下来需要训练神经网络权重,使得所有单词的整体生成概率最大化。共有两大参数:从输入层到隐含层的一个维度为NK的权重矩阵,从隐含层到输出层的一个维度为KN的权重矩阵。学习权重可以使用BP算法实现。
  训练得到维度为N * K和K * N的两个权重矩阵之后,可以选择其中一个作为N个词的K维向量表示。
  但是由于Softmax**函数存在归一化项的缘故,推导出来的迭代公式需要对词汇表中的所有单词进行遍历,使得迭代过程非常缓慢。由此产生了Hierarchical Softmax和Negative Sampling两种方法。

Word2Vec与LDA区别

  • LDA是按照文档中单词的共现关系来对单词按照主题聚类,也可以理解为对 “文档-单词“ 矩阵进行分解,得到 “文档-主题”和 “主题-单词” 两个概率分布
  • word2vec是对 ”上下文-单词“矩阵进行学习,其中上下文由周围几个单词组成,由此学到的词向量更多融入了上下文特征
  • 主题模型和词嵌入两类方法最大的不同在于模型本身
  • 主题模型是一种基于概率图模型的生成式模型。其似然函数可以写为若干条件概率,其中包含需要推测的隐含变量(即主题)
  • 词嵌入模型一般表示为神经网络的形式,似然函数定义在网络的输出之上。需要学习网络的权重来得到单词的稠密向量表示

三、RNN与CNN在处理文本数据的时候有什么特点

传统文本处理任务的方法一般将TF-IDF向量作为特征输入,这样做,实际上丢失了输入的文本系列中每个单词的顺序

  • CNN(卷积神经网络)一般会接收一个定长的向量作为输入,然后通过滑动窗口加池化的方法将原来的输入转换为一个固定长度的向量表示。这样就可以捕捉到原文本中的一些局部特征和顺序上的信息,但一般只适用于短文本,对于两个词之间的长距离的依赖关系还是很难被捕捉到
    NLP实习笔试面试题汇总一

1、输入层是两个nk的矩阵,其中n为文本所对应的单词总数(若长度不够n用padding 补,超出则舍弃),k是每个词对应的emberding向量维度。这里的两个通道:一个是每个词的 k维向量预先在其他语料库中训练好的,即预训练的模型可以用word2vec等,另外一个通道是每个词的k维向量作为未知的参数由模型训练得到。这样做的好处一方面预训练好的emberding向量可以利用其他预料库获取更多的先验知识;另一方面,由当前CNN模型训练出来的词嵌入向量可以更好地捕捉与当前任务关联的特征。其中未知的nk的通道的参数是初始化,随着网络的训练会慢慢迭代改变。

2、第二层为卷积层,在输入的nk的矩阵上,定义的滑动窗口卷积操作为:
NLP实习笔试面试题汇总一
其中NLP实习笔试面试题汇总一代表输入矩阵的第i行到第i+h-1行 所组成的大小为h
k的滑动矩阵窗口,NLP实习笔试面试题汇总一NLP实习笔试面试题汇总一的维度一样,也是hk,b为偏置参数。f为非线性**函数,为标量。
比如一个filter的卷积操作,假设h=2,则每次在2
k的滑动窗口上进行卷积,就可得到n-h+1=n-1个结果,然后把他们拼接起来,组成n-1维的特征向量
NLP实习笔试面试题汇总一
卷积成中可以根据设置不同的h,产生多个不同的filter,每一个filter的卷积操作相当于提取一个特征,通过不同的滑动窗口的filter就可以提取出不同的特征,构成卷积层。

3、第三层为池化层,图中采用了max池化,即把上层中的每个filter产生的特征向量值中选出最大的一个作为特征值,,也就是说上一层每个filter的贡献在这一层就生成一个特征值,然后最后所有的值构成一个penultimate layer的特征向量,喂给最后的全连接层,并使用Softmax函数输出每个文本类别的概率。

  • RNN能够很好的处理文本数据变长并且有序的输入序列,将前面阅读到的有用的信息编码到状态变量中去,从而拥有了一定的记忆能力。
    NLP实习笔试面试题汇总一
    NLP实习笔试面试题汇总一
    通过不断最小化损失误差(即输出的y与真实类别之间的距离),可以不断训练网络,使得得到的循环神经网络可以准确预测文本类别。相比于CNN,RNN由于具备对序列信息的刻画能力,往往能得到更加准确的结果。

4、RNN为什么会出现梯度消失或梯度爆炸现象?有哪些改进方案?

RNN的求解可以采用BPTT(Back Propagation Through Time)算法实现。实际上是BP的简单变种。RNN设计的初衷在于捕捉长距离输入之间的依赖关系,然而使用BPTT的算法并不能成功捕捉远距离依赖关系,这一现象源于深度神经网络中的梯度消失问题。
NLP实习笔试面试题汇总一
传统的RNN网络梯度可以表示为连乘的形式:
NLP实习笔试面试题汇总一
由于预测误差沿神经网络每一层反向传播,当雅克比矩阵最大特征值大于1时,随着离输出越来越远,每层的梯度大小会呈指数增长,导致梯度爆炸。反之若最大特征值小于1,梯度大小会指数减小,产生梯度消失。梯度消失意味着无法通过加深网络层数来提升预测效果,只有靠近输出的几层才真正起到学习的作用,这样RNN很难学习到输入序列中的长距离依赖关系。

梯度爆炸可以通过梯度裁剪来缓解,即当梯度的范式大于某个给定值的时候,对梯度进行等比缩放。而梯度消失问题需要对模型本身进行改进。深度残差网络是对前馈神经网络的改进。通过残差学习的方式缓解了梯度消失的现象,从而可以学习到更深层的网络表示。对于RNN来说,长短时记忆模型及其变种门控循环单元等模型通过加入门控机制,很大程度上缓解了梯度消失带来的损失。

5、在CNN中采用ReLU**函数可以有效改进梯度消失,取得更好收敛速度和收敛结果,那么在RNN中可以采用ReLU作为**函数吗?

答案是肯定的。但是需要对矩阵的初值做一定限制,否则容易引发数值问题。首先回顾一下RNN前向传播公式:
NLP实习笔试面试题汇总一
根据前向传播公式,向前传播一层,得到:
NLP实习笔试面试题汇总一
如果采用ReLU替换公式中的**函数f,并且假设ReLU一直处于**区域(即输入大于0),则有 f(x)=x

继续将其展开,net的表达式最终包含t个W连乘。如果W不是单位矩阵,最终的结果将会趋于0或无穷,引发严重的数值问题。

那么为什么在CNN中不会出现这样的问题呢,因为CNN中每一层的权重矩阵是不同的,并且在初始化的时候它们是独立同分布的,可以相互抵消,多层之后不会出现严重的数值问题。

回到RNN的梯度计算公式:
NLP实习笔试面试题汇总一
NLP实习笔试面试题汇总一

6.LSTM是如何实现长短期记忆功能的?

- 6.1 什么是LSTM

长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

- 6.2 RNN与LSM的区别
NLP实习笔试面试题汇总一
NLP实习笔试面试题汇总一

- 6.3 深入LSTM
NLP实习笔试面试题汇总一
NLP实习笔试面试题汇总一
6.4 LSTM内部的四个状态
NLP实习笔试面试题汇总一
NLP实习笔试面试题汇总一
NLP实习笔试面试题汇总一
以上,就是LSTM的内部结构。通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息;而不像普通的RNN那样只能够“呆萌”地仅有一种记忆叠加方式。对很多需要“长期记忆”的任务来说,尤其好用。

但也因为引入了很多内容,导致参数变多,也使得训练难度加大了很多。因此很多时候我们往往会使用效果和LSTM相当但参数更少的GRU来构建大训练量的模型。