「X」Embedding in NLP|Token 和 N-Gram、Bag-of-Words 模型释义

2023-12-10 12:15

本文主要是介绍「X」Embedding in NLP|Token 和 N-Gram、Bag-of-Words 模型释义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

7f1254b4119b6ed471b2751af1331195.png

ChatGPT(GPT-3.5)和其他大型语言模型(Pi、Claude、Bard 等)凭何火爆全球?这些语言模型的运作原理是什么?为什么它们在所训练的任务上表现如此出色?

虽然没有人可以给出完整的答案,但了解自然语言处理的一些基本概念有助于我们了解 LLM 内在工作原理。尤其是了解 Token 和 N-gram 对于理解几乎所有当前自回归和自编码模型都十分重要。本文为“「X」Embedding in NLP”的进阶版,将带大家详解 NLP 的核心基础!

01.

Token 和 N-gram

在 C/C++ 的入门计算机科学课程中,通常很早就会教授字符串的概念。例如,C 语言中的字符串可以表示为以空字符终止的字符数组:

char my_str[128] = "Milvus";

在这个例子中,每个字符都可以被视为一个离散单位,将它们组合在一起就形成了有意义的文本——在这种情况下,my_str表示了世界上最广泛采用的向量数据库。

简单来说,这就是 N-gram 的定义:一系列字符(或下一段讨论的其他离散单位),当它们连在一起时,具有连贯的意义。在这个实例中,N 对应于字符串中的字符总数(在这个例子是 7)。

n-gram 的概念不必局限于单个字符——它们也可以扩展到单词。例如,下面的字符串是一个三元组(3-gram)的单词:

char my_str[128] = "Milvus vector database"

在上面的例子中,很明显my_str是由三个单词组成的,但一旦考虑到标点符号,情况就变得有些复杂:

char my_str[128] = "Milvus's architecture is unparalleled"

上面的字符串,严格来说,是四个单词,但第一个单词Milvus's是使用另一个单词Milvus作为基础的所有格名词。对于语言模型来说,将类似单词分割成离散的单位是有意义的,这样就可以保留额外的上下文:Milvus和's。这些被称为 Token,将句子分割成单词的基本方法称为标记化(Tokenization)。采用这种策略,上述字符串现在是一个由 5 个 Token 组成的 5-gram。

所有现代语言模型在数据转换之前都会进行某种形式的输入标记化。市面上有许多不同的标记器——例如,WordPiece (https://static.googleusercontent.com/media/research.google.com/ja//pubs/archive/37842.pdf)是一个流行的标记器,它被用在大多数 BERT 的变体中。在这个系列中我们没有过多深入标记器的细节——对于想要了解更多的人来说,可以查看 Huggingface的标记器总结(https://huggingface.co/docs/transformers/main/tokenizer_summary)。

02.

N-gram 模型

接下来,我们可以将注意力转向 N-gram 模型。简单来说,N-gram 模型是一种简单的概率语言模型,它输出一个特定 Token 在现有 Token 串之后出现的概率。例如,我们可以建模一个特定 Token 在句子或短语中跟随另一个Token(∣)的概率(p):

ccf33f7764bb8fa0dcd1500c48d17cb6.png

上述声明表明,在这个特定的语言模型中,“vector”这个词跟在“database”这个词后面的概率为 10%。对于 N-gram 模型,这些模型总是通过查看输入文档语料库中的双词组的数量来计算,但在其他语言模型中,它们可以手动设置或从机器学习模型的输出中获取。

上面的例子是一个双词模型,但我们可以将其扩展到任意长度的序列。以下是一个三元组的例子:

003d009c4ead6db75c0ee1b45c8f3369.png

这表明“database”这个词将以 90% 的概率跟在“Milvus vector”这两个 Token 之后。同样,我们可以写成:

c2c830a67576aeb06fccdbfd6ce06403.png

这表明在“Milvus vector”之后出现的词不太可能是“chocolate”(确切地说,概率为0.1%)。将这个应用到更长的序列上:

8f2e1c38a7b681f12b189e3b8ddb2527.png

接下来讨论一个可能更重要的问题:我们如何计算这些概率?简单而直接的答案是:我们计算文档或文档语料库中出现的次数。我将通过以下 3 个短语的例子来逐步解释(每个句子开头的代表特殊的句子开始标记)。为了清晰起见,我还在每个句子的结尾句号和前一个词之间增加了额外的空格:

  • <S> Milvus是最广泛采用的向量数据库。

  • <S> 使用Milvus进行向量搜索。

  • <S> Milvus很棒。

列出以<S>、Milvus或vector开头的双词组:

some_bigrams = {these bigrams begin with <S>("<S>", "Milvus"): 2,("<S>", "vector"): 1,these bigrams begin with Milvus("Milvus", "is"): 1,("Milvus", "."): 1,("Milvus", "rocks"): 1,these bigrams begin with vector("vector", "database"): 1,("vector", "search"): 1
}

根据这些出现的情况,可以通过对每个 Token 出现的总次数进行规范化来计算概率。例如:

bbd07b65a906b5c514fec90cbc06f567.png

类似:

f4c07f2b598b223cb5fc3e9c8c02c8ec.png

有了这些知识,我们就可以编写一些代码来构建一个双词模型。为了简单起见,我们假设所有输入文档中的每个 Token 都由一些空白字符分隔(回想一下前面的部分,现代标记器通常有更复杂的规则)。让我们从定义模型本身开始,即双词计数和 Token 计数:

from typing import Dict, Tuple
from collections import defaultdict
#keys correspond to tokensvalues are the number of occurences
token_counts = defaultdict(int)#keys correspond to 2-tuples bigram pairsvalues are the number of occurences
bigram_counts = defaultdict(int)def build_bigram_model(corpus):"""Bigram model.  """#loop through all documents in the corpusfor doc in corpus:prev = "<S>"for word in doc.split():#update token countstoken_counts[word] += 1#update bigram countsbigram = (prev, word)bigram_counts[bigram] += 1prev = word#add a dummy end-of-sequence token so probabilities add to onebigram_counts[(word, "</S>")] += 1return (token_counts, bigram_counts)def bigram_probability(bigram: Tuple[str]):"""Computes the likelihood of the bigram from the corpus.  """return bigram_counts[bigram] / token_counts[bigram[0]]

然后,build_bigram_model会遍历整个文档语料库,先按空白字符分割每个文档,再存储双词组和 Token 计数。然后,我们可以调用bigram_probability函数,该函数查找相应的双词组计数和 Token 计数,并返回比率。

我们在 Milvus 的文档上测试这个模型,大家可以在此(https://raw.githubusercontent.com/milvus-io/milvus/master/README.md)下载文档,并尝试上面的代码。

with open("README.md", "r") as f:build_bigram_model([f.read()])print(bigram_probability(("vector", "database")))
0.3333333333333333

03.

词袋模型

除了 N-gram,另一个值得讨论的是词袋模型(BoW)。词袋模型将文档或文档语料库表示为一个无序的 Token 集合——从这个意义上说,它保持了每个 Token 出现的频率,但忽略了它们在每个文档中出现的顺序。因此,BoW 模型中的整个文档可以转换为稀疏向量,其中向量的每个条目对应于文档中特定单词出现的频率。在这里,我们将文档“Milvus 是最广泛采用的向量数据库。使用 Milvus 进行向量搜索很容易。”表示为一个 BoW稀疏向量:

limited vocabularybow_vector = [   0, # a    1, # adopted    0, # bag    0, # book    0, # coordinate    1, # database    1, # easy    0, # fantastic    0, # good    0, # great    2, # is    0, # juggle    2, # Milvus    1, # most    0, # never    0, # proof    0, # quotient    0, # ratio    0, # rectify    1, # search    1, # the    0, # undulate    2, # vector    1, # widely    1, # with    0, # yes    0, # zebra]

这些稀疏向量随后可以用于各种 NLP 任务,如文本和情感分类。关于词袋模型的训练和推理学习可参考 Jason Brownlee的博客(https://machinelearningmastery.com/gentle-introduction-bag-words-model/)。

虽然词袋模型易于理解和使用,但它们有明显的局限性,即无法捕捉上下文或单个 Token 的语义含义,这意味着它们不适合用于最简单的任务之外的任何事情。

04.

总结

在这篇文章中,我们讨论了自然语言处理的三个核心基础:标记化(Tokenization)、N-gram 和词袋模型。围绕 N-gram 的概念有助于后续了解关于自回归和自编码模型的训练方式。在下一个教程中,我们将分析“现代”NLP,即循环网络和文本 embedding。敬请期待!

本文作者

c8e6aaa130230456e67f0a9a113c0f1a.jpeg

Frank Liu
Zilliz 运营总监(US)、机器学习架构师

推荐阅读

769f10c71d3ccb88c8ff3507b96a47af.png

8a58cefe987161a7248ba05f11d86139.jpeg

6501abc2de176d771133a9ccbbf0cbc8.png

这篇关于「X」Embedding in NLP|Token 和 N-Gram、Bag-of-Words 模型释义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/477091

相关文章

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU