面试的时候被拷打了自以为很熟悉的transformer,深感以前学习的不认真不细致,遂作此篇。
transformer的模型结构描述(基于数据被处理的顺序)
输入数据处理
Tokenization (分词):
输入的文本首先被分割成一个个单词或子词(token),这些token构成了模型的输入序列。
例如,句子 “Hello, how are you?” 可能会被分词成 [“Hello”, “,”, “how”, “are”, “you”, “?”]。
Embedding (嵌入):
每个token被映射到一个固定维度的向量表示,即词嵌入
。
词嵌入通常是通过查找预定义的嵌入矩阵来实现的,每个token对应矩阵中的一行。
例如,对于token “Hello”,模型会在嵌入矩阵中找到对应的行向量作为其嵌入表示。
Positional Encoding (位置编码):
为了给模型提供位置信息,需要对词嵌入加上位置编码
。
位置编码是一个固定或可学习的向量,用来表示单词在句子中的相对位置。
位置编码与词嵌入相加,形成最终的输入向量。
Encoder 层
Multi-Head Self-Attention (多头自注意力):
每个token的嵌入向量会分别作为Query
、Key
和Value
来计算注意力权重。
注意力机制使得模型可以关注输入序列中的不同部分
。
多头意味着注意力计算被分成几个并行的“头”,每个头都有自己的Query、Key和Value矩阵。
这些头的输出被拼接
起来并通过一个线性变换层
来生成最终的注意力输出。
Add & Norm (残差连接与层归一化):
在多头自注意力层之后,输出与输入相加,然后通过层归一化。
这有助于缓解梯度消失问题,并且可以提高模型性能。
Position-wise Feed-Forward Network (位置前馈网络):
该层对每个位置的向量应用完全相同的全连接神经网络。
这个网络包含两层线性变换和一个非线性激活函数(通常是ReLU)。
输出再次与输入相加并通过层归一化。
Decoder 层
Masked Multi-Head Self-Attention (掩码多头自注意力):
与Encoder类似,但在Decoder中,为了防止模型在生成输出时看到未来的标记,会使用一个掩码来屏蔽掉未生成的部分。
这样可以确保模型在生成当前位置的输出时只能利用之前位置的信息。
Add & Norm (残差连接与层归一化):
同样,在掩码多头自注意力层之后,输出与输入相加,并通过层归一化。
Multi-Head Attention (多头注意力):
这一步是Decoder特有的,它使用Encoder的输出作为Key和Value,而Decoder的输出(即Masked Multi-Head Self-Attention的结果)作为Query。
这样可以使Decoder直接获取来自Encoder的上下文信息。
Add & Norm (残差连接与层归一化):
在多头注意力层之后,输出与输入相加,并通过层归一化。
Position-wise Feed-Forward Network (位置前馈网络):
与Encoder中的位置前馈网络相同。
Add & Norm (残差连接与层归一化):
在位置前馈网络之后,输出与输入相加,并通过层归一化。
输出处理
Final Linear Transformation (最终线性变换):
Decoder的最后一层输出通过一个线性变换层,将其转换为每个位置上可能的词汇的概率分布。
Softmax (软最大值):
应用Softmax函数将线性变换的输出转换为概率分布,这样就可以从中采样出最有可能的下一个词汇。
模型的细节
输入数据处理
embedding
是通过词汇表的哈希函数实现的positionEncode
中的函数 P E p o s , 2 i = s i n ( p o s 1000 0 2 i / d ) PE_{pos,2i}=sin(\frac{pos}{10000^{2i/d}}) PEpos,2i<