Skip to content

Commit

Permalink
sync Terminology (d2l-ai#977)
Browse files Browse the repository at this point in the history
* Terminology

* Terminology

* Terminology

* Terminology

* Terminology
  • Loading branch information
xiaotinghe committed Oct 7, 2021
1 parent a9d4e13 commit 113f75a
Show file tree
Hide file tree
Showing 102 changed files with 628 additions and 626 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

虽然纸质书第一版已经出版,但深度学习领域依然在迅速发展。为了得到来自更广泛的英文开源社区的帮助,从而提升本书质量,本书的第二版正在用英文写。英文版正不断被搬回中文版中。

目前,英文版已超过160节(中文版共96节),例如增加了理论背景(如优化收敛分析)、硬件设计(如参数服务器)、全新篇章(如注意力机制、推荐系统、深度学习的数学、生成对抗网络)、应用种类(如自然语言推理)、模型种类(如Transformer、BERT)等,并优化重组了大量章节(如将自然语言处理篇章按从预训练表征、到模型设计、再到下游应用重构)。
目前,英文版已超过160节(中文版共96节),例如增加了理论背景(如优化收敛分析)、硬件设计(如参数服务器)、全新篇章(如注意力机制、推荐系统、深度学习的数学、生成对抗网络)、应用种类(如自然语言推断)、模型种类(如Transformer、BERT)等,并优化重组了大量章节(如将自然语言处理篇章按从预训练表征、到模型设计、再到下游应用重构)。

欢迎关注本书[第二版的英文开源项目](https://github.com/d2l-ai/d2l-en)

Expand Down
2 changes: 1 addition & 1 deletion TERMINOLOGY.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@

广播,broadcast

归一化,normalization
规范化,normalization

过拟合,overfitting

Expand Down
2 changes: 1 addition & 1 deletion chapter_attention-mechanisms/attention-cues.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

感谢你对本书的关注,因为注意力是一种稀缺的资源:此刻你正在阅读这本书而忽略了其他的书。因此,你的注意力是用机会成本(与金钱类似)来支付的。为了确保你现在投入的注意力是值得的,我们尽全力(全部的注意力)创作一本好书。

自经济学研究稀缺资源分配以来,我们正处在注意力经济时代,即人类的注意力被视为可以交换的、有限的、有价值的且稀缺的商品。许多商业模式也被开发出来去利用这个商业模式。在音乐或视频流媒体服务上,我们要么消耗注意力在广告上,要么付钱来隐藏广告。为了在网络游戏世界的成长,我们要么消耗注意力在战斗中,从而帮助吸引新的玩家,要么付钱立即变得强大。没什么是免费的。
自经济学研究稀缺资源分配以来,我们正处在注意力经济时代,即人类的注意力被视为可以交换的、有限的、有价值的且稀缺的商品。许多商业模式也被开发出来去利用这一点。在音乐或视频流媒体服务上,我们要么消耗注意力在广告上,要么付钱来隐藏广告。为了在网络游戏世界的成长,我们要么消耗注意力在战斗中,从而帮助吸引新的玩家,要么付钱立即变得强大。没什么是免费的。

总而言之,注意力在我们的环境中是稀缺的,而环境中的信息却并不少。在检查视觉场景时,我们的视觉神经系统大约每秒收到$10^8$位的信息,这远远超过了大脑能够完全处理的水平。幸运的是,我们的祖先已经从经验(也称为数据)中认识到*并非感官的所有输入都是一样的*。在整个人类历史中,这种只将注意力引向感兴趣的一小部分信息的能力,使我们的大脑能够更明智地分配资源来生存、成长和社交,例如发现天敌、找寻食物和伴侣。

Expand Down
24 changes: 12 additions & 12 deletions chapter_attention-mechanisms/attention-scoring-functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ import tensorflow as tf
```


## [**遮蔽softmax操作**]
## [**掩蔽softmax操作**]

正如上面提到的,softmax运算用于输出一个概率分布作为注意力权重。在某些情况下,并非所有的值都应该被纳入到注意力汇聚中。例如,为了在 :numref:`sec_machine_translation`中高效处理小批量数据集,某些文本序列被填充了没有意义的特殊词元。为了仅将有意义的词元作为值去获取注意力汇聚,可以指定一个有效序列长度(即词元的个数),以便在计算softmax时过滤掉超出指定范围的位置。通过这种方式,我们可以在下面的`masked_softmax`函数中实现这样的*遮蔽softmax操作*(masked softmax operation),其中任何超出有效长度的位置都被遮蔽并置为0
正如上面提到的,softmax操作用于输出一个概率分布作为注意力权重。在某些情况下,并非所有的值都应该被纳入到注意力汇聚中。例如,为了在 :numref:`sec_machine_translation`中高效处理小批量数据集,某些文本序列被填充了没有意义的特殊词元。为了仅将有意义的词元作为值去获取注意力汇聚,可以指定一个有效序列长度(即词元的个数),以便在计算softmax时过滤掉超出指定范围的位置。通过这种方式,我们可以在下面的`masked_softmax`函数中实现这样的*掩蔽softmax操作*(masked softmax operation),其中任何超出有效长度的位置都被掩蔽并置为0

```{.python .input}
#@save
def masked_softmax(X, valid_lens):
"""通过在最后一个轴上遮蔽元素来执行 softmax 操作"""
"""通过在最后一个轴上掩蔽元素来执行 softmax 操作"""
# `X`: 3D张量, `valid_lens`: 1D或2D 张量
if valid_lens is None:
return npx.softmax(X)
Expand All @@ -60,7 +60,7 @@ def masked_softmax(X, valid_lens):
valid_lens = valid_lens.repeat(shape[1])
else:
valid_lens = valid_lens.reshape(-1)
# 在最后的轴上,被遮蔽的元素使用一个非常大的负值替换,从而其 softmax (指数)输出为 0
# 在最后的轴上,被掩蔽的元素使用一个非常大的负值替换,从而其 softmax (指数)输出为 0
X = npx.sequence_mask(X.reshape(-1, shape[-1]), valid_lens, True,
value=-1e6, axis=1)
return npx.softmax(X).reshape(shape)
Expand All @@ -70,7 +70,7 @@ def masked_softmax(X, valid_lens):
#@tab pytorch
#@save
def masked_softmax(X, valid_lens):
"""通过在最后一个轴上遮蔽元素来执行 softmax 操作"""
"""通过在最后一个轴上掩蔽元素来执行 softmax 操作"""
# `X`: 3D张量, `valid_lens`: 1D或2D 张量
if valid_lens is None:
return nn.functional.softmax(X, dim=-1)
Expand All @@ -80,7 +80,7 @@ def masked_softmax(X, valid_lens):
valid_lens = torch.repeat_interleave(valid_lens, shape[1])
else:
valid_lens = valid_lens.reshape(-1)
# 在最后的轴上,被遮蔽的元素使用一个非常大的负值替换,从而其 softmax (指数)输出为 0
# 在最后的轴上,被掩蔽的元素使用一个非常大的负值替换,从而其 softmax (指数)输出为 0
X = d2l.sequence_mask(X.reshape(-1, shape[-1]), valid_lens,
value=-1e6)
return nn.functional.softmax(X.reshape(shape), dim=-1)
Expand All @@ -90,7 +90,7 @@ def masked_softmax(X, valid_lens):
#@tab tensorflow
#@save
def masked_softmax(X, valid_lens):
"""通过在最后一个轴上遮蔽元素来执行 softmax 操作"""
"""通过在最后一个轴上掩蔽元素来执行 softmax 操作"""
# `X`: 3D张量, `valid_lens`: 1D或2D 张量
if valid_lens is None:
return tf.nn.softmax(X, axis=-1)
Expand All @@ -101,12 +101,12 @@ def masked_softmax(X, valid_lens):
else:
valid_lens = tf.reshape(valid_lens, shape=-1)
# 在最后的轴上,被遮蔽的元素使用一个非常大的负值替换,从而其 softmax (指数)输出为 0
# 在最后的轴上,被掩蔽的元素使用一个非常大的负值替换,从而其 softmax (指数)输出为 0
X = d2l.sequence_mask(tf.reshape(X, shape=(-1, shape[-1])), valid_lens, value=-1e6)
return tf.nn.softmax(tf.reshape(X, shape=shape), axis=-1)
```

为了[**演示此函数是如何工作**]的,考虑由两个$2 \times 4$矩阵表示的样本,这两个样本的有效长度分别为$2$和$3$。经过遮蔽softmax操作,超出有效长度的值都被遮蔽为0
为了[**演示此函数是如何工作**]的,考虑由两个$2 \times 4$矩阵表示的样本,这两个样本的有效长度分别为$2$和$3$。经过掩蔽softmax操作,超出有效长度的值都被掩蔽为0

```{.python .input}
masked_softmax(np.random.uniform(size=(2, 2, 4)), d2l.tensor([2, 3]))
Expand Down Expand Up @@ -142,7 +142,7 @@ masked_softmax(tf.random.uniform(shape=(2, 2, 4)), tf.constant([2, 3]))
$$a(\mathbf q, \mathbf k) = \mathbf w_v^\top \text{tanh}(\mathbf W_q\mathbf q + \mathbf W_k \mathbf k) \in \mathbb{R},$$
:eqlabel:`eq_additive-attn`

其中可学习的参数是$\mathbf W_q\in\mathbb R^{h\times q}$、$\mathbf W_k\in\mathbb R^{h\times k}$和$\mathbf w_v\in\mathbb R^{h}$。如 :eqref:`eq_additive-attn`所示,将查询和键连接起来后输入到一个多层感知机(MLP)中,感知机包含一个隐藏层,其隐藏单元数是一个超参数$h$。通过使用$\tanh$作为激活函数,并且禁用偏置项,我们将在下面实现加性注意力。
其中可学习的参数是$\mathbf W_q\in\mathbb R^{h\times q}$、$\mathbf W_k\in\mathbb R^{h\times k}$和$\mathbf w_v\in\mathbb R^{h}$。如 :eqref:`eq_additive-attn`所示,将查询和键连结起来后输入到一个多层感知机(MLP)中,感知机包含一个隐藏层,其隐藏单元数是一个超参数$h$。通过使用$\tanh$作为激活函数,并且禁用偏置项,我们将在下面实现加性注意力。

```{.python .input}
#@save
Expand Down Expand Up @@ -281,7 +281,7 @@ d2l.show_heatmaps(d2l.reshape(attention.attention_weights, (1, 1, 2, 10)),

## [**缩放点积注意力**]

使用点积可以得到计算效率更高的评分函数。但是点积操作要求查询和键具有相同的长度$d$。假设查询和键的所有元素都是独立的随机变量,并且都满足均值为$0$和方差为$1$。那么两个向量的点积的均值为$0$,方差为$d$。为确保无论向量长度如何,点积的方差在不考虑向量长度的情况下仍然是$1$,则可以使用*缩放点积注意力*(scaled dot-product attention)评分函数:
使用点积可以得到计算效率更高的评分函数。但是点积操作要求查询和键具有相同的长度$d$。假设查询和键的所有元素都是独立的随机变量,并且都满足零均值和单位方差。那么两个向量的点积的均值为$0$,方差为$d$。为确保无论向量长度如何,点积的方差在不考虑向量长度的情况下仍然是$1$,则可以使用*缩放点积注意力*(scaled dot-product attention)评分函数:

$$a(\mathbf q, \mathbf k) = \mathbf{q}^\top \mathbf{k} /\sqrt{d}$$

Expand All @@ -290,7 +290,7 @@ $$a(\mathbf q, \mathbf k) = \mathbf{q}^\top \mathbf{k} /\sqrt{d}$$
$$ \mathrm{softmax}\left(\frac{\mathbf Q \mathbf K^\top }{\sqrt{d}}\right) \mathbf V \in \mathbb{R}^{n\times v}.$$
:eqlabel:`eq_softmax_QK_V`

在下面的缩放点积注意力的实现中,我们使用了dropout进行模型正则化
在下面的缩放点积注意力的实现中,我们使用了暂退法进行模型正则化

```{.python .input}
#@save
Expand Down
12 changes: 6 additions & 6 deletions chapter_attention-mechanisms/bahdanau-attention.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
# Bahdanau 注意力
:label:`sec_seq2seq_attention`

我们在 :numref:`sec_seq2seq`中探讨了机器翻译问题,在那里我们设计了一个基于两个循环神经网络的编码器-解码器结构,用于序列到序列的学习。具体来说,循环神经网络编码器将可变长度序列转换为固定形状的上下文变量,然后循环神经网络解码器根据生成的词元和上下文变量按词元生成输出(目标)序列词元。但是,即使并非所有输入(源)词元都对解码某个词元都有用,但在每个解码步骤中仍使用编码整个输入序列的*相同*上下文变量。
我们在 :numref:`sec_seq2seq`中探讨了机器翻译问题,在那里我们设计了一个基于两个循环神经网络的编码器-解码器架构,用于序列到序列学习。具体来说,循环神经网络编码器将可变长度序列转换为固定形状的上下文变量,然后循环神经网络解码器根据生成的词元和上下文变量按词元生成输出(目标)序列词元。但是,即使并非所有输入(源)词元都对解码某个词元都有用,但在每个解码步骤中仍使用编码整个输入序列的*相同*上下文变量。

在为给定文本序列生成手写的挑战中,格雷夫斯设计了一种可微注意力模型,将文本字符与更长的笔迹对齐,其中对齐方式仅向一个方向移动 :cite:`Graves.2013`。受学习对齐想法的启发,Bahdanau等人提出了一个没有严格的单向对齐限制 :cite:`Bahdanau.Cho.Bengio.2014`的可微注意力模型。在预测词元时,如果不是所有输入词元都相关,模型将仅对齐(或参与)输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现的。

## 模型

在下面描述Bahdanau注意力对循环神经网络编码器的关注时,我们将遵循 :numref:`sec_seq2seq`中的相同符号表达。新的基于注意力的模型与 :numref:`sec_seq2seq`中的模型相同,只不过 :eqref:`eq_seq2seq_s_t`中的上下文变量$\mathbf{c}$在任何解码时间步骤$t'$都会被$\mathbf{c}_{t'}$替换。假设输入序列中有$T$个词元,解码时间步长$t'$的上下文变量是注意力集中的输出:
在下面描述Bahdanau注意力对循环神经网络编码器的关注时,我们将遵循 :numref:`sec_seq2seq`中的相同符号表达。新的基于注意力的模型与 :numref:`sec_seq2seq`中的模型相同,只不过 :eqref:`eq_seq2seq_s_t`中的上下文变量$\mathbf{c}$在任何解码时间步$t'$都会被$\mathbf{c}_{t'}$替换。假设输入序列中有$T$个词元,解码时间步$t'$的上下文变量是注意力集中的输出:

$$\mathbf{c}_{t'} = \sum_{t=1}^T \alpha(\mathbf{s}_{t' - 1}, \mathbf{h}_t) \mathbf{h}_t,$$

其中,时间步$t' - 1$时的解码器隐藏状态$\mathbf{s}_{t' - 1}$是查询,编码器隐藏状态$\mathbf{h}_t$既是键,也是值,注意力权重$\alpha$是使用 :eqref:`eq_attn-scoring-alpha`所定义的加性注意力打分函数计算的。
其中,时间步$t' - 1$时的解码器隐状态$\mathbf{s}_{t' - 1}$是查询,编码器隐状态$\mathbf{h}_t$既是键,也是值,注意力权重$\alpha$是使用 :eqref:`eq_attn-scoring-alpha`所定义的加性注意力打分函数计算的。

与 :numref:`fig_seq2seq_details`中的循环神经网络编码器-解码器结构略有不同, :numref:`fig_s2s_attention_details`描述了Bahdanau注意力的结构
与 :numref:`fig_seq2seq_details`中的循环神经网络编码器-解码器架构略有不同, :numref:`fig_s2s_attention_details`描述了Bahdanau注意力的架构

![在一个带有Bahdanau注意力的循环神经网络编码器-解码器模型中的层。](../img/seq2seq-attention-details.svg)
:label:`fig_s2s_attention_details`
Expand Down Expand Up @@ -55,7 +55,7 @@ class AttentionDecoder(d2l.Decoder):
raise NotImplementedError
```

接下来,让我们在接下来的`Seq2SeqAttentionDecoder`类中[**实现带有Bahdanau注意力的循环神经网络解码器**]。初始化解码器的状态(1)编码器在所有时间步的最终层隐藏状态(作为注意力的键和值);(2)最后一个时间步的编码器全层隐藏状态(初始化解码器的隐藏状态);(3)编码器有效长度(排除在注意力池中填充词元)。在每个解码时间步骤中,解码器上一个时间步的最终层隐藏状态将用作关注的查询。因此,注意力输出和输入嵌入都连接为循环神经网络解码器的输入
接下来,让我们在接下来的`Seq2SeqAttentionDecoder`类中[**实现带有Bahdanau注意力的循环神经网络解码器**]。初始化解码器的状态(1)编码器在所有时间步的最终层隐状态(作为注意力的键和值);(2)最后一个时间步的编码器全层隐状态(初始化解码器的隐状态);(3)编码器有效长度(排除在注意力池中填充词元)。在每个解码时间步骤中,解码器上一个时间步的最终层隐状态将用作关注的查询。因此,注意力输出和输入嵌入都连结为循环神经网络解码器的输入

```{.python .input}
class Seq2SeqAttentionDecoder(AttentionDecoder):
Expand Down Expand Up @@ -328,7 +328,7 @@ d2l.show_heatmaps(attention_weights[:, :, :, :len(engs[-1].split()) + 1],
## 小结

* 在预测词元时,如果不是所有输入词元都是相关的,那么具有Bahdanau注意力的循环神经网络编码器-解码器会有选择地统计输入序列的不同部分。这是通过将上下文变量视为加性注意力池化的输出来实现的。
* 在循环神经网络编码器-解码器中,Bahdanau注意力将上一个时间步的解码器隐藏状态视为查询,在所有时间步的编码器隐藏状态同时视为键和值
* 在循环神经网络编码器-解码器中,Bahdanau注意力将上一个时间步的解码器隐状态视为查询,在所有时间步的编码器隐状态同时视为键和值

## 练习

Expand Down
4 changes: 2 additions & 2 deletions chapter_attention-mechanisms/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@

灵长类动物的视觉系统中的视神经接受了大量的感官输入。这些感官输入远远超过了大脑能够完全处理的程度。幸运的是,并非所有刺激的影响都是相等的。意识的聚集和专注使灵长类动物能够在复杂的视觉环境中将注意力引向感兴趣的物体,例如猎物和天敌。只关注一小部分信息的能力对进化富有意义,使人类得以生存和成功。

自19世纪以来,科学家们一直在研究认知神经科学领域的注意力。在本章中,我们将首先回顾一个热门框架,解释如何在视觉场景中展开注意力。受此框架中的*注意力提示*(attention cues)的启发,我们将设计能够利用这些注意力提示的模型。1964年的*Nadaraya-Waston核回归*(kernel regression)正是具有*注意力机制*(attention mechanisms)的机器学习的简单演示。
自19世纪以来,科学家们一直在研究认知神经科学领域的注意力。在本章中,我们将首先回顾一个热门框架,解释如何在视觉场景中展开注意力。受此框架中的*注意力提示*(attention cues)的启发,我们将设计能够利用这些注意力提示的模型。1964年的Nadaraya-Waston核回归(kernel regression)正是具有*注意力机制*(attention mechanisms)的机器学习的简单演示。

然后,我们继续介绍的是注意力函数,它们在深度学习的注意力模型设计中被广泛使用。具体来说,我们将展示如何使用这些函数来设计*Bahdanau注意力*。Bahdanau注意力是深度学习中的具有突破性价值的注意力模型,它是双向对齐的并且可以微分。

最后,我们将描述仅仅基于注意力机制的*transformer*结构,该结构中使用了*多头注意力*(multi-head attention)和*自注意力*(self-attention)设计。自2017年被构想出来,transformer一直都普遍存在于现代的深度学习应用中,例如语言、视觉、语音和强化学习领域。
最后,我们将描述仅仅基于注意力机制的*transformer*架构,该架构中使用了*多头注意力*(multi-head attention)和*自注意力*(self-attention)设计。自2017年被构想出来,transformer一直都普遍存在于现代的深度学习应用中,例如语言、视觉、语音和强化学习领域。

```toc
:maxdepth: 2
Expand Down
Loading

0 comments on commit 113f75a

Please sign in to comment.