Geeks_Z の Blog Geeks_Z の Blog
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)

Geeks_Z

AI小学生
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)
  • Python

  • MLTutorials

  • 卷积神经网络

  • 循环神经网络

  • Transformer

    • Self-Attention概述
      • Sophisticated Input
      • Vector Set as Input
      • What is the output?
      • Sequence Labeling
    • Self-Attention理论推导
    • Multi-head Self-attention
    • Self-Attention-APP
    • Self-Attention拓展
    • Transformer
    • Transformer代码实现
    • Transformer模型的参数量与计算量
    • Self-Attention通过线性变换计算Q K V的原理
    • Transformer中FFNs的作用
    • Bert
    • VAE
    • Temp
  • VisionTransformer

  • 扩散模型

  • 计算机视觉

  • PTM

  • MoE

  • LoRAMoE

  • LongTailed

  • 多模态

  • 知识蒸馏

  • PEFT

  • 对比学习

  • 小样本学习

  • 迁移学习

  • 零样本学习

  • 集成学习

  • Mamba

  • PyTorch

  • CL

  • CIL

  • 小样本类增量学习FSCIL

  • UCIL

  • 多模态增量学习MMCL

  • LTCIL

  • DIL

  • 论文阅读与写作

  • 分布外检测

  • GPU

  • 深度学习调参指南

  • AINotes
  • Transformer
Geeks_Z
2023-11-03
目录

Self-Attention概述

self_v7.pptx (opens new window)

Sophisticated Input

到目前为止,Network的Input都是一个向量,然后我们的输出,可能是一个数值,这个是Regression,可能是一个类别,这是Classification。

image-20210403221220604

但假设我们遇到更复杂的问题呢,假设我们说输入是多个向量,而且这个输入的向量的数目是会改变的呢?

Vector Set as Input

  • 文字处理

假设我们今天Network的输入是一个句子,每一个句子的长度都不一样,每个句子里面词汇的数目都不一样

image-20210403221757797

如果我们把一个句子里面的每一个词汇,都描述成一个向量,那我们的Model的输入,就会是一个Vector Set,而且这个Vector Set的大小,每次都不一样,句子的长度不一样,那你的Vector Set的大小就不一样。

那怎么把一个词汇表示成一个向量,最简单的做法是One-Hot的Encoding

image-20210403222112679

你就开一个很长很长的向量,这个向量的长度跟世界上存在的词汇的数目是一样多的,每一个维度对应到一个词汇,Apple就是100,Bag就是010,Cat就是001,以此类推。

但是这样子的表示方法有一个非常严重的问题,它假设所有的词汇彼此之间都是没有关系的,从这个向量里面你看不到:Cat跟Dog都是动物所以他们比较接近,Cat跟Apple一个动物一个植物,所以他们比较不相像。这个向量里面,没有任何语义的资讯。

有另外一个方法叫做Word Embedding

image-20210403222544230

Word Embedding就是,我们会给每一个词汇一个向量,而这个向量是有语义的资讯的,一个句子就是一排长度不一的向量。

如果你把Word Embedding画出来的话,你会发现,所有的动物可能聚集成一团,所有的植物可能聚集成一团,所有的动词可能聚集成一团等等。

其他的 Vector Set 实例:

  • 声音信号

一小段25个Millisecond里面的语音讯号,为了要描述一整段的声音讯号,你会把这个Window往右移一点,通常移动的大小是10个Millisecond,所以一秒钟的声音讯号有100个向量,所以一分钟的声音讯号,就有这个100乘以60,就有6000个向量。

image-20210404161620047
  • 图

​ 一个Graph 一个图,也是一堆向量,我们知道说Social Network就是一个Graph

image-20210404161854708
  • 分子信息
image-20210404162239665

What is the output?

我们刚才已经看说输入是一堆向量,它可以是文字,可以是语音,可以是Graph,那这个时候,我们有可能有什么样的输出呢,有三种可能性

  1. 每一个向量都有一个对应的Label

    当你的模型,看到输入是四个向量的时候,它就要输出四个Label,而每一个Label,它可能是一个数值,那就是Regression的问题,如果每个Label是一个Class,那就是一个Classification的问题

image-20210404165717142
  • 举例来说 在文字处理上,假设你今天要做的是POS Tagging,POS Tagging就是词性标注,你要让机器自动决定每一个词汇它是什么样的词性,它是名词、还是动词、还是形容词等等。举例来说,你现在看到一个句子,“I saw a saw”,这并不是打错,并不是“我看一个看”,而是“我看到一个锯子”,这个第二个saw当名词用的时候,它是锯子,那所以机器要知道,第一个saw是个动词,第二个saw虽然它也是个saw,但它是名词,但是每一个输入的词汇,都要有一个对应的输出的词性,这个任务就是,输入跟输出的长度是一样的Case,这个就是属于第一个类型的输出。

  • 那如果是语音的话,你可以想想看我们作业二就是这样子的任务。虽然我们作业二,没有给大家一个完整的Sequence,我们是把每一个Vector分开给大家了,但是串起来就是一段声音讯号里面,有一串Vector,每一个Vector你都要决定,它是哪一个Phonetic,这是一个语音辨识的简化版。

  • 或者是如果是Social Network的话,就是给一个Graph,你的Model要决定每一个节点,它有什么样的特性,比如说他会不会买某一个商品,这样我们才知道说,要不要推荐某一个商品给他,所以以上就是举输入跟输出数目一样的例子

  1. 一整个Sequence,只需要输出一个Label
image-20210404165454032
  • 举例来说,如果是文字的话,我们就说Sentiment Analysis。Sentiment Analysis就是给机器看一段话,它要决定说这段话是正面的还是负面的,那你可以想像说这种应用很有用,假设你的公司开发了一个产品,这个产品上线了,你想要知道网友的评价怎么样,但是你又不可能一则一则网友的留言都去分析,那也许你就可以用这种,Sentiment Analysis的技术,让机器自动去判读说,当一则贴文里面有提到某个产品的时候,它是正面的 还是负面的,那你就可以知道你的产品,在网友心中的评价怎么样,这个是Sentiment Analysis给一整个句子,只需要一个Label,那Positive或Negative,那这个就是第二类的输出

  • 那如果是语音的例子的话呢,在作业四里面我们会做语者辨认,机器要听一段声音,然后决定他是谁讲的

  • 或者是如果是Graph的话呢,今天你可能想要给一个分子,然后要预测说这个分子,比如说它有没有毒性,或者是它的亲水性如何,那这就是给一个Graph 输出一个Label

  1. 机器要自己决定,应该要输出多少个Label

    我们不知道应该输出多少个Label,机器要自己决定,应该要输出多少个Label,可能你输入是N个向量,输出可能是N'个Label,为什么是N',机器自己决定

image-20210404170045293

​ 这种任务又叫做sequence to sequence的任务,那我们在作业五会有sequence to sequence的作业,所以这个之后我们还会再讲

  • 翻译就是sequence to sequence的任务,因为输入输出是不同的语言,它们的词汇的数目本来就不会一样多
  • 或者是语音辨识也是,真正的语音辨识也是一个sequence to sequence的任务,输入一句话,然后输出一段文字,这也是一个sequence to sequence的任务

Sequence Labeling

那这种输入跟输出数目一样多的状况又叫做Sequence Labeling,你要给Sequence里面的每一个向量,都给它一个Label,那要怎么解Sequence Labeling的问题呢

那直觉的想法就是我们就拿个Fully-Connected的Network

image-20210404172216111

然后虽然这个输入是一个Sequence,但我们就各个击破,不要管它是不是一个Sequence,把每一个向量,分别输入到Fully-Connected的Network里面,然后Fully-Connected的Network就会给我们输出,那现在看看,你要做的是Regression还是Classification,产生正确的对应的输出,就结束了。

那这么做显然有非常大的瑕疵,假设今天是,词性标记的问题,你给机器一个句子,I saw a saw,对Fully-Connected Network来说,后面这一个saw跟前面这个saw完全一模一样,它们是同一个词汇啊,既然Fully-Connected的Network输入同一个词汇,它没有理由输出不同的东西,但实际上,你期待第一个saw要输出动词,第二个saw要输出名词,但对Network来说它不可能做到,因为这两个saw 明明是一模一样的,你叫它一个要输出动词,一个要输出名词,它会非常地困惑,完全不知道要怎么处理。所以怎么办,有没有可能让Fully-Connected的Network,考虑更多的,比如说上下文的Context的资讯呢

这是有可能的,你就把前后几个向量都串起来,一起丢到Fully-Connected的Network就结束了

image-20210404172839097

在作业二里面,我们不是只看一个Frame,去判断这个Frame属于哪一个Phonetic,也就属于哪一个音标,而是看这个Frame的前面五个加后面五个,也就总共看十一个Frame,来决定它是哪一个音标

image-20210404173219186

所以我们可以给Fully-Connected的Network,一整个Window的资讯,让它可以考虑一些上下文的,跟我现在要考虑的这个向量,相邻的其他向量的资讯,但是这样子的方法还是有极限,作业二就算是给你Sequence的资讯,你考虑整个Sequence,你可能也很难再做的更好啦,作业二考虑前后五个Frame,其实就可以得到很不错的结果了,所以你要过Strong Baseline,重点并不在于考虑整个Sequence,你就不需要往那个方向想了,用助教现有给你的Data,你就可以轻易的过Strong Baseline,

但是真正的问题,如果今天我们有某一个任务,不是考虑一个Window就可以解决的,而是要考虑一整个Sequence才能够解决的话,那要怎么办呢

image-20210404173257899

那有人可能会想说这个很容易,我就把Window开大一点啊,大到可以把整个Sequence盖住就结束了

但是,今天Sequence的长度是有长有短的,我们刚才有说,我们输入给我们的Model的Sequence的长度,每次可能都不一样

如果你今天说我真的要开一个Window,把整个Sequence盖住,那你可能要统计一下你的训练资料,然后看看你的训练资料里面,最长的Sequence有多长,然后开一个Window比最长的Sequence还要长,你才有可能把整个Sequence盖住

但是你开一个这么大的Window,意味著说你的Fully-Connected的Network,它需要非常多的参数,那可能不只运算量很大,可能还容易Overfitting

所以有没有更好的方法,来考虑整个Input Sequence的资讯呢,这就要用到我们接下来要跟大家介绍的,Self-Attention这个技术。

Self-Attention的运作方式就是,Self-Attention会吃一整个Sequence的资讯。

image-20210404174805338

然后你Input几个Vector,它就输出几个Vector,比如说你这边Input一个深蓝色的Vector,这边就给你一个另外一个Vector,这边给个浅蓝色,它就给你另外一个Vector,这边输入4个Vector,它就Output 4个Vector,这4个Vector,他们都是考虑一整个Sequence以后才得到的,所以上方每一个向量,我们特别给它一个黑色的框框代表说它不是一个普通的向量。

image-20210404193106925

如此一来你这个Fully-Connected的Network,它就不是只考虑一个非常小的范围,或一个小的Window,而是考虑整个Sequence的资讯,再来决定现在应该要输出什么样的结果,这个就是Self-Attention。

Self-Attention不是只能用一次,你可以叠加很多次。

image-20210404194146583

可以Self-Attention的输出,通过Fully-Connected Network以后,再做一次Self-Attention,Fully-Connected的Network,再过一次Self-Attention,再重新考虑一次整个Input Sequence的资讯,再丢到另外一个Fully-Connected的Network,最后再得到最终的结果。

所以可以把Fully-Connected的Network,跟Self-Attention交替使用

  • Self-Attention处理整个Sequence的资讯
  • Fully-Connected的Network,专注于处理某一个位置的资讯
  • 再用Self-Attention,再把整个Sequence资讯再处理一次
  • 然后交替使用Self-Attention跟Fully-Connected

有关Self-Attention,最知名的相关的文章,就是《Attention is all you need》.那在这篇Paper里面呢,Google提出了Transformer这样的Network架构。

#Transformer
上次更新: 2025/06/25, 11:25:50
LSTM
Self-Attention理论推导

← LSTM Self-Attention理论推导→

最近更新
01
帮助信息查看
06-08
02
常用命令
06-08
03
学习资源
06-07
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Geeks_Z | MIT License
京公网安备 11010802040735号 | 京ICP备2022029989号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式