参数意义
batch_size:批量大小
seq_len:序列长度,也就是题主说的一条语料数据的长度啦
d_model: 序列中每个token的embedding向量维度
vocab_size:词表大小。也就是每个token在做embedding前的one-hot向量维度
在Transformer架构中,几个关键参数的意义如下:
1. **batch_size**:
- 指的是在一次前向传播过程中同时处理的数据样本数量。例如,在训练神经网络时,通常不是一次性只用一个样本,而是将多个样本打包成一个批次进行计算,以利用并行计算的优势。所以`batch_size`是这个批次中的样本数。例如,如果`batch_size`设置为32,那么每次更新梯度时,网络会一次性处理32条不同的句子或序列。
2. **seq_len**:
- 表示单个样本(如一句话或一段文本)中的最大序列长度。序列可以是一个单词序列、字符序列等。比如,如果我们处理的是一段英文文本,且最长句子包含100个单词,则`seq_len`就是100。这意味着 Transformer 在处理输入时会将其填充或截断至统一的100个时间步长。
3. **d_model**:
- 是Transformer模型中嵌入层的输出维度或者说隐藏层维度,也即模型内部的特征维度。在词嵌入阶段,每个词会被映射到一个`d_model`维的向量空间中。例如,若`d_model`设置为512,那么每个输入的单词将会被表示为一个512维的向量。
4. **vocab_size**:
- 指的是词汇表的大小,即模型能够识别的独特词汇数量。例如,在训练一个英文翻译任务的Transformer时,词汇表可能包含了所有可能出现的英语单词以及一些特殊符号(如未知词标记、开始符和结束符等)。如果词汇表有10,000个不同的单词,那么`vocab_size`就是10,000。这个值决定了模型最后一层的权重矩阵大小,用于将隐藏状态解码回原始的词汇形式。
举例说明:
假设我们正在训练一个Transformer模型来翻译英文句子到法文,我们的训练数据集包含如下参数:
- `batch_size = 32`:每次迭代时,模型会一起处理32句英文句子及其对应的法文译文。
- `seq_len = 20`:为了简化问题,我们设定每句话最多包含20个单词。
- `d_model = 512`:模型对每个单词使用512维的向量表示,并在此维度上进行复杂的注意力计算。
- `vocab_size = 30,000`:词汇表包含了30,000个英文单词和法文单词(包括特殊符号)。当模型在生成法文译文时,它会在最后通过一个大小为`(512, 30000)`的权重矩阵来预测下一个最有可能出现的法文单词。
1 调试代码
if __name__ == '__main__' :
config = ModelArgs(dim=8, n_layers=2, n_heads=32, n_kv_heads=32,
vocab_size=32000, hidden_dim=None, multiple_of=256, norm_eps=1e-05, max_seq_len=3, dropout=0.0)
model = Transformer(config)
input_tokens = torch.randint(0, 32000, (1, 3)) # 单个样本,序列长度为128
output_logits = model(input_tokens)
print(f"Output logits shape: {
output_logits.shape}")
2 关键代码
2.1 embedding层
# 调用
h = self.tok_embeddings(tokens)
作用:
用于将离散的单词或标签等转换成一个固定大小的连续向量
ord_indexes 包含了词汇表中的单词索引,embedding_layer 创建了一个嵌入矩阵,每一行代表一个单词的向量。当索引通过嵌入层时,它会返回相应的词向量。
这段代码演示了如何创建一个 nn.Embedding
模块,并使用它来将一个包含索引的张量转换为相应的嵌入向量。具体步骤和作用解释如下:
创建 Embedding 模块:
embedding = nn.Embedding(10, 3)
这一行代码创建了一个 nn.Embedding
模块实例,参数设定如下:
num_embeddings=10表示词汇表大小,即有 10 个不同的单词(或其他离散符号)各自对应一个嵌入向量。
embedding_dim=3表示每个嵌入向量的维度为 3,即每个单词将被映射为一个三维向量。
在创建过程中,模块会自动初始化这些嵌入向量,通常使用随机分布(如均值为 0、标准差为 1 的正态分布)生成初始值。
准备输入数据:
input = torch.LongTensor([