Word2vec vs Bert 系列技术要点
Word2vec vs Bert 系列技术要点
文章目录
Word2vec内容回顾
目的
- 将词转化为向量有助于机器理解
- 更容易计算词语和词语之间的距离,表此词语之间的关系
类比
- 比如说词向量之间的距离可以用下面的形式表示出来:
King - man + woman ≈ queen
引入
-
输入法:已经输入了一些词,产生若干的联想选项
-
词语的推荐,需要使用语言模型:从输入到输出
-
处理有三个步骤,首先是在词典中查询输入词的词向量,然后计算概率,然后找出对应的词语输出(概率)
考虑如何构建词向量
-
词嵌入,通过查看这个词语的上下文的单词进行嵌入
-
前提
-
有巨大的语料库(这个语料库已经被分好词了)
-
有一个滑动窗口(3,5,7?),也就是限制每次传入模型进行训练的窗口,窗口的大小就是每次传入模型的词语数量
-
每次滑动窗口产生一次训练语料(一次训练语料包括有feature context和label word,至于哪些是上下文,哪些用作预测label有不同的模型)
-
-
输入Input:单词(也就是特征),输出Output:预测词(也就是标签)
-
当要预测下面两个空
Example1:He was hit by a _________?Example2:He was hit by a _________ bus?
非常直观第一个词很容易想到是bus,第二个词容易想到是red,也就是说预测的这个空是跟这个空的上下文是紧密相关的,由此也就引发了下面的两种模型 -
CBOW模型(Continuous Bag of Words):通过context去预测中间的词。比如说
He was hit by a red bus in road这句话,用黑色加粗的部分context,去预测red -
Skip-gram模型和CBOW的策略相反,用red去预测context
主要介绍一下Skip-gram的一些关键步骤
-
通过滑动窗口来产生输入的语料
-
然后经过那三个步骤,有一个输出,初始的这些参数都是随机取的,然后这个预测当然肯定是错的,但是没有关系,就是要利用这种误差去反向更新词向量的参数
-
做完反向更新了参数之后,窗口向后滑动一格,然后重复上面的更新过程
-
所有的语料过了一遍后,训练完成一个epoch,训练若干个epoch终止
最后输入词向量矩阵(参数矩阵)
实际上,词向量是训练过程的一个副产品,这个模型最后得出的是一格预测的语言模型,也就是你输入一些词,他能给你返回一些与之相关的概率最高的词,然后此项俩个就是中间的一个参数矩阵
负采样优化
- 上面的过程是一个基本的过程,可以稍微估计一下,一个很大的语料库,词汇大概有几十万个,每次更新的时候都需要计算所有词语的参数,然后需要滑动巨大数量的窗口次数,然后还需要重复若干各epoch,这样带来的是计算力的巨大开销,为了减少巨大的计算开销,提升训练的效率,提出了一种负采样的策略
- 负采样的核心思想就是转化一下训练的task,不进行所有参数的更新计算,只挑选一些负样本参与计算,这样就能够大大减少计算量,使得高效的训练变得可行
以上就是关于word2vec的一些技术要点回顾,主要了解其计算的大致过程和机制。
Seq2Seq模型的注意力(Attention)机制
- seq2seq就是从一个序列转化为另一个序列,比如语言的翻译
- 在seq2seq的背后是由编码器和解码器组成的
-
encoder:处理输入的每条信息,转化为向量(context)
decoder:接收encoder传来的context,再一条一条的进行转化输出
两者都是有RNN循环神经网络组成的,encoder的输入是每个词的词向量加上一个隐藏状态向量 - 主要的过程就如下面的动画
Attention机制
- 形象的理解注意力机制就是,在每一次生成翻译结果之前,先聚焦到需要翻译的原单词。这种“放大来自输入序列相关部分的信号的”能力使得有注意力机制的模型比没有注意力机制的模型产生更好的结果
- 至于这个 注意 的过程是如何发生的,里面涉及到一系列的操作,这里不做详细的解释,但是这一块却是一个提升翻译效果的关键。
Transformer原理
-
自从Attention is All you need 这篇文章发布后,Transformer火的一塌糊涂,热度不低于Bert。
-
可以应用在机器翻译中,结构是多层的encoder和decoder
-
所有的编码在结构上都是相同的,但是它们没有共享的参数,每个都是可以分解成两个子层
-
具体来看
上面这个图传达了一个十分重要的信息:那就是前馈网络的训练是并行的,这将可以极大的改善训练的效率,是一个十分显著的进步
-
从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。
举个例子:The animal didn’t cross the street because it was too tired。
这个句子中的it指代的是什么,对于人来说很容易,但是对于机器就不是那么容易了,所以说,自注意层能够帮助对这个单词进行更加准确的编码
自注意层的背后其实是一系列的矩阵运算,背后的计算原理这里也不进行详细的展开 -
自注意层在实际中会分很多个,也就是一个单词的自注意层会有很多个,叫做
多头注意力
使用位置编码
- 位置编码主要是为了表示序列的顺序
- 这个位置编码添加进入了每个词向量里头,在词向量的基础上加上一个和基于时间步的词嵌入作为模型的输入
BERT原理
-
BERT是最近的一个在人工智能领域里面里程碑的技术,已经在大规模数据集上经过训练的预训练的模型可以直接使用,这能够节省从头开始训练语言处理模型所需要的时间、经理、知识和资源
-
Bert最直接的使用方式是其用于分类单个文本,比如说垃圾邮件的分类
输入一段文本,经过Bert后能够输入是否是垃圾邮件的概率
-
此外也可以用作情感分析(输入电影或者产品的评论,输出评论是正面还是负面的)
-
Bert有两个发布的模型(Google),一个是base版本,这个模型大小和OpenAI Transformer相当,可以进行比较,另外一个是十分巨大的模型,实现了当前的最佳
-
实际上Bert就是一系列训练好的encoder(只使用了transformer的编码器部分,实际上Bert主要做的也正是编码的工作)
这两种大小的 BERT 模型都有很多编码器层(这篇论文称之为 Transformer Blocks)——Base 版有 12 层,Large 版有 24 层。相比于 Transformer 初始论文的参考实现的默认配置(6 个编码器层、512 个隐藏单元和 8 个注意头),它们还有更大的前馈网络(分别有 768 和 1024 个隐藏单元)和更多注意头(attention head,分为有 12 和 16 个)
模型的输入
-
首个输入是一个特殊的[CLS]输入,指代一个分类器,然后每个编码器都会有一个自注意层和一个前馈网络层
-
在架构方面,直到这部分为止都与 Transformer 完全相同(除了规模大小,见上述的配置)。在输出的位置,我们开始看到不同。
模型的输出
- 每个位置都会输出一个大小为768(base版本)的向量,对于分类的任务,主要关注第一个位置的输出。
Bert的提升与进步(对比)
- 让机器学习能够处理词,首先需要将其转化为某种数值形式,以便模型进行计算,Word2vec就是一种能够将词嵌入数值的高维空间的一种方式。
- 于是这一领域很快就意识到,使用在大规模文本数据集上训练后的词嵌入是一个很棒的思路,而不是在通常很小的数据集上与模型一起训练词嵌入。
- 那这样就产生一个问题,在word2vec的时期,一个词语就是对应一个向量,而不管是在什么样的情境下面,和这个词的上下文是无关的。很多NLP研究和应用人员都意识到这个问题,于是后面出现了ELMO的模型,这是一种语境化的词嵌入方式,一个词在不同句子当中的词嵌入(词向量)是不一样的,其原理大概就是训练变成了双向的
- ULM-Fit引入了新的方法,可以有效的利用模型在预训练阶段学习到的很多东西,而不仅仅是词嵌入(之前说过,词嵌入往往只是副产品),也不仅仅是语境化的嵌入。引入了新的语言模型和新的处理过程,可以针对多种任务对语言模型进行调整,像迁移学习一样。
- 后面发现,可以使用基于Transformer技术完成NLP任务,而且,OpenAI Transformer能够将迁移学习和可调节的语言模型用在NLP上
- OpenAI Transformer 为我们提供了基于 Transformer 的可微调的预训练模型。但在这种从 LSTM 到 Transformer 的过度中却缺失了一些东西。ELMo 的语言模型是双向的,而 OpenAI Transformer 仅训练一个单向语言模型。我们能否构建出一种既能向前看也能向后看(即同时基于上文和下文)的基于 Transformer 的模型?——那就是BERT
- Bert是一种有掩码的语言模型,会掩盖输入的15%的单词,让模型去预测缺失的词
- Bert也能够用于特征的提取。使用预训练后的BERT来创建语境化的词嵌入
er 仅训练一个单向语言模型。我们能否构建出一种既能向前看也能向后看(即同时基于上文和下文)的基于 Transformer 的模型?——那就是BERT
- Bert是一种有掩码的语言模型,会掩盖输入的15%的单词,让模型去预测缺失的词
- Bert也能够用于特征的提取。使用预训练后的BERT来创建语境化的词嵌入