当前位置:   article > 正文

NLP学习路线

nlp学习路线

第一部分:深度学习的嫩枝

这一部分是深度学习刚刚被应用于自然语言处理的时期。在此之前,NLP大多仍是传统机器学习和概率统计的天下,直到几个关键问题的解决。

  1. 前馈神经网络语言模型

A neural probabilistic language model2003,Bengio

  • 语言建模是在给定先前单词的情况下预测文本中的下一个单词的任务。这可能是最简单的语言处理任务,具有具体的实际应用,如智能键盘和电子邮件回复建议。
  • 第一个神经语言模型,前馈神经网络是由Bengio等人在2003年提出的,如下图所示。

  • 他们提出的语言模型已经具有现在Word2Vec的雏形。也就是把单词用上下文单词的语义来确定下来,这将会是我们接下来讨论的核心。
  • 传统的统计语言模型存在问题:
    • 在高维下,数据的稀缺性导致统计语言模型存在很多为0的条件概率
    • 语言模型的参数个数随着阶数呈指数增长,所以一般这个模型的阶数不会很高,这样n-gram无法建立长远的关系
    • n-gram无法建模出多个相似词的关系
  • 为解决上述的三个问题,作者提出了几个新概念:
    • 词向量:本文中的词向量是通过学习得到的,对所有的文档提取单词制作一个词汇表,每个单词有一个唯一的索引,即词汇表每行代表一个单词的embedding(词向量),每个词的索引可以看为一个单位向量(其实就是one-hot编码),通过学习得到的词向量就可以体现出相似词语之间的关系,并且one-hot向量维度大小与词典成正比,稠密向量大小是固定值(50~300),所以不会存在维度过大的问题,导致维度灾难。
    • NNML:一个三层的神经网络,结合了词向量后,通过不断训练采用BP算法来对连接权和词向量举证进行更新,这是一个非常简单的浅层网络但是也可以在简单的预测问题上获得较好的结果。

Tips:语言模型

统计语言模型是一个单词序列上的概率分布,对于一个给定长度为m的序列,它可以为整个序列产生一个概率 P(w_1,w_2,…,w_m) 。其实就是想办法找到一个概率分布,它可以表示任意一个句子或序列出现的概率。

语言模型在自然语言处理相关应用非常广泛,如语音识别(speech recognition) , 机器翻译(machine translation), 词性标注(part-of-speech tagging), 句法分析(parsing)等。传统方法主要是基于统计学模型,最近几年基于神经网络的语言模型也越来越成熟。

而上文提到的n-gram便是一种语言模型。

2.多任务学习(MultiTask Learning)

A unified architecture for natural language processing: deep neural networks with multitask learning,2008,Collobert,Weston.

  • 多任务学习是在多个任务上训练的模型之间共享参数的一种通用方法。在神经网络中,通过将不同层的权重捆绑在一起就可以很容易地做到这一点。这在2008年由Collobert和Weston首次应用于NLP的神经网络。
  • 由此产生的语言模型中的单词查找表被用作使用语言模型的 Multitask 学习实验中使用的查找表的初始化器。
  • 与Task相比,使用 Multitask 学习的相对改进会更大,这表明 Multitask 学习是一种正则化的好方法:随着容量的变化,Multitask 学习结果相当稳定。
  • 我们提出了一个用于自然语言处理的一般深度神经网络架构。并且展示了我们的深度神经网络可以应用于各种任务,如语义角色标记、命名实体识别、部分语音标记、块状和语言建模。

文章亮点:这个时期的人们大多在为如何把单词高效的转化为向量发愁。因此RNN等知名网络此时并没有在NLP中广泛应用,直到接下来词向量(Word2Vector)的真正出现,人们才把研究中心重新放在RNN和它的变种上,当然对于语言模型的探索也没有停止,因为人们已经认识到它的重要性了。


第二部分:词向量时代

自从Mikolov在他2013年的论文“Efficient Estimation of Word Representation in Vector Space”提出词向量的概念后,NLP领域仿佛一下子进入了embedding的世界,Sentence2Vec、Doc2Vec、Everything2Vec。词向量基于语言模型的假设——“一个词的含义可以由它的上下文推断得出“,提出了词的Distributed Representation表示方法。

什么是word2vec?

对于计算机来说,理解自然语言的关键就是理解单词。每一种我们常说的语言(如英文、中文),其基本组成单位都是一个个的单词或词组,因此想让计算机理解我们的语言,我们必须寻找一种既高效又能体现出单词之间的相似程度(逻辑距离)的表示方法。简单的将单词用One-Hot向量编码,一旦单词数量达到一定程度,便会造成维度灾难。并且用OneHot编码的向量其中大部分都是0(称为稀疏矩阵),对计算机来说,这既不高效也不能体现单词间的联系。因此便诞生出了Word2Vec。它的关键可以概括为将单词转化为低维的、稠密的并且语义关系更强的向量,我们在NLP网络结构中常常看到的Embedding层便是在干这件事

相关论文

Efficient Estimation of Word Representations in Vector Space

  • 正如我们在上面看到的,单词或单词嵌入的密集向量表示早在2003年就已被Bengio使用。之所以这篇论文能成为里程碑式的论文,归功于米科洛夫等人在2013年提出的主要创新,是通过去除隐藏层并接近目标来使这些单词嵌入的训练更有效率。虽然这些改变本质上很简单,但它们使得高效的word2vec得以实现——能够进行大规模的单词嵌入训练。
  • Word2vec有两种风格,可以在下面的图3中看到:连续词袋(CBOW)和跳过语法(Skip-Gram)。它们的目的不同:一种根据周围的单词预测中心词,而另一种则相反。

  • 以CBOW为例,它是一个一层的神经网络。我们训练过程可以用这张图来简便表示。

    1. Input layer输出层:是上下文单词的one hot。假设单词向量空间的维度为V,即整个词库corpus大小为V,上下文单词窗口的大小为C。
    2. 假设最终词向量的维度大小为N,则图中的权值共享矩阵为W。W的大小为 V ∗ N V * N V∗N,并且初始化。
    3. 假设语料中有一句话"我爱你"。如果我们现在关注"爱"这个词,令C=2,则其上下文为"我",“你”。模型把"我" "你"的onehot形式作为输入。易知其大小为 1 ∗ V 1*V 1∗V。C个1*V大小的向量分别跟同一个 V ∗ N V * N V∗N大小的权值共享矩阵W相乘,得到的是C个 1 ∗ N 1*N 1∗N大小的隐层hidden layer。
    4. C个 1 ∗ N 1*N 1∗N大小的hidden layer取平均,得到一个 1 ∗ N 1*N 1∗N大小的向量,即图中的Hidden layer。
    5. 输出权重矩阵W’为 N ∗ V N*V N∗V,并进行相应的初始化工作。
    6. 将得到的Hidden layer向量 1 ∗ N 1*N 1∗N与W’相乘,并且用softmax处理,得到 1 ∗ V 1*V 1∗V的向量,此向量的每一维代表corpus中的一个单词。概率中最大的index所代表的单词为预测出的中间词。
    7. 与groud truth中的one hot比较,求loss function的的极小值。
  • 从那时起,人们在探索单词嵌入的不同方面做了大量工作(正如原始论文惊人的被引用数量所表明的那样)。看看这篇文章可以找到一些趋势和未来的方向。尽管有了许多发展,word2vec仍然是一个流行的选择,并在今天得到了广泛的使用。图:原论文惊人的引用量

NLP中的神经网络

随着词向量的提出,RNN(循环神经网络)等网络神经网络模型开始在NLP中广泛被采用。RNN由于其在长序列训练过程中存在梯度消失和爆炸的问题,一直不被业界看好。因此,在1990年RNN首次被提出后,很快被LSTM(长短时记忆网络)所取代,而在2013年双向LSTM的出现更是把类RNN网络推上了NLP的主舞台。

RNN由于其能保存上一时间序列的输入信息,并输入到下一层的特性,具有了能记住上下文的功能(如上图)。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。

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

相比RNN只有一个传递状态 ,LSTM有两个传输状态,一个  c-t(cell state),和一个h-t(hidden state),其中c-t便代表了长时记忆。并且LSTM拥有着比传统RNN更为复杂的重复结构(例如门结构)。具体细节及LSTM的其他变种(如GRU)等可以看这篇论文

Seq2Seq(Sequence to Sequence)

seq2seq模型非常容易理解,顾名思义,它的输入是一段序列,输出也是一段序列。虽然这样的问题情形在很早就有应用,机器翻译就是一个很好的例子。但第一个真正被称作seq2seq的模型是在2014年由Sutskever提出的Encoder-Decoder模型,原论文(Sequence to Sequence Learning with Neural Networks)。这是一种序列生成的思路,由两个RNN网络组成。

在每个时刻, Encoder中输入一个字/词,隐藏层就会根据这个公式而改变,到最后一个字/词 XT 时 ,隐藏层输出 c 。由于RNN的特性,c 相当于包含了整个句子的信息,可以看成整个句子的一个语义表示。之后再把c向量输入到Decoder中,同样在每个时刻得到输出,直到出现代表结尾的特殊字符(由训练中使用的决定)。

第三部分:前沿进展

Attention(注意力机制)

Attention的出现是为了模仿人思考问题时的注意力机制,就像人在看一张图片或是一句话时,他首先会观察到的是让他眼前一亮的信息,而不会像计算机一样去顺序遍历。同样,Attention是一种能让模型对重要信息重点关注并充分学习吸收的技术,它不算是一个完整的模型,应当是一种技术,能够作用于任何序列模型中。

Attention首先是在NLP中的Seq2Seq得到应用的,正如前文所说的一样,它被放在Encoder和Decoder之间,以便能更好的让Decoder吸收Encoder得到的信息。

在具体的网络中,Attention是一组可以学习的权重向量,在Encoder编码完后与之加权线性组合,之后再输入到Decoder。

具体构成如下:

我们的最终目标是要能够帮助decoder在生成词语时,有一个不同词语的权重的参考。在训练时,对于decoder我们是有训练目标的,此时将decoder中的信息定义为一个Query。而encoder中包含了所有可能出现的词语,我们将其作为一个字典,该字典的key为所有encoder的序列信息。n个单词相当于当前字典中有n条记录,而字典的value通常也是所有encoder的序列信息。

上面对应于第一步,然后是第二部计算注意力权重,由于我们要让模型自己去学习该对哪些语素重点关注,因此要用我们的学习目标Query来参与这个过程,因此对于Query的每个向量,通过一个函数

,计算预测i时刻词时,需要学习的注意力权重,由于包含n个单词,因此,

 应当是一个n维的向量,为了后续计算方便,需要将该向量进行softmax归一化,让向量的每一维元素都是一个概率值。最后对Value vectors进行加权线性组合,得到带权重参考的“字典”输出:

Transformer

基于传统的Encoder-Decoder With Attention优化而来,彻底舍弃RNN,仅仅使用注意力机制,Attention Is All You Need.

建议去看李沐大神的讲解,清晰明了:点我跳转

Bert

Bert是一个通用的预训练模型,可以先在海量的未标注数据上,训练Bert模型,得到Bert的参数。在下游任务中,利用标注的数据,对Bert模型进行微调(fine-tuning),有很好的结果。

Bert使用的是Transformer的Encoder。准确的说,Bert模型就是一个12(24)层的Transformer Encoder。

总之也是火的一塌糊涂。

直接上论文:BERT: Pre-training of Deep Bidirectional Transformers for

Language Understanding

知乎大佬的解释:什么是BERT?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/353072
推荐阅读
相关标签
  

闽ICP备14008679号