通用的自然语言处理(natural language processing, nlp)过程如下:
- 文本预处理
- 清洗数据、进行分词等
- 特征工程
- 传统ML特征(如tf-idf特征, 主要集中于提取关键词)
- 语法、语义信息(词向量word embedding,句向量等)
- 建立模型
- 传统模型:LinearSVM, LogicRegression
- 深度模型: TextCNN, TextRNN, TextRCNN, Bert
由于模型以张量为输入,因此面对nlp数据集,第一个任务就是将文本转为向量,是本文谈论的重点。其中大概有以下几种方法:
- 做好数据清洗、分词,将word进行one-hot embedding,优点是简单,但会损失很多信息并且中间有tricky的地方需要处理
- 利用词频、tf-idf等信息,直接对文本进行编码。这些特征可能在word分布比较平均的时候没有多大作用
- 利用预训练方法,根据语言的通用性,将word映射到一个隐空间表示它的语义,或许还能加上context对其语义向量进行微调(解决多义词问题)
传统特征
利用传统特征如词频、tf-idf等对文本进行编码,然后扔到LinearSVC中,如果是二分类任务,效果基本还行,而且比较简单。这些特征的缺点在于:
-
效果比较吃数据集,如果数据集本身的词比较散,效果会很差
-
不具备通用性
-
计算比较慢,相比于利用word embedding + frozen而言
Word Embedding
Word Embeddind是一种预训练技术。
在CV任务中,常用层级CNN结构,一般会使用CNN方法加以辅助。对于层级CNN结构来说,不同层级的神经元学习到不同类型的图像特征,由底向上形成层级结构,因此越接近底层的神经元学习到特征越具有通用型(比如边角线、弧线等基础特征),越高层神经元学习到的特征越与具体任务相关。
因此,可以使用ImageNet等大型数据集对网络进行预训练,抽取其底层任务无关的特征提取器的参数对特定任务的网络进行初始化:
- 对于小数据集,由于网络参数一般以亿计,少量数据难以训练复杂网络,因此使用预训练+fine tuning调整参数更为合适
- 对于大型数据集,可以为参数设置一个较好的初始化值
NLP语言模型 语言模型包括文法语言模型和统计语言模型,一般我们指统计语言模型。 统计语言模型:把句子(sequence of word)看作一个随机事件,以相应概率描述其属于某种语言集合的可能性。给定一个词汇集合V,对于一个由V中的词构成的序列
,赋予概率
衡量其复合自然语法语义的置信度 常见的统计语言模型由N-gram Model
那么容易想到在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采取了两阶段训练过程:
- 上游:利用语言模型进行预训练,这边一般提取了词义
- 下游:从与训练网络提取对应单词的网络隔层的word embedding作为新特征补充到下游任务,这边一般提取了语法信息和语义信息
缺点(与GPT和Bert对比):
- LSTM抽取特征的能力远远弱于Transformer
- 通过拼接方式融合特征,融合能力偏弱
Transformer Transformer是个叠加的Self Attention构成的深度网络。注意力机制指扫描全局获得需要重点关注的目标区域,抑制无用信息。 Attention机制一般依附于Encoder-Decoder框架,单纯的Encoder-Decoder一般用于输入输出维度不一致,那么就利用Encoder将其编码为固定长度的信息向量(中间语义表示),再使用Decoder进行解码,其缺点在于:
- 中间语义表示长度有限,可能存在信息损耗
- Decoder根据中间语义表示即句子的全局信息进行解码,无法注重句子的局部信息
引入Attention模型后相当于给每个单词都增加了权重,可以关注于局部信息了 动画演示 本质上Attention是对Source中元素的Value值进行加权求和(Source就是句子,元素就是每个单词,其value就是embedding):
Self Attention也称为intra Attention,attention机制中Source和Target内容不一样,Self Attention机制是句子内部元素之间发生Attention的机制(可以看作Source=Target的特殊情况)。Self Attention可以捕获同一个句子中单词之间的一些句法特征/语义特征,它直接捕获两个单词的特征,不同于RNN的序列计算(这会导致越远的单词有效捕获的可能性越小)
GPT
Generative Pre-Training同样使用两阶段过程:
- 利用语言模型进行预训练
- 通过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中单词顺序十分重要