【使用 BERT 的问答系统】第 3 章 :词嵌入介绍

时间:2022-12-05 12:54:33

     ????大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流????

????个人主页-Sonhhxg_柒的博客_CSDN博客 ????

????欢迎各位→点赞???? + 收藏⭐️ + 留言????​

????系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

【使用 BERT 的问答系统】第 3 章 :词嵌入介绍

 ????foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟????

文章目录

One-Hot 表示

计数向量

TF-IDF 向量化

什么是词嵌入?

词嵌入的不同方法

Sentence Embeddings

ELMo

通用句子编码器

来自 Transformers 的双向编码器表示

结论


文档分类、情感分析、聚类和文档摘要等 NLP 任务需要处理和理解文本数据。这些任务的实施取决于人工智能系统如何处理和理解数据。一种方法是使用一些统计方法将文本表示转换为数字形式,例如词频-​​逆文档频率(TF-IDF)、计数向量等,但这些方法不考虑句子的含义并且只处理句子中单词的出现。

随着时间的推移,已经开发了多种语义方法,例如解析树、上下文语法、本体等,但是这些方法需要大量的人力来准备标记的训练数据。在过去几年中,计算能力的广泛可用性使得使用基于神经网络的方法来完成这些任务成为可能。

One-Hot 表示

One-hot 表示是最常用和最基本的文本表示方法之一。它涉及使用二进制编码(即 0 和 1)来表示单词。它还可以用于表示分类属性。

例如,假设数据集将颜色作为特征之一,具有三个可能的值:red、blue和green。因此,此功能将转换为三个新列,每个列对应一个颜色值,如此处所示。
  RED BLUE GREEN

1

1

0

0

2

0

1

0

3

0

0

1

例如,第一个数据点在红色列中的值为 1,在其他列中的值为 0。这意味着最初该数据点具有红色颜色列的值。红色在one-hot encoding中表示为[1 0 0],因为蓝色1占据第二个位置,绿色1在第三个位置。这是一个三维向量。one-hot 表示扩展了特征向量,因为现在每个颜色类别本身就是一个特征。

现在,当我们谈论文本句子的单热编码时,它不关心单词在句子中出现的顺序,实际上忽略了单词的语义。这种方法在语料库较小,需要用到一些传统NLP方法的场景下效果最好。

例如,按照以下步骤使用单热表示来表示文本句子。
  1. 计算语料库中存在的唯一单词的总数。
     
  2. 根据单词是否出现在句子中分配 0 或 1。
     
考虑一下“今天天空晴朗”这句话。词汇表包括 The、sky、is、clear 和 today 等词。如果用图3-1所示的单热表示法表示,它会形成一个五维向量。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍
                                                                图 3-1 One-hot 表示

计数向量

在上一节中,我们看到了如何根据单词的出现而不是它们的出现频率来生成句子的单热表示。单个句子的计数向量是根据特定单词在句子中出现的次数生成的。语料库中独特的词构成了词汇表。

例如,考虑这两个句子。
  • Sentence 1The blue bird is flying in the clear blue sky.

  • Sentence 2: The sky is clear today.

这个语料库有两个句子,词汇集 [bird, blue, flying, is, in, the, sky, clear, today] 包含九个术语。对于词汇集中的每个单词,确定其在句子中的出现频率。这样就形成了对应于该句子的计数向量。从这些代表句子的计数向量中,我们得到了计数矩阵。此处显示了两个例句的计数矩阵。
  is bird blue flying In the sky clear

today

Sentence 1

1

1

2

1

1

2

1

0

0

Sentence 2

1

0

0

0

0

1

1

1

1

矩阵中的行代表句子,列代表矩阵中对应词的词向量。矩阵的大小为 S × T,其中 S 是句子的数量,T 是术语或单词的数量。

计算句子的向量表示有助于我们完成几项任务,包括:
  • 确定句子之间的相似性

  • 查询相关文档的标识

  • 文件摘要

例如,我们展示了如何用数学方法计算句子之间的相似性。句子 1 的计数向量是 [1 1 2 1 1 2 1 0 0],句子 2 的计数向量是 [1 0 0 0 0 1 1 1 1]。可以使用以下数学表达式计算余弦相似度。

Sim=【使用 BERT 的问答系统】第 3 章 :词嵌入介绍

这里,xy是两个计数向量。|| x || 是向量x的欧几里德范数。

所以,

xy = 1x1 + 1x0 + 2x0 + 1x0 + 1x0 + 2x1 + 1x1 + 0x1 + 0x1 = 4

|| x || = 【使用 BERT 的问答系统】第 3 章 :词嵌入介绍= 3.60

|| || = 【使用 BERT 的问答系统】第 3 章 :词嵌入介绍= 2.24

Sim  =  4/ (3.6 * 2.24) = 0.49

这个计算意味着这两个句子彼此相似,相似度得分为 49% (0.49)。相似度值总是介于 0 和 1 之间,其中 1 表示最大相似度,0 表示没有相似度。

TF-IDF 向量化

one-hot representation和 count vector 方法是最基本的方法,它们实际上没有考虑特定单词在句子和语料库中的重要性。对于某些 NLP 项目(如搜索引擎),了解查询中的词对语料库中文档中的词的重要性以确定文档与该查询的相关性非常重要。一些经常出现的英语单词(例如,“is”、“the”、“a”等)将出现在所有文档中。尽管它们的数量更高,但在执行与 NLP 相关的任务时它们没有用。为了克服计数向量的这个缺点,使用了 TF-IDF。TF-IDF 是各种应用中最流行的技术之一,因为它能够对一般出现频率更高的词进行加权。

在 TF-IDF 中,我们以类似于之前方法的方式形成词汇表。词汇表由整个语料库中的独特单词组成。现在计算词汇集中每个单词的词频。单词或术语 t 的词频 (TF) 对应于它在文档 d 中所有出现的次数与文档中的术语数。

TF =(术语 t 在文档中出现的次数 / 文档中的术语数)

我们通过计算出现该术语的文档的数量来计算逆文档频率 (IDF) 。IDF 告诉我们一个术语或单词提供了多少信息。它会告诉您某个词是否在所有文档中通用。IDF 是文档总数与出现术语 t 的文档数之比的对数值。

IDF = log(N/n) 其中 N 是语料库中的文档总数,n 是出现术语 t 的文档数

TF-IDF 是 TF 和 IDF 的产物。

TF-IDF (t, document) = TF (t, document) * IDF(t)

例如,我们使用前面的两个例句,其中句子 1 和句子 2 对应两个文档。

句子 1 中单词“blue”的 TF = 2

IDF = log (2/1) = 0.3

句子 1 中单词“blue”的 TF-IDF = 2*0.3 = 0.6

类似地,句子 2 中单词“is”的 TF-IDF 值为 0,因为它的 IDF 分数为 0。这表示单词“is”没有任何重要性,因为它在所有文档中都很常见并且存在。

TF-IDF 、计数向量和单热编码等方法易于计算,但它们无法捕获文档中的语义(或单词出现的顺序)。使用这些方法表示的单词或句子不提供任何上下文信息。尽管可以使用它们执行许多 NLP 任务,但总体结果很一般,尤其是在训练数据稀疏的情况下。因此,需要一种更好的技术来捕获有用的语言信息,同时提高几乎所有 NLP 问题的泛化和性能。

在下一节中,我们将讨论一种这样的方法,即词嵌入,其中词的向量表示包含上下文信息。

什么是词嵌入?

词嵌入是一种词表示,其中词被嵌入到实数向量中。嵌入可以通过神经网络、概率模型或单词共现矩阵的降维等方法生成,如图3-2所示。它们使ML 算法能够理解具有相似含义的词。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍
                                                                图 3-2  词嵌入

 与one-hot表示相比,词嵌入通常是低维(通常是 50-600 维)和密集的单词或句子表示 。当使用 one-hot representation 时,特征向量随着词汇集的大小而增加。另一方面,词嵌入更有效。他们有概括的能力。语义相似的词更有可能具有相似的向量表示。因此,与单热表示相比,这些向量在用于 NLP 任务(例如文档摘要、句子或文档相似性等)时将为您提供更相关的结果。

词嵌入也称为分布式表示或分布式语义模型或​​语义向量空间。这里的“语义”一词突出了词嵌入的意义,因为它旨在将具有相似含义的词归类在一起。例如,网球、足球和游泳等运动应该放在靠近的地方,而与动物有关的词应该远离这些词。从更广泛的意义上说,词嵌入将创建与运动相关的词的向量表示,这些词将远离动物词的向量表示。主要目标是让具有相似上下文的单词占据最近的空间位置。

嵌入通常是在较低维度上确实表示单词的向量。神经网络目前也被用于生成词嵌入。它提高了从最后一组文本数据中学习或概括表示的能力。神经网络模型可以学习词汇集中单词的足智多谋的特征,同时减少文本数据的维度。事实证明,词嵌入在 NLP 任务、文本分类、文档聚类等方面非常有用。有多种神经网络词嵌入模型可用,例如 Word2vec、GloVe、ELMo 和 BERT,其中 BERT 已被证明是目前最先进的 NLP 任务的最佳选择。

词嵌入的不同方法

有不同的方法来生成词嵌入,它们的实现方法也不同。接下来我们详细讨论其中的一些。

Word2vec

Word2vec是一种浅层的双层神经网络词嵌入技术,其中词在向量空间中表示。在输入层和输出层之间只有一个隐藏层的神经网络被称为浅层神经网络。Word2vec 是一个双层网络,具有一个输入层、一个隐藏层和一个输出层。它以文本语料库作为输入,并给出一组向量作为输出。特征向量表示语料库中的单词。表示单词的向量称为神经词嵌入。

这种向量表示维护了文档或语料库中单词之间的语义关系。具有相似含义的词将在向量空间中彼此非常靠近,而不同的词则位于很远的地方。语义关系是通过 Word2vec 重建单词的语言上下文来实现的。语言语境可以理解为句子的主要目的。例如,在“What date is today?”这句话中,一个人想知道今天的日期,这实际上是句子的上下文。主要上下文可以通过语言周围的单词和句子来揭示。当给定足够的文本语料库时,可以借助 Word2vec 准确地猜测一个词与其他词的关联。

Word2vec 能够针对输入文本数据中的相邻单词训练单词。它可以通过两种方式实现:连续词袋(CBOW)和skip gram。这是用于创建词嵌入表示的 Word2vec 的两个实现。在 CBOW 中,上下文用于预测目标词,而在 skip gram 中,一个词用于预测目标上下文。

Continuous Bag of Words

CBOW架构 尝试使用上下文窗口词来预测目标词。中心词或目标词是在周围词或源上下文词的帮助下预测的。Word2vec 模型是无监督模型,这意味着我们只需要提供输入语料库而不需要任何关于输出的额外信息。为了获得 CBOW 词嵌入,该模型遵循监督分类方法,将语料库作为输入 X 并预测目标词 Y。

神经网络的输入将是给定窗口大小的上下文词的单热编码向量之和。对数损失函数将用作损失函数。

【使用 BERT 的问答系统】第 3 章 :词嵌入介绍

最后一层使用softmax 函数作为激活函数。这将为您提供所有单词的概率分布。此处显示了 softmax 函数的方程式:
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍

例如,考虑“这幅美丽的画属于伊丽莎白女王”这句话。以下是考虑上下文窗口大小为 2 的训练数据的一些示例。
  • [(painting, belongs), Queen Elizabeth]

  • [(This, beautiful), painting].

输入层将具有上下文词(即“This”和“beautiful”)的单热表示,输出层将显示语料库中所有词的概率分布,其中词“painting”的概率得分为最高的一个。

3-3显示了 Word2vec嵌入 的两种变体的架构。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍
                                图 3-3 CBOW 和 skip-gram模型的架构

Skip Gram Model

skip gram 模型是一种无 监督学习技术,它可以在目标词周围找到最相关的词。在这种情况下,使用目标词来预测词。它与 CBOW 方法相反。这里目标词是输入,上下文词是输出。这是一项相对困难的技术,因为要预测不止一个上下文词。如 skip-gram 模型架构(图3-3)所示,输入是目标词 W(t),输出是上下文词的向量表示。

这通常是按照以下方法计算的。该输入向量与权重矩阵之间的点积由一个隐藏层获得。类似地,在输出层中,计算隐藏层的输出向量与输出层的权重矩阵之间的点积。然后使用 softmax 激活函数计算 W(t) 上下文中单词 to 的概率。

隐藏层是权重矩阵,其中行对输出词有贡献。例如,如果权重矩阵是 4 × 4 维并且输入是一个单热编码词,那么将从与输入向量中的行对应的矩阵中选择一行。

[0 0 1 0] × 【使用 BERT 的问答系统】第 3 章 :词嵌入介绍 = [6 15 3 2]

这个词向量是在隐藏层被馈送到输出层之后得到的,它产生一个介于 0 和 1 之间的输出。输出层是一个 softmax 回归分类器,它给出了输出词在输入附近的那个上下文位置 的概率目标词。

3-4显示了使用 skip gram 进行词嵌入的示例。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍

                                                                 图 3-4 神经网络架构

GloVe

GloVe(全局向量) 是一种无监督技术,用于全局语料库中单词的向量表示。词向量是通过考虑语料库的全局和局部统计信息而获得的。局部统计对应于单词的局部上下文信息,而全局统计由单词共现捕获。

尽管 Word2vec 的性能相当令人满意,但仍然需要一种更好的方法,因为 Word2vec 只考虑周围的词,有时可能无法捕捉到一个词与其他词之间的有用关系。在 Word2vec 的情况下学习的语义仅依赖于本地信息并受相邻单词的影响。另一方面,在 GloVe 中,可以借助整个语料库的结构来获取单词的含义。这构成了词频和共现计数。该模型主要依赖于直觉,即单词到单词的共现概率有助于编码某种形式的含义,使其比 Word2vec 具有额外的优势。

GloVe 训练这些聚合的全局词-词共现统计数据并最小化最小二乘误差。这导致词向量空间的有意义的线性子结构。例如,“man”和“woman”在描述人的上下文中相似,但这两个词也是相反的。为了尽可能多地捕捉这两个词指定的含义,我们需要更大的信息语料库。这两个词之间的区别是基于性别的,性别可以由其他词对指定,如 husband-wife、brother-sister 等。

Sentence Embeddings

词嵌入 通过仅考虑相邻词而不是其他句子来生成词的向量表示。为了捕捉句子之间的关系,句子嵌入是最好的方法。这些是文档中句子的向量表示。句子嵌入模型是必不可少的,因为它们能够捕获词嵌入模型无法捕获的上下文信息。如前所述,词嵌入表示句子或对话中词的含义。它们是单词在 N 维向量空间中的表示。然而,这些方法往往会忽略必要的信息,如以下示例中所述。

两个句子可以具有相同的表示但含义完全不同。例如:
  • Sentence 1: The sky is clear not cloudy today.

  • Sentence 2: The sky is cloudy not clear today.

这里,句子 1 和句子 2 具有相似的表示,但它们的含义完全不同。词嵌入将无法区分这两个句子,因为这些句子中出现的词的向量表示几乎相同。句子嵌入可用于实现这种区分。

在 ML 管道中处理文本数据时,我们确实遇到了计算句子嵌入的需要,以便我们能够将完整的句子嵌入到向量空间中。句子嵌入可以捕捉句子、段落、文档之间的语义相似性或相关性。

一个句子的句子嵌入可能看起来像:这个
  • “The bird is flying in sky.” – [0.1, 0.7,0.4, …]

要为一个句子生成句子嵌入,最基本的方法是对该句子中出现的所有单词进行平均词嵌入。

可以使用词嵌入的加权平均来获得句子嵌入并降低维度。除了这种方法之外,还引入了其他方法,例如 Universal Sentence Encoder 和 ELMo,这些方法已被证明对 NLP 相关任务 非常有用。

ELMo

ELMo (Embeddings from Language Models) 是一种深度语境化词嵌入。它由艾伦人工智能研究所于 2018 年开发。ELMo 使用深度双向 LSTM 模型来创建单词表示。双层双向语言模型的内部状态计算嵌入。它能够捕获句子中单词不断变化的上下文含义,如图3-5所示。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍
                                                图 3-5  ELMo架构

与 Word2vec 不同,ELMo 在使用它们的上下文中分析单词。它不会为单词字典创建向量;相反,向量是通过将文本传递给深度学习模型来创建的。单词的表示取决于传递给模型的整个句子语料库。它不为每个单词使用固定的嵌入;相反,在将嵌入分配给一个词之前,先查看整个句子。它能够理解一个词的含义以及它所在的上下文。因此,它能够连同上下文信息一起捕捉意义。与单词相关的上下文信息可能因使用该单词的句子而异。这使它比 Word2vec 和 GloVe 更具优势。预训练语言嵌入,当添加到现有模型时,

ELMo 是基于字符的:它以字符而不是单词作为输入,这使它能够为训练 期间未见过的单词计算有意义的表示。当在大型数据集上训练时,它还能够学习语言模式,这有利于与 NLU 相关的任务,例如确定短语中的下一个单词。例如,在短语“The weather is cloudy today, it might ......”中,“rain”这个词比“dog”更有可能出现。该模型在此类场景中非常有用,可以根据上下文找到最可能的词,如图3-6所示。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍
                                图 3-6  ELMo 对“blue”这个词的具体表示

ELMo模型 是一个相当复杂的神经语言模型,它试图在给定一些先前看到的单词历史的情况下计算一个单词的概率。ELMo架构(参考图3-5) 有一个双层双向 LSTM 作为它的骨干。这种双层双向 LSTM 模型有助于模型理解句子中的下一个词和前一个词。第一层和第二层通过残差连接连接,残差连接可以跳过一个或多个层,因为该层馈入下一层并直接进入层跳跃。它们用于使更深层次的网络更易于优化。在 ELMo 语言模型中,每个标记都使用字符嵌入转换为适当的表示形式。我们使用一维 CNN 获得这些字符级嵌入以获得单词的数字表示。即使对于不在词汇集中的单词,这也允许有效表示。然后使用各种数量和类型的过滤器将其通过卷积层。最后,在作为输入传递给 LSTM 层之前,它会通过一个两层高速公路网络。这种高速公路网络可以通过输入更顺畅地传输信息。这些对输入标记的转换允许选择形态特征、n-gram 特征等。这有助于建立一个强大的句子表示。

假设我们正在查看输入中的第 i 个词。以图3-5为参考,单词“blue”的 ELMo 表示是转换后的单词表示 x i以及两个双向表示 h 1i和 h 2i的输出的组合。函数 f 对输入执行以下操作。

ELMo i task = γi . (s0 task . xi + s1 task . h1, i + s2 task . h2, k)

这里,γ i 和sk是在特定任务模型中学习的权重因子。因此,当我们使用 ELMo 时,我们冻结权重,然后将每个标记的 ELMo i 任务连接到输入表示 。

通用句子编码器

最近推出了Universal Sentence Encoder ,它已成为最流行的句子嵌入预训练模型之一。它能够将句子转换为向量表示。这种通用的句子嵌入模型可以学习丰富的语义信息,从而使用迁移学习,通过重新训练架构的最后一层,可以从其他任务中学习句子表示。

该句子编码器模型可用于各种 NLU 任务。编码器使用的 Transformer 网络是在一个大的、变化多端的数据语料库上训练的。输入文本(可以是句子、短语或短段落)被编码为高维向量。这里,输入长度可以是可变的,但输出是一个 512 维向量。这可以为文本分类、聚类、语义相似性等广泛的下游任务生成句子嵌入。

这些模型的多个版本和实现已由 Google 使用 TensorFlow 训练,可在 TensorFlow Hub 上获得供 ML 工程师使用,包括这些。
  • universal-sentence-encoder-large

  • universal-sentence-encoder-lite

  • universal-sentence-encoder-multilingual

  • universal-sentence-encoder-multilingual-large

  • universal-sentence-encoder-multilingual-qa

来自 Transformers 的双向编码器表示

Google 的研究人员介绍了来自 Transformers (BERT) 的双向编码器表示。用于语言建模的双向转换器使得 BERT 在各种 NLP 任务以及问答中得到广泛应用。这使得它不同于以前的模型,在以前的模型中,序列只在一个方向上拍摄,从左到右或从右到左。

双向编码器采用两个序列进行编码,其中一个是正常序列,另一个是它的反序列。它由两个编码器组成,用于对两个序列进行编码。对于最终输出,两种编码结果都被考虑在内。语言模型的双向训练让他们更深入地了解语言的上下文。如图3-7所示,它对于理解文本的含义确实很重要。

例如,考虑以下两个句子:
  • Sentence 1: I got scared on seeing a bat flying in my room.

  • Sentence 2: The player held the bat firmly while smashing a ball with it.

在这里,“蝙蝠”一词在两个句子中具有不同的含义,具体取决于语言上下文。如果我们从两个方向来处理这个句子,就会更好地理解这一点。如果我们只朝一个方向移动,我们可能会错过有用的信息,也可能无法正确获取含义。BERT 同时考虑前后上下文,这减少了在做出任何预测之前出错的可能性。在训练时从两个方向收集信息,并且来自两个方向的上下文在所有层*同调节。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍
                                                                        图 3-7  BERT架构
预训练的 BERT 模型只需修改输出层即可用于各种最先进的任务。它不需要任何特定于任务的架构更改。它使用转换器来掌握文本中标记或单词的关系。变压器包括编码器和解码器。编码器读取输入文本,解码器帮助生成任务预测。Transformer 编码器能够一次读取整个单词序列,而不是从左到右依次读取。这使得模型是双向的,并允许它从单词或标记的左右两侧学习上下文。输入到转换器的令牌序列被嵌入到向量中,然后向量在神经网络中进一步处理。网络的输出是输入token对应的向量序列,如图3-8所示。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍

                                                         图 3-8  BERT变压器

BERT 使用两种策略来超越单向约束。BERT 在这两个 NLP 任务上进行了预训练:掩码语言建模 (MLM)和下一句预测 (NSP)。MLM 通过从输入文本中随机屏蔽标记来协助预训练双向变换器,而 NSP 任务联合预训练文本对表示。BERT 在训练期间最小化这两个任务的组合损失函数。

要使用 BERT,需要遵循两个阶段:
  1. 预训练:在此步骤中,模型通过不同的预训练任务在未标记数据上进行训练。
     
  2. 微调  BERT 模型使用预训练参数进行初始化,然后使用来自下游任务的数据进行微调,这些任务可能是分类、问答等。
     

BERT模型有两种实现,BERT基础模型和BERT大模型。

BERT Base Model

BERT基础模型 是一个预训练的 BERT 模型,有 12 个层或 transformer 块,每层有 768 个隐藏单元,1.1 亿个参数。根据训练的英文文本(cased 或 uncased),它可以进一步分为 BERT base-cased 和 BERT base-uncased,如图3-9所示。
【使用 BERT 的问答系统】第 3 章 :词嵌入介绍
                                图 3-9  BERT 基础和 BERT 大型模型

BERT Large Model

BERT Large Model 是预训练的 BERT 模型,有 24 层或 transformer 块,每层有 1,024 个隐藏单元,有 3.4 亿个参数。它还可以进一步分为 BERT large-cased 和 BERT large-uncased。该模型比 BERT base 需要更多的内存。

结论

本章介绍了word embeddings、sentence embeddings,以及它们的不同实现方式,如Word2vec、GloVe、Universal Sentence Encoder等。我们还讨论了 BERT 及其变体(即基本模型和大型模型)。在下一章中,我们将更深入地研究 BERT 及其不同的实现。