大模型之一——基础架构
基础架构

上图是transfomer block的基础架构图,由标准的encoder和decoder的结构组成,但是在chatgpt里面仅仅包含decoder部分的结构,所以我们仅仅专注于右边部分的结构。GPT2的网络结构如下所示
GPT2Model(
(wte): Embedding(50257, 768)
(wpe): Embedding(1024, 768)
(drop): Dropout(p=0.1, inplace=False)
(h): ModuleList(
(0-11): 12 x GPT2Block(
(ln_1): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
(attn): GPT2Attention(
(c_attn): Conv1D()
(c_proj): Conv1D()
(attn_dropout): Dropout(p=0.1, inplace=False)
(resid_dropout): Dropout(p=0.1, inplace=False)
)
(ln_2): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
(mlp): GPT2MLP(
(c_fc): Conv1D()
(c_proj): Conv1D()
(act): NewGELUActivation()
(dropout): Dropout(p=0.1, inplace=False)
)
)
)
(ln_f): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
)
Total # of params: 124.44M
Tansformer架构核心氛围如下几步,
- 将所有的语料token数字化,将人类的语言转换成便于计算机处理的数字信息,得到全量的token表格;
- 输入一段token,加上位置编码的向量,在token中加入位置信息
- 利用全中矩阵计算每个token的q/k/v向量,计算每一个token与其他token的相关性(通过计算当前token向量的q向量与其他token的k向量的内积得到),根据相关性得到权重系数(通过softmax获得),然后计算每一个token的v向量的加权和,更新当前token的v向量;
- 得到多头的v向量,然后使用投影矩阵将其映射到与第2步相同大小的向量,两个相加之后做layernorm;
- 使用权重矩阵将第4步的向量升维,然后做激活函数处理,再降维到之前的第2步的大小;
- 上面的2~5步就是一个完整的transformer block的过程,重复多次之后就可以通过现行层得到最少的logits softmax的矩阵,通过最后一列(最后一个token)的最大值从全量的token表格中取出对应编号的token,即为下一个输出的token
- 将上面的第6步生成的token再加入到原来的token序列的尾巴上,送到transoformer的网络中重复步骤2~7
下面以输入6个token为例,通过画图说明上面的所有过程。GPT-2的参数如下,全部token一共有50257个,每个token的嵌入维度是768,可以处理的最大连续的token数字是1024.
位置编码

当前有6个token的输入,每个长度是768的一维向量 \(\{a_0, a_1,...,a_5\}\),位置编码的向量的长度也是768, \(\{p_0, p_1,...,p_5\}\),相加之后得到位置编码之后的向量
其中 \(a_i^{'},a_i,p_i \in R^{1\times 768}\)
Masked MHA

在这一步之前,有些大模型中不需要对每个token做layernorm的归一化处理,GPT-2中需要做这个处理,做完之后可以得到归一化之后的 \(a{}'\),接着计算对应的q/k/v向量,
上面示意图中的维度有问题,GPT-2中有12个头,所以每个头计算完成之后的二q/k/v向量的长度是768/12= 64,因此 \(q_i,k_i,v_i\in R^{1\times 64}\) ,而 \(W^{Q}, W^{K},W^V \in R^{768\times 64}\)。得到所有token的QKV矩阵如下
其中 \(Q,K,V \in R^{6\times 64}\)。下一步计算不同token之间的相关性,计算第i个token跟第j个token相关性就是计算 \(q_ik^T_j\), 得到如下的自注意力矩阵,

其实 \(A\in \mathbb{R}^{6\times 6}\),下一步是masked softmax,因为大模型推理过程只能从已知的token推测之后的token,所以第 \(i\) 个token只能知道前面的 \(i\) 个token的信息,也就是说第 \(j\) 个token只能计算前 \(j - 1\) 个token的相关系数,所以上面的矩阵需要改成一个下三角矩阵
对上面的矩阵按照行做softmax,可以得到一个下三角矩阵,右上部分全部是0,
下面的关键一步,是更新所有token的v向量,令
如下图所示

所以得到的新的v矩阵就是
从上面的计算过程可以看到,新的value矩阵已经包括了其他token的相关性的信息,每个token都包括了其他token的信息。因为GPT-2有12个头,每个头计算得到相同维度的 \(V'\) 矩阵,这些矩阵的数据是相互独立的,所以可以大规模的并行计算。得到12个新的V矩阵之后,拼接起来就可以得到更大的新矩阵,
所以 \(V_{new}'\in \mathbb{R}^{6\times 768}\),下一步再做一个矩阵的投影,使用矩阵 \(W_{prj} \in \mathbb{R}^{768\times 768}\),得到新的V矩阵
最后得到的矩阵大小不变。
残差层和归一化层
计算完上面的步骤之后,做残差相加之后做layernorm
其中 \(L \in \mathbb{R}^{6\times 768}\)。
MLP/FFN层

可以用如下的数学公式表示
其中 \(W_1 \in \mathbb{R}^{768\times 3072}, W_2 \in \mathbb{R}^{3072\times 768}\),最后得到结果还是6个长度是768的token向量。
Linear和Softmax层
在上面的所有的block重复12次之后,最后一个transformer block结束之后,再做一个layernorm,使用权重矩阵将计算结果映射到整个词汇表上,得到
其中 \(W_f\in \mathbb{R}^{768\times 50257}\),最后一个token对应的那一行中的最大值的id,就是下一个输出的token。
参考文献
- LLM Visualization
- Transformer Explainer: LLM Transformer Model Visually Explained
- Transformer Math (Part 1) - Counting Model Parameters
本文原载于 巴巴变的博客,遵循CC BY-NC-SA 4.0协议,复制请保留原文出处。

浙公网安备 33010602011771号