初学者,仅做自己学习记录,如果对你有什么帮助,那更好了。
下面是论文《Attention Is All You Need》的经典transformer架构,在学习的过程中,有很多疑惑。
embedding层在做什么
Transformer的embedding层在做的是将输入的数据(通常是文本)转换成向量表示。这些向量表示在高维空间中可以捕捉到输入数据的语义信息。具体来说,embedding层的主要作用包括:
-
词嵌入(Word Embedding):将输入的单词或子词(token)转换成固定维度的向量。常用的方法有Word2Vec、GloVe以及基于Transformer的BERT、GPT等模型生成的embedding。
-
位置编码(Positional Encoding):因为Transformer没有像RNN那样的顺序结构,它需要一种方法来表示单词在句子中的位置。位置编码是通过将位置信息加到词嵌入上来实现的。常用的方法是将正弦和余弦函数应用于不同的维度。
词嵌入
为什么要将输入的token转为固定维度的向量?
-
维度统一:固定维度的向量使得模型在处理输入数据时能够保持一致的形状和维度,这对批处理和模型训练非常重要。在神经网络中,输入的形状和维度需要一致,以便于进行矩阵运算。
-
数值表示:文本数据本质上是非数值数据,计算机无法直接处理字符串。通过将单词或token转换为数值化的向量表示,模型能够进行数值运算和学习。
-
捕捉语义信息:词嵌入(如Word2Vec、GloVe)和现代的预训练语言模型(如BERT、GPT)通过训练能够将语义上相似的单词映射到相似的向量空间位置。这使得模型能够捕捉到词与词之间的语义关系,从而更好地理解和生成自然语言。
-
降维和特征提取:高维的one-hot编码会产生稀疏和高维的数据,这在计算上非常不经济且难以处理。而通过embedding层将高维的one-hot向量压缩成低维的稠密向量,不仅降低了计算复杂度,还能提取出重要的语义特征。
下面是我的理解,维度统一和数值表示很容易理解。
假设有一组单词,词汇表包含以下单词:
- cat
- dog
- mouse
使用one-hot编码,这些单词可以表示为:
- "cat" -> [1, 0, 0]
- "dog" -> [0, 1, 0]
- "mouse" -> [0, 0, 1]
对应矩阵就是:
很明显可以看出他的特点,唯一性和稀疏性(每一行大部分都是0,只有一个1)。如果是一个包含1w个单词的输入,可以想象这个矩阵有多浪费空间及资源。
在one-hot的高纬矩阵基础上,创建一个随机初始化的权重矩阵,称为embedding矩阵。这个矩阵的维度是 |V| x d
,其中 |V|
是词汇表的大小,d
是嵌入向量的维度(通常是一个相对较小的数,比如50、100、300等)。这个矩阵的每一行对应于词汇表中一个单词的稠密向量表示。
这么做的好处?
1. 原来是一个|V| x |V|
的矩阵,和embending矩阵相乘,最后会变成一个|V| x d
的矩阵,维度降低了
2.在模型训练的过程中,
embedding矩阵的权重会不断调整,使得语义相似的单词在向量空间中靠近。例如,"king" 和 "queen" 的向量可能在某种程度上相似,同时与 "apple" 之类的单词向量保持一定的距离。这个相对于原来的one-hot稀疏矩阵,他的每一行向量之间毫无联系,关联特征几乎为0。
位置编码
在实际操作中,位置编码和单词的嵌入向量相加,以便将位置信息融入到输入表示中。假设 是位置为 pos的嵌入向量,位置编码后的输入向量 为:
通过这种方式,模型在处理输入时不仅有每个token的语义信息(来自embedding),还有其位置信息(来自位置编码)。
位置编码在Transformer模型中起到了关键作用,帮助模型捕捉序列数据中的位置信息。通过正弦和余弦函数生成的位置编码具有平滑性、周期性和区分性,能够有效地提供位置信息。将位置编码与嵌入向量相加后,模型可以更好地理解和处理序列数据。