大模型训练时原始的文本资料是如何变成词向量的?

这个问题触及了所有自然语言处理模型的起点。将原始文本变成词向量的过程,通常被称为 “文本向量化”“词嵌入”。这个过程经历了从简单到复杂,从“无知”到“有语义”的演进。

我们可以用以下流程图来概括这个核心过程:

"原始文本
Raw Text"
"分词
Tokenization"
"构建词汇表
Vocabulary"
"初始向量表示
One-Hot Encoding"
"学习语义向量
Embedding Layer"
"最终词向量
Word Embedding"

下面我们来详细拆解图中的每一个步骤。


第一步:分词

首先,我们需要将连续的文本切分成模型能够处理的基本单元(称为 Token)。

  • 英文示例"I don't like spiders."
    • 结果["I", "don", "'", "t", "like", "spiders", "."]
  • 中文示例"我喜欢学习人工智能。"
    • 结果["我", "喜欢", "学习", "人工智能", "。"]

分词方式

  • 词级别:如上例。优点是语义明确,但词汇表可能很大,且无法处理未登录词。
  • 子词级别:这是现代大模型(如BERT、GPT)的主流方法。它能很好地平衡语义和未知词问题。
    • 例如,“spiders”可能被切分为 ["spider", "s"]
    • “人工智能”可能被切分为 ["人工", "智能"]
    • 常见的子词算法有 Byte-Pair Encoding, WordPiece

第二步:构建词汇表与初始映射

分词后,我们会得到一个包含所有可能出现的基本单元的词汇表

  • 词汇表{“我”: 1, “喜欢”: 2, “学习”: 3, “人工智能”: 4, “。”: 5, “[UNK]”: 6, ...}
    • [UNK] 是一个特殊的Token,用来表示词汇表中不存在的词。

接下来,我们需要将Token转化为数字。最初始、最简单的方法是 One-Hot 编码

  • One-Hot 编码
    • 假设词汇表大小为50,000。
    • 每个词都被表示成一个长度为50,000的向量。
    • 这个向量中,除了对应这个词的位置是1,其他所有位置都是0。
    • 例如,“我” = [1, 0, 0, 0, ..., 0]
    • “喜欢” = [0, 1, 0, 0, ..., 0]

One-Hot编码的致命缺陷

  1. 维度灾难:向量维度和词汇表一样大,非常稀疏且低效。
  2. 无法表示语义:任意两个词向量的点积都是0,模型无法从数字上知道“苹果”和“水果”比“苹果”和“飞机”更相关。这被称为 “词汇鸿沟”

第三步:学习稠密词向量

为了解决One-Hot的问题,我们引入一个 嵌入层

1. 嵌入层是什么?

  • 它是一个可训练的查找表全连接层
  • 它的尺寸是 (词汇表大小, 嵌入维度)
  • 嵌入维度 是一个远小于词汇表大小的数(如768、1024),用于定义一个稠密向量的长度。

2. 它是如何工作的?

想象一个巨大的表格:

Token索引嵌入向量 (维度=4,示例)
“我”1[0.2, -0.5, 0.9, 1.2]
“喜欢”2[1.1, 0.3, -0.1, 0.5]
“学习”3[0.8, -0.2, 0.4, 1.0]
“人工智能”4[-0.5, 1.3, 0.1, -0.8]
  • 当模型看到索引为 1 的Token(“我”)时,它就去这个表格的第1行,取出对应的向量 [0.2, -0.5, 0.9, 1.2]
  • 这个向量就是“我”这个词的初始词向量。

3. 关键:向量是如何变“聪明”的?

  • 初始状态:这个嵌入表格中的数值在训练开始时是随机初始化的(是一些随机的小数)。

  • 训练过程:当模型在完成它的主要任务(如预测下一个词、完形填空)时,它会通过反向传播梯度下降算法,不断地调整这个嵌入表格里的每一个数字。

  • 学习目标:调整的原则是——在语义上、语法上相似或相关的词,它们的向量在向量空间中的位置也应该靠近。

    • 例如,通过训练,模型会学到:
      • “猫”和“狗”都是宠物,它们的向量应该比较接近。
      • “国王” - “男人” + “女人” ≈ “女王” 这种向量关系。

总结:从原始文本到词向量的完整流程

  1. 输入“我喜欢学习”
  2. 分词[“我”, “喜欢”, “学习”]
  3. 查索引[1, 2, 3]
  4. 通过嵌入层
    • 模型拿着索引 1,去嵌入表格里取出向量 [0.2, -0.5, 0.9, ...]
    • 拿着索引 2,取出 [1.1, 0.3, -0.1, ...]
    • 拿着索引 3,取出 [0.8, -0.2, 0.4, ...]
  5. 输出: 一个包含三个稠密向量的序列,每个向量都代表了对应词的语义信息。这个序列将被送入Transformer等后续模型中进行进一步处理。

所以,词向量不是人为设计好的,而是模型在完成特定任务的过程中,自己学习出来的一种对语言的数值化、分布式表示。它是整个深度学习模型能够理解语言的基础。

更多推荐