NLP

attention机制

将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。

RNN会将它已经处理过的前面的所有单词/向量的表示与它正在处理的当前单词/向量结合起来。而自注意力机制会将所有相关单词的理解融入到我们正在处理的单词中。

带权求和

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4HXqHc4k-1651064308251)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20210606170714469.png)]

第一步: query 和 key 进行相似度计算,得到权值

第二步:将权值进行归一化,得到直接可用的权重

第三步:将权重和 value 进行加权求和

Encoder-Decoder

Encoder-Decoder 算是一个通用的框架。

将现实问题转化为数学问题,通过求解数学问题,从而解决现实问题。

Transformer

Transformer是一个完全基于注意力机制的编解码器模型

Transformer 模型中没有循环结构,而是把序列中的所有单词或者符号并行处理,同时借助自注意力机制对句子中所有单词之间的关系直接进行建模,而无需考虑各自的位置。具体而言,如果要计算给定单词的下一个表征,Transformer 会将该单词与句子中的其它单词一一对比,并得出这些单词的注意力分数。

BERT

BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder

词干提取和词形还原

词干提取是英文语料预处理的一个步骤(中文并不需要),而语料预处理是 NLP 的第一步。

分词

分词就是将句子、段落、文章这种长文本,分解为以字词为单位的数据结构,方便后续的处理分析工作。 文本都是一些「非结构化数据」,我们需要先将这些数据转化为「结构化数据」。

分词的方法大致分为 3 类:

  1. 基于词典匹配

  2. 基于统计

  3. 基于深度学习

transformer

词嵌入embedding

输入单词通过词嵌入算法转换为词向量,每个单词都被嵌入为512维的向量。

使用位置编码表示序列的顺序

理解输入单词顺序,将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。

编码器、解码器结构

编码器有自注意力(self-attention)层和前馈(feed-forward)层

解码器有自注意力(self-attention)层和前馈(feed-forward)层、这个“编码-解码注意力层”工作方式基本就像多头自注意力层一样,只不过它是通过在它下面的层来创造查询矩阵,并且从编码器的输出中取得键/值矩阵。

在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接,并且都跟随着一个“层-归一化”步骤

(求和与归一化)

自注意力机制

1、每个编码器的输入向量(每个单词的词向量),分别和WQ、WK、WV权重矩阵相乘得到q1、k1、v1查询向量、键向量和一个值向量。维度是64

2、计算得分,分数是通过查询向量与每一个单词(所有输入句子的单词)的键向量点积来计算的。

3、4、将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。),然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。这个softmax分数决定了每个单词对编码当下位置(单词)的贡献。

5、每个值向量乘以softmax分数

6、对加权值向量求和,得到注意力层在该位置的输出(在我们的例子中是对于第一个单词)。

在解码器中,自注意力层只被允许处理输出序列中更靠前的那些位置。

multi-headed

“多头”注意力 multi-headed”attention,它扩展了模型专注于不同位置的能力

我们有多个查询/键/值权重矩阵集(Transformer使用八个注意力头,因此我们对于每个编码器/解码器有八个矩阵集合)。

前馈层不需要8个矩阵,它只需要一个矩阵(由每一个单词的表示向量组成)。我们把这些矩阵拼接在一起,然后用一个附加的权重矩阵WO与它们相乘。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wx9O8bHs-1651064308252)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20210606211043336.png)]

编码-解码注意力层

这个“编码-解码注意力层”工作方式基本就像多头自注意力层一样,只不过它是通过在它下面的层来创造查询矩阵,并且从编码器的输出中取得键/值矩阵。

最终的线性变换和Softmax层

线性变换层是一个简单的全连接神经网络,它可以把解码组件产生的向量投射到一个比它大得多的、被称作对数几率(logits)的向量里。

训练部分

在训练过程中,一个未经训练的模型会通过一个完全一样的前向传播。

因为模型的参数(权重)都被随机的生成,(未经训练的)模型产生的概率分布在每个单元格/单词里都赋予了随机的数值。我们可以用真实的输出来比较它,然后用反向传播算法来略微调整所有模型的权重,生成更接近结果的输出。(叉熵和KL散度。)

预训练模型

预训练通过自监督学习从大规模数据中获得与具体任务无关的预训练模型。体现某一个词在一个特定上下文中的语义表征。

预训练模型就意味着把人类的语言知识,先学了一个东西,然后再代入到某个具体任务,就顺手了,就是这么一个简单的道理

为什么我们要做预训练模型?首先,预训练模型是一种迁移学习的应用,利用几乎无限的文本,学习输入句子的每一个成员的上下文相关的表示,它隐式地学习到了通用的语法语义知识

在预训练的模型中,AR(自回归)LM 和 AE(自动编码器)是最常用的自监督学习方法,其中,自回归 LM 旨在利用前面的词序列预测下个词的出现概率(语言模型)。自动编码器旨在对损坏的输入句子,比如遮掩了句子某个词、或者打乱了词序等,重建原始数据。通过这些自监督学习手段来学习单词的上下文相关表示。

对于层级的CNN结构来说,不同层学到的图像特征是不一样的,越浅层所学到的特征越通用,越深层所学到的特征和具体任务关联性就越强。

预训练可以在一定程度上缓解对某一个新任务的标注数据的要求。

在比较浅层的CNN网络初始化时,可以使用已有的参数,而更高层的参数可以随机初始化。

预训练语言模型的通用范式是:1)基于大规模文本,预训练得出通用的语言表示;2)通过微调的方式,将学习到的知识传递到不同的下游任务。

预训练就是先在大量通用语料上训练模型,学习到通用的语言知识,然后再针对性地针对任务进行迁移训练。

预训练的意思就是提前已经给你一些初始化的参数,这个参数不是随机的,而是通过其他类似数据集上面学得的,然后再用你的数据集进行学习,得到适合你数据集的参数,随机初始化的话,的确不容易得到结果,但是这个结果是因为速度太慢,而不是最终的结果不一样。

使用Warmup预热学习率的方式,即先用最初的小学习率训练,然后每个step增大一点点,直到达到最初设置的比较大的学习率时(注:此时预热学习率完成),采用最初设置的学习率进行训练(注:预热学习率完成后的训练过程,学习率是衰减的),有助于使模型收敛速度变快,效果更佳。

  • Bert 损失函数组成:

    • 第一部分是来自 Mask-LM 的单词级别分类任务;
    • 另一部分是句子级别的分类任务;
  • 优点:通过这两个任务的联合学习,可以使得 BERT 学习到的表征既有 token 级别信息,同时也包含了句子级别的语义信息。

  • 负对数似然函数

    img

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐