# 轻松理解 Transformers（2）：Attention部分

2023/10/30 15:26

🚢🚢🚢欢迎小伙伴们加入AI技术软件及技术交流群，追踪前沿热点，共探技术难题~

Transformers 对人工智能领域，乃至对整个世界都产生了深远的影响。这种模型架构由多个组件构成，但正如提出该架构那篇论文的题目——Attention is All You Need，显然注意力机制（Attention）具有特别重要的意义。本系列的第二部分将主要关注注意力（Attention）及其相关功能，这些功能确保了 Transformer 各组件的良好配合。

# 02 点积 Dot Product

florida = [-2.40062016, 0.00478901]
california = [-2.54245794, -0.37579669]
texas = [-2.24764634, -0.12963368]
politics = [3.02004564, 2.88826688]
truth = [4.17067881, -2.38762552]


Theta（θ）指的是向量之间的角度（可以看一下上方的图片）。角度的余弦值，表示为cos(θ)，是将余弦函数应用于该角度值的简单结果。

*下面是部分代码，第一个框中的代码，灵感来自于我之前见过的一些代码，但我似乎已经找不到源代码了。

import pandas as pd

path_to_glove_embds = 'glove.6B.100d.txt'

glove_embedding = {key: val.values for key, val in glove.T.items()}

words = ['florida', 'california', 'texas', 'politics', 'truth']
word_embeddings = [glove_embedding[word] for word in words]

print(word_embeddings[0]).shape # 100 numbers to represent each word.
---------------------
output:
(100,)

pca = PCA(n_components=2) # reduce dimensionality from 100 to 2.
word_embeddings_pca = pca.fit_transform(word_embeddings)

for i in range(5):
print(word_embeddings_pca[i])

---------------------
output:
[-2.40062016 0.00478901] # florida
[-2.54245794 -0.37579669] # california
[-2.24764634 -0.12963368] # texas
[3.02004564 2.88826688] # politics
[ 4.17067881 -2.38762552] # truth


import numpy as np

florida_vector = [-2.40062016,  0.00478901]
florida_vector_magnitude = np.linalg.norm(florida_vector)

print(florida_vector_magnitude)
---------------------
output:
2.4006249368060817 # The magnitude of the vector "florida" is 2.4.


import numpy as np

florida_vector = [-2.40062016,  0.00478901]
texas_vector = [-2.24764634 -0.12963368]

print(np.dot(florida_vector, texas_vector))

---------------------
output:
5.395124299364358


import numpy as np

florida_vector = [-2.40062016, 0.00478901]
truth_vector = [4.17067881, -2.38762552]

print(np.dot(florida_vector, truth_vector))

---------------------
output:
-10.023649994662344


# 03 缩放点积注意力 Scaled Dot-Product attention

*在大多数实施方案中，我们实际上并没有将主矩阵分成8份。通过索引，可以实现分割，从而为每个部分实现并行处理。然而，这些只是实现细节。不过，这些只是实现细节。从理论上讲，我们可以用 8 个矩阵完成几乎相同的操作。

*实际上，编码器由N（在论文中，N=6）个相同的层构成，每个层从上一层获取输入并执行相同的操作。最后一层将数据传递给解码器（我们将在本系列的后续部分中讨论）和编码器的上层。

1. 用Q乘以K的转置（翻转）。

2. 将结果除以矩阵 K 维度数的平方根。

3. 然后有了描述每个单词与其他单词相似程度的“注意力矩阵分数（attention matrix scores）”。将每一行进行 Softmax[4]（非线性）变换。Softmax[4] 有三个有趣的相关功能：

a. 缩放所有数字，使其介于 0 和 1 之间。

b. 使所有数字的和为1。

c. 突出差距，使得稍微更重要的部分变得更加重要。因此，我们现在可以轻松区分模型对单词x1与x2、x3、x4等之间联系的不同感知程度。

4. 将计算出来的分数与矩阵V相乘。这是自注意力机制操作的最终结果。

# 06 Skip Connection

Transformer架构中的另一个重要操作称为Skip Connection。

Skip Connection是一种在不经过任何转换的情况下传递输入（input）的方法。举例来说，假设我向我的经理报告，而我的经理又向他的经理报告。即使是出于让报告更有用的纯粹目的，输入内容在经过另一个人（或 ML 层）处理时，也会进行一些修改。在这个类比中，Skip Connection就像是我直接向我的经理的经理汇报。因此，上级经理既通过我的经理（经过处理的数据）接收输入，也直接从我这里（未经处理的数据）接收输入。然后，上级经理可以更好地做出决策。采用Skip Connection是为了解决梯度消失等潜在问题，我将在下一节中解释。

# 07 Add & Norm 层

• 从输入中减去其均值。
• 除以方差的平方根并加上一个epsilon（ε）（一个非常小的数字），用于避免除以零。
• 将得到的得分乘以一个可学习的参数，称为gamma（γ）。
• 添加另一个可学习的参数，称为beta（β）。
• 这些步骤可确保均值接近于0，标准差接近于1。归一化过程增强了训练的稳定性、速度和整体性能。

# x being the input.
(x - mean(x)) / sqrt(variance(x) + epsilon) * gamma + beta


END

# 参考资料

🚢🚢🚢欢迎小伙伴们加入AI技术软件及技术交流群，追踪前沿热点，共探技术难题~

0 评论
3 收藏
0