--- created: 2025-08-03 21:19:11 tags: - "Research" - "基础" - "Transformer" - "训练" - "反向传播" --- ### 训练数据集 现在我们已经了解了[[Transformer]]的整个前向传播的过程,那我们继续看一下训练过程。 在训练期间,未经训练的模型会进行相同的前向传播过程。由于我们是在有标记的训练数据集上训练它,所以我们可以将其输出与实际的输出进行比较。 为了便于理解,我们假设预处理阶段得到的词汇表只包含六个单词(“a”, “am”, “i”, “thanks”, “student”, **“”) 一旦我们定义好了词汇表,我们就可以使用长度相同的向量(独热码,[[One-Hot编码]] 向量)来表示词汇表中的每个单词。例如,我们可以用以下向量表示单词“am”: 接下来让我们讨论一下模型的损失函数,损失函数是我们在训练阶段优化模型的指标,通过损失函数,可以帮助我们获得一个准确的、我们想要的模型。 ### 损失函数 假设现在是训练阶段的第一步,我们用一个简单的例子(一个句子就一个词)来训练模型:把 `“merci”` 翻译成 `“thanks”`。 这意味着,我们希望输出是表示“谢谢”的概率分布。但由于这个模型还没有经过训练,所以目前还不太可能实现。 如何比较两种概率分布?在这个例子中我们只是将二者相减。实际应用中的损失函数请查看 [交叉熵损失](https://colah.github.io/posts/2015-09-Visual-Information/) 和 [Kullback–Leibler散度](https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained) 。 上述只是最最简单的一个例子。现在我们来使用一个短句子(一个词的句子升级到三三个词的句子了),比如输入 `“je suis étudiant”` 预期的翻译结果为: `“i am a student”`。 所以我们希望模型不是一次输出一个词的概率分布了,能不能连续输出概率分布,最好满足下边要求: - 每个概率分布向量长度都和词汇表长度一样。我们的例子中词汇表长度是6,实际操作中一般是30000或50000。 - 在我们的例子中第一个概率分布应该在与单词“i”相关的位置上具有最高的概率 - 第二种概率分布在与单词“am”相关的单元处具有最高的概率 - 以此类推,直到最后输出分布指示“”符号。除了单词本身之外,单词表中也应该包含诸如“”的信息,这样softmax之后指向“”位置,标志解码器输出结束。 模型一次产生一个输出,在这么多候选中我们如何获得我们想要的输出呢?现在有两种处理结果的方法: - 一种是贪心算法(greedy decoding):模型每次都选择分布概率最高的位置,输出其对应的单词。 - 另一种方法是束搜索(beam search):保留概率最高前两个单词(例如,“I”和“a”),然后在下一步继续选择两个概率最高的值,以此类推,在这里我们把束搜索的宽度设置为2,当然你也可以设置其他的束搜索宽度。