Skip to main content

Transformer

伟大无需多言。

info

《Attention Is All You Need》截止2025年,谷歌学术总引用次数排名第2。

关于大模型,我很早就了解了它的工作原理,但是和类与对象一样,很难在短时间内向他人讲述清楚。我认为抽象的内容最需要的是可视化的展示。

Transformer可视化这个项目很好的展示了Transformer的工作原理。

以下是我配套的一些补充说明,目的是根据公式与原理逐步手写一个Transformer模型。

以下是我的基础模型配置:

dtype = 'bfloat16' # 数据类型:即每个数字占用16位(2字节),适当降低精度可以减少显存占用并轻度降智,精度低于int4时模型会断崖式降智。
batch_size = 64 # 批次大小:越大训练速度越快,但占用显存越多。对模型智力影响偏小。
block_size = 1024 # 上下文长度:越大,模型理解的上下文越多,智力越强,但占用显存越多。
n_embd = 768 # 词嵌入维度:越大,模型学习能力越强,但占用显存指数级增加。对模型智力有较大影响。
n_layer = 6 # Transformer层数:层数越多,模型表达能力越强,但训练和推理时间线性增加,显存占用也增加
n_head = 6 # 注意力头数:多头注意力机制的头数,通常设为词嵌入维度的约数,用于并行学习不同的注意力模式
# 以下和显存占用无关,和收敛速度有关
dropout = 0.0 # Dropout比率:初期设为 0 加速训练,后期如果过拟合调成 0.1,用于防止过拟合
learning_rate = 6e-4 # 学习率:控制模型参数更新的步长,过大可能导致训练不稳定,过小训练速度慢
max_iters = 5000 # 最大训练迭代次数:训练的总轮数,需要根据数据集大小和训练效果调整
lr_decay_iters = 5000 # 学习率衰减迭代次数:学习率开始衰减的迭代次数,通常与max_iters相同
min_lr = 6e-5 # 最小学习率:学习率衰减的下限,防止学习率过小导致训练停滞
# 基础配置
device = 'cuda' # 计算设备:'cuda'表示使用GPU加速,'cpu'表示使用CPU(速度较慢)
compile = True # 是否编译模型:True会使用PyTorch的torch.compile优化,可以提升训练和推理速度

通过这个单元的学习,你可以获得一个专属于自己的大模型,并可以用于自己的业务场景。同时可以回答下面的问题:

不同的大模型可以用同一套提示词吗?

使用了相同的语料、token分词算法。那么大模型的tokenizer是相似的。通常来说,同个公司的大模型,语料与算法是相似的。因此相似的提示词可以生效。

如果语料差距较大、token分词算法不同,那么提示词可能无法生效。

常见的分词算法例如:Byte-Pair Encoding (BPE)

原理:通过合并最频繁的字符对来构建词汇表,适合处理罕见词和新词。

大模型最大上下文长度可以动态变化吗?

  • Transformer模型的设计中,输入序列的长度通常在模型的构建时就被固定。这是因为模型的自注意力机制需要为每个输入token计算与其他所有token的关系,计算复杂度与输入长度的平方成正比。因此,固定的输入长度可以简化计算和内存管理。

  • Transformer使用位置编码(Positional Encoding)来 为输入序列中的每个token提供位置信息。位置编码的维度通常与模型的隐藏层维度相同,而位置编码的数量通常是根据预设的最大输入长度来定义的。如果输入长度超过了这个预设值,模型将无法正确处理超出部分的token。

  • 在训练过程中,模型通常会使用固定长度的输入序列。如果训练数据中的序列长度超过了模型的最大输入长度,通常会进行截断或填充(padding),这可能导致信息丢失或计算效率低下。

Temperature 是如何影响模型输出的?

Temperature 是一个控制模型输出随机性的超参数。它会影响模型在选择下一个token时的概率分布。公式为:

Attention(Q,K,V)=softmax(QKT/dk)VAttention(Q, K, V) = softmax(QK^T / \sqrt{d_k}) * V
  • 当 Temperature 较高时,模型会倾向于选择概率较高的token,输出结果更确定。适合生成高质量、一致性强的文本。例如数学。
  • 当 Temperature 较低时,模型会倾向于选择概率较低的token,输出结果更随机。适合生成多样性、创造性强的文本。

理论上,Temperature 的取值范围不限,但是实际使用中,通常取值在0-2之间,过高的 Temperature 会导致模型输出不准确。

如果你想生成一个童话的故事,且你可以设置了一个的 Temperature 为0,那么模型会倾向于生成传统的王子和公主的故事。因为语料中,王子和公主的故事是最多的。如果你想生成一个多样化的故事,你可以设置一个较高的 Temperature,例如1.5。但是这可能会导致故事的逻辑性不强,或者出现不符合逻辑的情节。

代码

开源仓库地址:

https://github.com/jingyaogong/minimind-v

https://github.com/jingyaogong/minimind

李沐的动手学深度学习