天然语言处理:从词频到word embedding到Bert模型

通用的天然语言处理(natural language processing, nlp)过程以下:网络

  1. 文本预处理
    • 清洗数据、进行分词等
  2. 特征工程
    • 传统ML特征(如tf-idf特征, 主要集中于提取关键词)
    • 语法、语义信息(词向量word embedding,句向量等)
  3. 创建模型
    • 传统模型:LinearSVM, LogicRegression
    • 深度模型: TextCNN, TextRNN, TextRCNN, Bert

因为模型以张量为输入,所以面对nlp数据集,第一个任务就是将文本转为向量,是本文谈论的重点。其中大概有如下几种方法:框架

  1. 作好数据清洗、分词,将word进行one-hot embedding,优势是简单,但会损失不少信息而且中间有tricky的地方须要处理
  2. 利用词频、tf-idf等信息,直接对文本进行编码。这些特征可能在word分布比较平均的时候没有多大做用
  3. 利用预训练方法,根据语言的通用性,将word映射到一个隐空间表示它的语义,或许还能加上context对其语义向量进行微调(解决多义词问题)

传统特征

利用传统特征如词频、tf-idf等对文本进行编码,而后扔到LinearSVC中,若是是二分类任务,效果基本还行,并且比较简单。这些特征的缺点在于:工具

  • 效果比较吃数据集,若是数据集自己的词比较散,效果会不好学习

  • 不具有通用性动画

  • 计算比较慢,相比于利用word embedding + frozen而言ui

Word Embedding

Word Embeddind是一种预训练技术。编码

在CV任务中,经常使用层级CNN结构,通常会使用CNN方法加以辅助。对于层级CNN结构来讲,不一样层级的神经元学习到不一样类型的图像特征,由底向上造成层级结构,所以越接近底层的神经元学习到特征越具备通用型(好比边角线、弧线等基础特征),越高层神经元学习到的特征越与具体任务相关。3d

所以,可使用ImageNet等大型数据集对网络进行预训练,抽取其底层任务无关的特征提取器的参数对特定任务的网络进行初始化:code

  • 对于小数据集,因为网络参数通常以亿计,少许数据难以训练复杂网络,所以使用预训练+fine tuning调整参数更为合适
  • 对于大型数据集,能够为参数设置一个较好的初始化值

NLP语言模型 语言模型包括文法语言模型和统计语言模型,通常咱们指统计语言模型。 统计语言模型:把句子(sequence of word)看做一个随机事件,以相应几率描述其属于某种语言集合的可能性。给定一个词聚集合V,对于一个由V中的词构成的序列S=(w_1, \cdots, w_T) \ \in \ V^n,赋予几率P(S)衡量其复合天然语法语义的置信度 常见的统计语言模型由N-gram Modelorm

那么容易想到在nlp领域也可使用预训练的方式对语义进行提取,其中最先的工做多是2003年的神经网络语言模型(NNLM),在2013年深度学习火爆以后开始收到重视,word embedding是网络训练的副产品,是一个由词向量组成的矩阵。2013年最火的用语言模型作word embedding的工具是word2vec。

Word2Vec的网络结构和NNLM相似,区别在于训练方法:

  • CBOW: 从一个句子里把一个词扣掉,用这个词的上下文预测扣掉的词
  • Skip-gram: 与CBOW相反,输入某个单词要求预测其上下文

尝试word2vec可使用gensim

WordEmbedding的问题在于:多义词问题,它的训练方式致使无论单词的上下文都是预测相同的这个单词,致使两种不一样的上下文信息都会编码到相应的word embedding空间

ELMO

Deep contextualized word representation -- Embedding from Language Models,提供了多义词问题的解决方案。WordEmbedding在训练好以后每一个单词的表达就固定了,不会跟着context进行变化,也就是说它的embedding是静态的。

ELMO的本质思想是:使用语言模型训练单词的WordEmbedding,实际使用时根据上下文单词的语义进行调整,即根据上下文对Word Embedding进行调整。

ELMO采起了两阶段训练过程:

  1. 上游:利用语言模型进行预训练,这边通常提取了词义
  2. 下游:从与训练网络提取对应单词的网络隔层的word embedding做为新特征补充到下游任务,这边通常提取了语法信息和语义信息

缺点(与GPT和Bert对比):

  1. LSTM抽取特征的能力远远弱于Transformer
  2. 经过拼接方式融合特征,融合能力偏弱

Transformer Transformer是个叠加的Self Attention构成的深度网络。注意力机制指扫描全局得到须要重点关注的目标区域,抑制无用信息。 Attention机制通常依附于Encoder-Decoder框架,单纯的Encoder-Decoder通常用于输入输出维度不一致,那么就利用Encoder将其编码为固定长度的信息向量(中间语义表示),再使用Decoder进行解码,其缺点在于:

  • 中间语义表示长度有限,可能存在信息损耗
  • Decoder根据中间语义表示即句子的全局信息进行解码,没法注重句子的局部信息

引入Attention模型后至关于给每一个单词都增长了权重,能够关注于局部信息了 动画演示 本质上Attention是对Source中元素的Value值进行加权求和(Source就是句子,元素就是每一个单词,其value就是embedding):\text{Attention}(\text{Query}, \ \text{Source}) = \Sigma_{i=1}^{L_x} \textit{Similarity}(\text{Query}, \text{Key}_i) \cdot \text{Value}_i

Self Attention也称为intra Attention,attention机制中Source和Target内容不同,Self Attention机制是句子内部元素之间发生Attention的机制(能够看做Source=Target的特殊状况)。Self Attention能够捕获同一个句子中单词之间的一些句法特征/语义特征,它直接捕获两个单词的特征,不一样于RNN的序列计算(这会致使越远的单词有效捕获的可能性越小)

GPT

Generative Pre-Training一样使用两阶段过程:

  1. 利用语言模型进行预训练
  2. 经过fine tuning模式解决下游任务

与ELMO不一样之处在于:

  • 特征抽取使用Transformer
  • 使用Context-before进行预训练(ELMO采用Bi-LSTM所以能够提取上下文信息)

缺点:

  • 语言模型是单向的,只能提取到Context-Before信息

Bert

Bert采用GPT彻底相同的两阶段模型(不一样之处在于它使用了双向且预训练语言模型的数据规模更大),因此其实:

  • 把ELMO的特征抽取器换成Transformer就获得了Bert
  • 把GPT语言模型换成双向的也得倒Bert

那么问题就在于Transformer如何双向使用进行训练呢?

  • Maked LM:使用[MASK]或者其余词对须要预测的词进行替换
    • 之因此须要其余词是由于,后面真正使用是不会有MASK标记的,所以不能只针对这个标记进行训练
  • Next Sentence Prediction: Masked LM集中在单词粒度,对NLP中对句子关系预测来讲粒度太细,所以须要将语料中句子顺序进行替换
  • 所以Bert的预训练是个多任务的过程

Bert的输入由三种embedding进行叠加:

  • Token Embedding: 词义
  • Segment Embedding: 由于句子关系预测的任务,须要将所在句子的embedding也做为单词输入的一部分
  • Positionn Embeddinng: 位置信息,NLP中单词顺序十分重要

参考

从Word Embedding到Bert模型—天然语言处理中的预训练技术发展史

相关文章
相关标签/搜索