【课程笔记·李宏毅教授】深入Sequence to Sequence模型与Transformer架构的应用、原理与细节

Seq2Seq与Transformer详解
部署运行你感兴趣的模型镜像

其实之前我们已经提过Transformer不下N次了,如果还有同学不清楚它是什么——简单说,Transformer的英文和“变形金刚”是同一个词,是不是一下子有画面感了?而且它和我们之后会讲到的BERT关系非常紧密,就像这张投影片里探出头的BERT一样,两者是“强绑定”的存在。

首先,我们得明确:Transformer本质是一个Sequence to Sequence(序列到序列,简称Seq2Seq)模型。那Seq2Seq模型到底是什么?我们之前讲过输入是序列的场景,当时提到输出有几种可能:第一种是输入和输出长度一样,这是作业二的内容;第二种是输出一个单一结果,比如分类标签,这是作业四的任务;而作业五要面对的,是我们不知道输出该有多长,需要机器自己决定输出长度的场景。

一、Seq2Seq模型的核心应用场景:机器自主决定输出长度

为什么Seq2Seq模型重要?因为现实中有大量任务需要机器“自主判断输出长度”,我举几个典型例子,大家就能直观理解了。

1. 语音辨识:从声音讯号到文字

语音辨识是最经典的Seq2Seq应用之一。输入是声音讯号——我们在课上已经看过很多次,声音讯号本质是一串特征(Feature)序列;输出是对应的文字,比如中文里的方块字,我们用圈圈代表每个字。

这里的关键是:输入和输出的长度没有绝对对应关系。假设输入声音讯号的长度是大T,我们没办法根据大T直接确定输出文字的个数。比如同样10秒的声音,可能是“你好”两个字,也可能是“今天天气真好”六个字,必须让机器自己“听内容”来决定输出多少个文字。

2. 机器翻译:跨语言的序列转换

机器翻译也是典型场景。让机器读一种语言的句子(比如中文),输出另一种语言的句子(比如英文),输入长度是N,输出长度是N’,但N和N’的关系没有固定规律。

比如输入“机器学习”(4个中文汉字),输出“machine learning”(2个英文单词);但输入“我今天吃了美味的午餐”(10个汉字),输出“I had a delicious lunch today”(6个英文单词)——不是所有中文到英文的翻译都是“输出长度减半”,到底该输出多长,得机器自己根据语义判断。

3. 语音翻译:跳过文字,直接跨语言转换

比机器翻译更复杂的是“语音翻译”——你对机器说一种语言的语音(比如英文“machine learning”),它直接输出另一种语言的文字(比如中文“机器学习”),而不是先把语音转成文字再翻译。

为什么要做语音翻译?因为世界上超过7000种语言中,半数以上没有文字。比如有些小语种,连书写系统都没有,根本没办法做“语音辨识→文字翻译”的两步流程,只能靠语音翻译直接转成有文字的语言(比如中文、英文)。

拿台语举例,虽然很多人认为台语有文字,但台语文字普及率极低——就算小学教台语文字,普通人也很难看懂。如果做台语语音辨识,输出“母他了”这样的台语文字,大家根本不知道是什么意思;但如果做语音翻译,输入台语语音,直接输出“你还好吗”这样的中文句子,普通人就能理解了。

那这种模型能实现吗?当然可以!核心是要有“台语语音讯号+中文文字”的配对数据。其实这种数据不难找,比如YouTube上有很多台语语音配中文字幕的视频,把语音和字幕提取出来,就能得到训练数据。我们实验室就真的这么做了——下载了1500小时乡土剧的台语语音和中文字幕,直接训练模型。

大家可能会担心:乡土剧有杂音、有音乐,字幕还可能和语音对不上怎么办?我们的做法是“先不管这些问题”,直接把数据喂进去训练,这种“一步到位”的模型思路叫“End-to-End(端到端)”。

训练结果超出预期:输入台语语音“利馨特别美刊”,机器能输出“你的身体撑不住”;输入“波乃波及”(台语“没事”的发音),机器能输出“没事,你为什么要请假呢”。当然机器也会犯错,比如台语转中文需要倒装时(比如台语“你饭吃了吗”对应中文“你吃了饭吗”),机器就容易出错,但这已经证明“台语语音直接转中文”是可行的。

如果大家想了解更多台语语音处理的内容,可以看投影片里的这个网站链接。

4. 其他延伸应用:语音合成、聊天机器人

Seq2Seq模型的应用远不止这些:

  • 语音合成:和语音辨识反过来,输入文字(比如台语文字或中文),输出对应的声音讯号。我们用台湾“水虾”语音数据集训练过模型,输入“欢迎来到台湾台大语音处理实验室”,机器能合成出对应的台语语音——不过目前还是分两步:先把中文转成台罗拼音(类似音标),再把音标转成声音,其中“音标转声音”用的就是类似Transformer的Seq2Seq模型(叫Tacotron)。
  • 聊天机器人:输入是你的对话内容(文字序列),输出是机器的回应(文字序列),比如你说“嗨”,机器输出“Hello, how are you today?”。训练时只要收集大量人类对话数据(比如电视剧、电影台词),让机器学习“输入一句话→输出对应回应”的规律就行。

二、NLP任务的“万能解法”:把一切变成QA问题,用Seq2Seq模型解决

其实在自然语言处理(NLP)领域,Seq2Seq模型的应用比大家想象的更广泛——很多看似不相关的NLP任务,都能转化成“问答(QA)问题”,再用Seq2Seq模型解决

什么是QA问题?就是“给机器一段文字(文章),再问一个问题,让机器输出答案”。怎么把其他任务转成QA?我举几个例子:

  • 翻译任务:文章是“英文句子”,问题是“这个句子的德文翻译是什么?”,答案是“德文句子”。
  • 文本摘要:文章是“长篇文章”,问题是“这篇文章的摘要是什么?”,答案是“摘要文字”。
  • 情感分析:文章是“网友对产品的评价”,问题是“这篇评价是正面还是负面的?”,答案是“正面”或“负面”。

比如做情感分析时,如果你开发了一个产品,想知道网友评价是好是坏,不可能雇人逐条看——这时就可以把“评价文章+问题‘这是正面还是负面?’”作为输入,让Seq2Seq模型输出“正面”或“负面”,轻松解决问题。

为什么这种方法可行?因为Seq2Seq模型的核心能力就是“输入一个序列(文章+问题),输出一个序列(答案)”,不管任务本质是什么,只要能套进这个框架,就能用它来解。

但我必须强调一点:对多数任务而言,为任务“定制化模型”会比用通用Seq2Seq模型效果更好。Seq2Seq模型就像瑞士军刀,能切菜、能开瓶、能拧螺丝,但切菜不如菜刀快,开瓶不如开瓶器方便。比如做情感分析,专门的分类模型(如CNN、RNN)效果会比Seq2Seq好;做语音辨识,专门的模型(如RNN Transducer)效果也更优——Google Pixel 4的语音辨识用的就是RNN Transducer,而不是Seq2Seq。

如果大家对“任务定制化模型”感兴趣,可以看投影片里“深度学习与人类语言处理”这门课的链接,里面有详细讲解各种语音和NLP任务的专用模型。

三、“硬核”应用:用Seq2Seq模型解看似不相关的任务

更有意思的是,有些任务看起来和“序列”完全无关,但也能用Seq2Seq模型“硬解”,我举两个例子:

1. 文法剖析(语法分析):把树状结构转成序列

文法剖析的任务是给机器一段文字(比如“Deep learning is very powerful”),让它输出“语法树”——比如“Deep+learning”是名词短语,“very+powerful”是形容词短语,最终组成完整句子。

语法树是“树状结构”,不是序列,怎么用Seq2Seq解?关键是把树状结构转成序列。比如语法树“S→NP+VP,NP→Deep learning,VP→is very powerful”,可以转成“(S (NP Deep learning) (VP is (ADJ very powerful)))”这样的序列——括号的位置和顺序能还原树状结构。

之后只要训练一个Seq2Seq模型,输入是“Deep learning is very powerful”,输出是上面这个序列,再把序列转回语法树,就能完成文法剖析。

这个思路听起来很大胆,但早在2014年底(Seq2Seq模型还只用于翻译时),就有一篇叫《Grammar as a Foreign Language》的论文实现了——作者把文法剖析当成“翻译任务”,把“语法树序列”当成“另一种语言”,用当时的Seq2Seq模型硬解,居然达到了当时的SOTA( state-of-the-art,最优)效果。

我后来在国际会议上遇到了这篇论文的第一作者,问他训练这个模型有没有什么技巧,他说:“没什么技巧,连Adam优化器都没敢,直接用梯度下降,第一次训练就成功了,调调参数就到SOTA了。”虽然听起来有点夸张,但这确实证明了Seq2Seq模型的灵活性。

2. 多标签分类(Multi-Label Classification):让机器决定输出标签数量

多标签分类和我们常说的“多类别分类(Multi-Class)”不一样:多类别分类是“从多个类别里选一个”(比如判断文章是“体育”“娱乐”“科技”中的哪一类);而多标签分类是“一个样本可以属于多个类别”(比如一篇文章可以同时属于“体育”和“科技”)。

怎么用Seq2Seq解?比如输入是“一篇同时讲篮球和AI的文章”,让模型输出“体育,科技”这个序列——机器会自己判断这篇文章该输出2个标签,而不是我们提前设定“输出前2个分数最高的标签”(因为不同文章的标签数量不一样,有的1个,有的3个)。

3. 目标检测(Object Detection):从图像到序列

目标检测是给机器一张图片,让它框出里面的物体(比如“斑马”“树”),看起来和序列完全无关,但也能用Seq2Seq硬解——具体做法可以参考投影片里的文献链接,核心思路是把“物体位置+类别”转成序列(比如“斑马, x1,y1,x2,y2; 树, x3,y3,x4,y4”),再用Seq2Seq模型学习“图像→序列”的映射。

讲这么多,就是想告诉大家:Seq2Seq模型是一个非常强大、灵活的工具,能解决远超“翻译、语音”的各类任务。接下来,我们就来深入它的核心——Transformer的架构。

四、Transformer架构核心:Encoder(编码器)与Decoder(解码器)

所有Seq2Seq模型都包含两部分:Encoder(编码器)Decoder(解码器)。Encoder负责“处理输入序列”,把输入转换成有语义信息的向量;Decoder负责“生成输出序列”,根据Encoder的结果,自主决定输出序列的长度和内容。

Seq2Seq模型的起源很早,2014年9月就有论文把它用于机器翻译,但当时的模型还比较简单;而现在提到Seq2Seq,大家最先想到的就是Transformer——它的Encoder和Decoder架构里有很多“花花绿绿的模块”,接下来我们先拆解Encoder的细节。

1. Encoder的核心任务:输入序列→输出序列

Encoder的任务很明确:输入一排向量(比如经过Embedding的Token向量),输出一排长度相同、但包含更多语义信息的向量。能做这件事的模型有很多,比如RNN、CNN,还有我们之前讲过的Self-Attention——而Transformer的Encoder,用的就是Self-Attention。

2. Encoder的内部架构:Block(块)的堆叠

Transformer的Encoder不是一个单一模块,而是由多个Block(块)堆叠而成。每个Block的输入是一排向量,输出也是一排向量;第一个Block的输出会作为第二个Block的输入,直到最后一个Block,输出Encoder的最终结果。

这里要注意:一个Block不等于“一层神经网络”,因为每个Block内部包含了多层操作。接下来我们就拆解一个Block的具体流程(按照Transformer原始论文的设计):

步骤1:Self-Attention(自注意力)

首先,输入向量会经过Self-Attention模块——它会计算每个Token和序列中所有其他Token的相关性,把上下文信息融入到每个Token的向量中,输出一排新的向量。

步骤2:Residual Connection(残差连接)

原始Transformer在Self-Attention之后,加入了“残差连接”:把Self-Attention的输入向量直接加到输出向量上。比如Self-Attention的输入是向量A,输出是向量B,残差连接后得到的就是A+B。

为什么要加残差连接?这是深度学习中很常用的技巧,能解决深层网络训练时的“梯度消失”问题——让梯度更容易从深层传到浅层,我们之后有时间再细讲。

步骤3:Layer Normalization(层归一化)

残差连接之后,会进行“Layer Normalization(层归一化)”,而不是我们之前讲过的Batch Normalization(批归一化)。两者的核心区别在于:

  • Batch Normalization:需要考虑“批次(Batch)”信息,对同一个维度(比如Token向量的第1维)、不同样本的数值计算均值和标准差;
  • Layer Normalization:不需要考虑Batch,对同一个样本、同一个向量的不同维度计算均值和标准差。

Layer Normalization的具体操作很简单:对输入向量的每个维度,减去该向量的均值,再除以该向量的标准差,得到归一化后的向量。这一步能让模型训练更稳定,加快收敛速度。

步骤4:Feed-Forward Network(前馈神经网络)

归一化后的向量会输入到“Feed-Forward Network(前馈神经网络,简称FFN)”——它是一个全连接网络,会对每个Token的向量进行独立处理(不考虑Token间的关系),进一步提炼语义信息,输出一排新的向量。

步骤5:再次残差连接+Layer Normalization

和Self-Attention之后一样,FFN的输出也会加上FFN的输入(再次残差连接),然后再做一次Layer Normalization——这才是一个Encoder Block的最终输出。

3. 原始架构的优化:不是所有设计都是最优的

这里要提醒大家:Transformer原始论文的架构,并不是最优设计,后来有很多研究对它进行了优化。比如:

(1)Layer Normalization的位置

原始架构中,Layer Normalization是在“Self-Attention→残差连接”之后、“FFN→残差连接”之后;但2020年的论文《On Layer Normalization in the Transformer Architecture》发现,把Layer Normalization放到“每个Block的输入”(比如先对输入做Layer Normalization,再进Self-Attention),模型效果会更好。

(2)归一化方法的选择

原始架构用Layer Normalization,但论文《PowerNorm: Rethinking Batch Normalization in Transformers》提出:Batch Normalization在Transformer中效果不如Layer Normalization,是因为它对Batch大小太敏感;而作者提出的“PowerNorm”,效果和Layer Normalization相当,甚至更好,且不依赖Batch大小。

五、小结与后续

今天我们重点讲了Seq2Seq模型的应用场景(语音辨识、翻译、文法剖析等),以及Transformer Encoder的详细架构——从Self-Attention到残差连接,再到Layer Normalization和FFN,每个模块的作用和流程都拆解清楚了。

不过因为时间快到六点了,Decoder的部分我们没办法在今天讲完,留到下次课继续。大家对今天讲的内容有什么问题吗?可以现在提出来,我们一起讨论。

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑客思维者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值