上传了之前学习的部分

This commit is contained in:
2025-12-19 15:18:44 +08:00
parent 35d106f00e
commit de42e5e796
4 changed files with 7696 additions and 0 deletions

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,221 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "1268b965-e029-4998-a20b-b11249cd1f02",
"metadata": {},
"source": [
"## 1.1 注意力机制的本质"
]
},
{
"cell_type": "markdown",
"id": "505368a2-2eee-4f61-8170-4b4deeddfcac",
"metadata": {},
"source": [
"注意力机制是一个帮助算法辨别信息重要性的计算流程,它通过计算样本与样本之间相关性来判断**每个样本之于一个序列的重要程度**,并**给这些样本赋予能代表其重要性的权重**。很显然注意力机制能够为样本赋予权重的属性与序列模型研究领域的追求完美匹配Transformer正是利用了注意力机制的这一特点从而想到利用注意力机制来进行权重的计算。\n",
"\n",
"> **面试考点**<br><br>\n",
"作为一种权重计算机制、注意力机制有多种实现形式。经典的注意力机制Attention进行的是跨序列的样本相关性计算这是说经典注意力机制考虑的是序列A的样本之于序列B的重要程度。这种形式常常用于经典的序列到序列的任务Seq2Seq比如机器翻译在机器翻译场景中我们会考虑原始语言系列中的样本对于新生成的序列有多大的影响因此计算的是原始序列的样本之于新序列的重要程度。\n",
"<br><br>不过在Transformer当中我们使用的是“自注意力机制”Self-Attention这是在一个序列内部对样本进行相关性计算的方式核心考虑的是序列A的样本之于序列A本身的重要程度。\n",
"\n",
"在Transformer架构中我们所使用的是自注意力机制因此我们将重点围绕自注意力机制来展开讨论我们将一步步揭开自注意力机制对于Transformer和序列算法的意义——"
]
},
{
"cell_type": "markdown",
"id": "1b1915f6-6acb-47b9-8fff-3d68b8a6c5c7",
"metadata": {},
"source": [
"- 首先,**为什么要判断序列中样本的重要性?计算重要性对于序列理解来说有什么意义?**\n",
"\n",
"在序列数据当中,每个样本对于“理解序列”所做出的贡献是不相同的,能够帮助我们理解序列数据含义的样本更为重要,而对序列数据的本质逻辑/含义影响不大的样本则不那么重要。以文字数据为例——\n",
"\n",
"**<center>尽管今天<font color =\"green\">下了雨</font>,但我因为<font color =\"red\">_________</font>而感到<font color =\"red\">非常开心和兴奋</font>。</center>**\n",
"\n",
"**<center>__________</font>,但我因为拿到了<font color =\"red\">梦寐以求的工作offer</font>而感到<font color =\"red\">非常开心和兴奋</font>。</center>**\n",
"\n",
"观察上面两句话,我们分别抠除了一些关键信息。很显然,第一个句子令我们完全茫然,但第二个句子虽然缺失了部分信息,但我们依然理解事情的来龙去脉。从这两个句子我们明显可以看出,不同的信息对于句子的理解有不同的意义。"
]
},
{
"cell_type": "markdown",
"id": "96f2e49b-16c2-40ab-9457-a129b78c0fbe",
"metadata": {},
"source": [
"在实际的深度学习预测任务当中也是如此,假设我们依然以这个句子为例——\n",
"\n",
"**<center>尽管今天<font color =\"green\">下了雨</font>,但我因为拿到了<font color =\"red\">梦寐以求的工作offer</font>而感到<font color =\"red\">非常开心和兴奋</font>。</center>**\n",
"\n",
"假设模型对句子进行情感分析很显然整个句子的情感倾向是积极的在这种情况下“下了雨”这一部分对于理解整个句子的情感色彩贡献较小相对来说“拿到了梦寐以求的工作offer”和“感到非常开心和兴奋”这些部分则是理解句子传达的正面情绪的关键。因此对序列算法来说如果更多地学习“拿到了梦寐以求的工作offer”和“感到非常开心和兴奋”这些词就更有可能对整个句子的情感倾向做出正确的理解就更有可能做出正确的预测。\n",
"\n",
"当我们使用注意力机制来分析这样的句子时,自注意力机制可能会为“开心”和“兴奋”这样的词分配更高的权重,因为这些词直接关联到句子的情感倾向。在很长一段时间内、长序列的理解都是深度学习世界的业界难题,在众多研究当中研究者们尝试着从记忆、效率、信息筛选等等方面来寻找出路,而注意力机制所走的就是一条“提效”的道路。**如果我们能够判断出一个序列中哪些样本是重要的、哪些是无关紧要的,就可以引导算法去重点学习更重要的样本,从而可能提升模型的效率和理解能力**。"
]
},
{
"cell_type": "markdown",
"id": "23bade20-d62b-4f8e-a191-8b102524bc12",
"metadata": {},
"source": [
"- 第二,**那样本的重要性是如何定义的?为什么?**\n",
"\n",
"自注意力机制通过**计算样本与样本之间的相关性**来判断样本的重要性,在一个序列当中,如果一个样本与其他许多样本都高度相关,则这个样本大概率会对整体的序列有重大的影响。举例说明,看下面的文字——\n",
"\n",
"**<center>经理在会议上宣布了重大的公司<font color =\"red\">______</font>计划,员工们反应各异,但都对未来充满期待。</center>**\n",
"\n",
"在这个例子中,我们抠除的这个词与“公司”、“计划”、“会议”、“宣布”和“未来”等词汇都高度相关。如果我们针对这些词汇进行提问,你会发现——\n",
"\n",
"**公司**做了什么?<br>\n",
"**宣布**了什么内容?<br>\n",
"**计划**是什么?<br>\n",
"**未来**会发生什么?<br>\n",
"**会议**上的主要内容是什么?\n",
"\n",
"所有这些问题的答案都围绕着这一个被抠除的词产生。这个完整的句子是——\n",
"\n",
"**<center>经理在会议上宣布了重大的公司<font color =\"red\">重组</font>计划,员工们反应各异,但都对未来充满期待。</center>**\n",
"\n",
"被抠掉的部分是**重组**。很明显,重组这个词不仅提示了事件的性质、是整个句子的关键,而且也对其他词语的理解有着重大的影响。这个单词对于理解句子中的事件——公司正在经历重大变革,以及员工们的情绪反应——都至关重要。如果没有“重组”这个词,整个句子的意义将变得模糊和不明确,因为不再清楚“宣布了什么”以及“未来期待”是指什么。因此,“重组”这个词很明显对整个句子的理解有重大影响,而且它也和句子中的其他词语高度相关。\n",
"\n",
"相对的,假设我们抠掉的是——\n",
"\n",
"**<center>经理在会议上宣布了重大的公司<font color =\"red\">重组</font>计划______反应各异但都对未来充满期待。</center>**\n",
"\n",
"你会发现,虽然我们缺失了一些信息,但实际上这个信息并不太影响对于整体句子的理解,我们甚至可以大致推断出缺失的信息部分。这样的规律可以被推广到许多序列数据上,在序列数据中我们认为**与其他样本高度相关的样本,大概率会对序列整体的理解有重大影响。因此样本与样本之间的相关性可以用来衡量一个样本对于序列整体的重要性**。"
]
},
{
"cell_type": "markdown",
"id": "04246776-6568-430f-b6a0-6c5be90f1adc",
"metadata": {},
"source": [
"- 第三,**样本的重要性(既一个样本与其他样本之间的相关性)具体是如何计算的?**\n",
"\n",
"在NLP的世界中序列数据中的每个样本都会被编码成一个向量其中文字数据被编码后的结果被称为词向量时间序列数据则被编码为时序向量。\n",
"\n",
"![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/Live/NLP%26LLMs/06_.png)\n",
"\n",
"因此,要计算样本与样本之间的相关性,本质就是计算向量与向量之间的相关性。**向量的相关性可以由两个向量的点积来衡量**。如果两个向量完全相同方向夹角为0度它们的点积最大这表示两个向量完全正相关如果它们方向完全相反夹角为180度点积是一个最大负数表示两个向量完全负相关如果它们垂直夹角为90度或270度则点积为零表示这两个向量是不相关的。因此向量的点积值的绝对值越大则表示两个向量之间的相关性越强如果向量的点积值绝对值越接近0则说明两个向量相关性越弱。\n",
"\n",
"![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/18.png)"
]
},
{
"cell_type": "markdown",
"id": "e77922b3-e8a9-4a4a-b788-7408a8b18c0d",
"metadata": {},
"source": [
"向量的点积就是两个向量相乘的过程,设有两个三维向量$\\mathbf{A}$ 和 $\\mathbf{B}$,则向量他们之间的点积可以具体可以表示为:\n",
"\n",
"$$\n",
"\\mathbf{A} \\cdot \\mathbf{B}^T = \\begin{pmatrix}\n",
"a_1, a_2, a_3\n",
"\\end{pmatrix} \\cdot\n",
"\\begin{pmatrix}\n",
"b_1 \\\\\n",
"b_2 \\\\\n",
"b_3\n",
"\\end{pmatrix} = a_1 \\cdot b_1 + a_2 \\cdot b_2 + a_3 \\cdot b_3\n",
"$$\n",
"\n",
"相乘的结构为(1,3) y (3,1) = (1,1),最终得到一个标量。\n",
"\n",
"在NLP的世界当中我们所拿到的词向量数据或时间序列数据一定是具有多个样本的。我们需要求解**样本与样本两两之间的相关性**综合该相关性分数我们才能够计算出一个样本对于整个序列的重要性。在这里需要注意的是在NLP的领域中样本与样本之间的相关性计算、即向量的之间的相关性计算会受到向量顺序的影响。**这是说,以一个单词为核心来计算相关性,和以另一个单词为核心来计算相关性,会得出不同的相关程度,向量之间的相关性与顺序有关**。举例说明:\n",
"\n",
"假设我们有这样一个句子:**我爱小猫咪。**\n",
"\n",
"> - 如果以\"我\"字作为核心词,计算“我”与该句子中其他词语的相关性,那么\"爱\"和\"小猫咪\"在这个上下文中都非常重要。\"爱\"告诉我们\"我\"对\"小猫咪\"的感情是什么,而\"小猫咪\"是\"我\"的感情对象。这个时候,\"爱\"和\"小猫咪\"与\"我\"这个词的相关性就很大。\n",
"\n",
"> - 但是,如果我们以\"小猫咪\"作为核心词,计算“小猫咪”与该剧自中其他词语的相关性,那么\"我\"的重要性就没有那么大了。因为不论是谁爱小猫咪,都不会改变\"小猫咪\"本身。这个时候,\"小猫咪\"对\"我\"这个词的上下文重要性就相对较小。\n",
"\n",
"当我们考虑更长的上下文时,这个特点会变得更加显著:\n",
"\n",
"> - 我爱小猫咪,但妈妈并不喜欢小猫咪。\n",
"\n",
"此时对猫咪这个词来说,谁喜欢它就非常重要。\n",
"\n",
"> - 我爱小猫咪,小猫咪非常柔软。\n",
"\n",
"此时对猫咪这个词来说,到底是谁喜欢它就不是那么重要了,关键是它因为柔软的属性而受人喜爱。\n",
"\n",
"因此假设数据中存在A和B两个样本则我们必须计算AB、AA、BA、BB四组相关性才可以。在每次计算相关性时作为核心词的那个词被认为是在“询问”Question而作为非核心的词的那个词被认为是在“应答”KeyAB之间的相关性就是A询问、B应答的结果AA之间的相关性就是A向自己询问、A自己应答的结果。\n",
"\n",
"这个过程可以通过矩阵的乘法来完成。假设现在我们的向量中有2个样本A与B每个样本被编码为了拥有4个特征的词向量。如下所示如果我们要计算A、B两个向量之间的相关性只需要让特征矩阵与其转置矩阵做点积就可以了——"
]
},
{
"cell_type": "markdown",
"id": "3c671293-e63b-4d7c-a992-95d98a6ca6dd",
"metadata": {},
"source": [
"![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/19.png)\n",
"\n",
"上述点积结果得到的最终矩阵是:\n",
"\n",
"$$\\begin{bmatrix}\n",
"r_{AA} & r_{AB} \\\\\n",
"r_{BA} & r_{BB} \n",
"\\end{bmatrix}$$"
]
},
{
"cell_type": "markdown",
"id": "d76c8a1c-26d8-456e-867c-97abab7d07d3",
"metadata": {},
"source": [
"该乘法规律可以推广到任意维度的数据上如果是带有3个样本的序列与自身的转置相乘就会得到3y3结构的相关性矩阵如果是n个样本的序列与自身的转置相乘就会得到nyn结构的相关性矩阵这些相关性矩阵代表着**这一序列当中每个样本与其他样本之间的相关性**,相关系数的个数、以及相关性矩阵的结构只与样本的数量有关,与样本的特征维度无关。因此面对任意的数据,我们只需要让该数据与自身的转置矩阵相乘,就可以自然得到**这一序列当中每个样本与其他样本之间的相关性**构成的相关性矩阵了。\n",
"\n",
"![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/Live/NLP%26LLMs/06_.png)"
]
},
{
"cell_type": "markdown",
"id": "6830f35b-9e77-44c8-b0b3-046f3102e9f9",
"metadata": {},
"source": [
"当然,在实际计算相关性的时候,我们一般不会直接使用原始特征矩阵并让它与转置矩阵相乘,**因为我们渴望得到的是语义的相关性,而非单纯数字上的相关性**。因此在NLP中使用注意力机制的时候**我们往往会先在原始特征矩阵的基础上乘以一个解读语义的$w$参数矩阵以生成用于询问的矩阵Q、用于应答的矩阵K以及其他可能有用的矩阵**。\n",
"\n",
"在实际进行运算时,$w$是神经网络的参数,是由迭代获得的,因此$w$会依据损失函数的需求不断对原始特征矩阵进行语义解读而我们实际的相关性计算是在矩阵Q和K之间运行的。使用Q和K求解出相关性分数的过程就是自注意力机制的核心过程如下图所示 ↓\n",
"\n",
"![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/Live/NLP%26LLMs/2-2.png)"
]
},
{
"cell_type": "markdown",
"id": "2e600a7f-e686-4c48-be72-64fc089e97ac",
"metadata": {},
"source": [
"到这里,我们已经将自注意力机制的内容梳理完毕了。"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6af3ce1a-ec2d-417e-9fbc-6e5d2d9982ae",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@@ -0,0 +1,174 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "87600e82-7e7c-4ca8-b1c3-08c4a28f8015",
"metadata": {},
"source": [
"## 1. Transformer中的自注意力机制运算流程"
]
},
{
"cell_type": "markdown",
"id": "5c1e9ba2-2afd-45a2-ad35-f04b1b49ccfd",
"metadata": {},
"source": [
"现在我们知道注意力机制是如何运行的了在Transformer当中我们具体是如何使用自注意力机制为样本增加权重的呢来看下面的流程。\n",
"\n",
"**Step1通过词向量得到QK矩阵**\n",
"\n",
"首先transformer当中计算的相关性被称之为是**注意力分数**,该注意力分数是在原始的注意力机制上修改后而获得的全新计算方式,其具体计算公式如下——\n",
"\n",
" $$Attention(Q,K,V) = softmax(\\frac{QK^{T}}{\\sqrt{d_k}})V$$"
]
},
{
"cell_type": "markdown",
"id": "89c841d9-3897-4777-aeb4-9ab47916ccd4",
"metadata": {},
"source": [
"$QK^{T}$的过程中点积是相乘后相加的计算流程因此词向量的维度越高、点积中相加的项也就会越多因此点积就会越大。此时词向量的维度对于相关性分数是有影响的在两个序列的实际相关程度一致的情况下词向量的特征维度高更可能诞生巨大的相关性分数因此对相关性分数需要进行标准化。在这里Transformer为相关性矩阵设置了除以$\\sqrt{d_k}$的标准化流程,$d_k$就是特征的维度,以上面的假设为例,$d_k$=6。"
]
},
{
"cell_type": "markdown",
"id": "1dfcddac-72dc-4276-b7b2-b6e3bd23e9ab",
"metadata": {},
"source": [
"![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/Live/NLP%26LLMs/2-3.png)"
]
},
{
"cell_type": "markdown",
"id": "284f963d-7b8b-4e27-b626-226d5e1ecc08",
"metadata": {},
"source": [
"**Step3softmax函数归一化**\n",
"\n",
"将每个单词之间的相关性向量转换成[0,1]之间的概率分布。例如对AB两个样本我们会求解出AA、AB、BB、BA四个相关性经过softmax函数的转化可以让AA+AB的总和为1可以让BB+BA的总和为1。这个操作可以令一个样本的相关性总和为1从而将相关性分数转化成性质上更接近“权重”的[0,1]之间的比例。这样做也可以控制相关性分数整体的大小,避免产生数字过大的问题。\n",
"\n",
"经过softmax归一化之后的分数就是注意力机制求解出的**权重**。"
]
},
{
"cell_type": "markdown",
"id": "35212bed-7e01-4f14-a246-24742a04ccd0",
"metadata": {},
"source": [
"**Step4对样本进行加权求和建立样本与样本之间的关系**"
]
},
{
"cell_type": "markdown",
"id": "dd256705-d8d4-48d3-83d4-49adfc29c589",
"metadata": {},
"source": [
"![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-11.png)"
]
},
{
"cell_type": "markdown",
"id": "5e9d7f3d-0b57-4272-ae76-1ae8dec4b128",
"metadata": {},
"source": [
"现在我们已经获得了softmax之后的分数矩阵同时我们还有代表原始特征矩阵值的V矩阵——"
]
},
{
"cell_type": "markdown",
"id": "f3ab33c5-1f21-4765-a27d-23727c725b5a",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{r} = \\begin{pmatrix}\n",
"a_{11} & a_{12} \\\\\n",
"a_{21} & a_{22}\n",
"\\end{pmatrix},\n",
"\\quad\n",
"\\mathbf{V} = \\begin{pmatrix}\n",
"v_{11} & v_{12} & v_{13} \\\\\n",
"v_{21} & v_{22} & v_{23}\n",
"\\end{pmatrix}\n",
"$$\n",
"二者相乘的结果如下:"
]
},
{
"cell_type": "markdown",
"id": "b55e2403-0bbd-44c4-a050-f0c90b308af2",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{Z(Attention)} = \\begin{pmatrix}\n",
"a_{11} & a_{12} \\\\\n",
"a_{21} & a_{22}\n",
"\\end{pmatrix}\n",
"\\begin{pmatrix}\n",
"v_{11} & v_{12} & v_{13} \\\\\n",
"v_{21} & v_{22} & v_{23}\n",
"\\end{pmatrix}\n",
"= \\begin{pmatrix}\n",
"(a_{11}v_{11} + a_{12}v_{21}) & (a_{11}v_{12} + a_{12}v_{22}) & (a_{11}v_{13} + a_{12}v_{23}) \\\\\n",
"(a_{21}v_{11} + a_{22}v_{21}) & (a_{21}v_{12} + a_{22}v_{22}) & (a_{21}v_{13} + a_{22}v_{23})\n",
"\\end{pmatrix}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "ed14723a-80cf-4122-bd2f-be2fdde9a6bc",
"metadata": {},
"source": [
"观察最终得出的结果,式子$a_{11}v_{11} + a_{12}v_{21}$不正是$v_{11}$和$v_{21}$的加权求和结果吗?$v_{11}$和$v_{21}$正对应着原始特征矩阵当中的第一个样本的第一个特征、以及第二个样本的第一个特征这两个v之间加权求和所建立的关联正是两个样本之间、两个时间步之间所建立的关联。\n",
"\n",
"在这个计算过程中,需要注意的是,列脚标与权重无关。因为整个注意力得分矩阵与特征数量并无关联,因此在乘以矩阵$v$的过程中,矩阵$r$其实并不关心一行上有多少个$v$它只关心这是哪一行的v。因此我们可以把Attention写成\n",
"\n",
"$$\n",
"\\mathbf{Z(Attention)} = \\begin{pmatrix}\n",
"a_{11} & a_{12} \\\\\n",
"a_{21} & a_{22}\n",
"\\end{pmatrix}\n",
"\\begin{pmatrix}\n",
"v_{11} & v_{12} & v_{13} \\\\\n",
"v_{21} & v_{22} & v_{23}\n",
"\\end{pmatrix}\n",
"= \\begin{pmatrix}\n",
"(a_{11}v_{1} + a_{12}v_{2}) & (a_{11}v_{1} + a_{12}v_{2}) & (a_{11}v_{1} + a_{12}v_{2}) \\\\\n",
"(a_{21}v_{1} + a_{22}v_{2}) & (a_{21}v_{1} + a_{22}v_{2}) & (a_{21}v_{1} + a_{22}v_{2})\n",
"\\end{pmatrix}\n",
"$$\n",
"\n",
"很显然,对于矩阵$a$而言原始数据有多少个特征并不重要它始终都在建立样本1与样本2之间的联系。"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c5159295-643e-40e7-ada3-3d8c46437cd8",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@@ -0,0 +1,139 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "bd8a0cf4-8fac-4b9f-9dc5-16eefd118f15",
"metadata": {},
"source": [
"## 1. Multi-Head Attention 多头注意力机制"
]
},
{
"cell_type": "markdown",
"id": "72587a6f-15ac-4721-a825-5e1470f205de",
"metadata": {},
"source": [
"Multi-Head Attention 就是在self-attention的基础上对于输入的embedding矩阵self-attention只使用了一组$W^Q,W^K,W^V$ 来进行变换得到QueryKeysValues。而Multi-Head Attention使用多组$W^Q,W^K,W^V$ 得到多组QueryKeysValues然后每组分别计算得到一个Z矩阵最后将得到的多个Z矩阵进行拼接。Transformer原论文里面是使用了8组不同的$W^Q,W^K,W^V$ 。"
]
},
{
"cell_type": "markdown",
"id": "6abc46e3-703a-46d1-8c29-9c7665e5d39e",
"metadata": {},
"source": [
"![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-12.png)"
]
},
{
"cell_type": "markdown",
"id": "f935c6d5-fece-49e1-80d3-7119fa4f3616",
"metadata": {},
"source": [
"假设每个头的输出$Z_i$是一个维度为(2,3)的矩阵,如果我们有$h$个注意力头,那么最终的拼接操作会生成一个维度为(2, 3h)的矩阵。"
]
},
{
"cell_type": "markdown",
"id": "9dcd069b-e25e-4db2-aa79-6d5467f8b914",
"metadata": {},
"source": [
"假设有两个注意力头的例子:\n",
"\n",
"1. 头1的输出 $ Z_1 $\n",
"$$\n",
"Z_1 = \\begin{pmatrix}\n",
"z_{11} & z_{12} & z_{13} \\\\\n",
"z_{14} & z_{15} & z_{16}\n",
"\\end{pmatrix}\n",
"$$\n",
"\n",
"2. 头2的输出 $ Z_2 $\n",
"$$\n",
"Z_2 = \\begin{pmatrix}\n",
"z_{21} & z_{22} & z_{23} \\\\\n",
"z_{24} & z_{25} & z_{26}\n",
"\\end{pmatrix}\n",
"$$\n",
"\n",
"3. 拼接操作:\n",
"$$\n",
"Z_{\\text{concatenated}} = \\begin{pmatrix}\n",
"z_{11} & z_{12} & z_{13} & z_{21} & z_{22} & z_{23} \\\\\n",
"z_{14} & z_{15} & z_{16} & z_{24} & z_{25} & z_{26}\n",
"\\end{pmatrix}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "a86df323-0bd8-49fb-88ef-5c1d20b5288b",
"metadata": {},
"source": [
"一般情况:\n",
"\n",
"对于$h$个注意力头,每个头的输出$Z_i$为:\n",
"\n",
"$$\n",
"Z_i = \\begin{pmatrix}\n",
"z_{i1} & z_{i2} & z_{i3} \\\\\n",
"z_{i4} & z_{i5} & z_{i6}\n",
"\\end{pmatrix}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "58b3af60-09d9-4f0c-a74a-315485d760f5",
"metadata": {},
"source": [
"总拼接操作如下:\n",
"\n",
"$$\n",
"Z_{\\text{concatenated}} = \\begin{pmatrix}\n",
"z_{11} & z_{12} & z_{13} & z_{21} & z_{22} & z_{23} & \\cdots & z_{h1} & z_{h2} & z_{h3} \\\\\n",
"z_{14} & z_{15} & z_{16} & z_{24} & z_{25} & z_{26} & \\cdots & z_{h4} & z_{h5} & z_{h6}\n",
"\\end{pmatrix}\n",
"$$\n",
"\n",
"最终的结构为(2,3h)。因此假设特征矩阵中序列的长度为100序列中每个样本的embedding维度为3并且设置了8头注意力机制那最终输出的序列就是(100,24)。"
]
},
{
"cell_type": "markdown",
"id": "9b560dd6-4adb-4abf-ab9f-e8b554611bbf",
"metadata": {},
"source": [
"![](http://www.caoxiaozhu.com:8066/i/2025/11/28/692966e2706be.png)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "67dc420c-fba1-4025-a91f-edad021b9fe0",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}