| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 李宏毅老师《机器学习》课程笔记-5 Transformer -> 正文阅读 |
|
[人工智能]李宏毅老师《机器学习》课程笔记-5 Transformer |
Lecture 5- Seq2seq: transformer本节课的基础知识是 Self-attention,欢迎阅读 上节课的笔记:Self-attention。 Seq2seq 应用1. 语音和自然语言处理Seq2seq 模型应用广泛,尤其是在自然语言处理任务中,例如:语音识别,语音生成,语音翻译 (speech translation),聊天机器人 (Chat-bot),等等。 这里要特别提一下 speech translation。你可能会觉得奇怪,用语音识别转成文字,再翻译不就好了吗?要知道,世界上有七千多种语言,超过一半是没有文字的。有了 speech translation,就可以把这些语言转换成有文字的语言。 Seq2seq 还可以用于解决 Question Answering (QA) 任务。其实很多问题都可以转化成 QA 来解决,例如:translation, sentiment analysis, abstract,等等。如下图所示,把目标当作 Answer,文本数据当作 Context,Context 和 Answer 之间通过 Question 联系起来,就可以转换成一个 Question Answering 任务。而 QA 可以用 Seq2seq 解决。 如此说来,大部分的 NLP 任务都可以用 Seq2seq 模型来解决。Seq2seq 可谓是全能型选手。看到这里,你可能会想起,在讲 CNN(卷积神经网络)时介绍过,虽然 Fully Connected Network 是全能型选手,可以解决各式各样的问题,但是在图像处理上,它没有专门针对图像特性优化的 CNN 性能好。Seq2seq 也是类似的情况,虽然它可以解决各种 NLP 任务,但在某个特定的语音或文本处理任务上,它的表现不如专门为任务设计的模型好。 2. 新奇的应用还有看上去不像是 Seq2seq 类型的任务,经过转换,也可以用 Seq2seq 模型来“硬解”,效果还挺好呢。我们一起来看看,从中学习一些转换问题的思路。 (1) Seq2seq for Syntactic Parsing: 如下图所示,把 Syntactic Parsing(语法分析)的结果 parsing tree 组成 sequence 的形式,也可以用 seq2seq 做。 (2) Seq2seq for Multi-label Classification: 虽然 Multi-label Classification和 Multi-class Classification 都是输出有多个类别 (class) 可选,但是它们不一样。Multi-class:一个输入只输出一个类别。Multi-label:一个输入可以输出多个类别。如果你整理过如印象笔记之类的云笔记,可能有这样的体会:按类别设置了多个笔记本,比如:“学习”,“生活”,等。一条笔记只能归类放在其中的一个笔记本中(这就是 Multi-class )。但是,你可以给这条笔记打上多个不同的标签 (这就是 Multi-label )。Seq2seq 模型由机器决定输出 sequence 长度。Multi-label Classification 任务中输出 labels 个数是不确定的,因此可以应用 Seq2seq 模型。 (3) Seq2seq for Object Detection: 看了一下 PPT 上的模型结构,与本节课要介绍的 transformer 相似。模型的输出是 class 和 bounding box 。我想,可能是每张图上检测到的 object 数目不同,有时种类 (class) 也不同,可以看作输出 sequence 长度不一定,因此可用 Seq2seq 模型来解决。 Seq2seq 模型简单来说,Seq2seq 就是一个 Encoder-Decoder 结构,如下图所示。Seq2seq 模型很早就有,比如 2014 年论文 “Sequence to Sequence Learning with Neural Networks” 中就用 Seq2seq 来做机器翻译任务。现在最知名的 Seq2seq 模型是 Transformer。 在这之中究竟发生了什么奇妙的反应,使得输出和输入 Sequence 长度不同,但是它们之间又有关联,比如在机器翻译的任务中,输出与输入所表达的意思是一致的。下面就来逐一分解。 1. Encoder本节课以 Transformer 为例讲解,但其实 Encoder 的单元用 RNN 或 CNN 也可以。如下图所示,在 Transformer 的 Encoder 部分,有 N 个 Blocks,每个 Block 都是由 Self-attention(图中“Multi-Head Attention” 单元)和 Fully Connected Layer(图中 “Feed Forward” 单元)组成。 为什么在 Self-attention 和 Fully Connected Layer 之后都有一个 “Add&Norm” 单元? 如下图所示,Add 就是加上输入向量自身,这个结构叫做 residual ,是一个常用的网络结构设计。因为要加上输入 vector,所以输入输出 vector 维度应保持一致,transformer 论文中把每一层输出 vector 的维度都设为 512。Norm 做的是 Layer Normalization,与前一课介绍的 Batch Normalization 不同。Batch Normalization 在不同 samples 的相同维度上求均值方差,每个维度都有对应的均值方差。Layer Normalization 在同一 sample 的所有维度上求均值方差,如下图所示。 为什么这里用 Layer Normalization 而不是 Batch Normalization? 李沐老师在 Transformer 论文精读视频 中提到,Batch Normalization 是对一个 batch 的 sequences,在 vector 的维度上求均值方差后做 Normalization。 对于 Self-attention, 不同的输入 sequences ,长度不同。当输入 sequence 长度变化大时,不同 batch 求得的均值方差抖动大。此外,如果测试时遇到一个很长的 sequence(超过训练集中的任何 sequence 长度),使用训练时得到的均值方差可能效果不好。而 Layer Normalization 是在每个 sample 上做,不受 sequence 长度变化的影响,所以这里用的是 Layer Normalization。 BERT 使用的是和 Transformer encoder 相同的网络结构。 2. Decoder有两种结构,Autoregressive (AT) 和 Non-autoregressive (NAT),区别在于输入的不同。先来看看 Transformer 架构中使用的 AT 结构。 AT (Autoregressive)Autoregressive 是什么意思呢?就是指前一时刻的输出,作为下一时刻的输入。如下图所示,起始时要输入一个特别的 Token(图中的“Start”),告诉 decoder:一个新的 sequence 开始了!这个 Token 经过 Decoder,输出一个 vector,里面是各类别的概率,从中选出最大概率对应的类别,如图示例子的“机”字,作为输出。“机” 字对应的变量又作为第二个输入,经过 Decoder 得到第二个输出:“器”,依此类推。 再来看看 decoder 的内部结构。先把 decoder 和 encoder 放在一起对比看看,如下图所示,除去灰色方框遮住的部分,decoder 和 encoder 非常相似。但是为什么 decoder 用的是 Masked Multi-Head Attention? Self-attention 中,每个输入 vector 的 query 会和 sequence 上每个 vector 的 (key, value) 做运算。与之不同的是,在 Masked Self-attention 中,输入 vector 的 query 只与它之前 vectors 的 (key, value) 做运算。如下图所示,计算 a 2 a^2 a2 的输出 b 2 b^2 b2 时, q 2 q^2 q2 只和 ( k 1 , v 1 ) , ( k 2 , v 2 ) (k^1,v^1), (k^2,v^2) (k1,v1),(k2,v2) 运算,而不考虑之后的 ( k 3 , v 3 ) , ( k 4 , v 4 ) (k^3,v^3), (k^4,v^4) (k3,v3),(k4,v4) 。 为什么要这样呢?在 transformer decoder 中,前一个的输出又作为后一个输入。因此, a i a^i ai 是一个一个输入的,其实这也是我们说话、写字的顺序。计算 a 2 a^2 a2 的输出 b 2 b^2 b2 时,输入只有 a 1 a^1 a1 和 a 2 a^2 a2 ,而 a 3 , a 4 a^3,a^4 a3,a4 还没出现呢,自然不会参与计算。 masked 的操作是在 attention score α \alpha α 进入 SoftMax 做归一化之前,如下图所示, a i a^i ai 之后的 vector 对应的 α \alpha α 赋值为 ? ∞ -\infty ?∞,这样归一化后对应的 α ′ \alpha' α′ 很小,自然就不起作用了。 疑问:训练时 decoder 还是并行输入 vector set ?所以做 masked attention?你可能发现图中还有一个 Scale 单元,它的作用就是把 α \alpha α 缩小一点 (假设 query 和 key 的维度是 d k d_k dk?,这里的操作就是 α / d k \alpha/ \sqrt{d_k} α/dk??)。当 d k d_k dk? (也就是 q , k q,k q,k 的维度)比较大时, q ? k q\cdot k q?k 得到的较大值就会更大,经过 Softmax 时就会更趋近 1,而较小值更趋近 0。也就是说,SoftMax 的输出会分布在两端(0 和 1),这是一个稳定态,导致 gradient 小,训练不起来。因此,要做一个 Scale 操作。 但是,这样有一个问题:机器不知道什么时候停止,就像词语接龙一样,可以一直输出。解决办法:加入 Stop Token。输入最后一个字符时,输出 “END”,此时机器就知道输出 sequence 完成了。 NAT (Non-autoregressive)下图所示分别为 AT (autoregressive) 与 NAT (Non-autoregressive) 的结构示意图。可以看到,与 AT 不同的是,NAT 并不使用之前时刻的输出,而是一次输入一组 special token。那么,输入多长合适呢?有多种方法。比如,一种方法是把 encoder 的输出送入一个 Classifier,预测 decoder 输出 sequence 长度,进而也输入相同长度的 special token。另一种方法如下图所示,输入一个很长的 sequence,看输出什么时候出现 stop token,截取其之前的 sequence 作为输出。 这两者各有利弊:AT 一次输出一个 vector(因为上一个输出又作为下一个输入),无法并行处理。而 NAT 可以并行处理。NAT 是在 transformer 提出 self-attention 之后才出现的。为什么呢?上一节课提到,RNN 也是 对 vector 一个一个地处理,没办法做并行。self-attention 才是并行处理,一次处理一个 sequence。 此外,NAT 可以调节输出 sequence 长度。比如在语音合成 (TTS) 任务中,按前面提到的方法一,把 encoder 的输出送入一个 Classifier,预测 decoder 输出 sequence 长度。通过改变这个 Classifier 预测的长度,可以调整生成语音的语速。例如,设置输出 sequence 长度 x2,语速就可以慢一倍。 NAT 也是现在一个热门研究领域。为什么呢?因为它的性能没有 AT 好。(Multi-modality?) 3. Encoder-Decoder 联系:cross attention此时,我们来看刚才灰色方块遮住的部分:Cross attention,也就是下图中红色方框部分。它计算的是 encoder 的输出与当前 vector 的 cross attention 。 具体操作为:用 decoder 中 self attention 层的输出 vector 生成 q q q ,与由 encoder 最后一层输出 sequence 产生的 ( k , v ) (k,v) (k,v) 做运算,如下图所示: 试想一下,如果你要做一个演讲,虽然记了演讲内容,但还是会担心一上台紧张忘词。怎么办呢?可以把提纲写在卡片上,演讲中看上一眼,就知道接下来要讲什么了。我觉得 cross attention 的作用就有点像这个小卡片,因为它看过整个 sequence,可以给 decoder 提示信息。 cross attention 在早期的 Seq2seq 模型论文中就已经出现,是 Seq2seq 的重要单元。看到 seq2seq model with attention 和 大神的论文解读视频 介绍,早期 Seq2seq 模型的 encoder 和 decoder 是用 RNN ,attention 用在 cross attention 单元。本来 decoder 只能利用 encoder RNN 最后一个时刻的 hidden state,用了 cross attention 之后,之前时刻的 hidden state 也可以看。哪个时刻的 hidden state 对当前 decoder 输出最相关 (attention),重点看这个 hidden state,这样模型的性能更好。而 Transformer 架构干脆把 encoder 和 decoder 也全部用 attention 来做 (Self-attention),正如论文标题所言 “Attention is all you need”。 你可能会有疑问, decoder 有很多层 self-attention,每一层 self-attention 的输出都是与 encoder 最后的输出 sequence 做 cross attention 吗?可以有不同的设计吗?Transformer 论文中是这样设计,但是也可以用不同的设计,现在已经有一些这方面的研究和实验。 Training1. Training Process如下图所示,decoder 的输出 (output) 是一个概率分布,label 是 one-hot vector,优化的目标就是使 label 与 decoder output 之间的 cross entropy 最小。这其实是一个分类问题。 Teacher Forcing 前面介绍,decoder 中,前一个输出又作为下一个输入。使用 Teacher Forcing 方法,decoder 输入用的是 ground truth value。 疑问:训练时 decoder 只看正确的输入,测试时如果有输出错误,后面的输入都是错的,怎么办? 别急,后面会介绍针对这个问题的解决方法。 2. Training Tips(1) Copy Mechnism有些情况,不需要对输入做改动,比如翻译人名地名,聊天机器人(chat-bot),摘要 (summarization) 等,可以直接复制一部分输入内容。 这里说说 chat-bot 中使用 Copy Mechanism 的情况。比如,打招呼。用户说:“你好,我是宁萌。” 机器回:“宁萌 你好!”。再比如:复述疑问,也就是机器“不明白”/不知道的地方。用户说:“你觉得 《三体》 怎么样?”机器回:“ 《三体》 是什么?” 具体的方法:Pointer Network , copy network (2) Guided Attention李老师首先举了一个语音合成 (TTS) 的例子,机器一次说四遍“发财”这个词时,说得挺好,还有抑扬顿挫之感。一次说三遍或两遍“发财”也正常。但是,一次说一遍“发财”时,不知怎的,只有一个音“财”。 从这个例子可以看到,在处理语音识别 (speech recognition) 或语音合成 (TTS)等任务时,我们不希望漏掉其中的任何一段内容,Guided Attention 正是要满足这个要求。而 chat-bot, summary 一类的应用在这方面的要求就宽松得多。 Guided Attention 是让 attention 的计算按照一定顺序来进行。比如在做语音合成时,attention 的计算应该从左向右推进,如下图中前三幅图所示。如果 attention 的计算时顺序错乱,如下图中后三幅图所示,那就说明出了错误。具体方法:Monotonic Attention, Location-aware attention。 (3) Beam Search这其实是一个最优路径的问题。前面介绍,decoder 每次输出一个变量,假设输出词汇库只有 A, B 两个词汇。每一次都选择最大概率的作为输出,如下图中红色路径所示,这就是 Greedy Decoding。同时,decoder 的每个输出又是下一时刻输入,如果我们从整个 sequence 的角度考虑,可能第一次不选最大概率,后面的输出概率(把握)都很大,整体更佳,如下图中绿色路径所示。 怎么找到最好的路径(图中绿色路径)?穷尽所有选择(路径)吗?这不现实,运算量太大。一个优化方法就是 Beam Search,比如每次存前两个概率大的输出,下一步把这两种输出各走一遍,依此类推,一直到最后。 但是,用 Beam Search 找到分数最高的路径,就一定是最好的吗?比如下图所示文本生成的例子,使用 Beam Search,后面一直在重复同一个句子。而 Pure Sampling 生成的文本至少看起来还正常。 李老师分析,对于有明确答案的任务,比如语音识别,beam search 方法表现好。对于有些创造型任务,比如文本生成,decoder 是需要一些随机性 (randomness) 。再比如,李老师提到所在实验室做语言合成 (TTS) 的经历。一开始总做不出理想的效果,和 Google 的研究人员交流,他们提到,测试时 decoder 要加噪声 (noise)。听上去是不是难以置信?训练时 decoder 加噪可以理解,让模型 more robust。测试时 decoder 加噪,这不是给自己找麻烦吗?但是,按这个方法去做,效果确实好!没加噪时,decoder 产生的声音就像机关枪一样。加噪(加入随机性)之后,产生的声音就接近人声。对于 TTS 或文本生成而言,decoder 用 Beam Search 找到的最好结果,不见得是人类认为的最好结果(不自然)。加入一点随机性,效果反而更好。正如西谚所言:“Accept that nothing is perfect. True beauty lies in the cracks of imperfection.” (4) Optimizing Evaluation Metrics?在 homework 中,train 使用 cross entropy loss 做 criterion,要使 output 和 label 在对应 vector 上 cross-entropy 最小。而评估模型用的是 BLEU score, 是在两个 sequence 上运算,如下图所示。因此,validation 挑选模型时也用 BLEU score 作为衡量标准。 那么, train 直接就用 BLEU score 做 criterion 岂不更好? 问题就在于:BLEU score 没办法微分,不知道要怎么做 gradient descent。实在要做:Reinforcement Learning(RL)。 秘诀:”When you don’t know how to optimize, just use reinforcement learning(RL).” 遇到在 optimization 无法解决的问题,用 RL “硬 train 一发”。 (5) exposure bias训练时 Decoder 看的都是正确的输入值( Ground Truth )。测试时如果有一个输出有错误,可能导致后面都出错。 解决办法:训练时 decoder 加入一点错误的输入,让机器“见识” 错误的情况,这就是 Scheduling sampling。 我的思考如果说之前的 RNN 模型还在模仿人类的语言处理方式,逐个字词地理解,那么 Self-attention 则是充分利用了机器的特点,并行处理信息,达到了“一目十行”的效果。不知怎的,我想到了 Ted Chiang (特德姜 )写的科幻小说 “Story of Your Life”(《你一生的故事》),里面的外星人语言就是团状的,不像我们人类的语言是线性时序的,因此外星人可以预知未来。而地球上的一位科学家在交流中学会了这种语言,由此也提前知道了自己以后的人生。也就是说,语言影响思维方式。当然,这只是小说中的想象哈哈。 目前是机器在学习人类的交流方式,我们人类说话写字都是时序的,有前后顺序。transformer 的 self-attention 虽然很强大,但没有考虑位置信息,因此需要额外加入 positional encoding。未来有没有类似科幻小说设想的可能,人类学习机器并行处理信息的方式,在语言交流中减少时序信息,因而更加高效?你觉得呢?欢迎交流呀。 觉得本文不错的话,请点赞支持一下吧,谢谢! 关注我 宁萌Julie,互相学习,多多交流呀! 阅读更多笔记,请点击 李宏毅老师《机器学习》笔记–合辑目录。 参考1.李宏毅老师《机器学习 2022》: 课程网站:https://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.php 视频:https://www.bilibili.com/video/BV1Wv411h7kN 2.Transformer 论文 : 3.很棒的图解系列: seq2seq model with attention: https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/ transformer: http://jalammar.github.io/illustrated-transformer/ 4.论文解读视频: 李沐老师:https://www.bilibili.com/video/BV1pu411o7BE 大神:https://www.bilibili.com/video/BV1tU4y147Ah?p=2 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:42:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |