第2章 词元和嵌入
Q9:大模型的分词器和传统的中文分词有什么区别?对于一个指定的词表,一句话是不是只有一种唯一的分词方式?
A9: 大模型的分词器(Tokenizer)与传统的中文分词在目标、方法和结果上都有显著区别。
传统中文分词:
- 目标: 主要目标是将连续的汉字序列切分成具有明确语义的词语单元,服务于搜索引擎、机器翻译、情感分析等下游任务。分词的准确性直接影响这些任务的效果。
- 方法: 多基于词典和统计模型。常见方法有:
- 基于词典的最大匹配法: 正向、逆向或双向最大匹配,试图从词典中找到最长的匹配词。
- 基于统计的方法: 如隐马尔可夫模型(HMM)、条件随机场(CRF)等,通过学习大量已分词语料的统计规律来进行分词。
- 结果: 通常追求唯一且“正确”的分词结果,符合人类语言习惯和词典定义。
大模型的分词器:
- 目标: 主要目标是将文本转换成模型能够处理的数字序列(即词元 ID 序列)。其核心在于构建一个固定大小的词汇表(Vocabulary),并将输入文本映射到这个词汇表中的词元上。分词的粒度不一定追求语义上的完整性,更侧重于模型的学习效率和表达能力。
- 方法: 主流大模型多采用基于子词(Subword)的分词算法,如:
- 字节对编码 (Byte Pair Encoding, BPE): 从字符级别开始,迭代地合并最高频的字节对,直到达到预设的词汇表大小。
- WordPiece: 类似于 BPE,但合并标准是基于最大化语言模型的似然性。
- Unigram Language Model: 从一个包含所有可能子词的初始词汇表开始,迭代地移除对整体语言模型损失影响最小的词元,直到达到预设的词汇表大小。
- SentencePiece: 将句子视为一个整体,直接在原始文本上操作,不依赖预分词,可以处理多种语言,并将空格也视为一种特殊字符。
- 结果:
- 开放词汇表 (Open Vocabulary): 通过子词组合,能够表示几乎所有词语,包括未登录词(Out-Of-Vocabulary, OOV),有效解决了OOV问题。
- 可变粒度: 高频词可能被完整保留为一个词元,低频词或生僻词则可能被拆分成多个子词词元。
- 数据驱动: 分词方式高度依赖于训练语料的统计特性。
对于一个指定的词表,一句话是不是只有一种唯一的分词方式?
- 传统中文分词: 对于很多基于规则或最大匹配的传统分词方法,如果词典和规则固定,那么对于一句话,其分词结果通常是唯一的(或者在有歧义处理规则的情况下,最终会倾向于一种“最优”解)。然而,一些统计模型可能会因为内部概率计算的细微差别或解码策略(如维特比解码的不同路径选择)导致在极少数情况下有不同的结果,但目标仍然是找到最可能的那一种。
- 大模型的分词器: 对于基于 BPE、WordPiece 等贪心算法的分词器,给定固定的词表和合并规则,对于一句话,其分词方式通常是唯一且确定的。算法会按照固定的合并顺序进行操作。例如,BPE 会贪婪地合并频率最高的字节对。SentencePiece 等工具在训练好模型后,其分词过程也是确定性的。
总结来说:
- 目标不同: 传统分词追求语义单元,大模型分词追求模型处理效率和覆盖率。
- 方法不同: 传统分词多依赖词典和规则,大模型分词多采用数据驱动的子词算法。
- OOV处理: 传统分词对OOV敏感,大模型分词通过子词能很好地处理OOV。
- 唯一性: 对于给定的词表和算法,大模型的分词方式通常是确定的;传统分词在理想情况下也是确定的,但歧义处理可能引入复杂性。
Q10:为什么传统 BM25 检索对中文分词的质量很敏感,而大模型对分词器的选取不敏感?
A10: 这个问题的核心在于两种技术处理文本和信息匹配的方式不同。
传统 BM25 检索对中文分词质量敏感的原因:
- 基于词袋模型和精确匹配: BM25 (Best Matching 25) 是一种基于词袋模型的算法。它计算查询(Query)中的词和文档(Document)中的词之间的匹配度。对于中文这种缺乏自然分隔符的语言,分词是预处理的第一步,也是至关重要的一步。分词的质量直接决定了后续匹配的“词”是什么。
- 分词错误导致匹配失败:
- 分词过细(Over-segmentation): 如果一个有意义的词被错误地切分成多个更小的单元(例如,“搜索引擎”被分成“搜索”和“引擎”),而用户查询的是“搜索引擎”,那么BM25可能无法直接匹配,或者降低了这个词的权重。
- 分词过粗(Under-segmentation): 如果多个独立的词被错误地合并成一个词(例如,“上海大学”被错误地当成一个不可分割的单位,而用户查询“上海”或“大学”),同样会导致匹配失败或不准确。
- 歧义分词: 中文存在大量分词歧义(如“发展中国家”可以理解为“发展-中国家”或“发展中-国家”),不同的分词结果会产生完全不同的词项,直接影响BM25的计算。
- 依赖词频统计: BM25依赖词频(Term Frequency, TF)和逆文档频率(Inverse Document Frequency, IDF)。错误的分词会导致TF和IDF统计失准,进而影响文档的相关性排序。
- 缺乏语义理解: BM25主要进行的是词汇层面的匹配,它不理解词语的深层语义。因此,分词的准确性是它能够正确“看到”文本中词汇单元的前提。
大模型对分词器选取不敏感的原因:
- 子词分词与OOV处理: 大模型普遍采用子词(Subword)分词算法(如BPE, WordPiece, SentencePiece)。这种方法可以将任何文本(包括未登录词、罕见词、甚至拼写错误)切分成已知的子词单元。这意味着即使分词器选择略有不同,或者某个词的切分方式有差异,模型仍然能通过子词的组合来理解和表示这个词。它不是刚性地依赖于“词典中必须存在这个词”。
- 上下文相关的嵌入表示: 大模型的核心优势在于其能够生成上下文相关的词嵌入(Contextual Embeddings)。一个词(或子词)的表示不再是固定的,而是根据其在句子中的具体语境动态生成的。这意味着即使分词结果在表面上有所不同(比如“机器学习”被分为“机器”和“学习”,或者直接是一个整体),模型通过其强大的上下文理解能力,依然能够捕捉到相似的语义信息。
- 端到端学习: 大模型通常是端到端学习的,分词器本身可以看作是模型的一部分,或者其参数是在预训练阶段与模型主体一同优化的(或者至少分词策略是为模型优化的)。模型在训练过程中已经适应了特定分词器产生的词元序列,并学会了如何从这些序列中提取意义。
- 强大的语义理解能力: Transformer等架构赋予了大模型强大的语义理解和模式识别能力。它们能够超越表面的词汇匹配,理解更深层次的语义关联。即使分词粒度有差异,只要核心语义信息能够通过子词序列传递给模型,模型就有能力进行有效的处理和理解。
- 对噪声的鲁棒性: 由于子词的存在和上下文嵌入,大模型对输入文本的一些“噪声”(如轻微的分词差异、甚至一些拼写错误)具有更强的鲁棒性。它不像BM25那样,一个分词错误就可能导致关键信息的丢失。
总结:
- BM25: 强依赖于高质量的、符合语义单元的中文分词,分词是其有效性的基石。分词错误直接破坏了其匹配机制。
- 大模型: 通过子词分词解决了OOV问题,并通过上下文相关的嵌入和强大的语义理解能力,使其对分词器的具体选择和分词结果的细微差异不那么敏感。模型更关注的是从词元序列中学习到的整体语义表示,而不是单个“词”的精确边界。
因此,虽然为特定语言(如中文)优化分词器对大模型性能仍有益处(例如提高效率、更精确地表达特定领域术语),但其敏感度远低于传统依赖精确词匹配的检索算法。
Q11:GPT-4、Llama 等现代大模型采用的字节级 BPE 分词器相比传统的 BPE 分词器有什么优点?
A11: GPT-4、Llama等现代大模型采用的字节级BPE(Byte-level Byte Pair Encoding)分词器,相比传统的基于字符或预定义词典的BPE分词器,具有以下显著优点:
-
完全消除未登录词(OOV)问题:
- 传统BPE: 传统BPE通常在预处理后的文本上操作,例如,先将文本按空格分开,或者基于Unicode字符进行。如果训练数据中未覆盖某些字符或罕见词的组合,它们仍然可能成为OOV。对于多语言场景,需要维护巨大的字符集。
- 字节级BPE: 直接在原始字节流上操作。任何文本,无论何种语言、是否包含特殊符号、表情符号、甚至代码,最终都可以表示为字节序列(通常是UTF-8字节序列)。由于字节的种类是有限的(256种),字节级BPE的初始词汇表就是这256个字节。通过字节对的合并,它可以构建出覆盖任何输入文本的词元,从而从根本上消除了OOV问题。模型不再会遇到它完全不认识的“字符”或“片段”。
-
无需预分词或文本规范化:
- 传统BPE: 可能需要对文本进行预处理,如大小写转换、去除标点、处理空格等。这些预处理步骤可能引入偏见,并且对于不同语言需要不同的规则。
- 字节级BPE: 直接处理原始字节,无需复杂的预处理。这意味着模型可以学习到更原始的文本特征,包括大小写、标点符号等信息,这些信息有时也包含语义。例如,它可以区分"Apple"(公司)和"apple"(水果)如果它们在字节层面有不同的表示且模型学会了这种区分。
-
天然的多语言支持和鲁棒性:
- 传统BPE: 为支持多语言,往往需要构建非常大的初始字符集或混合多种语言的词汇表,管理复杂且效率可能不高。
- 字节级BPE: 由于所有语言的文本最终都表现为字节序列,字节级BPE天然地支持所有语言,无需为每种语言定制分词器。它对文本中的噪声(如编码错误导致的乱码片段、非标准字符)也更鲁棒,因为这些噪声仍然是字节序列,可以被分解成已知的字节或字节组合词元。
-
更细致的子词粒度,有助于罕见词和形态变化:
- 字节级BPE可以将词切分到非常细的粒度(单个字节),这对于处理罕见词、专有名词、以及语言中复杂的形态变化(如德语的复合词、芬兰语的格变化)非常有利。模型可以通过组合这些细粒度的字节级子词来理解和生成这些复杂结构。
-
词汇表大小与覆盖范围的权衡更优:
- 传统BPE为了覆盖更多词汇,可能需要非常大的词汇表。而字节级BPE可以用相对较小的词汇表(例如几万到几十万个词元)就能有效覆盖几乎所有可能的文本输入,因为它总能回退到字节级别。
-
简化了分词流程:
- 整个分词流程更加统一和简洁,不需要针对不同情况设计复杂的规则。
潜在的缺点或需要注意的点:
- 序列可能更长: 对于常见词,字节级BPE可能会将其分解成比字符级BPE更多的词元(例如,一个汉字UTF-8编码通常占3个字节,就可能被分为3个字节词元,除非它们经常一起出现并被合并成一个词元)。这可能导致输入序列变长,增加模型的计算负担。然而,现代大模型通常有能力处理较长的序列。
- 可解释性可能稍差: 单个字节或短字节序列的语义不如字符或词片段直观。
- 对空格的处理: 如何处理空格(是将其视为普通字节还是特殊标记)也是一个设计选择,不同的处理方式会影响分词结果。
总的来说,字节级BPE通过直接操作最基础的文本单元——字节,实现了对所有文本的无缝覆盖、强大的多语言支持和对噪声的鲁棒性,这些优点使其成为现代大规模语言模型的首选分词策略之一。
Q12:国内预训练的大模型与海外模型相比,是如何做到用相对更少的词元表达中文语料的?
A12: 国内预训练的大模型(如ChatGLM、Baichuan、Qwen等)在处理中文语料时,相比一些主要基于英文语料训练并采用通用字节级BPE的海外模型(如早期的GPT系列或Llama不经中文优化的情况),能够用相对更少的词元表达相同长度的中文文本,主要得益于以下几个方面的优化和策略:
-
针对中文优化的分词器和词汇表构建:
- 更大的中文词汇表: 国内模型在构建分词器的词汇表时,会使用大规模、高质量的中文语料进行训练。这使得词汇表中包含更多常见中文词语、成语、实体名等作为独立的词元。相比之下,一个主要在英文上训练的通用字节级BPE,遇到中文字符时,往往会将其拆分成单个字节或非常短的字节序列(因为中文字符在UTF-8中通常占2-4个字节,这些字节单独出现的频率可能不高,难以合并成完整的“词”级别词元)。
- 示例: 对于词语“人工智能”,一个针对中文优化的分词器可能直接将其视为一个词元
[“人工智能”]
。而一个通用字节级BPE,如果其训练语料中中文较少,可能会将其拆分为多个字节词元,例如[“<E4><BA><BA工智>”, “<E8><83><BD>”]
(示意,具体拆分依赖BPE合并规则) 或者更细,如[“<E4>”, “<BA>”, “<BA>”, “<E5>”, “<B7>”, “<A5>”, “<E6>”, “<99>”, “<BA>”, “<E8>”, “<83>”, “<BD>”]
(极端情况下,每个字节一个词元)。显然,前者用了1个词元,后者用了多个词元。 - 包含高频字词: 中文常用字和高频词被完整地包含在词汇表中,避免了将常用字词也打碎成更小单元的情况。
-
预训练语料的侧重:
- 国内大模型在预训练阶段使用了海量的中文原生语料。这使得分词器在学习合并规则时,能够更好地捕捉到中文的构词模式和统计特性,从而生成更符合中文表达习惯的词元集合。
-
特定分词算法的选择与调整:
- 虽然很多模型都基于BPE的变种,但具体实现和参数(如词汇表大小、合并策略)会针对目标语言进行调整。国内模型会选择或调整算法以更适合中文的特点,比如考虑中文词的边界不明显、多音字、歧义等问题(尽管子词分词在一定程度上缓解了这些)。
- 一些模型可能会结合传统中文分词的思想,或者在BPE基础上进行改进,使其更能识别中文的“词”的边界。
-
多语言模型中的语言权重:
- 即使是多语言模型,如果在预训练数据中中文语料占比较高,或者在构建词汇表时对中文语料赋予更高权重,那么生成的词汇表和分词方式也会更偏向于高效地表示中文。
带来的好处:
- 更短的序列长度: 用更少的词元表示中文,意味着输入给模型的序列长度更短。这可以降低计算成本(Transformer的计算复杂度与序列长度的平方相关),减少内存消耗,并可能加快处理速度。
- 更好的语义单元: 当词元更接近中文的自然语义单元(词)时,模型可能更容易学习到词级别的语义信息,而不是从零碎的字节或子词片段中重构。
- 提高效率上限: 在固定的上下文窗口长度限制下,更少的词元意味着可以容纳更多的实际文本信息,从而可能提升模型在长文本理解任务上的表现。
需要注意的平衡:
虽然追求用更少的词元表示中文有其优势,但也需要在压缩率和模型的泛化能力、对罕见词的处理能力之间找到平衡。过度追求词级别的完整性可能会导致词汇表过大,或者对未登录词、新词、网络用语等的处理不够灵活,这正是子词分词所要解决的问题。因此,现代中文大模型通常是在子词分词的框架下,通过上述优化手段,使其生成的子词更符合中文的特点,而不是完全回到传统的整词分词。
总而言之,国内大模型通过精心设计和训练针对中文的分词器及词汇表,并利用大量中文语料进行预训练,从而实现了对中文文本更高效的词元化表示。
Q13:大模型是如何区分聊天历史中用户说的话和 AI 说的话的?
A13: 大模型区分聊天历史中用户说的话和AI说的话,主要依赖于在输入数据中引入特殊标记(Special Tokens)或结构化格式(Structured Formats),并在模型训练时让模型学习理解这些标记或格式的含义。以下是一些常见的方法:
-
使用角色标记(Role Tokens / Speaker Tokens):
- 这是最常见和直接的方法。在每一轮对话前面或后面,插入表示说话者角色的特殊词元。
- 示例:
<|user|> 你好,今天天气怎么样? <|assistant|> 今天天气晴朗,适合出门。 <|user|> 太好了,我想去公园。
<|user|>
和<|assistant|>
(或其他类似的标记,如[USER]
,[ASSISTANT]
,Human:
,AI:
) 就是特殊词元,它们被添加到模型的词汇表中,并在训练数据中明确标识了每一段文本的来源。- 模型在预训练和微调阶段会学习到这些标记与后续文本内容之间的关联,从而理解不同角色所说的话。
-
使用分隔符标记(Separator Tokens):
- 除了角色标记,还可以使用通用的回合分隔符(Turn Separator)或消息结束标记(End-of-Message Token)来区分不同的对话轮次或消息块。
- 示例:
USER: 你好 <EOS> ASSISTANT: 你好!有什么可以帮您的吗? <EOS> USER: 帮我查一下天气 <EOS>
<EOS>
(End of Sentence/Stream) 或其他类似标记(如<|endoftext|>
GPT系列常用,</s>
Llama系列常用)可以帮助模型区分消息的边界。结合角色信息(可能通过角色标记,或者通过固定的轮流顺序隐式表示),模型可以区分对话内容。
-
结构化输入格式(如JSON或XML):
- 在一些更复杂的对话系统或需要传递元数据的场景中,可能会使用更结构化的格式来组织对话历史。
- 示例 (JSON-like):
[ {"role": "user", "content": "你好"}, {"role": "assistant", "content": "你好!有什么可以帮助你的吗?"}, {"role": "user", "content": "我想了解一下大型语言模型。"} ]
- 这种格式在输入给模型前,通常也会被转换成带有特殊标记的线性文本序列,但其原始结构有助于清晰地定义角色和内容。
-
位置嵌入(Positional Embeddings)与段落嵌入(Segment Embeddings):
- 虽然主要用于区分序列中的词元位置和不同句子(例如在BERT中用于区分句子A和句子B),但类似的思想也可以扩展。通过为不同说话者的段落分配不同的段落ID(Segment ID),并让模型学习相应的段落嵌入,理论上模型也能区分不同来源的文本。不过,显式的角色标记更为直接和常用。
-
训练数据的构建和微调:
- 无论采用哪种标记方法,关键在于训练数据。在监督微调(Supervised Fine-Tuning, SFT)阶段,模型会接触大量遵循特定对话格式的样本。模型通过学习预测AI的回复,自然而然地学会了识别和区分用户与AI的发言,并理解对话的轮转模式。
工作原理:
- 这些特殊标记在分词后会变成词汇表中的特定ID。
- 模型(尤其是Transformer架构)通过其自注意力机制(Self-Attention)能够关注到这些标记,并将它们与对话内容关联起来。
- 在生成回复时,模型知道当前的上下文是用户的提问(因为它看到了如
<|user|>
标记后的内容),因此它会生成符合AI角色的回答,并可能在生成的内容前加上<|assistant|>
标记(如果模型的训练目标包含生成这些标记)。
通过这些机制,大模型能够有效地理解和维持对话的上下文,区分不同发言者的角色,从而进行连贯和恰当的多轮对话。
Q14:大模型做工具调用的时候,输出的工具调用参数是如何与文本回复区分开来的?
A14: 大模型在进行工具调用(Function Calling / Tool Use)时,其输出的工具调用参数与普通的文本回复主要是通过预定义的结构化格式和**特殊标记(Special Tokens)**来区分的。模型被训练来在特定条件下生成这种结构化输出,而不是自由形式的文本。
以下是几种常见的方法和原理:
-
特定的输出格式约定(Structured Output Format):
- 模型被指示或微调(fine-tuned)以生成特定格式的字符串,通常是JSON对象或类似结构的文本。这个JSON对象会包含工具的名称以及需要传递给该工具的参数。
- 示例:
假设用户说:“查询北京今天的天气怎么样?”
模型可能输出的不是一句话“北京今天天气晴朗”,而是类似这样的结构:{ "tool_name": "get_weather", "arguments": { "city": "北京", "date": "today" } }
- 或者,一些系统会使用更明确的标记来包裹工具调用信息:
<function_call> { "name": "get_weather", "parameters": {"location": "北京", "unit": "celsius"} } </function_call>
- 这个结构化的输出本身就与自然语言回复(如“北京今天天气很好。”)在形式上完全不同。
-
使用特殊标记(Special Tokens):
- 类似于区分用户和AI的对话,模型可以被训练来使用特殊的词元来标识工具调用的开始、结束,或者工具名称和参数部分。
- 示例 (概念性):
<TOOL_CALL_START> get_weather(city="北京", date="today") <TOOL_CALL_END>
- 或者更细致的标记:
<|tool_code_interpreter|> print('Hello World') <|tool_code_interpreter_end|>
(类似某些模型的实际做法) - 这些特殊标记是词汇表的一部分,模型在训练中学习到在需要调用工具时生成这些标记和相应的参数。
-
通过模型的“停止序列”(Stop Sequences)或特定输出模式识别:
- 在推理(inference)时,可以配置模型在生成特定标记或模式(如上述JSON的起始括号
{
或特定工具调用标记)后停止常规的文本生成,并将后续的生成内容解析为工具调用。 - 如果模型被训练成在决定调用工具后,会先输出一个特殊的“思考”或“意图”标记,然后才输出工具调用结构,系统可以捕获这个标记。
- 在推理(inference)时,可以配置模型在生成特定标记或模式(如上述JSON的起始括号
-
微调(Fine-tuning)和指令调整(Instruction Tuning):
- 这是让模型学会区分并生成工具调用的关键。
- 数据准备: 训练数据中会包含大量样本,这些样本的输入是用户的请求,输出则可能是:
- 直接的文本回复。
- 一个明确的工具调用结构(如JSON)。
- 文本回复与工具调用的组合(较少见,通常是先调用工具,拿到结果后再生成文本回复)。
- 训练目标: 模型被训练来根据输入判断是否需要调用工具。如果需要,就生成预定义的工具调用格式;如果不需要,就生成常规的文本回复。
- 指令遵循: 通过指令调整,模型学习遵循“如果你需要调用工具X,请按Y格式输出参数”这样的指令。
-
外部逻辑或解析器:
- 模型输出后,通常会有一个外部的解析器或控制逻辑。这个解析器负责检查模型的输出:
- 如果输出是纯文本,则直接展示给用户。
- 如果输出符合预定义的工具调用格式(如能成功解析为JSON,或包含特定标记),则提取工具名称和参数,然后执行相应的工具/函数。
- 执行工具后,工具的返回结果通常会再次输入给模型(作为新的上下文),模型再根据这个结果生成最终的自然语言回复给用户。
- 模型输出后,通常会有一个外部的解析器或控制逻辑。这个解析器负责检查模型的输出:
总结:
区分工具调用参数和文本回复的核心在于**“约定”和“训练”**。
- 约定: 定义清晰的、机器可解析的格式来表示工具调用。
- 训练: 通过大量的包含工具调用场景的样本来训练模型,使其学会在适当的时候生成这种约定的格式,而不是自由文本。
这样,当模型输出时,系统可以通过检查输出是否符合这个约定的格式来判断它是一个工具调用请求还是一个普通的文本消息。
Q15:参考章节中用播放列表数据训练歌曲嵌入的案例,设计一个使用嵌入技术解决电子商务产品推荐的系统。使用什么数据作为“句子”的等价物?如何将用户行为融入嵌入模型?
A15: 参考用播放列表数据训练歌曲嵌入的案例(如Spotify的Annoy算法或Airbnb的房源嵌入),我们可以设计一个使用嵌入技术解决电子商务产品推荐的系统。核心思想是将产品视为“词”,将用户的行为序列或共同出现在某种上下文的产品集合视为“句子”。
1. 使用什么数据作为“句子”的等价物?
在电子商务场景中,以下数据可以作为“句子”的等价物,用于学习产品嵌入:
- 用户购买序列 (User Purchase Sequences):
- 一个用户在一段时间内(例如,一次会话、一天、一周、一个月)购买的商品ID序列。
- 例如:
[product_A, product_B, product_C]
可以被视为一个“句子”。 - 这种序列隐含了产品之间的关联性,比如用户买了A之后又买了B。
- 用户浏览/点击序列 (User Browsing/Click Sequences):
- 用户在一次会话中浏览或点击的商品ID序列。
- 例如:
[product_X, product_Y, product_Z, product_X]
。 - 这种序列反映了用户的兴趣路径和产品之间的潜在替代或互补关系。
- 用户购物车/收藏夹内容 (User Shopping Carts / Wish Lists):
- 同一个用户购物车或收藏夹中的商品ID集合。
- 例如:
{product_P, product_Q, product_R}
。这些商品被用户认为是有价值或计划购买的,它们之间可能存在较强的关联。
- 共同购买的商品 (Frequently Co-purchased Items / "Customers who bought X also bought Y"):
- 在同一订单中一起出现的商品ID集合。
- 例如,订单1包含
[product_M, product_N]
,订单2包含[product_M, product_O]
。 - 这是非常强的关联信号。
- 共同浏览/查看的商品 (Frequently Co-viewed Items):
- 经常被用户在相近时间内一起查看的商品ID集合。
- 产品类别/标签路径 (Product Category/Tag Paths):
- 如果产品有详细的类目或标签,用户在导航时经过的类目路径,或者产品本身所属的多个标签组合,也可以视为一种上下文。
- 例如,用户通过 “电子产品 -> 手机 -> 智能手机” 找到某产品,这个路径中的其他产品或路径本身可以构成上下文。
- 搜索查询与点击的产品 (Search Queries and Clicked Products):
- 用户输入的搜索查询词(可以先将查询词也嵌入化)以及该查询下用户点击的产品。这能将文本意图与产品关联起来。
选择哪种“句子”取决于具体目标和数据可用性。通常,购买序列和共同购买数据被认为是非常强的信号。
2. 如何将用户行为融入嵌入模型?
将用户行为融入嵌入模型,主要目的是学习到能够反映用户兴趣和产品之间复杂关系的产品嵌入和/或用户嵌入。以下是一些主要方法:
-
基于序列的模型 (Sequential Models - 类似Word2Vec的Skip-gram或CBOW):
- Skip-gram思想: 给定一个“句子”(如用户购买序列
[P1, P2, P3, P4, P5]
),对于中心产品P3
,模型的目标是预测其上下文中的产品P1, P2, P4, P5
。通过优化这个预测任务,可以学习到产品的嵌入向量。如果两个产品经常出现在相似的上下文中,它们的嵌入向量就会比较接近。 - CBOW思想: 给定上下文产品
[P1, P2, P4, P5]
,模型的目标是预测中心产品P3
。 - 实现: 可以使用
gensim
库的Word2Vec
,或者基于深度学习框架(TensorFlow, PyTorch)自定义实现类似的网络结构(如使用嵌入层、简单的神经网络)。
- Skip-gram思想: 给定一个“句子”(如用户购买序列
-
基于图的模型 (Graph-based Models - 如Node2Vec, DeepWalk):
- 构建图: 将产品视为图中的节点。如果两个产品经常一起被购买/浏览,或者出现在同一个用户的行为序列中,就在它们之间建立边(可以是带权的边,权重表示关联强度)。
- 学习嵌入: 使用图嵌入算法(如Node2Vec)在构建好的产品关系图上学习每个产品节点的嵌入向量。这些算法通过在图上进行随机游走生成节点序列(类似“句子”),然后应用Skip-gram等方法学习嵌入。
-
矩阵分解 (Matrix Factorization - 如SVD, ALS):
- 构建用户-产品交互矩阵(例如,购买矩阵,评分矩阵)。
- 通过矩阵分解技术,将这个大而稀疏的矩阵分解为两个或多个低秩矩阵的乘积,其中一个矩阵可以看作是用户嵌入,另一个是产品嵌入。
- 虽然传统,但依然有效,尤其是在有显式反馈(如评分)时。
-
深度学习模型 (Deep Learning Models for Recommendation):
- 双塔模型 (Two-Tower Models): 一个塔处理用户特征(可能包括用户ID嵌入、用户历史行为序列的聚合嵌入),另一个塔处理产品特征(产品ID嵌入、产品属性嵌入)。通过计算两个塔输出向量的点积或余弦相似度来预测用户对产品的偏好。
- 序列感知推荐模型 (Sequential Recommenders - 如GRU4Rec, SASRec, BERT4Rec):
- 这类模型专门设计用来处理用户的行为序列。
- 使用RNN (GRU, LSTM) 或 Transformer (Self-Attention) 来捕捉序列中产品的依赖关系和用户的动态兴趣。
- 模型输入是用户的历史行为产品序列,输出是对下一个可能感兴趣产品的预测。
- 在这个过程中,产品嵌入和用户状态表示都会被学习到。
- 注意力机制 (Attention Mechanisms): 可以在上述模型中引入注意力机制,让模型在聚合用户历史行为或产品上下文时,动态地赋予不同部分不同的权重。
-
融合多种行为数据:
- 可以将购买、点击、收藏、搜索等多种行为数据融合到一个统一的模型中。例如,在构建图时,不同类型的行为可以对应不同类型的边或不同的权重。在深度学习模型中,可以将不同行为序列作为不同的输入特征。
具体步骤概要:
- 数据收集与预处理: 收集用户行为日志(购买、浏览、点击、收藏等),清洗数据,将产品映射到唯一的ID。
- 构建“句子”: 根据选择的策略(如用户购买序列),将原始行为数据转换成产品ID序列的列表。
- 模型选择与训练:
- 如果选择类似Word2Vec的方法:将产品ID序列作为输入,训练模型得到每个产品ID的嵌入向量。
- 如果选择图嵌入:构建产品关系图,运行Node2Vec等算法。
- 如果选择深度学习模型:设计网络结构,定义损失函数(如交叉熵损失用于预测下一个产品,或BPR损失用于排序),使用用户行为序列进行训练。
- 嵌入获取: 训练完成后,从模型中提取出学习到的产品嵌入向量。
- 推荐生成:
- 基于物品的相似度推荐 (Item-to-Item): 计算产品嵌入之间的余弦相似度。对于用户当前查看或购买的某个产品,推荐与其嵌入向量最相似的其他产品。
- 基于用户的推荐 (User-to-Item): 如果也学习了用户嵌入(或通过用户历史行为产品的嵌入聚合得到用户表示),可以计算用户表示与所有产品嵌入的相似度,推荐相似度最高的产品。
- 用于下游任务: 这些嵌入也可以作为特征输入到更复杂的推荐模型或排序模型中。
通过这种方式,系统能够学习到产品之间基于用户真实行为的复杂语义关系,从而提供更精准和个性化的推荐。
Q16:word2vec 的训练过程中,负例的作用是什么?
A16: 在word2vec的训练过程中,负例(negative samples)扮演着非常重要的角色。它们的主要作用是帮助模型学习更准确的词嵌入表示,同时提高训练效率。具体来说:
-
对比学习的基础:
- 负例采样(Negative Sampling)是一种对比学习的形式。模型不仅需要学会识别哪些词确实出现在目标词的上下文中(正例),还要学会区分哪些词不太可能出现在该上下文中(负例)。
- 这种对比帮助模型在向量空间中建立更清晰的词语分布结构,使语义相近的词聚集在一起,语义不相关的词分散开。
-
提高训练效率:
- 在原始的word2vec模型中,每个训练步骤都需要更新词汇表中所有词的权重,这在大词汇表时计算成本很高。
- 通过负例采样,每次只需要更新少量随机选择的负例词的权重,大大减少了计算量,加快了训练速度。
- 例如,如果词汇表大小为100万,使用负例采样可能每次只需要处理5-20个负例,而不是全部100万个词。
-
防止模型坍缩:
- 如果没有负例,模型可能会倾向于将所有词的向量都映射到相似的空间位置(称为向量坍缩),因为这是一种简单的方式来最小化正例之间的距离。
- 负例提供了"反向压力",迫使模型学习到能够区分不同语义关系的表示。
- 这就像在物理系统中,正例产生吸引力,而负例产生排斥力,两种力的平衡最终形成了有意义的词向量空间结构。
-
改善词向量的质量:
- 通过对比正负例,模型能够学习到更细致的语义差异。
- 例如,对于目标词"苹果","手机"、"电脑"可能是正例,而"石油"、"银行"则可能是负例。这种对比帮助模型理解"苹果"在科技产品语境下的语义。
-
负例选择策略的重要性:
- word2vec使用基于词频的负例采样策略,词频越高的词被选为负例的概率越大(但会进行幂次平滑)。
- 这种策略的合理性在于:
- 高频词更可能在各种上下文中出现,因此作为负例可以帮助模型学习更普遍的语义区分。
- 避免了过多选择罕见词作为负例,这些罕见词可能与目标词的语义关系不够典型。
-
训练的稳定性:
- 负例采样提供了一种更稳定的训练方式。
- 通过控制负例的数量和选择策略,可以平衡训练的难度和效果。
- 太少的负例可能导致模型无法学到足够的区分性特征,太多的负例则可能增加训练难度和计算开销。
-
实际应用中的启示:
- 负例采样的思想不仅适用于词嵌入,在推荐系统、信息检索等领域也有广泛应用。
- 例如,在推荐系统中,可以使用用户没有交互的物品作为负例,帮助模型学习用户的兴趣分布。
- 在信息检索中,可以使用与查询不相关的文档作为负例,提升检索模型的区分能力。
总的来说,负例在word2vec训练中起到了"定锚"的作用,帮助模型在高维向量空间中建立起有意义的语义结构,同时也大大提高了训练的效率和可行性。这种通过对比学习来构建表示的思想,已经成为了现代深度学习中的一个重要范式。
Q17:传统的静态词嵌入(如 word2vec)与大模型产生的与上下文相关的嵌入相比,有什么区别?有了与上下文相关的嵌入,静态词嵌入还有什么价值?
A17: 传统的静态词嵌入和大模型的上下文相关嵌入在本质、特点和应用场景上都有显著差异。让我们深入分析它们的区别,并探讨静态词嵌入在当前仍然具有的价值。
一、主要区别:
-
表示方式:
- 静态词嵌入: 每个词在任何上下文中都对应唯一的向量表示。例如,"bank"这个词无论出现在"river bank"还是"bank account"中,都使用相同的向量。
- 上下文相关嵌入: 词的表示会根据其所处的上下文动态变化。同一个词在不同语境下会有不同的向量表示,能更好地捕捉词义的细微差别。
-
语义表达能力:
- 静态词嵌入: 只能表达词的平均或主要语义,难以处理一词多义。例如,"苹果"既可以表示水果也可以表示公司,但静态嵌入只能给出一个综合的表示。
- 上下文相关嵌入: 能够根据上下文准确表达词在特定语境下的具体含义,更好地处理多义词、歧义等问题。
-
计算复杂度:
- 静态词嵌入: 训练完成后,查询词向量是简单的查表操作,计算开销很小。
- 上下文相关嵌入: 需要实时计算整个句子或段落的表示,计算开销较大。
-
训练方式:
- 静态词嵌入: 通常使用较简单的神经网络结构(如word2vec的Skip-gram或CBOW),训练目标是预测词的上下文或用上下文预测词。
- 上下文相关嵌入: 使用更复杂的架构(如Transformer),通过自注意力机制和深层神经网络来学习动态表示。
-
存储需求:
- 静态词嵌入: 每个词只需存储一个固定的向量,存储开销相对较小。
- 上下文相关嵌入: 需要存储整个模型参数,存储开销大得多。
二、静态词嵌入的持续价值:
-
轻量级应用场景:
- 适用于资源受限的环境,如移动设备或嵌入式系统。
- 当任务不需要特别精细的语义理解时,使用静态词嵌入可以获得很好的性价比。
-
特定领域应用:
- 在某些专业领域(如医疗、法律),词义相对固定,静态词嵌入可能足够用且更高效。
- 可以针对特定领域训练专门的词嵌入,捕捉领域特有的语义关系。
-
基础研究和教学:
- 静态词嵌入的原理简单清晰,适合用于理解和研究词向量的基本概念。
- 作为更复杂模型的基础组件或基准比较对象。
-
高效的信息检索:
- 在大规模文档检索、相似度计算等任务中,静态词嵌入的效率优势明显。
- 可以预计算文档的向量表示,支持快速的相似度搜索。
-
可解释性:
- 静态词嵌入的语义关系(如类比关系)更容易理解和解释。
- 有助于分析词语之间的语义关系和语言的结构特征。
-
作为特征工程的工具:
- 可以作为其他机器学习模型的输入特征。
- 在一些简单的NLP任务中,如文本分类,静态词嵌入仍然是有效的特征表示方法。
-
与其他技术的互补:
- 可以与上下文相关嵌入结合使用,提供额外的特征信息。
- 在某些任务中,静态词嵌入可以作为上下文相关嵌入的初始化或辅助表示。
-
计算效率和可扩展性:
- 在需要处理大量文本数据但计算资源有限的场景下,静态词嵌入提供了一个实用的解决方案。
- 适合需要快速响应的在线系统,如实时推荐或搜索。
总的来说,尽管上下文相关的嵌入在语义表达能力上更强,但静态词嵌入由于其简单性、效率和实用性,在特定场景下仍然具有不可替代的价值。选择使用哪种嵌入方式应该根据具体任务的需求、可用资源和性能要求来决定。在某些情况下,两种方法的结合使用可能会带来更好的效果。
Q18:与上下文相关的嵌入是如何解决一词多义问题的,如技术语境下,英文 token 可能表示词元、代币、令牌,而中文“推理”可能表示 reasoning 或 inference ?
A18: 与上下文相关的嵌入(Contextual Embeddings),例如来自 BERT、GPT、ELMo 等模型的嵌入,通过动态地根据词语所处的具体语境生成其向量表示,从而有效地解决了传统静态词嵌入难以处理的一词多义问题。其核心机制在于模型能够理解并利用词语周围的文本信息来区分不同的含义。
核心原理:
-
动态生成向量: 与静态词嵌入(如 Word2Vec、GloVe)为每个词分配一个固定向量不同,上下文相关嵌入模型在处理文本时,会为句子中的每一个词(或子词)动态计算一个向量。这意味着同一个词在不同的句子或上下文中会有不同的向量表示。
-
注意力机制 (Attention Mechanism): 现代大模型(尤其是基于 Transformer 架构的)广泛使用注意力机制,特别是自注意力机制 (Self-Attention)。
- 感知上下文: 自注意力机制允许模型在计算一个词的表示时,权衡句子中所有其他词对该词的重要性。
- 聚焦相关信息: 对于多义词,模型会根据上下文中的其他词来判断当前词最相关的含义。例如,如果"token"周围出现了"NLP"、"vocabulary"等词,模型会倾向于将其理解为"词元";如果周围是"blockchain"、"cryptocurrency",则可能理解为"代币"。
-
深层双向/单向编码:
- BERT (双向): BERT通过其 Masked Language Model 任务和双向 Transformer 编码器,能够同时考虑一个词左右两边的上下文信息来生成其表示。
- GPT (单向): GPT系列模型是自回归的,主要关注左侧上下文(之前的文本),但通过深层网络结构,也能捕捉到丰富的上下文信息来区分词义。
- ELMo (双向 LSTM): ELMo通过训练两个独立的从左到右和从右到左的 LSTM 模型,然后拼接它们的隐藏状态来获得上下文相关的表示。
如何解决具体例子中的一词多义:
-
英文 "token":
- 句子1: "The tokenization process in NLP splits text into tokens."
- 上下文中的 "NLP", "tokenization", "splits text" 会引导模型将 "token" 的嵌入调整到更接近"词元"的语义空间区域。
- 句子2: "He purchased a new cryptocurrency token on the exchange."
- 上下文中的 "cryptocurrency", "purchased", "exchange" 会使 "token" 的嵌入偏向"代币"的含义。
- 句子3: "You need a physical token to access the secure server room."
- 上下文中的 "physical", "access", "secure server room" 会使 "token" 的嵌入偏向"令牌"(物理凭证)的含义。
在每种情况下,"token" 这个词的最终嵌入向量都会不同,反映了其在特定语境下的具体意义。
- 上下文中的 "physical", "access", "secure server room" 会使 "token" 的嵌入偏向"令牌"(物理凭证)的含义。
- 句子1: "The tokenization process in NLP splits text into tokens."
-
中文 "推理":
- 句子1: "福尔摩斯以其严密的逻辑推理能力著称。"
- 上下文中的"福尔摩斯"、"逻辑能力"等词会引导模型将"推理"理解为"reasoning"(思维过程)。
- 句子2: "这个大模型的推理速度非常快,可以在几秒内生成结果。"
- 上下文中的"大模型"、"速度"、"生成结果"等词会引导模型将"推理"理解为"inference"(模型预测过程)。
同样,模型会根据不同的上下文为"推理"生成不同的嵌入向量,从而区分这两种含义。
- 上下文中的"大模型"、"速度"、"生成结果"等词会引导模型将"推理"理解为"inference"(模型预测过程)。
- 句子1: "福尔摩斯以其严密的逻辑推理能力著称。"
总结:
上下文相关嵌入的强大之处在于它们不仅仅学习词的孤立含义,而是学习词在不同语境下的使用方式。通过深层神经网络结构和注意力机制,模型能够捕捉到复杂的上下文依赖关系,为多义词生成高度情境化的、区分性的向量表示,从而极大地提升了自然语言理解任务的性能。
Q19:在 word2vec 等词嵌入空间中,存在 king - man + woman ≈ queen 的现象,这是为什么?大模型的词元嵌入空间是否也有类似的属性?
A19: 这种 king - man + woman ≈ queen
的现象,被称为词向量的线性类比 (Linear Analogy) 或语义偏移 (Semantic Offset),是静态词嵌入(如 Word2Vec, GloVe)的一个显著特征。它表明词嵌入空间能够捕捉到词语之间复杂的语义关系,并且这些关系在向量空间中表现为近似的线性结构。
一、为什么 Word2Vec 等词嵌入空间存在这种现象?
-
分布式假设 (Distributional Hypothesis):
- 核心思想是“词的含义由其上下文决定”。Word2Vec 等模型通过学习在相似上下文中出现的词,使得这些词在向量空间中彼此靠近。
-
学习共现模式:
- 模型(如 Skip-gram)试图根据中心词预测其上下文词,或者(如 CBOW)根据上下文词预测中心词。
- 在这个过程中,模型学习到词语之间的共现统计规律。例如,“king”经常与“royal”、“throne”、“power”等词共现,而“queen”也与这些词以及“female”相关的词共现。
-
向量空间的几何结构:
- 通过优化目标函数(如最大化共现概率或最小化负采样损失),模型将词语映射到高维向量空间。
- 在这个空间中,语义上相关的词倾向于聚集在一起。
- 更重要的是,某些语义关系(如性别、时态、单复数、国家-首都)似乎可以被表示为向量空间中的特定方向或偏移量。
- 例如,从
vec(man)
到vec(woman)
的向量差vec(woman) - vec(man)
可能代表了“性别从男性到女性”的语义概念。 - 类似地,
vec(king) - vec(man)
可能捕捉了“从普通男性到国王”的语义概念,其中包含了“皇室”、“权力”等属性。
- 例如,从
-
线性子结构:
- 研究表明,这些词嵌入空间倾向于学习到一些线性的子结构。这意味着某些语义关系可以通过向量的加减法来近似表达。
- 在
king - man + woman ≈ queen
这个例子中:vec(king) - vec(man)
可以理解为从“男性”这个一般概念中剥离出与“国王”相关的特定属性(如皇室、权力,但保留了男性特征)。- 然后,将这个“国王特定属性”加到
vec(woman)
上,相当于将这些属性赋予一个“女性”的基础概念,从而得到与vec(queen)
相近的向量。
- 这并不是一个精确的数学等式,而是一个近似关系,表明向量空间捕捉到了这种类比关系。
-
训练数据的统计特性:
- 这种线性结构是模型从大规模文本语料中学习到的统计模式的体现。如果语料中反复出现类似的语义关系模式(例如,许多涉及性别对立的词对,许多涉及国家-首都的词对),模型就更有可能学习到这些线性关系。
二、大模型的词元嵌入空间是否也有类似的属性?
是的,大模型(如 BERT, GPT 系列)的词元嵌入空间(尤其是其底层的静态词元嵌入或经过少量上下文调整后的嵌入)在一定程度上也表现出类似的线性类比属性,但情况更为复杂。
-
底层静态嵌入的相似性:
- 大模型通常也有一个初始的词元嵌入层,这些嵌入在训练初期或在某些分析方法下,可能表现出类似 Word2Vec 的静态嵌入特性,包括线性类比。
-
上下文相关性的影响:
- 大模型的核心是产生上下文相关的嵌入。这意味着同一个词元在不同上下文中的表示是不同的。这使得直接应用
king - man + woman
这样的简单向量运算变得不那么直接,因为vec(king)
取决于king
所在的句子。 - 然而,即使是上下文相关的嵌入,其底层的语义空间仍然可能保留了某些结构化的语义关系。
- 大模型的核心是产生上下文相关的嵌入。这意味着同一个词元在不同上下文中的表示是不同的。这使得直接应用
-
更复杂的语义关系:
- 大模型通过深层 Transformer 网络学习到比简单线性关系更复杂、更细致的语义表示。
- 它们不仅能捕捉词汇层面的类比,还能理解更抽象的、涉及短语甚至句子级别的语义关系。
-
研究发现:
- 一些研究通过探针(probing)等方法分析大模型的内部表示,发现其隐藏层确实编码了丰富的句法和语义信息,包括类似词汇类比的结构。
- 有研究表明,即使在上下文相关的嵌入中,也可以通过特定的方法找到或诱导出类似的线性结构,尽管可能不如静态嵌入中那么清晰和直接。
- 例如,可以通过平均一个词在多种典型上下文中的表示来获得一个“平均”的上下文嵌入,然后在这个平均嵌入上进行类比测试。
-
子词的影响:
- 大模型通常使用子词分词(如 BPE)。这意味着一个词可能被拆分成多个词元。进行类比时,需要考虑如何组合这些子词元的嵌入,这增加了复杂性。
总结:
king - man + woman ≈ queen
这种线性类比现象是静态词嵌入捕捉词汇间语义关系的一个重要体现,源于模型对大规模文本共现模式的学习。- 大模型的词元嵌入空间,虽然由于上下文相关性和子词分词等因素变得更为复杂,但在其表示中仍然蕴含着结构化的语义信息,包括类似词汇类比的属性。这些属性可能不那么直接地通过简单的向量加减法展现,但可以通过更复杂的分析方法被揭示出来。大模型学习到的语义关系通常更为丰富和细致。
评论