【機器學習2021】自注意力機制 (Self-attention) (上)

Hung-yi Lee
12 Mar 202128:18

Summary

TLDR本次讲解介绍了自注意力机制(Self-Attention)的概念和应用。自注意力机制能够处理输入序列中向量数量变化的问题,如文本处理、语音信号和社交网络等。通过计算序列中各个向量的相关性,自注意力机制能够捕捉到序列内部的复杂关系,从而生成考虑了整个序列信息的新向量。这种方法不仅提升了模型对序列数据的理解,也为后续的全连接网络提供了更丰富的输入。

Takeaways

  • 🔍 自我注意力(Self-Attention)是一种网络架构,用于处理输入序列中各元素之间的关系。
  • 🌟 自我注意力机制可以解决传统神经网络无法有效处理可变长度输入序列的问题。
  • 📈 输入序列中的每个元素都可以通过自我注意力机制与序列中的其他元素进行关联性评分。
  • 🤔 自我注意力机制通过Query(查询向量)、Key(关键向量)和Value(值向量)三者之间的关系来计算注意力分数。
  • 📊 通过点积(Dot Product)计算Query和Key之间的关联性,得到初始的注意力分数。
  • 🧠 利用Soft-Max函数对注意力分数进行归一化,得到每个元素的重要性权重。
  • 🔄 通过加权求和的方式,结合Value向量和对应的注意力分数,生成新的输出向量。
  • 🔢 自我注意力机制可以应用于文本处理、语音信号处理、社交网络分析等多种场景。
  • 📚 词嵌入(Word Embedding)是一种表示词汇的方法,能够捕捉到词与词之间的语义关系。
  • 🎧 语音信号处理中,通过将声音切割成帧(Frame)并转换成向量,可以应用自我注意力机制进行分析。
  • 🌐 自我注意力机制是Transformer网络架构的核心组件,后者在自然语言处理等领域取得了显著的成果。

Q & A

  • Self-Attention是解决什么问题的?

    -Self-Attention旨在解决当神经网络的输入是一个序列,且序列长度不一致时的问题。它允许模型处理不同长度的输入序列,并且能够捕捉序列内部元素之间的关系。

  • 在Self-Attention中,输入序列的每个元素是如何表示的?

    -在Self-Attention中,输入序列的每个元素都会被表示为一个向量,这些向量组成了一个向量集合。例如,在文本处理中,每个词汇都会被转换成一个词向量。

  • One-Hot Encoding在表示词汇时有什么缺点?

    -One-Hot Encoding的缺点在于它假设所有的词汇之间都是没有关系的。通过这种方式表示的向量中没有任何语义信息,无法表达词汇之间的相似性或关联性。

  • Word Embedding是如何克服One-Hot Encoding的缺陷的?

    -Word Embedding通过给每个词汇提供一个富有语义信息的向量来克服One-Hot Encoding的缺陷。在Word Embedding中,相似或相关的词汇在向量空间中会彼此接近,从而保留了语义关系。

  • 在语音信号处理中,如何将一段声音信号表示为向量序列?

    -在语音信号处理中,通过选取一段固定长度的声音信号(称为Window),将Window内的信号转换成一个向量(称为Frame)。然后,通过将Window逐步向右移动(通常移动10毫秒),来连续提取整个声音信号的向量序列。

  • Self-Attention模块是如何计算两个向量之间的关联性的?

    -Self-Attention模块通过计算两个向量的点积(Dot-Product)来确定它们之间的关联性。具体方法是将输入向量与两个不同的权重矩阵相乘,得到两个新向量,然后将这两个新向量进行点积运算,得到的结果即为关联性分数α。

  • Self-Attention中的Query、Key和Value分别代表什么?

    -在Self-Attention中,Query代表查询向量,用于搜索序列中与自己相关的其他向量;Key代表关键向量,与Query进行关联性计算;Value代表值向量,是序列中实际的元素。通过计算Query与所有Key的关联性分数,然后用这些分数对Value进行加权求和,得到最终的输出向量。

  • 为什么在Self-Attention中要使用Soft-Max函数?

    -Soft-Max函数在Self-Attention中用于将关联性分数转换为一个概率分布,这样每个Query向量都能得到一个关于序列中其他向量的注意力分布。Soft-Max通过指数化并归一化分数,确保所有关联性分数的和为1,从而可以作为权重来使用。

  • Self-Attention模块的输出是如何生成的?

    -Self-Attention模块的输出是通过计算每个Query向量与所有Key向量的关联性分数,并使用这些分数对相应的Value向量进行加权求和来生成的。这样,每个输出向量都能综合考虑整个输入序列的信息。

  • Self-Attention机制可以如何应用在不同的任务中?

    -Self-Attention机制可以应用于各种需要处理序列数据的任务中,例如文本处理中的词性标注、情感分析,语音信号处理中的声音识别,以及社交网络分析等。通过让模型关注序列中不同部分的重要性,Self-Attention能够提高模型处理序列数据的能力。

  • Self-Attention模块可以叠加使用吗?

    -是的,Self-Attention模块可以叠加使用。在实际应用中,可以将Self-Attention模块的输出再次输入到另一个Self-Attention模块中,以便更深入地捕捉序列内部的复杂关系。这种叠加使用的方式可以增强模型对序列数据的理解。

  • Self-Attention模块在Transformer架构中扮演什么角色?

    -在Transformer架构中,Self-Attention模块是核心组件之一。它负责处理输入序列,并生成能够反映序列内部关系的输出向量。Transformer架构通过Self-Attention模块实现了对序列数据的高效处理,从而在很多自然语言处理任务中取得了显著的成果。

Outlines

00:00

🌟 自我注意力机制的引入

本段落介绍了自我注意力(Self-Attention)机制的基本概念和目的。自我注意力机制旨在解决神经网络处理输入序列时的问题,特别是当序列长度不一致时。例如,在文本处理中,每个句子的长度不同,传统的神经网络难以处理这种变长的输入。自我注意力机制通过赋予序列中每个元素不同的权重,使得网络能够关注到与当前元素最相关的其他元素,从而更好地处理序列数据。

05:04

📝 序列标注问题与应用场景

这一部分讨论了序列标注问题,即输入和输出的序列长度相同的情况,并举了几个应用实例,如词性标注、语音识别和社交网络分析。这些应用中,每个输入元素都需要一个对应的标签或分类。此外,还提到了三种可能的输出类型:每个向量对应一个标签、整个序列对应一个标签、以及机器需要自己决定输出标签的数量。

10:04

🚧 全连接网络的局限性

在这一段中,指出了全连接网络在处理序列数据时的局限性。尤其是当序列中的元素需要根据上下文进行不同的处理时,全连接网络无法有效区分相同输入但应产生不同输出的情况。为了解决这个问题,提出了使用上下文信息的方法,即将序列中的多个向量一起输入到网络中,让网络能够考虑到更广泛的上下文信息。

15:05

🔄 自我注意力机制的工作原理

本段落详细解释了自我注意力机制的工作原理。自我注意力机制能够接收整个序列的输入,并输出考虑了整个序列信息的向量。通过使用查询(Query)、键(Key)和值(Value)的概念,自我注意力机制能够计算序列中每个元素与其他元素的相关性,并根据这些相关性对序列中的信息进行加权汇总,从而得到新的序列表示。

20:07

🧠 计算注意力分数和权重

这一部分深入讲解了如何计算注意力分数和权重。首先,通过查询和键的点积来计算每个元素之间的关联程度,得到注意力分数。然后,使用Soft-Max函数对分数进行归一化,得到每个元素的权重。最后,根据这些权重,将序列中的值向量加权求和,得到最终的输出向量。这个过程允许模型集中关注与当前任务最相关的序列部分。

Mindmap

Keywords

💡自注意力(Self-Attention)

自注意力是一种用于处理序列数据的网络架构,能够使网络关注输入序列中的不同部分,以更好地进行处理。它通过计算序列内各个元素之间的关系,使模型能够捕捉到序列内部的动态关系。在视频中提到,自注意力旨在解决输入数据长度可变的问题,特别是当输入是一系列向量时,如文字处理、语音信号和社交网络图等情境。

💡网络架构

网络架构指的是构成网络的基本结构,包括它的组成部分以及这些部分之间的连接方式。视频中提到,自注意力是一种常见的网络架构,与传统的卷积神经网络(CNN)相比,它能更灵活地处理各种长度的序列数据。

💡向量

向量在机器学习和深度学习中通常指的是一维数组,可以表示数据的特征。视频中强调,无论是处理图像、文字还是声音,输入给网络的数据都可以被视为一个或一系列向量,这些向量包含了数据的关键信息。

💡Word Embedding

词嵌入是自然语言处理中的一种技术,通过将词汇映射到稠密的向量空间中,来捕捉单词之间的语义关系。视频中提到,与One-Hot编码相比,Word Embedding能够提供丰富的语义信息,使得模型能更好地理解和处理语言数据。

💡序列

序列在此上下文中指的是一连串有序排列的数据,比如文本中的单词或者语音信号中的音频帧。视频中提到处理序列数据的挑战,特别是当序列长度可变时,自注意力机制能有效地对这些数据进行处理。

💡分类(Classification)

分类是监督学习的一个任务,目标是预测输入数据所属的类别。视频中提及分类任务,举例说明了模型输出可以是对序列中每个元素的分类(如词性标注),或者是对整个输入序列的分类(如情感分析)。

💡回归(Regression)

回归是监督学习中的一种任务,目标是预测一个连续的数值。视频中通过回归和分类的对比,说明了不同类型的输出(数值或类别)可以应对不同的问题。

💡标签(Label)

在机器学习中,标签是数据的真实输出,用于训练模型进行准确预测。视频中讨论了在处理序列数据时,每个向量可以有对应的标签,这些标签可以是数值(回归问题)或类别(分类问题)。

💡序列到序列(sequence to sequence)

序列到序列是一种处理模型,用于将一个序列转换成另一个序列,这两个序列的长度可以不同。视频中提到这种任务的例子,如机器翻译和语音识别,其中模型需要自动确定输出序列的长度。

💡Transformer

Transformer是一种基于自注意力机制的模型架构,广泛用于处理序列数据,特别是在自然语言处理领域。视频中提到Transformer和自注意力的关系,强调了“Attention is all you need”这篇论文对于自注意力以及Transformer架构的重要性。

Highlights

介绍了Self-Attention网络架构,它是处理输入序列长度不一致问题的关键技术。

Self-Attention可以处理输入序列中每个元素与其他元素之间的关系,而不仅仅是局部窗口内的上下文信息。

Self-Attention通过计算序列中每个向量与其他所有向量的相关性,来捕捉全局依赖关系。

Self-Attention机制允许模型对序列中的每个元素赋予不同的权重,这些权重反映了元素间的重要性。

介绍了One-Hot Encoding和Word Embedding两种将词汇表示为向量的方法,并讨论了它们的优缺点。

Word Embedding能够捕捉词汇间的语义关系,如动物和植物的聚集,而One-Hot Encoding则无法表示这种关系。

通过声音信号处理的例子,解释了如何将一段声音信号转换为一系列向量,并用于模型的输入。

讨论了Graph结构在机器学习中的应用,如社交网络和分子结构,以及如何将这些结构表示为向量序列。

解释了三种不同的输出类型:每个向量对应一个标签、整个序列对应一个标签、以及序列到序列的任务。

提出了序列标注(Sequence Labeling)的概念,即给序列中的每个元素分配一个标签。

讨论了Fully-Connected Network在处理序列数据时的局限性,特别是在处理词性标注等任务时。

通过Self-Attention机制,模型能够考虑整个输入序列的信息,而不仅仅是局部窗口。

介绍了Self-Attention的计算过程,包括Query、Key和Value的概念以及它们在计算注意力分数中的作用。

解释了如何通过Soft-Max函数对注意力分数进行归一化,以便在序列中分配权重。

讨论了Self-Attention可以多次叠加使用,以进一步捕捉序列中的复杂关系。

提到了Transformer架构,这是Self-Attention机制的代表性应用,由Google提出。

强调了Self-Attention在处理自然语言处理和其他序列数据任务中的重要性和实用性。

讨论了Self-Attention在不同领域的潜在应用,如情感分析、语音识别和药物发现。

解释了Self-Attention如何通过权重和来提取序列中的关键信息,并生成新的向量表示。

Transcripts

00:01

好 接下來要講什麼呢

00:03

講完了CNN以後

00:05

我們要講另外一個常見的Network架構

00:08

這個架構叫做Self-Attention

00:12

而這個Self-Attention

00:13

想要解決的問題是什麼呢

00:15

它想要解決的問題是

00:17

到目前為止啊

00:19

我們的Network的Input都是一個向量

00:23

不管是在預測這個

00:25

YouTube觀看人數的問題上啊

00:27

還是影像處理上啊

00:29

我們的輸入都可以看作是一個向量

00:33

然後我們的輸出

00:35

可能是一個數值

00:36

這個是Regression

00:37

可能是一個類別

00:38

這是Classification

00:40

但假設我們遇到更復雜的問題呢

00:43

假設我們說

00:44

輸入是一排向量呢

00:47

而且這個輸入的向量的數目

00:50

是會改變的呢

00:51

我們剛才在講影像辨識的時候

00:53

我還特別跟你強調說

00:54

我們假設輸入的影像大小

00:57

都是一樣的

00:58

那現在假設我們的輸入

01:01

會不一樣呢

01:02

每次我們Model輸入的Sequence的數目

01:04

Sequence的長度都不一樣呢

01:06

那這個時候應該要怎麼處理

01:10

好 那有什麼樣的例子是

01:12

輸入是一個Sequence

01:14

而且長度會改變的呢

01:16

第一個例子

01:17

是文字處理

01:19

假設我們今天要Network的輸入

01:21

是一個句子的話

01:23

每一個句子的長度都不一樣嘛

01:25

每個句子裡面詞彙的數目都不一樣嘛

01:27

如果我們把一個句子裡面的每一個詞彙

01:30

都描述成一個向量

01:31

用成向量來表示的話

01:33

那我們的Model的輸入

01:35

就會是一個Vector Set

01:37

而且這個Vector Set的大小

01:39

每次都不一樣

01:40

句子的長度不一樣

01:41

那你的Vector Set的大小就不一樣

01:44

那有同學可能會問說

01:46

那怎麼把一個詞彙表示成一個向量呢

01:49

那簡單來說 最簡單的做法

01:51

是One-Hot的Encoding

01:54

你就開一個很長很長的向量

01:56

這個向量的長度啊

01:58

跟世界上存在的詞彙的數目是一樣多的

02:02

假設英文是十萬個詞彙

02:04

你就開一個十萬維的向量

02:06

每一個維度對應到一個詞彙

02:08

Apple就是100

02:10

Bag就是010

02:11

Cat就是001

02:12

以此類推

02:14

但是這樣子的表示方法有一個非常嚴重的問題

02:17

什麼樣嚴重的問題呢

02:19

它假設所有的詞彙彼此之間

02:21

都是沒有關係的

02:24

從這個向量裡面你看不到說

02:26

也許Cat跟Dog都是動物

02:28

所以他們比較接近

02:29

Cat跟Apple

02:30

一個動物一個植物

02:31

所以他們比較不相像

02:34

看不出來這件事情

02:35

這個向量裡面

02:36

沒有任何語義的資訊

02:39

有另外一個方法叫做Word Embedding

02:41

Word Embedding就是

02:42

我們會給每一個詞彙一個向量

02:45

而這個向量是有語義的資訊的

02:47

如果你把Word Embedding畫出來的話

02:50

你會發現

02:50

所有的動物可能聚集成一團

02:52

所有的植物可能聚集成一團

02:54

所有的動詞可能聚集成一團等等

02:57

那Word Embedding是怎麼得到的呢

02:59

這個就不是今天講課的重點了

03:01

如果你有興趣的話

03:02

可以看一下以下的錄影

03:04

總之你現在在網路上

03:06

可以載到一種東西叫做Word Embedding

03:08

這個Word Embedding

03:09

會給每一個詞彙一個向量

03:11

而一個句子就是一排長度不一的向量

03:18

好 那接下來還有什麼樣的例子

03:20

我們需要把

03:22

這個一個向量的Sequence當做輸入呢

03:24

舉例來說 作業二

03:27

一段聲音訊號其實是一排向量

03:32

怎麼說呢

03:32

我們會把一段聲音訊號取一個範圍

03:35

這個範圍 叫做一個Window

03:38

把這個Window裡面的資訊呢

03:39

描述成一個向量

03:41

這個向量就叫做一個Frame

03:43

在語音上

03:44

我們會把一個向量叫做一個Frame

03:48

通常這個Window的長度啊

03:49

就是25個Millisecond

03:52

那怎麼把這麼一個小段的聲音訊號

03:54

變成一個Frame

03:55

變成一個向量呢

03:56

這邊就有百百種做法啦

03:58

那這邊就不細講

04:00

就是有各式各樣的做法

04:02

可以用一個向量來描述

04:04

一小段25個Millisecond裡面的語音訊號

04:08

然後呢

04:09

你為了要描述一整段的聲音訊號

04:11

你會把這個Window往右移一點

04:13

通常移動的大小是10個Millisecond

04:17

欸 有人就會問說

04:18

為什麼這邊是25 為什麼這個10

04:21

這個問題呢 就很難回答

04:22

這個古聖先賢幫你調好了

04:25

你知道嗎

04:25

這個你自己調放都是比較差

04:27

這古聖先賢已經把所有的可能都試過了

04:30

然後調一個最好的結果

04:31

然後就這樣

04:34

好 那總之呢

04:35

一段聲音訊號

04:36

你就是用一串向量來表示

04:39

而因為每一個Window啊

04:42

他們往右移 都是移動10個Millisecond

04:45

所以一秒鐘的聲音訊號有幾個向量呢

04:49

有100個

04:51

所以一分鐘的聲音訊號

04:52

就有這個100乘以60

04:55

就有6000個向量

04:57

所以語音其實很複雜的

04:58

一小段的聲音訊號

04:59

它裡面包含的資訊量其實是非常可觀的

05:03

所以聲音訊號也是一堆向量

05:08

還有什麼東西是一堆向量呢

05:09

一個Graph

05:11

一個Graph 一個圖

05:12

也是一堆向量

05:15

怎麼說呢

05:15

我們知道說Social Network就是一個Graph

05:19

在Social Network上面每一個節點

05:22

就是一個人

05:23

然後節點跟節點之間的Each

05:25

就是他們兩個

05:26

比如說是不是朋友等等

05:28

而每一個節點

05:30

可以看作是一個向量

05:33

你可以拿每一個人的

05:35

比如說他的Profile裡面的資訊啊

05:37

他的性別啊 他的年齡啊

05:39

他的工作啊 他講過的話啊等等

05:42

把這些資訊用一個向量來表示

05:45

所以一個Social Network 一個Graph

05:47

你也可以看做是一堆的向量所組成的

05:52

那還有什麼例子跟Graph有關呢

05:54

舉例來說

05:55

一個分子

05:56

它也可以看作是一個Graph

05:59

那現在像這種Drug Discovery的應用

06:01

非常地受到重視

06:03

尤其是在Covid-19這一段時間

06:05

很多人都期待

06:06

也許用機器學習

06:07

可以在Drug Discovery上面做到什麼突破

06:10

那這個時候

06:11

你就需要把一個分子

06:13

當做是你的模型的輸入

06:16

每一個分子可以看作是一個Graph

06:19

分子上面的每一個球

06:21

就是一個原子

06:22

你就是一個向量

06:25

那一個原子怎麼用一個向量來表示呢

06:27

你可以用One-Hot Vector來表示

06:29

你可以說氫就是1000

06:32

碳就是0100

06:34

然後這個氧就是0010

06:36

你可以用One-Hot Vector

06:38

來表示每一個原子

06:39

那一個分子就是一個Graph

06:42

它就是一堆向量

06:46

好 那輸出是什麼

06:47

我們剛才已經看說輸入是一堆向量

06:50

它可以是文字

06:52

可以是語音

06:53

可以是Graph

06:54

那這個時候

06:55

我們有可能有什麼樣的輸出呢

06:57

有三種可能性

07:00

第一種可能性是

07:01

每一個向量都有一個對應的Label

07:06

也就是說當你的模型

07:07

看到輸入是四個向量的時候

07:10

它就要輸出四個Label

07:12

而每一個Label

07:13

它可能是一個數值

07:14

那就是Regression的問題

07:15

如果每個Label是一個Class

07:17

那就是一個Classification的問題

07:20

但是在第一種可能性裡面

07:22

輸入跟輸出的長度是一樣的

07:25

所以模型不需要去煩惱

07:26

要輸出多少的Label

07:28

輸出多少的Scale(00:07:29)

07:29

反正輸入是四個向量

07:32

輸出就是四個向量

07:33

輸入五個向量

07:34

輸入五個向量 輸出就是五個Label

07:37

這是第一種類型

07:39

那什麼樣的Applications

07:41

會用到第一種類型的輸出呢

07:44

舉例來說 在文字處理上

07:47

假設你今天要做的是POS Tagging

07:50

POS Tagging是什麼呢

07:52

POS Tagging就是詞性標註

07:54

你要讓機器自動決定說

07:57

每一個詞彙 它是什麼樣的詞性

07:59

它是名詞 還是動詞 還是形容詞等等

08:02

那這個任務啊

08:03

其實並沒有很容易

08:05

舉例來說

08:06

你現在看到一個句子

08:07

I saw a saw

08:08

這並不是打錯

08:09

並不是你看一個看

08:10

而是我看到一個鋸子

08:13

這個第二個saw當名詞用的時候

08:16

它是鋸子

08:18

不是Sentence那個句子

08:19

是可以鋸東西的鋸子

08:20

知道嗎

08:22

好 那所以機器要知道說

08:23

第一個saw是個動詞

08:25

第二個saw 雖然它也是個saw

08:27

但它是名詞

08:29

但是每一個輸入的詞彙

08:32

都要有一個對應的輸出的詞性

08:35

這個任務就是

08:37

輸入跟輸出的長度是一樣的Case

08:41

這個就是屬於第一個類型的輸出

08:44

那如果是語音的話

08:46

你可以想想看我們作業二

08:47

就是這樣子的任務

08:49

雖然我們作業二

08:50

沒有給大家一個完整的Sequence

08:52

我們是把

08:52

每一個每一個每一個Vector分開給大家了啦

08:55

但是串起來就是一段聲音訊號裡面

08:58

有一串Vector

08:59

每一個Vector你都要決定

09:01

它是哪一個Phonetic

09:03

也就是哪一個

09:04

我也不知道Phonetic是什麼

09:05

就是當做音標來看

09:06

就是哪一個音標

09:08

當然這個不是真正的語音辨識啦

09:10

這是一個語音辨識的簡化版

09:13

或者是如果是Social Network的話

09:15

就是給一個Graph

09:16

給一個Social Network

09:17

那你的Machine呢

09:19

你的Model呢

09:19

要決定每一個節點

09:21

它有什麼樣的特性

09:22

比如說他會不會買某一個商品

09:25

這樣我們才知道說

09:26

要不要推薦某一個商品給他

09:29

好 所以以下

09:30

以上呢

09:31

就是舉輸入跟輸出 數目一樣的例子

09:35

好 這是第一種可能的輸出

09:37

第二種可能的輸出是什麼

09:38

第二種可能的輸出是我們一整個Sequence

09:43

只需要輸出一個Label就好

09:45

舉例來說

09:47

如果是文字的話

09:49

我們就說Sentiment Analysis

09:52

Sentiment Analysis是什麼呢

09:53

Sentiment Analysis就是給機器看一段話

09:56

它要決定說這段話呢

09:58

是正面的還是負面的

10:00

那你可以想像說這種應用很有用

10:01

假設你的公司開發了一個產品

10:03

這個產品上線了

10:04

你想要知道網友的評價怎麼樣

10:06

但是你又不可能一則一則網友的留言都去分析

10:09

那也許你就可以用這種

10:11

Sentiment Analysis的技術

10:13

讓機器自動去判讀說

10:15

當一則貼文裡面有提到某個產品的時候

10:17

它是正面的 還是負面的

10:19

那你就可以知道你的產品

10:21

在網友心中的評價怎麼樣

10:23

這個是Sentiment Analysis給一整個句子

10:26

只需要一個Label

10:28

那Positive或Negative

10:31

那這個就是第二類的輸出

10:34

那如果是語音的例子的話呢

10:36

在作業四裡面我們會做語者辨認

10:38

機器要聽一段聲音

10:40

然後決定他是誰講的

10:42

這個也是第二種輸出的例子

10:45

或者是如果是Graph的話呢

10:46

今天你可能想要給一個分子

10:49

然後要預測說這個分子

10:51

比如說它有沒有毒性

10:53

或者是它的親水性如何

10:54

那這就是給一個Graph 輸出一個Label

10:57

這也是第二個例子

11:00

好 那還有第三個可能的輸出

11:03

第三個可能的輸出就是

11:04

我們不知道應該輸出多少個Label

11:08

機器要自己決定

11:11

應該要輸出多少個Label

11:14

可能你輸入是N個向量

11:16

輸出可能是N'個Label

11:19

為什麼是N'

11:20

機器自己決定

11:23

好 那這種任務啊

11:24

又叫做sequence to sequence的任務

11:27

那我們在作業五呢

11:28

會有sequence to sequence的作業

11:30

所以這個之後我們還會再講

11:33

那可以想像說

11:34

翻譯就是sequence to sequence的任務

11:37

因為輸入輸出是不同的語言

11:39

它們的詞彙的數目本來就不會一樣多

11:41

或者是語音辨識也是

11:44

真正的語音辨識也是一個sequence to sequence的任務

11:48

輸入一句話

11:49

然後輸出一段文字

11:50

這也是一個sequence to sequence的任務

11:53

好 那第三種類型之後會講

11:56

今天我們只講第一種類型

11:59

第二種類型

12:01

我們有作業四

12:03

你可以把作

12:03

你可以自己去看看作業四的程式

12:05

看看第一種類型的問題是怎麼處理的

12:08

那因為上課時間有限

12:10

所以上課

12:11

我們今天就先只講第一個類型

12:14

也就是輸入跟輸出數目一樣多的狀況

12:18

那這種輸入跟輸出數目一樣多的狀況啊

12:20

它又叫做Sequence Labeling

12:23

你要給Sequence裡面的每一個向量

12:26

都給它一個Label

12:29

那要怎麼解Sequence Labeling的問題呢

12:31

那直覺的想法就是

12:33

欸 就跟作業二一樣

12:36

我們就拿個Fully-Connected的Network

12:39

然後雖然這個輸入是一個Sequence

12:41

但我們就各個擊破

12:43

不要管它

12:43

不要管它是不是一個Sequence

12:45

各個擊破

12:46

把每一個向量

12:47

分別輸入到Fully-Connected的Network裡面

12:51

然後呢

12:52

Fully-Connected的Network就會給我們輸出

12:54

那現在看看

12:55

你要做的是Regression還是Classification

12:57

產生正確的對應的輸出

12:59

就結束了

13:01

那這麼做顯然有非常大的瑕疵

13:04

什麼樣非常大的瑕疵呢

13:05

假設今天是

13:07

詞性標記的問題

13:09

你給機器一個句子

13:11

I saw a saw

13:13

對Fully-Connected Network來說

13:15

這一個saw 跟這個saw

13:16

完全一模一樣啊

13:19

它們是同一個詞彙啊

13:21

既然Fully-Connected的Network輸入同一個詞彙

13:24

它沒有理由輸出不同的東西啊

13:27

但實際上

13:28

你期待第一個saw要輸出動詞

13:30

第二個saw要輸出名詞

13:32

但對Network來說它不可能做到

13:34

因為這兩個saw 明明是一模一樣的

13:37

你叫它這個要輸出動詞 要輸

13:39

這個要輸出名詞

13:40

它會非常地困惑

13:41

完全不知道要怎麼處理

13:44

所以怎麼辦

13:45

有沒有可能讓Fully-Connected的Network

13:48

考慮更多的

13:50

比如說上下文的Context的資訊呢

13:53

這是有可能的

13:54

怎麼做

13:56

你就把這一個向量

13:58

前後幾個向量都串起來

14:01

一起丟到Fully-Connected的Network就結束了

14:04

事實上在作業二裡面

14:06

助教也已經這麼做了

14:08

在作業二裡面

14:09

我們不是只看一個Frame

14:11

去判斷這個Frame屬於哪一個Phonetic

14:14

也就屬於哪一個音標

14:16

而是看這個Frame的前面五個加後面五個

14:19

也就總共看十一個Frame

14:20

來決定它是哪一個音標

14:24

所以我們可以給Fully-Connected的Network

14:26

一整個Window的資訊

14:28

讓它可以考慮一些上下文的

14:31

跟我現在要考慮的這個向量

14:33

相鄰的其他向量的資訊

14:37

但是這樣子的方法還是有極限

14:40

如果是在作業二

14:41

其實用這個方法就夠好了

14:43

作業二就算是給你Sequence的資訊

14:46

你考慮整個Sequence

14:47

你可能也很難再做的更好啦

14:49

作業二考慮前後五個Frame

14:51

其實就可以得到很不錯的結果了

14:54

所以你要過Strong Baseline

14:55

重點並不在於考慮整個Sequence

14:57

你就不需要往那個方向想了

15:00

用助教現有給你的Data

15:01

你就可以輕易的過Strong Baseline

15:04

好 但是真正的問題

15:05

但是如果今天我們有某一個任務

15:08

不是考慮一個Window就可以解決的

15:11

而是要考慮一整個Sequence才能夠解決的話

15:14

那要怎麼辦呢

15:16

那有人可能會想說這個還不容易

15:18

我就把Window開大一點啊

15:20

大到可以把整個Sequence蓋住

15:23

不就結束了嗎

15:25

但是不要忘了今天Sequence的長度

15:27

是有長有短的

15:30

我們剛才有說

15:31

我們輸入給我們的Model的Sequence的長度

15:34

每次可能都不一樣

15:35

如果你今天說我真的要開一個Window

15:37

把整個Sequence蓋住

15:39

那你可能要統計一下你的訓練資料

15:42

然後看看你的訓練資料裡面

15:44

最長的Sequence有多長

15:46

然後開一個Window比最長的Sequence還要長

15:48

你才有可能把整個Sequence蓋住

15:51

但是你開一個這麼大的Window

15:53

意味著說你的Fully-Connected的Network

15:55

它需要非常多的參數

15:57

那可能不只運算量很大

15:59

可能還容易Overfitting

16:02

所以有沒有更好的方法

16:04

來考慮整個Input Sequence的資訊呢

16:07

這就要用到我們接下來要跟大家介紹的

16:11

Self-Attention這個技術

16:14

那Self-Attention是怎麼運作的呢

16:16

Self-Attention的運作方式就是

16:18

Self-Attention會吃一整個Sequence的資訊

16:22

然後你Input幾個Vector

16:24

它就輸出幾個Vector

16:28

比如說你這邊Input一個深藍色的Vector

16:30

這邊就給你一個另外一個Vector

16:32

這邊給個淺藍色

16:33

它就給你另外一個Vector

16:34

這邊輸入4個Vector

16:36

它就Output 4個Vector

16:38

那這4個Vector有什麼特別的地方呢

16:40

這4個Vector

16:41

他們都是考慮一整個Sequence以後才得到的

16:45

那等一下我會講說Self-Attention

16:47

怎麼考慮一整個Sequence的資訊

16:50

所以這邊每一個向量

16:52

我們特別給它一個黑色的框框

16:55

代表說它不是一個普通的向量

16:57

它是考慮了整個句子以後才得到的資訊

17:00

再把這個有考慮整個句子的向量

17:02

丟進Fully-Connected的Network

17:04

然後再來決定說它應該是什麼樣的東西

17:08

什麼樣的類別或Output什麼樣的數字

17:10

那你用這個方法

17:11

如此一來你這個Fully-Connected的Network

17:13

它就不是只考慮一個非常小的範圍

17:16

或一個小的Window

17:17

而是考慮整個Sequence的資訊

17:19

再來決定現在應該要輸出什麼樣的結果

17:24

那這個就是Self-Attention

17:26

那Self-Attention呢不是只能用一次

17:28

你可以疊加很多次

17:30

你可以說

17:30

我這個Self-Attention的輸出呢

17:33

通過Fully-Connected Network以後

17:35

得到Fully-Connected Network的輸出

17:37

Fully-Connected的Network輸出

17:39

再做一次Self-Attention

17:41

Fully-Connected的Network

17:42

再過一次Self-Attention

17:44

再重新考慮一次整個Input Sequence的資訊

17:48

再丟到另外一個Fully-Connected的Network

17:51

最後再得到最終的結果

17:53

所以你可以把Fully-Connected的Network

17:55

跟Self-Attention交替使用

17:57

就是Self-Attention處理整個Sequence的資訊

18:01

Fully-Connected的Network

18:02

專注於處理某一個位置的資訊

18:04

然後你可以再用Self-Attention

18:07

再把整個Sequence資訊再處理一次

18:09

然後交替使用Self-Attention跟Fully-Connected

18:14

那有關Self-Attention

18:15

最知名的相關的文章

18:17

就是Attention is all you need.

18:20

那在這篇Paper裡面呢

18:22

Google提出了Transformer這樣的Network架構

18:25

那Transformer就是變形金剛

18:28

所以提到這個Network的時候呢

18:29

我們就會有變形金剛這個形象

18:32

那在Transformer裡面一個最重要的Module

18:34

Transformer我們今天還不會講到

18:36

但我們之後會講到

18:37

Transformer裡面一個最重要的Module呢

18:39

就是Self-Attention

18:41

它就是變形金剛的火種源

18:43

那這篇Paper最厲害的地方

18:45

就是它有一個霸氣的名字

18:46

它霸氣的名字就是Attention is all you need.

18:51

那其實像Self-Attention這樣的架構

18:53

最早我並不會說它是出現在

18:55

Attention is all you need.這樣的Paper

18:57

因為其實很多更早的Paper

18:58

就有提出過類似的架構

19:00

只是不見得叫做Self-Attention

19:02

比如說叫做(00:19:02)Self-Matching

19:04

或者是叫別的名字

19:06

不過呢是Attention is all you need.這篇Paper

19:08

把Self-Attention這個Module

19:10

把它發揚光大

19:13

那Self-Attention是怎麼運作的呢

19:16

Self-Attention的Input

19:18

它就是一串的Vector

19:21

那這個Vector可能是你整個Network的Input

19:24

它也可能是某個Hidden Layer的Output

19:28

所以我們這邊不是用x來表示它

19:30

我們用a來表示它

19:31

代表說它有可能是前面已經做過一些處理

19:34

它是某個Hidden Layer的Output

19:38

那Input一排a這個向量以後

19:40

Self-Attention要Output另外一排b這個向量

19:45

那這個b呢 每一個b呢

19:47

都是考慮了所有的a以後才生成出來的

19:51

所以這邊刻意畫了非常非常多的箭頭

19:54

告訴你說b1 考慮了a1到a4產生的

19:57

b2考慮a1到a4產生的

20:00

b3 b4也是一樣

20:01

考慮整個input的sequence

20:03

才產生出來的

20:07

好 那接下來呢就是要跟大家說明

20:09

怎麼產生b1這個向量

20:12

那你知道怎麼產生b1這個向量以後

20:14

你就知道怎麼產生剩下b1 b2 b3 b4剩下的向量

20:19

好 怎麼產生b1這個向量呢

20:21

第一個步驟

20:22

是根據a1找出這個sequence裡面

20:27

跟a1相關的其他向量

20:32

我們知道說今天我們要做self-attention

20:35

目的就是為了要考慮整個sequence

20:37

但是我們又不希望把整個sequence

20:39

所有的資訊包在一個window裡面

20:41

所以我們有一個特別的機制

20:43

這個機制是根據a1這個向量

20:45

找出說整個很長的sequence裡面

20:48

到底哪些部分是重要的

20:49

哪些部分跟判斷a1是哪一個label

20:53

是有關係的

20:54

哪些部分是我們要決定a1的class

20:57

決定a1的regression數值的時候

20:59

所需要用到的資訊

21:02

好 那每一個向量跟a1的關聯的程度

21:06

我們用一個數值叫α來表示

21:10

再來的問題就是這個self-attention的module

21:13

怎麼自動決定兩個向量之間的關聯性呢

21:18

你給它兩個向量a1跟a4

21:20

它怎麼決定a1跟a4有多相關

21:23

然後給它一個數值α呢

21:25

那這邊呢你就需要一個計算attention的模組

21:30

這個計算attention的模組呢

21:31

它就是拿兩個向量作為輸入

21:34

然後它就直接輸出α那個數值

21:36

那你就可以把α那個數值

21:38

當做兩個向量的關聯的程度

21:42

那怎麼計算這個α的數值呢

21:44

這邊就有各種不同的做法

21:47

那比較常見的做法呢

21:49

叫做用dot product

21:51

那dot product怎麼做呢

21:53

你把輸入的這兩個向量

21:55

分別乘上兩個不同的矩陣

22:00

左邊這個向量乘上Wq這個矩陣

22:02

右邊這個向量乘上Wk這個矩陣

22:05

接下來得到q跟k這兩個向量

22:08

那你再把q跟k做dot product

22:11

就是把他們做element-wise 的相乘

22:13

再全部加起來以後就得到

22:15

就把q跟k做dot product以後

22:17

得到一個 scalar

22:18

這個scalar就是α

22:20

這是一種計算α的方式

22:22

那其實還有其他的計算方式

22:24

比如說右邊呢

22:25

有另外一個叫做Additive的計算方式

22:27

它的計算方法就是

22:29

把同樣這兩個向量通過Wq Wk

22:32

得到q跟k

22:33

那我們不是把它做Dot-Product

22:35

是把它這個串起來

22:38

然後丟到這個過一個(00:22:39)Funtion

22:41

然後再通過一個Transform

22:42

然後得到α

22:43

總之有非常多不同的方法

22:46

可以計算Attention

22:47

可以計算這個α的數值

22:49

可以計算這個關聯的程度

22:51

但是在接下來的討論裡面

22:54

我們都只用左邊這個方法

22:56

這也是今日最常用的方法

22:58

也是用在Transformer裡面的方法

23:02

那接下來呀我們就要講

23:05

怎麼計算出這個α

23:08

那講完這個

23:11

這邊我們就快要講到一個段落

23:14

那講到一個段落呢

23:15

我們就可以下課或者看看大家有沒有問題

23:18

總之呢我們就是用這兩個Vector

23:21

可以計算出α

23:22

那接下來怎麼把它套用在Self-Attention裡面呢

23:28

那你就要把這邊的a1去跟這邊的a2 a3 a4

23:32

分別都去計算他們之間的關聯性

23:36

也就是計算他們之間的α

23:39

那怎麼做呢

23:40

你把a1乘上Wq 得到q1

23:45

那這個q有一個名字

23:47

我們叫做Query

23:49

它就像是你搜尋引擎的時候

23:50

去搜尋相關文章的問題

23:53

就像搜尋相關文章的關鍵字

23:56

所以這邊叫做Query

23:58

然後接下來呢

24:00

a2 a3 a4你都要去把它乘上Wk

24:04

得到k這個Vector

24:06

k這個Vector呢有一個名字叫做Key

24:10

那你把這個Query q1

24:12

跟這個Key k2

24:13

算Inner-Product就得到α

24:16

我們這邊用α1,2來代表說

24:19

Query是1提供的

24:22

Key是2提供的時候

24:24

這個1跟2他們之間的關聯性

24:27

這個我們用α1,2來表示

24:29

那這個α這個關聯性也有一個稱號

24:32

叫做Attention的Score

24:34

叫做Attention的分數

24:36

好那q1跟k2

24:38

也就是a1跟a2

24:40

計算出他們的Attention的分數

24:41

計算出他們的關聯性以後

24:43

接下來也要跟a3 a4來計算

24:46

那怎麼跟a3 a4計算呢

24:48

你就把a3乘上Wk 得到k3

24:51

得到另外一個Key

24:52

a4乘上Wk 得到k4

24:54

得到另外一個Key

24:56

然後你再把k3這個Key

24:58

跟q1這個Query做Inner-Product

25:00

得到1跟3之間的關聯性

25:02

得到1跟3的Attention

25:04

你把k4跟q1做Dot-Product

25:06

得到α1,4

25:07

得到1跟4之間的關聯性

25:10

你就把a1去計算它跟a2 a3 a4的關聯性

25:14

這個關聯性用的Attention Score α來表示它

25:19

那其實一般在實作時候

25:21

q1也會跟自己算關聯性

25:24

所以你也會把a1乘上Wk 得到k1

25:27

把q1跟k1去計算它的關聯性

25:30

自己跟自己計算的關聯性

25:32

那自己跟自己計算關聯性這件事情有多重要呢

25:35

你可以自己在做作業的時候試試看

25:37

看這件事情的影響大不大了

25:40

好 那我們計算出

25:42

a1跟每一個向量的關聯性以後

25:45

接下來這邊會作為一個Soft-Max

25:48

裡面有點有 這邊這個Soft-Max

25:51

跟分類的時候的那個Soft-Max是一模一樣的

25:55

我們就把這邊的α全部乘上Exponential

26:00

然後再把Exponential的值

26:02

全部加起來做Normalize

26:03

得到α'

26:05

所以Soft-Max的輸出就是一排α

26:09

所以本來有一排α

26:10

通過Soft-Max就得到α'

26:13

那你可能會問說這邊為什麼要用Soft-Max

26:17

剛才你說這個分類用Soft-Max

26:20

你說有一串道理 只是沒有講而已

26:22

那這邊有道理嗎

26:24

這邊就沒有什麼道理

26:26

這邊你不一定要用Soft-Max

26:28

你可以用別的東西 也沒問題

26:31

比如說有人嘗試過說做個ReLU

26:34

這邊通通做個ReLU

26:36

那結果發現還比Soft-Max好一點

26:38

所以這邊你不一定要用Soft-Max

26:39

這邊你要用什麼Activation Function都行

26:42

你高興就好

26:44

你可以試試看

26:45

那Soft-Max是最常見的

26:46

那你可以自己試試看

26:47

看能不能試出比Soft-Max更好的結果

26:52

好 那得到這個α'以後

26:54

接下來得到這個α'以後

26:57

接下來我們就要根據這個α'

27:01

去抽取出這個Sequence裡面重要的資訊

27:05

根據這個α我們已經知道說

27:08

哪些向量跟a1是最有關係的

27:12

接下來我們要根據這個關聯性

27:14

根據這個Attention的分數

27:15

來抽取重要的資訊

27:18

怎麼抽取重要的資訊呢

27:19

我們會把a1到a4這邊每一個向量

27:22

乘上Wv 得到新的向量

27:25

那這邊分別就是用v1 v2 v3 v4來表示

27:29

接下來把這邊的v1到v4

27:32

每一個向量都去乘上Attention的分數

27:35

都去乘上α'

27:36

然後呢再把它加起來

27:39

我們把式子寫在這邊

27:41

我們就是把這邊的每一個v都乘上α'

27:44

得到b1

27:46

那你可以想見說

27:47

如果某一個向量它得到的分數越高

27:52

比如說如果a1跟a2的關聯性很強

27:54

這個α'得到的值很大

27:56

那我們今天在做Weighted Sum以後

27:57

得到的b1的值

27:59

就可能會比較接近v2

28:02

所以這邊誰的值最大

28:04

誰的那個Attention的分數最大

28:07

誰的那個v就會Dominant你抽出來的結果

28:12

好 所以這邊呢我們就講了

28:14

怎麼從一整個Sequence 得到b1