【機器學習2021】Transformer (上)

Hung-yi Lee
26 Mar 202132:48

Summary

TLDR本视频脚本深入讲解了Transformer和Seq2Seq模型在自然语言处理和语音识别等领域的广泛应用。通过生动的例子说明了Transformer模型的强大功能,可以直接将语音转化为文字、进行机器翻译、文法剖析等任务。脚本还详细介绍了Transformer的编码器架构,涉及Self-Attention、残差连接、层归一化等关键设计。最后探讨了未来架构优化的可能性,令人对该领域的发展充满期待。

Takeaways

  • 😃 Transformer是一种Sequence-to-Sequence模型,广泛应用于自然语言处理和语音识别等领域。
  • 😉 Transformer由Encoder和Decoder两部分组成,Encoder对输入序列进行处理,Decoder决定输出序列。
  • 🤔 Transformer Encoder中的每个块包含Self-Attention、前馈网络、残差连接和层标准化等组件。
  • 🧐 Self-Attention能够捕捉序列中元素之间的依赖关系,是Transformer的核心。
  • 😯 在Transformer中,添加位置编码是为了赋予序列元素位置信息。
  • 🤓 Transformer不仅可以应用于机器翻译,还可用于问答系统、文本摘要、情感分析等多种NLP任务。
  • 😲 Seq2Seq模型甚至可以用于语法分析、多标签分类和目标检测等看似无关的任务。
  • 🤯 Transformer的架构设计并非最优,可以通过调整模块顺序和归一化方法进行改进。
  • 😎 除了Transformer,RNN、CNN等其他模型也可以用作Encoder,为不同任务定制模型可获得更好表现。
  • 🤩 BERT就是一种只使用Transformer Encoder的模型,在NLP领域取得了突破性进展。

Q & A

  • 什么是Transformer?

    -Transformer是一种序列到序列的模型(Sequence-to-Sequence model),广泛应用于自然语言处理和语音识别等领域。它具有编码器(Encoder)和解码器(Decoder)两个主要部分。

  • Transformer的编码器(Encoder)是如何工作的?

    -Transformer的编码器由多个相同的层组成。每一层首先进行Multi-Head Self-Attention运算,然后是全连接前馈网络(Feed Forward)。中间使用了残差连接(Residual Connection)和层归一化(Layer Normalization)来帮助训练。

  • Self-Attention的作用是什么?

    -Self-Attention运算是Transformer的核心部分。它能够捕捉输入序列中任意两个位置的关系,克服了RNN无法并行化的缺陷。

  • 为什么要使用残差连接和层归一化?

    -残差连接(Residual Connection)有助于更好地训练很深的网络。层归一化(Layer Normalization)则是一种提高训练稳定性的方法,与批归一化(Batch Normalization)类似。

  • Transformer的应用有哪些?

    -Transformer广泛应用于机器翻译、语音识别、文本摘要、情感分析、问答系统等自然语言处理任务,甚至可以用于视觉任务如目标检测。

  • 语音识别和语音合成如何利用Transformer?

    -在语音识别中,Transformer可以将音频序列直接转换为文字输出。在语音合成中,则可以将文字输入转换为语音波形序列。

  • BERT与Transformer有什么关系?

    -BERT模型的Encoder部分就是采用了Transformer的Encoder结构。BERT在自然语言处理领域取得了很多重要成果。

  • Transformer的结构是最优的吗?

    -不是,Transformer的原始结构并非最优设计。研究人员不断在探索改进其各个部分,如重新设计层归一化顺序等。

  • 除了序列到序列,Transformer还能应用于其他任务吗?

    -是的,Transformer可以用于语法解析、多标签分类、目标检测等任务。只要能将问题转化为序列到序列的形式,就可以尝试应用Transformer。

  • 训练Transformer模型有什么技巧吗?

    -对于复杂模型如Transformer,通过合适的优化器、学习率以及数据预处理等技巧,有助于模型更快收敛和取得更好性能。

Outlines

00:00

😃 Transformer 和BERT的介绍

本段内容主要介绍了Transformer和BERT模型,解释了Transformer是一种序列到序列(Seq2Seq)的模型,适用于各种语音和自然语言处理任务。Transformer和后面要讲的BERT模型有紧密联系。阐述了Seq2Seq模型的应用场景,如语音识别、机器翻译、语音翻译等,并举例说明了基于语料库训练Seq2Seq模型进行台语转中文的可行性。还提到NLP任务往往可以视为问答(QA)问题,使用Seq2Seq模型来解决。

05:01

🎤 台语语音合成示例

本段介绍了台语语音合成的例子,利用台语语料库训练Seq2Seq模型(即Echotron模型),可将中文文本转换为台语语音。解释了目前的做法是先将中文转为台语拼音,再由Seq2Seq模型将拼音转为语音。给出了一些中文转台语语音的示例,并指出当前模型在倒装等语法处理上还有不足。

10:03

📖 Seq2Seq在NLP中的广泛应用

本段阐述了Seq2Seq模型在自然语言处理领域的多种应用,如聊天机器人、文法分析、情感分析、多标签分类等。即使任务的输入输出形式看似并非序列,也可将其硬塞入Seq2Seq模型进行解决。提到虽然Seq2Seq模型通用但针对特定任务设计模型会有更好的表现,可参考另一门课程了解更多细节。

15:05

🌳 文法分析中的Seq2Seq应用

本段介绍了如何将文法分析任务转化为Seq2Seq问题。将句子视为输入序列,将语法树的括号表示形式视为输出序列,从而可以使用Seq2Seq模型直接从句子生成语法树。举例说明了利用这种做法可以达到最先进的结果。概括了Seq2Seq模型在各种NLP任务中的潜在应用。

20:08

🧩 多标签分类和目标检测中的Seq2Seq

本段展示了如何将多标签分类和目标检测任务用Seq2Seq模型来解决。对于多标签分类,输入为文章,输出由模型自主决定有多少个标签。对于目标检测,可以将物品边框坐标序列化作为输出。总的来说,Seq2Seq模型是一种通用强大的模型,很多看似无关的任务都可以用它来解决。

25:08

⚙️ Transformer编码器架构剖析

本段开始详细解释Transformer编码器的内部架构。每个编码器块由多头Self-Attention、残差连接、层归一化等模块组成。着重解释了残差连接和层归一化的作用和实现方式。并对论文中的设计提出质疑,即这种设计可能并非最优。

30:09

✏️ Transformer编码器架构优化探讨

本段继续探讨Transformer编码器架构设计的改进方向。介绍了两个相关论文对层归一化位置和是否使用批归一化的探索。说明了论文原始设计并非最优,未来可以持续改进。

Mindmap

Keywords

💡Transformer

Transformer 是一种新颖的深度学习模型架构,主要用于序列到序列(Sequence-to-Sequence)任务。该模型通过注意力(Attention)机制捕捉序列之间的长程依赖关系,在机器翻译、语音识别、自然语言理解等任务上表现卓越。视频中多次提到 Transformer 及其关系密切的 BERT 模型,可见在当今自然语言处理领域,Transformer 架构极其重要和流行。

💡Seq2Seq

Seq2Seq 是 Sequence-to-Sequence 的缩写,指的是一种将一个序列(如语句)映射到另一个序列(如翻译后的语句)的建模方式。这种任务的输入和输出都是序列,且输出序列的长度是不固定的,需由模型自主决定。视频中列举了多个 Seq2Seq 任务的例子,如机器翻译、语音识别、问答系统等,并解释 Transformer 是一种通用的 Seq2Seq 模型。

💡Encoder-Decoder

Encoder-Decoder 架构是 Seq2Seq 模型的核心。Encoder 将输入序列编码为中间向量表示,Decoder 再将该向量解码为输出序列。正如视频中提到的,Transformer 就采用了这种 Encoder-Decoder 架构,其中 Encoder 由多个相同子层组成,子层包含多头注意力(Multi-Head Attention)和前馈全连接层,捕捉输入的上下文信息;而 Decoder 也由类似子层构成,并且还会与 Encoder 的输出序列进行交互,产生最终输出序列。

💡自注意力(Self-Attention)

注意力机制是 Transformer 中的关键部件,能够同时处理整个输入序列并捕获长程依赖关系。而自注意力(Self-Attention)是一种将单个序列映射到另一个序列的注意力方式,它使每个位置上的输出向量都是所有位置上输入向量的加权和。视频详细介绍了如何在 Transformer 的 Encoder 中使用多头自注意力层。

💡位置编码(Positional Encoding)

由于 Transformer 完全基于注意力机制,因而没有递归和卷积等明确编码序列位置信息的结构。为了解决这个问题,Transformer 在输入序列中加入了位置编码。视频提到,如果只使用自注意力并没有位置信息的话,模型无法区分序列中元素的相对或绝对位置,因此需要显式地为每个位置添加位置编码。

💡残差连接(Residual Connection)

残差连接是一种广泛应用于深度神经网络的结构,旨在构建高效且易于优化的网络。视频中说明,在 Transformer 的 Encoder 中,每个子层都会先做自注意力或前馈网络的变换,得到一个残差项,然后将该残差项加到输入序列上,进行残差连接。这种设计有助于保持梯度在反向传播中不衰减,从而解决训练深层网络的困难。

💡层归一化(Layer Normalization)

层归一化是一种常用的归一化方法,主要应用于规范化神经网络中的中间层输出,以防止在神经网络训练过程中出现梯度爆炸或梯度弥散的问题。视频解释了 Transformer 中的层归一化操作:它对每个样本(而非整个批次)计算均值和标准差,将输入减去均值再除以标准差进行归一化。每个 Transformer 子层的输出都会进行层归一化处理。

💡多头注意力(Multi-Head Attention)

多头注意力是 Transformer 注意力机制的一个扩展版本。它将输入并行地映射到多个注意力子空间(即多个头),每个头单独计算自注意力,然后将多个头的结果拼接并执行线性变换作为最终输出。这种多头机制可以从不同的语义子空间获取注意力信息,提高了模型的表现力。视频中清楚展示了 Transformer Encoder 子层包含了多头自注意力的处理过程。

💡前馈全连接网络(Feed-Forward Network)

前馈全连接网络是指在 Transformer 的 Encoder 和 Decoder 子层中,除了多头自注意力层之外,还存在的一个全连接的前馈子网络。其作用是对序列中的每个向量做两次线性变换,并在中间加入 ReLU 激活函数。经过这个子网络的非线性映射,能够为序列注入适度的位置信息,有利于捕捉序列中的更复杂的特征。视频从整体上对这一关键模块作了阐述。

💡BERT

BERT(Bidirectional Encoder Representations from Transformers)是一种基于 Transformer Encoder 架构训练的通用语言表示模型。它利用大规模无标注数据,通过预训练任务学习文本的双向表示,这在传统模型中是无法做到的。视频中提到 BERT 与 Transformer 的关系密切,BERT 实质上就是使用了与 Transformer Encoder 相同的子层结构和注意力机制。BERT 在预训练后可以应用于多种自然语言处理任务,并取得了卓越的表现。

Highlights

Transformer是一种Sequence-to-sequence模型,广泛应用于自然语言处理和语音识别等任务。

Transformer的Encoder部分使用Self-Attention机制来捕获输入序列中元素之间的依赖关系。

Transformer的Encoder中每个Block都包含一个Self-Attention层、一个前馈全连接层,以及残差连接和层归一化操作。

Self-Attention层考虑了整个输入序列,每个输出向量都综合了序列中所有位置的信息。

残差连接通过将输入直接相加到输出中,有助于梯度反向传播和模型训练。

层归一化对同一个样本中的所有维度进行归一化操作,有助于加速收敛和提高泛化性能。

Transformer能在各种自然语言处理任务中获得出色表现,如机器翻译、文本摘要、情感分析等。

Transformer架构在语音相关任务中也有广泛应用,如语音识别、语音合成和语音翻译。

通过硬性训练(Hard Training),可以让Transformer直接从语音信号输出文字,无需中间音标环节。

Transformer能够直接从台语语音信号生成对应的中文文字,打破了无文字语言的语音识别障碍。

Transformer的Sequence-to-Sequence架构使其可以广泛应用于多种自然语言处理任务,如文法分析、多标签分类和目标检测等。

尽管Transformer是一种通用模型,但针对特定任务的定制化模型往往能获得更好的性能。

Transformer的编码器架构在后来的BERT模型中得到了继承和进一步发展。

Transformer原始架构的设计可能并非最优,研究人员持续探索改进网络结构以获得更好的性能。

层归一化的位置、残差连接的设置等细节也是研究人员关注的焦点,以期获得最佳网络设计。

Transcripts

00:02

好 那接下來

00:04

我們要講這個作業五

00:06

大家會用上的Transformer

00:09

那我們在之前已經提了Transformer

00:11

提了不下N次

00:13

那如果你們還不知道

00:14

Transformer是什麼的話

00:15

Transformer其實就是變形金剛知道嗎

00:18

變形金剛的英文就是Transformer

00:22

那Transformer也跟我們之後會

00:24

提到的BERT有非常強烈的關係

00:28

所以這邊有一個BERT探出頭來

00:31

代表說Transformer跟BERT

00:33

是很有關係的

00:35

那Transformer是什麼呢

00:37

Transformer就是一個

00:39

Sequence-to-sequence的model

00:42

那Sequence-to-sequence的model

00:44

他的縮寫

00:45

我們會寫做Seq2seq

00:47

那Sequence-to-sequence的model

00:49

又是什麼呢

00:50

我們之前在講input a sequence的

00:53

case的時候

00:54

我們說input是一個sequence

00:56

那output有幾種可能

00:58

一種是input跟output的長度一樣

01:01

這個是在作業二的時候做的

01:04

有一個case是output指

01:06

output一個東西

01:07

這個是在作業四的時候做的

01:09

那接來作業五的case是

01:11

我們不知道應該要output多長

01:15

由機器自己決定output的長度

01:20

那有什麼樣的例子

01:21

有什麼樣的應用

01:22

是我們需要用到這種

01:24

Sequence-to-sequence的model

01:26

也就是input是一個sequence

01:27

output是一個sequence

01:28

但是我們不知道output應該有的長度

01:31

應該要由機器來自己決定

01:33

output的長度

01:34

有什麼樣的應用呢

01:35

舉例來說

01:36

一個很好的應用就是 語音辨識

01:39

在做語音辨識的時候

01:40

輸入是聲音訊號

01:42

我們在這一門課裡面

01:44

已經看過好多次

01:44

輸入的聲音訊號其實就是

01:47

一串的vector

01:49

輸出是什麼

01:50

輸出是語音辨識的結果

01:53

也就是輸入的這段聲音訊號

01:55

所對應的文字

01:56

我們這邊用圈圈來代表文字

02:00

每一個圈圈就代表

02:02

比如說中文裡面的一個方塊子

02:05

今天輸入跟輸出的長度

02:08

當然是有一些關係

02:10

但是卻沒有絕對的關係

02:12

我們說輸入的聲音訊號

02:14

他的長度是大T

02:15

我們並沒有辦法知道說

02:18

根據大T輸出的這個長度N

02:21

一定是多少

02:22

怎麼辦呢 由機器自己決定

02:23

由機器自己去聽這段聲音訊號的內容

02:28

自己決定他應該要輸出幾個文字

02:31

他輸出的語音辨識結果

02:33

輸出的句子裡面應該包含幾個字

02:36

由機器自己來決定

02:38

這個是語音辨識

02:40

還有很多其他的例子

02:42

比如說作業五我們會做機器翻譯

02:45

讓機器讀一個語言的句子

02:47

輸出另外一個語言的句子

02:50

那在做機器翻譯的時候

02:52

輸入的文字的長度是N

02:54

輸出的句子的長度是N'

02:57

那N跟N'之間的關係

03:00

也要由機器自己來決定

03:03

我們說輸入機器學習這個句子

03:05

輸出是machine learning

03:07

輸入是有四個字

03:10

輸出有兩個英文的詞彙

03:13

但是並不是所有中文跟英文的關係

03:15

都是輸出就是輸入的二分之一

03:18

到底輸入一段句子

03:20

輸出英文的句子要多長

03:23

由機器自己決定

03:25

甚至你可以做更複雜的問題

03:27

比如說做語音翻譯

03:30

什麼叫做語音翻譯

03:31

語音翻譯就是

03:32

你對機器說一句話

03:34

比如說machine learning

03:36

他輸出的不是英文

03:38

他直接把他聽到的英文的

03:40

聲音訊號翻譯成中文

03:42

你對他說machine learning

03:44

他輸出的是機器學習

03:47

你可能會問說

03:48

為什麼我們要做

03:49

Speech Translation這樣的任務

03:51

為什麼我們不說

03:52

我們直接做一個語音辨識

03:54

再做一個機器翻譯

03:56

把語音辨識系統跟機器翻譯系統

03:59

接起來 就直接是語音翻譯

04:02

那是因為其實世界上有很多語言

04:04

他根本連文字都沒有

04:07

世界上有超過七千種語言

04:10

那其實在這七千種語言

04:12

有超過半數其實是沒有文字的

04:15

對這些沒有文字的語言而言

04:18

你要做語音辨識

04:19

可能根本就沒有辦法

04:21

因為他沒有文字

04:22

所以你根本就沒有辦法做語音辨識

04:24

但我們有沒有可能對這些語言

04:27

做語音翻譯

04:29

直接把它翻譯成

04:31

我們有辦法閱讀的文字

04:34

一個很好的例子也許就是

04:36

台語的語音辨識

04:38

但我不會說台語沒有文字

04:40

很多人覺得台語是有文字的

04:41

但台語的文字並沒有那麼普及

04:43

現在聽說小學都有教台語的文字了

04:47

但台語的文字

04:48

並不是一般人能夠看得懂的

04:51

所以如果你做語音辨識

04:53

你給機器一段台語

04:56

然後它可能輸出是母湯

04:58

你根本就不知道

04:59

這段話在說什麼對不對

05:01

所以我們期待說機器也許可以做翻譯

05:04

做語音的翻譯

05:05

對它講一句台語

05:07

它直接輸出的是同樣意思的

05:10

中文的句子

05:11

那這樣一般人就可以看懂

05:14

那有沒有可能做到這件事呢

05:16

有沒有可能訓練一個類神經網路

05:18

這個類神經網路聽某一種語言

05:20

的聲音訊號

05:21

輸出是另外一種語言的文字呢

05:24

其實是有可能的

05:26

那對於台語這個例子而言

05:28

我們知道說

05:29

今天你要訓練一個neural network

05:31

你就需要有input跟output的配合

05:34

你需要有台語的聲音訊號

05:36

跟中文文字的對應關係

05:39

那這樣的資料好不好蒐集呢

05:41

這樣的資料

05:43

並不是沒有可能蒐集的

05:45

比如說YouTube上面

05:46

有很多的鄉土劇

05:47

你知道鄉土劇就是

05:49

台語語音 中文字幕

05:51

所以你只要它的台語語音載下來

05:53

中文字幕載下來

05:55

你就有台語聲音訊號

05:56

跟中文之間的對應關係

05:58

你就可以硬train一個模型

06:00

你就可以train我們剛才講的

06:01

我們等一下要講的Transformer

06:03

然後叫機器直接做台語的語音辨識

06:07

輸入台語 輸出中文

06:10

那你可能會覺得這個想法很狂

06:12

而且好像 聽起來有很多很多的問題

06:14

那我們實驗室就載了

06:15

一千五百個小時的鄉土劇的資料

06:18

然後 就真的拿來訓練一個

06:20

語音辨識系統

06:21

你可能會覺得說

06:22

這聽起來有很多的問題

06:23

舉例來說 鄉土劇有很多雜訊

06:26

有很多的音樂

06:27

不要管它這樣子

06:29

然後 鄉土劇的字幕

06:31

不一定跟聲音有對起來

06:33

就不要管它這樣子

06:34

然後呢你可能會想說

06:37

台語不是還有一些

06:39

比如說台羅拼音

06:40

台語也是有類似音標這種東西

06:42

也許我們可以先辨識成音標

06:44

當作一個中介

06:45

然後在從音標轉成中文

06:47

也沒有這樣做 直接訓練一個模型

06:49

輸入是聲音訊號

06:50

輸出直接就是中文的文字

06:53

這種沒有想太多 直接資料倒進去

06:56

就訓練一個模型的行為

06:58

就叫作硬train一發知道嗎

07:03

那你可能會想說

07:04

這樣子硬train一發到底能不能夠

07:07

做一個台語語音辨識系統呢

07:09

其實 還真的是有可能的

07:12

以下是一些真正的結果

07:15

機器在聽的一千五百個小時的

07:18

鄉土劇以後

07:19

你可以對它輸入一句台語

07:21

然後他就輸出一句中文的文字

07:23

以下是真正的例子

07:24

機器聽到的聲音是這樣子的

07:25

可以做一下台語的聽力測驗

07:28

看看你辨識出來的跟機器是不是一樣的

07:31

機器聽到這樣的句子

07:33

你的身體撐不住(台語)

07:34

那機器輸出是什麼呢

07:36

它的輸出是 你的身體撐不住

07:38

這個聲音訊號是你的身體撐不住(台語)

07:41

但機器並不是輸出無勘

07:43

而是它就輸出撐不住

07:45

或者是機器聽到的

07:47

是這樣的聲音訊號

07:48

沒事你為什麼要請假(台語)

07:50

沒事你為什麼要請假

07:52

機器聽到沒事(台語)

07:54

它並不是輸出 沒代沒誌

07:56

它是輸出 沒事

07:58

這樣聽到四個音節沒代沒誌(台語)

08:00

但它知道說台語的沒代沒誌(台語)

08:02

翻成中文 也許應該輸出 沒事

08:05

所以機器的輸出是

08:06

沒事你為什麼要請假

08:08

但機器其實也是蠻容易犯錯的

08:10

底下特別找機個犯錯的例子

08:12

給你聽一下

08:13

你聽聽這一段聲音訊號

08:15

不會膩嗎(台語)

08:16

他說不會膩嗎(台語)

08:18

我自己聽到的時候我覺得

08:19

我跟機器的答案是一樣的

08:20

就是說要生了嗎

08:23

但其實這句話

08:24

正確的答案就是

08:25

不會膩嗎(台語)

08:27

不會膩嗎

08:29

當然機器在倒裝

08:30

你知道有時候你從台語

08:32

轉成中文句子需要倒裝

08:34

在倒裝的部分感覺就沒有太學起來

08:38

舉例來說它聽到這樣的句子

08:40

我有跟廠長拜託(台語)

08:42

他說我有跟廠長拜託(台語)

08:44

那機器的輸出是

08:45

我有幫廠長拜託

08:47

但是你知道說這句話

08:49

其實是倒裝

08:50

我有跟廠長拜託(台語)

08:52

是我拜託廠長

08:54

但機器對於它來說

08:55

如果台語跟中文的關係需要倒裝的話

08:58

看起來學習起來還是有一點困難

09:00

這個例子想要告訴你說

09:02

直接台語聲音訊號轉繁體中文

09:05

不是沒有可能

09:06

是有可能可以做得到的

09:09

那其實台灣有很多人都在做

09:10

台語的語音辨識

09:11

如果你想要知道更多有關

09:13

台語語音辨識的事情的話

09:15

可以看一下下面這個網站

09:18

那台語語音辨識反過來

09:20

就是台語的語音合成對不對

09:24

我們如果是一個模型

09:25

輸入台語聲音 輸出中文的文字

09:28

那就是語音辨識

09:30

反過來 輸入文字 輸出聲音訊號

09:34

就是語音合成

09:36

這邊就是demo一下台語的語音合成

09:40

這個資料用的是

09:41

台灣 媠聲(台語)的資料

09:42

來找GOOGLE台灣媠聲(台語)

09:44

就可以找到這個資料集

09:45

裡面就是台語的聲音訊號

09:48

聽起來像是這個樣子

09:50

比如說你跟它說

09:51

歡迎來到台灣台大語音處理實驗室

09:54

不過這邊是需要跟大家說明一下

09:56

現在還沒有真的做End to End的模型

09:58

這邊模型還是分成兩階

10:00

他會先把中文的文字

10:02

轉成台語的台羅拼音

10:05

就像是台語的KK音標

10:07

在把台語的KK音標轉成聲音訊號

10:10

不過從台語的KK音標

10:11

轉成聲音訊號這一段

10:12

就是一個像是Transformer的network

10:15

其實是一個叫做echotron的model

10:18

它本質上就是一個Seq2Seq model

10:20

大概長的是這個樣子

10:22

所以你輸入文字

10:24

歡迎來到台大語音處理實驗室

10:26

機器的輸出是這個樣子的

10:28

歡迎來到台大(台語)

10:30

語音處理實驗室(台語)

10:32

或是你對他說這一句中文

10:35

然後他輸出的台語是這個樣子

10:38

最近肺炎真嚴重(台語)

10:40

要記得戴口罩 勤洗手(台語)

10:43

有病就要看醫生(台語)

10:45

所以你真的是可以

10:46

合出台語的聲音訊號的

10:49

就用我們在這一門課裡面學到的

10:52

Transformer或者是Seq2Seq的model

10:56

剛才講的是跟語音比較有關的

10:59

那在文字上

11:01

也會很廣泛的使用了Seq2Seq model

11:05

舉例來說你可以用Seq2Seq model

11:08

來訓練一個聊天機器人

11:11

聊天機器人就是你對它說一句話

11:14

它要給你一個回應

11:16

輸入輸出都是文字

11:18

文字就是一個vector Sequence

11:21

所以你完全可以用Seq2Seq 的model

11:24

來做一個聊天機器人

11:27

那怎麼訓練一個聊天機器人呢

11:29

你就要收集大量人的對話

11:31

像這種對話你可以收集

11:33

電視劇 電影的台詞 等等

11:36

你可以收集到

11:36

一堆人跟人之間的對話

11:39

假設在對話裡面有出現

11:40

某一個人說Hi

11:42

和另外一個人說

11:43

Hello How are you today

11:44

那你就可以教機器說

11:46

看到輸入是Hi

11:47

那你的輸出就要跟

11:49

Hello how are you today

11:51

越接近越好

11:52

那就可以訓練一個Seq2Seq model

11:55

那跟它說一句話

11:56

它就會給你一個回應

11:59

那事實上Seq2Seq model

12:01

在NLP的領域

12:02

在natural language processing的領域

12:04

的使用

12:05

是比你想像的更為廣泛

12:09

其實很多natural language processing的任務

12:12

都可以想成是question answering

12:16

QA的任務

12:18

怎麼說呢

12:19

所謂的Question Answering

12:20

就是給機器讀一段文字

12:23

然後你問機器一個問題

12:25

希望他可以給你一個正確的答案

12:28

很多你覺得跟question answering

12:30

沒什麼關係的任務

12:32

都可能可以想像成是QA

12:36

怎麼說呢 舉例來說

12:37

假設你今天想做的是翻譯

12:39

那機器讀的文章就是一個英文句子

12:42

問題是什麼 問題就是

12:44

這個句子的德文翻譯是什麼

12:46

然後輸出的答案就是德文

12:49

或者是你想要叫機器自動作摘要

12:51

摘要就是給機器讀一篇長的文章

12:53

叫他把長的文章的重點節錄出來

12:56

那你就是給機器一段文字

12:58

問題是這段文字的摘要是什麼

13:01

然後期待他可以輸出一個摘要

13:03

或者是你想要叫機器做

13:05

Sentiment analysis

13:06

什麼是Sentiment analysis呢

13:08

就是機器要自動判斷一個句子

13:09

是正面的還是負面的

13:11

像這樣子的應用在

13:13

假設你有做了一個產品

13:14

然後上線以後

13:15

你想要知道網友的評價

13:17

但是你又不可能一直

13:18

找人家ptt上面

13:18

把每一篇文章都讀過

13:20

所以怎麼辦

13:21

你就做一個Sentiment analysis model

13:23

看到有一篇文章裡面

13:24

有提到你的產品

13:26

然後就把這篇文章丟到

13:27

你的model裡面

13:28

去判斷這篇文章

13:29

是正面還是負面

13:31

怎麼把sentiment analysis這個問題

13:33

看成是QA的問題呢

13:35

你就給機器

13:36

你要判斷正面還負面的文章

13:38

你問題就是這個句子

13:40

是正面還是負面的

13:41

然後希望機器可以告訴你答案

13:43

所以各式各樣的NLP的問題

13:46

往往都可以看作是QA的問題

13:50

而QA的問題

13:51

就可以用Seq2Seq model來解

13:56

QA的問題怎麼用

13:57

Seq2Seq model來解呢

14:00

就是有一個Seq2Seq model輸入

14:03

就是有問題跟文章把它接在一起

14:06

輸出就是問題的答案

14:08

就結束了

14:09

你的問題加文章合起來

14:11

是一段很長的文字

14:12

答案是一段文字

14:14

Seq2Seq model只要是輸入一段文字

14:17

輸出一段文字

14:18

只要是輸入一個Sequence

14:19

輸出一個Sequence就可以解

14:21

所以你可以把QA的問題

14:23

硬是用Seq2Seq model解

14:25

叫它讀一篇文章讀一個問題

14:27

然後就直接輸出答案

14:29

所以各式各樣NLP的任務

14:32

其實都有機會使用Seq2Seq model

14:37

但是我這邊必須要強調一下

14:39

對多數NLP的任務

14:41

或對多數的語音相關的任務而言

14:45

往往為這些任務客製化模型

14:49

你會得到更好的結果

14:51

什麼問題都Seq2Seq model

14:53

就好像說你不管做什麼事情

14:56

都用瑞士刀一樣 對不對

14:57

瑞士刀可以做各式各樣的問題

14:59

砍柴也可以用瑞士刀

15:01

切菜也可以用瑞士刀

15:02

但是它不見得是一個最好用的

15:04

所以 如果你為各式各樣不同的任務

15:07

客製化各式各樣的模型

15:09

往往可以得到

15:11

比單用Seq2Seq model更好的結果

15:14

但是各個任務客製化的模型

15:16

就不是我們這一門課的重點了

15:19

如果你對人類語言處理

15:22

包括語音 包括自然語言處理

15:24

這些相關的任務有興趣的話呢

15:26

可以參考一下以下課程網頁的連結

15:29

就是去年上的深度學習

15:32

與人類語言處理

15:33

這門課的內容裡面就會教你

15:35

各式各樣的任務最好的模型

15:38

應該是什麼

15:39

舉例來說在做語音辨識

15:41

我們剛才講的是一個Seq2Seq model

15:44

輸入一段聲音訊號

15:45

直接輸出文字

15:47

今天啊 Google的 pixel4

15:50

Google官方告訴你說

15:52

Google pixel4也是用

15:54

N to N的Neural network

15:56

pixel4裡面就是

15:57

有一個Neural network

15:58

輸入聲音訊號

15:59

輸出就直接是文字

16:01

但他其實用的不是Seq2Seq model

16:05

他用的是一個叫做

16:07

RNN transducer的 model

16:09

像這些模型他就是為了

16:11

語音的某些特性所設計

16:14

這樣其實可以表現得更好

16:16

至於每一個任務

16:17

有什麼樣客製化的模型

16:19

這個就是另外一門課的主題

16:22

就不是我們今天想要探討的重點

16:26

那我剛才講了很多Seq2Seq model

16:29

在語音還有自然語言處理上的應用

16:31

其實有很多應用

16:34

你不覺得他是一個

16:35

Seq2Seq model的問題

16:37

但你都可以硬用

16:39

Seq2Seq model的問題硬解他

16:43

舉例來說文法剖析

16:45

文法剖析要做的事情就是

16:47

給機器一段文字

16:48

比如Deep learning is very powerful

16:50

機器要做的事情是產生

16:52

一個文法的剖析樹 告訴我們

16:55

deep加learning合起來

16:57

是一個名詞片語

16:59

very加powerful合起來

17:01

是一個形容詞片語

17:03

形容詞片語加is以後會變成

17:05

一個動詞片語

17:06

動詞片語加名詞片語合起來

17:08

是一個句子

17:09

那今天文法剖析要做的事情

17:12

就是產生這樣子的一個Syntactic tree

17:15

所以在文法剖析的任務裡面

17:18

假設你想要deep learning解的話

17:20

輸入是一段文字

17:22

他是一個Sequence

17:23

但輸出看起來不像是一個Sequence

17:26

輸出是一個樹狀的結構

17:29

但事實上一個樹狀的結構

17:32

可以硬是把他看作是一個Sequence

17:36

怎麼說呢

17:37

這個樹狀結構可以對應到一個

17:40

這樣子的Sequence

17:42

從這個Sequence裡面

17:44

你也可以看出

17:44

這個樹狀的結構有一個S

17:47

有一個左括號

17:48

有一個右括號

17:49

S裡面有一個noun phrase

17:51

有一個左括號跟右括號

17:53

NP裡面有一個左括號跟右括號

17:56

NP裡面有is

17:58

然後有這個形容詞片語

18:00

他有一個左括號右括號

18:02

這一個Sequence他就代表了

18:04

這一個tree 的structure

18:06

你先把tree 的structure

18:08

轉成一個Sequence以後

18:10

你就可以用Seq2Seq model硬解他

18:14

你就train一個Seq2Seq model

18:16

讀這個句子

18:17

然後直接輸入這一串文字

18:19

再把這串文字轉成一個樹狀的結構

18:22

你就可以硬是用Seq2Seq model

18:25

來做文法剖析這件事

18:28

這個概念聽起來非常的狂

18:31

但這是真的可以做得到的

18:34

你可以讀一篇文章叫做

18:35

grammar as a Foreign Language

18:38

這篇文章其實不是太新的文章

18:40

你會發現她放在arxiv上面的時間

18:42

是14年的年底

18:44

所以其實也是一個

18:46

上古神獸等級的文章

18:48

這篇文章問世的時候

18:49

那個時候Seq2Seq model還不流行

18:52

那時候Seq2Seq model

18:54

主要只有被用在翻譯上

18:57

所以這篇文章的title才會取說

18:59

grammar as a Foreign Language

19:01

他把文法剖析這件事情

19:04

當作是一個翻譯的問題

19:07

把文法當作是另外一種語言

19:10

直接套用當時人們認為

19:12

只能用在翻譯上的模型硬做

19:14

結果他得到state of the art的結果

19:17

我其實在國際會議的時候

19:19

有遇過這個第一作者Oriol Vlnyals

19:24

那個時候Seq2Seq model

19:25

還是個非常潮的東西

19:27

那個時候在我的認知裡面

19:28

我覺得這個模型

19:29

應該是挺難train的

19:30

我問他說

19:30

train Seq2Seq model有沒有什麼tips

19:35

沒想到你做個文法剖析

19:39

用Seq2Seq model

19:40

居然可以硬做到state of the art

19:41

這應該有什麼很厲害的tips吧

19:44

他說什麼沒有什麼tips

19:45

他說我連Adam都沒有用

19:47

我直接gradient descent

19:48

就train起來了

19:49

我第一次train就成功了

19:51

只是我要衝到state of the art

19:53

還是稍微調了一下參數而已

19:58

我也不知道是真的還假的啦

19:59

不過今天Seq2Seq model

20:01

真的是已經被很廣泛地

20:03

應用在各式各樣的應用上了

20:07

還有一些任務可以用seq2seq's model

20:10

舉例來說 multi-label的classification

20:14

什麼是multi-label的classification呢

20:17

這邊你要比較一下

20:18

multi-class的classification

20:20

跟multi-label的classification

20:23

multi-class的classification

20:24

跟multi-label的classification

20:26

聽起來名字很像

20:27

但他們其實是不一樣的事情

20:29

multi-class的classification意思是說

20:31

我們有不只一個class機器要做的事情

20:35

是從數個class裡面

20:37

選擇某一個class出來

20:40

但是multi-label的classification

20:42

意思是說同一個東西

20:44

它可以屬於多個 不只一個class

20:48

舉例來說 你在做文章分類的時候

20:50

可能這篇文章 屬於class 1跟3

20:53

這篇文章屬於class 3 9 17等等

20:58

你可能會說

20:59

這種multi-label classification的問題

21:01

要怎麼解呢 能不能直接把它當作一個

21:04

multi-class classification的問題來解

21:06

舉例來說

21:07

我把這些文章丟到一個class file裡面

21:11

本來class file只會輸出一個答案

21:13

輸出分數最高的那個答案

21:15

我現在就輸出分數最高的前三名

21:18

看看能不能解

21:19

multi-label的classification的問題

21:21

但這種方法可能是行不通的 為什麼

21:25

因為每一篇文章對應的class的數目

21:28

根本不一樣 有些東西 有些文章

21:32

對應的class的數目

21:33

是兩個 有的是一個 有的是三個

21:35

所以 如果你說 我直接取一個threshold

21:37

我直接取分數最高的前三名

21:40

class file output分數最高的前三名

21:42

來當作我的輸出 顯然

21:43

不一定能夠得到好的結果 那怎麼辦呢

21:47

這邊可以用seq2seq硬做 你知道嗎

21:50

輸入一篇文章 輸出就是class 就結束了

21:54

機器自己決定 它要輸出幾個class

21:57

我們說seq2seq model

21:59

就是由機器自己決定輸出幾個東西

22:02

輸出的output sequence的長度是多少

22:04

既然 你沒有辦法決定class的數目

22:06

怎麼辦 機器幫你決定 它自己決定

22:10

每篇文章 要屬於多少個class

22:14

或者是object detection

22:16

這個看起來跟seq2seq model

22:18

應該八竿子打不著的問題

22:20

它也可以用seq2seq's model硬解

22:23

object detection就是給機器一張圖片

22:26

然後它把圖片裡面的物件框出來

22:28

把它框出說 這個是斑馬 這個也是斑馬

22:32

但這種問題 可以用seq2seq's硬做

22:36

至於怎麼做 我們這邊就不細講

22:39

我在這邊放一個文獻

22:41

放一個連結給大家參考

22:43

講這麼多就是要告訴你說

22:45

seq2seq's model 它是一個

22:47

很powerful的model

22:48

它是一個很有用的model

22:50

我們現在就是要來學

22:52

怎麼做seq2seq這件事

22:56

一般的seq2seq's model

22:58

它裡面會分成兩塊 一塊是Encoder

23:04

另外一塊是Decoder

23:06

你input一個sequence有Encoder

23:09

負責處理這個sequence

23:10

再把處理好的結果丟給Decoder

23:12

由Decoder決定

23:14

它要輸出什麼樣的sequence

23:16

等一下 我們都還會再細講

23:19

Encoder跟 Decoder內部的架構

23:22

seq2seq's model的起源

23:24

其實非常的早 在14年的9月

23:28

就有一篇seq2seq's model

23:30

用在翻譯的文章 被放到Arxiv上

23:34

可以想像當時的seq2seq's model

23:37

看起來還是比較陽春的

23:39

今天講到seq2seq's model的時候

23:41

大家第一個會浮現在腦中的

23:43

可能都是我們今天的主角

23:46

也就是transformer

23:47

它有一個Encoder架構

23:49

有一個Decoder架構

23:50

它裡面有很多花花綠綠的block

23:53

等一下就會講一下

23:54

這裡面每一個花花綠綠的block

23:56

分別在做的事情是什麼

23:59

接下來 我們就來講Encoder的部分

24:03

seq2seq's model Encoder要做的事情

24:07

就是給一排向量輸出另外一排向量

24:13

給一排向量 輸出一排向量這件事情

24:16

很多模型都可以做到

24:19

可能第一個想到的是

24:20

我們剛剛講完的self-attention

24:22

其實不只self-attention

24:24

RNN CNN 其實也都能夠做到

24:27

input一排向量

24:28

output另外一個同樣長度的向量

24:32

在transformer裡面

24:34

transformer的Encoder

24:36

用的就是self-attention

24:39

這邊看起來有點複雜

24:40

我們用另外一張圖

24:42

來仔細地解釋一下

24:43

這個Encoder的架構

24:45

等一下再來跟原始的transformer的

24:48

論文裡面的圖進行比對

24:51

現在的Encoder裡面

24:53

會分成很多很多的block

24:57

每一個block都是輸入一排向量

25:00

輸出一排向量

25:01

你輸入一排向量 第一個block

25:03

第一個block輸出另外一排向量

25:05

再輸給另外一個block

25:07

到最後一個block

25:08

會輸出最終的vector sequence

25:11

每一個block 其實

25:12

並不是neural network的一層

25:14

這邊之所以不稱說

25:16

每一個block是一個layer

25:17

是因為每一個block裡面做的事情

25:19

是好幾個layer在做的事情

25:22

在transformer的Encoder裡面

25:24

每一個block做的事情

25:26

大概是這樣子的

25:27

先做一個self-attention

25:29

input一排vector以後

25:31

做self-attention

25:32

考慮整個sequence的資訊

25:34

Output另外一排vector.

25:36

接下來這一排vector

25:38

會再丟到fully connected的feed forward network裡面

25:43

再output另外一排vector

25:45

這一排vector就是block的輸出

25:48

事實上在原來的transformer裡面

25:51

它做的事情是更複雜的

25:54

實際上做的事情是這個樣子的

25:56

這是self-attention的layer

25:58

在我們剛才self-attention的時候

25:59

我們說 輸入一排vector

26:01

就輸出一排vector

26:02

這邊的每一個vector

26:04

它是考慮了 所有的input以後

26:07

所得到的結果 在transformer裡面

26:10

它加入了一個設計

26:12

是說 我們不只是輸出這個vector

26:15

我們還要把這個vector加上它的input

26:19

它要把input拉過來 直接加給輸出

26:23

得到新的output 也就是說

26:26

這邊假設這個vector叫做A

26:28

這個vector叫做B 你要把A B加起來

26:31

當作是新的輸出 這件事情

26:35

這樣子的network架構

26:36

叫做residual connection

26:39

那其實這種residual connection

26:41

在deep learning的領域用的是非常的廣泛

26:43

之後如果我們有時間的話

26:45

再來詳細介紹

26:46

為什麼要用residual connection

26:48

那你現在就先知道說 有一種connection

26:50

有一種network設計的架構

26:52

叫做residual connection

26:54

它會把input直接跟output加起來

26:58

得到新的vector

27:00

得到residual的結果以後

27:03

再把它做一件事情叫做normalization

27:07

這邊用的不是batch normalization

27:11

這邊用的叫做layer normalization

27:15

layer normalization做的事情

27:18

比bacth normalization更簡單一點

27:20

layer normalization做的事情

27:21

是這個樣子的

27:23

輸入一個向量 輸出另外一個向量

27:25

這邊不需要考慮batch

27:26

剛剛在講batch normalization的時候

27:28

需要考慮batch

27:29

那這邊這個layer normalization

27:31

不用考慮batch的資訊

27:32

輸入一個向量 輸出另外一個向量

27:35

這個layer normalization

27:37

做的事情是什麼呢

27:38

它會把輸入的這個向量

27:40

計算它的mean跟standard deviation

27:44

但是要注意一下 剛才在講

27:45

batch normalization的時候

27:47

我們是對同一個dimension

27:49

不同的feature

27:51

我們是對不同example

27:53

不同feature的同一個dimension

27:55

去計算mean跟standard deviation

27:58

但layer normalization

27:59

它是對同一個feature

28:02

同一個example裡面

28:04

不同的dimension

28:05

去計算mean跟standard deviation

28:09

計算出mean

28:10

跟standard deviation以後

28:11

就可以做一個normalize

28:13

output這邊的每一個vector

28:15

就是把原來input的vector

28:19

我發現這邊有一個bug

28:20

這個bug是什麼

28:21

這個bug就是這邊不需要 '

28:23

不好意思 記得把這個 '拿掉

28:26

這邊不需要 ' 我們把input vector

28:29

input 這個vector裡面每一個

28:31

dimension減掉m 減掉mean

28:33

再除以standard deviation以後得到x'

28:36

就是layer normalization的輸出

28:40

得到layer normalization的輸出以後

28:43

它的這個輸出 才是FC network的輸入

28:48

而FC network這邊

28:50

也有residual的架構

28:52

所以 我們會把FC network的input

28:55

跟它的output加起來 做一下residual

28:58

得到新的輸出 這個才是

29:01

transformer encoder裡面

29:03

一個block的輸出

29:05

這邊還有一件事情是漏講了

29:07

這個FC network做完residual以後

29:10

還不是結束 你要把residual的結果

29:13

再做一次layer normalization

29:16

這邊已經做過一次了

29:17

這邊還要再做一次 得到的輸出

29:19

才是residual network裡面

29:22

一個block的輸出

29:23

所以這個是挺複雜的

29:27

所以我們這邊講的 這一個圖

29:29

其實就是我們剛才講的那件事情

29:31

首先 你有self-attention

29:34

其實在input的地方

29:36

還有加上positional encoding

29:39

我們之前已經有講過

29:40

如果你只光用self-attention

29:42

你沒有未知的資訊

29:44

所以你需要加上positional的information

29:47

然後在這個圖上

29:48

有特別畫出positional的information

29:51

這一塊它這邊寫一個

29:53

Multi-Head Attention

29:54

這個就是self-attention的block

29:56

這邊有特別強調說

29:58

它是Multi-Head的self-attention

30:01

這邊有一個Add&norm是什麼意思

30:05

就是residual加layer normalization

30:09

我們剛才有說self-attention

30:11

有加上residual的connection

30:13

加下來還要過layer normalization

30:16

這邊這個圖上的Add&norm

30:18

就是residual加layer norm的意思

30:22

接下來 這邊要過

30:24

feed forward network

30:25

fc的feed forward network

30:26

以後再做一次Add&norm

30:29

再做一次residual加layer norm

30:32

才是一個block的輸出

30:34

然後這個block會重複n次

30:38

這個複雜的block

30:40

其實在之後會講到的

30:41

一個非常重要的模型BERT裡面

30:44

會再用到 BERT

30:46

它其實就是transformer的encoder

30:50

講到這邊 你心裡一定充滿了問號

30:54

就是為什麼 transformer的encoder

30:57

要這樣設計 不這樣設計行不行

30:59

行 不一定要這樣設計

31:02

這個encoder的network架構

31:04

現在設計的方式

31:05

我是按照原始的論文講給你聽的

31:08

但原始論文的設計 不代表它是最好的

31:12

最optimal的設計 舉例來說

31:14

有一篇文章叫

31:16

on layer normalization in the transformer architecture

31:19

它問的問題就是 為什麼

31:22

layer normalization是放在那個地方呢

31:24

為什麼我們是先做

31:26

residual再做layer normalization

31:29

能不能夠把layer normalization

31:37

放到每一個block的input

31:39

也就是說 你做residual以後

31:43

再做layer normalization

31:44

再加進去 你可以看到說左邊這個圖

31:47

是原始的transformer

31:49

右邊這個圖是稍微把block

31:52

更換一下順序以後的transformer

31:54

更換一下順序以後 結果是會比較好的

31:57

這就代表說

31:58

原始的transformer 的架構

32:00

並不是一個最optimal的設計

32:02

你永遠可以思考看看

32:04

有沒有更好的設計方式

32:06

再來還有一個問題就是

32:08

為什麼是layer norm 為什麼是別的

32:10

不是別的

32:11

為什麼不做batch normalization

32:13

也許這篇paper可以回答你的問題

32:16

這篇paper是Power Norm:

32:17

Rethinking Batch Normalization In Transformers

32:20

它首先告訴你說 為什麼

32:22

batch normalization不如

32:24

layer normalization

32:25

在Transformers裡面為什麼

32:26

batch normalization不如

32:28

layer normalization

32:29

接下來在說

32:30

它提出來一個power normalization

32:32

一聽就是很power的意思

32:34

都可以比layer normalization

32:36

還要performance差不多或甚至好一點