Transformer核心概念I-token

2017年Transformer的诞生宣告了人工智能大模型阶段的开启,目前已经进入了大模型阶段的中期了,基于Transformer的算法创新不断推陈出新。在这过程中,对Transformer核心概念的理解显得尤为重要。接下来对Transformer模型中的核心概念逐一进行介绍。

1. 什么是Token

根据个人对Transformer模型的理解,对Token作如下定义:
Token是输入Transformer模型的数据的基本单位。
对Token的理解:
(1) Token是对现实对象重新离散化的数据单位。
现实对象要能够进入计算机中进行处理必须要转换为相应的数据格式,如何将现实对象转换为相应的数据格式这个问题已经被解决的比较彻底了,例如,图像数据以3个二维矩阵表示采集到的每个点的颜色,文字采用Unicode表示各个国家不同的文字和符号,温度采用二进制离散化进行表示,这些已经属于不是的问题的问题了。
在无论是在统计学习模型中还是在深度学习模型中,这些现实对象都是直接将对应的计算机数据直接输入到相应的模型中,也就是在统计学习模型和深度学习模型输入的数据是静态的,是直接将现实对象对应的计算机数据进行处理的。
在Transformer的模型中,实现对象对应的计算机数据并不是直接就输入到模型中,需要进行Tokenization操作从而得到Token,进行Tokenization操作的算法或是过程叫做Tokenizer。因此Transformer接收的数据Token是动态的。
(2) Token可以更好的揭示现实对象中的内部关系。
Token是通过Tokenizer算法依据原有数据集整体的条件下得到的,在这个过程中Tokenizer算法对数据根据某种特性重新进行关联与组合,这使得Token本身把现实对象分成了不同的部分。需要进一步说明的是,Token的产生既取决于Tokenizer算法还取决于数据集整体的情况。
在这里举一个简单的例子:英语“lower,higher”这两个单词组成的语料库,转换为模型可以处理的数据的过程
(1) 在使用传统的数据表示方式下:将把单词中每个字母的unicode编码作为数据,也就是1个字母占据一个字节,也就是“lower”一共5个字节,“higher”一共6个字节。
(2) 使用Token的方式下:采用目前比较主流的BPE(后续还会提到)算法作为Tokenizer算法,根据语料库的出现频率高低,将“lower,higher”分割为3个token:

low
high
er

然后针对分割后结果对这3个token分别进行编码,例如编码后的结果是:

low    00
high   01
er     10

但是,如果语料库是“lower,lowest”则分割为3个token

low
est
er

这里分割后的结果是不一样的。
(3) 得到Token的过程不属于Transformer,但又是Transformer所必须的。
Transformer模型的定义中没有包含Tokenization操作,但是Transformer需要将数据转换为Token,因此在使用Transformer的过程中,需要将数据转换为Token,然后再输入到Transformer中进行处理。

2. 实现Token的过程

前面讲的是Token的基本概念,如何实现Token才是核心问题。因为Token是需要处理数据的,而现实对象却是纷繁复杂,因此对不同性质的现实对象,实现Token的方式也是差别很大的。目前,NLP和CV是人工智能处理的主要的两种数据,下面就针对这两种数据,说明一下实现Token的过程。

NLP实现Token的方法

关于NLP实现Token的方法,目前主要有3类方法,如下图所示:
在这里插入图片描述
在这3类方法当中,目前大模型主要采用的是子词分词法,前两类由于各种限制,目前依据不再是主流方法了。
对于子词分词法,主要的分词过程如下图所示
在这里插入图片描述
这里需要说明一下,虽然这里列举了分词的主要步骤,最核心的就是第3步分词模型训练,不同分词算法其训练得到的模型是不一样的,也就使得分词的结果不一样。要真正的理解分词的处理过程,以及分词与Token的关系,读者需要具体分析分词算法,由于本文主要是讲解Token的主要概念,所以不对具体的分词算法进行介绍。

CV实现Token的方法

在CV中使用Transformer衍生出了ViT(Vision Transformer)算法,而在CV中实现Token的方法要比NLP实现Token要简单很多,直接通过分割为小块的方式就可以实现。如下图所示。
在这里插入图片描述

3. NLP分词(Token)的代码实现

为了更好的理解Token这个概念,接下来用一个基于Transformer的英语与德语之间机器翻译的典型实例,说明NLP是如何实现token的
该实例代码来源于github,由于这个实例的代码量比较大,在这里只给出了涉及tokenization的代码。

代码展示

import os
from urllib.request import urlretrieve

import sentencepiece
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tqdm import tqdm

class DataLoader:
    DIR = None
    PATHS = {
   
   }
    BPE_VOCAB_SIZE = 0
    MODES = ['source', 'target']
    dictionary = {
   
   
        'source': {
   
   
            'token2idx': None,
            'idx2token': None,
        },
        'target': {
   
   
            'token2idx': None,
            'idx2token': None,
        }
    }
    CONFIG = {
   
   
        'wmt14/en-de': {
   
   
            'source_lang': 'en',
            'target_lang': 'de',
            'base_url': 'https://nlp.stanford.edu/projects/nmt/data/wmt14.en-de/',
            'train_files': ['train.en', 'train.de'],
            'vocab_files': ['vocab.50K.en', 'vocab.50K.de'],
            'dictionary_files': ['dict.en-de'],
            'test_files': [
                'newstest2012.en', 'newstest2012.de',
                'newstest2013.en', 'newstest2013.de',
                'newstest2014.en', 'newstest2014.de',
                'newstest2015.en', 'newstest2015.de',
            ]
        }
    }
    BPE_MODEL_SUFFIX = '.model'
    BPE_VOCAB_SUFFIX = '.vocab'
    BPE_RESULT_SUFFIX = '.sequences'
    SEQ_MAX_LEN = {
   
   
        'source': 100,
        'target': 100
    }
    DATA_LIMIT = None
    TRAIN_RATIO = 0.9
    BATCH_SIZE = 16

    source_sp = None
    target_sp = None

    def __init__(self, dataset_name, data_dir, batch_size=16, bpe_vocab_size=32000, seq_max_len_source=100,
                 seq_max_len_target=100, data_limit=None, train_ratio=0.9):
        if dataset_name is None or data_dir is None:
            raise ValueError('dataset_name and data_dir must be defined')
        self.DIR = data_dir
        self.DATASET = dataset_name
        self.BPE_VOCAB_SIZE = bpe_vocab_size
        self.SEQ_MAX_LEN['source'] = seq_max_len_source
        self.SEQ_MAX_LEN['target'] = seq_max_len_target
        self.DATA_LIMIT = data_limit
        self.TRAIN_RATIO = train_ratio
        self.BATCH_SIZE = batch_size

        self.PATHS['source_data'] = os.path.join(self.DIR, self.CONFIG[self.DATASET]['train_files']
<think>嗯,用户想要深入了解Next-TokenPrediction的概念和实现细节。结合对话历史,用户之前已经接触过MM-VeT基准中该技术的应用场景,现在需要更基础的系统性解释。从用户引用的资料来看,尤其关注Emu3模型如何仅用该技术实现多模态[^4]和差分隐私的实现[^2],说明用户可能有技术落地的研究需求。用户引用的四篇文献中,[^1]和[^4]对构建基础概念框架最有用:[^1]明确将Next-Token定义为条件概率$P(x_{t+1}|x_{1:t})$,而[^4]的Emu3案例证明该技术可突破纯文本领域。需要强调两个关键点:1)本质是顺序决策问题2)多模态场景下输入X可以是图像/视频的特征向量。考虑采用模块化结构组织回答:首先用数学公式说明基础机制,接着用具体任务实例展示训练目标(如对数似然函数$$L(\theta)=-\sum\logP(x_t|x_{<t})$$[^1]),最后说明Transformer架构中的实现要点(Softmax层的位置输出)。可以补充用户在“相关问题”中提到的QFormer跨模态实现作为延展案例[^2]。注意到用户可能是技术人员(提问精准且带文献编号),拟在代码片段展示token生成循环的逻辑,但要避免堆砌细节。可以引用Emu3的非扩散模型特性来对比传统方法[^4],这能呼应历史对话里MM-VeT的讨论。</think> 以下是关于**Next-Token Prediction**的详细说明,结合概念原理与实现细节: --- ### 一、核心概念 **Next-Token Prediction**是自回归语言模型的核心训练目标,本质是预测序列中下一个词元的概率分布。其数学定义为: $$ P(x_{t+1} | x_{1:t}) $$ 其中 $x_{1:t}$ 是历史词元序列(输入上下文),$x_{t+1}$ 是待预测的下一个词元[^1]。该机制通过最大化对数似然训练模型: $$ L(\theta) = -\sum_{t=1}^T \log P(x_t | x_{<t}; \theta) $$ --- ### 二、实现机制 #### 1. **基础架构依赖** - **Transformer 结构**:依赖自注意力层捕获上下文关系,输出隐状态 $h_t$ - **Softmax层**:将 $h_t$ 映射为词表上的概率分布: $$ P(x_{t+1} | x_{1:t}) = \text{Softmax}(W \cdot h_t + b) $$ 其中 $W$ 是词嵌入矩阵的转置(共享权重)[^1][^4]。 #### 2. **多模态扩展**(如Emu3模型) - **输入表示**:将图像/视频特征编码为连续向量 $\mathbf{v}$,与文本嵌入拼接 - **预测目标统一性**:无论输入是文本还是图像,均预测下一词元: $$ P(x_{t+1} | \mathbf{v}, x_{1:t}) $$ 通过统一的自回归训练实现跨模态生成(无需扩散模型)[^4]。 #### 3. **差分隐私实现**(如PMixED协议) - **噪声注入**:在梯度更新时添加高斯噪声 - **敏感度控制**:裁剪梯度范数以限制隐私预算 $\epsilon$,公式满足: $$ \Delta f \leq \frac{C}{\sqrt{N}} $$ 其中 $C$ 是裁剪阈值,$N$ 是样本量[^2]。 --- ### 三、代码示例(简化版) ```python import torch.nn as nn class NextTokenPredictor(nn.Module): def __init__(self, vocab_size, hidden_dim): super().__init__() self.transformer = nn.TransformerEncoder(...) # Transformer编码层 self.output_layer = nn.Linear(hidden_dim, vocab_size) def forward(self, input_tokens): # 输入序列编码 hidden_states = self.transformer(input_tokens) # [batch, seq_len, hidden_dim] # 预测下一词元概率 logits = self.output_layer(hidden_states[:, -1, :]) # 仅取最后位置 return logits # [batch, vocab_size] ``` --- ### 四、关键应用与特性 | **特性** | **说明** | |--------------------|------------------------------------------------------------------------| | **多模态统一生成** | 纯基于Next-Token Prediction处理文本/图像/视频(如Emu3模型)[^4] | | **误差累积问题** | 早期预测错误会传播到后续生成(需设计回滚机制或强化学习修正) | | **隐私保护扩展** | 差分隐私技术可保护训练数据(如对梯度加噪)[^2] | --- **
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值