机器学习课程学习周报七

机器学习课程学习周报七

文章目录

  • 机器学习课程学习周报七
    • 摘要
    • Abstract
    • 一、机器学习部分
      • [1.1 Transformer模型概述](#1.1 Transformer模型概述)
      • [1.2 Transformer编码器](#1.2 Transformer编码器)
      • [1.3 Transformer解码器](#1.3 Transformer解码器)
        • [1.3.1 自回归解码器](#1.3.1 自回归解码器)
        • [1.3.2 非自回归解码器](#1.3.2 非自回归解码器)
      • [1.4 编码器-解码器注意力](#1.4 编码器-解码器注意力)
      • [1.5 Transformer的训练过程](#1.5 Transformer的训练过程)
    • 总结

摘要

本周的学习重点是Transformer模型,涵盖了其编码器和解码器的结构与功能。我详细探讨了自注意力机制、多头自注意力、残差连接、层归一化等核心概念。此外,还比较了自回归和非自回归解码器的优缺点,以及编码器-解码器注意力在信息传递中的作用。通过这些学习,我对Transformer在序列到序列任务中的应用有了更深入的理解。

Abstract

This week's study focuses on the Transformer model, exploring the structure and functionality of its encoder and decoder. I delved into essential concepts such as self-attention mechanism, multi-head self-attention, residual connections, and layer normalization. Additionally, I compared the advantages and disadvantages of autoregressive and non-autoregressive decoders, and examined the role of encoder-decoder attention in information transfer. Through this study, I gained a deeper understanding of the Transformer's application in sequence-to-sequence tasks.

一、机器学习部分

1.1 Transformer模型概述

一般的序列到序列模型会分成编码器Encoder )和解码器Decoder),编码器负责处理输入的序列,再把处理好的结果"丢"给解码器,由解码器决定要输出的序列。

1.2 Transformer编码器

如上图,编码器输入一排向量,输出另外一排向量。自注意力、循环神经网络、卷积神经网络都能输入一排向量,输出一排向量。Transformer的编码器使用的是自注意力,输入一排向量,输出另外一个同样长度的向量。下图左侧所示,编码器里面会分成很多的block),每一个块都是输入一排向量,输出一排向量。输入一排向量到第一个块,第一个块输出另外一排向量,以此类推,最后一个块会输出最终的向量序列。

Transformer编码器中的每个块并不是神经网络的一层,如上图右侧所示,在每个块里面,输入一排向量后做自注意力,考虑整个序列的信息,输出另外一排向量。接下来这排向量会"丢"到全连接网络网络里面,输出另外一排向量,这一排向量就是块的输出。

实际上在块中,操作更复杂。Transformer里面加入了残差连接residual connection)的设计,如下图所示,

最左边的向量 b b b 输入到自注意力层后得到向量 a a a,输出向量 a a a加上其输入向量 b b b 得到新的输出。然后将得到的结果,做层归一化layer normalization),层归一化会计算输入向量的平均值和标准差,具体归一化的计算公式如下:

x i ′ = x i − m σ {x'_i} = \frac{{{x_i} - m}}{\sigma } xi′=σxi−m

层归一化是对同一个特征、同一个样本里面不同的维度去计算均值跟标准差,接着做个归一化。而批量归一化batch normalization)是对不同样本、不同特征的同一个维度去计算均值跟标准差。

现在回看Transformer的编码器结构,其中 N × N \times N×表示重复 N N N次。首先,在输入的地方需要加上位置编码。如果只用自注意力,没有未知的信息,所以需要加上位置信息。多头自注意力就是自注意力的块。经过自注意力后,还要加上残差连接和层归一化。接下来还要经过全连接的前馈神经网络,接着再做一次残差连接和层归一化,这才是一个块的输出,这个块会重复 N N N次。原始的Transformer架构其实并不是一个最优的设计,可以有优化的空间。

1.3 Transformer解码器

解码器比较常见的称为自回归 的(autoregressive )解码器,也有非自回归non-autoregressive)解码器。

1.3.1 自回归解码器

以语音识别为例,把一段声音("机器学习")输入给编码器,输出会变成一排向量。接下来解码器产生语音识别的结果,解码器把编码器的输出先"读"进去。要让解码器产生输出,首先要先给它一个代表开始的特殊符号 < B O S > <BOS> <BOS>, 即 Begin Of Sequence,这是一个特殊的词元token),每一个词元都可以用一个独热向量来表示,其中一维是1,其他都是0。接下来解码器会将输出做一个softmax操作,得到的向量里面的分数是一个分布,该向量里面的值全部加起 来,总和是 1。这个向量会给每一个中文字一个分,分数最高的中文字就是最终的输出。"机" 的分数最高,所以"机"就当做是解码器的第一个输出。

接下来把"机"当成解码器新的输入。根据两个输入:特殊符号 < B O S > <BOS> <BOS>和"机",输出一个向量,假设"器" 的分数最高,"器"就是输出。解码器接下来会拿"器"当作输入,其看到了 < B O S > <BOS> <BOS>、"机"、"器", 可能就输出"学"。解码器看到 < B O S > <BOS> <BOS>、"机"、"器"、"学",它会输出一个向量。这个向量里面"习" 的分数最高的,所以它就输出"习"。这个过程就反复地持续下去。

解码器的输入是它在前一个时间点的输出,其会把自己的输出当做接下来的输入,因此当解码器在产生一个句子的时候,它有可能看到错误的东西。如果解码器有语音识别的错误,它把机器的"器"识别错成天气的"气",接下来解码器会根据错误的识别结果 产生它想要产生的期待是正确的输出,这会造成误差传播error propagation)的问题,一步错导致步步错,接下来可能无法再产生正确的词汇。

比较编码器和解码器的结构,我们可以发现其结构非常相似,在第1部分中,解码器使用了掩蔽自注意力masked self-attention ),掩蔽自注意力可以通过一个掩码mask )来阻止每个位置选择其后面的输入信息。下图是原来的自注意力机制,输出要考虑完整的输入才能计算出结果,根据 a 1 {a^1} a1到 a 4 {a^4} a4所有的信息去输出 b 1 {b^1} b1。

如下图所示,掩蔽自注意力的不同点是不能再看右边的部分,产生 b 1 {b^1} b1时,只能考虑 a 1 {a^1} a1的信息;产生 b 2 {b^2} b2时,只能考虑 a 1 {a^1} a1和 a 2 {a^2} a2的信息;产生 b 3 {b^3} b3时,不能考虑 a 4 {a^4} a4的信息;产生 b 4 {b^4} b4的时候,可以用整个输入序列的信息。

为什么需要在注意力中加掩码?

一开始解码器的输出是一个一个产生的,所以是先有 a 1 {a^1} a1再有 a 2 {a^2} a2,再有 a 3 {a^3} a3,再有 a 4 {a^4} a4。这跟原来的自注意力不一样,原来的自注意力 a 1 {a^1} a1跟 a 4 {a^4} a4是一次整个输进去模型里面的。编码器是一次把 a 1 {a^1} a1跟 a 4 {a^4} a4都整个都读进去。但是对解码器而言,先有 a 1 {a^1} a1才有 a 2 {a^2} a2,然后才有 a 3 {a^3} a3和 a 4 {a^4} a4。

实际应用中输入跟输出长度的关系是非常复杂的,我们无法从输入序列的长度知道输出序列的长度,因此解码器必须决定输出的序列的长度。给定一个输入序列,机器可以自己学到输出序列的长度。所以需要特别准备一个特别的符号 < E O S > <EOS> <EOS>。产生完 "习"以后,再把"习"当作解码器的输入以后,解码器就要能够输出 < E O S > <EOS> <EOS>,解码器看到编码器输出的嵌入、 < E O S > <EOS> <EOS>、"机"、"器"、"学"、"习"以后,其产生出来的向量里面 < E O S > <EOS> <EOS>的概率必须是最大的,于是输出 < E O S > <EOS> <EOS>,整个解码器产生序列的过程就结束了。

1.3.2 非自回归解码器

自回归的模型是先输入 < B O S > <BOS> <BOS>,输出 w 1 {w_1} w1,再把 w 1 {w_1} w1当做输入,再输出 w 2 {w_2} w2,直到输出 < E O S > <EOS> <EOS>为止。非自回归的解码器输入的是一整排的词元,一次产生产生一排词元。比如输入4 个 < B O S > <BOS> <BOS>的词元到非自回归的解码器,它就产生4个中文的字。因为输出的长度是未知的,所以当做非自回归解码器输入的 < B O S > <BOS> <BOS>的数量也是未知的,一般有两种做法解决这个问题。

  • 用分类器来解决这个问题。用分类器"吃"编码器的输入,输出是一个数字,该数字代表解码器应该要输出的长度。比如分类器输出4,非自回归的解码器就会"吃"4 个 < B O S > <BOS> <BOS>的词元,产生 4 个中文的字。

  • 给编码器一堆 < B O S > <BOS> <BOS>的词元。假设输出的句子的长度有上限,绝对不会超过 300 个 字。给编码器 300 个 < B O S > <BOS> <BOS>,就会输出 300 个字,输出 < E O S > <EOS> <EOS>右边的的输出就当它没有输出。

非自回归的解码器有很多优点。第一个优点是平行化。自回归的解码器输出句子的时候是一个一个字产生的,假设要输出长度一百个字的句子,就需要做一百次的解码。但是非自回归的解码器不管句子的长度如何,都是一个步骤就产生出完整的句子。所以非自回归的解码器会跑得比自回归的解码器要快。

另外一个优点是非自回归的解码器比较能够控制它输出的长度。在语音合成里面,非自回归解码器算是非常常用的。非自回归的解码器可以控制输出的长度,可以用一个分类器决 定非自回归的解码器应该输出的长度。在做语音合成的时候,如果想要让系统讲快一点,就把分类器的输出除以 2,系统讲话速度就变 2 倍快。如果想要讲话放慢速度,就把分类器输出的长度乘 2 倍,解码器说话的速度就变 2 倍慢。

平行化是非自回归解码器最大的优势,但非自回归的解码器的性能往往都不如自回归的解码器。所以很多研究试图让非自回归的解码器的性能越来越好,去逼近自回归的解码器。要让非自回归的解码器跟自回归的解码器性能一样好,必须要使用非常多的技巧。

1.4 编码器-解码器注意力

编码器和解码器通过编码器-解码器注意力encoder-decoder attention)传递信息,编码器-解码器注意力是连接编码器跟解码器之间的桥梁。

如下图,解码器中编码器-解码器注意力的键和值来自编码器的输出,查询来自解码器中前一个层的输出。具体做法为:编码器输入一排向量,输出一排向量 a 1 {a^1} a1、 a 2 {a^2} a2、 a 3 {a^3} a3。接下来解码器会输入一个 < B O S > <BOS> <BOS>,经过掩蔽自注意力得到一个向量。接下来把这个向量乘上一个矩阵,做一个变换transform ),得到一个查询 q q q。 a 1 {a^1} a1、 a 2 {a^2} a2、 a 3 {a^3} a3也都产生键: k 1 {k^1} k1、 k 2 {k^2} k2、 k 3 {k^3} k3。把 q q q跟 k 1 {k^1} k1、 k 2 {k^2} k2、 k 3 {k^3} k3去计算注意力的分数,得到 α 1 {\alpha _1} α1、 α 2 {\alpha _2} α2、 α 3 {\alpha _3} α3 ,接下来做softmax,得到了 α ′ 1 {{\alpha '}_1} α′1、 α ′ 2 {{\alpha '}_2} α′2、 α ′ 3 {{\alpha '}_3} α′3,然后按下式计算加权和 v v v,这个过程也称为Cross attention

v = α ′ 1 × v 1 + α ′ 2 × v 2 + α ′ 3 × v 3 v = {{\alpha '}_1} \times {v^1} + {{\alpha '}_2} \times {v^2} + {{\alpha '}_3} \times {v^3} v=α′1×v1+α′2×v2+α′3×v3

v v v接下来会"丢"给全连接网络,这个步骤中 q q q来自于解码器, k k k跟 v v v来自于编码器,该步骤就叫做编码器-解码器注意力,所以解码器就是凭借着产生一个 q q q,去编码器这边抽取信息出来,当做接下来的解码器的全连接网络的输入。

1.5 Transformer的训练过程

Transformer 应该要学到听到"机器学习"的声音信号,它的输出就是"机器学习"这四个中文字。把 < B O S > <BOS> <BOS>丢给编码器的时候,其第一个输出应该要跟"机"越接近越好。而解码器的输出是一个概率的分布,这个概率分布跟"机"的独热向量越接近越好。因此我们会去计算标准答案Ground Truth)跟分布之间的交叉熵,希望该交叉熵的值越小越好。

在训练的时候,每一个输出跟其对应的正确答案都有一个交叉熵,因此希望这些交叉熵的总和越小越好。解码器输出的不是只有"机器学习"这四个中文字还要输出 < E O S > <EOS> <EOS>,所以解器的最终第五个位置输出的向量跟 < E O S > <EOS> <EOS>的独热向量的交叉熵越小越好。

在训练的时候,告诉解码器在已经有 < B O S > <BOS> <BOS>、"机"的情况下,要输出"器",有 < B O S > <BOS> <BOS>、"机"、"器"的情况下输出"学",有 < B O S > <BOS> <BOS> 、"机"、"器"、"学"的情况下输出"习",有 < B O S > <BOS> <BOS>、"机"、"器"、"学"、"习"的情况下,输出 < E O S > <EOS> <EOS>。 在解码器训练的时候,在输入的时候给它正确的答案,这称为教师强制teacher forcing)。

总结

Transformer比较复杂,只学一遍可能无法深刻理解其中的思想,因此在下一周的学习中,我准备扔专注于Transformer模型和自注意力机制的理解,并且做一些相关的实践练习。同时要补齐其中一些细致的知识点,如Transformer中的束搜索和复制机制等等。

相关推荐
IE065 分钟前
深度学习系列76:流式tts的一个简单实现
人工智能·深度学习
GIS数据转换器10 分钟前
城市生命线安全保障:技术应用与策略创新
大数据·人工智能·安全·3d·智慧城市
无须logic ᭄13 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
百流25 分钟前
scala文件编译相关理解
开发语言·学习·scala
一水鉴天1 小时前
为AI聊天工具添加一个知识系统 之65 详细设计 之6 变形机器人及伺服跟随
人工智能
雁于飞2 小时前
c语言贪吃蛇(极简版,基本能玩)
c语言·开发语言·笔记·学习·其他·课程设计·大作业
井底哇哇7 小时前
ChatGPT是强人工智能吗?
人工智能·chatgpt
Coovally AI模型快速验证7 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
AI浩8 小时前
【面试总结】FFN(前馈神经网络)在Transformer模型中先升维再降维的原因
人工智能·深度学习·计算机视觉·transformer