机器学习课程学习周报七

机器学习课程学习周报七

文章目录

  • 机器学习课程学习周报七
    • 摘要
    • 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中的束搜索和复制机制等等。

相关推荐
孙同学要努力26 分钟前
全连接神经网络案例——手写数字识别
人工智能·深度学习·神经网络
Eric.Lee202126 分钟前
yolo v5 开源项目
人工智能·yolo·目标检测·计算机视觉
晨曦_子画33 分钟前
3种最难学习和最容易学习的 3 种编程语言
学习
城南vision1 小时前
Docker学习—Docker核心概念总结
java·学习·docker
其实吧32 小时前
基于Matlab的图像融合研究设计
人工智能·计算机视觉·matlab
丕羽2 小时前
【Pytorch】基本语法
人工智能·pytorch·python
ctrey_2 小时前
2024-11-1 学习人工智能的Day20 openCV(2)
人工智能·opencv·学习
十年之少2 小时前
由中文乱码引来的一系列学习——Qt
学习
SongYuLong的博客2 小时前
Air780E基于LuatOS编程开发
人工智能
Jina AI2 小时前
RAG 系统的分块难题:小型语言模型如何找到最佳断点?
人工智能·语言模型·自然语言处理