LOADING

加载过慢请开启缓存 浏览器默认开启

Okabe's LAB

RL 笔记

AI 2022/12/15

ChatGPT 告诉我们 TrajectoryEpisode 的区别

步骤

强化学习的步骤和基本的机器学习的步骤是类似的:

  • 第一步:找一个具有未知参数的函数:

    在强化学习中对应于 ActorPolicy Network,它通过从 Environment 获取 Observation,并基于此预测要执行什么 Action
    如果这里的 Actionstochastic 的,那么就会得到一个 Action 的概率分布,类似于分类问题.

  • 第二步:定义 “loss”:

    我们要使得获取的总体奖励的期望值最大。

    Total reward = Return

  • 第三步:如何进行优化:

    需要定义一个结束条件,然后让模型经历一个 Trajectory,要使得这个 Trajectory 获得的 Reward 最大。

    ActorCriticGAN 有异曲同工之妙。Actor 对应于 Generator,生成带有随机性的决策;Critic 对应于 Discriminator,判定决策的分数,
    并为 Actor 修改策略提供依据和指正。但是不同点在于,GAN 中的 Discriminator 是一个已知的可训练的 model,而强化学习中的 EnvironmentReward 更像是一个黑盒子,
    它们根本不是模型,无法用一般的梯度下降法来解决。

How to control actor

其中 代表一个权重(正数代表我们希望这种动作发生), 代表第 次动作产生的“误差”。

  • Version 0

    缺点:如果只用一个动作获得的奖励(而不看后续获得的奖励的话),那么 actor 就会偏向于只追求短期利益,
    只追求会获得奖励的动作。这显然是错误的,本质上就是一种贪心策略。

  • Version 1

    改进之后会考虑后续的奖励了,但是在很久之后获得的奖励 真的可以归功于动作 吗?显然不能!
    我们希望奖励前面有个系数,且这个系数是衰减的,越遥远的奖励和当前执行动作的相关性往往越弱。

  • Version 2

    引入折扣因子 解决上述问题。

  • Version 3

    奖励是相对的,有些环境只会产生正的反馈,那么如果不对奖励进行修正,那么一些低奖励的动作也会被鼓励。
    因此,可以对奖励减去基准 ,以对奖励进行标准化。

  • Version 3.5

    如何更好地确定系数 ?使用下面讲到的 CriticValue function

    是一个期望值,也就是一个均值(相当于你随机做一串动作获得的奖励差不多就是这个值),作为被减去的 `baseline`。 则是 `actor` 获取的实际收益。如果说这个收益大于均值,我们就认为这个动作是好的,是值得鼓励的。

  • Version 4

    是多条路径取平均的结果(因为你在训练 `Critic` 网络并且让其趋向于期望值),

    则是某一个 sample 的结果,假如说这个 sample 碰巧特别好或者碰巧特别坏,
    那么这样计算出来的差值真的能用来评估这个在状态 下的动作 的好坏吗?

    举个例子,假如说极端一点, 其实是一个极好的决策,但是后面的决策都做的烂的惨不忍睹,导致 ,这会导致
    这样就说明我们非常不鼓励 actor 去做 ,这不就事与愿违了吗?

    所以正确的做法应该是用平均减去平均,以评估 这一动作的优劣,这也就是大名鼎鼎的 A2C(Advantage Actor-Critic)

    注意到,我们上面说了 会趋向于累计奖励的期望值(乘上折扣因子),也就是说:

    故而有:

    这里 ppt 上因为之前假设 ,所以上面省略了 这一因子。

Policy-based & Value-based

On-policy vs Off-policy

Policy Gradient

代表了一个 `Episode` 获得的奖励的总和, 则代表我们的网络(`policy network`),其输入是环境的 `state` ,输出是执行各个动作的概率分布。我们希望 的期望值 越大越好。

可以由下面的式子计算,其中 代表了一个 `Trajectory`。

的期望可以通过穷举获得(但是显然不可能,所以可以用尽可能多的次数来近似)

接下来就可以用 Gradient Discent 来解决这一问题:

这里认为 无关,所以即使 不可微分也无妨。
由右边的导数公式就能算出最后的结果。

Actor-Critic

Critic

Critic 会有一个 Value function ,它的值代表了 actor 看到状态 之后所能获得的打过折扣的累计奖励的期望值。

如何训练 Value function

  • 蒙特卡罗方法

    actor 与环境交互若干次。每次都会获取奖励 ,我们期望 的值和 越接近越好,可以用 MSE 作为损失函数。

    比如下面的例子,我们就希望 越接近越好。

  • Temporal-Difference(简称 TD)

    与蒙特卡罗方法不同,TD 是每一步都进行参数更新。

    由:

    可知:

    所以此时我们只要让 尽可能接近就行。因为在 时刻获得的奖励 是已知的。

  • 蒙特卡罗方法和 TD 可能会计算出不同的

整体训练技巧

Actor 网络和 Critic 网络可以共享。

Reward Shaping

在有些环境中,大多数 action 都无法获得或者无法获得较多的 reward,而只有极少数 action 或者只有在最后才能获得较多的 reward(比如围棋)。

我们需要设计额外的 reward 帮助 agent 学习,也就是 reward shaping

为 agent 赋予 curiosity,在探索环境中获取 reward,但是必须要避免一直读无意义的新内容以获取 reward。

No reward: Learning from demonstration

在有些情况下,我们甚至连 reward 都没有,或者说我们难以设计一个好的 reward。
这时候,我们可以用一组 export 的 demonstration 来为 agent 提供“动作指导”。

这种方式有点类似于监督学习,但是我们不能只用监督学习的方式来训练 agent。使用监督学习,实际上就是让 agent 学会模仿 export 的动作,本质上是一种 cloning 的行为。
但是,我们往往无法知道 export 的 demonstration 里面哪些是不该学习的“个性化”的 action。而且,如果只学习 export 的 demonstration,那么 agent 就会无法学习到一些突发情况的解决方式,
因为 export 实在太厉害了,往往都是顺利地解决问题。

Inverse Reinforcement Learning

我们可以通过 export 的 demonstration 来学习一个 Reward Function,然后再利用这个 Reward Function 进行普通的强化学习。

我们需要定义一个 reward function,对于老师的行为和学生的行为都会去评估他们的奖励,我们希望老师的奖励应该要大于学生(学生的奖励 - 老师的奖励作为损失),并且对于学生而言,
它的目标就是学习获得最大的奖励(基于新的 reward function)。

整体的框架和思想其实和 GAN 有异曲同工之妙。

阅读全文

Explainable AI 笔记

AI 2022/12/5

Mask

用一个灰色色块遮盖图像,最后一行的图像展示了不同位置遮盖之后分类的概率,由此我们可以发现模型学习到了什么重要的特征。

比如上图中的狗,遮住脸之后模型就无法辨别了,所以模型学习到了狗的面部特征。

Saliency Map

修改某一像素的值 ,得到最终输出结果 。计算 关于 的偏导数,将数值以下方的图像展示。

一般而言,如果这个偏导数很大,说明这个像素对模型判定结果的影响很大,可以证明这个像素较为重要。

但是你不能说一个特征很重要,修改对应的像素就一定会产生很大的判定结果的变化。这是因为,以分类问题为例,假如说模型有充分的信心判定一张图片是狗的图片(判断到了很多特征,比如狗腿,狗头),
那么你修改其中一个比较重要的特征,可能还是不影响模型判断它是狗。

通过这种方式,你还可以判断你的模型是否真的学习到了正确的特征。下图是一个错误的例子,机器学习到只要判定左下角是否有文字,就可以判定是不是马,
因为所有的马的训练集都有左下角的文字。

SmoothGrad

SmoothGrad 是对 Saliency Map 的一种改进。其做法就是将原图加随机噪声生成多份,再获取对应的多份 Saliency Map,最终取平均得到 SmoothGrad

用另一个网络来聆听/可视化一个模型的隐藏层输出

阅读全文

Diffusion Model 笔记

AI 2022/12/3
阅读全文

Auto Encoder 笔记

AI 2022/12/2

Image

训练一个 EncoderDecoder

  • Encoder 将图像这样高维度的信息压缩为一个低维度的向量(Dimension Reduction)。
  • Decoder 将这个低维度的向量重新复原为原始图像。

为什么这种方法行之有效?

为什么我们能够将一个高维度的图像信息压缩为一个很低维度的向量?因为对于图像而言,绝大多数都是无意义的噪声,
就像你随机生成一个灰度图的二维矩阵,大概率得到的是一堆噪音。而真正有意义的图像其实只占极少的比例。

以 3x3 的图像举例,在这么小的图像里,可能只有两种布局是有意义的,那么 Encoder 完全可以输出一个二维的向量,
代表这两种情况。

也就是说,在图像这样的极高维空间中,真正有意义的图像只占很小的空间,我们可以用压缩的信息(类似于 Word Embedding)将它们尽可能表示出来 。

De-noising Auto-encoder

BERT 的预训练也用到了去噪自编码器的思想。

Feature Disentangle

Encoder 虽然能够将多种特征,信息提取成一个向量,但是我们无法知道向量中哪个维度对应了什么。Feature Disentangle 就是要去解决这个问题。

应用:Voice Conversion

既然我们可以用 Feature Disentangle 来了解哪些维度对应了声音的特征,哪些维度对应了声音的内容,
那我们就可以选择对应声音的特征的维度进行声音的替换(保持声音内容的维度不变,将声音特征的部分替换成新垣结衣的)。

Discrete Latent Representation

Text as Representation

尝试让 Encoder 生成摘要(既然 Decoder 能够将其还原,说明 Encoder 生成的东西代表了文章的核心和精华内容)。

CycleGAN 一样。如果不使用 Discriminator 会导致这个摘要完全不可读(EncoderDecoder 在加密通话)

Generator(what VAE does)

Compression

Anomaly Detection(异常检测)

异常检测是一个 One-class 的分类问题,数据集是极度不对称的:你有大量正常的数据,和极少数不正常的数据,甚至你不知道不正常的数据长什么样,
这时候你要怎么训练?这不是一个一般的分类问题,需要用 Auto-encoder 来进行解决。

判断是否能够重构:

阅读全文

BERT 笔记

AI 2022/12/1

https://arxiv.org/abs/1810.04805v2

BERT是2018年10月由Google AI研究院提出的一种预训练模型。BERT的全称是Bidirectional Encoder Representation from Transformers。BERT在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩: 全部两个衡量指标上全面超越人类,并且在11种不同NLP测试中创出SOTA表现,包括将GLUE基准推高至80.4% (绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进5.6%),成为NLP发展史上的里程碑式的模型成就。

芝麻街大家族。

BERT 的结构

沿用了 TransformerEncoder

BERT 是怎么学做填空题的?

BERT 的作者认为:使用两个方向(从左至右和从右至左)的单向编码器拼接而成的双向编码器,在性能、参数规模和效率等方面都不如直接使用双向编码器强大;这是 BERT 模型使用 Transformer Encoder 结构作为特征提取器,而不拼接使用两个方向的 Transformer Decoder 结构作为特征提取器的原因。

这也令 BERT 模型不能像 GPT 模型一样,继续使用标准语言模型的训练模式,因此 BERT 模型重新定义了两种模型训练方法(即:预训练任务):MLM 和 NSP。BERT用MLM(Masked Language Model,掩码语言模型)方法训练词的语义理解能力,用NSP(Next Sentence Prediction,下句预测)方法训练句子之间的理解能力,从而更好地支持下游任务。

Masking Input

https://arxiv.org/abs/1810.04805

在给 BERT 数据的时候,将若干字替换成一个特殊的 token,或者随机的值。两种方式随机选择一种。

前面提到过,BERT 即是 Encoder,会输出一个向量的序列。 将这个向量经过一个线性层 + softmax 就可以得到遮住的字的概率分布。
我们既然已经知道“台”后面的字是“湾”,也就是说我们有标签,自然就可以用交叉熵作为损失函数训练咯~

这也就是“自己出题,自己回答”。

Next Sentence Prediction

SEP 区分两个句子。

这边只看 CLS 对应的输出,经过线性变换,做一个二元分类问题(Yes/No),即判断两个句子是不是相邻的。

BERT 学到了什么?

自监督学习。

BERT 实际上学到了如何做填空题。

先预训练,然后在微调以适应不同的任务。就像一个干细胞,可以分化成任何人体细胞。

BERT 本身是无监督的(自己出填空题,自己学着做),但是其下游任务(downstream task)可能是监督学习的。比如语句情感分类,利用之前学习填空题 pretrain
过的 BERT 模型,将其输出经过另一个网络(这个网络是需要投喂数据集监督学习的),最终输出情感分类。

pretrain 过的 BERT 会比随机参数的好。All you need is fine-tuning!

对于词性识别,流程也是类似的。生成的每个向量都通过一个待训练网络,剩下的和上面的例子一样。

判断假设和推断是否矛盾:

输入文章和问题,返回两个整数(答案的起止位置):

和自注意力机制类似,橙色部分类似于一个 Query,去查询 document 中的每一个 Key,最终经过 softmax 的到最大概率的作为 start。
这边 s = 2。

还有一个蓝色的向量需要学习,对应于 end。和 start 类似,这边求出 e = 3。于是我们得出了答案的范围。

注意橙色和蓝色向量都是要训练的对象。

Training BERT is challenging

训练 BERT 需要极大的数据量和极强的硬件。

预训练 Seq2Seq

类似的,也可以预训练 Decoder。将一些句子破坏掉(原始句子作为标签),进行 self-supervise

为什么 BERT 能够工作?

类似于 word2vecBERT 能够将每个词都对应到一个向量(表征某个词的含义(meaning))。向量两两之间的距离代表了两个词的意思的接近程度。

但是不同的是,BERT 在预训练的时候会学习到上下文信息,同一个字在不同的上下文中,其含义不同,BERT 输出的向量也不同。所以 BERT 输出的
Embedding 是动态的,会根据上下文的不同产生变化。

苹果 为例,“吃苹果”的“苹果”是一种水果,而“苹果手机”的“苹果”则是一个公司品牌名。

通过计算这两个苹果经过 BERT 输出的 Embeddingcosine similarity,可以得到下图:

令人震惊的 BERT

DNA classification

用语言资料预训练的 BERT 甚至可以提升 DNA 分类的准确度!

因为预训练用的是英语,所以这边需要将碱基对对应到一个随机词汇上,然后再对 DNA 分类问题进行 Fine-Tune。即使是这样八竿子打不着的映射,
居然也能学出更好的效果——难道 DNA 序列结构和某种语言语法结构有关?

Multi-lingual BERT

用多种语言的资料训练的 BERT 能够学习到语言之间的联系,在没有学习中文问答资料的情况下,输入中文问题居然也可以达到惊人的准确率。

似乎 BERT 在学到 Rabbit 的向量距离很近的同时,也没有忘记语言类型信息。也就是在回答中文问题的时候,它不会将 替换成 Rabbit
而是都用中文来回答。

或许是因为,两个词汇虽然很接近,但是在它们所处的极高维空间内,它们根本不在同一个维度,只是距离相近,仅此而已。

如果将不同语言的所有词汇的 Embedding 求均值,将会发现这些语言在高维空间中散落在不同的区域。假如说你求出 中文English 的这种距离,
然后将一个英文 Embedding 加上这个距离,你将会得到中文的 Embedding

GPT

预训练

结构类似 TransformerDecoder(使用 Masked self-attention)。

GPTBERT 不一样的地方在于 GPT 是在是太大了,以至于我们难以 Fine-tune 它。

In-context learning

这里不会去利用梯度下降更新 GPT 的参数。

Few-shot/One-shot/Zero-shot Learning

提供任务描述和例子,学会举一反三。

  • Few-shot:

  • One-shot:

  • Zero-shot:

效果

阅读全文

GAN 笔记

AI 2022/11/23

物竞天择,万物一同进化,一同内卷。GeneratorDiscriminate 一同训练和进化,此乃 GAN 的核心。

为什么我们需要输出一个分布(distribution)

对于吃豆人这样的游戏,假如说我们要用一帧游戏画面去预测下一帧游戏画面,如果我们使用最传统的网络,接受一个确定的输入,然后输出一个
确定的结果,那么可能会出现如下的情况:

这是因为对于训练集中的不同数据,可能存在一帧画面完全相同,但是下一帧的画面相反(一个怪物向左,一个怪物向右)。模型为了获得最低的损失,
会倾向于输出既向左又向右的叠加态。

本质上这是因为我们输出的是一个固定的值/矩阵,而不是一个分布。假设我们输出的是一个分布,那么我们可以在输入的时候也加上一个分布 z(见第一张图),
来对应到输出的分布y。这样我们就可以用不同的输入分布来对应各种可能的情况:怪物向左,向右,向上,向下,死亡,存活。

本质上,这样的 Generator 适用于需要创造力的场景。

Unconditional Generation

这里输入的分布可以是已知的,简单的分布,比如 Normal Distribution,网络会想办法生成一个复杂的分布。这个分布也就是一个高维的向量,
经过整理之后就会变成输出的图像。

我们还需要一个 Discriminator。它会接受 Generator 输出的图片作为输入,并且输出一个数值表示该图片是否是真实的二次元图片。

训练步骤

  1. 初始化 GeneratorDiscriminator
  2. 固定 Generator 的网络参数,训练 Discriminator,让它学会 “打假”
    1. 根据输入分布随机采样一些向量,经过 Generator 得到一些生成图片,这些图像是 虚假的二次元图像 标记为 0
    2. 从二次元图像数据集中采样一些图片,作为 真实的二次元图片,标记为 1
    3. 根据这些打好标签的图片,训练 Discriminator,本质上就是一个分类问题,训练一个 classifier
  3. 固定 Discriminator 的网络参数,训练 Generator,让它学会 “造假”

    Generator 的网络和 Discriminator 的网络拼接,但是固定后者的参数。两者之间会有一个 hidden layer,将其整理就是生成的图片。
    1. 根据输入分布生成向量,传入 Generator,生成图片,由 Discriminator 生成一个分数(目标是这个分数越大越好)。
    2. 根据 Discriminator 的打分,训练 Generator

GAN 的学习目标是什么?

我们希望 GAN 生成的分布 PG和真实的数据分布 Pdata 越接近越好(divergence 最小,即两种分布之间的某种距离)

如何计算 Divergence

Sampling is good enough.

  • 从数据集 sample 真实的图像,即对 Pdatasampling
  • 根据输入的分布 sample 出一些向量,通过 Generator 得到图像,即对 PGsampling

在只知道 sample 的情况如何估算 divergence

下图是对于 Discriminator 的训练目标,蓝色星星代表真实数据的分布,橙色的星星代表生出数据的分布。我们的目标是让 Discriminator 能够区分两种分布。

目标函数的左半部分代表我们希望由 Discriminator 生成的真实数据的期望分数应该越高越好,而生成数据的分数应该越低越好。损失函数可以是另外的形式,
这里是为了和二分类问题扯上关系。目标函数其实就是交叉熵乘上符号,也就是说我们要最大化目标函数,等价于最小化交叉熵。这与二分类问题的损失函数定义是类似的。

也就是我们在训练一个 Classifier

JS divergence 不合适?

对于高维空间的两个分布(想象二维情况下两个直线),重叠部分几乎可以忽略不计。即使有重叠,如果采样数量不够,在 Discriminator 看来,两个分布依旧没有重叠。

JS divergence 不合适的理由在于,对于两个无重叠的分布,JS divergence会变为一个常数:log2,这将导致梯度消失,无法从 JS divergence 中获取两个分布的距离信息。
因为无论训练出来的分布和真实分布有多近,如果两者没有重叠的话,JS 散度永远是常数,也就无法由此来更新网络参数了。

(有关 JS divergence 可以看这篇文章:GAN:两者分布不重合JS散度为log2的数学证明

Wasserstein distance

可以通俗的认为将一个分布变为另一个分布所需要的代价。分布就像是一堆堆土堆,然后用挖土机将一堆土堆变为另一堆土堆的模样的消耗,即为 Wasserstein distance。这本身也是一个优化问题,
穷举所有的 moving plan,看哪一个可以获得最短的平均距离,这个最短平均距离作为 Wasserstein distance

解决了 JS divergence 的缺陷:

WGAN

计算 Wasserstein distance,D 必须是平滑的函数,避免值剧烈变化,导致生成的分布和真实分布轻微偏离就产生无穷大的值。

WGAN 这篇论文其实也没有找这样的函数(比较困难),而是将 Wasserstein distance 限制在 [-c, c] 之间(c 为常数)。

GAN 存在的困难之处

  • 难以训练:

    GAN 是训练两个模型,一旦一个模型的训练出了问题,另一个模型也会出问题。也就是两个人一直在卷,卷到一半对手开摆,你也开摆!

    各种训练的 tips:

  • 难以做序列生成:

    Generator 的参数变化会导致输出向量的微小变化,但是由于输出的是一个概率分布,概率分布的微小变化不会显著影响取到最大值的那一维度,也就是微小变化可能不会导致输出词汇的变化。
    导致 Discriminator 无法进一步学习(梯度消失!)。

  • Mode Collapse

    Generator 发现生成某一个特征的图片可以永远骗过 Discriminator,于是它就倾向于一直输出类似的图片。

  • Mode Dropping

    多样性的丧失。

GAN 评估

  • Inception score

    问题在于,对于hw,判定图片质量的方式只是检测识别到了多少张人脸,而非检测红发,黑发,蓝发等多样性特征。

  • FID

    取出 hidden layer 的向量而非输出的类别向量,计算分布的 FID

Conditional Generator

我们无法使用之前无条件生成的架构,因为 Discriminator 只是在学习如何打假,而没有学习生成的图片是否满足给定的条件。

需要如下图所示的成对训练资料:

不同于之前无条件的情况进行“打假”,将所有训练集的数据都标注为真,生成的都标注为假,这里还需要选中一些训练集的数据(不满足给定条件),标注他们为假。

CycleGAN:GAN 与无监督学习

对于这种风格变换的类型,我们很难找到成对的训练资料。但是我们可以用 GAN 处理这种类型的问题。

和原先 GAN 训练方式类似,之前是从高斯分布中 sample 一个向量出来,现在则是从 Domain X 中 sample 一张图片。然后将这张图片输入 Generator,
然后获得生成的风格变换的图片。这些图片和真实的图片作为训练集来训练 Discriminator,和之前的训练方式也是类似的。

但是这样可能会产生模型忽略输入而产生不相关图片的现象(反正输出二次元图片就能高分,那我干嘛要管输入的三次元图像)。

CycleGAN 通过两个 Generator 解决了这样的问题:一个 Generator 生成目标图像(即风格变换后的图像),另一个负责将这个目标图像变回原图。

通俗来讲,就是第一个 Generator 负责将三次元人物变成二次元纸片人;而第二个 Generator 负责将这个生成的二次元纸片人恢复成原来的三次元人物。

这样就构成了循环,也就是 CycleGAN 名字的由来。这样的循环的好处在于,假如说第一个 Generator 无视输入的原图的特征,而生成一些毫不相关的二次元图像,
那么第二个 Generator 就很难将其转变回原来的图像(因为丢失了很多原图的语义信息)。这样就会产生较大的 loss,对这种行为进行惩罚。

虽然说 Gx->y 和 Gy->x可能串通一气,前者和后者都将图片镜像翻转,这样后者依旧能恢复出原始输入图像。但是一般实际训练的时候,第一个 Generator 就会生成和原图比较像的图片了(不会做复杂的变换),
所以 CycleGAN 在实际应用中很少会发生上述的情况。

你也可以训练一个双向的 CycleGAN:

阅读全文

Self Attention 笔记

AI 2022/11/20
  • 自注意力机制的矩阵运算:

    qquerykkeyvvalue

    α 即为注意力分数,经过 softmax 进行归一化得到 α',并与 v 相乘得到最终的 b

  • 为什么我们需要多头注意力机制(Multi-head Self-attention)?

    Self-attention 实际上就是去找和 q 相关的 k,但是相关性是一个比较复杂的东西,我们往往需要多个维度对相关性进行描述,
    即使用多个 q 负责不同的相关性。

    将多个头获取的 bi 进行 concat

  • 有什么不足?缺少位置信息:

    解决方案:positional vector,每一个位置都对应一个不同的位置向量 ei

  • 我们真的需要读一整句话吗?

    对于像语音识别这样的序列而言,我们会把每 10ms 的语音数据作为一个向量,那么一句话就会对应相当可观的序列长度 L。而我们产生的注意力矩阵的规模和 L 的二次成正比,
    如果 L 非常大的话,注意力矩阵也会相当大。所以我们实际上不会读一整个句子,而是使用所谓 Truncated Self-attention 去读一个窗口(其大小可以自行指定)

  • Self-attention vs CNN

    图片亦可作为 set of vector,所以 Self-attention 亦可用于图像领域。CNN 的卷积核代表了一片感受野,其大小是受限的,而 Self-attention 则关注了整张图片的信息。

    CNN is simplified self-attention(self-attention that only attends in a receptive field).

    或者你也可以说:

    Self-attention is the complex version of CNN(CNN with learnable receptive field).

  • Self-attention vs RNN

    RNN 只能获取左边已输入的序列的信息吗?不,可以用双向 RNN,即 Bidirectional RNN

    Self-attention 可以并行处理(矩阵运算,GPU 优化),并且可以轻易获取非常远的上下文信息。

  • 在图中使用自注意力机制:

阅读全文

Transformer 笔记——Attention Is All You Need

AI 2022/11/20

Core——注意力计算公式

结构

Encoder

  • Add & Norm

    利用了 Residual 的思想,于此同时加上一个 Layer Normalization

    (关于 Layer NormBatch Norm 的区别,请看 NLP中 batch normalization与 layer normalization

    多头注意力模块 + Add & Norm 构成了图中深蓝色的模块,这个模块将会再被用于图中最右的结构。

Decoder

Decoder 分为两种:ATNAT

  • AT

    接受 Encoder 的输出,以及自己之前的输出作为输入,反复生成下一个字。

    以语音识别为例,输出是一段中文,需要有一个特殊 token 代表开始和结束。

  • NAT

    不同于 AT 会一直迭代生成直到输出一个 ENDNAT 是给若干个 START 然后并行生成若干个字符。

Encoder 和 Decoder 结构对比

  • Decoder 的多头注意力机制模块是 masked 的:

    未被掩码的 Self-attention 会观察整个上下文,但是对于 decoder 而言不能观察后文(因为生成一个字的时候,后面的字还未生成,只能获取前文的上下文信息)。
    比如已经生成“机器”的时候,即将生成“学”,模型只能从“机器”这一前文观察到上下文信息,因为此时“习”还没有被生成。

    本质上就是输入到 encoder 的序列是已知的,可以一窥全文,而 decoder 则是循环生成序列,还未生成,何来后文?

Cross Attention

decoder 的向量的 qencoder 的向量的 kv 共同计算 attention score,即为 Cross Attention

Train

  • Teacher Forcing

    在训练 decoder 的时候避免 Error propogation(一步错步步错),投喂 Ground truth

    decoder 输出的是一个概率分布,因而使用 cross entropy 作为损失函数。

    存在的问题:训练的时候“偷看”了正确结果,但是测试的时候怎么办呢?存在 mismatch。

  • Tips

    • Copy Mechanism

      应对难以生成或者无需凭空生成(比如生成摘要)序列的情况:

    • Guided Attention

      对 Attention 的训练加以限制,比如语音识别的 Attention 必须从左到右:

    • Beam Search

      是对 Greedy Search 的一个改进算法。相对 Greedy Search 扩大了搜索空间,但远远不及穷举搜索指数级的搜索空间,是二者的一个折中方案。

    • 对于语音生成,在测试的时候添加噪音反而会有好的结果:可能是语音的 ground truth 不是一个绝对的东西,比如”你好“可能对应男生,女生,中性等多种音调的声音。

    • 无法 optimize 的函数(不可微分) 可以考虑用 RL 硬 train?

    • 上面提到的 mismatch 问题可以用 Schedule Sampling 解决:在 Teacher Forcing 的时候投喂一些错误的 ground truth,比如机气学习

阅读全文
1 ... 4
avatar
Zihong Lin

What I can’t create, I don’t understand.