diff --git a/assets/image-20240427173643871.png b/assets/image-20240427173643871.png new file mode 100644 index 0000000..1e1314b Binary files /dev/null and b/assets/image-20240427173643871.png differ diff --git a/人人都能看懂的Transformer/第三章——位置编码.md b/人人都能看懂的Transformer/第三章——位置编码.md index 91ae669..d3cffdb 100644 --- a/人人都能看懂的Transformer/第三章——位置编码.md +++ b/人人都能看懂的Transformer/第三章——位置编码.md @@ -34,7 +34,59 @@ GPT-2的位置编码是可学习的参数。这意味着模型在训练过程中 ### Transformer里的原始方法 - +~~~python +import numpy as np + +def get_positional_encoding(max_seq_len, d_model): + position_enc = np.array([ + [pos / np.power(10000, 2 * (j // 2) / d_model) for j in range(d_model)] + if pos != 0 else np.zeros(d_model) + for pos in range(max_seq_len) + ]) + position_enc[1:, 0::2] = np.sin(position_enc[1:, 0::2]) # dim 2i + position_enc[1:, 1::2] = np.cos(position_enc[1:, 1::2]) # dim 2i+1 + return torch.from_numpy(position_enc).type(torch.FloatTensor) + +# 假设我们的模型维度是768,最大序列长度是4 +max_seq_len = 4 +d_model = 768 +positional_encoding = get_positional_encoding(max_seq_len, d_model) +print(positional_encoding) +"""out: +tensor([[ 0.0000e+00, 0.0000e+00, 0.0000e+00, ..., 0.0000e+00, + 0.0000e+00, 0.0000e+00], + [ 8.4147e-01, 5.4030e-01, 8.2843e-01, ..., 1.0000e+00, + 1.0243e-04, 1.0000e+00], + [ 9.0930e-01, -4.1615e-01, 9.2799e-01, ..., 1.0000e+00, + 2.0486e-04, 1.0000e+00], + [ 1.4112e-01, -9.8999e-01, 2.1109e-01, ..., 1.0000e+00, + 3.0728e-04, 1.0000e+00]]) +""" +~~~ + +image-20240427173643871 + +为什么是用正弦和余弦函数,对于正弦函(sin):最大值是 1,最小值是 -1。对于余弦函数(cos):最大值是 1,最小值是 -1。也就是它们可以保证值是比较小的,而且也是符合深度学习模型可学习的参数。 + +其中最重要的是允许模型学习相对位置:由于正弦和余弦函数的周期性,对于任意固定偏移量 `k`,`PE(pos+k)`可以表示为 `PE(pos)` 的线性函数。这意味着模型可以很容易地通过学习注意力权重来关注相对位置,因为相对位置的编码可以通过简单的线性变换来获得。 + +~~~markdown +原文: +We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PE(pos+k) can be represented as a linear function of PE(pos). +~~~ + + + +我们用更简单的语言来解释这个概念: + +~~~markdown +想象一下,你有一串彩色的灯泡,每个灯泡都有不同的颜色。这些颜色按照一定的模式重复,比如红、绿、蓝、红、绿、蓝,依此类推。如果你知道了这个模式,即使你被蒙上眼睛,只要告诉你起点的颜色,你也能猜出后面第几个灯泡是什么颜色。 +在Transformer模型中,我们想要模型能够理解单词在句子中的位置。为此,我们给每个位置分配了一个特殊的标记,就像给每个灯泡分配了一种颜色。正弦和余弦函数就像是这些颜色的模式,它们以一种规律的方式重复。 +现在,当模型看到一个单词和它的位置标记时,它可以通过这个位置标记(就像颜色模式)来理解这个单词与句子中其他单词的相对位置。因为正弦和余弦函数是周期性的,所以模型可以通过简单的数学运算(线性变换)来预测单词之间的相对位置,就像你可以通过颜色模式来预测下一个灯泡的颜色一样。 +这种方法的好处是,模型不仅知道每个单词的绝对位置(就像知道每个灯泡的编号),而且还能理解单词之间的相对位置(就像知道一个灯泡与另一个灯泡之间有几个灯泡)。这对于理解和生成语言非常重要,因为在语言中,单词的意义往往取决于它们在句子中的位置和它们与其他单词的关系。 +~~~ + +关键词:编号和可预测的颜色顺序