【Transformer】一文深入理解 Tokenizer 与 Embedding

在自然语言处理(NLP)中,Tokenizer 和 Embedding 是两个非常基础但又容易混淆的概念。它们在 Transformer 和 BERT 等模型中扮演着至关重要的角色。本文将详细讲解它们的定义、作用、区别,以及它们在模型输入处理中的具体流程。


一、什么是 Tokenizer?(一把菜刀🔪)

1. 定义

Tokenizer 是将原始文本(字符串)转化为模型可以处理的“token”(词、子词、字符等单位)的过程。

2. 作用

  • 将一段文本切分成一个个基本单位(token)。

  • 将每个 token 映射为一个唯一的整数 ID(词表中的索引)。

3. 示例

输入文本:

"Hello, how are you?"

经过 Tokenizer(如 BERT 的 WordPiece)处理后可能变成:

["Hello", ",", "how", "are", "you", "?"]

然后映射为 ID(假设词表中):

[7592, 117, 1762, 1385, 2345, 119]

4. 常见的 Tokenizer 类型

  • Word-level(词级)

  • Character-level(字符级)

  • Subword-level(子词级):

    • BPE(Byte Pair Encoding)

    • WordPiece(BERT 使用)

    • SentencePiece(支持多语言)


二、什么是 Embedding?(一个词典📖)

1. 定义

Embedding 是将离散的 token ID 映射为连续的向量(向量空间中的表示)的过程。

2. 作用

  • 将每个 token ID 转换为一个固定维度的向量(如 768 维)。

  • 这些向量可以捕捉词语的语义信息(通过训练得到)。

3. 示例

假设词表大小是 30522,embedding 维度是 768,那么 Embedding 层是一个形状为 (30522, 768) 的矩阵。

输入一个 token ID 7592,Embedding 层会输出一个 768 维的向量:

embedding_matrix[7592] -> [0.23, -0.45, ..., 0.12]  # shape: (768,)

三、Tokenizer 与 Embedding 的区别与联系

项目

Tokenizer

Embedding

类型

文本处理

向量表示

输入

原始文本(字符串)

token ID

输出

token list / token ID 序列

向量(tensor)

是否可训练

一般不训练,使用预训练的

一般是可训练的参数

所属模块

预处理

模型的一部分

示例

["Hello", ",", ...]

[ [0.23, -0.45, ...], ... ]

 常见误区与澄清

  • ❌ 误解1Tokenizer直接输出向量
    ✅ 纠正:Tokenizer仅输出ID,Embedding层才负责转向量。
  • ❌ 误解2Embedding是Tokenizer的一部分
    ✅ 纠正:Tokenizer是独立预处理步骤,Embedding是模型的可训练层。
  • ❌ 误解3BERT的输入是Embedding后的结果
    ✅ 纠正:BERT的输入是文本(或Token ID),Embedding是模型内部处理步骤。

 


四、Transformer Encoder 的输入是什么?

Transformer 的 Encoder 输入是一个 token 的向量表示,即:

✅ 输入到 Encoder 的是:

  • 经过 Tokenizer 处理后的 token ID

  • 再经过 Embedding 层映射成的向量

  • 并加上位置编码(Positional Encoding)

流程如下:

原始文本
   ↓
Tokenizer(分词 + 映射为 ID)
   ↓
Embedding Layer(映射为向量)
   ↓
Positional Encoding(加上位置信息)
   ↓
输入到 Transformer Encoder

五、BERT 的输入处理流程

BERT 是基于 Transformer 的 Encoder 构建的模型,因此输入流程与 Transformer 类似,但结构更复杂。

✅ 输入到 BERT 的是:

  • 经过 Tokenizer 处理后的 token ID

  • 再经过 Embedding 层映射成的向量

  • 并加上 Segment Embedding 和 Positional Embedding

BERT 输入的三部分:

  1. Token Embeddings:词本身的嵌入。

  2. Segment Embeddings:用于区分句子对(如问题和回答)。

  3. Positional Embeddings:表示位置信息。

这三部分相加后,输入到 BERT 的第一个 Encoder 层。


六、代码示例(使用 HuggingFace Transformers)

from transformers import BertTokenizer, BertModel

# 1. 加载 Tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# 2. 原始文本
text = "Hello, how are you?"

# 3. Tokenizer 处理(得到 token ID)
inputs = tokenizer(text, return_tensors='pt')  # 输出 token_ids, attention_mask 等

# 4. 加载预训练的 BERT 模型
model = BertModel.from_pretrained('bert-base-uncased')

# 5. 输入到 BERT(自动完成 Tokenizer + Embedding + Encoder)
outputs = model(input_ids=inputs['input_ids'], 
                attention_mask=inputs['attention_mask'])

# 6. outputs.last_hidden_state 就是 Encoder 输出的 token 向量表示

七、总结

  • Tokenizer 是将文本切分并映射为 ID 的工具;

  • Embedding 是将 ID 映射为向量的模型参数;

  • 输入到 Transformer Encoder 或 BERT 的是 Tokenizer + Embedding 的结果(即 token 的向量表示);

  • BERT 还进一步加入了 Segment Embedding 和 Positional Embedding。

常见误区与澄清

  • ❌ 误解1Tokenizer直接输出向量
    ✅ 纠正:Tokenizer仅输出ID,Embedding层才负责转向量。
  • ❌ 误解2Embedding是Tokenizer的一部分
    ✅ 纠正:Tokenizer是独立预处理步骤,Embedding是模型的可训练层。
  • ❌ 误解3BERT的输入是Embedding后的结果
    ✅ 纠正:BERT的输入是文本(或Token ID),Embedding是模型内部处理步骤

 

### 关于Transformer论文复现的代码实现 #### 背景介绍 Transformer 是一种基于注意力机制(Attention Mechanism)的神经网络架构,最初由 Vaswani 等人在 2017 年提出的《Attention Is All You Need》一文中引入。它通过自注意力机制替代传统的循环神经网络(RNN),显著提高了训练效率性能,在自然语言处理领域取得了巨大成功。 为了帮助理解 Transformer 的工作原理并提供实际操作经验,许多开发者提供了详细的代码复现教程以及开源项目。以下是几个常见的资源及其特点: --- #### 常见的Transformer代码复现资源 1. **The Annotated Transformer** The Annotated Transformer 是哈佛大学发布的经典 Transformer 复现教程之一[^1]。该教程不仅实现了原始论文中的核心功能,还附带了详尽的注释说明每一步的具体含义。其主要特点是: - 提供完整的端到端实现。 - 使用 PyTorch 框架编写。 - 配合翻译任务展示了模型的实际应用效果。 下面是一个简单的 Transformer 架构初始化示例: ```python import torch.nn as nn class EncoderDecoder(nn.Module): """ A standard Encoder-Decoder architecture. """ def __init__(self, encoder, decoder, src_embed, tgt_embed, generator): super(EncoderDecoder, self).__init__() self.encoder = encoder self.decoder = decoder self.src_embed = src_embed self.tgt_embed = tgt_embed self.generator = generator def forward(self, src, tgt, src_mask, tgt_mask): "Take in and process masked source/target sequences." return self.decode(self.encode(src, src_mask), src_mask, tgt, tgt_mask) def encode(self, src, src_mask): return self.encoder(self.src_embed(src), src_mask) def decode(self, memory, src_mask, tgt, tgt_mask): return self.decoder(self.tgt_embed(tgt), memory, src_mask, tgt_mask) ``` 2. **Vision Transformer (ViT) 实现** Vision TransformerTransformer 应用于计算机视觉领域,通过对图像进行切片并将位置编码加入输入序列完成建模过程[^2]。其实现有如下要点: - 图像被分割成固定大小的小块(Patch),这些 Patch 经过线性变换映射为高维向量。 - 加入可学习的位置嵌入以保留空间信息。 - 利用标准的 Transformer 编码器堆叠形成最终特征表示。 这里展示一个简化版的 ViT 输入构建方法: ```python import numpy as np import tensorflow as tf patch_size = 16 # Example size image_height, image_width = 224, 224 num_patches = (image_height // patch_size) * (image_width // patch_size) patches = [] for i in range(num_patches): start_h = (i // (image_width // patch_size)) * patch_size start_w = (i % (image_width // patch_size)) * patch_size end_h = start_h + patch_size end_w = start_w + patch_size patches.append(image[start_h:end_h, start_w:end_w]) patches_tensor = tf.convert_to_tensor(patches) position_embedding = tf.Variable(tf.random.normal([num_patches, embedding_dim])) inputs_with_pos = patches_tensor + position_embedding ``` 3. **Hugging Face Transformers** Hugging Face 开发了一套强大的库 `transformers`,支持多种预训练模型快速部署微调[^3]。虽然这不是完全从零开始的实现,但它非常适合希望专注于特定应用场景而非底层细节的研究者或工程师们使用。 安装命令如下所示: ```bash pip install transformers ``` 接下来可以轻松加载已有的 Transformer 模型实例化对象: ```python from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained('bert-base-cased') model = AutoModelForSequenceClassification.from_pretrained('bert-base-cased', num_labels=2) ``` --- #### 示例运行结果对比 下面给出了一些典型的机器翻译实验结果作为参考[^4]: | 原始语句 | 德语文本 | |----------|-----------| | Hello, how are you? | Hallo, wie geht's? | | This is a test of the translation model.| Dies ist ein Test des Übersetzungsmodells.| 以上表格表明经过良好调整后的 Transformer 可以生成高质量的目标语言表达形式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值