guide.md · 可读全文
这里保留原文的中文、公式标记、代码和链接。可直接交给 Agent 读取,也可选取下方原文复制。此入口返回 HTML;原始 .md / .py 文件仍保留,完整候选包同时包含 UTF-8 原件。
# 学习导读|从机器翻译到 Transformer “我昨天给了他一本书。”怎样变成 `I gave him a book yesterday.`?一个译文已经包含了许多决定:谁给谁、动作发生在什么时候、哪些单位要合在一起理解,以及英文怎样安排这些信息。本讲从这件具体的事出发,逐步建立能处理序列、生成译文、读取上下文的系统,再讨论图像和计算资源带来的新问题。 贯穿这些变化的是一个研究问题:**面对当前任务,系统缺少哪种信息或处理信息的能力,哪项技术选择值得尝试,又需要什么证据支持?**理解这条因果关系,比记住机制出现的先后更有用。 [开始课堂](classroom/R00.html?step=b0) · [连续阅读八章讲义](lecture.html) · [十三个完整主题](course/knowledge/index.html) · [七本 Notebook 与实验读法](experiments.html) ## 一、先把翻译中的决定做出来 分词让文字成为可处理的单位。本讲采用 `我/昨天/给/了/他/一/本/书/。` 九个教学单位;这是为分析服务的切分,不意味着所有分词器都应得到同样结果。词性和局部组合帮助判断“本”在“一本书”中的量词用法;语法关系进一步说明“我”是给予者、“他”是接收者,于是英文中需要考虑 `I` 与 `him` 的形式。命名实体识别则回答另一类问题:原句中的“我、他”是代词,原句没有显式人名。 词典、关系分析和重排已经能够协助完成这个受限翻译。若任务只要求提取明确的人名片段,规则或小模型也可能足够;是否采用更复杂的系统,要连同任务范围、延迟、成本和维护一起判断。接下来遇到的是如何从更多语料中学习、让不同词和不同句子共享经验的问题。词向量把单位映射为可学习的表示,邻词预测提供一种学习信号;有了词向量以后,整句关系仍需要组合计算。 回看[语言分析与组句(T01–T06)](classroom/T01.html?step=b0)和[从 ID 到共享表示(T07–T09)](classroom/T07.html?step=b0)。完整理解过程见[第一章:从关系与短语到共享表示](lecture.html#chapter-1);继续深读[同一句话怎样成为分析对象与模型输入](course/knowledge/text-units-and-representations.html)。 ## 二、让状态走完输入,再让系统生成完整输出 RNN 用同一组参数反复更新状态,将当前位置的输入与此前的状态组合起来。“昨天”进入计算时,状态中已经可能带有“我”的影响。共享参数使不同长度的序列可以使用同一套更新规则,也让训练信号沿时间传回。序列加长后,信息保留和梯度传播都值得检查;LSTM 的门控提供了控制写入、保留和读出的办法,效果仍取决于训练与任务。 读完中文还不等于已经生成英文。Seq2Seq 将编码器与解码器接起来:源信息形成生成的条件,从开始符 BOS 出发,每次预测一个目标单位,选出的单位再进入下一步,直到结束符 EOS。句号本身仍是一个预测目标,不能代替 EOS。训练时可以提供正确的历史前缀,生成时则要沿自己的选择继续;因此逐词损失下降以后,还要检查完整输出。 回看[共享状态与门控(T10–T14)](classroom/T10.html?step=b0)和[从 BOS 到 EOS、再到条件训练(T15–T18)](classroom/T15.html?step=b0)。完整推导见[第二章:从 RNN 到条件训练](lecture.html#chapter-2)。可从[状态与梯度](course/knowledge/recurrent-state-and-credit.html)、[预测目标与评价](course/knowledge/objectives-and-evaluation.html)、[训练分数与实际生成](course/knowledge/teacher-forcing-and-generation.html)三个主题继续。 ## 三、固定摘要已经能工作,为什么还要逐次读取? 固定摘要给出了一个完整、可以训练的序列系统,但所有目标位置都要通过受限的源信息入口取得条件。写到 `I gave` 时,接收者可能特别相关;写到书或时间时,当前需要的信息又会改变。Attention 保留各个源位置的表示,让当前生成状态参与决定这一步怎样读取。 这里有两种不同的归一化:先在源位置上分配读取权重,再把读出的内容和生成状态送入输出计算,在目标词表上形成概率。一个位置得到较大权重,并不等于系统已经选中了某个英文词。2014 年的 attention 可以与循环系统一起工作;当时值得检验的是它是否改善了具体错误,以及改善是否足以支付增加的资源。 回看[固定入口留下的问题(T19)](classroom/T19.html?step=b0)与[读取怎样走到下一词概率(T20–T24)](classroom/T20.html?step=b0)。完整展开见[第三章:从固定摘要到逐次读取](lecture.html#chapter-3);原始研究条件与机制分别见[2014 年的翻译选择](course/knowledge/translation-choices-2014.html)和[读取之后怎样决定写 him](course/knowledge/attention-to-prediction.html)。 ## 四、重新考虑循环以后,整台翻译器怎样成立? 有了动态读取,还可以继续追问:源位置的表示是否必须依靠逐步循环才能形成?Transformer 让位置之间直接交互,同时用位置条件、可见范围和逐位置计算承担原系统中的不同职责。这项选择带来了新的并行机会,也带来了成对交互和存储的代价,需要与当时有竞争力的循环、卷积路线比较。 读整机时,要分清编码器的 self-attention、解码器的 causal self-attention,以及解码器对源表示的 cross-attention。多头、残差、归一化和前馈网络共同完成一层;输出词表头才把最后的表示变成下一词分布。训练中已知的目标位置可以并行计算,尚未生成的新词仍要等待前一步。 回看[源位置怎样形成表示(T25–T29)](classroom/T25.html?step=b0)和[完整层与完整解码器(T30–T34)](classroom/T30.html?step=b0)。见[第四章:原有职责由谁承担](lecture.html#chapter-4),以及[让整套 Transformer 共同完成一次预测](course/knowledge/transformer-information-flow.html)。 ## 五、架构出现以后,能力还怎样改变? 移去中文以后,训练任务已经发生变化。下一词预测、补全被遮住的内容和重建受损文本,让同一段文字提供不同的学习要求。数据覆盖什么、目标要求模型保留什么、预训练投入多大规模,都会影响系统最终可以做什么;仅有一张 Transformer 结构图,不能解释今天模型的全部能力。 翻译也可以作为指令和输入放进 decoder-only 模型的同一因果前缀。此时,更新参数与补充当前上下文是两种不同的改变。现代部件值得放回完整模型中理解:它改变了哪项计算、训练或资源条件,依据什么结果采用,而不是只记住名称。 回看[训练目标、前缀与参数更新(T40–T43)](classroom/T40.html?step=b0)。见[第五章:训练让能力改变,任务让系统分化](lecture.html#chapter-5);深入阅读[同一段文本的三种预训练问题](course/knowledge/model-objectives.html)和[在已有 block 上理解现代部件](course/knowledge/modern-transformer-parts.html)。 ## 六、图像补充了信息,也要求重新说明任务 原句没有说明封面颜色。如果任务仍是忠实翻译,凭空加上 `blue` 会改变原意。若任务改为“结合文字和图片,描述这次给书并补充封面颜色”,图像便提供了回答颜色问题所需的新证据。 随后才有机制问题:像素怎样成为视觉表示,怎样与语言的表示维度衔接,语言计算怎样读到这些条件,训练又怎样建立图文对应。换图后分数改变,可以说明输入影响了通路;是否采用了正确的视觉事实,还要结合任务标签、相关图、错配图和缺少证据的条件判断。 回看[明确缺少的信息与新任务(T44–T45)](classroom/T44.html?step=b0),再看[视觉表示、训练与事实使用(T46–T49)](classroom/T46.html?step=b0)。见[第六章:图像怎样成为语言计算的新证据](lecture.html#chapter-6)和[换图后分布改变,模型是否看懂了](course/knowledge/visual-condition-use.html)。 ## 七、计算正确以后,怎样让资源花得值得? 生成已经进行到 `a`,选出的 `blue` 作为新输入时,旧前缀中哪些计算可以复用?KV cache 保存各层已有位置的键和值,减少重复计算;新增位置仍要逐层处理,缓存也占用内存。 再看多位置一起计算的阶段:朴素 attention 会形成大的分数表和概率表,计算量、存储容量与数据搬运可能分别成为瓶颈。FlashAttention 改变分块、片上存储和 softmax 的累计方式,在数学上计算同一定义的 attention,浮点计算则按容差核对;它没有把一般的成对 attention 运算量改成线性。缓存与这种执行优化解决的问题不同,实际速度还要看实现、形状、精度和硬件。 回看[逐词生成中的复用(T50)](classroom/T50.html?step=b0)与[一次 attention 内的搬运(T51)](classroom/T51.html?step=b0);需要逐项计算时进入[资源展开(T60–T65)](classroom/T60.html?step=b0)。见[第七章:同一 attention 怎样改变执行](lecture.html#chapter-7),以及[缓存与有效上下文](course/knowledge/cache-and-effective-context.html)、[有单位的资源账本](course/knowledge/resource-ledger.html)。 ## 八、回到当时,判断下一步值得改变什么 现在回到固定摘要已经可以工作的时点。扩大状态、改变读取方式、补充训练数据,都可能是合理的下一步。判断要落在具体预期上:希望减少哪类错误,需要增加多少成本,哪项结果会让自己改变原来的选择? 这也适用于后面的视觉和效率问题。能接入图像之后,要问相关事实是否被采用;能容纳更长输入之后,要问远处证据是否真正影响回答;减少重复计算之后,要核对实际时间和资源。不同证据支持不同结论,它们共同构成研究选择的依据。 回看[全课回访与研究选择(T52–T53)](classroom/T52.html?step=b0),阅读[第八章:回看技术转折,继续提出问题](lecture.html#chapter-8);还可沿[从 2017 计算图到后续架构与持续状态系统](course/knowledge/architecture-choices-and-state.html)继续比较。 ## 课后怎样继续 连续讲义适合补齐前后因果;[十三个完整主题](course/knowledge/index.html)适合从一个疑问向下追。可以先读到能够提出具体问题的位置,例如“读取权重为什么不是词表概率”,把该主题的完整 URL 和自己的疑问交给 Agent;需要时一并给出图、公式或保存输出。 讨论之后,沿主题中的链接回到同一本 Notebook,核对一个变量、一行概率或一项实际结果。若想改变条件,先写下预期,再在自己的副本运行相关单元,并保留这次的配置与输出。无需先完成所有实验。七本 Notebook 的分工和三个具体读法见[实验入口](experiments.html)。