批处理大小与训练数据迭代 | AI生成和翻译
这是对训练nanoGPT(基于GPT-2架构的自回归语言模型)时上下文长度(块大小)和目标定义的清晰解析。
以下是对各要点的评估与澄清,特别聚焦于批大小和迭代/数据加载过程。
🧠 理解批大小与训练数据
您对序列、目标和分词化的理解基本正确,但在考虑批大小时,训练集中的token如何在不同迭代间使用的关系需要进一步澄清。
1. 序列、目标与块大小(上下文长度)
- 分詞化: 正确。GPT-2编码器将文本转换为一系列数字token。
- 序列/上下文 (\(X\)): 这是输入的块大小(例如1024个token)。它代表了模型用于进行预测的历史信息。
- 目标 (\(Y\)): 目标是输入序列向左移动一个token。这是因为自回归模型是根据当前序列预测下一个token。
- 如果您的输入序列 (\(X\)) 是 \([t_1, t_2, \dots, t_N]\),
- 那么对应的目标序列 (\(Y\)) 就是 \([t_2, t_3, \dots, t_{N+1}]\)。
- 模型学习在给定上下文 \([t_1, \dots, t_i]\) 的情况下预测 \(t_{i+1}\)。
2. 批大小的含义
- 批大小 (\(B\)): 批大小是指在训练过程中,一次前向和后向传播中同时处理的独立序列(上下文块)的数量。
- 如果 \(B=4\),模型会同时从数据集中加载4个不同的、不重叠的序列(每个序列大小为 \(N\))。
- 张量形状: 在一个训练步骤中,输入模型的张量形状为(批大小, 块大小),例如 \((B, N)\)。
\(\)\text{输入张量形状} = (B, N)\(\)
- 损失计算: 交叉熵损失是在该单个步骤中为所有 \(B \times N\) 个预测计算的。最终的损失通常是所有这些token上计算出的损失的平均值。
3. 训练集的迭代
您提到的token指的是用于从大型训练文本中提取 \(X\) 和 \(Y\) 对的滑动窗口技术,但当涉及批大小时,它们通常不代表连续的训练迭代。
数据集加载的典型过程:
- 第一个示例: 如果您的块大小是 \(N=1024\)。
- 输入序列 1 (\(X_1\)): \([t_1, t_2, \dots, t_{1024}]\)
- 目标序列 1 (\(Y_1\)): \([t_2, t_3, \dots, t_{1025}]\)
- 第二个示例(下一个块): 为了最大化数据利用率,下一个块通常紧接着前一个块开始,这意味着下一个块的第一个token是 \(t_{1025}\)。
- 输入序列 2 (\(X_2\)): \([t_{1025}, t_{1026}, \dots, t_{2048}]\)
- 目标序列 2 (\(Y_2\)): \([t_{1026}, t_{1027}, \dots, t_{2049}]\)
一个训练步骤(迭代)中发生的事:
如果您的批大小 (\(B\)) 是 4,那么一个训练步骤会同时使用数据集中前 \(B=4\) 个不重叠的块。
- 步骤 1: 计算以下项的损失/梯度:
- \(X_1 \to Y_1\) (Token \(t_1\) 到 \(t_{1025}\))
- \(X_2 \to Y_2\) (Token \(t_{1025}\) 到 \(t_{2049}\))
- \(X_3 \to Y_3\) (Token \(t_{2049}\) 到 \(t_{3073}\))
- \(X_4 \to Y_4\) (Token \(t_{3073}\) 到 \(t_{4097}\))
- 然后,更新模型参数。
- 步骤 2(第二次迭代): 下一个批次将从上一个批次最后一个序列的最后一个token之后紧接着的token开始。
- 下一个批次: 从 \(t_{4097}\) 开始作为 \(X_5\),并继续到 \(X_8\)。
您关于 \(t_{1025}\) 是 \(t_{1024}\) 的目标的观点是正确的。然而,您所说的”token 2 到 token 1025 , token 1026 , 是第二次迭代“仅在您的批大小为 1 时才准确。在标准的批大小大于1的情况下,模型是同时处理多个独立序列的。
您是否想了解梯度累积有时是如何被用来有效使用比内存容量更大的批大小的?