【学习笔记】Token?向量?Encoding?Embedding?分词?傻傻分不清楚

在自然语言处理(NLP)中,Token向量(Vector)、Encoding(编码) 和 Embedding 是几个紧密关联但不同的概念。它们的核心关系可以用一句话概括:

Encoding将文本分割为Token,Embedding将Token转换为向量,向量作为模型可处理的连续数值表示,编码语义信息。


1. Token

  • 是什么:Token 是文本经过分词后的最小单元,可以是单词、子词或符号。

    • 例如:句子 "ChatGPT is powerful!" 可能被拆分为 ["Chat", "G", "PT", " is", " powerful", "!"](基于 BPE 分词)。

  • 作用:Token 是模型处理文本的“原材料”,所有后续计算(如 Embedding)都基于 Token。


2. 向量(Vector)

  • 是什么:向量是一个多维数组(如 [0.2, -1.5, 3.0, ...]),用于在数学空间中表示 Token 的语义和语法特征。

    • 例如:单词 "king" 的向量可能是 [0.8, -0.3, 1.2, ...],维度通常为 300、768 或 1024。

  • 作用:向量是模型理解文本的“数学语言”,通过向量运算(如余弦相似度)可捕捉语义关系。


3. Embedding

  • 是什么:Embedding 是将 Token 映射到向量的过程,本质是一个 查找表

    • 每个 Token 对应一个唯一的向量,Embedding 层是模型的组成部分(如神经网络的一层)。

    • 例如:在训练好的 Embedding 中,"dog" → [0.9, -0.2, 0.4]"cat" → [0.8, -0.1, 0.5],两者向量相似。

  • 作用:通过 Embedding,模型能将离散的 Token 转换为连续的数值表示,从而进行数学运算。


4. 几者的关系

① 从文本到模型理解的完整流程
原始文本 → Encoding(生成 Token) → Token 序列 → Embedding(生成向量) → 向量序列 → 模型处理
  • 简要示例

    1. 文本:"Learn AI"

    2. Encoding:Tokenization["Learn", " AI"]-> [3294, 3849]

    3. Embedding:[[0.3, -0.7, ...], [1.2, 0.5, ...]]

    4. 模型:基于向量进行预测或生成。

② 分步详解及代码案例

假设我们有一个句子 "I love NLP!",目标是将其转换为向量供模型处理。

步骤 1:Encoding(生成 Token ID)
  • 工具:使用 OpenAI 的 tiktoken 库(GPT-4 的编码方式)。

  • 代码

    import tiktoken
    
    # 初始化编码器
    encoding = tiktoken.get_encoding("cl100k_base")
    
    # 原始文本
    text = "I love NLP!"
    
    # Encoding:文本 → Token ID 序列
    token_ids = encoding.encode(text)
    print("Token IDs:", token_ids)  # 输出示例:[40, 3294, 3640, 0]
  • 输出

    • Token 序列为 [40, 3294, 3640, 0],其中:

      • 40 → "I"

      • 3294 → " love"

      • 3640 → " NLP"

      • 0 → "!"(假设 0 是感叹号的 ID)


步骤 2:Embedding(生成向量)
  • 工具:使用 PyTorch 的 nn.Embedding 层。

  • 代码

    import torch
    import torch.nn as nn
    
    # 定义 Embedding 层(假设词表大小=100000,向量维度=3)
    embedding = nn.Embedding(num_embeddings=100000, embedding_dim=3)
    
    # 将 Token ID 转换为 Tensor
    input_ids = torch.tensor(token_ids)
    
    # 生成向量
    vectors = embedding(input_ids)
    print("Vectors:\n", vectors)
  • 输出

    Vectors:
    tensor([[ 0.512, -0.231, 0.879],  # "I" 的向量
            [ 0.193, 0.456, -0.742],  # " love" 的向量
            [-0.654, 0.321, 0.112],   # " NLP" 的向量
            [ 0.045, -0.889, 0.433]], # "!" 的向量
           grad_fn=<EmbeddingBackward>)

步骤 3:输入模型
  • 向量序列可直接输入模型(如 LSTM、Transformer)进行任务处理:

    # 示例:LSTM 模型处理
    class SimpleLSTM(nn.Module):
        def __init__(self):
            super().__init__()
            self.lstm = nn.LSTM(input_size=3, hidden_size=5)
    
        def forward(self, x):
            output, (hn, cn) = self.lstm(x)
            return output
    
    model = SimpleLSTM()
    # 调整输入形状为 (序列长度, batch_size, 向量维度)
    output = model(vectors.unsqueeze(1))  # 输出形状:(4, 1, 5)

关键点总结
步骤输入输出工具/技术
Encoding原始文本 ("I love NLP!")Token ID 序列 ([40, 3294, 3640, 0])tiktokentransformers
EmbeddingToken ID 序列向量序列 ((4, 3))nn.EmbeddingWord2Vec
模型输入向量序列模型预测结果LSTM、Transformer

5. Embedding 的核心意义

① 语义捕捉
  • 好的 Embedding 会让语义相似的 Token 在向量空间中距离更近。

    • 例如:"dog" 和 "puppy" 的向量方向接近,但与 "car" 的向量差异较大。

② 上下文感知
  • 静态 Embedding(如 Word2Vec):一个 Token 始终对应同一向量,无法区分多义词。

    • 例如:"bank"(银行/河岸)在不同语境中向量相同。

  • 动态 Embedding(如 BERT):同一 Token 在不同上下文中生成不同向量。

    • 例如:"bank" 在 "deposit money in the bank" 和 "river bank" 中向量不同。


6. 代码示例

① 使用 Embedding 层(PyTorch)
import torch
import torch.nn as nn

# 定义 Embedding 层:5 个 Token,每个 Token 映射到 3 维向量
embedding = nn.Embedding(num_embeddings=5, embedding_dim=3)

# 输入 Token ID(例如 "apple"=0, "banana"=1)
token_ids = torch.LongTensor([0, 1, 2])

# 获取向量
vectors = embedding(token_ids)
print(vectors)
# 输出:tensor([[ 0.5, -0.2,  1.1],
#              [ 0.3,  0.8, -0.4],
#              [-0.7,  0.1,  0.6]], grad_fn=<EmbeddingBackward>)
② 预训练 Embedding(如 Word2Vec)
from gensim.models import Word2Vec

# 训练一个简单的 Word2Vec 模型
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
model = Word2Vec(sentences, vector_size=3, min_count=1)

# 获取 "cat" 的向量
vector_cat = model.wv["cat"]
print(vector_cat)  # 输出例如 [0.9, -0.2, 0.4]

7. 实际应用场景

  1. 语义搜索:通过向量相似度匹配查询和文档。

  2. 文本分类:将文本的向量输入分类器(如 [CLS] 向量在 BERT 中)。

  3. 生成任务:语言模型基于向量序列生成下一个 Token(如 GPT)。

  4. 推荐系统:用户行为序列的向量化表示。


8. 常见问题

① Token 和向量维度必须一一对应吗?
  • 是的。每个 Token 对应一个向量,但动态 Embedding 允许同一 Token 在不同上下文中对应不同向量。

② Embedding 层如何训练?
  • Embedding 是模型的一部分,通过反向传播和梯度下降优化,目标是最小化任务损失(如分类误差)。

③ 为什么需要高维向量(如 768 维)?
  • 高维空间能更精细地编码复杂的语义和语法特征,低维可能导致信息损失。


总结

  • Token 是文本的“原子单位”,向量 是 Token 的数学表示,Embedding 是两者的桥梁。

  • Embedding 的质量直接影响模型性能,好的向量表示能捕捉丰富的语义和上下文信息。

  • 现代 NLP 模型(如 Transformer)通过动态 Embedding 技术,实现了对复杂语境的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值