diff --git a/大模型架构/Transformer/0. 基本原理(总).ipynb b/大模型架构/Transformer/0. 基本原理(总).ipynb new file mode 100644 index 0000000..f9affd4 --- /dev/null +++ b/大模型架构/Transformer/0. 基本原理(总).ipynb @@ -0,0 +1,7162 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "90dbf366-7a84-4c76-bcd6-466feaa51a7b", + "metadata": {}, + "source": [ + "# Transformer原理" + ] + }, + { + "cell_type": "markdown", + "id": "d5eef42a-f6f1-4756-a325-1e7fd59813a5", + "metadata": {}, + "source": [ + "**0 前言**
\n", + "    0.1 Transformer模型的地位与发展历程
\n", + "    0.2 序列模型的基本思路与根本诉求
\n", + "\n", + "**1 注意力机制**
\n", + "    1.1 注意力机制的本质
\n", + "    1.2 Transformer中的自注意力机制运算流程
\n", + "    1.3 Multi-Head Attention 多头注意力机制
\n", + "\n", + "**2 Transformer的基本结构**
\n", + "    2.1 Embedding层与位置编码技术
\n", + "    2.2 Encoder结构解析
\n", + "          2.2.1 残差连接
\n", + "          2.2.2 Layer Normalization层归一化
\n", + "          2.2.3 Feed-Forward Networks前馈网络
\n", + "    2.3 Decoder结构解析
\n", + "          2.3.1 完整Transformer与Decoder-Only结构的数据流
\n", + "          2.3.2 Encoder-Decoder结构中的Decoder
\n", + "                2.3.2.1 输入与teacher forcing
\n", + "                2.3.2.2 掩码注意力机制
\n", + "                2.3.2.3 普通掩码与前馈掩码
\n", + "                2.3.2.4 编码器-解码器注意力层
\n", + "          2.3.3 Decoder-Only结构中的Decoder
" + ] + }, + { + "cell_type": "markdown", + "id": "db513437-c41a-4817-b69b-1b41be7d9e5e", + "metadata": {}, + "source": [ + "Transformer模型,作为自然语言处理(NLP)领域的一块重要里程碑,于2017年由Google的研究者们提出,现在成为深度学习中对文本和语言数据处理具有根本性影响的架构之一。在NLP的宇宙中,如果说RNN、LSTM等神经网络创造了“序列记忆”的能力,那么Transformer则彻底颠覆了这种“记忆”的处理方式——它放弃了传统的顺序操作,而是通过自注意力机制(Self-Attention),赋予模型一种全新的、并行化的信息理解和处理方式。从自注意力的直观概念出发,Transformer的设计者们引进了多头注意力(Multi-Head Attention)、位置编码(Positional Encoding)等创新元素,大幅度提升了模型处理序列数据的效率和效果。通过精巧的数学构建和模型设计,Transformer能够同时捕捉序列中的局部细节和全局上下文,解决了以往模型在长距离依赖上的困难,使其在处理长文本序列时的能力大大增强。\n", + "\n", + "经过几年的快速迭代,Transformer不仅优化了其原始架构,而且催生了一系列高效的后续模型如BERT、GPT-3、RoBERTa和T5等,这些模型在语言理解、文本生成等多种NLP任务上都取得了令人瞩目的成绩。如同LSTM在其领域内的长久影响一样,Transformer模型的论文和原理也成为了NLP领域的经典,而它本身的算法和架构也已成为当代处理语言数据的根基。今天,尽管存在多种高级的算法和模型,Transformer仍然是处理复杂语言模式、捕捉细腻语义的主流架构,它在多个维度上重塑了我们构建和理解语言模型的方式。现在,就让我们一起来探讨这一划时代结构背后的深邃原理。" + ] + }, + { + "cell_type": "markdown", + "id": "5f7cc248-0d1a-413d-8837-58b55c3ec268", + "metadata": {}, + "source": [ + "## 1 Transformer模型的地位与发展历程" + ] + }, + { + "cell_type": "markdown", + "id": "b9e56e65-a9d1-4727-bc5c-0b87dfcf5c68", + "metadata": {}, + "source": [ + "学习Transformer并不只是学习一个算法,而是学习以Transformer为核心的一整个、基于注意力机制的大体系。在NLP领域中,有这样一张著名的树状图,它展示了从2018年到2023年的各种基于Transformer架构的语言模型的发展历程,并将模型从“开源/闭源”、“encoder/decoder/encoder-decoder”以及开发公司三个维度进行了划分。这个演化树很好地概述了从2018年到2023年基于Transformer架构的模型的发展脉络,让我们一步步来解读这个发展历史。\n", + "\n", + "![32](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/32.png)" + ] + }, + { + "cell_type": "markdown", + "id": "f1848b75-6de4-48dd-862c-089cbfefc50e", + "metadata": {}, + "source": [ + "- 2018年:Transformer的早期探索\n", + "> ELMo(Embeddings from Language Models)和ULMFiT(Universal Language Model Fine-tuning)虽然不是基于Transformer架构的,但它们引入了深层双向表示和迁移学习的概念,这对后来的Transformer模型产生了重要影响。\n", + "\n", + "- 2019年:BERT及其衍生模型\n", + "> BERT(Bidirectional Encoder Representations from Transformers)是一个重要的里程碑,它通过自注意力机制(self-attention)使模型能够生成上下文相关的词向量。它是首个大规模双向Transformer模型,对后续的模型产生了深远影响。\n", + "> RoBERTa 对BERT进行了改进,通过更大的数据集和更长的训练时间提高了性能。\n", + "> ALBERT 旨在减少模型大小的同时保持性能,通过因子分解嵌入层和跨层参数共享实现。\n", + "\n", + "- 2020年:多样化的模型和架构\n", + "> T5(text-to-text Transfer Transformer)将所有文本问题转化为文本到文本的格式,这样可以用相同的模型处理不同的任务。\n", + "> BART(Bidirectional and Auto-Regressive Transformers)结合了自编码和自回归的特点,适用于序列生成任务。\n", + "\n", + "- 2021年:专门化与效率优化\n", + "> ELECTRA 通过对抗性训练和效率优化来提高模型性能。\n", + "> DeBERTa 引入了改进的注意力机制,提高了模型对词之间关系的理解。\n", + "\n", + "- 2022年:大型语言模型的崛起\n", + "> GPT-3(Generative Pre-trained Transformer 3)以其庞大的参数量和强大的生成能力成为当时最大的语言模型之一。\n", + "> Switch-C(Switch Transformers)采用了稀疏激活,允许模型扩展到非常大的尺寸而不显著增加计算成本。\n", + "\n", + "- 2023年:高级应用与细化模型\n", + "> ChatGPT 和 InstructGPT 是在GPT-3基础上针对特定应用,如聊天和指令性任务,进行了优化的模型。\n", + "> Chinchilla 和 Gopher 表示了更高级别的语言理解和生成能力。\n", + "> FLAN 和 mT5 针对多语言任务设计,显示了模型的国际化和多样化发展。\n", + "\n", + "这个演化树还展示了各个模型之间的继承关系,以及它们是否开源。模型的不断迭代和创新反映了这个领域对于理解和生成人类语言能力的不断追求。每一代模型都在数据处理能力、训练方法、应用范围以及解决特定问题的能力上做出了改进。这一进程不仅推动了NLP的边界,也为人工智能的其他领域提供了宝贵的见解。\n", + "\n", + "当我们踏上学习Transformer的旅程时,实际上是在拥抱一个基于注意力机制的庞大而复杂的知识体系,这远远超出了单一算法的学习。Transformer及其衍生的模型不仅仅是NLP领域的工具,更是一扇窗口,透过它我们可以观察和理解语言的深层结构和流动的信息。这一体系以其独特的处理方式——自注意力机制——为核心,它挑战了传统的序列处理观念,引领我们探索如何让机器更深入地理解文本之间的复杂关系。从Transformer的基本架构到各种先进的变体,如BERT、GPT-3等,我们将学习如何让机器通过这些模型捕捉到词与词之间的微妙联系,理解语境的全局连贯性,以及如何将这些理解转化为处理多样化任务的能力。通过学习Transformer,我们不只是在掌握一种技术,更是在探索一个不断发展的领域,这个领域正推动着人工智能的边界,塑造着未来。所以,让我们开启这一段学习之旅,不仅为了掌握一个算法,更为了深入理解这个基于注意力的丰富体系,发现其在语言、思想和技术交汇处的无限可能。" + ] + }, + { + "cell_type": "markdown", + "id": "d202eeb6-3936-4814-a773-5b992b30ace0", + "metadata": {}, + "source": [ + "## 2 序列模型的基本思路与根本诉求" + ] + }, + { + "cell_type": "markdown", + "id": "bfe181d2-490c-487e-89f3-aa4a7eab6d09", + "metadata": {}, + "source": [ + "要理解Transformer模型的本质,首先我们要回归到序列数据、序列模型这些基本概念上来。序列数据是一种按照特定顺序排列的数据,它在现实世界中无处不在,例如股票价格的历史记录、语音信号、文本数据、视频数据等等,主要是按照某种特定顺序排列、且该顺序不能轻易被打乱的数据都被称之为是序列数据。序列数据有着“样本与样本有关联”的特点;对时间序列数据而言,每个样本就是一个时间点,因此样本与样本之间的关联就是时间点与时间点之间的关联。对文字数据而言,每个样本就是一个字/一个词,因此样本与样本之间的关联就是字与字之间、词与词之间的语义关联。很显然,要理解一个时间序列的规律、要理解一个完整的句子所表达的含义,就必须要理解样本与样本之间的关系。\n", + "\n", + "对于一般表格类数据,我们一般重点研究特征与标签之间的关联,但**在序列数据中,众多的本质规律与底层逻辑都隐藏在其样本与样本之间的关联中**,这让序列数据无法适用于一般的机器学习与深度学习算法。这是我们要创造专门处理序列数据的算法的根本原因。在深度学习与机器学习的世界中,**序列算法的根本诉求是要建立样本与样本之间的关联,并借助这种关联提炼出对序列数据的理解**。唯有找出样本与样本之间的关联、建立起样本与样本之间的根本联系,序列模型才能够对序列数据实现分析、理解和预测。\n", + "\n", + "在机器学习和深度学习的世界当中,存在众多经典且有效的序列模型。这些模型通过如下的方式来建立样本与样本之间的关联——\n", + "\n", + "- ARIMA家族算法群\n", + "> 过去影响未来,因此未来的值由过去的值加权求和而成,以此构建样本与样本之间的关联。\n", + "\n", + "$$AR模型:y_t = c + w_1 y_{t-1} + w_2 y_{t-2} + \\dots + w_p y_{t-p} + \\varepsilon_t\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "91425e20-e6fd-4440-820a-6ff7ecef7b23", + "metadata": {}, + "source": [ + "- 循环网络家族\n", + "> 遍历时间点/样本点,将过去的时间上的信息传递存储在中间变量中,传递给下一个时间点,以此构建样本和样本之间的关联。\n", + "\n", + "$$RNN模型:h_t = W_{xh}\\cdot x_t + W_{hh}\\cdot h_{t-1}$$\n", + "\n", + "$$LSTM模型:\\tilde{C}_t = tanh(W_{xi} \\cdot x_t + W_{hi} \\cdot h_{t-1} + b_i)$$" + ] + }, + { + "cell_type": "markdown", + "id": "93585a7c-b431-4963-8702-506947df6777", + "metadata": {}, + "source": [ + "- 卷积网络家族\n", + "> 使用卷积核扫描时间点/样本点,将上下文信息通过卷积计算整合到一起,以此构建样本和样本之间的关联。如下图所示,蓝绿色方框中携带权重$w$,权重与样本值对应位置元素相乘相加后生成标量,这是一个加权求和过程。\n", + "\n", + "![04](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/1dcnn/04.gif)" + ] + }, + { + "cell_type": "markdown", + "id": "78a5abd9-3453-4320-8710-8485ba9e5bc2", + "metadata": {}, + "source": [ + "总结众多序列架构的经验,你会发现**成功的序列架构都在使用加权求和的方式来建立样本与样本之间的关联**,通过对不同时间点/不同样本点上的值进行加权求和,可以轻松构建“上下文信息的复合表示”,只要尝试着使用迭代的方式求解对样本进行加权求和的权重,就可以使算法获得对序列数据的理解。加权求和是有效的样本关联建立方式,这在整个序列算法研究领域几乎已经形成了共识。**在序列算法发展过程中,核心的问题已经由“如何建立样本之间的关联”转变为了“如何合理地对样本进行加权求和、即如何合理地求解样本加权求和过程中的权重”**。在这个问题上,Transformer给出了序列算法研究领域目前为止最完美的答案之一——**Attention is all you need,最佳权重计算方式是注意力机制**。" + ] + }, + { + "cell_type": "markdown", + "id": "b6b1d67b-5fad-4fbc-95a4-c3fd2c9844ac", + "metadata": {}, + "source": [ + "## 1.1 注意力机制的本质" + ] + }, + { + "cell_type": "markdown", + "id": "51544e34-867c-481b-b198-30ba20025f30", + "metadata": {}, + "source": [ + "注意力机制是一个帮助算法辨别信息重要性的计算流程,它通过计算样本与样本之间相关性来判断**每个样本之于一个序列的重要程度**,并**给这些样本赋予能代表其重要性的权重**。很显然,注意力机制能够为样本赋予权重的属性与序列模型研究领域的追求完美匹配,Transformer正是利用了注意力机制的这一特点,从而想到利用注意力机制来进行权重的计算。\n", + "\n", + "> **面试考点**

\n", + "作为一种权重计算机制、注意力机制有多种实现形式。经典的注意力机制(Attention)进行的是跨序列的样本相关性计算,这是说,经典注意力机制考虑的是序列A的样本之于序列B的重要程度。这种形式常常用于经典的序列到序列的任务(Seq2Seq),比如机器翻译;在机器翻译场景中,我们会考虑原始语言系列中的样本对于新生成的序列有多大的影响,因此计算的是原始序列的样本之于新序列的重要程度。\n", + "

不过在Transformer当中我们使用的是“自注意力机制”(Self-Attention),这是在一个序列内部对样本进行相关性计算的方式,核心考虑的是序列A的样本之于序列A本身的重要程度。\n", + "\n", + "在Transformer架构中我们所使用的是自注意力机制,因此我们将重点围绕自注意力机制来展开讨论,我们将一步步揭开自注意力机制对于Transformer和序列算法的意义——" + ] + }, + { + "cell_type": "markdown", + "id": "c1987c96-899b-4c98-a7c8-a3f4354ab6d0", + "metadata": {}, + "source": [ + "- 首先,**为什么要判断序列中样本的重要性?计算重要性对于序列理解来说有什么意义?**\n", + "\n", + "在序列数据当中,每个样本对于“理解序列”所做出的贡献是不相同的,能够帮助我们理解序列数据含义的样本更为重要,而对序列数据的本质逻辑/含义影响不大的样本则不那么重要。以文字数据为例——\n", + "\n", + "**
尽管今天下了雨,但我因为_________而感到非常开心和兴奋
**\n", + "\n", + "**
__________,但我因为拿到了梦寐以求的工作offer而感到非常开心和兴奋
**\n", + "\n", + "观察上面两句话,我们分别抠除了一些关键信息。很显然,第一个句子令我们完全茫然,但第二个句子虽然缺失了部分信息,但我们依然理解事情的来龙去脉。从这两个句子我们明显可以看出,不同的信息对于句子的理解有不同的意义。" + ] + }, + { + "cell_type": "markdown", + "id": "237959f4-eab2-4351-8aa7-c89244cb5d2d", + "metadata": {}, + "source": [ + "在实际的深度学习预测任务当中也是如此,假设我们依然以这个句子为例——\n", + "\n", + "**
尽管今天下了雨,但我因为拿到了梦寐以求的工作offer而感到非常开心和兴奋
**\n", + "\n", + "假设模型对句子进行情感分析,很显然整个句子的情感倾向是积极的,在这种情况下,“下了雨”这一部分对于理解整个句子的情感色彩贡献较小,相对来说,“拿到了梦寐以求的工作offer”和“感到非常开心和兴奋”这些部分则是理解句子传达的正面情绪的关键。因此对序列算法来说,如果更多地学习“拿到了梦寐以求的工作offer”和“感到非常开心和兴奋”这些词,就更有可能对整个句子的情感倾向做出正确的理解,就更有可能做出正确的预测。\n", + "\n", + "当我们使用注意力机制来分析这样的句子时,自注意力机制可能会为“开心”和“兴奋”这样的词分配更高的权重,因为这些词直接关联到句子的情感倾向。在很长一段时间内、长序列的理解都是深度学习世界的业界难题,在众多研究当中研究者们尝试着从记忆、效率、信息筛选等等方面来寻找出路,而注意力机制所走的就是一条“提效”的道路。**如果我们能够判断出一个序列中哪些样本是重要的、哪些是无关紧要的,就可以引导算法去重点学习更重要的样本,从而可能提升模型的效率和理解能力**。" + ] + }, + { + "cell_type": "markdown", + "id": "20a4906a-2812-46ad-b3e7-51cb48dc277c", + "metadata": {}, + "source": [ + "- 第二,**那样本的重要性是如何定义的?为什么?**\n", + "\n", + "自注意力机制通过**计算样本与样本之间的相关性**来判断样本的重要性,在一个序列当中,如果一个样本与其他许多样本都高度相关,则这个样本大概率会对整体的序列有重大的影响。举例说明,看下面的文字——\n", + "\n", + "**
经理在会议上宣布了重大的公司______计划,员工们反应各异,但都对未来充满期待。
**\n", + "\n", + "在这个例子中,我们抠除的这个词与“公司”、“计划”、“会议”、“宣布”和“未来”等词汇都高度相关。如果我们针对这些词汇进行提问,你会发现——\n", + "\n", + "**公司**做了什么?
\n", + "**宣布**了什么内容?
\n", + "**计划**是什么?
\n", + "**未来**会发生什么?
\n", + "**会议**上的主要内容是什么?\n", + "\n", + "所有这些问题的答案都围绕着这一个被抠除的词产生。这个完整的句子是——\n", + "\n", + "**
经理在会议上宣布了重大的公司重组计划,员工们反应各异,但都对未来充满期待。
**\n", + "\n", + "被抠掉的部分是**重组**。很明显,重组这个词不仅提示了事件的性质、是整个句子的关键,而且也对其他词语的理解有着重大的影响。这个单词对于理解句子中的事件——公司正在经历重大变革,以及员工们的情绪反应——都至关重要。如果没有“重组”这个词,整个句子的意义将变得模糊和不明确,因为不再清楚“宣布了什么”以及“未来期待”是指什么。因此,“重组”这个词很明显对整个句子的理解有重大影响,而且它也和句子中的其他词语高度相关。\n", + "\n", + "相对的,假设我们抠掉的是——\n", + "\n", + "**
经理在会议上宣布了重大的公司重组计划,______反应各异,但都对未来充满期待。
**\n", + "\n", + "你会发现,虽然我们缺失了一些信息,但实际上这个信息并不太影响对于整体句子的理解,我们甚至可以大致推断出缺失的信息部分。这样的规律可以被推广到许多序列数据上,在序列数据中我们认为**与其他样本高度相关的样本,大概率会对序列整体的理解有重大影响。因此样本与样本之间的相关性可以用来衡量一个样本对于序列整体的重要性**。" + ] + }, + { + "cell_type": "markdown", + "id": "2e73db0e-9032-4ea5-9b6d-5d1cc19f41d7", + "metadata": {}, + "source": [ + "- 第三,**样本的重要性(既一个样本与其他样本之间的相关性)具体是如何计算的?**" + ] + }, + { + "cell_type": "markdown", + "id": "ed8a88d4-6b6e-4319-8d0a-0016064adc5e", + "metadata": {}, + "source": [ + "在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": "2c0af808-75f2-41d1-bb0b-804387fbdf0d", + "metadata": {}, + "source": [ + "向量的点积就是两个向量相乘的过程,设有两个三维向量$\\mathbf{A}$ 和 $\\mathbf{B}$,则向量他们之间的点积可以具体可以表示为:" + ] + }, + { + "cell_type": "markdown", + "id": "b06c7ae5-7f41-41d1-b593-eb001c49dcf7", + "metadata": {}, + "source": [ + "$$\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),最终得到一个标量。" + ] + }, + { + "cell_type": "markdown", + "id": "e3b78b7d-7018-4ead-8eea-3a5b003a59b2", + "metadata": {}, + "source": [ + "在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),而作为非核心的词的那个词被认为是在“应答”(Key),AB之间的相关性就是A询问、B应答的结果,AA之间的相关性就是A向自己询问、A自己应答的结果。\n", + "\n", + "这个过程可以通过矩阵的乘法来完成。假设现在我们的向量中有2个样本(A与B),每个样本被编码为了拥有4个特征的词向量。如下所示,如果我们要计算A、B两个向量之间的相关性,只需要让特征矩阵与其转置矩阵做点积就可以了——" + ] + }, + { + "cell_type": "markdown", + "id": "2e41e0f7-d265-48b6-8ba6-ecbbbb51e72a", + "metadata": {}, + "source": [ + "![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/19.png)" + ] + }, + { + "cell_type": "markdown", + "id": "3aac4c51-1aeb-4dce-ab3b-423df48cb3ff", + "metadata": {}, + "source": [ + "上述点积结果得到的最终矩阵是:\n", + "\n", + "$$\\begin{bmatrix}\n", + "r_{AA} & r_{AB} \\\\\n", + "r_{BA} & r_{BB} \n", + "\\end{bmatrix}$$" + ] + }, + { + "cell_type": "markdown", + "id": "4ce9d240-c861-451c-906b-b6815d981755", + "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": "92b27875-074d-4aa3-a01f-4c403e1098a7", + "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": "fecf3d55-e9bd-426d-a792-6ace51d439dc", + "metadata": {}, + "source": [ + "到这里,我们已经将自注意力机制的内容梳理完毕了。" + ] + }, + { + "cell_type": "markdown", + "id": "43b9acd1-d216-4385-9930-47a76f3b6dd6", + "metadata": {}, + "source": [ + "## 1.2 Transformer中的自注意力机制运算流程" + ] + }, + { + "cell_type": "markdown", + "id": "5ebf4cf3-f7a9-49b2-bd43-fa4bc5ce0a4a", + "metadata": {}, + "source": [ + "现在我们知道注意力机制是如何运行的了,在Transformer当中我们具体是如何使用自注意力机制为样本增加权重的呢?来看下面的流程。\n", + "\n", + "**Step1:通过词向量得到QK矩阵**" + ] + }, + { + "cell_type": "markdown", + "id": "4c9fab64-b32c-44d7-9a50-da0805c0575d", + "metadata": {}, + "source": [ + "首先,transformer当中计算的相关性被称之为是**注意力分数**,该注意力分数是在原始的注意力机制上修改后而获得的全新计算方式,其具体计算公式如下——" + ] + }, + { + "cell_type": "markdown", + "id": "c89054cb-6fa7-43ff-ab74-1c262aec5e08", + "metadata": {}, + "source": [ + "$$Attention(Q,K,V) = softmax(\\frac{QK^{T}}{\\sqrt{d_k}})V$$" + ] + }, + { + "cell_type": "markdown", + "id": "79275bc4-fd44-49be-9eb8-9641fe633b11", + "metadata": {}, + "source": [ + "在这个公式中,首先我们要先将原始特征矩阵转化为Q和K,然后令Q乘以K的转置,以获得最基础的相关性分数。同时,我们计算出权重之后,还需要将权重乘在样本上,以构成“上下文的复合表示”,因此我们还需要在原始特征矩阵基础上转化处矩阵V,用于表示原始特征所携带的信息值。假设现在我们有4个单词,每个单词被编码成了6列的词向量,那计算Q、K、V的过程如下所示:" + ] + }, + { + "cell_type": "markdown", + "id": "4591b7a4-4e0e-4c42-87ee-1a97f6954473", + "metadata": {}, + "source": [ + "![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/Live/NLP%26LLMs/2-2.png)" + ] + }, + { + "cell_type": "markdown", + "id": "4f2b57b9-ecde-4c20-b97b-7fab967186b1", + "metadata": {}, + "source": [ + "其中的$W_Q$与$W_K$的结构都为(6,3),事实上我们值需要保证这两个参数矩阵能够与$y$相乘即可(即这两个参数矩阵的行数与y被编码的列数相同即可),在现代大部分的应用当中,一般$W_Q$与$W_K$都是正方形的结构。\n", + "\n", + "**Step2:计算$QK$相似度,得到相关性矩阵**" + ] + }, + { + "cell_type": "markdown", + "id": "cf0b8135-1426-4534-88ad-34182403f042", + "metadata": {}, + "source": [ + "接下来我们让Q和K的转置相乘,计算出相关性矩阵。\n", + "\n", + "$$Attention(Q,K,V) = softmax(\\frac{QK^{T}}{\\sqrt{d_k}})V$$\n", + "\n", + "$QK^{T}$的过程中,点积是相乘后相加的计算流程,因此词向量的维度越高、点积中相加的项也就会越多,因此点积就会越大。此时,词向量的维度对于相关性分数是有影响的,在两个序列的实际相关程度一致的情况下,词向量的特征维度高更可能诞生巨大的相关性分数,因此对相关性分数需要进行标准化。在这里,Transformer为相关性矩阵设置了除以$\\sqrt{d_k}$的标准化流程,$d_k$就是特征的维度,以上面的假设为例,$d_k$=6。" + ] + }, + { + "cell_type": "markdown", + "id": "a32c4e92-2bc2-46a8-a47a-fe9345aeed96", + "metadata": {}, + "source": [ + "![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/Live/NLP%26LLMs/2-3.png)" + ] + }, + { + "cell_type": "markdown", + "id": "e677a541-7b31-4355-89f2-46a46a7f392d", + "metadata": {}, + "source": [ + "**Step3:softmax函数归一化**\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": "20287472-a299-44a2-92d0-3a1a5a50c40e", + "metadata": {}, + "source": [ + "**Step4:对样本进行加权求和,建立样本与样本之间的关系**" + ] + }, + { + "cell_type": "markdown", + "id": "e84a81cf-7d23-4481-9a7e-275d2327aed5", + "metadata": {}, + "source": [ + "![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-11.png)" + ] + }, + { + "cell_type": "markdown", + "id": "53e32837-f0d9-4094-b938-ebd57a3f9b68", + "metadata": {}, + "source": [ + "现在我们已经获得了softmax之后的分数矩阵,同时我们还有代表原始特征矩阵值的V矩阵——" + ] + }, + { + "cell_type": "markdown", + "id": "7966d731-6e83-447d-8e21-eb9cb8bdd817", + "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": "fb4231d2-1af1-4e1c-80a8-4fcb65489715", + "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": "13f70f41-6666-42df-8446-7fd3202bbb6a", + "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": "markdown", + "id": "5ba8f279-efaf-479d-b0b1-c44108e35fe1", + "metadata": {}, + "source": [ + "## 1.3 Multi-Head Attention 多头注意力机制" + ] + }, + { + "cell_type": "markdown", + "id": "0e9ab39d-e88e-4118-9110-16908d09a61b", + "metadata": {}, + "source": [ + "Multi-Head Attention 就是在self-attention的基础上,对于输入的embedding矩阵,self-attention只使用了一组$W^Q,W^K,W^V$ 来进行变换得到Query,Keys,Values。而Multi-Head Attention使用多组$W^Q,W^K,W^V$ 得到多组Query,Keys,Values,然后每组分别计算得到一个Z矩阵,最后将得到的多个Z矩阵进行拼接。Transformer原论文里面是使用了8组不同的$W^Q,W^K,W^V$ 。" + ] + }, + { + "cell_type": "markdown", + "id": "68d8cc2f-16ef-4d50-9953-c11c1c3f1d32", + "metadata": {}, + "source": [ + "![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-12.png)" + ] + }, + { + "cell_type": "markdown", + "id": "d0e7f976-ad99-4e64-b4e9-2dbfdec9d23c", + "metadata": {}, + "source": [ + "假设每个头的输出$Z_i$是一个维度为(2,3)的矩阵,如果我们有$h$个注意力头,那么最终的拼接操作会生成一个维度为(2, 3h)的矩阵。" + ] + }, + { + "cell_type": "markdown", + "id": "caa814f5-46d9-422b-879d-ad758f22519c", + "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": "2e3af21d-caef-45a4-9e34-85546f5c7972", + "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": "506ebeb2-f529-4093-b8fe-05a9fac4429d", + "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": "7c841ff2-008b-4bde-aca2-caf563699989", + "metadata": {}, + "source": [ + "![](https://data-science-blog.com/wp-content/uploads/2022/01/mha_img_original.png)" + ] + }, + { + "cell_type": "markdown", + "id": "44c706ea-07c9-426f-ba34-57114fa8e823", + "metadata": {}, + "source": [ + "以上就是Transformer当中的自注意力层,Transformer就是在这一根本结构的基础上建立了样本与样本之间的链接。在此结构基础上,Transformer丰富了众多的细节来构成一个完整的架构。让我们现在就来看看Transformer的整体结构。" + ] + }, + { + "cell_type": "markdown", + "id": "6a4306b7-3723-471f-9d16-f5e6a0a76f91", + "metadata": {}, + "source": [ + "让我们一起来看看Transformer算法都由哪些元素组成,以下是来自论文《All you need is Attention》的架构图:" + ] + }, + { + "cell_type": "markdown", + "id": "8db1c453-7eed-4cd4-b0a4-60e74b320627", + "metadata": {}, + "source": [ + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "f1ebbc78-282b-46d1-90b6-39b040fe81a3", + "metadata": {}, + "source": [ + "Transformer的总体架构主要由两大部分构成:编码器(Encoder)和解码器(Decoder)。在Transformer中,编码是解读数据的结构,在NLP的流程中,编码器负责解构自然语言、将自然语言转化为计算机能够理解的信息,并让计算机能够学习数据、理解数据;而解码器是将被解读的信息“还原”回原始数据、或者转化为其他类型数据的结构,它可以让算法处理过的数据还原回“自然语言”,也可以将算法处理过的数据直接输出成某种结果。因此在transformer中,编码器负责接收输入数据、负责提取特征,而解码器负责输出最终的标签。当这个标签是自然语言的时候,解码器负责的是“将被处理后的信息还原回自然语言”,当这个标签是特定的类别或标签的时候,解码器负责的就是“整合信息输出统一结果”。\n", + "\n", + "在信息进入解码器和编码器之前,我们首先要对信息进行**Embedding和Positional Encoding两种编码**,这两种编码在实际代码中表现为两个单独的层,因此这两种编码结构也被认为是Transformer结构的一部分。经过编码后,数据会进入编码器Encoder和解码器decoder,其中编码器是架构图上左侧的部分,解码器是架构图上右侧的部分。\n", + "\n", + "**编码器(Encoder)结构包括两个子层:一个是多头的自注意力(Self-Attention)层,另一个是前馈(Feed-Forward)神经网络**。输入数据会先经过自注意力层,这层的作用是为输入数据中不同的信息赋予重要性的权重、让模型知道哪些信息是关键且重要的。接着,这些信息会经过前馈神经网络层,这是一个简单的全连接神经网络,用于将多头注意力机制中输出的信息进行整合。两个子层都被武装了一个残差连接(Residual Connection),这两个层输出的结果都会有残差链接上的结果相加,再经过一个层标准化(Layer Normalization),才算是得到真正的输出。在神经网络中,多头注意力机制+前馈网络的结构可以有很多层,在Transformer的经典结构中,encoder结构重复了6层。\n", + "\n", + "**解码器(Decoder)也是由多个子层构成的:第一个也是多头的自注意力层(此时由于解码器本身的性质问题,这里的多头注意力层携带掩码),第二个子层是普通的多头注意力机制层,第三个层是前馈神经网络**。自注意力层和前馈神经网络的结构与编码器中的相同。注意力层是用来关注编码器输出的。同样的,每个子层都有一个残差连接和层标准化。在经典的Transformer结构中,Decoder也有6层。" + ] + }, + { + "cell_type": "markdown", + "id": "9c6f2bbc-7263-4fcd-88ef-6997bdde5f56", + "metadata": {}, + "source": [ + "**这个结构看似简单,但其实奥妙无穷,这里有许多的问题等待我们去挖掘和探索**。现在就让我们从解码器部分开始逐一解读transformer结构。" + ] + }, + { + "cell_type": "markdown", + "id": "bad3022c-e161-462f-bdfe-23b59d0fb43a", + "metadata": {}, + "source": [ + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "3358bb14-46ce-4556-b974-5e8fd9160c6a", + "metadata": {}, + "source": [ + "## 2.1 Embedding层与位置编码技术" + ] + }, + { + "cell_type": "markdown", + "id": "e4884c4a-5e1f-409e-8937-189aebbacb31", + "metadata": {}, + "source": [ + "在Transformer中,embedding层位于encoder和decoder之前,主要负责进行语义编码。Embedding层将离散的词汇或符号转换为连续的高维向量,使得模型能够处理和学习这些向量的语义关系。通过嵌入表示,输入的序列可以更好地捕捉到词与词之间的相似性和关系。此外,在输入到编码器和解码器之前,通常还会添加位置编码(Positional Encoding),因为Transformer没有内置的序列顺序信息,也就是说Attention机制本身会带来**位置信息的丧失**。\n", + "\n", + "- **首先,位置信息为什么重要?它可以从哪里来?**\n", + "\n", + "首先,位置信息就是顺序的信息,字符排列的顺序会影响语句的理解(还记得“屡战屡败”和“屡败屡战”的例子吗?同样的词在句子不同的地方出现,也可能会有不同的含义),我们说Transformer丧失了位置信息,意思是transformer并不理解样本与样本之间是按照什么顺序排列的(也就是不知道样本在序列中具体的位置)。\n", + "\n", + "还记得RNN和LSTM是如何处理数据的吗?RNN和LSTM以序列的方式处理输入数据,即一个时间步一个时间步地处理输入序列的每个元素。每个时间步的隐藏状态依赖于前一个时间步的隐藏状态。这种机制天然地捕捉了序列的顺序信息。由于RNN和LSTM在处理序列时会保留前一时间步的信息并传递到下一时间步,所以它们能够内在地理解和处理序列的时间依赖关系和顺序信息。然而,与RNN和LSTM不同,Transformer并不以序列的方式逐步处理输入数据,而是一次性处理整个序列。Attention能够通过点积的方式一次性计算出所有向量之间的相关性、并且多头注意力机制中不同的头还可以并行,因此Attention与Transformer缺乏天然的顺序信息。\n", + "\n", + "- **相关性计算过程中有标识,这些标识不能够成为位置信息吗?什么信息才算是位置信息/顺序信息呢?**\n", + "\n", + "在注意力机制中,权重矩阵$softmax(\\frac{QK^{T}}{\\sqrt{d_k}})$中的每个元素$a_{ij}$表示序列中位置$i$和位置$j$之间的相关性,但是却并没有假设这两个相关的元素之间的位置信息。具体来说,虽然我们使用了1、2这样的脚标,但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_{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", + "$$\n", + "\n", + "由于Transformer模型放弃了“逐行对数据进行处理”的方式,而是一次性处理一整张表单,因此它不能直接像循环神经网络RNN那样在训练过程中就捕捉到单词与单词之间的位置信息。在经典的深度学习场景当中,最典型的顺序信息就是**数字的大小**。由于数字天生是带有大小顺序的,因此数字本身可以被认为是含有顺序一个信息,只要让有顺序的信息和有顺序的数字相匹配,就可以让算法天然地认知到相应的顺序。因此我们自然而然地**想要对样本的位置本身进行“编码”**,利用数字本身自带的顺序来告知Transformer。" + ] + }, + { + "cell_type": "markdown", + "id": "36bcbdda-2068-4b41-a958-65bd1fb4254e", + "metadata": {}, + "source": [ + "- **位置信息如何被告知给Attention/Transformer这样的算法?**" + ] + }, + { + "cell_type": "markdown", + "id": "ad08a935-f6bc-4698-b34f-de5c385545d9", + "metadata": {}, + "source": [ + "为了解决位置信息的问题,Transformer引入了位置编码(positional encoding)技术来补充语义词嵌入。我们首先将样本的位置转变成相应的数字或向量,然后让位置编码的这个向量被加到原有的词嵌入向量embedding向量上,这样模型就可以同时知道一个词的语义和它在句子中的位置。" + ] + }, + { + "cell_type": "markdown", + "id": "12e9d14a-4d3b-4c9f-9e95-c91d11d0aa6e", + "metadata": {}, + "source": [ + "![Alt text](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-6.png)" + ] + }, + { + "cell_type": "markdown", + "id": "7fa0573c-3537-4a8d-a481-799ba78990a4", + "metadata": {}, + "source": [ + "(上图中的数字编号有误,无论是embedding、postion encoding还是最终加和的结果,都应该等于512,521是错误的表示)" + ] + }, + { + "cell_type": "markdown", + "id": "a1aca67e-4fcd-4173-8791-209376d5426f", + "metadata": {}, + "source": [ + "位置编码使用了一种特殊的函数,这个函数会为序列中的每个位置生成一个向量。对于一个特定的位置,这个函数生成的向量在所有维度上的值都是不同的。这保证了每个位置的编码都是唯一的,而且不同位置的编码能够保持一定的相对关系。**在transformer的位置编码中,我们需要对每个词的每个特征值给与位置编码,所有这些特征位置的编码共同组合成了一个样本的位置编码**。例如,当一个样本拥有4个特征时,我们的位置编码也会是包含4个数字的一个向量,而不是一个单独的编码。因此,**位置编码矩阵是一个与embedding后的矩阵结构相同的矩阵**。\n", + "\n", + "在Transformer模型中,词嵌入和位置编码被相加,然后输入到模型的第一层。这样,Transformer就可以同时处理词语的语义和它在句子中的位置信息。这也是Transformer模型在处理序列数据,特别是自然语言处理任务中表现出色的一个重要原因。" + ] + }, + { + "cell_type": "markdown", + "id": "c5feef31-b541-4e79-868f-429d7201ad82", + "metadata": {}, + "source": [ + "- **Transformer中的正余弦位置编码**" + ] + }, + { + "cell_type": "markdown", + "id": "2f24d71b-c0d6-4a51-ab75-242b3e5eada3", + "metadata": {}, + "source": [ + "在过去最为经典的位置编码就是OrdinalEncoder顺序编码,但在Transformer中我们需要的是一个编码向量,而非单一的编码数字,因此OrdinalEncoder编码就不能使用了。在众多的、构成编码向量的方式中,Transformer选择了“**正余弦编码**”这一特别的方式。让我们一起来看看正余弦编码的含义——" + ] + }, + { + "cell_type": "markdown", + "id": "23c62d58-c6e7-478e-bc02-d838e2c9453e", + "metadata": {}, + "source": [ + "首先,正余弦编码是使用正弦函数和余弦函数来生成具体编码值的编码方式。对于任意的词向量(也就是数据中的一个样本),正余弦编码在偶数维度上采用了sin函数来编码,奇数维度采用了cos函数来编码,sin函数与cos函数交替使用,最终构成一个多维度的向量——\n", + "\n", + "\n", + "![Alt text](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-4.png)" + ] + }, + { + "cell_type": "markdown", + "id": "208c74eb-6174-401c-8928-a8a06a8ea3de", + "metadata": {}, + "source": [ + "通过对不同的维度进行不同的三角函数编码,来构成一串独一无二的编码组合。这种编码组合与embedding类似,都是将信息投射到一个高维空间当中,只不过正余弦编码是将样本的位置信息(也就是样本的索引)投射到高维空间中,且每一个特征的维度代表了这个高维空间中的一维度。对正余弦编码来说,编码数字本身是依赖于**样本的位置信息(索引)、所有维度的编号、以及总维度数三个因子**计算出来的。" + ] + }, + { + "cell_type": "markdown", + "id": "26b91d7d-3416-4606-a5ed-ea65109a2a5e", + "metadata": {}, + "source": [ + "具体来看,正余弦编码的公式如下:\n", + "\n", + "- 正弦位置编码(Sinusoidal Positional Encoding)\n", + "$$PE_{(pos, 2i)} = \\sin \\left( \\frac{pos}{10000^{\\frac{2i}{d_{\\text{model}}}}} \\right) $$\n", + "\n", + "- 余弦位置编码(Cosine Positional Encoding)\n", + "$$ PE_{(pos, 2i+1)} = \\cos \\left( \\frac{pos}{10000^{\\frac{2i}{d_{\\text{model}}}}} \\right) $$\n", + "\n", + "将这段LaTey代码粘贴到支持LaTey的环境中(如LaTey编辑器或支持LaTey的Markdown渲染器)即可得到公式的正确显示。\n", + "\n", + "其中——\n", + "> - pos代表样本在序列中的位置,也就是样本的索引(是三维度中的seq_len/vocal_size/time_step这个维度上的索引)

\n", + "> - $2i$和$2i+1$分别代表embedding矩阵中的偶数和奇数维度索引,当我们让i从0开始循环增长时,可以获得[0,1,2,3,4,5,6...]这样的序列。

\n", + "> - $d_{\\text{model}} $ 代表embedding后矩阵的总维度。" + ] + }, + { + "cell_type": "markdown", + "id": "d327b655-f508-41f7-a860-61d3c787cf00", + "metadata": {}, + "source": [ + "在这里,你可以选择停下脚步、开启下一节课程,你也可以选择继续听更深入的关于位置编码的内容。这里有选择的原因是,位置编码作为深度学习和时间序列处理过程中非常重要的一种技术,在不同的场景下被频繁地使用,我们可以将其用于纹理建模、声音处理、信号处理、震动分析等多种场合,但同时,我们也将它作为一种行业惯例在进行使用,因此你或许无需对正余弦位置编码进行特别深入的探索。\n", + "\n", + "但正余弦位置编码本身是一种非常奇妙的结构,在接下来的内容中,我将带你仔细剖析正余弦位置编码的诸多细节和意义。" + ] + }, + { + "cell_type": "markdown", + "id": "5ab6b2c2-dcb6-4006-9b2a-0f13ab1a087e", + "metadata": {}, + "source": [ + "- **为什么要使用正余弦编码?它有什么意义?**" + ] + }, + { + "cell_type": "markdown", + "id": "b40f6119-02b4-4ff5-bae1-fe08e9be6c2f", + "metadata": {}, + "source": [ + "- 正弦位置编码(Sinusoidal Positional Encoding)\n", + "$$PE_{(pos, 2i)} = \\sin \\left( \\frac{pos}{10000^{\\frac{2i}{d_{\\text{model}}}}} \\right) $$\n", + "\n", + "- 余弦位置编码(Cosine Positional Encoding)\n", + "$$ PE_{(pos, 2i+1)} = \\cos \\left( \\frac{pos}{10000^{\\frac{2i}{d_{\\text{model}}}}} \\right) $$" + ] + }, + { + "cell_type": "markdown", + "id": "f0d19138-d827-425a-953d-de8170bdc39e", + "metadata": {}, + "source": [ + "首先我们先来看Pos,Pos是样本的索引,它有多大会取决于实际的数据尺寸。如果一个时间序列或文本数据是很长的序列,那Pos数值本身也会变得很大。假设我们使用很大的数值与原本的embedding序列相加,那位置编码带来的影响可能会远远超过原始的语义、会导致喧宾夺主的问题,因此我们天然就有限制位置编码的大小的需求。在这个角度来看,使用sin和cos这样值域很窄的函数、就能够很好地限制位置编码地大小。\n", + "\n", + "**
正余弦编码的意义①:sin和cos函数值域有限,可以很好地限制位置编码的数字大小。**\n", + "\n", + "假设我们使用的是单变量序列,那我们或许只需要sin(pos)或者cos(pos)看起来就足够了,但为了给每个不同的维度都进行编码,我们肯定还要做点儿别的文章。首先,位置信息和语义信息一样,当我们将其投射到高维空间时,我们也在尝试用不同的维度来解读位置信息。但我们使用正弦余弦这样的三角函数时,如何能够将信息投射到不同的维度呢——答案是创造各不相同的sin和cos函数。虽然都是正弦/余弦函数,但我们可以为函数设置不同的频率来获得各种高矮胖瘦的函数——" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "e0c806bb-5df1-4b47-bb2c-2f4bcbc09e4f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAKACAYAAACBhdleAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzdd1xUV/r48c+hg6AiIKCoFCmKCPbeTTU9MWuSTWLMbjZtk2zKJrvZb5LNZjfZX7Kbnmx63/TeEzVq1IgVGwKCgiIdVHqd8/tjwEUFacPcO8Pzfr18RZiZe5+Z4MN97jnnOUprjRBCCCGEEEKInnMxOgAhhBBCCCGEcBZSYAkhhBBCCCGEjUiBJYQQQgghhBA2IgWWEEIIIYQQQtiIFFhCCCGEEEIIYSNSYAkhhBBCCCGEjUiBJUxNKTVLKZVudBxCiL5Bco4Qwl4k3zgvKbDEKSmlspVSNUqpylZ/hvTi+bRSamTL11rrn7XWsb10rheVUulKKYtSamlvnEMI0TXOmnOUUjFKqc+VUsVKqTKl1PdKqV7JbUKIznHifBOolFqnlCpVSh1RSv2ilJph6/OI9kmBJTrjXK21b6s/eUYHZCPbgRuBrUYHIoQ4jjPmnIHAF0AsEAxsBD43MiAhBOCc+aYSWAYEAf7AP4EvlVJuhkbVh0iBJbql+a7PwlZfP6CUerv57+HNd2muVkodUEqVKKXubfVcV6XUn5VSWUqpCqXUFqXUMKXUmuanbG++i/QrpdRcpVRuq9eOUkqtar4js1spdV6rx15XSj2rlPq6+bjJSqmo9t6D1vpZrfUKoNaWn40QwvYcPedorTdqrV/RWpdprRuAx4FYpVSAjT8qIUQPOUG+qdVap2utLYACmrAWWoNs+kGJdkmBJXrTTKx3axcA9ymlRjV//3bgMuBsoD/WuyzVWuvZzY8nNt9Fer/1wZRS7sCXwA/AYOD3wDsnTLNZAvwVayLJBP7eG29MCGFKjpRzZgMFWuvSrr1FIYRJmD7fKKV2YL2J/AXwsta6qJvvVXSRFFiiMz5rvptyRCn1WRde91etdY3WejvW6XiJzd//DfCX5rsrWmu9vZMXGVMBX+ARrXW91nol8BXWRNbi0+Y7xY3AO0BSF+IVQpiDU+ccpVQY8CzWCzEhhLGcNt9orcdiLfIuB9Z24b2JHpK5mKIzLtBaL+/G6wpa/b0aa+IAGAZkdeN4Q4CDzUPeLXKAoZ04pxDCcThtzlFKBWG9Q/2c1vrdbsQkhLAtp803YJ0uCLyrlNqjlEppLghFL5MRLNFdVYBPq69DuvDag0C7a6NOIQ8YppRq/XM7HDjUjWMJIRyLw+ccpZQ/1uLqC621TF8WwrwcPt+0wR2ItNGxRAekwBLdlQIsUUq5K6UmApd04bUvA39TSkUrq7GtFnoX0n4CSMZ6x+aPzeedC5wLvNedN6CU8lBKeWFdAOqulPI6IbEJIcwjBQfOOUqp/sD3wDqt9T1dfb0Qwq5ScOx8M1UpNbP5OsdbKXU31u6lyV09lugeuZgU3fV/WO/QHMa64PK/XXjtv4EPsN7JLQdeAbybH3sAeKN5LvSlrV+kta7HmmzOAkqA54CrtNZp3XwPPwA1wHTgxea/zz7lK4QQRnH0nHMhMAm4Rh2/587wbhxLCNG7HD3feGJd51mKdQTsbGCRk7SgdwhKa210DEIIIYQQQgjhFGQESwghhBBCCCFsRAosIYQQQgghhLARKbCEEEIIIYQQwkakwBJCCCGEEEIIG3G6jYYDAwN1eHi40WEIIZpt2bKlRGsdZHQcvUVyjhDmIflGCGFP7eUcpyuwwsPD2bx5s9FhCCGaKaVyjI6hN0nOEcI8JN8IIeypvZwjUwSFEEIIIYQQwkakwBJCCCGEEEIIGzG0wFJKvaqUKlJK7WrncaWUekoplamU2qGUGm/vGIUQzkHyjRDCniTnCNF3Gb0G63XgGeDNdh4/C4hu/jMFeL75v0J0S0NDA7m5udTW1hoditPx8vIiLCwMd3d3o0Npz+tIvhFC2M/rSM4Rok8ytMDSWq9RSoWf4innA29qrTWwQSk1UCkVqrXOt0+EzqfqaBWFOSUcKTpKfW0DTY1N+PT3xs/fl+DwIPz8fY0OsVfl5ubi5+dHeHg4Simjw3EaWmtKS0vJzc0lIiLC6HDa1FfzjcVi4cC+Yoryj+Dq6kL4yGACBvc3OixhgPIj1exLz6e2poGgkAGMiBqMm7ur0WE5LWfKOVprMnOKKS6tIHJ4ECFBkkNsRWtNxv4iyg5XMTI8iKAAP6NDchpNTRb27i/icHk1sZHBDBrYz27nNnoEqyNDgYOtvs5t/t5xyUcpdR1wHcDw4cPtFpzZaa3J3n2Q5K+2kLohg7TkvRwuPHrK1wwcPIDIxBEkzoknaf4Y4iaPxMXFeZbq1dbWSnHVC5RSBAQEUFxcbHQoPdGpfAOOkXNqquv45K31fP3BRsqKK457LG7sMC5ZOpMZC0bLv4U+YOuGTN5/aTU7NmdjvZa3GuDvw2nnj+dX187Gb4CPgRH2WQ5xjXPgUBkPPf0tqXvzm+OBM+fE84ffLMDH28Pu8TiTfQdKeOipb8jYXwSAi4vinAUJ3HLNPLw8TTsbxCFk7Cvkoae/Zd+BEsD62V505jhuvGo2Hu69X/6YvcDqFK31i8CLABMnTtQdPN3pFR0o5puXVvDTe2vJyyoEYFjsECacnkh4/HCCRwQyKNQfDy93XN1cqa6ooaKskvx9RRzYk0v6pkxe+8u7AAQNC2DupdM5Y9l8RowKM/Jt2YxcUPaOvvS5mj3n7Nqazf/780cU5R1h0swYlt5yGsPCg6ivbyBj5yG++3QLD93+LpNmxnDXPy6h/0C5uHZGNdV1PPPQl6z4KoXA4P5ccf084seNwNvHg/zcMtav3MMnb67jh8+2csdDFzNldqzRIYs2GJlv9h8s4eb/ex+AO69bSOSIINZuyuS9LzaTc6iMJx9YjLeXFFndkbGvkJvvex8vTzfuvuF0RoQF8NP6dD76ZisHDpXx2F8uliKrm3akHeKOv32EXz8v/nzTmQwNHciPP+859tn+vz9fiJtb747em73AOgQMa/V1WPP3RBvSN2Xyzt8/JvmrLWgNE04fy6V3nc/UcycSEOrfpWMdLSln03cprHp/HZ88+Q0f/utLJp01jktuP5dx88f0qYtp0Wc4Rb5Z+XUKj9/3KUGhA3ns9d8wZnz4cY8nTorkoqum8+X7G3nl399x85LneOSlaxgyLMCYgEWvKCup4P6b3yIrLZ8rfjePX/12Dh4e//uVHzd2GPPOTmR/RgGP/eVj7r/5La676ywuunKGgVH3OabOOVXVdfzxH5/g5urCsw8tIaz5OmJs3FDiY4bwf499wd+f+Y6/3XGuXBN00ZHyau76xyf49vPk+b9fRnCgdcrl2LihjI4O5cEnv+aJV1Zyz41nGByp4ykpq+Te//c5Af6+PP3XS49NuUwcFUZsZDD/fP4HnnljNbddO79X4zD73K8vgKuaO+1MBY6acW6y0fbvzOH/zn+Em6f8iV1r0/jV3Rfw1r5nefjbv7DoutO6XFwBDAjsz8Jfz+ahL//Ee4deYOmDS8jcuo+7T3uQPy78K+mbs3rhnfQNrq6uJCUlHfuTnZ1ts2N/9tlnpKamHvv6vvvuY/ny5T0+bmlpKfPmzcPX15ebb765x8czKYfPNz99s51H//wxo5KG8+Q7vzupuGrh6ubKBVdM47HXf0tNVR1/XPYKeQdL7Rus6DUVR6u55zevcnB/Cfc/9WuuvGnBccVVaxExITz+1nXMXBjPi49+y4ev/WznaPs0U+ecJ1/7icKSCv5+9/nHiqsWc6ZE89vLZrLqlwyWr00zKELH9e+XVnC0ooZ//unCY8VVi9NmjeLXF07hqxU7WZO816AIHdejL/xIbV0DD999/knr2c5dOJbFi8bz0Tdb2byjd/ckN7pN+7vAL0CsUipXKXWtUup6pdT1zU/5BtgHZAIvATcaFKopVVfU8J/bX+f68X9k189pLP3bEt7a9yzL/n45wSOCbHaegUEDuOIvF/N29vPc9OQy9u88wM2T7+H/XfMM5aUVHR9AHMfb25uUlJRjf8LDw2127BMLrAcffJCFCxf2+LheXl787W9/47HHHuvxsYzi7PkmJTmLx/7yMWPGj+Bvz17VqTU1sQlh/PPlZdTVNnD/zW9TVSHdNR1dfV0D9938Fvm5h3nw2Ss7Ne3Pw9OdP/2/S5lzZgKvPP49a77faYdInZ8j55w9mfl8s3IXl503iTExQ9p8zuXnT2JUdAhPv/4T1TX1do7QcW3ddYCV69NZunga0eGD23zOtb+aTtTwQJ5+/Sfq6hvtHKHjWr8li3Wbs7jm0ulEDAts8znXXzGLIcED+PdLK2hoaOq1WAwtsLTWl2mtQ7XW7lrrMK31K1rr/2it/9P8uNZa36S1jtJaJ2itNxsZr5ls/HYby0bdyidPfsNZy+bzxt6nueLei+nXv/fWUnh4unPB78/ijcxnWHL3Bax8Zy3Xjr6Nn95bd9zCadF14eHhlJRYF2Ju3ryZuXPnAvDAAw+wbNky5s6dS2RkJE899dSx17z55puMHTuWxMRErrzyStavX88XX3zBXXfdRVJSEllZWSxdupSPPvoIgBUrVjBu3DgSEhJYtmwZdXV1x859//33M378eBISEkhLO/luZL9+/Zg5cyZeXl69/En0HmfON6VF5Txy9wcMHR7AA0/9Gk+vzs/bj4wN5S//voy8g6X8808fyr9lB/fSv75jz/aD3P3wYsZO7HxHT1c3V+546GJGJw3nsb98zL6Mgl6Msm9w1Jyjtea5N9cwsL83V13cftd4V1cXbr1mPmVHqvngqy12jNBxaa15/u01DA7w47LzJrX7PDc3V35/zTzyi8r55LttdozQcVksmufeXM3wIYNYfHb7W8p5erpzyzXzOZBXxverU9t9Xk+ZfQ2WOEFdTR0v/fFtPn/2O8LHDOP+j+9i1JRou8bQr78P1z58BfMum8m/f/s8/7j8CX75chO3Pn9drxZ4tvbcba+RtT3bpseMSgznxieuOeVzampqSEpKAiAiIoJPP/30lM9PS0vjp59+oqKigtjYWG644QYyMjJ46KGHWL9+PYGBgZSVlTFo0CDOO+88zjnnHC655JLjjlFbW8vSpUtZsWIFMTExXHXVVTz//PPcdtttAAQGBrJ161aee+45HnvsMV5++eVufwbCvpqaLDz8x/epqa7nn69cSz+/rhfBiZMi+d1dZ/Pcw1/x5fvJnLdkai9EKnrbzz/s4sv3krn4qhnMPC2+y6/38HDjvscv54ZLnuH//elDnvrv9XjIIvs+JyU1l227D3LbtfPp5+N5yueOiR3CrEkjee/LzVx6zgTpKtiBX7buY8/eAu658Qw825m222Li2BFMSBjOe19s5uKzxtml850j+3njXrJzy3jgD+fg3sH2EzMmRhIbFcybn2zgzHnxuLnafrzJ7GuwRCuHMvO5ecqf+PzZ77j4tkU8u/ERuxdXrUWOHcGT6//O0geXsPr99dw48W72bt1nWDyOovUUwY6KK4BFixbh6elJYGAggwcPprCwkJUrV7J48WICA61D4IMGDTrlMdLT04mIiCAmJgaAq6++mjVr1hx7/KKLLgJgwoQJNl0TJnrfl+9uYNfWHG6+91xGRLU93aQzzl0yhYkzonnl399zcL9Dt9vvk46UVfHU3z4ndkwYS289rdvHGRjgy+0PXkT23kJef7rn6zeF43n/y80M8PPm3AUJnXr+FRdOprKqjm9/2tXLkTm+97/cwuAAP86cM7pTz//1hZMpPVzVqyMtzkBrzVufJBMWMpB502I6fL5SimsWTyOv8Cgr16f3SkxSDjuITd+n8I/LnsDF1YV/fHsvk85IMjokwNqw4Yq/XMzYOaP5x+VPcOuMv3DXazcxb4n5O1F1NNJkT25ublgsFsA62tSap+f/7iC6urrS2Gj7+dgt5+it44veUZh3mNefXs6kmTEsPG9cj46llOIPf72Q3130NE89+Dn/79VrpTOYA3npsW+pqarn9r9dhHsP73RPmhXDosWT+ezt9cw7O5Ho0W2vwRHO52DeYdZtzuLqi6fi2cnRyzGxQxgTO4T3v9rCBWck4doLowHOICunmC07D3D9r2d1ukX4xLEjiIkYzIdfb+WcBQmSk9uRureAtKxC7rxuYad//qZPiCIs1J9Pv0vh9FmjbB6T/CswOa01H/37S/6y6B8MHh7IMxsfNk1x1VrCrFH8Z9ujxE0ZyT8uf4I3H/hA1nJ0QXh4OFu2WOewf/zxxx0+f/78+Xz44YeUllo7v5WVlQHg5+dHRcXJjUdiY2PJzs4mMzMTgLfeeos5c+bYKnxhkOcf+RqAm/9imzbJAYP7c82tp7FzSzarvt3R4+MJ+9i2IYsVX6Vw6bWzejSK2do1t55G/4E+PPuPL4/d/BHO78sVO3BxceGCM5O69LpLzh5PXuFRtu462PGT+6hPv0/Bw8ON8xaO7fRrlFKcf3oi+w6UsHuvaRpMms6Xy3fg7eXO6bM7NzII1o2Hzz99LDvTDpGVY/tZG1JgmZjFYuGFO9/khTvfZMZFU3hi3UOERgQbHVa7BgT255Hv/4/Tl87lrQc/5OFfP0lDfYPRYTmE+++/n1tvvZWJEyfi6trxna34+Hjuvfde5syZQ2JiIrfffjsAS5Ys4dFHH2XcuHFkZf2vlb6XlxevvfYaixcvJiEhARcXF66//vr2Dt+m8PBwbr/9dl5//XXCwsKO61Yo7G/7pn1sWJXG5b+bS/CQrm/F0J4zL5pI9OghvPzv76iuqrPZcUXvsFgsvPSvbwkZ6s+S39jupolvf2+u/cMZpO04yPIvU2x2XGFejU0Wvl+dytRxEQT6+3bptbMmj8S3nyffrpJpgm2pb2hkxbp05kyJpr+fd5dee9qsUXh7ufPlj3LTqy3VNfWsWJfG/OmxXV4DePa8MXh4uPH5D9ttHpdMETSpxoZG/v3b//Djm6u54PdnccPjS3FxMX897OHpzp2v3EhY9BBevfe/VB6p5v6P7sDT+9QLZfuSysrKk743a9YsMjIyTvr+Aw88cNzXu3b975fX1VdfzdVXX33c4zNmzDiu8Hn99deP/X3BggVs23ZyN6LWa64mTpzIqlWr2oxb1maZh8Vi4eV/fUdQyADOv3yaTY/t6urCDX86h9uvfJHP3lnP5dfNs+nxhW2t/Ho7+9ILuOefl9q8IcWCc5P46v2NvPXsCuaemSANL5zc5h05lB6u4ux5XW+Q4unhxsIZcXy7ajdVv63rsDlGX7N+8z4qKms7vfaqNR9vD+ZPj2Xl+nT+8JsFeMm/w+OsWJdGTW0D557W+ZHBFgP8vJk5MYqV69O5Zdl8mza7MP8Vex9UX1vPXy9+jB/fXM3SB5dw4xPXOERx1UIpxWV/upDb/nMdm79L4c9n/4Oq8mqjwxLCaaz+did7U/NYestpXWrJ3lmjE4czbd4oPn5jHRXlNTY/vrCN+roG3nh6OdHxQ5l9xhibH9/FxYVrbj2N4oKjfP3BJpsfX5jLtz/tpr+vF9MmRHbr9WfNG0NdfSM/rT/5ZmFf993q3QT492PC2BHdev3ps0dTU9vAL9JI7CQr1qUTFupPfHRot16/cGYcR8pr2GLjjYcd56q9j2iob+DBxf9iw1dbuOXZ33DFXy522EWNi647jXvevoVda9O454yHpMgSwgaamiy888JPRMSEMO/srt+x66yrblpAdWUdH732c6+dQ/TMtx9vprjgKNfednqv3YRLmhJF0pRI3nt5tUwZdWJ1dQ2s25zJ/Omx3W4HPjo6hLCQgb3Wlc1RVVTV8svW/Zw2a1S3R0iSRofhP8CHFevks23tSHk123YdYN60mG5fK08dH4GvjyfL1568B2hPSIFlIo0Njfx9yeMkf72VW5+/jnNvOMPokHps/mUzue/DO8jYnMX/nfsItdXG/4KW5hu9Qz5X+1i3fDe52SVcdt3cXh3ZjogJYfYZY/jsnV84UlbVa+cR3dPQ0MhHr68lftwIkqZE9eq5lv7+NI4eruKr95N79TzCOBu351Bb18icqd3f+kUpxeyp0WzZdYDyytqOX9BH/LJlH01NFuZO7bh9eHtcXV2YOy2GX7bso7qm3obRObY1yZk0WXSnWrO3x8PdjdlTo1mdvJe6ett1UZYCyySaGpv4xxVPsu6zTdz01DLO+V339zExmxkXTOZPb9/C7nVp3H/h/6O+1rjk4OXlRWlpqRQDNqa1prS0FC+vrm9yKzpPa827L60mLDyQGQu6Ppe/q664fh51tQ18+d6GXj+X6JqVX22nuOAol/2297uBxo0dxvhpUXz69nrqbXgBIsxjTfJefPt5Mi5+WI+OM3dqDE1NFtZtzur4yX3Emo2ZBAzsx+huTmFrsWB6LHX1jTJNsJVVv2QwNGQg0RE96546b1oM1TX1bN11wEaRSZMLU9Ba89SNL/HzRxv43WNXccHNZxkdks3N/dUM6mrqeWzZczy05HHu/+hOXDu5D4QthYWFkZubS3GxbKRqa15eXoSFhRkdhlNLXp3O/owC7vjbRXbZa2Z45GCmzInjy/eSWXzNLLy62KFJ9I6mJgsfvLqGqLhQJsywz2bzl1wziz9f9zorv0rhzIsm2uWcwj4amwuiGROjOr0/U3viokIYHODHmg17OWtu15tlOJu6ugaSt+3n9NmjcXHp2XKPsaPCGNjfm3Wbs1gwI85GETqu8ooatuzMYcl5k3q8lGb8mOF4e7mzbnMW08Z3bw3iiaTAMoF3HvqYb15ewWV/upBLbj/X6HB6zRlL51FTWcuzt7zKs7e8yu+f/Y3d15e5u7sTERFh13MKYSsfvf4zg4cMZN7ZiXY75+KlM7nzmpf58fNtnLtkit3OK9q3fkUqh3JKufexJXbLoeOmRBEVF8pHr6/l9AvGO1TjJXFq21NzKa+sZfaUnhfrLi6K2VNG8sXyndTWNfT5jnebdhygpraB2ZNH9vhYLi6KqeMjWL/ZOuWwr2/onJySTZNFM2tKzz9bTw83Jo4dwfot+9Ba2ySv9u3/Oybw3asreeP+9zntqjlc89BlRofT6y64+Swuvet8vvzPD3zw6BdGhyOEw8hKy2fX1hzOv2wqbu72G/2NHz+CuIQwPnlzLU1NsuGsGXzx7gZChvoz3Q7TRFsopbh02Wxys0vYsMq2i8GFsdZtzsLDw40pSeE2Od608ZHU1zeSkpprk+M5srWbMunn48H4McNtcrxp4yMpr6yVTYeB5JT9DPDzZlRUiE2ON3NSFEUlFWRm22aGkxRYBtr03TYe/90LTDwjkdtfut5huwV21bUPX87cJTN4+Z63+em9dUaHI4RD+PzdX/D0cuf0CyfY9bxKKS5ZOov83MNsXCMdrIy2L6OAnVuyOXfJFLvfwZ65cDSDQwfwxbuyJs+ZbEzZT9KoMJuNNiWNDsPDw40NW/fb5HiOSmvNxu3ZTBo7Ancb3RSbnBSOq4vily19ex2WxaJJ3pbNpMQRNsuD0ydEohQ2Wz8oBZZBDqYf4u+XPUH4mGH83wd34NbNtqiOyMXFhbteu4mE2aN4dOkz7JaWrkKcUvmRalZ9s4MF5ybh19/b7uefNi+OwMH9+er9jXY/tzjel+9usBbaF4y3+7ld3Vw5+5JJpCTv4+B+WcfqDApLysnOLWOyjUavADw93RkfP4zklL5dYB04VEZRSQWTEsNtdky/fl4kjBrK+j5eYGXsL+Tw0WqmjrPdkg//AdZGJLb6bKXAMkDlkSruO/+fuHu48bfP78bHz/4XTEbz8HTngU/uImhYAA9e8hglh0qNDkkI0/ruk83U1zVy3pKphpzf1c2VMy+eyJb1e8nPLTMkBgEVR6tZ+fV25p09Fr8BPobEcMZFE3Fzc+WbD2XjYWewKcW6uerkpO5tgNueKeMiOJh3mEMFR2x6XEeycbv1s52UaNvPdvr4SLJyiikurbDpcR1J8rZsAJveGACYnBhOWlaBTbYZkALLzpqamvjH5U9QsL+I+z66k8HDg4wOyTD9B/nx18/uprqihr9e/Jih7duFMKumJgtffbCRpMmRhEcHGxbHmRdNxMXVRS6sDfTDZ1upq23gvMuMKbQB/AN8mbFwND9+vpVa2Y/H4W3cnk3gIF8ihgXa9LhTxoUD9OlRrE3bswkL9WdI8ECbHnfiWGvBtnXXQZse15Fs2Laf2KhgBg3sZ9PjTkwcgcWi2WaDdu1SYNnZK/e8w6bvUrj56WtJmDXK6HAMFx4/jD++8XvSNmby5I0vyf5UQpwgJTmLorwjnL14kqFxBAb3Z9rcOH74bIvshWQArTXffLSZ0eOGExnbs/10eurcX02hsqKW1d/tNDQO0TNNTRY27chhcuIIm68BHxbqT+jgAcdGyPqa+oZGtu46wGQbj14BjAwfTH9fL7bs7JufbWVVHakZeUxJsn1H6PjoUHy8Pdi0veefrRRYdvTzxxv48F9fcu4NZ7DoOufZSLinZl00hSv+cjE/vL6Kz5/9zuhwhDCVHz7bSv+BPkydZ/wNmUWXTubo4WrW/bjb6FD6nD3bD3Iop4Qz7dzkpC3x40cwImqwjGY6uPR9hVRU1jK5Fy5UlVKMHzOMlD25WCx978bprvQ8ausae+WzdXGxfrabdx7okzeld6Tl0mTRTEywTWfG1tzcXBkXP4yN27N7fCwpsOwkL6uAx659jrjJI7nh8auNDsd0rnrgUqaeM4EX7niD9E2ZRocjhClUHK1m/YpU5i9KxMPD+EY4SVMiCRnqzw+fbzU6lD7n+0+34OXtwazTxxgdCkopzrhoAum7cjmwr8jocEQ3bdlpnQY1oRcuVMG6eWtFZS1ZOX2vIcqm7Tm4NhdCvWFCwgiKSir65Bq3bbsO4u7mSnxM74zkz5o0kvCwAGrrGnp0HCmw7KC+tp6/XfpvXF1d+Mv7t+Pu0bc33muLi4sLd71+E4NC/XnoV/+m8kiV0SEJYbiVX2+noaHJkI5xbXFxcWHBuUmkJO+juA/+YjdKbXU9a77fyewzxuDt42l0OADMOzsRF1cXln+xzehQRDelpB4kPCwA/15qmDKuubjYaoP1LI5m+55cYqNC8PH26JXjtxTFm3f2vc922+6DxMeE4tlLm1ifszCB//fni3q8bYEUWHbw/B9eJ3Pbfv74xu8JHtF3m1p0pP8gP+597w8U55bx2LXP9cmhbyFa++GzrUSPHmL4mpvWFp43Dq01K77abnQofcbPP+6iprreNIU2WJtdTJoZw4qvUmQDagfU2GRhZ1oeSfFhvXaOwQF+hIUMZNvuvtWMoa6ugT17C0ga3Xuf7bAh/gQN8mVrHyuwKqvqyNhfxLj43hkZtCUpsHrZynfX8tULP3LpXecz9Rzj586b3eipMVz78BWs+3Qjnz8j67FE35W5J4+stHxOv8BceSM0bBBjxo9g+Rfb5CaInfzw2VaGjgggfpztF8z3xGnnjaO0qIJtG2yzMaewn8z9RVTX1Pf6heq4McNJ2Z3bp4rw3XvzaWhs6tXiVSnFhLHD2bqrb63D2pFmXdMnBVYfl5dVwBO/e4ExM+O45qElRofjMC65/RymnjOBF+96k4wt8otb9E0rvkzB3d2VuWePNTqUkyw8bxy52SWk7cg1OhSnl59bxs4t2Zx23jibd3rrqclzYvEb4M2PsibP4aSkWv/tJvbiKAtYpwlWVteR2YfWYW1PzUUpSIgb2qvnSRo1jCPlNRw41Hf2Juzt9Ve2JAVWL2lqbOKfVz2Ni6sLf3rnVtzcjV+g7iiUUtz12k0MHDyAh694kpqqnm/4JoQjaWqysOq7HUyaHYtff/NtRD7r9DF4ernL+hs7WPXNDgDmn5NkbCBt8PBwY+5ZY1m/cg+V5TVGhyO6ICX1IGGh/gT6+/bqecY3jzRs60N7NqWk5jIyfDB+/bx69TxjR1kLuJ1peb16HjPp7fVXtiQFVi959+FPSf0lg1ufv47BNt7Ary/oH+DHXa/fRG5GPi/d9ZbR4QhhVzs37+dwSSVzzzLf6BVAP18vps8fxervdtDQIHti9aZV3+5g9LjhDA4daHQobVp43jga6htZu1xa9zsKi0Wzfc+hXl0j1CJwkC9DQwayM+1Qr5/LDBoamtiVnkfiqN7/bIcN8Wdgf292pPWNmQRV1db1V/b4ubUFQwsspdSZSql0pVSmUuqeNh5fqpQqVkqlNP/5jRFxdlXaxr289eCHLLhiFvOWzDA6HIc1bn4Cl9x+Ll/+5weSv5EpKKLnHCXnrPp2B94+HkyZHWvE6Ttl7tmJVFbUsnW9bKvQW/ZnFJCTVWTaQhsgJn4ooWH+rPleNh0+kVnzzb4DJVRU1trtQnVM7BB2pef1ibVC6fsKqatvtMtnq5QiIXYoO/b0jeI1dW8+Fovu9WmttmJYgaWUcgWeBc4CRgOXKaVGt/HU97XWSc1/XrZrkN1QU1nDw79+isChg7j56WuNDsfhXfP3y4hIGM6/rn2OI8VHjQ5HODBHyTn19Y2s/XE30+ePxtPLvNMgxk+Lwre/N6vlwrrXrPp2By6uLsw+zfi9r9qjlGLOmWNJSd7HkdJKo8MxDTPnm+2p1ul69rpQTYgdQumRKvIKnf93eMqxz7Z311+1SBg1lNyCI5T1ga1tdqbnoRSMjjb/+iswdgRrMpCptd6nta4H3gPONzAem3jhjjfJzyrkj2/cjO/AfkaH4/A8PN3509u3UHm4iid+90KfuAMmeo1D5Jwt6/ZSWVFr6lELAHd3N2YsGM2Gn9Koq+3ZhoziZFprVn+3k6QpkQwM6N11Mj0158wELBYt0wSPZ9p8sysjn8BBvoQE9bfL+cbEWouNXenOv1ZoV3oeYaH++A+wz/Xf/9ZhOf8o1q70PCKHBdLPJHsBdsTIAmso0HrVY27z9050sVJqh1LqI6WUqfsybvhqC1+/tJxL7zqPxDnxRofjNCISRnDN3y9n3Web+P61n4wORzguh8g5q77dQf+BPoybGmXvU3fZnDMTqK6qY9PaDKNDcTppO3IpOHTY9IU2QHh0MMOjBrP6OxnNbMW0+WZ3Rh5jYkLt1pUyYlgA/Xw82Jnu3EWA1prdGfmMseO+hbERwXh4uDn9NEGLRZOakU987BCjQ+k0sze5+BII11qPBX4E3mjrSUqp65RSm5VSm4uLjWkFWnmkiieuf4GIhOFc/eCvDInBmV38h0Ukzo3n+dtfpzi31OhwhPMyNOfUVNexYVUas08fg5u7q82O21sSJ0UwwL+frL/pBau+3YG7hxsz5rc1q8xclFLMOWMMu7bmUFzg/NPAbMju+ebwUetUvdEx9rtQdXV1IT56iNOPYOUXHeXw0Wrio+332bq7uzJ6ZAg7nLx4zc4tpbK6jgQpsDrlEND6bk1Y8/eO0VqXaq3rmr98GWhzx02t9Yta64la64lBQUG9EmxH/nP7GxwuPMqdr96Iu4d51004KhcXF+54+QYsjRYel6mContMn3M2rLJOt3OEUQsAVzdXZi6MJ3l1OrXV9UaH4zSamiys+WEnk2bF0M+vd1s928rsMxLQWvPzj7uMDsUsTJlvdmcUANh9H6ExcUPYd6CEquq6jp/soHZn5APWph72lBA3lIx9RdTWOe9U7d0Z1uJcRrA6ZxMQrZSKUEp5AEuAL1o/QSnVOgOcB+yxY3ydtum7bXz/+k9cetf5xEww/7QeRxUaGcyyf1zOpm+3sfytNUaHIxyP6XPOuuWp+Af6MnrccHuetkdmnzmGutoGktekGx2K00jdlsPhkkrmnJFgdCidNiwiiKi4UFZ/K6OZzUyZb3Zn5OHq6kJcZHBvn+o4CbFDrNO89ubb9bz2tDsjHy9PNyKG23drnviYITQ1WcjYX2TX89rTzvQ8Bvh5MyzU3+hQOs2wAktr3QjcDHyPNal8oLXerZR6UCl1XvPTblFK7VZKbQduAZYaE237qo5W8fh1LzB81FCuvO8So8NxeufffCbxM2J57rbXKM0/bHQ4woGYPefU1tSzaW0GM+aPxsXF7LO3/2fM+HD8A32lm6ANrVuRiruHG5NmxRgdSpfMPmMM6btyKco/YnQohjNrvtmdkUd0eJDdN2odHR2KUtYLZWe1OyOPuJEhuLnaN3+Pjg4BIDXDiYvX9Dzi7bhu0BYM/S2utf5Gax2jtY7SWv+9+Xv3aa2/aP77n7TW8VrrRK31PK11mpHxtuXFu96iNK+MO1+9CQ8vD6PDcXouLi7c+cqN1NfW89SNL8lUQdElZs45W3/JpK62gRkLHatBjqurC7NOH8PmtRkyTdAGtNasW5HK+Gkj8ennGN2yWsxYYP3ZXb/SlJNN7M5s+aapycKezALi7bj+qkU/H08ihwc5bbe7uroGMvYX2XX9VYtBA/sREtTfaUcHyytqyDlUZveplz3lOLdJTWjr8h188/IKLv7DOYyaEm10OH1GWMwQlj64hPWfb+Kn99YZHY4QNrF2+W78BniTMCHc6FC6bMb80dTXNbJ53V6jQ3F4e1PzKC44yoyF5m9ucaKw8EBGRA1m3Qpp125G+w6WUFPbYPf1Vy3iY0LZk1nglDdGM/YX0dRkMeyzHR0d6rQFllFr23pKCqxuqqms4d+//Q9hMaHSNdAAF/1hEXGTR/LsLa9yuEi6VgnH1tDQSPLqdKbNG+UQ3QNPNGb8CPoP9GHdylSjQ3F465bvxsXVhalz4owOpVtmLBzN7q05HClz/o1PHU3LhaoRI1gAo0aGUFlVR64TTiFt+WxHG1RgjYoOoaC43Ck3HN6VkYeri2LUyBCjQ+kSKbC66c0HPqQwp5g7Xr4BT2/HmsbhDFxdXbnz1RupLq/mhTvb7GwrhMPYvnE/VRW1zFjgeKMWYO0mOHVuHBvXpNPQ0Gh0OA5La83a5amMnRhO/4E+RofTLTMWxGOxaDaskmmCZpOakcfA/t4MCR5gyPlHjbQWH3synW+kZXdGHiFB/Qn0N2ZT8NHR1s82dW+BIefvTXsyCwgfFoi3gy3DkQKrGzK37eeTJ79m0W8XMmbmKKPD6bNGjB7Gr+6+gBVv/8yWH7cbHY4Q3bZu+W68fTwcYnPh9kyfP5qqilq2b9xvdCgOKyeriEM5Jcx0sHV4rUXGhhA8ZCDrVshoptnszsgnPmaIYY0CwocF4Onhxp5M5ysCdu/NN2x6IEBsZDCuLsrppglqrUnPKiQuyr5dL21BCqwuampq4vHfvcCAQD+ufeQKo8Pp8y7/80UMjQ7lqRtfoq7GeffXEM6rqcnC+pV7mDw7Fg87d/aypfHTovDy9mC9TBPstnUrUlFKMc0BNhduj1KKGQvjSdmQRVVlrdHhiGbllbXkHCoztAhwc3UhNiqYNCcrsIpLKygqqTBs6iWAl6c7kSOCnK7AKiwu52hFDXFRjjU9EKTA6rIvn/uBjM1Z3PD4NfgZNBQs/sfDy4Nbn/8teVmFvPPQx0aHI0SXpW7L4ejhKofrHngiD093Js6M5pef9mCxWIwOxyGtX5HKqMRhBAT5GR1Kj8xYMJqGhiY2/ZxhdCiiWXqWtahpmaZnlFFRIaTvL6KxscnQOGwptblgNGr9VYvR0aGkZRZgsThPE5G0rEIAYmUEy7kV55by6r3/ZeIZicz91XSjwxHNxs1P4LSr5vDBo1+wf9cBo8MRokvWLk/Fw9ONSTMdvxPpjPmjOVxSSdqOXKNDcTj5uWVkpeU77Dq81kYlDsM/wFemCZqIWS5UR0WHUl/fyP6DpYbGYUtpmQW4uiiiRwQZGsfo6BAqq+s4mFdmaBy2lL6vEFdXF6IM/my7QwqsLnj21lexNFm45dnfOtRmZ33B7x67in4DfHji+hfl7rlwGFprfvnJuueRt4/jN8uZPDsWNzdXubDuhvXNn9l0JyiwXFxcmDZ/FJt+zqCutsHocATWEawhwQPo7+tlaBwtneCcaSpb+r5CIoYH2n3z5hO1jE4602ebllVA1PBAPD3cjA6ly6TA6qT1n29i3acb+fV9iwmNdLyhSmc3ILA/1z16Janr0/nmpRVGhyNEp+zPKKAo/yjT5jlHs5x+fl4kTYlk/cpUp9zrpjf98tMeImJCCA0bZHQoNjFjwWhqa+rZtiHL6FAE1iLADOtYWoq8tCznWIeltSZjXyGxJrguHDF0ED7eHsemLDo6rTVpWYWGj7p2lxRYnVBdUcMzv3+F8DHDuOT2c4wOR7Tj9Kvnkjg3npfveZuygsNGhyNEhzasTkMpxeTZsUaHYjPTF4wm/2AZ2XsLjQ7FYZQfqSY15QBT5zrm3ldtGTspAp9+niSvTjM6lD7vaEUN+UXlprhQVUoRNzLEadqJFxaXc6S8xhSfraurC3FRwexxkhGs/KKjVFTWEmuCGwPdIQVWJ7xx3/sU55byhxd+h5u74w1T9hVKKW59/rfU19Tz/O2yN5Ywv+RV6cSOGYp/gPM0zJnSvEGuXFh33uZ1GVgsmilOVGi7u7sxfvpIkteky7Rtg6U3r78ywwgWWKcJZh8soaa23uhQeix9n7k+29jIYLJySmhocPwmIi3rBuNMMDrYHVJgdSBrezafPf0Ni647jdHTnOeXn7MaFjuUX919AaveW8e2lTuNDkeIdpWVVJC+K/dYQeIsAoL8iI4fyobV6UaH4jCSV6fjH+BLzJihRodiU1PnxlFWXMHe1DyjQ+nTWqbjxUQONjgSq1EjQ2myaDL2FxkdSo+lZZmrCUPcyBAaGpvYf7DE6FB6LD2rEDc3FyJHBBodSrdIgXUKWmue+f0r+Pr7suwflxkdjuikJfdcQEjEYJ75/Ss01MsCa2FOG9dYC5ApTjQtrMXUObGk78zlSGml0aGYXmNDE5vX7WXS7BhcXJzrV/LkWbG4uCgZzTRYelYhYSED8etnbIOLFi2NLpxhP6z0rEIiTdSEoWUtWMvImiNLyyogcngQHg46c8y5srmNLX97DbvWpnHtw1fQf5Bj70vSl3h6e3LTk8s4sOcQnz75jdHhCNGm5NXpDA4dQES0Y05/OJUpc+LQWrPxZxnF6siurdlUVdQy1clGMgH6D/RhVOJwkmU001BpWQWmWCPUIsC/H4MD/Rx+HZa1CUOBKRpctBgaMhBfH89j00Idlda6uTGLeT7brpICqx1VR6t46Y9vETd5JGcum2d0OKKLpp4zgannTuCtBz+kONd59tsQzqG+roGtv2QyZU6cU275EBUXSmBwf5km2AnJq9Nx93Bj3NQoo0PpFVPnxJGVlk9xwRGjQ+mTDh+tprCkwnSNAkZFhRzb/NhRFRSXU15Za6oiQClFTORgh+/SmFd4lMqqOlMVr10lBVY73nzgQ44UlXPzM79xumkbfcWNT1yDpcnCC3dKwwthLikb91FX2+B0669aKKWYMjuOreszqa+Tabrt0VqzYXUaiZMinGIftLZMnWf9Gd+wSoptIxxrwmCyC9W4kSHkFhyhvLLW6FC6raWIMdPoIDhHo4uWzzZupLluDHSFVA5t2L8zh8+e+Zazf7OA2InOeVexLwiNCOayP13E6g9+YevyHUaHI8QxyavS8fbxYOykCKND6TVT5sZSW1PPjk37jQ7FtHKzS8g/WOa0hTZAWHggQ4YHyDosg7RMFYsxW4HVXJRkOPBaoZYmDGZpcNEiNsrxG12kZxXi7uZK5DDHbHABUmCdRGvN079/hX4DfFj2j8uNDkf00KV3nceQqGBpeCFMQ2tN8po0xk8biYdJFkb3hqTJkXh6ucs0wVPYsMpadEyZ47wdapVSTJkTy/aN+6iprjM6nD4nLauAsFB/fPuZa4S0ZeqXI09lS8sqJHJYoOmaMLQUr47c6CJ9XyFRIwJxd3c1OpRukwLrBD+9u5ada/aw7O+X0z9AGls4Og8vD2566loOpufx8eNfGx2OEGSl5VNSWO6U3QNb8/B0Z/y0kSSvTkNrbXQ4ppS8Oo3I2BAGhw40OpReNXVOHA0NTWz9JcvoUPocszYK6O/nzZDgAcf2OnI0LU0YzDY9EBy/0YXWmvSsQtPsLdZdnSqwlFIuSqlxSqlFSqn5SilzbKZgY1Xl1bxw11tET4jkrN/MNzocYSOTzxrHjAsm8c7fPqLIgYfM+xJnzjnJq9NQSjF5ZozRofS6KXNiKS44yv4Mx71L3VvKj1STmnLAqacHtogfNwJfPy82rNpjdChtctZ8c/hoFUUlFaYsAsDart1RW7XnFx2lorLWdM1DwPEbXRwqOEJldZ1pf24765QFllIqSin1IpAJPAJcBtwILFdKbVBKXaOUcppRsLcf/IjDBUe45dnf4OrquMOS4mQ3PH4NWmv+c/vrRociTqEv5JzkNenEJoQxMMDX6FB63eTZ1qlvG2T9zUk2rc3AYtFMme280wNbuLm7MnFmDBvXZNDUZDE6nGOcPd+0jA6ZdSQgNiqEguJyDh+tNjqULjv22ZpsbVsLR250Yfaf287qaOLoQ8DzwO/0CXM8mu/wXA5cCTh8m7ac1IN8+tQ3nLlsPnGTo40OR9hY8IggLr/3Yl77y7ts+j6FSWckGR2SaJtT55zS4goydh1i6e8XGh2KXQwK9CN2TBjJq9K5/DrZ7qK1jWvS8Q/wJWbMUKNDsYspc2JZ9e0O0nflMjpxuNHhtHCKfNPQ0EBubi61tcd35HOz1PG3W2fhQQV79phv9DA+3Iu/3TqLnOwsCky6HtXLy4uwsDDc3d2P+35Lg4vIEeZswtC60YXZGpx0JD2rAA93VyKGBRgdSo+c8idaa33ZKR4rAp6wdUBG0FrzzO9fwcfPi2sflsYWzuqSO87lhzdW8ewtr/Lijn/h4ene8YuEXTl7ztm4xtrwoS9MC2sxZW4sbz6zgrKSCgYFyrpWgMaGJjav28uMhaP7zDYgE2fG4OrmwoZVaaYpsJwl3+Tm5uLn50d4ePhx++rl5h+mvqGJyOHmLAKamizs3V9E4CBfAgeZb0Rfa01paSm5ublERBzf8TUtq4DI4UGma3DRoqWJSPq+QocrsNKyCokKD8LNzbFnknV2DdbflFJurb7ur5R6rffCsq/VH6wn5afdXPPQZQwI7G90OKKXeHi6c9NTyzi0N5+P//2V0eGIU3DWnJO8Oo3BQwYSHu1Yv/B6YmpzMdlSXArYtTWbqoraY59NX+DX35sx40aQvMp800UdPd/U1tYSEBBw0qbltXUNeHmaswAAcHV1wcPDjVqT7pWnlCIgIOCkkcGWBhdmbB7SwlEbXVgsmoz9hQ69wXCLzt46cwOSlVJjlVKnAZuALb0Xlv3UVNbwwp1vEj0+grOv6xvTdvqySWckMePCyfz37x9TdKDY6HBE+5wu59TVNrBtQxZT58SddCHkzCJiQggKGUCytGs/Jnl1Ou4eboyfOtLoUOxqytw4crKKKMgtMzqUEzl8vjkxpzQ2NtHYaMHL5DM1vDzdTVtgwcmfK0Be4VEqq+pMXQS4uDhmo4vcgsNUVdc7/Por6GSBpbX+E/BHIBnrXORFWutnejMwe3n7bx9TcqiMm5++Vhpb9BE3/HupteHFnW8aHYpohzPmnJSN+6irbXDqPY/aYt0HKY6tv2RSb+ILKXvRWrNhdRpJkyPx8vEwOhy7ahmxM9veaM6Yb1qKFnsVWK6uriQlJR37k52d3anXeXm60dhooaGx/WYMn332Gampqce+vu+++1i+fHlPQ2bjxo3H4k1MTOTTTz/t1Otaipa4keYuAhyx0UXLiJujdxCEzk8RnA08BTwIrAKeVkoN6cW47OJA2iE+fvwrzlg6j9HT+tZFT18WPCKIy/58ET9/tIEtP243OhzRBmfMOcmr0/D28SBhYkTHT3YyU+fEUlfbwPaN+40OxXC52SXkHyw71mGxLxkyPIBhEUFsXGOuaYLOmG9q6xpBgaedpgh6e3uTkpJy7E94eHinXtdSAJ5qFOvEAuvBBx9k4cKezzgaM2YMmzdvJiUlhe+++47f/e53NDY2dvi69KxC3N1ciRxmzrVtLVo3unAUaVkFeHi4ERHm2A0uoPNTBB8DFmutH9ZaXw68BKzs6cmVUmcqpdKVUplKqXvaeNxTKfV+8+PJSqnwnp6zhdaaZ295BW9fL6595ApbHVY4iMV3nseQkSE8e8urNNTLXXUTcqqco7Vm4+p0JkyPxsOk3bJ609hJEXh5e5As7drZ0LwGqa+NZLaYPDuWHZuyqaqs7fjJ9uNU+QasBYuHuxuuBjZRCQ8Pp6TEenG/efNm5s6dC8ADDzzAsmXLmDt3LmPi43jrzZetBSHw5ptvMnbsWBITE7nyyitZv349X3zxBXfddRdJSUlkZWWxdOlSPvroIwBWrFjBuHHjSEhIYNmyZdTV1R079/3338/48eNJSEggLe3k3OPj44ObmzUf19bWdnrqdvq+QqJGBOLubu5ZT60bXTiK9H2FjBzh+A0uoOM27S2maa2PjTFqrT9RSq3uyYmVUq7As8BpQC6wSSn1hdY6tdXTrgUOa61HKqWWAP8EftWT87b4+eMNbF2+k5ueWob/4AG2OKRwIB6e7tz05DLuXfQPPn78a5bcfYHRIYnjOVXOydyTT0lReZ+9qPbwdGf8tCiS16Rzk9Z9ag3aiZJXpxEZG8Lg0IFGh2KIqXNi+fiNtWxdn8ms08cYHU4Lp8k3T766kr3ZRdTUNuDq4oKHR88vVKPDB3PrsvmnfE5NTQ1JSUkAREREdDjdLi0tjZ9++omKigqio2O49jfXUZSfw0MPPcT69esJDAykrKyMQYMGcd5553HOOedwySWXHHeM2tpali5dyooVK4iJieGqq67i+eef57bbbgMgMDCQrVu38txzz/HYY4/x8ssvnxRHcnIyy5YtIycnh7feeutYwdUerTXpWYUsmGn+BjVDQwbSz8eDtKxCznWAFgMWiyZjXxFnzhltdCg20dFGw79WSrm0TjwttNalzZv0zezmuScDmVrrfVrreuA94PwTnnM+/9t/4iNggbLBb+aaqlr+c8cbRCaO4NzrT+/p4YSDmnzWOKafP4l3HvqI4txSo8MROG/OSV6dhlKKSbP6ZoEF1tb0xQVH2ZfuWIuuban8SDWpKQf6VJv+E41OGo5vf29TjGY6a77R2loIuLjY70ZG6ymCnVnLtGjRIjw9PQkMDCQwKIhDuXmsWLGCxYsXExhonXo3aNCgUx4jPT2diIgIYmJiALj66qtZs2bNsccvuugiACZMmNDumrApU6awe/duNm3axMMPP3xSx8ATHSo4QmW1uRtctHBxUcRGBpPuII0ucvMPU11T7xTrr6DjEawAYJtSagvWjjrFgBcwEpgDlAAnDXt30lDgYKuvc4Ep7T1Ha92olDraHNNxE0qVUtcB1wEMH97x/hqe3h5c9cCvGB43BFcnGIYU3XfD40u5dvRtvHDnG/zlvduNDkc4ac6ZNDMGH19PBg7q183QHd/k2bEopdiwOo2ouFCjwzHEprUZWCy6T7VnP5GrmyuTZsWwaW0GTU0WXF0N3QfM6fLNrcvm09hkobyihn4+nngaOCXZzc0Ni8UCcFLh4unp2ep5rtTXN2CxHLfXc4+1nMPV1bXDtVWjRo3C19eXXbt2MXHixHaf1zLdzlGKgNjIYD76ZhsNDU2mn9J4rHmIE3QQhA5GsLTWTwLjgXeBIGBB89eHgCu11hdrrff2epQd0Fq/qLWeqLWeGBQU1OHzXVxcOPMaaWwhICR8MJf96SJWf/ALW1fsNDqcPs9Zc05sQhgXXTnDDpGZl3+AL7FjhrLRZB3k7GnjmnT8A3yJjnfo/gk9NnVOHEcPV5O242DHT+5Fzppv3FxdGDSwn6HFFVjXQW3ZYu12//HHH7f7PJfmQbvpM2bx4YcfUlpqnVFSVmZt5+/n50dFRcVJr4uNjSU7O5vMzEwA3nrrLebMmdPp+Pbv33+s8MrJySEtLa3D5hxpmQUO0eCiRdxIa6OLfQ7Q6CI9qxBPDzdGOEGDC+hEkwutdZPW+ket9QNa699prW/TWr+gtT7Qw3MfAoa1+jqs+XttPqd5E8ABgMzlEjZ16V3nMSQqmGdveUUaXpiA5BznNWVOHOm7cikrOfliydk1NjSxed1eJs2OwcXAxgNmMHFGNK5uLqaYJij5pvfcf//93HrrrUycOPGU2+AopUBBRGQ09957L3PmzCExMZHbb7fOKlmyZAmPPvoo48aNIysr69jrvLy8eO2111i8eDEJCQm4uLhw/fXXdzq+tWvXkpiYSFJSEhdeeCHPPffcsemJ7XGUBhctjjW6cIANh9OyComOGIybsaPaNtOp2xtKqSDgt0B469dorZf14NybgGilVATWJLMEuPyE53wBXA38AlwCrNRa23YMWfR5Hl4e3PjENfzl3Ef49MlvuPSuE6fJC3uTnOOcpsyJ5Y1nlrNxTTpnXtT+NBxntHtbDlUVtX16emCLfn5eJIwPJ3l1OstuO8PocCTf2EBlZeVJ35s1axYZGRknff+BBx447utdu3aRfbCE2roGrr76aq6++urjHp8xY8Zxbdpff/31Y39fsGAB27ZtO+kcrddcTZw4kVWrVp30nCuvvJIrr7yynXd0Mq2tTRgcocFFi6EhA/H18SQtq4DzThtrdDjtamqykLG/kEXzTdP4psc6WyZ+jvXOynLg61Z/uk1r3QjcDHwP7AE+0FrvVko9qJQ6r/lprwABSqlM4Ha6PxdaiFOasmgCU8+dwFsPfkjJIae5gejIJOc4oYiYEIJCBpDcB6cJblidhru7K+OmRhkdiilMnhNLTlYRBbllRocCkm8M5+npTk1dI2auLx2pwUULpRSxUcGmb9V+MP8wNbUNDvXZdqSzE3R9tNZ32/rkWutvgG9O+N59rf5eCyy29XmFaMuNj1/DtfF/4IW73uLe/95mdDh9neQcJ6SUYsqcOH78fCv1dQ14NG8y6uy01iSvTidxciTePp4dv6APmDonjhcf/ZYNq9O54IppRocj+cZg3l7uHC2voaGxCQ93c+4V6GgNLlrERgXzwVdbqG9oNO1nm5ZpbXAR6yQNLqDzI1hfKaXO7tVIhDBYaGQwl91zIaveW0fKT7uMDqevk5zjpKbOiaWutoHtG/cbHYrd5GaXkHegtE+3Zz/RkOEBDIsIMsU6LCTfGM6r+WZLbZ1510GnZxU6VIOLFrGRwTQ2Wth3wLyNLtL3FeLl6caIoaduze9IOltg3Yo1AdUopcqVUhVKqfLeDEwII1z6x/MIiRjMM79/hcaGU7d1Fb1Kco6TGjspAi9vD7NcWNtFy5TIybNjDI7EXKbMiWXn5myqKk+995AdOHy+MfPUus7wcHdDKUVtrbl+77b+XB2twUWLlrbnaSZudGFtcBFs9LYNNtWpd6K19tNau2itvbXW/Zu/7t/bwQlhb57entz4xDXkpOby6VPfGh1OnyU5x3l5eLozfvpIktekO/xFYWclr04jIiaE4CH+RodiKlPnxNHY2MSW9ZmGxuHo+cbLy4vS0lKH/vfk4qLw9HQz1QiW1prS0lK8vLzQWpOeVeiQU9iGBA/Az9fLtJ0Em5os7N1f6FTrr6CDNVhKqTitdZpSanxbj2utt/ZOWEIYZ9q5E5myaDxv/fUD5l02g8AhzjNkbXaSc/qGKbNjWb8ilX3pBU6/6XDF0Wp2pxzg0mWzjA7FdEYlDsNvgDfJq9KYfbr9u4c5S74JCwsjNzeX4uJio0PpkfKKWmrq6qk82p/mrbEM5+XlRVhYmEM2uGihlCI2Mpj05o18zSbnUBm1dY2MGul4xeupdLTa7Xasu4f/q9X3Wt8imW/ziIQwgRufuIbfjLmdl/74Fn96+1ajw+lLJOf0AZNnx6KUYsPqNKcvsDav3YulycKU2bL+6kSubq5MmhXDprUZNDVZjJge5BT5xt3dnYiICKPD6LFvVu7iH8+u4J0nrzHdZrOO2uCiRWxkMO9/tZm6+kbDN6A+UUvhF+egn217TpnNtNbXNf/1eeB8rfU84CfgKHBnL8cmhGGGRIVw6V3nsfK/a9m+erfR4fQZknP6Bv8AX2LHDO0T67CS16QzwL8fsQlDjQ7FlKbMjqP8SDVpOw7a/dySb8wlbqT1AtuMa4UctcFFi7iRLY0uzDfKmZZViLeXO8OcbLZQZ28X/UVrXa6Umon1js7LWBOSEE5ryT0XEhIeJA0vjCE5x8lNmRNHxq5DlJVUGB1Kr2lsaGLz2gwmz47BxcV5Fm/b0sQZ0bi6uRhdbEu+MYHhQwPw8nQjzYRT2Ry1wUWLlkYXZlyHlZZVQGxUMC4uJpkXaiOdzfhNzf9dBLyktf4a8OidkIQwBy8fT254/Bqydx3ki2e/NzqcvkZyjpObMtc6ZW7jGufddHh3Sg6VFbXSnv0U+vl5kTA+nA3Gbj4t+cYE3FxdiI4INt0Iltaa9H2O2eCiRUhQf/r7epnus21sbGJvdvGxAtCZdLbAOqSUegH4FfCNUsqzC68VwmFNO28ik84axxv3v09p/mGjw+lLJOc4uYjoYAaHDjjWwtwZbVydjru7K+OnjTQ6FFObMieOA1lF5OeWGRWC5BuTiIsKZu/+QhqbLEaHckxe4VEqqxyzwUULpRRxUSHH1pKZxf7cUurrG/t0gXUp8D1whtb6CDAIuKu3ghLCLJRS3PTkNTTUNfDS3W8ZHU5fIjnHySmlmDInjq2/ZFJvotbMtrRhdToJkyLw6edpdCimNmVuLADJqwybJij5xiRGjQyhtq6RnNxSo0M5pmXKoqM2uGgRGxXMvgMl1NWbZ8lDeqa14HO2BhfQ+X2wqrXWn2it9zZ/na+1/qF3QxPCHIaODGXxneex4u2f2fnzHqPD6RMk5/QNU2bHUlfbQMrGfUaHYnO52SUcyilhqkwP7NCQYQEMjwxig0HrsCTfmMf/NsU1zzosR29w0SIuKpimJgtZOeZpdJGWVYCvjydDQwYaHYrNyRC4EJ1w2Z8vYvDwQJ6++WWaGps6foEQokNjJ0Xg5e3BRiecJpjcvLZs8uxYgyNxDFPmxLFzSzZVFbVGhyIMFBbqj4+3h6nWCqXvKyTSgRtctGiZ4mim4nVPc4MLZZaNz2xICiwhOsHa8GIp+3ce4IvnpOGFELbg4enO+OkjSV6Tjta64xc4kA0/7SF8ZDAhQ/2NDsUhTJkdS1OjhS2/ZBodijCQi4t1U1yzFAEtDS6cYY1QcFB/Bvb3Nk0nwfqGRrJynLPBBUiBJUSnzbhgMhPPSOT1+97jcOERo8MRwilMnRNLccFR9qWb44LKFo6UVbF7Ww7TF4wyOhSHMSpxGH4DvI1chyVMIi4qmKzsYhoajJ8t4gwNLloopYiJNE+Xxn05JTQ2Wo7tf+ZspMASopOsDS+WUV9Tz0t3v210OEI4hcmzYlFKGbb+pjckr07DYtFMnz/a6FAchqubK5NmxbBpbQZNJuogJ+wvbmQI9Q1N7DtYYnQopO7NB5ynCUNcVAjZB0uoM0FjoZZRShnBEkIQFjOExXeex49vriblp11GhyOEwxsY4EtsQpjRG83a1PoVqQweMpCouFCjQ3EoU+fEUX6kmj3bDxgdijDQsUYXmcaPau/JLMDTw43IEUFGh2ITsVHBNFk0e03Q6CItq5ABft6EBPU3OpReIQWWEF10xV8uZkhUMI//7gXqauqMDkcIhzd1TiwZuw5RWlRudCg9VlNdx9YNWUyfN8opF273pgnTo3F1c3HqvdFEx4YED8DPJJvipu7NJzYqGDdX57hcbhmJM8M6rDQnbnABUmAJ0WWe3p7c+p/fkZdZwNt/+9jocIRweNOap9KtX+n42yBsXruXhvpGpi+Q6YFd1c/Pi4QJ4fzyk+P/HIjus26KG0y6wY0uGhubyNhXyKiRzjOFbXCAX3OjC2M/27q6BvYfKHHa6YEgBZYQ3TJ+QQKnL53Lh499wb4dOUaHI4RDGxE1mGERQaxbvtvoUHps/U976D/Qh/ik4UaH4pBmLIgnN7uEnKwio0MRBoqLCiHL4E1xM3OKqW9oYnS080z1tRavIYaPDu7NLqbJoh1+8+ZTkQJLiG763aNX4effj8ev+w9NTcZ3OxLCkc1YOJodW7I5erjK6FC6raGhkY1r0pk6Nw5XN8feM8co0xeMRinF2h9ljWtf1rIpbma2cWuFWhpcxDtRgQUwKjqE7NxSqmvqDYthd0Ye4HyfbWtSYAnRTf0D/Ljh8aWkbczki2dlbywhemLmwngsTRaHnh62Y9N+qipqpXtgDwQE+TEqaRhrl6caHYowUFzztDwj98Pas7cA/wE+BDtZE4b4mCFYLJo9BjYR2Z2RT3CgH4GDfA2LobdJgSVED8y7bCaTzkzi1Xv/S9EB47vyCOGoouJCCR4ykHUrHPfC+peVe/Dy9mDc1CijQ3FoMxfGsz+jgLwDpUaHIgwyOMAP/wE+hq4VSt2bz+joUKdrwtAy5XFXep5hMezOyGNM7BDDzm8PUmAJ0QNKKW557reg4ambXkZrbXRIQjgkpRQzF8az7ZcsqipqjQ6nyywWC+t/2sPEGdF4erkbHY5Dm9HcIGStE6zJE93T0ujCqLVClVV15Bwqc6r1Vy36+3oxYuigY9P07K2krJLCkgriY6TAEkKcQkj4YK5+8Fckf72Vn95bZ3Q4QjisGafF09jYRPIax9sTK21nLmXFFUybP8roUBxe8BB/ouOHSoHVx8VFWdcK1dTaf61Qy/S50dHO2eUuPnYIqXvzDbkpvLt5bdvoGOcrXluTAksIG7jwlrOJmxLNM79/hbKCw0aHI4RDiksII2Cwn0Ouv1nz3U7cPdyYOjfO6FCcwqzT4snYdYii/CNGhyIMEhsVgsWiydhv/46SLQ0u4pyoRXtr8dGhHCmv4VDBEbufe3dGHu5ursREDLb7ue1JCiwhbMDVzZW7XruJ2qo6nrzhJZkqKEQ3uLi4MH3+aLas20tttXEdrrrKYrHw84+7mDgjmn6+XkaH4xRmLowHYJ0DFtvCNuJGGrcp7p7MfEYMHYRfP+f899yy/smIdVipGflERwzGw93N7ue2J0MKLKXUIKXUj0qpvc3/9W/neU1KqZTmP1/YO04humJ43FCueegy1n++iRXv/Gx0OKIVyTmOY+bCeOpqG9i0NsPoUDotddsBSosqmH3GGKNDcRpDhgcQERPikNMEJd/YRqC/L0GDfO3eSVBrTerefEY56fRAgPCwAHy8PY5N17OXxiYLezILiHfy6YFg3AjWPcAKrXU0sKL567bUaK2Tmv+cZ7/whOiei247m9HTY3n2llcpySszOhzxP5JzHMSY8SMY4O/Dzw60D9KaH3bh4SnTA21t5sLRpKYcoLSo3OhQukryjY3ERYWQlmnfEaxDBUcoO1JNQuxQu57XnlxdXRg1MoTdGfYtsLJyiqmrb3T6BhdgXIF1PvBG89/fAC4wKA4hbMrV1TpVsKGugSd+94JMFTQPyTkOwtXNlVmnjSF5dTrVVXVGh9Ohpibr9MDJs2Lx9vE0OhynMuv0MWit+flHhxvFknxjI7EjgzmQV0ZFlf06i+5MOwRAQpzzFlhg3Q8rK7vIrk1Ejm0wLCNYvSZYa91SNhcAwe08z0sptVkptUEpdUF7B1NKXdf8vM3FxbIXkTBWWHQo1z58Bclfb+WHN1YZHY6wkpzjQOaePZa62gaH2HR415ZsDpdUMvvMBKNDcTrDIwcTGRvCqm93GB1KV0m+sZGWUSR7rhXakXYIP18vwsMC7HZOI4yJDaXJou26xm13Rj7+A3wIcbLNm9vSawWWUmq5UmpXG3/Ob/08bb3F395t/hFa64nA5cATSqk2d2/UWr+otZ6otZ4YFBRk2zciRDecf/OZjJ0zmudue438/cbs49HXSM5xHqOThjM4dACrvjH/hfWa73fh6eXO5JkxRofilOaeNZa0HQcpyDXXlGvJN/YRHxOKq6sLO/Ycsts5d+w5RELsEFxcnGuD4RMd23DYjvth7diTy9i4oU63eXNbeq3A0lov1FqPaePP50ChUioUoPm/bfbg1Fofav7vPmAVMK634hXCllxcXLjrtZsAeOTKp2lqbDI4IucnOcd5uLi4MPfsRLb8ksmRsiqjw2lXU2MTa5fvZurcOLx8PIwOxynNPsM6MrjmB3OtyZN8Yx9enu7ERgaTkpprl/MdKa8m51CZ008PBBjY34fhQwbZrXgtLCknv6icxNFhdjmf0YyaIvgFcHXz368GPj/xCUopf6WUZ/PfA4EZgPRrFQ4jJHwwtz5/Hanr03nnoY+NDqevk5zjYOadNRZLk4WfTXZh3drWX7I4eriKOTI9sNeEDPVnwTlJDPDvZ3QoXSH5xoYSRw0lLbOAuvrGXj9Xy1TEsaOcv8ACSBwdxo49h2hqsvT6ubY3F3JSYPWuR4DTlFJ7gYXNX6OUmqiUern5OaOAzUqp7cBPwCNaa0k+wqHMv2wmp101h3ce+ohda82/nsSJSc5xMBExIYSPDOanb7cbHUq7ln+5Db8B3kyaJdMDe9Nd/7iEMy6cYHQYXSH5xoYSRw+jobGJPXZoKb4j7RDubq7ERTlvi/bWxsWHUVldR1ZO76/t256ai4+3ByNH9I1probs8qW1LgUWtPH9zcBvmv++HpDbgsLh3fz0texam8YjVz7Nf7Y9iu9Ah7oT6xQk5zimuWeP5fWnfqTg0GFChra5lZBhKstrWL9yD2deNAF3J98wU3SN5BvbGhtnbem9fc8hkuKH9eq5du45RFxUMJ4efePfdMtoUkpqLjGR7fVisY3tqdb1V66uRo3t2FffeJdCGMjHz5s/vXMrxbmlPHnDi9K6XYhOmts89W7VN+Ybxfr5x9001Dey8FxZNiNEb+rv503k8EC29/I6rNq6BtKyCknoI9MDAYID+xM6eECvr3E7fLSa7NzSPjM9EKTAEsIuRk2J5uq//opV76/n6xeXGx2OEA4hJGwQCRPC+fGLbaa7MbHiy20MiwgiZkzfuRgTwiiJo8PYmX6Ixl5cK7QzLY+GxibGjxnea+cwo3HxYWxPzcVi6b0cuyOtb62/AimwhLCbJfdcwMQzEnnu1ldJ35xldDhCOIQzLpzAoZxSdm3JNjqUY/Jzy9i1NYcF5yb1iXbDQhgtcVQYNbUNZGa32ZDRJrbuOoCrqwtj+0AHwdYSR4dxtKKG7NySXjvHjtRcPDzciIvq3WmIZiIFlhB24uLiwj1v3YJ/yED+tvhflJdWGB2SEKY387R4fHw9+f7TLUaHcszyL7ahlGL+okSjQxGiT0hqHvnYuutgr51j884cRkeH4uPdt7ZcSBptXdfWm9MEt+4+SHx0KB59aL2qFFhC2NGAwP783we3U5pXxiNXPY3F0vutUYVwZF7eHsw9ayw//7ibqopao8OhqbGJ7z/dwripkQwOHWh0OEL0CYGDfAkPC2Dz9pxeOX5lVR3pWYVMTOhb0wMBhgQPYHCAX68Vr4ePVrF3fxETx47oleOblRRYQthZ3ORobnziGjZ9u032xxKiE864cAJ1tQ2s+naH0aGw8ecMSgrLOXvxZKNDEaJPmZQ4gpQ9ub2yH1ZK8xqk8X2wwFJKMTFxBJt35PTKflibdxwAYHKSFFhCiF52zvWns/DK2bz5wAes/TTZ6HCEMLWY+KGERwfznQmmCX7z0SYGBfkxdU6c0aEI0adMTgynvr6RHc0b1trSlp05eHi4ER8TavNjO4IpSeFUVtWxJ6vA5sfetD0bP18vYiL6zvorkAJLCEMopbjtP9cRNyWaf175NJnb9hsdkhCmpZTirIsnsnf3IdJ39W474VMpOHSYzWv3cuZFE3BzdzUsDiH6oqT4MNzcXNi0I9vmx96y8wBj44b2qTVCrU0cOwKlYGNKtk2Pq7Vm4/YcJiYM7zP7X7XoW+9WCBPx9Pbkr5/ehV+AL/ed/0/KCg4bHZIQprXwvHH49PPk8//+YlgM332yGaXgzIsmGhaDEH2Vt5cHY2KH2HwdVkFxOfsOlDA5Kdymx3UkA/y8iYsKsXmBlZ1bSklZJZMSw216XEcgBZYQBhoU4s+Dn99NRVkl91/4KHU1dUaHJIQp9fP14rTzx7Pmu12Uldi/A2d9XQPffbyZSTNjpLmFEAaZnBhOxv4iDh+tttkxNzTPIJk+IdJmx3REk5PCSd2bT3ml7ZoJbWouhicl9q31VyAFlhCGG5kUwd1v/Z70jZk8fMWTNDU2GR2SEKZ03mVTaGqy8PUHG+1+7pVfb+dIWRUXXjnd7ucWQli1jDJtsOG0+l+27CN08ABGDB1ks2M6oslJ4Vgsmi07bTdCuGHrfoYN8Sd08ACbHdNRSIElhAnMvHAKNzy+lHWfbeLJG15C697bUV0IRzV0RCCTZsXw9Qcbqe+FTmLtsVgsfPLmOqLiQkmc3LfvcgthpNjIYIIG+bJ2Y6ZNjldX38iWnTlMnxDZ5zcNj48Zgm8/T37Zss8mx6usqmPr7gPMmjTSJsdzNFJgCWESF95yNlfcezHfvrKC1/7yrtHhCGFK518+lSNlVfz09Xa7nXPT2r0c2FfMxVfP6PMXYUIYSSnFzMkjSU7ZT11dQ4+Pt233QWrrGpk6PsIG0Tk2N1cXZkyIYu2mLBpt0K59w7b9NDZamDW5bxZYfbNdihAmdfWDv+JI0VHeffhT+gf4ccnt5xodkuiGhoYGcnNzqa01fmNcZzMo1IsxE4bz3surWXhuEq5uvd/N7+M31hIY3J/Zpyf0+rmEEKc2a9JIPv0uhc07DzBjYlSPjrV2UyZenm6Mjx9mo+gc2+yp0Xy/JpXtqblM6OGeYD9v3Iv/AB9GR/fN1vdSYAlhIkopfv/cbyg/XMkLd76JUoqL/3CO0WGJLsrNzcXPz4/w8HAZ8bAhrTWlpaVcduNU7r32A1Z9t5MF5yT16jl3bt7Pjk37ue6us6Q1uxAmMC5+GP18PPh5Y2aPCqzGJgurN+xl+oQoPD3dbRih45qSFI6nhxurN2T0qMCqb2jkl637WTAjts+1Z2/RN9+1ECbm6urKn9+5lVmXTOU/d7zBh//60uiQRBfV1tYSEBAgxZWNKaUICAjAx9ed8Ohg3n1xFU02mMrSHq01bz63Av9AX86+ZFKvnUcI0Xnu7q5MHRfJ2k2ZNPagKdT21FwOH61m/vRYG0bn2Lw83ZkyLoI1GzOxWLq/FnzLjgNU19Qzs4+uvwIpsIQwJTd3N/78zq3MuXQaL971Ju898qk0vnAwUlz1jpbP9fLr5pKbXcLq73b02rm2b9zHzs3ZLPnNHLy8PXrtPEKIrjltVhxHymvYuD2728dYsS4Nby93WX91gjlToikpq2Rn+qFuH+P7Nan4+Xr1yfbsLaTAEsKk3Nzd+NPbtzLvshm88uf/8p/b38Bi6b279UI4khkL44mKC+X1p36krrbni91PpLXm9aeXExjcn7Mulo2FhTCTKUkRDPDz5vvVe7r1+oaGJlZv2MuMiVF4yfTA48yaPBJvL3e+W7W7W6+vrqnn542ZLJgei4d7312JJAWWECbm6ubKPW/dwkW3LuKTJ7/mH5c/QX1tvdFhCQfg6upKUlLSsT/Z2dk2O/Znn31Gamrqsa/vu+8+li9f3uPj/vjjj0yYMIGEhAQmTJjAypUr232uq6sLv73jTIryj/LZO+t7fO4Trfx6O2k7DnLVTQvwkAswIUzF3d2V+TNi+XlTJlXVdV1+/brNWRytqOGM2aN7ITrH5uPtwbxpMaxYl05tNzo1rvolg7r6Rs6Y07c/WymwhDA5FxcXbnh8Kdc9ehWrP/iFuxY+SElemdFhCZPz9vYmJSXl2J/w8HCbHfvEAuvBBx9k4cKFPT5uYGAgX375JTt37uSNN97gyiuvPOXzk6ZEMXVuHO+/vIaykooen79FTXUdrz7xPdHxQ1l43jibHVcIYTtnzB5NfX0jK9ald/m1X67YweAAv2MbF4vjnTVvDNU19axJ3tvl136zahdDQwYyJnZIL0TmOKTAEsJBLL7jXP7y/u3sS8nmpol3s2tt96ZGiL4rPDyckpISADZv3szcuXMBeOCBB1i2bBlz584lMjKSp5566thr3nzzTcaOHUtiYiJXXnkl69ev54svvuCuu+4iKSmJrKwsli5dykcffQTAihUrGDduHAkJCSxbtoy6urpj577//vsZP348CQkJpKWlnRTfuHHjGDLE+ks5Pj6empqaY69vz29uP5OGhiaef+TrHn8+Ld56biWlRRXccM8iXFzk16QQZhQfE8rI8CA++mZrl9YoFxQdZWNKNovmj+mzHe46kjgqjCHBA/jsh67tN5iVU0zK7lzOP21sn1+H3HcnRwrhgOYsnsbwUUP568WPcef8v3LtPy7noj8swtVV2keb1X/++TVZ6fk2PWZUbCjX373olM+pqakhKSkJgIiICD799NNTPj8tLY2ffvqJiooKYmNjueGGG8jIyOChhx5i/fr1BAYGUlZWxqBBgzjvvPM455xzuOSSS447Rm1tLUuXLmXFihXExMRw1VVX8fzzz3PbbbcB1hGqrVu38txzz/HYY4/x8ssvtxvPxx9/zPjx4/H09Dxl3GHhgfz6hnm89uSPrP1xNzNPiz/l8zuya0s2n761nkWLJzM6sWf7wAgheo9SisWLxvPws9+zZecBJo7tXEOF97/agouLC+cslH3t2uPiorjk7PE89dpPpO7N7/ReVh99sxVPDzfOWSCfrZTuQjiYiDHDeXbjw0w9dwIv/vEt7lrwV/L3FRodljCZ1lMEOyquABYtWoSnpyeBgYEMHjyYwsJCVq5cyeLFiwkMDARg0KBBpzxGeno6ERERxMTEAHD11VezZs2aY49fdNFFAEyYMOGUa8J2797N3XffzQsvvNBh3ACXXD2TkaOG8PRDX1BSWN6p17SluqqOf933CcFDBvKbO87o9nGEEPaxcOYoBvb35v0vN3fq+Ucravhy+Q5OmxVHcGD/Xo7OsZ2zIAFfH0/e/XxTp55fUlbJ92v2cPrs0fT38+7l6MxPRrCEcED9BvTj/o/u5Mc3V/Psra9yXeIdXHX/pVxwy1m4e8iCfDPpaKTJntzc3I51oqytrT3usdYjRa6urjQ2Ntr8/C3nONXxc3NzufDCC3nzzTeJiurcJqKubq7c/chibrnseR66410efe1a3LvYvcpisfDYXz6mMO8I/+/lZXj7nHrkTAhhPE8PNy49ZwIv/nctO9IOMTZu6Cmf/94Xm6mta+Ty82Vfu474eHtw4ZlJvP1pMnv3FxEdMfiUz3/j4w00NVn49YWT7RShuckIlhAOSinF6VfP5aUd/yJxbjwv/vEtfptwB798uVn2zBJtCg8PZ8uWLYB1Cl5H5s+fz4cffkhpaSkAZWXW5ip+fn5UVJzcVCI2Npbs7GwyMzMBeOutt5gzZ06n4zty5AiLFi3ikUceYcaMGZ1+HcCwiCBuf/Ai0nYc5Mm/ft7lLQ3efHYF61ek8tvbz2TMhPAuvVYIYZzFi8YT4N+P599cfcrffQXF5bz/1RZOmzWKyOFBdozQcV1+wST8+nnxbAef7cG8w3y5fAfnLkhgaMhA+wVoYlJgCeHgBg8P4qEv/8Tfv/4zSsF95/+Tmybfw8+fJNt836ympiZ+/ngDfzrrIWoqa2x6bNH77r//fm699VYmTpzYqXV78fHx3HvvvcyZM4fExERuv/12AJYsWcKjjz7KuHHjyMrKOvZ8Ly8vXnvtNRYvXkxCQgIuLi5cf/31nY7vmWeeITMzkwcffPBYe/mioqJOv37W6WP49Q3zWf7FNp57+OtO/fxrrfnviz/x3kurOeviiVzw62mdPp8QwnjeXh78ZskMdqbn8fmPbW88rrXmXy/+CMDvrphlz/Acml8/L665dDqbd+Tww5q2G2tZLJp/Pv89Xh7uLF0s+bOFMuJOt1JqMfAAMAqYrLVuc/KsUupM4EnAFXhZa/1IR8eeOHGi3ry5c3NxhXA2DfUN/PjmGt7/56fkZRUSPCKIM5bO47Sr5xASfurh/VPJ3ZvP8jdX8+Nbqyk6UEJoZDD3f3wnUYnhHb5WKbVFa23oTq32zjl79uxh1KhRPQ1btONUn6/Wmlce/56PXl/LlDlx3PX3i/Ht3/Z6gLraBp5/5Cu++2QLC85J4va/XSRdxRxcX8w3wnqRf8dDH7Ez7RDPPLiEuJEhxz3+38828txba/jDbxZw8Vmy9UJXNDVZ+P3975OVU8zzf7/spNG/l95dyxsfbeCeG8/ok80t2ss5RhVYowAL8AJwZ1vJRynlCmQApwG5wCbgMq116onPbU2SjxDQ1NjE2k+S+eaVFWxbvhOtNeHxw5hweiLxM+KIShxBSMTgNltQWywW8vcVkpWSze516Wz6PoWDaYdwcVFMOD2Rs65dwPQLJnW6c6FJLnjsmnOkwOpdHX2+Wmu+fD+Z//zzGwYM9OGK6+cx/5wkfPpZ11XV1zXw84+7efu5FeTnHmbJb+dw1U0LpCW7E+iL+UZYlRyu5IY//5fqmgYe+MM5TEocQWNjE//9fBMv/nct86bF8OAd5/b59uHdUVB0lOvvfReLxcLf7jiPxNFh1Dc08sZHG3jjow2cuzCBP15/ep/8bNvLOYY0udBa7wE6+h8xGcjUWu9rfu57wPnAKZOPEMK66H/OpdOZc+l0CnOKWfPRBjZ/v40vnv2Ojx//CgA3d1f8gwfiF+CLi4sLliYL5aUVHC48SlNjEwDunu6MnTOaRb9dyJxfTSdwyKm7yJmV5Jy+RSnFeUumMmrsMJ79x1c88/cvef6fXzN0eABKKfIOlNLQ0MTwqME88tI1JE3pXDMNITpD8o0xAv19efy+xfzxH5/yhwc/JCzUn8qqWo6U17BwZhx/vvnMPlkA2ELI4AE8cf9i7vr7J9z0f+8xfMggjlbUcLSihrPnj+GO3y6Uz/YEZu4iOBQ42OrrXGBKW09USl0HXAcwfLjsWyJEa8Ejglh8x7ksvuNc6mrqyN51kKyUbPL3FVJWeISKskq01iiliB4fiX/wAIaMDCEqKZzw+GF4eHkY/RbsxaY5p+UzFbbVlVkX0aOH8vhb15G2I5fk1Wkc2F+MtmgmzYph/PSRJE2OlFErYRS5xukFYaH+vPLor/lqxS5Sdh/E29ud+dNjmTY+UvJxD4WHBfDGv6/mix93sCPtEL4+Hpw2axQTx46Qz7YNvVZgKaWWAyFtPHSv1vpzW55La/0i8CJYh89teWwhnImntyexk0YSO2mk0aHYnJlyjpeXF6WlpQQEBMgvHhvSWlNaWoqXl1enX6OUYlTiMEYlDuvFyERfY6Z8I47n7eXB4kXjWbxovNGhOB0fbw+WnDeRJecZOgvXIfRagaW1XtjDQxwCWv9GDGv+nhBCnMRMOScsLIzc3FyKi4t7GJI4kZeXF2FhYUaHIfo4M+UbIYT5mHmK4CYgWikVgTXpLAEuNzYkIYQTs1nOcXd3JyIiwpaxCSGci1zjCOHEDJl8rpS6UCmVC0wDvlZKfd/8/SFKqW8AtNaNwM3A98Ae4AOt9W4j4hVCODbJOUIIe5F8I4Qwqovgp8CnbXw/Dzi71dffAN/YMTQhhBOSnCOEsBfJN0IIaZ8khBBCCCGEEDZiyEbDvUkpVQzkdPLpgUBJL4ZjC44QIzhGnI4QIzhGnF2JcYTWOqjjpzmmLuQcR/j/Co4RpyPECI4RpyPECJ2PU/LN/zjC/1tHiBEcI05HiBEcI84eX+M4XYHVFUqpzUbv+N4RR4gRHCNOR4gRHCNOR4jRbBzlM3OEOB0hRnCMOB0hRnCcOM3EET4zR4gRHCNOR4gRHCNOW8QoUwSFEEIIIYQQwkakwBJCCCGEEEIIG+nrBdaLRgfQCY4QIzhGnI4QIzhGnI4Qo9k4ymfmCHE6QozgGHE6QozgOHGaiSN8Zo4QIzhGnI4QIzhGnD2OsU+vwRJCCCGEEEIIW+rrI1hCCCGEEEIIYTNSYAkhhBBCCCGEjfTJAkspdaZSKl0plamUusfoeNqilBqmlPpJKZWqlNqtlLrV6Jjao5RyVUptU0p9ZXQs7VFKDVRKfaSUSlNK7VFKTTM6phMppf7Q/P96l1LqXaWUl9ExASilXlVKFSmldrX63iCl1I9Kqb3N//U3MkazM3vOcaR8A+bPOY6Qb0ByjrMye74Bx8o5Zs834Bg5p6/lmz5XYCmlXIFngbOA0cBlSqnRxkbVpkbgDq31aGAqcJNJ4wS4FdhjdBAdeBL4TmsdByRisniVUkOBW4CJWusxgCuwxNiojnkdOPOE790DrNBaRwMrmr8WbXCQnONI+QbMn3NMnW9Aco6zcpB8A46Vc8yeb8DkOacv5ps+V2ABk4FMrfU+rXU98B5wvsExnURrna+13tr89wqs/1iGGhvVyZRSYcAi4GWjY2mPUmoAMBt4BUBrXa+1PmJoUG1zA7yVUm6AD5BncDwAaK3XAGUnfPt84I3mv78BXGDPmByM6XOOo+QbMH/OcaB8A5JznJHp8w04Ts4xe74Bh8o5fSrf9MUCayhwsNXXuZjwH3VrSqlwYByQbHAobXkC+CNgMTiOU4kAioHXmof5X1ZK9TM6qNa01oeAx4ADQD5wVGv9g7FRnVKw1jq/+e8FQLCRwZicQ+Uck+cbMH/OMX2+Ack5Tsyh8g2YPuc8gbnzDThAzumL+aYvFlgORSnlC3wM3Ka1Ljc6ntaUUucARVrrLUbH0gE3YDzwvNZ6HFCFyaaXNM/vPR9rohwC9FNK/drYqDpHW/d6kP0enICZ8w04TM4xfb4ByTnCHMyccxwk34AD5Jy+mG/6YoF1CBjW6uuw5u+ZjlLKHWvieUdr/YnR8bRhBnCeUiob6zSE+Uqpt40NqU25QK7WuuXu2EdYk5GZLAT2a62LtdYNwCfAdINjOpVCpVQoQPN/iwyOx8wcIuc4QL4Bx8g5jpBvQHKOs3KIfAMOkXMcId+AY+ScPpdv+mKBtQmIVkpFKKU8sC6y+8LgmE6ilFJY59Pu0Vr/2+h42qK1/pPWOkxrHY71c1yptTbdHQmtdQFwUCkV2/ytBUCqgSG15QAwVSnl0/z/fgEmW6R6gi+Aq5v/fjXwuYGxmJ3pc44j5BtwjJzjIPkGJOc4K9PnG3CMnOMI+QYcJuf0uXzjZtNwHIDWulEpdTPwPdYuJq9qrXcbHFZbZgBXAjuVUinN3/uz1vob40JyaL8H3mn+hbMPuMbgeI6jtU5WSn0EbMXaXWkb8KKxUVkppd4F5gKBSqlc4H7gEeADpdS1QA5wqXERmpuD5BzJN7Zl6nwDknOclYPkG5CcY2umzjl9Md8o69RCIYQQQgghhBA91RenCAohhBBCCCFEr5ACSwghhBBCCCFsRAosIYQQQgghhLARKbCEEEIIIYQQwkakwBJCCCGEEEIIG5ECSwghhBBCCCFsRAosIYQQQgghhLARKbCEqSilJimldiilvJRS/ZRSu5VSY4yOSwjhfCTfCCHsSXJO3yEbDQvTUUo9BHgB3kCu1vphg0MSQjgpyTdCCHuSnNM3SIElTEcp5QFsAmqB6VrrJoNDEkI4Kck3Qgh7kpzTN8gUQWFGAYAv4If1Lo8QQvQWyTdCCHuSnNMHyAiWMB2l1BfAe0AEEKq1vtngkIQQTkryjRDCniTn9A1uRgcgRGtKqauABq31f5VSrsB6pdR8rfVKo2MTQjgXyTdCCHuSnNN3yAiWEEIIIYQQQtiIrMESQgghhBBCCBuRAksIIYQQQgghbEQKLCGEEEIIIYSwESmwhBBCCCGEEMJGpMASQgghhBBCCBuRAksIIYQQQgghbEQKLCGEEEIIIYSwESmwhBBCCCGEEMJGpMASQgghhBBCCBuRAksIIYQQQgghbEQKLCGEEEIIIYSwESmwhBBCCCGEEMJGpMASpqeUmqWUSjc6DiGE85N8I4SwF8k3zksKLNEhpVS2UqpGKVXZ6s+QXjyfVkqNbPlaa/2z1jq2t87XfM6rms/7m948jxDi1Jw53zSfq6rV+3q5N84jhOgcJ883rkqph5RSeUqpCqXUNqXUwN44lziZm9EBCIdxrtZ6udFB9AallD/wZ2C30bEIIQAnzjdAotY60+gghBDHOGu++SswHZgGHADigVpDI+pDZARLdFvznZ+Frb5+QCn1dvPfw5vv1FytlDqglCpRSt3b6rmuSqk/K6Wymu+sbFFKDVNKrWl+yvbmO0m/UkrNVUrltnrtKKXUKqXUEaXUbqXUea0ee10p9axS6uvm4yYrpaI6eCsPA08BJbb4XIQQtudE+UYIYXKOnm+abxzfBvxWa52jrXZpraXAshMpsERvmwnEAguA+5RSo5q/fztwGXA20B9YBlRrrWc3P56otfbVWr/f+mBKKXfgS+AHYDDwe+AdpVTrIfYlWO/c+AOZwN/bC04pNRmYCPynJ29SCGEKps43zdYopQqUUp8opcK79zaFECZg5nyTADQClzTnmwyl1E09ereiS6TAEp31WfMdlSNKqc+68Lq/aq1rtNbbge1AYvP3fwP8RWud3nxnZbvWurQTx5sK+AKPaK3rtdYrga+wJrMWn2qtN2qtG4F3gKS2DqSUcgWeA27WWlu68J6EEL3L6fJNszlAOBAH5AFfKaVkqr4QxnLGfBMGDABigAjgEuABpdRpXXh/ogcksYvOuqCbc5QLWv29GmvyABgGZHXjeEOAgycURDnA0E6c80Q3Aju01hu6EYcQovc4Y75Ba90yRaheKXUrUA6MAnZ2IzYhhG04Y76paf7vg1rrGmCHUuo9rKNqP3YjNtFFMoIleqIK8Gn1dUgXXnsQ6M5ahTxgmFKq9c/ucOBQN461ALiwefi8AOti0H8ppZ7pxrGEEL3L0fNNWzSgbHQsIYTtOHq+2dH8X93qe7qtJ4reIQWW6IkUYIlSyl0pNRHrEHRnvQz8TSkVrazGKqUCmh8rBCLbeV0y1rs2f2w+71zgXOC9bsS/FOvd46TmP5uxzm2+t91XCCGMkoID5xulVLxSKql5Abwv8C+sF057unosIUSvS8GB843WOgv4GbhXKeXZvD5sCdYph8IOpMASPfF/WO/SHMZamPy3C6/9N/AB1sWc5cArgHfzYw8AbzTPh7609Yu01vVYE85ZWLv+PQdcpbVO62rwWusjWuuClj9APVCutT7a1WMJIXqdQ+cbIBh4v/n8+7CuxTpHa93QjWMJIXqXo+cbsK7dGgGUAl8D/6e1XtHNY4kuUlrLiKEQQgghhBBC2IKMYAkhhBBCCCGEjUiBJYQQQgghhBA2IgWWEEIIIYQQQtiIFFhCCCGEEEIIYSNOt9FwYGCgDg8PNzoMIUSzLVu2lGitg4yOo7dIzhHCPCTfCCHsqb2c43QFVnh4OJs3bzY6DCFEM6VUjtEx9CbJOUKYh+QbIYQ9tZdzZIqgEEIIIYQQQtiIFFhCCCGEEEIIYSOGFlhKqVeVUkVKqV3tPK6UUk8ppTKVUjuUUuPtHaMQwjlIvhFC2JPkHCH6LqNHsF4HzjzF42cB0c1/rgOet0NMQgjn9DqSb4QQ9vM6knOE6JMMLbC01muAslM85XzgTW21ARiolAq1T3TtW7NnP796/B0WPfwar6zchMWijQ7J7jILSrjuhY857W8v87ePVlBdV290SHZ3uLKGP//3OxY++BK/f/VzDpUdNTokcQqOlG9Kqqu57svPmPP6y7y9I8WIEGyqrrGRP634gRmvvsAja1dj0Y6dM7XWPL3xF2a+9iK3fvc1VfWOn/8+3ZPKvDde4deffkheRbnR4TgFR8g5z6WtZuH3T/Jc2mq0yf9dZpUXc+mql7h89ascqDzVx2o8rTVP7F7Bad8/yat71xsdTofSjxZy8U8vcuWa18mvNve1jNaah3d8x2nfP8k7+zYaHU67jB7B6shQ4GCrr3Obv3ccpdR1SqnNSqnNxcXFvRrQqt1Z/P6Vz6ltaCR0oB9PfL2WR79Y3avnNJuDJUe4+pkPSM8rZsywYD7asJMbXvqUhsYmo0Ozm+q6Bq574WO+S8lg7IhQtmQd4qqn36ekosro0ET3dSrfQO/mnCaLhd999Rk/H8hhkLc3961awTd70216Dnu7b9UK3t+9k+EDBvLi1s08mWz+C45TeS1lK49vWM9Qv/58vTedO3/8zuiQeuTnA9nc8eO3+Hl4sKOggGVffEp9U9/J5wYy9BpneV4aT+9ZhQKe3rOKlfnmzTMNliZu3/QRByrLyKwo4q7Nn5i6IPzy4E5eyFiLBc2ju35kXWGW0SG1q76pkVuSPyCv+gipR/O5Z8tnpv5sP8jewptZyQA8tP1btpUe7OAVxjB7gdUpWusXtdYTtdYTg4J6b/uL0opq/u+9H4gdGsS7t17OyzdcwuUzk3j7522sT3fqzrDHWCyau9/5FqUUb9+yhMeXnsvDl5/J1v15vPpT32kd+8TXa0nPL+bJa87l31efw2s3Laa8po773v/R6NCEHfRmzvksfQ/bCvL5x/zT+HDxZYwZHMxDa1ZR19ho0/PYy66iQj5M3cXvJkzi3Yt/xfmxo/jP5o0cctBRkiO1Nfx7wzrmhUfy3sW/4s5pM/k+ay/rDjrm7wCL1vx19UoiBvrz4eLLeOLMRWSUlvDOzu1Ghyaa9Ua+0VrzXNpqovwC+XLhjUT4BvBM2irTXlivzE8no7yIB8adw91jzmDH4UOsKcw0Oqw2WbTm+fQ1jBoQwjcLbybUewDPpZn3RvzXubs4UFXGPydcyB9Gz2djSTabSs2ZzxotFl5I/5kJAcP5bMENBHr241mTfrZmL7AOAcNafR3W/D1DvLxyIxW1dTx82Zn4eLoD8IdzZjEicCCPfrG6T0wV/DYlnZ0HCvjj+XMYFjAQgLPHx3Ha2JG8vGIjxeWVxgZoB/sKy/jgl+1cOi2RWaMiAIgdEsTNZ07n5z372ZBxwOAIRTcZnm+01ry2bQtxgUFcEDcKNxcX7po+k4KqSr5y0FGsV7dtoZ+7OzdMnALAndNnYtGaN7dvMziy7nlv106qGxq4c/pMlFJckzSeIJ9+vLTFMW8wrc7Zz77Dh7l1yjQ83dyYHxHJ5CFhvLJtM00Wi9HhOTvDck7qkXz2HC3g11FT8HJ158qoKaQdLSTtaKE9Tt9lH2ZvZYjPAE4bMopzh4/F38OHT3NSjA6rTSllB8muLOXqkVPxdHXjyqjJbC07SI5JpzV+nLONKL8gZgWP5JLw8fi6efJ5jjlvsKwvyiK/ppyrR06ln5sHv4qYyPqiLAprzHfDzuwF1hfAVc2ddqYCR7XW+UYEUlZZzQfrd3DexNFEhQQc+76Xuxs3nDGNzIJSftpt3iFgW9Ba8+rKTUSHBnLO+FHHPXbbolnUNTby7lpz/qO0pbfWbMXNxYUbz5h63PeXzEgkeIAvL68w75xgcUqG55sdRYWklhRzRUIiSikAZg4bQaS/P5/s2W3PUGyivK6Wr/emc8noMfT39ARgqF9/FkaO5NO0VIe7gNda896uHUwdOoxRgdaRBE83N5aMSeDnA9kUVjreDaZ3d+5gcL9+nDUy5tj3rkocR15FBcmHcg2MrE8wLOf8VJCBAs4YMhqAM4fG46oU3+el2uP0XVLVUMfG4v3NMbrg4eLKWWHxrCrIoK7JfCP7K/LScFcuLAiNA+CssDEAfHfIfDm8rK6KbaUHOWPoKJRSeLm6s3BIHD/m76HBYr5pwisL0vFxdWd2cDQAi8IS0MAPeXuMDawNRrdpfxf4BYhVSuUqpa5VSl2vlLq++SnfAPuATOAl4EaDQuWLTanUNzZx1ZyTu6iekRjDEP/+vL/euYuLrfsPkZFfwhUzk3BxUcc9NjxwIAvGjOT99dupazBfwrOVo9W1fLVlD4vGj2KQr89xj3m6u/Gr6YkkZx5kf5E571T1ZY6Qb77NzMDNxYVzY+Jax82i6FiSD+VSXOVYa/xW7NtHg8XC+bHH35A5NyaOkupqh7uATy0u4kD5Uc6PO/n9aOCbzAxjAuumyvp61hzIZlF0LO6urse+Pz8ign7u7nyZkWZgdI7PzDlnVUEGSYOG4e9p/T3m7+lDgv9QfinaZ68QOu2X4v00aAtzmi+qAWYOHkmdpZFtZeZbf7MiP50pQRH4ultvKoV492fUgBBTfrZrCvZiQTM/JPbY9+aERFPRUMfuI4aMZ7RLa83qgr1MHxyFp6sbABF+AQzv52/Kz9boLoKXaa1DtdbuWuswrfUrWuv/aK3/0/y41lrfpLWO0lonaK0NmYOhtebj5F2MCx/CyJDAkx53c3XhvImj2LD3APmHzTdMaSsf/rITP29Pzh4f1+bji6eNpbymjp/37LdzZPbz9dY0ahsauWxmYpuPXzglHjdXFz78ZaedI7OflOw8LnrsLfbmlxgdSpc4Qr5ZuS+LyUPDjo32tFgUHYtFa37YZ841B+35LiuDUF9fxgaHHPf9eeER+Li7833WXoMi657vszJxUYqFEVHHfX/koABiAwL5PtOx3s+q7H3UNzVxRlT0cd/3cnNnQWQUP2ZlOnzHRyOZNeccqa9h95F8ZgWPPO7704Ii2XU4j/L6WnuE0WlrizLp5+bBuID/zaacHDgCN+XC+iJzzRwqqq0gp6qMGYOPzxGTA8PZVnbQdCNuG4qzGeThw+iB/2teOTkwHIDkYnNdy+2vLKWgpvykn9upQRFsLMmm0WQzIsw+RdAUUnMLyS4+zIWT49t9zvmT4tEavtxivmFKW6htaOSn3VmcnhiNt4d7m8+ZPHIYgX4+fLXVee96fp+SzsiQAOKGDm7z8UC/fsweFcH32zOcdk3ejzv2kl10mJCBfkaH4lRyjhwh83AZC064eAeIHhRAqK8v6w86zvq+hqYm1h88wLyIKFzU8SPe3u7uTBoS5nCNIVbn7Gd86BACfHxOemxOeATbCvIcqmX76pxsBnp5MSF0yEmPzR0RQVltDanFRQZEJnrTzsPWZV7jA4Yd9/2pgyOwoNlisgYH28tySRo0DHeX/42y9nP3JHFQGBuLzRVrSql1VD7phM92SlA49ZYmUkw24rat7CDjAoYfm5IOMMizH3EDgtlgsgKr5bObEDD8uO9PDYqkqrGe3UfyjAirXVJgdcKKnVm4uijmjTn5wqdFWMAAxo4IZcVOx7rD3Fnr0rKprmvg9LEx7T7HzdWFM8fFsjp1H5W1dXaMzj4Kj1aydX8eZybFnvJ5p42NpuhoJTsOmGt43Ra01izfkcm0mOH4eXt2/ALRaT8fyAasozsnUkoxfdgINuQecJgRhV1FhVQ1NDA9bFibj88YNpx9hw9TUFlh58i6p7yujt3FRUxr5/3MGj6CBovFoaY9Jh86yJShw3B1OflSYMawEQCsPWCuC1jRczvKclHAmIHHF9YJA4figmLnYfNcqFY11pNxtIjEQSfvmDHWfyh7juabaq3Q9rKDuLu4MnrA8aP245uLgu1l5skPpXVVHKgqI2lQ2EmPjRs0jF2H80z1+yalLJf+7l5E+B0/k6xlZHOXiX5uQQqsTlm5K5MJkWEM7Od9yufNi48kNbeIgiOOccHQFT/u2MtAHy8mj2z74qLF/DEjaWyyOGUnvZbi+fTE6FM+b87oSNxdXflhu2NNF+qM1NxC8g6Xc9rYU38Gous25x8iuJ8vIwYMbPPx6WHDOVxbyx4HGVH4Jdd6t3HK0PYLLMBhRuU25eVi0Zqp7byfiaFD8XR1c5j3k1t+lNzycqaGnXxxBRDUrx9xgUEO835E520/fIiR/QfTz/34m2Tebu6M7B/ELhONBOw+nIcFTaL/yT+nY/yHUG9pIqPcPDkxpSyX0QNC8WheI9RigIc3w/r5m2pdU0ux11aBFT9wCJWNdabqfJhSlkvioLCTZkQEe/kR6NnPVD+3IAVWh7KLD5NVWMb8U4xetWh5zqrd5lts1xMWi2Z9eg4zR4Xj5nrqH5mk8FD8vDz5eU+2fYKzo3Vp2QwPHEjE4EGnfJ6ftyeTo4c55Vq0Nan7UQrmxkcaHYrT2Zx3iIlDhhw3VaO16c0FSUvhYnYbcg8SExDY5nQ6gNjAIAZ5ebPhkOO8Hw9XV8a3MZ0OrN0EE4KD2VZgrl/y7Wn5OZoaNrzd50wIHUJKYb6p7mKLntFas6PsEIn+be6hzhj/Iew8fMg0+2G1TGdMaCPelu/tOmzY7j3HabRY2H0kv83RNoD4gaGmKrD2HC1AwXHrr1qM8bfmuVSTFC21TQ1klRcT30asSiniBw6RESxHsy4tG+jcBWXE4EEMCxjA2jTnurBOyyvicFUN02PDO3yuu6sr02KH83PaftMkaFuob2xkU9ZBpseO6NTzp8UMJ7v4MAWHnWs085eMA8SHBXc4miu6Jq+inLyKCiYOafsXM0Cwry9D/PzYUVhgx8i6x6I1KQX5TDrF+3FRisSQUHYUmP/9AGzNz2NscAiebm7tPmdcSCi7i4ocYlPorfl5DPD0InpQQLvPGRcSSmV9PZllpXaMTPSmvOqjHG2oOXYBfaIxA4dwpL6GvJqjdo6sbRnlRQz28jvW7bC1MJ+BDHD3ItUkRcuBqjLqLI2MaqMIAGshc6j6CIfrqu0cWdsyjhYyrN8gfNw8Tnosyi8ITxc304wKZVWUYEETOyC4zccT/Iewr6KE6kbzrIGVAqsDyXsPMixgAEMHDejwuUoppkQPZ8u+QzQ2maubSU+sT7fOwZ8W0/6dztZmj4qguLyKtEPFvRmWXW3bn0dNfSMzOllgTY+xPu+XDOdZv1BZW8eOA/lMi+ncZyA6b0u+9ZfYhND2CxKApOBQtjtAgZV95DCVDfUndQ88UWJwCHvLSqmoM/eazYamJlKLi0ns4P2MC7FOWXKExhA7CwsYGxx80nSb1sY1j9ZtyzfHRZboub0V1p/N6P5tN2qK6W+9gM0sN8fv773lRcS0E6tSipH9B5sqVmj/sx09wFp4ZZSbYzPnjPKidgsWNxcXovsPNs30y73NG2C3/HyeKLp/MBY0+yvM091YCqxTaGyysDkrl8nRp1531NqUkcOorK1nzyFz/FDawvr0HOKGBBHo169Tz5/afAG+Kcs8izl7an16Dm4uLkyK6tzPwsiQAIL692O9ExVYmzJzabLoThfaovN2Fhbg6epGXPPmte1JDAnhYPlRSqvNcQe0PTsKrb8MEwa3/cuwRWJwCBprQwwzyywrpa6pkTEdvJ9xIdYLqK0F5rij3p66xkYyyko7fD/hAwbi7+Vl+vcjOq+lGBnp13YRENU/qPl5xl/DNFosZFUUt1uwAIz0CyKzotgUM2YyygtRQJTfydv5AIxs/myzTFAE1DQ2kFNZ2m7xCtZRrCyTFK8Z5UV4urgxvF/bSzSiW35uK8wRL0iBdUpph4qoqK1jysjOX1BOam4CkbzXORYG1zU0kpKdz9QuXFQHD/BlWMAAtuxzngJrc1YuCcND6Od18lB6W5RSTI0eTvLeg6ZI/LawYe8BvD3cSAxve/qD6L7dxcXEBgbi1kY3t9YSg62fvdlHsXYWFeDl5sbIU0w/A2vBCOZ/PzuKOlcwBvv6Eurry84ic7+ftJJiGi0WEgafekROKcXY4FB2mrwAFp2XWV7MYC8/+nt4tfn4QA9vAj19TVEEHKgqo97SdMoiYGT/IMobaimurbRjZG3bW17M8H6D8HJteyubwV5+9HPzIMsERUBWRTGa9keEAKL6B1JYW0FFg/H7oqWXFxLVP6jd35HD+g3CXbmYZjQTpMA6peRM6yLgSSPb7rLUlgA/H6JDA0ne6xgLtzuSmltIQ1MT4yJOPXXpRBMiw9i675BT7AVV29BI6qEixkd29TMYyuGqGrKLD/dSZPa1bX8eY0eE4nGKNSii67TWpBYXER/U/kVEi/igwSgw/TqsnUWFxAcN7rBgHOjlzYgBA03/fnYVFeLr4UH4QP8OnxsXOJi0YvP8km/LsYIx+NQFI8CowCCyykqpbzJPK2zRfZkVRcdGUtozsn8QmRXGj2C1TKWLbmcaG8DI5uJrrwni3VteRMwpYlVKEeUXxD4TFK8tn23MgFOPDoI5RtxONVUUrFMaw/0CTVG8tpAC6xRS9ucRHuTf6alxLSZGhrE9J58mk+0q3R3b9lvn3id1cdRiQuRQjlTXklXo+Iujdx0ooLHJwriIthcFtycp3Pr8lGzHn15TXVdPel7xsfckbCevooKjdbWM6mB6IEA/Dw9GDPQnvdT4X3jtabJY2F1U2OH0sxaxgYGmfj9gLRgTBp96vVKLUYFBZB0uM3Wji11FhQR4ezPEt+PNwkcFBdFgsZAljS4cnkVr9lWUHLtwbs/I5qlhRs++aJmeFunb9pQ7aFUEGDxyUdfUyIHKsg4/2yi/IFOMsmRXluKmXAjzaf+mUVTze9lncNFS2VBHcW0lke1MvWwx0i9ICixHoLVmx4H8bk2HGjsihJr6BjILHP8X0rbsPEYEDmSQb9utltszIco62rNlnznap/bE/4rMrhUXEYMH0d/bk+3Zjr9AfOeBAixaS4HVC1oaInRmBAsgNsDcBUnO0SPUNDZ26f3kHD1CbWNDL0fWPU0WC2klxZ1+P6MCg2jS2tSd96wjpsHtbgnQWkvhv6fEPBcuonvyq49S09Rw7MK5PSP7B1Hd1GB4J8GcqsOEevfH263tKXcAAZ79GOjhbfiFdW7VYSxoIvxOPS06yi+QkrpKjtbX2CmytuVUlhHWz/+UswyG9huIp4ub4cVrTqU1l47o18Fn2z+Ig1WHqTHJ7xIpsNqRW3aUssoaxo7oeoGV2PyaHTmOPXKhtWZ7dj5JXRy5AQgbNIBAPx+H/wzAWmRGBg9igE/bc9bb4+KiSAwfQooTFFgto3BjR5x6zYbout3FRbgo1WGDixZxgYHkHDlMTYM5fomcKKPU+sswJuDUdxtbxAUGYdGavWXm2dCytZyjR6hvaur0+xkVZO6CpMliIbOsjJiAU1+stAgf6I+nqxtpJn0/ovNyqqz/xkb4nnovx3Bf68+G0ZvMHqgsY4TvqX9OlVKM6BfAgSpjp+IfaP5s22vC0CLy2KiQsTfJcirLGNFBrK7KhQi/AMOnCLb83IZ38HMb4RuABg5WmeN3iRRY7diRY10TkNiNAissYAD+/byPHcNRZRcf5nBVDeO6MWqhlGLM8BB2HnDsz8Bi0aRk53V5emCLpPBQsgrLOFpt/CLRnkjJzmNkSAD9vbtWZIqOpZUUEzHQH2/39u/SthYbEIQGMkw6QrK3zPrLOMr/1L8MW8Q2Fy5mvYDf2/w5R3eywBoxYCBebm6mLbAOlh+lrqmx0+/HzcWFmIAA074f0XkHO1kEDGt+3OgL1QNVZQzv1/G6x+G+/oYXgzmd/GxbioQDBn62WmsOVJV1WGiD9Wcht9rY4rXl/+2wDj7bls/e6GK7hRRY7diRk4+3hztRwZ27y9eaUoqxI0LYccCxR2+2N49adHda2JhhIWQXH6aixtx73JxKS/xJI7pbYFlf58jTBC0Wzfac7k2XFR3bW1baYbe91mIDrRfG6Sa94N1bWkpY//708+hcx82WgiS9xJzTHvc2j8iN7GTB6OriQmxAoHkLxub3c6oNhk80KjDItO9HdN6ByjI8XFwJ9u5/yucFe/vh7uJq6IVqeX0th+urOyxYAIb186eg5ij1TcatezxQWcYAd682N0RubajPQBRw0MDPtqi2gpqmhg5HBwGG+QzkYNVhLAaux8upLCPYy++UU0XB+nMAxt8YaCEFVjt25OQzZlgwbq7d+4jGjghlX2EZ5TWOO3KRmluEj6c7EYM7d2FxooTh1ulkuw86bovf1Fxr7PHDOrdg/0RjhgWjlGN/BgdKj1BRU0ficCmwbK2+qYkDR48wclDn/40N7z8Abzc3067DyigrJXpQ50ZHwFqQRA8KIK3UnBfwe8tKGerX+YIRrKNye006wtgy8tmVoj4mIJDSmhrKasy9/5o4tQNVhxnWz7/DZi2uyoVhPv6GFgEHjk1n7PjndHi/Qf+fvf8Ob2w773vxz0IHSIAE65CcGZJTz8zp54yOerctyWqOJcVyfrZkO45j5+rGim/cE1txnHvtX3xTnMhOFDmWe4ksy8eWYklH3ZZ0dHqbXsgZVoAkQIDoZd0/NjbI4YAkym4g1+d5znM4ILDXuxc2117f/TYkMJ9NmmvULtzMJDjahEfI5/ZwKBixdW51j1BTHqzeAYrVCrF82myzdmQ2s9rUddDnC9LnDSgPlpMplMpcnI+3lX+lc19tM/rize7dWJ+fW+au8WFcrr0ToRuhi5IXb3VvmOD5uRgBr6dtkRny+5gaHuB8FzeevjCn2X62TZGp2JnZZJKKlByPNr/ZdbtcnHRooYtytcqNxBonm8zv0Tk9NMRlB54PaAKr1fM5PjDASjbLet55D9iurK0wHg7T24Jg1MM9ryWc8WRY0R5ayF1z97IjPVFbPQH1kLsmRIB+TrM22tva3A7YKrBmakUjpvYoGgGbXiE7Qxq1XLzumNutKIHVgKtLK5SrVc4ebq5qVCPO1D6re0C6jUq1yqWFOGcPt7+p7gsFODrUz4td7L05P7fMqfHhtj2ZAGcmRuoipRu5MLeM1+3m2Gh7IlOxM1cTujehtbk91h/lhgM3u7PJBKVqlVMteEcAjvVrgiRVcFY4cbla5fraWlvnA3Ddgd/RldXVlsIDQROMANcdWohEsTdSSm7VPFjNcLQ3ys2NNdtKteuV45rLwdJzxuzZWBerFeYzyaYF1uGefns9WJk1vC43h0K7h4rCpni9tWGPvelSnrUmQ0XB/gcDW1ECqwEX57VQlTMT7QusvlCAiYEIlxacGfayFzdia+RL5Y5EJmherG4tdFGtSi7Oxzu6DgDOHh5heX2D1XR3htecn49xanwIr9tttyn7jmu1DeuxJvN7dI5FB1jc2CDrsEqCl1ssCKFzLKptom4knfHkUefmepJitdJSOB3AsQFnenwq1SrXEmstC6zxcAS/2+O481E0T7ywQa5SasojBJonIFspsVrImGxZY25uJDgUjBBw7138Z8AXIuTx2baxXsgmqSKbntujPQOsFDbIlosmW9aYW5kEh0P9uMXeEmAs2IdbCNvm9uZGc8VDdI72RFnIrlN2QB9aJbAacGE+Tm/Ax8RAX0fHuWtipC7Wug3d43KmU4F1eJTY+gZrG90nLm6uJskUitzd4Rzoc3ixC8MEpZRcmIt1LDIVjbmaWGU8HCbUZAVBHV2QzDhMkFxdW0XQfEEIHV1gOs0r12oFQZ0jkT68LhfXE876fm6m1ilWKi2fj0sIpqNRrjnsfBTN0+pGdbNggD3f+Vy2eW+bEIKjPVFmbfKybM5tc/Yerr1vzqa5XcgmmQj1N/Vej8vFeKifWzblt+l5dYd7+pt6/5GeAcqyyqLNPdxACayGXJyPcaqD3COd0+PDzK4kyBbseUrRCefnO8s90jk1Xqt41oWevPO10MZOReZdE7W+OF0osBYSKVK5QsdzoGjMtbU1TrSQf6UzHXVmCNr1RILxcKTpkvM6R/v6cQvhOEGiz2+zJed1PC4XU/1RB34/7Z2P9hnnnY+ieeb0jWqoOREwWS95bZdXaJ3xYH/T79dyb+yxVd/MNytajtosXuezScZDzTsQ7Ay705tdjzc5t0d6azljNpftByWw7qBSrXJ5Mc6Zieaafu7GmYlhpITLC85M3t6N83MxTo8P496ly3cznB7X5rEb5+DCfAyfx83xQ61vgLcSCQY4PNjH+S7Mw6oXuFAeLMOpSsm1xFo9v6UVpvu1Ur9OEySzySRT/f0tf87ndnM40ue4DfxsMslQKNRSQQgdzePjrPOZSSYB2vqOjkUHtB5aZftKYSvaZ6EmsJrdWOsbWjsq85WrVWL5FGNN5AjpTIT6WMyt25IztpBdxyNcDAV6m3r/Zp8x69fvbLlIsphrWgwCtlaUXMiuE3J76fM214PzSO0Bgp0VJXWUwNrGbDxJrljmrvHON5T6MbrNc6HlHsU6KnChM9AbYjjS05UerAtzMU6OGZN7dGZipOuuA9DCZd0uwcmx1kKKFHuzmE6TL5fb8iYEPF7GwxGuJx22gV9PMNnf3BPy7RyLDnDdYSGPM8kkk339bX32eHSA2fUkpUrFWKM6YDaZIOzzEw0EW/7s8egAVSmZWU8ab5jCdBaz6wz5e/C7PU293+/2MOTvYTFrfajVcj5FRcqmvRag5QrlK2WSxZx5hu3AYm6dQ8FIUzlNAH3eAD0eHwu5pLmGNWAh25pHSHtvH8lizpacsYXsOmOhfsQerQV0hgNh3ELUPV92ogTWNnQhYERI1Gh/L/2hQNeJi/nEOtlCidPjxmyqT40Pd90cSCm5tBDnrvHOPZmgCay51fWua7p8YT7GsdFB/N7mbsqK5plZ18TEVNuCJOooD1YynyOZzzPVpiA5Fo0yk7S3oeV2ZteTbX8/x6MDlKtVbqXsv9HraOfT/GZlK/VS7aqSYFeymEsx1kJYGMBYqI/FXMoki3ZmUwQ0b68uGBZs8FxoIqB5W4UQjAX7WMzaMbdJoLW51c9tyYZrYTG33pKtHpeLkUDElgcD21ECaxsX5mN43C6OdZh7BNof0emJ4a7zXFxZrCV2G+S1OD02xPXYGqWyc57k7sXqRpZkNs+JDsMDdfRctGtLzmw+uhNXFlc4pbxXpnBzXbsBTLYRrgUw3R9lJpGwrYzydmY7CD8DzYOVL5dZTNvX0HIr2VKJ5cxGR+cDzsqTm00m27/e9EIkDvMyKppjMbvOWLBFgRXss2Wjqo/ZSg6WLgLs8FwstDO3tZBGq2k1pwmon5sd18JCNsl4i3M7btPcbkcJrG1cXohzYnQQr8eYktR3jY9wdWmVcsX+kpHNcnVJy5c6PmqMuLhrYoRypcr1mHM2GntxtSYyTxwyRlzoQu3yUvfkom3kCywl04aJTMXtzK4n8bncHOppLm5/O8eiA2yUisSz9pRR3o4eOjbZ157HZ7rmKXKKIJmtnc9Um+dztE/bFOhC2m6KlQpz6VTb5xPyehkO9XBThQh2HVJKFnNtCiwb8pr00LlWcrDGbRIBer5YK14WgLGgPV6WhWwSj3Ax3GS+GNgnXvV8sdbn1p4HA9tRAmsbV5ZWOTFm3Iby5NggxXKFW6tJw45pNlcXV5kYiNATaD2xuxF6qGE3lSm/UhNCRl0L49EIIb+3Lty6gatLxnoyFbczm0xyuC/SdiEZXZDohQvsZiaZQLApLFpFP59Zh2zgdY9cux6faCBIr8/nGEEyl1qnKmXb5wPad+uU81E0T7KYI1cptRUimKuULM9rWsiuM+jvaaoHlk6/L0jA7bHccxHPp6lI2ZYHa62YJV+xtpfhQra1fDGAkUAYF8Jy0aKP1/p1G2E5l6Ii7XVs2CqwhBBvFUJcEkJcFUL8XIPf/5AQIi6EeLb234+aaU8qlye2vmGY1wI2PRfdFBp2ZWmFkwbOwdGhKH6Pm0tdVEnw6uIqA71BhsI9hhxPCMGJQ0N172A3oAus/eTBctKac3M9ydE285UAjtSEjFNyfGaTScbCYfye9vL1hnu0BHzHnE8tR67dIhdCCCb7+pl1iAer7pHrQGBN9vUrgdUCTllvdNHRjgdr6+etYiHbWt4NbOY1LVgsAtrJF4OtYXfW5jXNt9ADS8frcjMSDFt/HeRaDxUFbW5Lsspq3t7oDtsElhDCDXwUeBtwFvh+IcTZBm/9MynlA7X/Pm6mTdeXtNAUIzeU0yODCKF5xrqBUrnCTCxhqBfP43Zx7NBgV4nMq0srhgptgJOHBrmyuOKYnJm9uLq0QsjvZay/+TANJ+OkNUdKyc31ZNsFIQDGwxFcQjhmwzu7nmw7PBC0ZrZHIhHHhNTNJJMMBkOE/f62j3HUQYKk7pHr4Ds60tfH0saGKtXeBE5abxbbFAH6+632XGh5N/0tf2481G+5CFhsI6cJNgXWki3itb/lz9kRdtdOQQ6wNx9vK3Z6sB4Brkopr0spi8CfAu+20R6uLmsCwKjcI4CQ38vEQF/XiIuZeIJytWq4uDgxOlifX6dTrUotVNRgz83JsSGS2Tyr6ayhxzWLq4urnBgd7LjhtoNwzJqzmsuRKZU68mD53G7GesPccowgSXTkHQE40tfPLQcJks7Pp4+51DqVqv05uDPJBL1eH4PB1ku060z29SNxjtfU4Thmval7sNrcqFopWvR8sVY31WBPXpM+3qFgaw8i7ZjbYrVCPJ9ub25tKByxmF3HLQTDgXBLn7MrH287dgqsCeDWln/P1V7bznuEEM8LIT4phDjS6EBCiB8TQjwphHgyHm+/HPi1pVWCPg/jUWOf2J84NNg1oWFm5d0cGx0gtr7RFWXKFxIpcsWS4XOgC7YrXXItaCJzX+VfOWbN0cPPOhFY2uedkROzns+TyOc7FiTa+djTLHQ7s+uJtsMDdSb7+ilVqyxtbBhjVAd0UqJdR79enZIn53Acs94sZtfxudwM+EItfW7AF8Lv8li6UU0Us+Qr5ZbFIGgiYKWQoVCxzsM6n0vS7wsS8rSWsz4aCCOwVgTEcikkrYtB0MTrUi5laRuNhdw6o8EInhbzlO0Qr41wepGLvwampJT3AV8Afq/Rm6SUH5NSnpNSnhsebr9v0dWlVY6Z8MT+xKFBZuPJrihTfmVpBY/LxfRw+2EkjdC9gt1QSVAXw0Z7sHSxcrULvJmr6SxrG1lDQ0W7BEvWnJtJbeHv2EMS6eOmA7wJmxUE+zs6zpFIHxulIom89c1Ct5Ivl1jc2Gi7B5aOXvDDCYJkpoMS7Tq6wHJKGOc+wJL1ZiGXYizY17K4FkIwFupjwcL+R3rfrVbzxWDTc2Flv6bFbKqtkDuf28NQoNfSMLZYXmuBMdqWwOqjWK2wVrAur2khu95WqGjYG6DX4z/QHqx5YOvTmsO11+pIKVellLrL4+PAw2YadG151dDwQJ0Th4YoV6vMxJ3fP+TK4gqTw/2GlanXOV4TK9e7QFxcWTSnuMNgOMRAb5Ari873YF0zIVzWAThmzZldTyKAiXBn3vIjff2sZLNkS9ZWotrObLKzpsk6uiCxO+xxtsMeZTq64LQ77LFUqTCXWu8o/wpgMBikx+t1hNe0C3DMerPYYiPcrVidexPL6SKgtbAwsKfZcDvl73WsbjZcF1gthtyBPV6hxdx6S6X6t2JXn7Gt2CmwngBOCiGmhRA+4P3Ao1vfIIQY2/LPdwEXzDJmPZsnnsqYUjGtmyoJXjUpLGxiIILf4+basvM9WFeWVhiPRugNtJ/cvhMnDw11hQdLF4En95cHyzFrzux6ZxX3dCYdUklQH/9IpL2Nhk7dQ2L3+dQERKchnGO9Ybwul+2VBBc3tFLS7ZbQ1xFCcLSv3xEeuS7AMevNYm695WatOmPBiKUb1XhNBIy0IQJ0z8yypR6sdcba8AiBJrCsLHKhi9dWc5pg06NoVZVGKSXxXJrRQPtza3VFye3YJrCklGXgQ8Dn0BaVP5dSviSE+BUhxLtqb/vnQoiXhBDPAf8c+CGz7Kk31zVBYE0NR3EJ4fgiD9lCibnVdVPCwtwuF9MjA3XPiJO5urRqynUA2vV1dWnVETkmu3F1aZW+UMCwMvVOwElrzs31ZMfhdKB5sMB+D8l8KsVgMEjQ23zfmkboAs3uELT5tLZB69TD6Ha5mIjYnyc3l9LO53CHAhg00Wm3h7EbcMp6U6oVNjjUpidgJBhmtbBhWU+hWD6NAAb9rTdg10XZck2kmU2mXGSjXGgr5A60XCgrGznH8mm8Ljf9vtYL3RyyWLwmizlKsspIG55M0DygMYuug53o7PFph0gpPwt8dttrv7Tl558Hft4KW3Tv0kkTNtZ+r4ejQ/2O91zMxDXvkllhYcdGB3l2ZsGUYxtFpVplNp7g1acnTTn+sdEBcsUSy+sbHOpvb+GwgqtLKxw/NNhRQrwTccqac3M9yXceO9HxcY46SJCMdyhGAIJeL8OhHkcIxoDH01HFPZ1JBxQiMUowgnY+X565TlVKXPtsfTAaJ6w3K/kNJLTtCRgJhKlIyWo+0/ZmtxVi+TSD/t6WCxsABD1eIt6AZRvrTrxtoImAfKVMulQg4gsYaVpDYvkNRgLhtu7r/b4gXpfbMvEa63BuRwJhVgsZStUKXpexKS/N4vQiF5ZxdWmNHr/PtE3viS7oAzUTq+VRGFzgQuf4oQEWEimyhaIpxzeCxUSaYrnCpElzMD0yAMANhxf7uBFLcHx0wG4z9iWZYpHVXM4Qb0J/IECvz2d7iOB8OmXI+YCWh2X3+cylUkyEI4Y8YDgS6bM9RHA+lUIAY+HO729H+/opViosbdj7dFjRHPpGtZ2wMNgMu7NKtMRy6Y6E3EggzHLOYhHQpr0julcob41XKJ5Pty1YhBCMBMJ1UWk2RggsgHjevgquSmDVuL68yvHRAdOe2E+PDjC3uk6p4txKgjPxBELA0aF+U45fryTo4DwsvRCJWSJzekQ77o2YcwueJDZyrGfzTA0rgWUGujfhcKRzb4IQgqORPls9WFJK5lNpJgzYvEOtMqLdgiSdMsTbA1ovrHSxQKqQN+R47TCfTjHS04vP3fmTXF1I69exwtl0KgL0gghWhYbFOhABoAnCmFWCRc9paiOcETZFgFXidTmX6mxurRSvuU69g9bn421HCawaN2JrTI2Yt6GcHo5Srla5teLc2PWZWILxaAS/15zIUT2vycl5WLO6wBoxR2ANhXvoDfgc7cGqz8Fwv72G7FPq4VoGCCywvznvSi5LoVI28Hz6WNxIU7TxYdRCOmXY+ehCbT5l341+IZ0yTADrx7HzfBTN00nlOIDhoLV5TZqXpT3BAhaLAIPEa8xCe0eC7c/tSDBinSez7nntTLxa5XFrhBJYQCZfJJbK1L0LZtANoWEzKwnTPDcAhwf68LqdXUnwRixBOOBnsLe1hozNIoTg2MiAo6+DG3WRqTxYZqBvTI3ykBzt03phWdkAcisLhp9PP1UpmbMpTDBXKrGayxmSUwYwUfP4zNkoSOZTKcaNEoy14ygPVncQz6VxC8GAv72CRYP+HtxCWLKxLlUrrBYyHXlZRoJhVvIblKvmF+WI5dME3V56Pe1VHNaFmRVzmykVyJSLbYeKAowEerVmxRbca2L5NP2+ID53ew/8Ry1+MNAIJbAwPywMNj0iTu2FJaVkNp4wzXMD4HG7mBqJOjoXbSa+xtRI1NTiDlMjA44OEZyJreFxuxiPGrMhU9zOfDqF1+VipKf9J4lbORzpo1ipEM9Y1wByK0YWUIDNSoJ2beAXDD6fw2F7BUmlWmVxI83hsDE5cgGPl8FgyFbBqGieWH6D4UC47YIkbuFiOBC2xMuyWsggaT9fDLTQsCrSkoa4+ty2u18IuL30eQOWhLHFarlI7RY7AW1us5USG+XC3m/ukE7yxQCivhBe4VIhgnYzY3JYGEBvwM9wpMexnotYKkO2UDI972ZqOFoPQXMiMzFzvXig5WHF1jfI5J1Z7GN2JcmRwX48brU8mIFecc+oCmwTNm/gjQ551M9nwaYN/Hxa20hORIwJqRsIBgl4PLYJklgmQ6laNez7AS1/0C4Po6I1Os1pglrhCAvymvTNcCdFLuo5YxbYG8t1PrfDgXBd/JhJvMNwRtiSM2aB2O70uhVCMBy0Zm53Qu2g0J7Ym1ncQWd6ZKBeqc9pzNSEn9niYmokytzaOqWy84p9ZAta+XQzhTZshovqZfGdxkxszfTr4CAznzKmpLmO3SFb86kUvT4fEb8xZYZHe3txC1EXOlZjtEdOCMHhcMR+AWzgNXc4ErHt+1G0Riyf7sgjBNrG2qpNtT5eu9R7YVklAjosXW9VUQ5D5tbCsDsjxOtoIEJMebDsZTaeZDwawecxty3Y1HCUG7E1RzaZtcKLB1qxj0pVcmvVeU8/b65oc2BWiXYdXWBdd6DYrlSr3FxZN/06OMjMp1OGeUfA/iIKRpZoB/C4XIz29tomSOZS65oNBoVwgiaC523y+JghsCbCERZSKdvy/hTNo21UO7uWrWraaowIsKb0uZSy44Ic0J3i1exroSKrrBQ26gVW2sXuZsNKYKGJCysS+qdHoqRyBdY2cqaP1Soz8QRBn4eRiHGbikZM1b03zhMXZvcB0zky1IfH5XJkuOjCWopSpcK08mCZQqFcJpbJGLrZ7fX56PMHbBQkxlWo05kI2xeCNp9OMdYbxt1Go9OdmIj0MWejh1GzwUivaR/FaoWVrD15f4rmKFTKrJdyHXtZRgJhUqU8uXLJIMsa02lBDtCKcniEq15C3Sw2ygVylVLn4ZfBMCuFDSrS3KIcsVyakNtLj8fX9jH0/C2zvUJrhSwVKQ0Jv1RFLmxESslMPGHJhtLJoWEzsQSTQ1FcLvOKOwBM1kp/zzhQXNyo9QEz24Pldbs5PNjHDQdWU9SFr9lzcFBZrDVnNVJgaccL2xqCZvz52BhSlzLjfMIk83k2itbnXc6nU0QDAUJer2HH1OdHFbpwNnEDvBZgnVeo04IcAC4hGA70mr6x7rRPk85IIExFSlZNLsqxXAsV7aSAV9DjJeINmO4VMsLbBlo+XrZcZKNkflGORhx4gbW8vkGuWLIkJGrKwU1mZ0yuIKgTCQYY6A051oM11h8hYFIfsK1MO7RUu1WhogeVzSbDxoXUgeadsKMoRKqgiQYjvSOgnc/yhjWllrdjZA8sHTub8y6YIIAPq1LtXYGRG9WtxzMLIwpyAIwEIqbnYNX7NHUaxmZR4Yi4AfliUPMKmT23RolXC8vgN+LACyyrwsIAxvoj+D1ux22si+UyC2spywobTI04s5LgTNy64g7TI1FmV5KUK9ZvIHdjJpYgEvQT7Qnabcq+ZM7gnlE6usfH6vxOo3t66UyEI1SkZHnD2gpQpUqF5UyGcYNDHg/bmCc3n0rVe3EZxaYHy3m5tIpNjBJYVlWPM6IgB+i5N2Z727pLBBglXq3IazKi4iFshjTaVapdCSwLm6q6XIIpB1YSvLmSpCqlZY1lp4ejjvNg6aGiVnlupkcGKFeqzK85a4Oi5yOa2QfsILOQTuESgkO9xuY6jocjZEol1gt5Q4+7F2YUUNh6PKs9JEsbG1SlNP58IvYIEimlKSGcPT4f0UBAVRJ0OLog6lS0jAat2agaUZADamXlrfJgGVDpDsydWyklsVy67i3rhJGA+QIrlk8j0PLpOsHKqoeNUAIrvkbI72Uk0tkX2Sx6JUEnMRtPAtZ48fRx1jZyrGet3Qzuxkpa6wNmVe7RsVFNzDrtWpiJJ5iq5ckpjGc+lWK0pwev223oceul2i32kGz2wDI+5BHsPB9jBclQqAef2225YFzL5ciVy4afD2jfuV2VERXNsZxP43W56fd1FpHQ6/UT8vhM3VjrBTl0MdcJI8EwG+UCmbJ5OY/xfJpej7+johEAA/4eXAhT5zZVylOoljsOZwQtpDGeT5talCOWTzPo78Hr6uw+qXvszC54shNKYMWTTA5HLXtiPz0SZX4tRbFctmS8ZtA3+ZMWbax1L5GTvFhWhoqCM/PxsoUisfUN05tNH2T0JsNGY5fHZz6VIuDxMBg0NqRUD9Gz+nx0D5PRHh+XEIyHI/YJRoNDHrVjRlSRC4cTr4WFGbG/MdtzYVRBDtha7c48e2O5DUNs9bhcDAV6zbXVwLkdDmpFOdYK2Y6PtROxnDGhoiGPj7DXb0nT6UYogRVbY2rIuoT+6ZEBqlJycyVp2Zh7MRNPMBzpoTfgt2Q83UvkpEqCN2pib9qiEMF6sQ8HCSxV4MJ8jO4ZpbMpsKx9UjeXSjEeNmYDt5WAx8tgMGS9YKyNN9ZrvCA5HI5YXqrdrBBO0JsNW5/3p2geI5q16oyaHHZnpAgYrXlq4iYKQiOaDOuYLV4NnVsLSrUblS8GWsGTWN7aXF6dAy2wCqUyC4mUpRtKJ3ouZmIJyzw3AIcHtT5QTvNgBbweRvuM31jtxNRI1FEl+6324h00ytUqi+m0KZvdgWCQgMdji4fEjPMBvTmv9ecz2tOL34Sm83Y0GzajB5bO4UiEfLnMas55fR0VGrF8ui42OmUkGLFEBBgRxmZFQ1ytIIcxubSjQXP7NcUNqsoHm+LVbG+mkeJVFbmwgZsrSaS0dkM5VffeOEhcWFjcATb7QDmpkuBMPMHksPl9wLbitGIfs7U+YEeG+u02ZV+ynNmgIqUpm10hhC29o8woAa5jx/nMp9KmhNOBJkhWczlyJXObtW5lIZ2ix+ulzx8w/Nh2haUqmseoqnwAI4FeYvm0aR5Lo0pzbz2GWSJASmnw3IYtCRE0wl59bs0ShKVqhdVCxjjPqwVVD3eiKYElhHAJIR4UQrxdCPEmIcSI2YZZgR0hUSG/j5G+Xsd4LpIZrdiE1Xk3WrEPZ4kLqz03Tiv2cSOeYDxqTR+wvdiPa45ZJc11rBYkuVKJ1VzOFMEIWt7QQtq8DV0jFtIpxk07H+t7YekeRjNyjPXCJvuh0MV+XG8yJa3Ig3Eb1QilaoVk0RyP5XI+jc/lps/b+cOAnlpRDrM8F+ulPKVqxbgwtmCY9VKOfMWchy/L+TQRb4Cgp/Nm44P+Xq0oh0mCcLWQQWKM0KZ2nJW8Vh3WanYVWEKI40KIjwFXgV8Dvh/4Z8BjQohvCSF+WAjRtV4wu0KipoejjvFgbc5Bv6XjTo1EubmSpGJDI9HtlMoV5tfWLasgqOO0Yh8zNojM7eznNWfBxIIDYH2z4QUT83tAO59CpcxKzrxk6q1UpTQthBNgIlIr3GHhd2RGDyyd/eDB2s/rjZ53YuRGVTuuORtrIwtygJYzZlbujZE5TVuPs2KWvQYVjQCtKMdgoMe068Co1gI6I4EwZVklUbTmPrKVvR5V/yrw28A/ldseI9ae8Pwj4AeB3zPHPGMolUrMzc2Rz9/uKbin38N/ee+rmb1+zVJ7fvSR4+SKJS5cuGDpuI2oFEr8p/e8img115Y9gUCAw4cP4/W29mRkcjhKsVxhMZHm8KA5G4BmubWapFKVlhd3mK71HZuJrXH/5JilY29HSslsPMGDU+O22sE+WXMaYVYJcJ3xcIS1fI5sqUSoxb/HdtALapjnwdKOu5BKMRwyv41GPJOhWK0YKrC23nuC1Sofe/lr6FlPWbb2/9SJuwh6vaaN9z9e8VpCwmPLvazde8829sV602iPU6iU+a9Hv4vBlDDk+zlUqfBfj34X2VvLXFgwPgLnne4jvHPkiGHX0s8PvRyg4+M1us6MzGnaepxYPs3hHuP3IUbm4oG5RTnq4tUge3WhFsulO+6r1Sq7Ciwp5ffv8rsY8J+MNsgM5ubmCIfDTE1N3fZ05PryGi5hTZPhraymMywlNzg5PoTH4H44rbKcTBPcyHJmYqTlJ0dSSlZXV5mbm2N6erqlz9Zz0eIJ2wWWHqo4bbH3ZmKgD4/bGcU+4imtD5jdHqz9suY0Yj6VYjAYImBAmEYj6oIkneLEwKApY2zFrJLmOls9JPcfMv8BxFy6dj4GCsat9x4AGY8xHApxyIQqhdupVKuU4zEO9YYZ7jFnY+FZXcHrdjPVb+260cm9Z9tx9sV602iPkyxm8WSSnIwM43d3vuYUK2Uup2JMhPqJ+kMdH287V1IxAm4PR3qM2Y/NZRJky0VO9Y22fYydrjOjRUA9r8mksLt4Ps2x8JBhxxsJhFnMmRMabLh3cEtRjjMcMuSYzdJsDta/FUJ4tvw7IoT4XfPMMpZ8Ps/g4OBtAkJKSbFcxmdCtai90McslCuWj72dQrmCz+Nuyy0vhGBwcPAOz2Az1MPjHFCq3a7y5B63iyOD/Y7IRXNaifZuX3MaMZdKmebtAetD0ObTKTwuF6M9xlTS2k692bBFIWhm5MhtvfcIIfC6XBQr1qz7+jhet3kRbl6327Lz2Uon954djtfV602jPU65Fn7vEcY8xPXUmr6WquZ836VqxTBbQbO3JKsd5XDudJ1tFo0wZu0bqTVXNsMrVJWSeN6Ynl06ZhbliOXTuIVgwCARb0VFyZ1oduX1AI8LIe4TQnwn8ATwlHlmGc92AVGpVqlUJX6v9R4kfcxiyf5mw52KzHbjpQd7Q4QDfkd4b2ZiCYbCIcv6gG1lajjqDJFZs2HaOU2Gu37N2Y6ZJc3B+pyY+XSKQ729uF3mbOAj/gC9Pp+lghGM98htXSN9bjcliwSJvhH2ucy7x1l5PtsxuHBH16832+ejVK3gEgKXQfPkEgK3cFGWxn/flWqVqpR1EWcEHuFCSkmlw+IGja6zWD5NnzdAwADPIECfN4DP5TZFBCSKWcqyaqjAGg6GWStmKZogtuO5NEP+XtwGpT4O1USwHQKrqZ21lPLnhRCPAY8DCeB1UsqrplpmMrr3yA4PltftRgj7PViaF69C2AZhIYSo9YGyX2DNxhOWh4nqTI1E+buLM1SqVdM2qs1wI671ARvpM8cb0Sr7bc2RUrKQTvPm6WOmjTHa04vH5bLU42OmYARrKyPOp9NEAwF6fD7TxvC63GwUi6YdfyvFiubB8JoYhu51ualKafv61Sn7bb0BKMsKHuEyVIh6Xa66Z8xIyrJ2rRpYT8RbE2tlWcFjcEciI4tGgLYfGgmETWmMbHTRCLi9KMd4yNgUDyMbOIP2gGnAF6rnzVlJsyGCrwN+E/gV4CvAfxFC2J4N3wnFkiZurPJgud1uHnjgAR544AEefPBBYovzdRs65dOf/jTnz5+v//uXfumXeOyxx/b8XKlcQcq9RebNmzfp7e3lN37jNzq2dSuTw/2OqKao9cDqt2Xs6eEopUqFhTV7K3HNxpOW9wHbjf225qzkshQqZQ6bVNENwO1ycai31zJBYmYPLB1NYFlzY7RCMPrcbsrViiUlg0uVCkIIAj5f/d7zwAMPMDMzY9gYn//MZ7h26VI9TLDZe89ezMzMEAwG6zb/+I//eMfH3I39tt4AlKrVusgwCi3srvG+Zesep9XrrFzzhOzkwWpnj+OpCf7yHl6W559/nle+8pXcfffd3HvvvU2FnRotAsC8sDuj88XA3LC7WK2apJGM2NQLq1n3zW8A75NSngcQQnwv8CXgrk4GF0K8FfjPgBv4uJTy17b93g/8PvAwsAp8n5RyppMxdQrlMkKY+3RvK8FgkGeffbb+71srSfIGhQh++tOf5h3veAdnz54F4Fd+5Vea+pzuQdtLZP7UT/0Ub3vb2zozsgFTwwP8zVMXyRZKhPzmVz1rxHo2TyKTsy00Ts95uhFP2Nrgdya2xtnD7ScDm8C+WnMWTO6BpTMRjlgSUleqVFjOZEzNKQOtOe8TC/OmjqGzkE4xHTU3B1HPhypVKvhNjp4oVSt4Xe477j1G8r//5m948HWvo/TylxPE2/S9pxmOHz9umt0N2FfrDWjCIugx1hvrFW4KO/Rq6uQ600WbdwcvaDt7HK/Qc8Z29riVy2V+4Ad+gD/4gz/g/vvvZ3V1tamqlEYXjQBNBFxaXzb0mEC9F5jROViAaYLwocGjhh5z2MSqh7vRrN/0lfrCAyCl/BTw6k4GFkK4gY8CbwPOAt8vhDi77W3/GEhIKU8A/xH49U7G3Eqxg+IORuDzenjDIw8Si8cBePLJJ3nDG94AwEc+8hF+5Ed+hDe84Q0cO3aM3/zN36x/7vd///e57777uP/++/nBH/xBvvGNb/Doo4/y0z/90zzwwANcu3aNH/qhH+KTn/wkAF/84hd58MEHuffee/mRH/kRCoUCAFNTU/zKv/kI7/vu7+SRcw9z8eLFhnZ++tOfZnp6mrvvvtvwOdDFxc0V+7xYN2q5R3YVd9AbPNvpySuWy8yvpRxT4KLGvlpz5mqix6wmtjoT4Ui9P5WZLG1ojRtNF4yRCOligVRt3TILKaXpOXKgebDAvEIBWylWKjsWuJiammJlZQXo7N7z2b/5G/7Dr/wKr3rZIy3de375l3+Zhx56iHvvvXfHe4/F7Kv1RkpJWVYNDbkDzStUrjZfOKLZ6+y3/stHteMLt2F7nFPHT/DR/+c3eP0rXrXjdfb5z3++PhbA4OAg7j0euptRNALMEwF62OGQQQU5YNMbZnRIY7FSJlnMGe/Bsklg7foITQjxA8AfS3mnT1hKuSqEOA6MSSn/ro2xHwGuSimv18b6U+DdwPkt73k38JHaz58E/qsQQmzvV9EKv/7pr3BxIU6uUMLlEvi9nT9FvGt8mJ/9njfs+p5cLscDDzwAwPT0NL/7h38MaGF6jbh48SJf/vKXSafTnD59mp/4iZ/g8uXL/Oqv/irf+MY3GBoaYm1tjYGBAd71rnfxjne8g/e+9723HSOfz/NDP/RDfPGLX+TUqVN84AMf4Ld/+7f58Ic/DEBf/wCf+tvH+NJffZLf+I3f4OMf//htn9/Y2ODXf/3X+cIXvmB4eCBsKdUeS3DXxIjhx28Gu5pN60R7g/SFAszE7St0cWtlnaqUljdabsR+XHPAvAIK25mIRFjOZChVKqZ65+sl2i0QjKDNX8Q/bNo4iVr/MDO/n1/52pd5KbZMrlTC5/Hs+LS+Fc4Mj/BLr3tjw9+VKhXCfv8d956//Mu/3PWYrd577nvta/j+f/h9jG1poL3XvWdoaIinn36a3/qt32p47wG4ceMGDz74IJFIhF/91V/lta99bXuTtAv7cb35v5//Wy4kl8iWi/jcbkPCBO/qO8Qv3PdWPC43Emri7fbjdnKdnTp9ird/4Pu4cP68oXucgaFB/vbvv8KnP/HHDa+zy5cvI4TgLW95C/F4nPe///38zM/8zK52m1E0AjQRkCkXyZQK9HiNy4uP5bX+T0YWu4n6QniEy3DREje4ObbOaDDMaj5DuVqth45awV7qYhB4RgjxFFpFnTgQAE4ArwdWgJ9rc+wJ4NaWf88BL9/pPVLKshBivWbTytY3CSF+DPgxgKNHm3AtSokQGFZdpxm2u8+zBS3RuVRuHCb49re/Hb/fj9/vZ2RkhOXlZb70pS/xvve9j6EhzTU9MLB7WNulS5eYnp7m1KlTAHzwgx/kox/9aH3x+Y63vQ2fx8PDDz/Mpz71qTs+/5GPfIR/8S/+Bb295hQ+OFoLibthY6GLmXgCj9vFxIB9vbi0SoL2zgFY3wdsB/blmuMSghPRASJ+cwvKjIcjVKVkaWODI33mXdOWCUZdYKXWOTNknsAyu2myjh4x0aFe35OqlJSrVbzu1kMEW733uF2uO6qJ7XXv+d7v/V6AHe89Y2Nj3Lx5k8HBQZ566im+53u+h5deeomI8d/PvlxvQGoVBDF2j6N7xMq18NOtdHKdDQ4NsR5f5bkv/52he5y3vusdlKvVHa+zcrnM3/3d3/HEE08QCoV485vfzMMPP8yb3/zmHcc0o2gEbM1r2mDaUIFlvLfNJQTDgV7DBZYZ+WKgzW0VyVohY/ixd2OvRsP/WQjxX4E3obnL7wNywAXgB6WUN803cW+klB8DPgZw7ty5Xe9ce3marMLn8eB2e8gVtXjm7YmV/i0bMbfbTXkHIdYRbg9+j3vH4z/++ON88pOf5Gd+5mdIJpO4XC4CgQAf+tCHDBk+6PMyFg0za6PAmo0nODLYj8fEXjF7MTUS5RuXZm0b30k9sPbjmgPwow+d40cfOme6XVs9PlYIrDGTG+aOW9QLy4weWNvRPU0X4jHCfr+pBU/00uk7PbX2eDxUa7kpnd57PMLVcql2fYydjq9vvEETYcePH+fy5cucO2fs39B+XG9+4b63mmbHZi+sKsFm3t/kdSbcbkTV+IcOPYEgJVnZ8To7fPgwr3vd6+qC7ru/+7t5+umndxdYBvfA0tkadjcdNq5RfCxvbMVDHTNCGo1uMqyztSiHlQJrz12llLIipfyClPIjUsp/KqX8sJTyvxuw8MwDR7b8+3DttYbvqTUB7ENLBO16PG4XE0eO8NRTTwPwF3/xF3t+5k1vehP/63/9L1ZXtSlYW9PCysLhMOkGlbZOnz7NzMwMV69q1Wb/4A/+gNe//vX135crVXy7hEh+/etfZ2ZmhpmZGT784Q/zC7/wC4aJK52pYXtLtdtZQVBnajhKPJVhI29unslO2NkHrBFqzWkfq5rzzqdTjPT0mF6oYSgYwu/2mF64wyqPHFjTnHezyXBjgTU1NcVTT2ltnjq99+SzmTvOZ697z17E43EqtWNev36dK1eucOyYOS0O1HrTPFtLnzdD89eZxO1yG77H8Qr3rmXl3/KWt/DCCy+QzWYpl8t89atfrRfS2AkzvSxbj28UsVyaEYPFIJhT9dBsgaUX/LCKZsu0DwshfkEI8TEhxP/U/+tw7CeAk0KIaSGED3g/8Oi29zwKfLD283uBL3WaC+EkPvzTP8u//vmf5dy5c3smVgLcfffd/OIv/iKvf/3ruf/++/mpn/opAN7//vfz7//9v+fBBx/k2rVr9fcHAgF+93d/l/e9733ce++9uFyuerlbfRL9HusbLW9lshYeZ8fXWqlWubmStD00brrWg8suT95MfM0R+VdbUWtOe4zXPEqmC5JUmsMWiBEhBOPhsOml2ufTKXq8XvoDAVPHAWua89abDO/gmf/lX/5lfvInf9KQe8/HfvO/8J43vZkrV6/U37/bvacZvva1r3HffffxwAMP8N73vpf/9t/+257hYp2g1pvmcNdDBJvrhdXMdSalRErwCmHoHge08NVytbLj/iIajfJTP/VTvOxlL+OBBx7goYce4u1vf/uu51T3YPkN9mCZILDK1SqrhQ1TvDZmlD6P5dJ4hYt+XzP+0eYZDppXVn43mn38+FfA14HHAEPuDLV44w8Bn0MrYfo/pZQvCSF+BXhSSvko8DvAHwghrgJraAtUV7KxsXHHa695zWv531/7JndN3J5b8JGPfOS2f7/44ov1nz/4wQ/ywQ9+8Lbfv/rVr76tR8QnPvGJ+s9vfvObeeaZZ+4Y+7mXLjC/lsLndXPu3Dm+8pWv7Gr/dpuMYmo4SqZQZDWdZSjSY8oYO7GQSFEsV2xrMqyjF9i4EUtw95FDlo8/G0/ypnuPWz7uHqg1pw38Hg8jPT2me7AW0inuHbWmrP/hiPnNhhdqPbCsqCrrdbtJFQpIKU0br95k2OVueO957Wtfy+XLl+94vZ17z7eeeYa51DpHB4eauvds7Y+0073nPe95D+95z3sanZpZqPWmCVxC4HG5GvbCavc6q0jJX37jSxwKag9sjNrjzMzMsFrIsJhd54GHH9pxj/MDP/AD/MAP/EDD3zUinksT9YXwuY313vd4fITcXkO9LKuFDSTGe4SoHTNVypMrlwh6jGmzE8unGQ6GDV8XB/09uBCOFVghKeXPGj24lPKzwGe3vfZLW37OA+8zelyn4Pe4SVarVKpV3BZWNgGtTD3s3WTYbHTvzY14wnKBZXcFQZ0jQ324hLAlVNLuPmC7oNacNtGa85onSKpSspBO8dYTJ00bYysT4Qjn49f2fmMHzKdTppfQ1/G53FoZ7VoRCjPQq0haIRj10vNFC3p7mYhab5rEI9x7Nu9thXK9B5bxfwu7FeVoFzMa4YLmrdfymu4Uqu2ynDMn5G7rMeP5NEd7jdk/mDW3buFiyISiHHvR7K7+b4QQ322qJQcQX63Bb8GghsOtUCxX8HrcllZSbISe/zQTs75M+axDijv4PB4mBiL1nlxWoo9pdx5aA9Sa0yZmNxuOZTYoVauW5CuBlle2msuSKzVucGoEVvTA0vFuESRmUawYt6Hci/r5WNDby0TUetMkXpdr1+a9raKLNY/BPbvg9qIcRmFmoYSRYNjQ3lJm5TRtPaaRoiVuksACzd64geK1GZq9on8SbQHKCSFSQoi0EMLabLEOcWJYs/60r7hDLywzKZTKhuRfdTqvY/0R/B43s/Fkx7a0ykw8QSToJ9pjbLxvO0yNDNhSqr3uxbM5TLIBXb/m2MV4JMJiOk3VpDWvXhDCIo+PLnzMaqC8USySzOdNE1jb10g9L8rMZsOlaqXuWTIbvZ+X2Xll2zH4nt71641VexyPy910kYtm0MWPxwwPVotFORqxfV61qnzmtK4ZDUQMFSybBTmMX9tGTMhrMsuDBeYU5diLpgSWlDIspXRJKYNSykjt39bcXQ0gEAiwurrqOJHl9bgRQMFigSWlpFiudBweKKVkdXWVQAeJ4S6X4Ohw1JZGuzOxBFPDUUvCaPZieiTKzZUkVRNK1e7G7EoCj8vFxICz/py7fc2xk4lwhGK1wko2Y8rxrShpvpXxeul5c26OZgrGRvcefdNnlgdLSlkLEbQm7FwIgdftplQxzkuwnfV8/jYPphH3nq10+3pj5R5Hr8xn1AOczRBBEzxYLRbl2M7266xcrbKaz5goAnqJ5dKGfY+xfBq3EAz4Q4YcbytGe7Cy5SLpUsG0uR0OWh8iuOsOWwhxl5TyohDioUa/l1I+bY5ZxnL48GHm5uaIx+N2m3IH8fUNEksu1nqN/wPYiUq1yvL6BplQgOSSr6NjBQIBDh8+3NExpoajXF6w/ru5EU/wipNH9n6jBUwNR8mXyiwl04xbKHZmYgkOD/aZlgvSKvtlzbGTzea8KUZ6jH/SamVJczC/9LyZgnGne088nWbD62XVhKqF5WqV5Y0NCoEACV9n63uzxGtifiNkTh7tQjpFyOu7rcqjEfee/bLeWLnHyZSLrBezEEzUqwp2wnoxR7ZSxB1cN8C6O4nnUqTdHlZ97e2xtl5na4UMVaQpfaVAq3ZXqJZJlfL0GVBJL55LM+TvNeR72k7EG8Dv8hA3yCukh+8NmxV+GQiTKGYpVsqGFyjZib1G+Sm07uH/75bXtkrrNxlukQl4vV6mp6ftNqMhv/U7f8Xc2jp/+dMfsGzMb12+yYf/4vN8/Mffw5mTzXSFN5ep4ShfevFqPTHbCjL5IrH1jXqRDbvRQ/Rm4glLBdaN2JrtOWjb2Bdrjp1sFSQPjo0bfvz5dJr+QIAeizbvoz29uIUwLa/MTMG4073nZ/7kDxgK9fC77/5ew8f89vwcP/bFv+X33v0ezk1OGX78RvzO5/8335y7xd//yI8ZfuxkPsfbP/Zb/OJr38A/PnPG6MPvi/XGyj3Olxcv86FvfZo/e/2Pcs/ARMfH++eP/znX0yv8zXf8MwOsu5N/9eWPMeTv5b/f/486PpbuARk1MYxNH8cIgWVmvpgQolaq3Zi8JrMaOOvUi3IUNpgI9ZsyxnZ2lbVSSn21/G3g3VLKNwJfBtaBf2mybQeCqVpoWMXAJMy9mIk7K+9maiRKpSqZWzXnCVYj6nPgkP5P0/VS7daFSmp9wNZt7wO2FbXmdE7dg2Wax2fdkh5YOh6Xi7Fw2LzzSafwudwM91hXxXQiHDEtp6zukbMoR04fazmzYUoelpkeRrXetI7RuTfLuZRpYWGgiSGjCkfoJdRHTchpAuPD7szMaYJaXpNRtupzGzB5bi3Mw2rWb/ivpJQpIcRr0J7ofBxtQVJ0yNRwlGK5wmLCui99Jr5GyO9lxOKy6DuhixwrizzMOKSCoM5gOERvwGdpqfaFtRSlSsUxXrxtqDWnTXp9Pvr8AfM8PqkUE5E+U469E2aWnp9PrTMeiVhaUXW81tvLjJyZubT2oMqqEE7Q8uSqUrKcMb5K15w1RVXUetMkRouAeD7NqEleFjBYBJhYlW/rcY0Ku1vOpU0LZwRqZeWNnVuzrgX9wYCRVRr3olmBpT+WejvwP6SUnwGsiQ/Z5+gbfCs31jeWnVPcAWBy2Po5mImt4RKCo0P9lo25G0IIpoajlorMGw4TmdtQa04HTITDphSFkFIyl05x2ELvCOil583xcM+lUpZ65EA7n2ypRDKfN/zYc6kUw6EeS3tSbc37M5pND5Z5G0XUetM0A/4QbmFM09aqlMTzG6Z6WYaDYVYLGUOqdsbyaVwIBvzmPJweNlC8Fipl1ks5k8WrcYUjlnNpgm4vvR6/Icfbjhll5feiWYE1L4T478D3AZ8VQvhb+KxiF6ZqDV6t7AM1E0/Ux3UCfaEAA73Bel8qK7gRSzAxELG90fJWpkai1grt2jXnpGthC2rN6YCJiDmCZC2XI18uW+odAT0ELWNOCFo6ZWk4HZgbxjlvhwA2sRDJfDpF0OMhGjC1nYZab5rELVwM+XsN8bKsFTKUZdW0PCHY3FivGJArFMulGQr04jGh4iFA0OMl4g0YIgLM9rbpx86Wi2RKhY6PpYczmvXgv98XwitcjhRY/xD4HPAWKWUSGAB+2iyjDhIDvUHCQb9lG+tcscRiMuU4r8XUcLTuUbGCmXjCMTloOlPDAywl02QL5jVU3cpMLEFfKEC01/4+YA1Qa04H6CF1Roeg6eFaVm/g9RC0pQ1jQ9Dy5RIr2ez+EiQp6wXjeK+2iTNLYE2EI2ZHXKj1pgW04gadb1SXLRIBW8fqBLNzmkAPu+t8nVs2OacJjM3HM7MgB4BLCIYCYWI565oNN9sHKyul/JSU8krt34tSys+ba9rBwOrQsJsrSaTU+i45ialh6xrtVquS2XjCMQUudHTRe3PFmnmYiSccdx3oqDWnM8bDETKlEusFY0PQdK+YHTlYYPwGfjP8zOrz0TYScwaH1FWlZKEmSKzE7/EwHOoxJURwwYKcP7XetIZReU16wQFTRYCBxQ1iJueLgWavLo46YbPJsPni1TCBZbJ4NTIfrxmUC9wBWOm90cPCnFbYYHK4n7WNLKmc8TkJ21leT5MvlR0nLqwu9jETW3NqeKCiQ+oeEoM3vFb3wNIxy+Oj56lZ7cGKBoIEPR7DzyeW2aBUrXLYYgEM5hUisSOEU7E7RhU3iOW168VMETBqYHEDs4tGgCYCjLBVF5RWeAc7vRaklCznUqaVv9cxyvPaLEpgOYCpkSix9Q2yhaLpY+mhiE4p7qCjh+vNxpOmj3Uj5qwy9TqTw1GEwBKxnc4VWElnHRcqqjAGszw+c6kUEb+fiN+cROSdqIegGSwY51LWV9wDLXJhIhxhwfDzqYVwWnw+ABORsOEeuUyxSCKfN7vAhaJFRgJhksUcxUq5o+Ms59IIYMhvTu8jMC73Ri8aYbqXJdhLPL9BtcPw7uV8ioDbQ8RrfDNzHaO8g+ulPMVqxbQmwzojgV5HVhFUmIjuubBCXMzEEoxHIwR9XtPHaoVN7435xT7qXjyHhQgGvB7G+iOW9MJyWh8whbFsCixjbyZzKevDz0ALQRvp6amXIDeKuVQKr8vFiIU9sHQmIn2mCGDt2DYIrHCExXS6443hVuzymCp2p15OvMNcoVg+zaDfvKIRsCX3psONddzkMuI6I4EwZVklUcx2dJxYfoORgLm5iz1ePyGPr+O53WzgbO7f+UggTKqUJ1e2Js9dCSwHoHtSrCh0cSO25shN9ZHBPtwuwYwVIjOeIBzwMxgOmT5Wq0wNW1NJcMahoaIKYxgIBgl4PKaECFodTqejlWo3VjDOp1OMhyO4Tdzg7cRExPiQOjsFyUSkj2K1wko2Y9gx563pgaVoEaOKG1iR0wR6XlNnti5bEHKnHV+71jv1CpndwFlnxICiHHqTYStysMC6XlhKYDmAo0P9CGG+90ZKWaue5zyB5fW4mRjoYyZujQdrasQ5fcC2MjUSZTaeMKUB6VZuxBO4XYIjg9bnaijMRw9BM3IDL6VkPrVueYELnYlwhAXDi1ysM26Td2QiHCaZz5MpGhcaPp9aZzAYIui1PkLBjF5Ym0VIlMByEkbl3sRy5hc2AGNybzaLRpjsZTFIvJrdwFnHiJwxs5sM6wwbWPWwGZTAcgABr4fxaMT03Jt4KkO2UHKkBwuwrJriTMx5FQR1poajZAslYinjngI3YiaW4PBAH16P29RxFPZhtMBK5vNkSiXbNrvjEeND0OxomqxjRp7cnA0l2nXMKEQyn9ZDOM3L0VG0jlECazmfMrXAhc6ogSLAKi9LJ3OrFY1Im140AoypzKd7B60oIAJKYB04rAgNc2oFQZ3J4Sg3V5JUq+Z5b7KFIsvrG4704sFmqXazvZm6F0+xf5mIGFtEYd6mHlg6E+EIxWqFeMaYhw+FcplYJmPf+ZggSObSKVsKXIA5gnE+pYVwuhwYbXCQ6fcFtcIRHYSxFStlkkXzi0aAMbk3sVwKn8tNn4lFIwCGAtrDhE5EwHopT6FaNr1oBGiFI2K5dEdRN7F8mn5fEL/bY6Bld6IE1gHFitCwemEDh26sp0ai5EtlltfNu/j1OXCqyJweNj8fr1KtcnMl6dg5UBjDeDjCWj5HtmRMQq+dFerA+A38wkatRLvFPbB0jA6p03tg2SUYe30++vwBQ0MEb6bWOWJTSKpiZ4QQDHcYdmdVYQPYDA3rxIsVy28wGjS94TU+l5sBX4h4B+LV6rktVMusl9pvsWNVqGjEG8Dv8nQ0t62gBJZDmBoeMD00bCaWIOjzMtrnzHALvarfDRPDBPUQRKeGCI709RL0eU0NlVxMpCmWK46dA4Ux6Bt4o/KW6iXNbdrAHzbY42P3+Yz09OJ1uQw7n5VshmKlYluOHGh5ZUZWrry1nuRInxJYTqTT0DCr8m5g03Ox3KG9VogA6DxnTC8aYeXcdnotjJqc2wbagwFtbjsrytEsSmA5BCvKlN+Ia7lHTizuAFvC40z03szEEwjhvD5gOi6XML3xtNM9mQpjmIgY2ztqIZ2i16t5KexAF4y6MOqUeRtLmoNWPnqsN2ygYLS/IISRlRHThQKJfF55sBxKp8UNrKrKt3WMTkWAVQKr00bOdsxtJ16h5XyK4YA1D/6NyBlrFiWwHIIV4uLGsrPzbobCPfT4faZ6b64tr3J4oA+/19xY307Qin2YJ7SvLa8CcGxk0LQxFPZjdEidXkDBrgc0PT4f/YGAYR6S+XQKj8vFqI0FFIzMk7M7Rw6oN082ItRdF9JHlQfLkRjlwTK7Kh90LgKklMQsKnsOBs5tF4jXcrXKaj5jSTgjdC5eW0EJLIcwanJoWLZQZCGR4sQh526qhRAcGx3gek0AmMG1pVWOO3gOQBPbC4kUhVLZlONfW1ploDdEtDdoyvEVzmC0FoJ2yyCPz1zanibDW9F6YRknGA/1mtvkdC/GwxHDBGM95NHG72g8HGGjVCRVKHR8LP26PdLX3/GxFMYzEgiTLhXIlttrM2BV0QiAsNdP0O1te2OdKRfJVkqWVDwEbW5X8xnK1Wpbn1/Op4j6QvhMLhoBm5X/2p3b1cIGVaRlczuqBNbBQwhzQ8OuLWsekeOjzhYXx0cHuWqSwCqVK8zGk44WmaB5sKSEmytJU45/bWnV8XOg6By3y8VEpI9b650LLCklc+vrtnpHQBdYBgnG1LptBS50DkciLGc2KJQ7f5gyl0oRDQTo8fkMsKw9jKyMeLN23R5RTYYdyWbhiPbyWZZreTdWeMSFEB15LpYtaoSrMxIMU0WyWmhvbuO5DctsDXq8RLyBtufWSm8baHObLRfJlDp/CLQXSmA5CDNDw64urgA4fmN94tAgq+ksiY2c4ceeXUlQrlYdLzLNDBeVUnJtec3xc6Awhsm+Pm6uJzs+zloux0apyFGbvQlH+vq4lUoZ0gtrdj1pe/iZ7m1a3Oj8iap2Pv0dH6cTjKyMOJdaJ+zz25bzp9idTkPDrMxpAs3e5TZDBJdqAuuQBeGM0PncWtVfTGc4EG67ZL/+nVjRswusLdWuBJaDMDM07OryKn6Pm8ODzo5n1wWgGV6sq0urt43hVDYLnhgvsJaSaTKFIicOqRLtB4Gjff3Mrq93nBOji7RJmzfwk339FCplYpnOqkBlikVWslnbBcnhWgEHI8I4bzpAYOmC9aYR55Na54iNOX+K3elYBFiY0wSdVeZbzGnX81jImv1TfW47EC1WCRboLGdsqTa3h6ye2/0qsIQQA0KILwghrtT+37DyghCiIoR4tvbfo1bbaTV6aNisCaFh15ZWOTY6iNvGfINm0POjri0ZL7CuLa3iEoIph/d/Cvl9jPT1MhM33pupi0yn56EZzUFdc4729ZMuFkjm2+9RAjC7rhcc6DfAqvbRBd5sMtnRcXQB4ATBCJvhcO1SrFRYSKdtP5/+QJA+f4DZZOcPh+bW17s2/+ogrDedFI6oSsliLsW4RZtq0BrixvPtNcRdzK0jsDCMrQMRUKxWWC1sWFL2XGc02H5FycXser33lxV0mjPWCnbttn8O+KKU8iTwxdq/G5GTUj5Q++9d1plnD/qmVw/nM5KrS6sc7wKvxWhfL70BX10IGMm15VUOD/YRcHAFQZ3p4agp/cCu1b14Q4Yf2+EcyDVnUvcodBgmqH/+SJ+9+TCT/f2AFg7XCfr5HK0dzy5Ge3vxuz0dC5L5tBY2aXfII2herE6/n6qU3Eqlujn/at+vN3rhCD18rhVWCxlK1YplHiHQmu7mKiU2yq3n3ixlUwwHwnhdbhMsu5MBfw8uRFsiIJZLIcFi8Romnt9oK3R7IZdiLNhnmadaD51s57ptFbsE1ruB36v9/HvA99hkh6M4NjKAx+XiypKxAiudK7C8vtEVeTdCCE4cGuSqwXMAcHWpe3KPpkYGuBFbM6Tc8VauLq8yFA7RFzpweQ0Hcs3RPU5GCJKx3l4CHm/nRnXAeDiCx+UyTGBN2ixIXEIwaYAguVnz6NntYQRNBHfqYYxnMhQq5a71YHEA1hshBGPBPhZyrXtfF7PaZ8aD1v396UU52gm7W6yJAKvwuFwMBXrbyhnTvw8r7R0NRijLKittFDxZzK5bKrR7PD76vIH6NWgmdgmsUSnlYu3nJWB0h/cFhBBPCiG+JYT4np0OJoT4sdr7nozH40bbahlej5upkSiXF4wVF3rfI6fnHukcPzTItaVVQ8VFsVzm5kqia+bg1PgQG/kiiwlj3djXlla7RmQazIFcc+o5MR2GoDmhgAJoG4+JcKRjj9zs+jrRQICIAwooTPVHOxYkukCbstkjBzDVF2UunaJYqbR9DD0n7Wj3Nhk+EOvNWKivrY1qPe/GQhGgh90tt+EVWsytMxay1ps6HupjIZts+XP692GlaNG9Ze2I7aXcuqViEGA81M9CNwssIcRjQogXG/z37q3vk9oueqed9KSU8hzwj4D/JIQ43uhNUsqPSSnPSSnPDQ8PG3siFnNybMhwD9a1Lsu7OTE6SDKbZ3Uja9gxZ+JJKlXZNXNwakwL4bu8aNzNtFqtVRDskjloFbXm3EnA42W0p9cAj8+6IwQWaHlLHedgJZ0hGKHm8Vlf76gy4s31dYIeD8OhHgMta4/J/n6qUnZUql1vLXDEASGPO6HWm/ZFwILFRSNga+GI1q5LKaUtIqBd76AuHKy0V/dEtnotlKoVYvm0PeK1jbltFdOSUaSU37HT74QQy0KIMSnlohBiDIjtcIz52v+vCyG+AjwIXDPDXqdwamyI//3MJdK5AuGg35BjXl1aJejzMBF17s1qK3p+0NXFVYbCxmwYrnVJBUGdk4d0gbXCG+5ueM9tmcVkilyxtG8FllpzGnO0w1Lt2VKJeDbjKEHyzNIiUsq24/Zvrie5/9CYwZa1h14ZcXljg7Fwe0n0s+sJjvT1O6Li3tZCJNP9DWs77MnsehKBvU2T90KtN9pGda2YJVcuEWwhfHgxu07I7bWkybDOWK3ow3yLG+tkMUe+UrasRLvOeKiPxxYuUJUSVwt/14u5dYb8PfgtaDKsMx7qB2jZKxTLpZFYKwZBm9tvxW90dA9pBrtCBB8FPlj7+YPAX21/gxAiKoTw134eAl4NnLfMQpvQPRdXDCx0cXVplemRAVwu+2++zaCLoGsGlmq/qlcQHG7vhm81PQEfEwMRQ8NF9WbTJw5miOCBXXOO9vV3FCLolHwlHb0yYiLfXq+8UqXCfDple8U9HSMKd9xcX3fM97N5Pu0X7phZTzARieD3OL8g0Q4ciPVmPNgPbJYxb5bFXIqxkHWFDQB8bg8jgXDLXpZFG8IZQRMtpTbymqzOaQLo9fqJeANtz63lAivYT6ZcJFXqrLruXtglsH4N+E4hxBXgO2r/RghxTgjx8dp7zgBPCiGeA74M/JqUsqsWn3Y4qQssA8MEry2vdo3nBmCwVoTByDm4urTC0aF+/F1QQVDn1Ngwlw0U2rpo368erD04sGvOZF8/y5kN8uVSW5+vV9xziCCZ6rC0+Xw6RcUhFfdAy1kC2q4kWJXSUSGcQ8EQPV5vR2GcNxKJtr1fDuFArDf13JtWN9ZZ60PuACbayL2pF+SwWLTo4823IVrsmNvxUB+LLYZfWt1fTGfzujU3TNCW3aaUchV4c4PXnwR+tPbzN4B7LTbNdg71hwkH/IZ5LlbSGeKpDKfHRww5nhUIIbRcNAO9N5cW4tx79JBhx7OCU+NDfPX8dQqlsiHC8NJ8nPFo5CBWEDzQa87WQhenBlsvzz/rkCbDOrqQmEkmeaCNML+bDunppXOotxefy81Mmx6sWGaDQqXsmPMRQjDZ19/2+UgpuZFM8L13nTXWMAs5KOtNu6Fhi7l1zvRbfz8eD/XxfGK+pc/o5bytDxHsB7R8tQc50tRnpJQsZtd5zcgJEy1rzFiwr3UxmNW9gzbNbTZp6nXo7K6zBxBNXAwaFiJ4aV4rknDXhHMSY5vhrgnNe1OpVjs+ViqXZ34txenx7pqDU2NDVKU0LFTywnys664DRed02px3JpmkPxCgL+AMYX60rw9B+729ZmqeIqcIRrfLxZG+vra/H/1zTjkfgMkOKiOu5LJsFItMR7vag3UgGAmEcQvRkgerUCmzWsjY5sFazK5Tkc3vKxZz63hdbgb81haQmWijcMR6KU+2UrLcIwR6wZPWQ0X7vEFCHp9JVjWmk6qHraAElgPRKwkaUab8wryWW9tt4uLMxAj5UpnZeOfNdnWReWaie7x4AKdq35kR3sxsocTsSoK7uuw6UHTOVC3U6kabIWg3EgmOR53TpNzv8XCot/3KiDeSCXq9PkZ67K+4pzPZ19/2+Vyvfa9O+o4m+/qZS61TbuMB2Y2Edj7T/c45H0VjPC4Xo8FISxtV3SNkhwiYCPVTllXiLeQ1LWTXGQtGWio0YQQ9Xj993kBLomXRhgqCOuOhfjbKBVLF5vOaFrPrlodeAkR9IQJuj+m9sJTAciCnxozrgXRpoTvDwu6qiaEL852XKb+4oB3jdJd5b44M9hHwegzJw7q8GEdKON1lIlPROX2BAEOhEFcT7XlCryXWOOagzTtoolHfiLfK1bVVjg8MOKLino5Wqj3Z1kO1a2trBD2etisQmsFkfz+lapXFdOv3MP1BQJfnYB0YxoKteS50j8yYxWFhoAksgPlMsunPzGUTHOmxZ/1rtV+TntM0YZMHa6sNzTCfTdoisOpNspXAOnicGtOEgC4MOuHifLwrw8KmR6L4PG4uzjesbtsSF+djDEd6DCv5bhVul4sThwa5bMB1cGlB9+J137Wg6JwT0UGur621/LlUIU88m3GUdwQ0b83VRHvNyK8n1hx3PpN9/WRLJWKZTMufvZZY5Vh0wPIn7Luhi6PridavuRvJBD6Xm3EHCUbFzrQqAm5lNAF9uMd6Ad1O4YhbmQSHe/rNMWgPWu0zpp+XHd7BsRZDGqWUNfFqz4OU8VA/C7mkqWMogeVATo0P4xKC83PLHR0nWyhqYWFd6LXwut2cODRYD3HshIvz8a4LkdS5a2KE8/OxjsNFL87HiQT9HOpXm5aDyLGBAa4m1lq+jq7VRJnTBMmJgUE2isWWBclGscjixobjPHInB7TKnlfWWvcyOtHDqF8vV9sQWDOJBJP9/bhdanvSDYyH+ojlU02Hg97KJPAKl+WFDWBTeDQrsNKlPMlijiMhu0SA1hC32XX7VmaNHo+PqC9ksmV30mrBk3hhg3ylbIvQhvZyxlpFrWAOJOT3cmx0gJdudSawLi+sICVdm3dzZmKEi/PxjsRFsVzm+vJa1+Vf6dxzZJR0rsCt1c4WgovzMc5MjDgqLEphHSeiA6QKBVZy2ZY+d622QT424KwN/ImaIGk17FEPPzvutPMZrJ1PiwIrVyoxn0o5TgAPhkIMBIItnw9o35EKD+wexoN9VKRkOd9cie65bILxUD9uYf32M+D2MuTvbdrLMlcLJbTNyxLsJ1sukiw21/NvdiPB0R57wp+H/D0E3J66h3Ivbm1o7ztqW/hlH6uFDPlKe+1LmkEJLIdyz5FDvHRruSNxoXt/ulVc3DUxwno2z3KytUZ7W7m6tEq5Wu26/Cude2ql5V+8udT2McqVKlcWV7p2DhSdo2/Ar7UYJngtsYbX5eJIxBk9o3RO1ARSqxv4a7X3O02QDAVD9AcCLXuwbiQTSJx3PqCJ4Fa/n1KlwkwyoSoIdhG6B2KuyY31zUyCo732Xa/joT7mm/Rc2BnOCNTn6WamuXX7VmbNNjEohOBoz0DztmZrc2uTd1Afd66FfLxWUQLLodx9ZJREJtdRoYsL8zH6QwFG+3sNtMw69Nyx8x2ECepewLNdKjKPjQ7g97h5sQNv5rXlVQrlStcKbUXn6B6bay2GbF1PrDHVH8XjsHCt4VAPYZ+fq20IRrcQjukZpSOE4MTAYMsCS/8+neaRAzg5qJ1PKw8JZ5JJStUqp9vo16awh8maCJjd2PtvUUppqwgATSzdalIEzNVEgF32TvY0P7cVWWUum7R1bo/2DDRlK2hiUAATNuW3bV63xrTBaYSz7pqKOvccGQXgpQ7ysJ6fXeTeybGuDQs7PT6Mx+XqyHvzws0loj1BDg866wl8s3jdbu6aGOn4OgC4f7L1pqyK/cFYb5iQ11v34DTLNQcWhIBav8CBgdY9cmtrTPb343O7TbKsfU4ODHJltTVBcm1N26Q4MaTu5MAgqUKBeLb5PLkra1rF1HYaYivsYSzYh8/lbmqjmizmSJcKtuU0AUz1DrCQXadYKe/53luZBH3eIGGvPVWYj/REtZ5/TQjC5VyaUrViW8gdaB63W9lEU33GbmWSHKpdO3Yw2aOFZc82KbbbQQksh3JqfAiPu31xkcrluba8xn2T1ndLN4qgz8up8SGeqwmEdnh+dpF7jx7qWpEJmjfzwlys7abLz892t8hUdI4QgmPRgZY8PsVKhZvr644roKBzfGCw5Rysa4k1jjm0v9LJgUHWC/mW8uSuJVY5HOnD7/GYaFl7nGijcMel1RVcQjhS1Csa4xKCIz0DTW1U7fYIAUz1DlJFNpUrNJexr8odgM/tYSzU15RXSBdhdto72TNAqVqp9zrbjVuZNY7aaGvEFyDqCykP1kHE5/Fwcmyobc/Fize1z913tLu9FvdPjvPCzaW2xMWmyOzuObjnyCi5Yonry+09aXnhZveLTEXnnGoxBO3ampa/eNeQM70JJwYGWMlmSeabSwAvlMtcT6xx2rHnUyt0sdr8d3RxZcWx4XR6ZcRW8rAur64y2dfvSMGo2Jmp3gFmmhIBNYFlYw7WVK92Xc40sbG+aWOJdp3JnsGmPFg3a/NvpwerlXDRuUzCttw2nckmr9t2UQLLwdxzZJSXbi23JS6ev7mIEHDv0e71YAHcN3mIXLHE1aXWnzLoIrPb5+DuWrhoO3lY6VyB67E17u1iT6bCGM4Mj7Cc2WAl25yH5PxKrXfakDOLo5wc0ITFpZXmGnFfXlulIiVnhpyZi9hqqfZcqcSNZIIzw878foZCIfr8AS63IBgvr66o8MAuZLJngFuZNap7hLfquU+HayW97UAPDdtLYBUrZeYyibogs4ujvdGmvCz18vch68vf6+jibi9BmCkVWClkbPVggXYtKA/WAeXB6Qk28sW2xMXzs0scGxkgHPSbYJl13D+leZ/aCRN84ebSvhCZU8MDRIJ+nrkx3/JnX7y1hJTd78lUdM7ZmlC6sNJc0ZgL8TgBj4cpB+b3ANw9rAmll+LNnk+tqqpDBclITw99/gAXV5prLH55dYWqlJwddqZgFEJwanCQS02eT75cYnY9yalBeze0itaZ7B2kWK2wmNu9Ot/19CqHghFCHp9Flt1JxBdg0N+zp8CazaxRRXI8bO96MdUzyHqtH9duzGbWmOiJ2lL+Xmc0GMHv8tS9aTtxLa09FDtm89xO9g6wnE+TK5tTql0JLAfz8PQEAE9em2vpc1JKXphd7PrQOIDDA30M9AbrhRpa4fnZxX0hMl0uwUPHJnjqeusCSxem9xwdNdosRZehC4sL8eY2vBdWYpweHHJsw9fhnh5Geno436zAWokT8nqZdFgFQR0hBHePjPBiC+cDzvUwAtw9Msr5lXhTURhX1jQPiFNDHhU7o3t59goNu5aO2y5YQLN3r9Cw6zURMB2293o82mS1u2sp++dWy8eL7nkdXE9ra9dxm+dWv26bLS3fKs68cyoAGB+IMBYNt7yxvra8SjKb54GpcZMssw4hBPdPjvN0i3NQrlR5+sY8D0x3/xwAnDt+mJsrSWLrrfUEe/LaHKfGhogE7amCpHAO/YEgY71hzjfhwZJScmEl7ujNO8DZ4ZEWPFhx7hocwuXgXMR7Rka5vLJCsVLZ873n4zF6fT4OO6xH2VbuHR4lXy431R7ghWWtoNM9I+phULeh597c2Ng5XLcqJTfSK7ZvqkHPvdldsNQFls0hgtO92nzp9jSiWCkzm1nlRMT+9fp4eJir6d3X5GvpFbzCxREb88Wgueu2E5TAcjgPH5vg6RvzLZXu/fZVzeP1yIkjZpllKY+cOMyt1XUWE811ige4OB9jI1/k5SeOmmiZdZw7pnkzWxHbxXKZZ28s8MjJ/XEdKDrn7PBwUx6sxY00yXyeuxwusO4ZHuXq2ir5PUI86oLRoeF0OvcOj1KsVri8uvcNXxfATheMAC/G9s4ffTG2TJ8/4Lim1oq9GQmECXv9XE3tvLYsZtfJVUq2e1lA81ysFDZIl/I7vud6eoXxUJ+t4Yyg5WD5XR4up3b+G5rJrFGRkhMOmNuTkWFuZRJky8Ud33M9vcJk76Dt/RWne4dwIXa9bjtBCSyH8/Cxw6yms8yuJJv+zLev3mJiILJvynI/clITSY9fudX0Z759VXvvy44fNsUmqzk9PkKP39dSuOhzs0sUyhUeOa4ElkLj7PAI1xJr5Eq7CxJ9Q+zU/B6ds8MjVKTk0h6FFG6l1kkXC473yOmC5KU9BEmlWuXiStzx38+xaJSgx9OUwHohtsw9IyOq2mkXIoTgVGSUy+s7f89Xa2FhTvCynIpof2eX13f2tFzfWOFYr/3eNrdwcTwyzOXUzrZerf3OCXN7MjKKZHeP21WHhIoGPV6O9g5waZfrthOUwHI4D9c8F7pg2ItKtcoTV2/tG+8VwInRQQZ6g03PAWjzdXx0gKFIj4mWWYfH7eKB6XGeaEFgPXH1Fi4hePj4hImWKbqJ+0YPUZWSF/bY8D69tIjX5eKeEWdv4HX79trAP72o5SI+OObskOGjfX2EfX5e2CPs8fLqCplSiftHnZ1n63a5ODs8suf1ViiXuby6wr0j3V2Q6CBzum+US6nlHaNtrtUElt2FDQDu6tME1sX1xn1Gy9Uq1x0iAgBORUZ2FYNXU3FciHo4oZ2cjGhr8pUdBGGhVp3xmANCRQFOR0Z3Fa+doASWw5kajjIejfD1Czeaev+lhTipXGFfCSyXS/DIiSM8fuVmU6GSxXKZp28s8LJ9NAcArzo1yY3YGvNru1dq0nn8yk3umhhW+VeKOg8d0gTGU4u7h5o+s7jA2eERAh6vFWa1zUQ4wlAoxFMLu5/P04vz9Hp9nBpwdoU6IQT3jIzy/PLuDeafWlwA4GGHC0aAe0dGOR+PUdolr+zCSpxStcq9oyr/qls5FRkhUy6ykG18f7q4vsxwoJd+X9Biy+5kJBAm6gvtKLBubKyQr5Q50+8MwX8qMsJKYYNEoXGLjavpOEd6ovjd9veP2yuk8XJqmSqyLnLt5lTfCLcya2R2CWlsFyWwHI4QgteemebxKzcplMp7vv+r528gBLzi1P7IPdJ55alJYqkMlxf3zk148to8uWKJ19w1Zb5hFvK6s9MAfO383mI7mcnx7Mwirz0zbbZZii4iGgxyPDrAUwsLO76nVKnw/PIyD3XB5l0IwcvGD/PEngJrgfsPHXJsRcStnBsf53w8RrpQ2PE9Ty8uMBQKcThiX8+bZjk3PkGuXN61GMnj81p0wrkx5W3vVvSwu0s7bKzPJxe4p98Za4oQgtN9o1zcITTsQlITXmf6neEh1r1CO4mWFxMLjrFVD2m8tIPH7aWkFk1wt0OuhdO1kMarJnixnH+3UfC6s9PkiuWmwsO+8tI17js6xlB4f4TG6bz+7DFcQvDFF67u+d4vv3SNgNfDy0/uL5E5NRxlcqifrzbhzfz6hRtUpeQNZ49ZYJmim3hobJynlxZ29AafX4lTqJTr3i6nc258gvl0ioV04yI4mWKRi6srXSEYAV4+cYSqlDy5i5fxmaVFHhob74p8pZdNaHmwuohqxOPzcxyPDjDcs7/uWweJU5ERBHAheWdLlUy5yPX0Cnc7RAQAnOk7xOXUMuUGLQQurC/id3kckYMFm0LvxcSdD8ZWCxkWc+vcG3XO+nZP/xgvJucbNp4+n1ykzxtgPOSMGgGna560Czt4MztBCawu4JETRwh4PXzlpeu7vm8pmeb8XIw33L3/NtWD4RAPTI/z2B4CS0rJV166zitPTRLw2u8uN5rXnT3Gt6/cIlvY3Z395ZeuMxzp4exhZ7jhFc7h3PgEyXyeiztUqvvmrZsAvGyiO7wJLxvX7NzJi/XthTmqUnJuvDvO58FDY3hdLh6fb/xAbT6dYnY92TXenuFQD8ejAzueT7la5cmFeR6Z2B8FiQ4qPV4/JyIjPLt25/d8IbmIBO52kAg403+IYrXSMFfoxcQip/tGba9ypzPo7+FIT7Th3Oqi6x4Hze0DA0dIlwr1vLutvJRc5Gy/cx4OTYT6GfT38Oxqa/1mm8EZV49iVwJeD689M80Xnr+8axz755+7AsCb7jlhlWmW8uZ7TnBlcYWbu1RUfG5mkaVkmjfdc9w6wyzkzfcep1Sp7OrJ28gX+PqFG7zpnuO4XM5YxBTO4XVHpwD46kxjT+jXb85yenCIkZ5eC61qn7uGhunzB/j67EzD3399doaAx8Mj492xgQ96vdw3eohvzTX2+Ojn+brJKeuM6pBHJg7z5Px8w/vXS/EYG8UiL1cCq+t5aOAIz67N3eG5eK4mDJwSIgjw0KAW4fLU6uxtrxcrZZ5PzPHQoLNyuB8YOMyza3N3RB68kJhHAHf3Occ7+MCANnfbBWGmVODS+hL3OUgMCiF4YOAIz6w1X0StWZTA6hLe+fAZ1jZyfPPSbMPfSyn59BMvcc+RUY6N2tu8zSy+874TCAGPPnl+x/f81ZPnCfo8fOd9Jy20zDoenJpgYiDCo09e2PE9n3/uCvlSmXeeO2uhZYpuYbS3l7NDw3ylgcDKlko8tTDfVZt3j8vFG6em+fLM9YbhPl+7OcPLJw7j93SPR/v1k9M8v7xELHNnY/Gvzc5wqKeXkw4v2LGVN0xOs1Eq8u2FO58Sf+nGNVxC8JqjkzZYpjCSBwaPsFEu3JHP8vjKDMfDwwwFnPPQZiLUz1gwwlOrN297/YXEAsVqhXODzroe7x84zEphg/ls8rbXvxW/wdn+MXq8fnsMa8BU7wD9viDPrt4uWp5avUlFSh4ZdlZu+IMDh7mZWWMlf+d62wlKYHUJr7lrimhPkE99+6WGvz8/F+PK4grf88jdFltmHWPRCK+5a5pPPf5iwyehuWKJv332Et9530l6AvY2BzQLl0vwzofP8PjVmztWE/z0t19iajjKfUedUQFJ4TzeOH2MpxbnSeZzt73+xRvXKFYrvGmqu8KMv+PYcRL5PE8v3p6jcGl1heuJBG/ssvP5ruNaFMJj16/d9nq2VOJrN2d44/Qxx4TYNMNrjk4S8Hj4wrU7Pe+fv3aVl41PMBAM2WCZwkheNqSJkm/EN9MZitUKT63M8orhKZus2plzQ5M8sTJ7m8ftidUZBPDwkLME1iuGNFHy9eXNv6FMuchza3O8asRZ65sQgocGjvL4ysxtHrdvr8zgFS4eHHCWd/Bc7bv+Vry5at3NogRWl+D1uHnvK+7lSy9e5fry2h2//72vPEXI7+WtD5y2wTrreN8r7iWeyvDY83feqD/1+Its5Iu89xX32mCZdbzn5ffidrn4xFeeuuN3z80u8szMAu995b1dtQFTWMtbjp+kIiWPXrp42+uPXrrAoZ7eemGCbuF1k9P4XG7+5vKd5+MWgu8+2V3r4smBQab6o3d8P1+4fpVsqcS7Tt1lk2XtEfR6ef3kNJ+5cpnilodjl1ZXuLS6wnce259h7QeNiVA/pyIjfHnxcv21Z1Zvkq2UeLnDvBYArxs9yWohUw9hBPjy4mXu7h93RDn5rRwLD3GkJ8pXl67UX/t2fIayrPLKYWcJLIA3jJ1iPpu8rark15avcv/AEYIOa/9xb3SCIX8PX1y8ZOhxbRFYQoj3CSFeEkJUhRDndnnfW4UQl4QQV4UQP2eljU7k//faB/G53Xzsscdve/3K4gqfe+4y3/eq++kL7e+eR687O83x0QF+63PfpFzZDAfK5Iv8zy89wcPHJnhwujuSv9vlUDTMux4+y6cef5GlZLr+upSS3/rbbxIJ+nnfPheZraLWnNu5Z2SUu4dH+LOXXqg/YZxPp/jq7AzvOn0Xri4T570+H28/dZq/vHi+Xt68UC7zqQvnec3RKYZC3eUdEULw/rvv5dsLc1zaUozkT198nvFwuOsEMMD7776X1VyWz13b3CD+wfPP4nO7+Z67zthomfEc5PXmjWOneWp1lrVCBoDPzr1IyO3lNSPOE9FvOHQKr8vN385rkUHz2STPJ+b5znHnPcAQQvD60ZN8K36DVDEPaHPb5w3w8KDzKia/8dApBPCFBS2d4VoqzpVUjLdMOO9v3SUEbzh0iq8tXyFfKRl3XMOO1BovAt8LfG2nNwgh3MBHgbcBZ4HvF0Ic6KSSwXCID7z+YT7z9EW+el5zwRfLZT7y518gEvTzw2/YcR3fN7hdLn7yu1/DTDzBf/vCt+qv/8fPfJ14OsOH3/4aG62zjn/yHY/gEoKP/PkXqNTyTh598jzfuDzLT3zXKwj592eIZAeoNWcbP3jfA1xYifO5WtjWR7+t/T394P0P2mlW23zg/gfJlEr87rNPA/AnLz7PcmaDH3nwIZsta4/3nb2HgMfDbz7+TQC+cesmj8/P8cMPPNx1AhjgtZNTTPVH+egTj1OuVplPpfjUhZd41+m79mN44IFdb955+F4qUvInN54kUcjymbkXefP4Gcd5LQB6vX5eP3qSR289T6Zc5I+vP4ELwdsPO/MB5fdMPkChWuZTs88Qy6f5wsIF3nr4bnwOaDC8naFAL68cOcb/mnmaYqXMH17/Nl7h4i0TzkxjeefR+8iWizx683nWi7mGFRtbxZZvRUp5AdgrhOkR4KqU8nrtvX8KvBvYucLBAeCffufL+dqFG/zL3/8MP/zGczx1fZ7nby7xGx94O9FeZ7m0zeKN9xzn3S87y3//wuOsZ/PkiiX+6onzfPD1D/PAlHOq05jJ4cE+fvpdr+Pf/sWX+NDv/BV3TQzzia88xcPHJvj+1zxgt3mOQ605d/K9Z+7md599ml/40uf59vwt/vSlF/jRBx9mIuz85rWNuH/0EG8/eYr/+sS32CgW+KMXnuO1Ryd5zRFn5VI0SzQY5CfOPcJ//NY3+FdffowvXr/GZF8//+ie++w2rS1cQvBzr34tP/6ZR/nQZ/+audQ6Avjwy19lt2mGc5DXm+ORYd506DS/c/nveSI+Q7Zc5EdPvdpus3bkn5x6DY999SIf+taf8szqLd52+G4mevrtNqshd/eP8YrhaT568as8tniRqqzyj086e25/+O9+n5/41p/wRHyGfzD5AMMOKnSylZcNTnJfdIL/eP6LfGr2Wa6klnnsLR8m6m//4Y+Tc7AmgK0lSOZqr92BEOLHhBBPCiGejMfvrLu/n/B7PXzsn34v90+O8duf/xYX5mL8yvd9F2+5/5TdplnKL733zbznFffw5994ns88fZEPvv5h/sU7Dob3Sucfvup+fvbdr+ep6/N8/ItP8Nq7pvnPP/wu3A7p3dGFHKg1x+Ny8dtvfxeDwRCfeO4Z3nL8JP/XK7v7b+jfvem7eOjQOB9/5ilODg7xG9/1tq7ORfyJcy/ne+86yx+/8Bxul+C33/4ugl7neQKa5btq19iXZ65zM7XOR7/7XYx3qaA3gH273vzyA29nOBDmiZVZ/uU938mpyIjdJu3IfQMTfPjsm/hW/AaHe6L87L1vsdukXfm3D76TiC/As2u3+Nl738KRnqjdJu3IK4an+aenXsM3Ytc5ERnhX9z9HXabtCNCCH7t4X+Az+XhfHKBX7z/bR2JKwCxvaa+UQghHgMalTH7RSnlX9Xe8xXgX0opn2zw+fcCb5VS/mjt3z8IvFxK+aHdxj137px88sk7DrcvSWZy9Ph9eD1uu02xjUy+iBAc6JC4QqlMvlR2bP6dEOIpKaXp8atqzWmPSrVKMp9nsMvylHZCSslqLsdgMNjV4moriVyOsN/vmMannZIuFPC6XQRMCBtT640zKFer5CpFwl5n3pe2ky7lCXl8uIXz/8ZK1QqFSpleB5Vm341UMU+v198Voc2laoVitUKPp/k95U5rjmkhglLKTqXqPLC1luPh2muKGv09ByMkcDf2azn2VvB7Pfi9zovBthq15rSH2+XaN+IKtCeR3VbUYi+iwf211of93bEx3A213uyOx+Ui7OoOcQV0jRAE8LrceF3d82A94juYc+tkqf4EcFIIMS2E8AHvBx612SaFQrF/UWuOQqGwCrXeKBT7GLvKtP8DIcQc8ErgM0KIz9VeHxdCfBZASlkGPgR8DrgA/LmUsnGXXYVCodgFteYoFAqrUOuNQqGwq4rgXwJ/2eD1BeC7t/z7s8BnLTRNoVDsQ9Sao1AorEKtNwqFwskhggqFQqFQKBQKhULRVZhWRdAuhBBxYLbJtw8BKyaaYwTdYCN0h53dYCN0h52t2DgppRw20xg7aWHN6YbvFbrDzm6wEbrDzm6wEZq3U603m3TDd9sNNkJ32NkNNkJ32NnxHmffCaxWEEI8aUU5107oBhuhO+zsBhuhO+zsBhudRrfMWTfY2Q02QnfY2Q02QvfY6SS6Yc66wUboDju7wUboDjuNsFGFCCoUCoVCoVAoFAqFQSiBpVAoFAqFQqFQKBQGcdAF1sfsNqAJusFG6A47u8FG6A47u8FGp9Etc9YNdnaDjdAddnaDjdA9djqJbpizbrARusPObrARusPOjm080DlYCoVCoVAoFAqFQmEkB92DpVAoFAqFQqFQKBSGoQSWQqFQKBQKhUKhUBjEgRRYQoi3CiEuCSGuCiF+zm57GiGEOCKE+LIQ4rwQ4iUhxE/abdNOCCHcQohnhBB/Y7ctOyGE6BdCfFIIcVEIcUEI8Uq7bdqOEOJf1L7rF4UQfyKECNhtE4AQ4n8KIWJCiBe3vDYghPiCEOJK7f9RO210Ok5fc7ppvQHnrzndsN6AWnP2K05fb6C71hynrzfQHWvOQVtvDpzAEkK4gY8CbwPOAt8vhDhrr1UNKQP/l5TyLPAK4P9wqJ0APwlcsNuIPfjPwN9KKe8C7sdh9gohJoB/DpyTUt4DuIH322tVnU8Ab9322s8BX5RSngS+WPu3ogFdsuZ003oDzl9zHL3egFpz9itdst5Ad605Tl9vwOFrzkFcbw6cwAIeAa5KKa9LKYvAnwLvttmmO5BSLkopn679nEb7Y5mw16o7EUIcBt4OfNxuW3ZCCNEHvA74HQApZVFKmbTVqMZ4gKAQwgOEgAWb7QFASvk1YG3by+8Gfq/28+8B32OlTV2G49ecbllvwPlrThetN6DWnP2I49cb6J41x+nrDXTVmnOg1puDKLAmgFtb/j2HA/+otyKEmAIeBB632ZRG/CfgZ4CqzXbsxjQQB3635ub/uBCix26jtiKlnAd+A7gJLALrUsrP22vVroxKKRdrPy8Bo3Ya43C6as1x+HoDzl9zHL/egFpz9jFdtd6A49ec/4Sz1xvogjXnIK43B1FgdRVCiF7gL4APSylTdtuzFSHEO4CYlPIpu23ZAw/wEPDbUsoHgQwOCy+pxfe+G22hHAd6hBA/YK9VzSG1Xg+q38M+wMnrDXTNmuP49QbUmqNwBk5ec7pkvYEuWHMO4npzEAXWPHBky78P115zHEIIL9rC80dSyk/ZbU8DXg28SwgxgxaG8CYhxB/aa1JD5oA5KaX+dOyTaIuRk/gO4IaUMi6lLAGfAl5ls027sSyEGAOo/T9msz1OpivWnC5Yb6A71pxuWG9ArTn7la5Yb6Ar1pxuWG+gO9acA7feHESB9QRwUggxLYTwoSXZPWqzTXcghBBo8bQXpJT/wW57GiGl/Hkp5WEp5RTaPH5JSum4JxJSyiXglhDidO2lNwPnbTSpETeBVwghQrXv/s04LEl1G48CH6z9/EHgr2y0xek4fs3phvUGumPN6ZL1BtSas19x/HoD3bHmdMN6A12z5hy49cZjqDldgJSyLIT4EPA5tCom/1NK+ZLNZjXi1cAPAi8IIZ6tvfYLUsrP2mdSV/N/An9Uu+FcB37YZntuQ0r5uBDik8DTaNWVngE+Zq9VGkKIPwHeAAwJIeaAXwZ+DfhzIcQ/BmaBf2ifhc6mS9Yctd4Yi6PXG1Brzn6lS9YbUGuO0Th6zTmI643QQgsVCoVCoVAoFAqFQtEpBzFEUKFQKBQKhUKhUChMQQkshUKhUCgUCoVCoTAIJbAUCoVCoVAoFAqFwiCUwFIoFAqFQqFQKBQKg1ACS6FQKBQKhUKhUCgMQgkshUKhUCgUCoVCoTAIJbAUCoVCoVAoFAqFwiCUwFI4CiHEy4QQzwshAkKIHiHES0KIe+y2S6FQ7D/UeqNQKKxErTkHB9VoWOE4hBC/CgSAIDAnpfx/bDZJoVDsU9R6o1AorEStOQcDJbAUjkMI4QOeAPLAq6SUFZtNUigU+xS13igUCitRa87BQIUIKpzIINALhNGe8igUCoVZqPVGoVBYiVpzDgDKg6VwHEKIR4E/BaaBMSnlh2w2SaFQ7FPUeqNQKKxErTkHA4/dBigUWxFCfAAoSSn/WAjhBr4hhHiTlPJLdtumUCj2F2q9USgUVqLWnIOD8mApFAqFQqFQKBQKhUGoHCyFQqFQKBQKhUKhMAglsBQKhUKhUCgUCoXCIJTAUigUCoVCoVAoFAqDUAJLoVAoFAqFQqFQKAxCCSyFQqFQKBQKhUKhMAglsBQKhUKhUCgUCoXCIJTAUigUCoVCoVAoFAqDUAJLoVAoFAqFQqFQKAxCCSyFQqFQKBQKhUKhMAglsBQKhUKhUCgUCoXCIJTAUigUCoVCoVAoFAqDUAJLoVAoFAqFQqFQKAxCCSyFoxFCvFYIccluOxQKxcFArTkKhcIq1Hqzf1ECS7ErQogZIUROCLGx5b9xE8eTQogT+r+llF+XUp42YZzXbjunjdrY7zF6LIVC0Tz7dc2pjfUmIcTTQoiUEOK6EOLHzBhHoVA0xz5fb94phHixdk7fEEKcNWMcRWOUwFI0wzullL1b/luw26BOqS1q9XMC3gFsAH9rs2kKhWIfrjlCCC/wl8B/B/qA7wP+gxDiflsNUygU+3G9OQn8EfDjQD/w18CjQgiPnXYdJJTAUrRF7anPd2z590eEEH9Y+3mq9pTmg0KIm0KIFSHEL255r1sI8QtCiGtCiLQQ4ikhxBEhxNdqb3mu9sTl+4QQbxBClLNZAAAAnVVJREFUzG357BkhxFeEEEkhxEtCiHdt+d0nhBAfFUJ8pnbcx4UQx5s8pQ8Cn5RSZjqaGIVCYQr7YM0ZACLAH0iNJ4ALgHqqrFA4jH2w3rwF+LqU8u+klGXg14EJ4PXGzZJiN5TAUpjJa4DTwJuBXxJCnKm9/lPA9wPfjbbh+BEgK6V8Xe3399eeIv3Z1oPVngD/NfB5YAT4P4E/EkJsda+/H/g3QBS4Cvy7vYwUQvQA7wV+r52TVCgUjsGxa46Uchn4E+CHaxuwVwKTwN91dsoKhcImHLve6Ifc9rMA7mn1JBXtoQSWohk+XXuakhRCfLqFz/0bKWVOSvkc8Bygh8L8KPCvpJSXak9yn5NSrjZxvFcAvcCvSSmLUsovAX+DtpDp/KWU8tu1JzZ/BDzQxHG/F1gBvtrcaSkUCpPZr2vOnwC/BBSArwO/KKW81cL5KRQK49mP681jwOtrHjIf8AuADwi1cH6KDlCxmIpm+B4p5WNtfG5py89ZtIUD4AhwrY3jjQO3pJTVLa/Norm99xpzNz4I/L6UUrZhk0KhMJ59t+YIIe4C/hTtgc4XgJPA3wghFqSUn2nDNoVCYQz7br2RUl4UQnwQ+K/AGPCHwHlgrtH7FcajPFiKdslw+5OQQy189hbQbG7UVhaAI0KIrdftUWC+jWMBIIQ4ArwB+P12j6FQKCyh29ece4DLUsrPSSmrUspLwGeAt7VxLIVCYS7dvt4gpfyklPIeKeUg8MvAFPBEO8dStI4SWIp2eRZ4vxDCK4Q4h5bD1CwfB/6tEOKk0LhPCDFY+90ycGyHzz2O9sTmZ2rjvgF4J9pT4Xb5QeAbUsp2njYpFArreJbuXnOeAU4KrVS7qCWnvwN4vo1jKRQKc3mW7l5vEEI8XMv3HAY+BjwqpbzYzrEUraMElqJd/jXaE5oEWsLlH7fw2f8A/DlaImcK+B0gWPvdR4Dfq8VC/8OtH5JSFtEWm7eh5Uz9FvCBDheMD6CKWygU3UBXrzm1hzg/AvxmzYavAn+BthlTKBTOoqvXmxr/GUgCl2rn8U/aPI6iDYRKO1EoFAqFQqFQKBQKY1AeLIVCoVAoFAqFQqEwCCWwFAqFQqFQKBQKhcIglMBSKBQKhUKhUCgUCoNQAkuhUCgUCoVCoVAoDGLfNRoeGhqSU1NTdpuhUChqPPXUUytSymG77TALteYoFM5BrTcKhcJKdlpz9p3Ampqa4sknn7TbDIVCUUMIMWu3DWai1hyFwjmo9UahUFjJTmuOChFUKBQKhUKhUCgUCoNQAkuhUCgUCoVCoVAoDMJWgSWE+J9CiJgQ4sUdfi+EEL8phLgqhHheCPGQ1TYqFIr9gVpvFAqFlag1R6E4uNjtwfoE8NZdfv824GTtvx8DftsCmxQKxf7kE6j1RqFQWMcnUGuOQnEgsVVgSSm/Bqzt8pZ3A78vNb4F9AshxqyxDp5PvsCXY1+lXC1bNeSeLOQW+d+LnyNZXLfblDqZcpbPLX2BG5kZu02pU5VV/m7lGzy59pTdptzGxdQlHlv+EsVq0W5T6sTycf734udYLazabYqpOHm9SRdnuZL8fUqVtBXDNWQh82UWMl+2bfxiJcW19T8hU5qzzYa1/AvcSH2KqizZMn5VlplJ/SWruWdtGR8gU1rgavKPKVSSttkwv/El5jY+j5TSNhuMwIlrjpQSmf0LZOHvzRxm25hVZPbPkIVvWDimROYeRRa/beGYFWT2T5DFpy0cs4rMfRpZtK7wiXaef4QsPmfxmJ9CFp+1bMxOcXoVwQng1pZ/z9VeW9z6JiHEj6E9/eHo0aOGDPxC8kX+38v/CYD53Dw/MPmPDDluJ6RKKX71/P9NppLl71a+wb+5+1/jcdn7FUop+S9XPsqF9EV8Lh//9p6PcCgwaqtNAH+79Hn+7Nb/AuCfTP8Irxl+tc0WwbWN6/zaxX+PRHJt4xr/9Pg/sdskCpUCv3bx/89qcY0vxr7E/33vv8Xn8tltll00td6AsWtOuZrl6ws/Sr6yQjz3FK8a+88dHa8d5ja+wLeXfwaAVxz6D4z3vNFyG769/HPEct/ksvv3+K6jn8btClg6/kZxlq/O/wiSMpnSHPcM/nNLxwe4mPgfXEx8DIGbNx/5cyK+Y5aOX5FFvr7wo2TLiyxmvsJrJz5m6fgAS5mv8/jy/wXAy0YqHAm/zXIbLMT6PU7+r5Cpn9d+Hvo8wjPV2fGaIfcpZOpfAwKGvoDwGLNP233MP6+N6YKhxxCewxaM+WfI1EcALwx/EeE+ZP6Y2T9Epn/V4jF/H5n+f4AADH8J4R6yYMxPINO/DiIEQ19EuAfNH7ND7A4RNAQp5ceklOeklOeGh41pf/FXC3/NkG+IVw++ii/FvkKymDTkuJ3w2PKXyFZyfM/4u5jLzfFs0rqnBztxKX2ZC+mLvGPsu5FS8vmlL9htEoVKgUcX/oZ7++5humeaTy/8tSOehH56/lF6PT28ceQNfGP1W8QLcbtN4suxr7BaXOPd4+8kXljh71ese8LYzRi55sxvPEa+ssJI8JUsZb9GujhjjJEtcG39j+nxHCHkmeBK8g8sH3+9cIVY7puMBF9BrrLMXMb6deRa6s8QwsVg4EGur/85lWrB0vGrssS19T9mMPAALuHl2vqfWjo+wMLGF8mWFxkJvoJ4/gkShQuW23Bl/Q8Jeg7R652y5Vp0IkauNzL3FyDCgAuZ+6QxBu455p+AiNZ+/ktrxsz+MbgGAAl5q8bUz7MEuU9ZN6ZrsDbmX5k/npTI7J/W5jYPeavG/CPtPGUW8n9t+phG4HSBNQ8c2fLvw7XXTGU5H+PKxlW+Y/RNvGP8bVRkhacS1rl8GyGl5O9XvsnZyBnePfFOot4oX1+xzsW/E99cfRy/y8+7xt/BywbO8fcr37Q9pPL59RfIVXK8fextfMfIG4kX4lzZuGqrTelSmhfWX+QNw6/nnWNvRyD4u7j9Yuabq48z3TPNP5h4N+OBMb65+rjdJtmJLevNfOYxQp4xHhr+VwAsZb9m9pC3kSvHWM0/y2TknUyG38lq/hkKlYSlNujn/PDIrxBwD7OU+bql40spWcx8jZHgKzjd/8OUZYaVvLVr/kruGUrVDU72f5DR0KtYyn7d8gdDi9mv4ncPcG7k3wHC8u+hWEmzknuKI71vYzryD0gWL5AtLVhqg8VYuubIagKK34bQB8D3MrAgTFBWE1B6AdHzQ+A9B4WvmD9mJQblC4jQPwbvA5aEQ8rKMpQvIXp/DLz3Igvm/+3I8hxUriF6fhw8dyOLFuwJK7egcgPR8yHwnEYWLLhfVa5DZQ7R+5PgPm7J3BqB0wXWo8AHapV2XgGsSynvCNcxmueSzwPwUPRBxoPjjAXGeCrxjNnD7spifpGV4gqPDLwMl3BxbuAhzqcuUKrakysA2qbkmeSz3N9/H363n5cNnCNfzdsuZp5KPEPYE+Z0+BQPDzyEW7jr36ldPJt8Donk3MDDDPoHON57nBfWGxaWsoxEMcFMdpZHBs4hhOCRgZdxOX2FjfKGrXbZiOXrjZQV4rknORR6LSHvOBHfSZay1j44WclpeYqHQq9lJPTy216ziuXsN+jz3UXQM8yh0GuI5b6JlBXLxs+UbpItz3Mo9GqGgudwCT/LFn8Py7lv4MLLSPARRkOvJldeIl26btn4Ukpi2W8xGno1Ac8AUf9ZlnPWPgSK5x5HUmEs9DqGg7Vr0WKhazHWrjmlFwGJ8L0cvA9B+SKymjVtOG3MWqSN72HwPQTlS0hpsne4VLvf+86B90EovYiUJuc96+fpfRh8r4DS89aN6TsHvgdrY5r8gLs+5kPgezkUnzF/rd76ffoeqp1n1dwxDcDuMu1/AnwTOC2EmBNC/GMhxI8LIX689pbPAteBq8D/AP6ZFXa9lDrPqH+E0cAIAPf23c2Vjau2emYupS8DcCZyGoCzkTMUq0WublyzzaZYIc56aZ0zkbvqtrlw8eL6S7bZBHAlfYW7IqdxCRdBd5DpnikupC7aatPl9BV6Pb1MhrTY87sjZ7ieuUGmbPLNbVebNCF8Jqx9f2f7ziCRXE5fsc0mM3HiepMuzVCROaKBewAYDDxAsnDe0ptHovASLuEn4jtO1H83bhFgJW+dwJKyQqJwnqHgg4A2B6XqBunSrGU2rBVeqo39EB5XkKj/LGsFax+AJPIv0ec/jccVYijwsGZX3jobsuV5itV1BgMPADAUeJhk/rylBT8ShZdw4aU/cJY+3wm8rjArue4VWI5bc0q168l7N8L7AFCBsrnXmFYIwQWeuxHee4EylMwNPZWlFwE3eO9C+B4EihaM+RzgBe9ZhOcMUIKyufszWX4J8IHnpPZ9yiyUL5s7Zuk5EEHwnEJ4zwJ5qMyYPOaLWu6VexrhfRDkOlRumDqmEdhdRfD7pZRjUkqvlPKwlPJ3pJT/TUr532q/l1LK/0NKeVxKea+U0vQyKVJKbmRucKL3RP21E70nKFaL3Mze2uWT5nIpfZl+bx8jfk30nQ5rQsvOzfCV2tinanMVdAeZ7DnKtQ3rnrpuZ62YYKW4yskt39+Z8F3cyMxQqFibU7GVqxvXON5zDCGEZlPkrnqxC7u4snEFv8vP0R4tQuVYzzRe4a2L+f2GE9ebRF7b2Ef9Z2v/P0OpusFGybq1JlE4T7/vNC7hxSW89PlOkSxcsmz8jdItKjJPv08T+tHA3QAkC+cts2G9cAmX8BH2TQLQ7z/DeuGSZV40KSXrxUv0+7V1vdd7BI/oIWlhDlSyoD2E6vdpNvT7z1ClRKpo3XqeKJwn4j+JW/gQwk3Uf48teWBG4bQ1R5ZeBPcUwhUGr/Z3Rsnk9b58UdsYu3rAe2/tNZMfwpZfAs8JhAiC52ztNZPXtNJFTegIH3jvqo1p8oPd0ovgPV0bUz9Pk/eE5UvguQshPOCpnWfJ7PN8CTxnEMK95Tydv09xeoig5awVE6yXUhzrna6/djKsbdbt9BZdSV/lZPhkfYPe4wkx6h/hZvambTZd3rhCyB1iPDhef20qNMlsdta2ohK6YDnRe3zTpp4pqlSZy5meTtOQTDnLQn6RE+FNm47WPFmzdn5/6asc7z2GW7gB8Lq8HA0dYSZjnefgoJMonMcjQoS9UwD014SWVeJCygrJwoW6qAHo858iVbxi2d/wevFSbVxtYx/2TuEWAUs31sniRSK+E7iEF9CEbkXmSZdmLBk/W16kVE3TVxOZQrjo95+2VGQmCxcRuIn4tPtdv/9M7XVrvgcpJcnCeaK1cQH6fCdIl65TNTvs6aBQmQFP7T7kGgbRi6yYLKArs+Cp7adch0CEkOUZc8cs39g8T/c44EeWTfZ4VGZAr8jontLGNFt4lGfAXXuY7D4KuJFlk7/P8o3a+QGeE4AHabZ4Ld+ojcXm2GafpwEogbWN6xntSzvWsymwot5+wp5ebuXs6c+SLWdZKa4yFZq87fXJnklmMvZt0G9m55jqOYpLbF5GUz2TZCs5YoWYLTZdz9zALdz1UDyAyR7tZ7vE6I2MtrAf79ksudzjCTHiH2HWJjFTrpaZz80z3TN12+tHe45yM3vLEVUXDwKp4hX6/Ke0J3NA2DcNCMs29pnS3G3eI4A+32lK1Q2yZdPTXQF9Y++plyQXwk3Yd4x00ZoQECkl64VLdc8NQMR3EsAy703de+Tf/B4ivpOkSjcs+1tMFi8S9h3D7fIDmhfNLQKkitbk1OYrK5SqG3WBBxDxn6Qqi2yU7LvP7RekrEL5Jri1fYQQAjzHTN2oSlmB8mxdeAghtA2yqWOWoLKw5Tzd2vgmCkkpi1CZB/d0bUwPeI5CxbzrVso8VJfqJe+F8Gkiy8y5rWagGquX9tfGnNBEtGljpkAmEJ7a9+kKgWvcfMFsAEpgbWM2exMXLo6ENnsmCCE4EjrMraw9Akv3vBwOTdz2+lToKCvFFTLljOU2VWWVhdwCE8FtNtU27HZ5QeazC4wFxm7rDzbkGyTkDjFrkxidz2lVsLZeU6AJvxmbRF+sEKMsy0xs8T4CHA0dIVvJslrc302HnUK6dJNe7+aDE7fwEfKMs2GRwErXNq69vs0HEhGf9uTXKhtSxeuEfdN17xFA2DvJhkU5WIXKGsXq+m0b+16vNh9W2aAXs9DnHiDsm6Rc3aBQ2a1PrYE2FG/cNr4QLnq9RywLV9XneuvfQ19d6NoXPbJvqMaAQn2jCoDbXIFFZQEoIdxbxvRMmZuzU1kEytvGPGZuPlTlFlC9vaeY+whUTNwzlmt/l9vP00yPpC6ktp9n2cQ1Qhep7i2908z+Pg1CCaxtLOaWGA2M4HV5b3v9cPAI87l5qjZULtGF3ZHg7Rv0o3XPjPW5YavFVQrVwh0CayI4jguXbeF487l5Dm+zSQjB0dAR23LoFnKL9Hp6CXvCt70+GTpKvBAnV8lZbpMu+rZ/f0dDWj6WnfmGB4VSNUOhslLfzOuEvZOki9Zs7DO6wNqyqe31ateAVRvrTOlWfcxNGybJlhct6UWVqZ3n1u/B4woSdI+yYdH3sFG6RcA9jMcVrL+mfydWiLyKLJItL91xLfZaKHT1ccJbrsWe2nWRsTAncd9Srn2PWzaqwnMEqsvmVburb8g3I4JwT0Nl3oIxt1zL7qNQWTQvp1IPedTD16AmsEyMBtnxPOfMH/O28zxsspDUx9wqJI+aOqasZgy5PpXA2sZifpGxwJ2dsI+EJihWi7Y0h53LzRFyBxnwDdz2+nhgDIDF/JLlNs1n9Q367R4Qr8vLsH+IxZw14UVbyVfyrBRXmQiN3/G7w8EJFvKLtoS+LeQWGA+M1fPndMZq399Sbtlym+Zy8wjEHde6Lk7tEsgHiY26uNm2qfVNsVGyJo8xXZrF6wrjc/XXX/O7B3GLoCWbWikrZEpz9Y20jiYuJJmy+VEDm9/DNht81omLxiLTOi+a1muqeocNPd6jZErzluRApYszuISfoGdzTfK6evC7omRK9kSP7CsqDTaqrnFAQsWkPURdeGyOKdzjQBUqJt33GmzItTFLUDVp/6Z75DxbxzysVfWTJvUUbPB9Cvc4yBzIpDljNvw+j4BMIqsmtXepe7A21ybhGge5btqYMvMx5PIDHQtyJbC2UJEVlvMxxoJjd/xOf9I/b4NwWMgtMh4cv2ODHvVF8bl8LOZsEFi1Dfh2DwjAWHCMxbz1okH3ymz3YAEcChwiV8mRKqcstUlKyXxuoeE1NRbUNhK2COTcAsP+Yfxu/22vB9wB+r39LNvw/R00MjsIrLB3korMk6uYn8e4UZql1zt529oihLAsNCxXjlGlRI/ndu98b62aX7o4Y7oNmohzEfLe/mBG895YE8KbKd26Q2SGPGMIPJbYoH/X220IeyeRlMmWzW/2u1G6Sa/3KELcvi3p8R5WAssAZOUm4AX3lnuRu3bNV8zZ18jqojama/jOMavm3Pdk5aZWRtw1tGXM2jmbdZ6VRRA9iC0PquqCwKTwOVm+CaIP4erbMqYV5xnV8qB09LW7YtJ5Vm6Ca/j2MU2+hqgug2uwnhvdLkpgbWGlsEJZlht6sEZr5dHtKN4QK8QY9Y/e8bpLuDgUGGXZhg36XG6BqDdKjyd0x+/GAodYzi9ZHk65VJsH3bO3lUMBbf6sFqPpcppMJXOHpw9gxD+MQNTttpL53ALjDUQfaHO1lLenSMlBQg8D3L6p7akJLis8SPqmdjs93iMWja+H5+3kvbFGXIQ8Y7flgOk2FKvrFCvrpo5frubIV1buuA6EcNeErvlzkNnre7AgVLKRFw+0v4cNM3M8DgqVJXCP3r5prG9UTRLQ9TG3bDXdtf1VxaQxq8vgOnT7A2mXLiTNOs9lcG3bo7nNFR5Ulzfnsj6mfp4mRaBUl8G9/Txrf7NmhexVlhqcpy4kTfw+t59nGyiBtQV9891IYPV4egi5Q8Qs3ngWq0XWiglGAsMNf38ocMgWb9FyfpmxYOML8FDgECVZtrxQQiwfRyAY8g/d8btDNVuXLJ6rhZrHs5Ho08Iphy33YFVllVg+1tAmgNHAiOXX+UEkW17E7x66Le8GNM8FQK5s7nVRlWVy5dgdnhvQNtqZ0pzpfaD0EMDt4sLr6sHripArm//3utPGXv8esiZ/DzuJG92GbMn8qImN0k08ogefK3r7+LVrw+yKklJKcuXl28IDdXq8h8mVl6mYlbNzUKjGwDVy+2tmi53K8p1jusz1sjTcHNeFpEljNhQetUgaS0WduR5JXTA3HtMswRzb5TxNfDDgunMtahUlsLawkNcuykPBOydWCMGIf5iYxTlY8cIKsOlB285Y4BDxQpxStWSlWcQLKwz7G4u+euibxd6iWCHGgC96WwVBnUHfIF7hsTz0bbnm8RwNNBajY4FRyz1YyVKSsiwzvINoH/WPkCqnbCm+cZDIlZcIee68LvTXzN7U5isrQJVQg01tyDNOlRL5irkPSTKleQTuHefBbJEJWv5RyHtnWLG+2Tf7e9CPH/LcKXSDnkOWzEGuvESP984w9IB7EIGHrMlCt1RNU5bZhtdir/cwIGt5Yoq2aSB2hPCDawhppjdp24ZcuEIg+pBm5X01EJLC1QsiYt55NhA7wtUDogdpVt5XNQbubftCEQX85n6f24WHiAJeZNWkh7KNBLNrGHCbeA0pD5bhxApxetw99Hp6G/5+NDDCssVP9nVPwkigscAaCYwgkawWrSnlC1CoFEiVUzsKLP31Fas9WIUVRnYQoi7hYjgwYrmYWSmsIBAM+KINfz8SGCGWj1tafCOW1xb84QaePtgUg1Z7+w4a2hP7OxdxtyuA3z1AtmTutapv3IMNbiS6XbmyuetdvrxMwDPcMNY96DlkuveoUi1QqCZ2Fbpme9H04ze6FkLeQxSqCdOrKWbLywQajC+Em6Bn2PQ52BSZdwosXehaITT3NdVY402je8wUT4CUsrGXBTTPmQnepPqYlp5nVSue0WhM10itPL7RY5agunKnqBNC8+6Ycp5FqK4htgtmIbTzNCFnWMocyBTijgcDHu3czTjP6gbIDUSj67ZFlMDawkphpWF4mc5IYETL06pa11W+7gHZQTgM+QYBzXar0Csp7rRB7/f24RZuS20CiBdiO3plAIZ9g5aLvpXCyo5eNYAh/xD5ap5MxbpeZvr3spNA1gWWKnRhHlJKsuWlhiFRYI240AVcIxuClomLWENhodtl9vj5iraWNRKZfvcALrymb+yz5WUEHgLugTt+p9uVM6viWo38DmIfrPGibYrMRt5Ua0I19zPapjFzx0YV0DaqZnhZZArII7bnz4BpYker2Ffa+TzNKBxUXQXKjTfk7lFzqiVWVwF5h9ipj2mGN0mfu4bnaY6QpLY+NxbMo+YUuagu7zxmiyiBtYXVwipD/sEdfz/iH6FK1VJvUSwfI+QO0uPpafh7XeRYK7B236C7hIsh36ClNhUqBdZLKUZ2sAk0MbNasFpgre4q2od8Q/X3WUWsUMtV8zW+1vU5tNpbe5AoVdNUZK6h5wS0J/k5k0PT9E1tyNtIYI3c9h7TbKgsNxQ3oHmQitUk5ap5oaqbG/s7N2RCuAh6Rk3f2GtevKEdvXiAqd5M3YsX3B5uVLfB/DnQj99Y7I8AQgmsTtA3v42+Y9fw5kbWSHRh0WhDbpaoq+yyOXYPmTNmfUPeQEia5MHafW6HNO+W0ehiZidPnSnida/zNGHfVJ9blYNlGFJKVoqrDO6w6YTNjaeVBQBihTjD/pE7YuN1+n39NW+RdRv0TQ/W7mImbqHA0nPjdhNYg/5BMpWspblFK8WVuohqxLDfDg/kCtFdvGp+t5+IJ2Lpg4SDRm6XDSXUihuUze3blqss4XH14nXdGRLtc/XjEn5TBZZW2CDWUNwABC0o9qGHQO7svRm1xIvXKDQONsWvqXNQ2xjtaEPNkyhNrAqbKy/WvHh33n9dwkvYOw1YW5V2X7Gb98E1qPUxkgbnce/mCXANQTWBNLq/mi5mGnqwhqC6Zvx1XNlFeLg14WH4Ol6f253O04T9xG6izjQP1h7XkBkPBpQHy3g2yhsUq8VdPVj676zceK4WVuub8Ea4hZuoN2pp6Fu8sELA5Se8Q64aaALLcaLPYm9RuVomUUzuGEoJmujTbLI2xHM3IQow6B9gTQks08juknejvX6IisxTqprXty1bXia0w01ECEHQM2JqaFqpmqIi8zvOwWaxD/Ns0MVTYAeRF/IcMr3IRa6yvLPItCBEcDcvnvb6ISRlChXz1gM9H3F7Dyyd7zz6F5wd+Gemjb/v2WVDLtzDgISqwd/vLhty4RqsjWlwE15dSDZY14RrCCiBNLjtwi5eFi1UsWj8mLsIZuEaAplFVg1OO9hFeAjXCMg0spo1Z8wGglm4h8x5MLCbYG4RJbBq6Jvu3QRWv7cfgbBs4ymlZK24xoDvztj8rQz5rQ3HixXiDPmHd/SqgRa6mCqnKFTMTc7WWS1o30kzAtmquVotriGRu9rU4+4h4ApYLpB3C1sEGPQNWB5OeZDYy4MVcGvfj1bpzzwbdhI3oG3uzSxysbf3SPdgmSdwcpVlvK5evK7GIdhBzyHy5bhp5errXrwdbuZulx+/K2pqiGAzXjwwV+hmy0s7etAUBlDZw7MDxns9qjuLHdxmjalvyBs8QKyfp7H3NVmJAW7NE3jHmLX5Njh8TlaXAQ+4GuwN3Waepx9E352/1IW7wSGYshLTmkaL8J2/1L9jo8+zGgMRRojg3m/eAyWwaqwUtT/0nfJSADwuD33ePssEVraSI18tEN2hAp2O1d6iteLarqIBqG/grRIOa6U1PMJD2NPgD7Fu06ClNul9wHYTM0IIS7+/crVMspTc9ToHGPANagLRwuqGB4lceRmBm6C78bUR8NQEVtm8thC50s5FNsD88Li9PSfDtfeZK/J2EjeaDaNIKqaVq9/LiwcQ9JpbZKIZL572PhOF7i6hoorO0TaNPVq58u2YJLBkdQVEBCF8Dcas3X/MEAEiusOYtfM0OqysugquaMMcSty6CDB4zEoMXEONPb6mCebV2pgNHqzrQtLoMMFayf3GY5pzDVFd25zDDlECq4b+tH5wD+Ew6BtgrWiwW3sHdCE32IQHK1lKWtYLK1FM7Cn6hi2ubrhW0GzazasW8UTwCq9lnhn93PfyFlnpgUyWkgB7fn+D/gEK1QLZisEufwUAuUocv3uw8U0ZCNRuzGZ5sKqypBU22GVTG/SMkCvHTMu90XN/dhIXLuHF5+o32YvXuDy5Tl3ommTDXiITtGvBzH5kufLuXrxA7em0WXMgpaRQWa17bRUmUF1p7GGBLcLD6A35WmMPy9YxjRYe1dVND852TPLs7H6eg5vvMXTM1Z1FgGlzuwauHfYN+uumnOdO161J4nW382wRJbBqrBRXCbgC9Lgb32R0BnxRyzxY+jh7hgj6BpFIS4RfsVoiXd7Ysa+TTrRms2VitLS2p02at8g6MbNSWMWFa0+7Bn2DdW+X2ejfx942ad+fKnRhDtqGcueHOZseLHOu1UJFuw78u9gQ9IzUcm/M+RvWxIXYcx7MFhe6p6zh+HqoZtkcG/byHmk2DJo7B5VYXUQ1wu/uA1ym2VCWGSoyj9+jBJZp7CYCTAvX2014mBPeZY+o223M2uumnOdOYmc/CcnELudZG9PKBwMtogRWjZVaifbdPCCgiR2rQqeaFVi6NyJhgZjRxxjw7r5B7/NGEAhLbALNrr3mCbS5tEr0rRbX6PdpPcF2I+rrJ1vJWZKvlmhSYOlzqfKwzCFfXsXv2VlYeF09eETINK+BvlkO7GKDLnwKJm2s8+UV/O4oLuHd1YaCSSJTyiqFSmJXz8nmHJj1PazVxtnZBr9nkEJlzbQ8sEJ5tS7oGyGEG797gIJJIlMXr7sJbUWH7LJpFCIIokcL6bNoTEQP4EeasTkWO9zbRB/gtfg8I4AbaYrw2E3UCaThoZC7CSzdg2WhqDP1wYAxa5ESWDWaKSYBMOAfoFgtWhI6tVZMIBD0+xokFW6h39sPQKIW/mUm+gZ9rxAzj8tDxBuxxKaqrLJWTOwpGkCbKytsAkgWk0T3EKJgj0DeM0TQZ33FzIPEXh4s0L035uRg6aJlNxt071bepOpxzcyB322eB6tYTSKp4G/Q4HdzfLPnYKU2zs42aOKrSqGSNMmGtV3H12wwz4umz4ESWCay24YcNI+ShcJDCGFOOfFdzrM+poUeDyFcmvgwWmDJ3cb01MY07u9VSrmr8BDCByJsqJDUxtzt+zT+wYCU1b3/VlpACawaydI6UV//nu+zMnRqrbhGtNbnajf0zXKymLTApuY26ABRb78loiFdTlORleZs8vWzXlqnamJPF51EKUF/E9dU1EKBvFZM4HP5CLlDu74v4g3jER7LQhcPErrnZO9N7RA5k4pc6ILBv5vnxALvzW4hirC5sTcjYiBfrnmPdvHeuF1+vK6wqXPgESE8rp0rVpnuSaysNCF0B00cf7U2hgoRNIPNjeou90eDxU5TG1X3oMEioAwyucd5Dhp8nkWQqVrZ+d3GNPI8cyBziD0Fs4H3DpkFCnuMOWiskJQpoNzEeRq4NsskUN19zBZQAguoyAqpUqruCdqNgXpukTUCqxmvWsgdxOfyWeMBKekCq3/P90Z9URIWir69ioGAZlNFVkiX02abRbKYbOqa2vRgJc01CFgraZ6+vUJhXcJFv7ePZNHg/h0KitUUkvKeSf2aB8usHCzda7Cb50T7nZkerL0Elt8zSFUWKEuDe7qwKVj2Erp+96BpOViFyu6hovr4gCkepHI1q+U/7elNNc+DpecZ7hauqugAuQGU9t4cG7nWyBRQ2WNMgz1Y1STA7mO6h4wNY9P7eO16nlFj+33Vx9xNSA4YfJ6rm8fddUwD7xX6say8butjqhBBw1gvpZDIpkUDWFO8YbXQXF6REIKoN2pZiGDIHSTo3rtHQNRnjQdLF7vNeLB0wWO2t69YLZKpZJu8prT36OLVTBLFZFOhlAB93r561UGFcTS7sQ+4h00rcpGvrOJx9eJ2BXZ8j8fVi0v4Tcm90SrHre0q8GDTe2OGwCnU85+a8aKZJHTLa02EiuoCy3gb6rl4TcxBoWySJ7GyisCDz7V7KLyiTZraqEZrT++NGlPfkFvn2WnqPEV/XYhZNqYtwiNq8Hk2IyRtOk9Dr9smxGsLKIHF5ma7GW9Dv1crWrBWMNeDJaUkUWourwisFDN7l2jXifqiZCoZitWi6TbB3oUbNJv6AfO9RbrnJ9rENRV0Bwm4AhblYK0R9Tbn/o76+kmWlAfLaOpJ/XtUTQu4h6nIHKX/r70/j5MkPet70e8TkUutmVlV3T3dMz0z3bNqRppNGgktCAlJHCSkIwmQQDoySMJcjA/YYHy5FpYPyBh/jA1cDNdYx0IGswskFs3B+hi0gGUjaxmtI80+o1l6enqrrsysNZeI9/4REZnV1ZWZsbxvZGXV+5vPfLq7KiKeJ5Z88v3F71l8M+rNqEW1iDDlLhpJDeuqmMqJwTTFfmraaIJjMj0uTqooBGRMN5KoeD4dOr5+5b8VXoNdZ/pYZEdvoTpM8aiBX9dHoBOQAH02Y6pJSqeaFFNlyZtIalfN9iqRrGkmkjGUugSwEY3+bKA49TKOOFQKFeNv9je9Tdp+Oxbpg2gxbNYnIGwmEXOBHtUWGSYOK+2VkUOGez7lpBZFx4/zTEFARk2rar7yY9caAlSLtVzq+g4a4i9qF8Lt9S+st7qjCVbgg5nUsN41KIy6BtEcKjM+OBQpOsPjRtBoY3xpkgVnBlemzShYIWkblabYUxKNEN0LNj3QJGIsVMVZADxQmgh0DFIX2OyCrvRfFec8a6A2UWpLj81Y13YR1GpQr5WTTaQGqqmv82hsgrWib25iAiKp/8WATRHUhpWeghUvRaFWqhp/s98Ma4QqxdGkAWChGCzQTbePDxSQWjyfcqotWmnXqRWrODHegFaL1bB9vFmfkqiiAAulqvEUz2aniae8RKrohrdhXIE8aIiblhURsLaBOVRbMRb2kQ8m1Ju4rbl76XEGUiW3esrJ8HrEKXeJrr9G19/Uat9XHdp+IxbRnTLUZKIV+1k012gjIPu2wYUxRItGGaEEgD41II6aJJFNTfEt7oIcNJ5nTOIBuZ5nQF4VKE3r1BjKTtDow9NoMy5J7+gj6XHU3gQYK8ESkdeKyEMi8qiIvGeX379LRM6LyFfC/3/YhB+NTgNBqBQrsbavFqs0TBOsThMgtk8LpRod1WWtu2bMJ095NDrNRCmCYF7Banaasa+TKy7VHNrHR8ePqxbVigvmlb6eT/FrsIB91ehiL8ScVlhzUnSGP7ORgmVCPWl5y7FUgylD6k0rZnpeyakiFMwoWN3lkQoabCcXeq9DnGHPPR8MNZnop0kOjwl9omuC5F2IdQ0mEXsh3sROndu+bWabcZoi1II/daXs9RbHtSE29Z5n0JbcDWdsDbKpd9hwYLMIMuTlu5HznAIZ0n24d5564qTyV0BmEBlcJ9ybeabzPKWCDJnNmARjI1gi4gK/AbwOuBV4u4jcusumf6yUujP8/4MmfFnp1KkWKyPboUfIg2BFx6/GVNV6ZMYgcVjtrKFQVOOSvpzajze78QkWhLOwckhbjNMOPcJCaYG64fbxiZ+pqCHIPml0sVdizpYXNDYYpZxEi17dCpbnt+j4q7HaYpcLi7S8Fe1Dbvtt4ocTHBHHnIoWo008mEuPizPsebsPJpqNtLxlSk5t6LDnwP6h3vY6oZQ3ctjzpGKvxJtocSzOkO+iaKGqiewEC9X5YD7SIGhWk2Itjk0QSac2vH7QhILljOgEbEKpc0ao/ZoJ1tAhwz2bteBPXY0u/GVt9VcwXgXrRcCjSqnHVZCc+iHgTeNwJG477Qi1YpVmJ5i9ZArNTpgiGKOuCLbXO9UNeRQQGYivqk2705Sd8p5SsCCfeqd6u0GtWBu5iO77VDPePr73TMVMO43qx/YLwWKPxJygNffoIF7q1WDp/fz008JG+xCQC/1DbgMfZKRyEvlgovYnTqMP6Dcj0a3eRMOeR5FMiJREM50U49gvOpVQSdR7H1peA4XHVIzPwwRiT8SbeAtV3cQjweJYMwkYil5aok6bI2KI9ms7YqYZbLu2ed5PE6Ru1HmauLb7g2BdBTy97d+nwp/txPeKyNdE5CMicvVuBxKRHxGRe0Xk3vPnkw9Xq3fqsZsRQLDwVChWOyYXw00EYX4PLYaTpi2KSKj2NY355CufZmeVaiGBglWqGVfVgmcqftvhnlpkMB2vd/9iXqva/ksR3BMxJ27NScGZxpVp7alpW0lS0wzV3gTKSRVHCjF8WNBOMvvDnuPVoQG0dXbloq/ixWs2skjbr+OrrmYf4pFMEaHsLmpPF42uaUlTzcMew56IN8nIziQTrBiLY0evUheLBESkTmdt0p4kO1UDNsfxDOmLRXu9ycX/A5xQSt0OfBz4nd02Ukp9QCl1t1Lq7sOHDyc2stKux27cAPRS5Ew2umh0m8wVZmOnLVbCxXDTIJnpq2rxyUy1WDHq00Z3Ax8/tioDAXFY667R9fUuVrYj6TMVkVaz969J2SlTdsuxtp8rzOGKu58UrDgwHnOittRxEJCLeqLjj0K7R7BqI7ftp8fpJnmj5z9FKLkLtHVfA78RDnse7UMpvE6mlMQ4JK/USxfV+53T6l4c2UEwQtnEfQiPF+dZ3Kcwv8aJRQLmARelbaHaGF4LBWHdkgS1NlpsxlF2dJOARj+9cqDNSn9bLTaTKHWarq1qjIFIrgxvzAIGiGR93xCsZ4Dtb2uOhz/rQSm1rJRqhf/8IPAC3U50/S6r3dVkClYOtSmrnSbzCdLeSk6RGXfaaG1YMzx2knS8arFi1KdGwrRF6BPkKOVRN6IZZnGbSQQ+BYHf6P1LWKsmItSK1f2kYI095kTKSdyak6D+SLdqUAf6xGGUfTDQ4KG7nGBhXzNAbqIasNGfUVdKFGRWO7loeRdxZYqCM3poe0RA2jpnvhClCMaLU2W3pr0eMHp5UIrpw4Rh7PEmMFIfuWgUkXCmkC6y0xje+AEQCZtDaFOTRhMskRLInD5Spxp9AjXU5qxG8lqPQV5ngBJKW21So09Oh9os6jtPVY9xnhX0kvTRz20SjJNgfQG4UUROSlAJ+Tbgnu0biMixbf98I/CAbiei9LW4Ldqhv0A3mfrW6DQTpb1BQDJM+tTsrlKQAjPu6AVBBNMpgknTFmE7mTHj15a/Rdtvx24mEfgUPlOGSB8ECmTcmr4ItWI+89VywthjTsdfQ9FNsKjVnx4XqSBx0rIiEqZfQarHVi1K7gKe2sTzNc2uYbtyEu8+lNyaASWxEd9+uNDQ+Sz4qkNXrfeOPdIHA2pqv5PiviRYY483APjN0Ytj6A3+1YI4i2PQOyg27uJYk02lVDziAYG6o8WmD6rZV4sGmdNImJXyQpujCLME10KDUqdUG9RmMLdsqE19JD2YjbaFxLmfMTE6Ad4QlFJdEflx4K8AF/gtpdQ3ROTngXuVUvcA/1hE3gh0gYvAu3T70RsynChFMKpNqet2p4dmp8mJ2ROJ9jHd3bDRaVIpzsdu3AAB8Vn31un6XQqO/sctaV1R5NP2fY35lID0TblTlJwSDYNqUaPT5Eg5WbeuWqnGs1tnDHmUL/ZCzIkUgDjqEQQKUqP1sE4XaHl1BJeiMzdy25IzDzi0NNcftb1G7IV9b+CyX2fGOarFfisimbHvg36i2/Lria+BTgWplTA9r+zWtNeh9dRUjYuavYK9EG/6i+MY30VS07QgD+YSxVqoaiM7W0Arps0FPUqd2gQ6yAiyE9is6kmdU6uAQkaoZoFNXecZlIbEurZS1UOYI5KW5/3s2axlP1aIsREsAKXUx4CP7fjZz277+88AP2PSh0jFSKI2FJ0is+6scTITtx16hEqxwqmNU4Y8CtMWE6pq0XVtdpsslvR3imqkUrAiBdLM/UvaATJCtVg1lrYIsNptcv3cdYn2qRVrPNB80JBH+WPcMaeVID0PooX9RZRSiV5sDEPbX6HkVmMdT8Sl5FS0KlhKebT9ZuxrEJGQtldnpqCHYCVJk4y2093oo+01EtkHtCpI7YQks+TU6Phr+Kozsq17fB/qFGQG14lXFzppGHe86S+Oa6O3dRbAezK7TT/8DotD6pwF8M5qsJlgcSwLelqJqyQkYD8Qj5jnqYVIhseI+wzlfW1jYq83uTCOvtqQcDFcMqcWtf02W/5WItIAQZqj8bTFhD71yEzbkFrUbeLgMFeYjb1PpHaZulYRSUpzrUz51Ou2mMKnDW+Djt8x4tdBQz89rxZr+5K7gE+QyqXThySKge7mBm2/CahEygnoJhfBseJeh7Kjvw6s7dUpuTHtG2i00VePajF9iMYG1LX50PJW9mv91d7AOBbkKgnZqeklAbEW5DU9c5OiRX2OSl2feOSY8hkdI1ebCZ4hXbWDSUhdTBx4ghXNHUrSUAICMmOqi2CaFLNo+w1vg7ahxXCzu5qciEb1Tl1z12q+OI8zbNDfDpTdMlPOlPEUwaTPlMkUz7XuOgqV+JmKCJnJ+VwHCUm7pvUXtfqaTLS8emzVAvTXH/XJTTwfTKTHtb167AYTkQ/669BWYj8HjhQpOnNam1wkfRb7nQz1+dDy4tfiWaRAogV5DfyVoLYoCxKRupoespNITVrUTOpi1mDpUHaSXFtd5DUJYdZUg5X8xUBdo81a9mOFOPAEq9FpMO1OU3KSpTyY7K7WS1tM2uQi3H7VAHFQSiUe6At9kmhMLUrRuAHMqkVpUwQrBlva9zpApmicAmYbuhwkJE4RdPQPGw4aTMRXDcruguaFfcLUNAPqTctPpuKV3Bqe2qLrb2qx76sOHX8tNsmEoCmJbnIDSdJVg+20Pgv+SiKyb5EQCRaq4iwAXciqlidQPMSpgdqk30gxrc0k51kDtR40UsiCxCmCDY3ktRbDZg1UI2iMocVmzBosrSmCORLJJIQ5Jg48wQoW6MklwUBtqGf/wOyCaIBx3CHDEXqDYQ2oIJveJl3VTXytqjk0lEhK+iDquGhOVZt1ZxI39agWKqwams/VDBWoxHV9IUlsGhyqfZDQ9uoIBQoyE2v7voKlV71JRC4cvQpW1DAjbnpcyQla8epWb5KqeNF+euw3LzluXB/MpAjGvQ/6n8WWt9J7iWBhAL3FcZwmF+FzkHWBnIh4RHOMMj5TvbqvOAvyaC5VxjVJArITNIjwQK1ls5kgjS2w6We3mZgwb2Qnr4kIcxVohY1OMiBSUq2CpQ/NsDNeUlSLVTqqy5bG1sERGilreEx2x0ubtlhySkwbnM/VSEmwqsWqMdLXSDhvKkK1FAQTE+l4jZS1hv0B1vtmFtZY0Q5TouI2rNA9h0oplSpFsO3pe5nUS02L+UUWNNqoaieZSVLTtncy1GI/Rfc83UOngzTJ6dgNJkzVwlkFyyB6C/La6G11DcSNiEvcFEHInuKVZHEcbZOVSCZKEdQ0EDepmrR9n7RQ0f2MWd8Gmc9T+Q1AwgHYo2zqOc/ApgsSv55/FCzBSrkYjhaqe4nMmJzvFCkg6ciowXS8bvLGG2DWp9XOamL1Ecw231hNXdcXPue2BksLWn6yBaXu+qOu2kDRTehDDUWXjp/xTWiIpCmCgQ+6G23EbzAB/VRNfQpWcJwkJK/k1rSreMnsV8P9ND2L/iae2rI1WCbhJ1gca1qQ9wbNxmoNH26jsn3nBYtjJ97i2NGjYAVDfIsgMeo4HT3qYHCeU4jEeCniaLy2MovE6RyqjdQ1QCpInNp6nYqkE6+7blxYgtVZTUewCpFapH/h2ew0mXKCuUiJfAoXwybUouiYSdrZRzDVvGHLCwb6pk0RjOZz6UYzxZBoMDvAutFp4orLjBsvNS1CNJ/LlNp30BCk59Vib+86U7gyrU29Saoewbb0OE0zkFp+HUdKuHEWJtt80N2iPM6g5e32QV96XH8OV4JauLCToS4lMahDq8XePmi0Ma+N5LX95NfAIhmUXweZIZhzPAKaFuT9xbEbw+Y4FuSRzXo2m34DnJjZCI4mm6oRv414T03KqtTV4ymgsI1I1jPaTHKeGlNbNdZfwQEnWJ7yWOuupWqS0H+zb2YxnEaVCeZzzZhV1VJdKzPNG9I2k4BttWGG7l/atEUwk47X7DSZLyTrthihUjDXfOOgIalqAIFyEKk+WZG0sQH0yZhO9aaU8E1hoGDpITe+6oZzuJKl54HGa9BrdpLMB1+18LLWGkQ+pEjP01kHFh0nScMVi4SIO2QYNC7IEyyONasPsaCLSPqNFNe2nt1m0murg3gkJnX1bDYTXduIvOb4DMXEgSZYa921VK2rod+C25SClcYnCGpmTKhFzZSNNyCaz2XCp7AzXkpVDfSrRV2/y7q3nuo6mVSw0rTYj1AtVmyTC01o+41Ei2oImky0sy56evbrwTET+FDSPP8oFcl0atrqnzoJ53ABFJ15wNGuJCbtZBjsq8uHRuL7UHZq2tMkk6hoFgnh11MsyHUoWDmrD34zueKhQzWLfW1r/X2ywE9xbfMkzLpIumrEbzahqzmLJVh60WuHnipF0GANVsq6MAhri0yoMt0mc4U53Diy/w4E87k2tc/nis4zDXHotx/XS/zWukGdSppUymA+V9lYimAanyAg1SaUvoMGpfzEqWkAZbeqv/YnwaJWv3qTLDUt8kFXo42kw54BRBzKTlVbmmTSOVygP00xaJGekOxrbLTRr0OzCpYxJFmQywxQ6NdQZbEZm3jMAQ4qq/qg6gnOU6OCFTeG6GogohIQSW3qYD3BtdVJduIqWLqubd2mCOpErx16ihSzglNgxp0x0vEti4JVLVZotM00SUjvU7V3DJ2IVJW0TS6CY+j1qZEhlRLMKZCrYYpgGpicz3WQ0PHXUHgpUgT1qTdpGkz0FvaafEjaxTDyQeHR8bPH2zRpksH2+shF0mYnoLeTYZo5XJEPulMEbRdBg0iwIBeRYLGaY6qViBMQgRzVB5ECyGx2UpeAvIqUQpv1jDbrCQjWNFBEZU4RTELqZtFG0uPWfYWdBpUWpS6mzZg40ASr2VOw0rHWSnFe+8IzqAtbT9UkIfCpYq4uLKVP0X6653P168LSNynRrRY1e6pahvun2SelVOq6PgjuX7Ozip91YOEBR5r0PAhTBHXVYPkrgBOmvMVDQWZwKGpMTUvWwQ+2DbnV4EPa+1B2a1rT85KkB4LeWrg0c7ii7du+HiUxehZLcd9UWyRHkgU56BkUm6QpAmgidQlIAATnmWfDCQgH4ma12UxA6iQccJz+2iqlEpLXyGb6Z0gpP9G1FXEDkpVBkVTKA7UaztTShwNNsLKkmEFU/K9XwVrtRHVhaetlqmx6m7T9jIPediDotpheAQmOoVvBajKTYqAvROl4U9rVol7jjZRkpmZgAPKWv0VHdTKQvnl8fDa6G1r9OmhIW3NScqt0/NXgS0CDD2WnGq/bVggR0dbcQCk/bDBRS7RfSaN6kyZNMvBBXyfDtreSQsnUN+g3IpnJa7AW8FUbT21m9yHFs2iREH78BTmgZ0GumvHTuyBQsDJ8rnsL8kTnWcm4IO+AWg8G68a2mY28KtUCtZmMBEi280RtAJ1k55mVSKp1wEeSPEMZSV3vGtkUQX1odlZTta6OUCnOa6930qGAgAEyk7EuLDiGXjLaSDkDK0LVgFq0mjFFcL5Y0X6d0s5Vi9CrV7N1WJmQOjXNqQKKdta3vITKSYqUrLKrp7lBkOLnJyY30fZayEWKNEkI68A0tihPqqAVnTkEV5OCFRwjqYqmsw6s5a3Y9ECDUKoFbCVbqEol40J1HfCSkQCnmpEErAEquc0s5xnF4rid7no26xlsJhgyrMtmb1B10vuZwWZvgHMt/j6S8RlKc21j4IATrAaVQiX1YLFKsaK9rijLvCnop+PpVNbafodNbzP1An3eoIKVpltfhHkD3fEa3SYFKTDtxi9e345qocJad03rfK4s7ezBHGk/aEgzXBa2d4/Lrmymac0d+LCgRT3KUv8EelIE08zhAig5QQ2W0pAq2/LqiZudiDja6vH69yFpw5XaJftnQdpn0SImeovGWvx9MqosvcV8nimCkc3EqZBZSF1ksxZ/H6emSWVJQurGcG0zq0nRc5vneVqCpR1Z0t4gSBFc667jaUjd2e4TpFcbIsKhczG8mqHWCaDkFJl2p42k46WtC4NQwdKtQIaDq7OQduh3I9SBLN0yYftQbUuwsqBf+1NLtF+kdOhQLlp+PbFqAVEdWHb7aa9BWTfJjDsg9DIf/MyNNnzVpeOvplMSHT11YP0hv8l86HeUvJjdB69uOwiaRE8JyHGhqlIsVLPWfaVJ73IyKnVpFuRZm3n0yE4tgc2shDnFtZVsaaapXgxkramLCHOSFwMxcLAJVnc1NZGBIEVQobQuhrMM9IVts5Q0EoespA/M1Ks1O41UM7AimGgosdpppr530K8H1Nl8Y1Vb2qmdhZUFLa+OUKAgs4n266XHaao/SpciuKA5NS2ZD65M40hJ2zUoJ0zPg+1KYjYf+nO40vmg5z6EQ36TpgiG2+uYy9byVxIraBYJoFIuVFUzvUqbSvEISF3qximpyE7WFMG06XpZzrOZ2mZqpCHMTi1bimCqtMSMtWZWwdKPKEUwLUwsPJudJsUMKWYm0rka3ShtMRsZ1elTMNB3I6MCOa9dgWxkaGcP/dRQncpaRNbStmmfK8wiSO85sEiHqP4pqXKiK0VQKZVqyG/gQ5W238BX2VJXo3NI6oOIaFTRGqkW9rra1aeZw9X3oaopPa+BK1O4zlRC+3qGTgfPYvJOihYJ0Fs0xv8+krDeM6hrSoEUapJIFeiGDRVSoJeWmMCmUwFaYZ1aCqRQPIJGEZ3059mzmVQ1y9AgKYVqJk4F1HrQCCSVzTQpggFhTk9e6/3jaEQsgiUijojcJSKvF5FXicgRrV6MAUqpzCmC8waGDUfNJNKmmJWcElPOlF6fegpW+mulewBy1Agia5MLhWK1o1GBzKqKmnimOqvMurOpui0COOKEBDk/BWs/xpy2n57cBPtnI1ie2sSnk2phH/ndydhoo5WyRXrkg5Y0SS99miRkV7DS1qEF++hptJFmDhdsb7SR7VlMOxPOFPZjvEmlBETbpo01qZSdjIN/VUplBzKcZ2QzYQMRSJ+yl+La9glzyu/utOogaLBZi29SqkAH2EpnM019WwwMXXGJyPXAPwNeAzwCnAemgJtEZAP4T8DvKB1Vvzkja+tq2KYWaez6llUBgZDMaF2gZ6vBguBaPbj6sC6Xej7N61Agu01qpexvLpRS4UDmLCmCJlTRRuZnar6Qz7Dh/RxzWt5KqoV9QWYRCuNd2PfIRYOyu5jah3bKNEnQN3A5fZpksE9W9SZtHRpENVjBm9q0L+GgX4eWFCLB3Kq2n60OrHcNxqxg7ed4MxaykypFsBbu2wD3WD42eySgCSTn0sEgXekNuY2F7aTOvTKFzWYKm+H99JuphugGQ4pLBB+JuDZDO34dnOTfFYHNMiJJbEbn2YAU2V/Kb4DMBUOoNWLU0X4BeD/wD9QO7S18w/N/AD8A/I5Wr3JA1tbVwb7Bg66zk2Cz06RWrGU6xnyx0qu70YFmp0nZKVN2y6mPUQm743nKwxVXi0+QNW1RbzrlprdJR3UzEdFpd5qiFDSroquZrhOYaWk/APs25rS9BvOlk4n3C+ZQVTMTrKjuJo16VNpGLtK/PuiTmzTkoOTUaLQfymA9GCgZzOEaXw1Wfw5XGh+qKDw6/holN/2dSFuHFviQfR5Y2lb5BrBv4026BXlEAuopbTaAqWSLY8lG6oLznEIkwfokq4KlGiCVYMhtXETphKlt1kObCSp7ekQyrWpWh6QNgbaTnVQ2Ew5whh3k9WgKm/VUBHQUhhIspdTbh/zuHPDvdTuUF7K2rgaYcWdwxdWqNjQ6Ta6duSbTMarFCme2zlz2806nw6lTp9jaSiaj3tC5jhPFa3jggQdS+3TCu4YfLr2bBx94EEfDYEnP8/jh0rtpPb3FA5LOL08Fx+g+3eGB0+nPDWBqaorS4SDAZyHtIsK8AQXy+MzxTMeoFOc51zqvyaPB2M8xp50yLQtC5SJjimC0f7o0xVp4jHomH1op0yRBT4pguzeHK3kNVkFmcCgmuga7xdyOf5xrvV/hiUfqiCS7p13/Vq71foVHHnoCJ8Pb1kr37+NIkQcayePeoe5PAfDASvqY6fkdrvV+heUnq9RTxu+pqSmOHz9OsVhM7cd+iTe7PWfKfxGo25CVBC8lVBnl/0fk4jSkuC/KfzmoFyFJng01G9os5GhzPrTpjLS563PmN5KlB8I2dTBDWmJam2lTu9PYjIhkllTIpAQrI0mPCLNuxIrQIvKvgH+pVFDhLCIV4NeUUu/W7lFOyNq6GoLalPnCnLaGBEopVrurvblRaVEpVnh49ZHLfn7q1Cnm5+c5ceJEojcSZzbP4KO4cjqFfB9ivbvOudZ5rpw6lkkJi9BoN7jYWeHamWtSEzZPeTy18TSLxQWqGVIElVIsLy/z7LMBqc2SIgj628c3O81M7ewh6gKZX5v2/RZzoqL+pAN2I+hQsHopginIRVlT/VE7Zf0ThB30/CZKecneHF9iP1JOkvsQKInJ1JvdYu5G9ywt7yK10nMSK3kdb5W1ztPMl05QcGYS7bsd9ZZQcqrMFJPH9LXO0/iqTaV0fWr7La/ORqdMpXQ9rpP8+yCKuadOneLkyeSq8E5MerzZ7TlT3adBbSDFm2MfR6kOdAWcq5AUqcCq+ySoNlK8MYHN9hhstqDrgHscGRIPBz5nfiNZbRtcmgqZBn49uc3MqlkK4qFJHczVpt/U3uAC4ncRLACfE5HbReQ7gC8AX9TuTY6IUuh0kBldCta6F3S0y5rOFXTHW7usO97W1hZLS0uJv9SDtL5sqlOUFuhpSmXvKg8J/0sLBwdB8MjWRVBEWFpawmsHHdaypAgG++vruNjvtpj9OW/5LVpeyq5LybGvYk5U1J9WwQrac2dUsHo1WNlSBLP6kPoahAXb7QyNNqLaoWz3oR57+91irlIeDm6qNMmIWPoZOp8qpVDKT01SBTeT/cCHYP/UPoQxN2k2xhBMdLzZ/bvdA5Je32j7tPfXg8T3dIw2RzzHA58zlWJBnrWBiGokT2PLXFOXJl1PR4pgLdk+klWpS0GYYyCWgqWU+hkR+QTwOWAF+Dal1KPavckROlIEg/31vdnXURcGl3bH29m8Ic2XuodPOWPdlKthYbAdfljLlaXQW0RwxdFC+kSk1yI0M0EuVnhq41Rmn6DfgCU7wZrvHe+wBgVyFPZbzOkv7FOqN06VVuYUwTrgUHKSxzxXpnCkrCFFr5E+TbI35Db9gNosLdIhStWsJ9pnZ4xSqpuB3ARf2SrDS6FoX4n39X8ZHHFRqpup0Ubfh/TfK1li/07sh3hz+fXwIHEaqYT/p3y+lAdSSriTE9pM+T2cymZ8Urfrc+Y3IKn6K9NAEaUa6V4L+00oJkz1z1hTh9+Ewk3J9tHRLbF4a7J9onie1qZKkQoZA3HbtH8b8OvAzwN/C/z/RCR5G5Q9hEanyaw7k7p1dYRKcV5bOpc20retO15WKKW0NKaI9q9OVbnzzjt7/z/xxBOpjrebqvYXf/EX3H///b1//+zP/iyf+MQnhh7HEXfkHKw/+IM/uMRnx3H4yle+ctl2fkjU5gpzMc9id1SKVZrdDAMJt6FP2jU9UzmlCe63mNOb/5QxRTDLMxG0J09YmB1CRDLXgWVPkwz2y6KiRfumrQPT0eBB4aUmN9G9SzLXxnXdS+LXN7/5GBDEvlQ+hItThZ8q5gK9NM9BJKnT6fDOd76T2267jVtuuYV/82/+TSpf42K/xRsgVGeSZZ4E98MdqezsBtd1uevuN3LXC74r0Xd7z+YQsjP8OUuu1EU22+1N3v3ud3Pbbbdxxx138Ld/+7fxDqCSKx4i0pvXlAp+PdHcrcDmFFBCZalNSqhgiRRA5sOGJ2lsNpOnCMocIGHDk4TmlAqbXIxJwQJ+GXirUup+ABH5HuBTwHOyGBeR1wK/RvDp+KBS6hd3/L4M/C7wAmAZ+H6l1BNZbEaI5k1lhc4UQR11YaB3MRyRhqwEK0rnm56e3pWcJIWHT2GHT3/xF3/BG97wBm69NXj78fM///Mjj+PGIFjveMc7eMc73gHAfffdx5vf/GbuvPPOy7bz8TPNm4pQKc7jKY91bz0zWes9UxpqsCA/gsU+izn9FunplJeSu4CiS1etU5R0z0Q06DgtgiG36dtz99Mk09dgQbZGGxFBzCtFcDf4ysN10jVmkHDBrIg/8HlnzO34G6y1n0itHkWtjJXyUsVcAB9vqP0Pf/jDtFot7rvvPjY2Nrj11lt5+9vfzokTJ1L5HAP7Kt4E8Ii/xNuO4WRnEKanp/nyvX8KzgKSuN26M5TUDX/O0qQIArj85m/+PhB8r587d47Xve51fOELX8BxBhPTYEGeUvGQSiqCpVQ4yyqNzZSkTikP1Fo4SyuNzXoKmx1Q64ltijgoqfSHMSfCFtBBDDS5iPt64yVR4AFQSv0Z8LIshiV4FfcbwOuAW4G3i8hOXfDvAytKqRuAXwX+bRab29HsNJnP+FYfArVJV21KX23IxqT7i+HsxC8iH2nfdkaI0vEUl7+BP3HiBBcuXADg3nvv5ZWvfCUA73vf+/ihH/ohXvnKV3Ldddfx67/+6719/uT3/5hvf+GruOOOO/iBH/gBPvOZz3DPPffw0z/909x555089thjvOtd7+IjH/kIAJ/85Ce56667uO222/ihH/ohWq3gfr3o5hfyS//q3/H85z+f2267jQcffHDoefzRH/0Rb3vb23b9nVIqMzmGPhnScf+iEQLZaw37KYI5YV/FnCwt0qE/LyhLHVbaQcc9HzKSi6z1TzoabbS9lXAOV7oGESW32mu0kRaKoAYrDUQEkWw1UEp1uePm72B5ObgfcWPu7/7u73L77bfzwue/nB/9offwd5/5u1Qx98SJE/zCv/wlXvHiNw+MuSLC+vo63W6Xzc1NSqUSlYr+BdA27Kt4EyjdHqSpnZZ0BCvApWpS7O/2//D7PZvRcxbnu10pn09+6jM8/+7/bdfn7Od+7ueGfLe73P/AQ7zqVa8C4MiRI9RqNe69997hp6g2gG443DYhnFq6NDa1BngZyE6KF6O94bspbEo1Xd2Xn8GmU0l3nmnmxcXEqEHDfw/4Q7XLt4lSajkc0ndMKfU/U9h+EfCoUurx0NaHgDcB92/b5k3A+8K/fwT4DyIiO+dVpEGzs8rx6ewZAPO9dLzstSnNbhNBmCskH8K5HX0Fa/AH+Q+e/COe2nh65LE85dH2O5Sc4kgV65qZq3nHtQO73uKKy9bmVk/9OXnyJH/+538+9JgPPvggf/M3f8Pq6io333wz//Af/kMeeughfv3f/Tp//d8/zo1X3sDFixdZXFzkjW98I294wxt4y1vecskxtra2eNe73sUnP/lJbrrpJn7wB3+Q97///fzkT/4kCNQWF/jiF7/I+9//fn75l3+ZD37wgwP9+eM//mM++tGP7vo7H1+bKgoB4c7SuRGg0d17qugw7NeY02uRniFFEAJyMVu8Kp0P3gozhfQxr+zWqHfTz6HKniYZ7JclRS8YlJxuDhcQtnf3afuricnqVy/8Eo3WQ3T9DRwp4kg6FavrbyLi4EqZavlm7jj000O339zcvCTmfugjvwUMrn/aLeY+/PDD/MIv/AKf+cxnqC3O8NSZr3D1Fbeli7nA0lKN//m5j/G7H/zLXWPuW97yFj760Y9y7NgxNjY2+NVf/VUWF9MPuB6E/Rhv/Oa/hs79ARGQEoqEz5naAhRKtg1sLd6CU3nv0N02Nze56+63ghQ4efLGhN/tN/IPf/QdPPLQN3rP2aFDh2J8t6/z7h/+v/jEX3+Um2/5lsues0OHDvGlL32J//gf/+Plz5m43HH7c7jnnnt4+9vfztNPP80Xv/hFnn76aV70ohcNuT7hd2BaNck7m3y/iASkUVmkko7U+RnPM02KoMpAdiSlzR6py79N+xLwZRH5IkFHnWjK+Q3AK4ALwHtS2r4K2L7CPwV8y6BtlFJdCYaGLIV2exCRHwF+BOCaa+LNkGp2mlQqmdR/YNub/U6Tw+VDmY7V6DSpFOczz4macacpSKG3uNaBLN36IrjiMjU9lShF8PWvfz3lcplyucyRI0c4e/Ysn/zUJ/muN38XRw4HE9hHffE+9NBDnDx5kptuCoo13/nOd/Ibv/EbvSD8nW/6Tnx8XvCCF/Bnf/ZnA4/zuc99jpmZGZ73vOft+ntfKT2qqMYaumanSckpUU7RCnk7Sk6JKWcqjxTBiYg5SdHy6oFy4qRL7+upNxlqoFpeg1o5YfHwNpScbApWP02ylmp/HY02WhlmkcGlw4bTqIG7KfhJEZDD+MfZmSK41Q0e5UFztHaLuZ/61Kd461vfyqFDh/D8FguLNfwhKseomPuGN70GEXdgzP385z+P67qcPn2alZUVXv7yl/Oa17yG6667LvZ5x8RExJvka5wsz1m6hhNBiuCHwb0aifES5dLnbImzZ87xqU99tfecQZzv9gc4eeIqbro5aEW/8zn7nu/5HoABz5nLD73ru3nw4QvcfffdXHvttbz0pS/FdUeoyz3FY/Q5XgapgP9w8v16pC6lguVdPhd1JKIUv1RqUhU6z6awGV3blKQujWqWhdSNwKhBw78mIv8BeBWBXH47sAk8APyAUuop7R6lgFLqA8AHAO6+++5YkeWnbvrHzGasbwG9tSnNTjNzi28IvoArxfmhKWbDlKbtaHSaXGxf5Jrpq3GdbGmCg9IMC4UCvh8E9J3tUMvlPjFwXZdut4tPVBeWfWCxIJRKJXzl944/CB/60Id4+9sHXzcfP3OtE/TVJh3DhqNnSkfHLZ31hoMwKTEn6YLnZOV7uWLmxanvQ1/BSkewlFKZBh0HPmSbQxXVTqX1IWq00cpSg+XVU3cQhH5zjDR1YHcc+mk8v0Wz/Rgzxasop0wXXes8je+3qJRvSLW/rzwKBRffD74q48Tc7dheg5UWpbKL4A6MuX/4h3/Ia1/7WorFIkeOHOFlL3sZ9957r3aCNSnxJskax6m8F6V8UJsgJSShUqq80+DXkaSd3Hrox4b43+0Fut12clO9DsC7x6PIxu7PmUuh4PCrv/qrvZ+89KUv7b0UGGwzg+KRNkWwp2ClUXaykro0qllGspM2RbBzOvl+fgbyOgIjV6hKKU8p9XGl1PuUUv9AKfWTSqn/pCHwPANcve3fx8Of7bqNBFG9SlAImhk3zN/AsemjmY+jszal2dHTeAP0tY/3lIdAZlUN+o0ydmY/nDhxgi9+MRg58qd/+qcjj/Ntr/w2PvYXH6N+sQ7AxYsXAZifn2d19fL7cPPNN/PEE0/w6KNB193f+73f4xWveMUl24xqdOH7Pn/yJ38ytP5KKaXl/s0V5hBEE2lf1VIXBno7Zg7DJMQcpdQHlFJ3K6XuPnz48EjDs8UrOTz9wrR+b0uPS9dkwlNb+KqdOj0Pss+h6s3hyuJD1jowr566Di6yD+nTFKP25GlrsCCcQ5WxTfs11x7nS1/6EhAv5r7qVa/iwx/+MMvLywgOKxfrKLzUMVcpNbSu95prruFTn/oUAOvr63z2s5/lOc/JnnGyGyYh3iSFiIM4s4nJVYCgBit9luKlNVjxv9s9vv3bv733nEGc7/breOLJ0zz66BPA7t/tAyEuGxtrrK2tAfDxj3+cQqHQa6QxEBlqdsSpgloLmjkkQda0xCykLnXdVyP5M5SF7EjK81QZ0i9HIG6b9sMi8s9F5AMi8lvR/xltfwG4UUROikgJeBtwz45t7gHeGf79LcCndNRf6YTO2hRdnQ0hUhv0ECwn47ypCL1ZWDvSD37u536On/iJn+Duu+8eLc8DN9/6HH7sp3+c73zVd3LHHXfwUz/1UwC87W1v45d+6Ze46667eOyxx3rbT01N8du//du89a1v5bbbbsNxHH70R380/K30znMYPv3pT3P11VcPfIMa7Z+1HToEZHa+MFyBjItmV08zF4gGIOfT5MLGnEtRciqApE4R7DfZqKX2YfscqnQ+NBBciinTJKHfrj4t0qb29exnbLQRNadIOwcLojlU6RfASnV5z7/4x4li7nOf+1ze+9738opXvII777yTf/HPfgmluiljbgAZMqPpx37sx1hbW+O5z30uL3zhC3n3u9/N7bffnup848DGm+3IOPh328vY+N/tQdrrc597S+85i/fdXuK3fvPn+b7v/4GBz9lguJw7d4EXvOAF3HLLLfzbf/tv+b3f+73Ru2Wth4KgI2ASRIp5JlKX8H5mUOqCZhxdUOvJdsxE6oImF7mSuhGI28Pzo8D/AD5B+vYylyDMN/5x4K8IPtG/pZT6hoj8PHCvUuoe4D8DvycijwIXCQLUnoLO2pRGp6lRbahwajP7sNpooK8OuOLw9bPfuGyu1stf/nIefvhyCft973vfJf/++te/DgTX6Xvf8b38kx/+yUvSFl/2spddMivjv/yX/9L7+6tf/Wq+/OUvX2bjsccf5enNU3jK4+677x44B+OVr3wln/3sZweeW59gaVSLhjQpiYtmp8nJ2RPZHSJo6PLo2uNajhUDNuZsg4hL0ZlPnSLY6qXnZVdvsvhQcquZXtYEjTaGd/ocBKV82n5TT4pgRgUr04Dd3rBhP9Zxojf023142be+JFHMhaC+5Z3vDLhAs/UoPl6qmPvo4w+y2n4cwR0Yc+fm5vjwhz888tw0wsabCLKdYMVv877aeBL802xXsOJ+t9/31b8D/xnAu+Q5izDoOVPeBV79qhfzpS+9+zLCvn0O1+7PmcuJE1fx4INfT6b0ZanZiWKP3wAnQdOWLI0YonQ71QBJYjNjwwkISVqCF2o9Upf8pbBINRhfoTZA4jeKC+Z1SSqboxD30zOjlPpnuo0rpT4GfGzHz35229+3gLfqtqsbVQ21KS2vRdtva1ugRz4ppTItaDzl4SYcVjgIEakapRaNQr91vL60RU/5I7Yc5VOwv44aOggVyIxpp77yaXZWtflULVZY7a7iK1/LtR8BG3N2IGgRXk+1b7+DX7o5XJF9gJafLk0xa/0TQMlZSJ2e15/Dld4HV6ZxpJS6DkypoA4ki4J1ybDhFMfJMoer70MhdQ2W0qDiGYCNNz2E90V5JOttFT0PKe6rjNtm/M9DMMzWSbSI7yEiKwkzEZRqAIWMNpuJSF1wnlMEo9rS2qyDG79zrfIbIClTW53tpC7BdVINkHnEwJom7hH/UkS+S7v1fYL5YoVmN5vaEDU0qBT0pXN1VZcNbzPTcTzl61Ow0ENmIlVNR9qiiODiaCN9OlIEISAzWZtcbHQ3tLWOh4A8KhRr3YSyfzrYmLMDQRe/tCmC9eAYGRSsrHOostY/QaCidfxVfBV/0G7PvgYVT0QydVMMFCzpDQxO5UMYR5MMG97pQ5YaMAjIkUop9ER+Z1HxDMDGmx7Spgh6gJNyoZrWpg+kXQuktKkaIJV059lTdurJ9gsHG6c6z0j1Spperhrpar6gf55JbfqN9LVQ20ldIpsph0bHQNwn5CcIAtCmiDRFZFVEzFe7TwhGdeyLgygdLOuQ4QjRcbKkLiqlejVYOtCrwdJAZnSpahDUNGQlWL7mFMH5QqU3JDgtojb9ukjf9pEEOcDGnB0ou7XU6k3WDn7BvlENVnqSF9VxpUXQeU/RSdFoIyJFWRp9RD5kqcHKWtPqZIijQTOedF0gt0NwMytYur5XNMHGmwiSlnhcOmQ4GSbIZpYF+XY1KQlUI11nPeinJSZtAOE309clXaImJYDKYDMtqctybUcgVoqgUkp/cuI+QrVQ4ZHOo5mOEaWD6ez4Fhy3yTH63RKTpAyq8L+Cpi/CKK2sm5lg6VPVICB+WQlW1+8CiilnSotP1WKFLb9Fy2tRTjnAOiJCVW2kPXg2VzV0zBwFG3MuR8mp0vAfSbVvQMwkbJaRDsEcqvTpcS2/wWLGQuIoxbDl1Sm7yQbPtkJimIVkBvsvJLoG22OuQge5iWqwUhAsDTVgEJAjX3VTpaD7mnzQ2QtiP8SbrOUAfWxLnUuEDGRH9q7Ny54zv5GdeCRWWTKoSSnTEiOlLp3NWmiznmw/Hdc2FZE0o2ANJVgi8hyl1IMi8vzdfq+U+pIRryYMlWKFte5aptqUXoqgNrXh8u6GU1NTLC8vs7S0FCsQe5rfNIoIrrhaFKxixsG52+GKQ9tPMYMjhFKK+kqDhjQ1fcFdSpAPu6PbgO+G6N7P60o77c3nyt58YxBszBmMoINeevWo5FQy1v6kT49TSoUpgrXU9mG7ipbch6iTYlYVreTUaLQfirXtzpirlJeZWFxSg5UQffUofvOCXX3opSnGa7Sx0weRtKlk0TEUy8vLTE1le6G1X+JN0u/24ciQIpg6vqS12dVgc3Cq7a7PmWqmVzx6XQQTKjsJ66cutZkhXS9B/dSlNrOkJZ5IZ3N7A5Ek8BtQuCKdzREYFWV/imCY5q9s+9l2Ov8q7R5NICrFoDZltbuaWi1o9mqw9NXLwKXDao8fP86pU6c4f/58rGN0/A6NTpNmsUHJKWnxq96u44jD+WI8H3bDcmuZKXeKC4ULozeOgbXuOi2/xWopvTLzTPc0X3O/wRt4vRaf+gR5lcPltARLsypaiFIEjSpYNuYMQMmt4alNPNXGlWSfx6xDhiOUU86h6vprKLqZWqRH9oFU7ep7aZIZVbTgGsSzvzPmbnbP40iBsputNnajc4aCs0rJPZdoP0+1aXWXKbtt3Awvqbr+Bm2vwVTBS0zWWl4dX7WZLmRToKampjh+/HimY7BP4k3S7/ZRUN55kHXEiT+SS3nnQFzEaaW0eQ5kA3Hif68H+xQQZ2v0xiltXvac+U0oXpXKnkgBJXMov5Gsl4dqgHMylc2eOpNG2SmknD0n00ARpRKep9+AtBk3qUldhrTEERgaGZVSPxL+9f3Af1NKNUXk/wKeD/wrIx5NIPq1KdkI1qw7Q8HJ9mYxwnzx8mG1xWKRkyfjf0jvvfglPvjob/Mvb/xZTsxeq8Wvf/fgr7DlbfGzt7w31f5b3ha/+MVf5vuufguvP3a3Fp/uOf2X/OmpP+c3b/u/KaXsrvVHX/8TasWaFn8AqoXgOcrS6KLRbeDgMFtI0XloF8wWZoNnyuCwYRtzBiMiBm2vznThSKJ9W149M7GAgOSlSRGMCFHmLoIZBi63vDpCgUKGOVyRD22/EauWaWfM/ctv/p9cNfcd3HL4n2fy4b8+8Y84NvtKbjn8LxLtd3r9b/jsmX/Ktx//QxbKt6S2/+z6p/lfZ/4pr7zq91mcSnacv3v2H9Hylnn+8T9MbV8X9ku8SfrdPgr+uX8A5ZfiVH/R6D6X7v9uKH8nTvVfJtjn/wXlV+BU/3U6m2ffBVOvw6m+L8FO9Ww1O1LNtRGDSBElsylJXbrzFBGUU0uhJjXTpyXKDElJnVIqW/rlCMTV6P9FGHi+leCNzgcJApIFfbUoS/F/Q+OQYQjqiuYKc5l8Wu01SdDnV9bueLq7LQbHCmuLMvgVkGt910lHQ4lmZ5X54ry2luqOOFoausSEjTk7kGUGk470PCB1imCr18Uwa3pen2QmRdtrUHJrmVOoAh8U7YSF6kp5wRyujJ0UIx/aKUimrkYf0Tmk9SEr0TYAG2+2w6mmUwLSLo4hIB6Ju+tlqNmBIK0sgU2lVKh4ZDhPp5ooRVApP1taIoSkLv79VCoYEixZzlMqCW22ga1wSHEKcyLJn1u1CXQQQ00u4q68osTY1wO/qZT6r4CenLF9gN3qnZKi2dFLsCBYpDcyqA1GyEyxkkkBWe3Vqun7QGxPx0sDpRTNbpN5jfcvOlaWa9XsNLXeOwi6G+bURdDGnB0oZUiPa2no4AfJ0uO2o1//VMtkv+BM48pUOoLl1zPbh34NV1If2v4q4GeaRdb3ISvRrWWzH7XsT5Oq6TW0kEzNsPFmOxKqD0p1QG2kXhyns7kFtJAspM6pJOvop9YBL+N5JiUBq4DKRnacarIUwd7A34znmcRmlsHGERKSut55jlnBekZE/hPw/cDHJJg8ZnzS6KSg35Ag/Zt9EwQr6wBk3WmLEJCZtt9my0uXM6279Tj0a5QaKWeZbXgbeMrTqmCVnCLT7vSeI+3BM5ULwbIxZwfSqjdKKW01WMGw40biBgstDW3i+z6kS1NseStalJN+mmIyH9qayE10jHREt44jZVzJ1hwiU7MRTURXM2y82Q6pJGvE4OtYkCckO1oW5AnT9XrEI6NSl8RmdJ5SS2/TSWozIh75EeYeGctEmGv5k7ph7sTc7vuAvwK+UylVBxaBnzbi0QRi1p3FFTdT6lugNuhdDGdVG4IFut4Hr7pL840k6LceN5GOl46MmlD6guNlvH+a004hnPmWQ5t2bMy5DP2FfbKFtac28VU7c1oYRDVUydPjdKWmRT6kJRc6FvZ9JbGezH64vRYfnPS1cGUne5pk0ZkDnMQk01ddOv7qXkwRtPFmO5IuyJUmspMkRVALqavlvyBPmCKoRWWRhDZ9DWQnqZqk69qmUbCynOcQxJ2DtQH82bZ/Pws8a8SjCYSIMF+YT13D0/W7rHsbWkkDZFcbgrowzSlm0SylTpMrppIV6kOfBOkko1lr6HodIA3cv6z1arqfKR0DkOPAxpzLkXZhryst7BIfvEailENdDSYgGvSbsvZHR4pglB6XkFzovg9tr5F49lHLW9FiX8Sh7FQTP4vRgOi9liJo480OJFUfeovjjOpDGsUj04I8qWqmKXXOT/DZ1UU8koxX0XJtawnJqwbVTCrgP5zA5t5QsCxGIMtiuGmgmUR0vC1/K/WMJ1MpZkDq2rBGp8mM5rTFslum7JTTEyxj9y+9WrTlBffdhE/RAGSLfOFKiYLMJu6gF5ERXW3ag2PWk/ngB3U3OubEpUkRVMqn5Tf2RIqgDhWv7NZQdOn6a4l90JWeV0pRBxYpjzo6WlqYQ1DX1ArrnGKgl96V/r6KUwW1GjRYiAMdpC5UdmKnPKvsNoOGCkHNWjybGlSWUJGMPZzbz66aBfdzPajPiwMNz1BqUmdIwbIESxOC5g3pFsM9VUazWtQfDJtemalqTlvM2hCk2WmkboU/DFmab+ieNxWhkkGBjO657vtX7TXfyCVN0GIH0ixqWzpT0yJy4ScneTqIBaTrZNjx1wBfyzVwZQpHyinIRbC9nm6OQQxMSjSDWjw98bPk1hKTTJ0qnoVBJB3aqmFB3ltYx01l00XqUGEjiRjQpSZB/PPUYLNH6siPMPfnUiU9z6ykbi05qTOUsmwJlibMF+ZpJpFgt6ER7qebOFQzpL61/Q4b3ibVkl6fsg6rNZH2BoFfaX1qdpoIwlwhe/rTpT5VWOuu0fVjvtHb4RMYUNU0jCSwSI+yu5BCwYpUg+zd60q99LhksU5Xeh4E16Djr+LHfdONXhVPRCinqIFq+XUcKeHKdGYf0jaZCOahZX8OAh9qibsItjU2O7EwiKRDW31N6kMimxpIXURa4pIAXd31IH6Nm05Sl/jaarifMRUlpavuC2ITZuU3AQHRu3aLYAmWJkQd+2JLsNvQUxs0E6z5DLOUIrKou/FGwSkw686kVtUaBtIWIWOKZ6fJfEHfvKkI0XmudZOlAYH5Z2o1n1lYFjuQjmDVw31rGuzXLjlmXLQ0Eqz+DKb4n1edXQyj46RRsEoaGkxAuvsQNJho6iO6Ti1xLVxEzMs2RXBvo6eyxFyQ62jEkJAEBAtyAcmQ+RN15ovZXCOw6YLMZrCZ8DxVEygCGTp/JiR1wXlOIZJhUkFSUqeaIHMjh7cPt1lLaLMBUkE0r9167hg56gFEpVihozps+cnbj/cVrL2TztUw0K0vQqVYTa32NbtmFKz5LOl4BpqBwLZ6tRR+mXqmeimeGeZzWaRHoBrUE+0TpPM5FJ3sz6gr0zhSSqVcaKv96c1gir+411n/BGG7+hQES1/9U/IUwajBhE4fWl6Cug62qalWwdrbSLhQVX4DZBaRYnqbCclOsDiez7ggT6rUNUObGV6SJCWv4TDlTDYTp182szd+kBRKXdb4nFipaxibgQWWYGlDltqiZqfJlDNFydE71zCrT6BfAYH0zRvafptNb9OIT9VihdXuKr7yE+/b7KwaUdWykJkobXFed11fmOKZpbuhRXqUnUDBSraorVN2qlre0okIJaeaSEVTSgXDZTWlpqVRb/q1P/p8SE50Nap4TvIUwd410EYyF4JGG3GL9QmItkNRS5qkhUGkSRHM2iggDdnJujhOrLI0shOPNKmQma9tGrKT9TxTkLqs59kjkvV42/uNbOmeI2AJliZkqS1qGGrcUHJKTDlTPTUjmU8mFax0apFpnxQqVTqeiRlmkU/R8ZOi0W0yVwjms+lE2S0z5ZQzDbC2SI+yu4CvWnhqM/Y+OuufAh+Spcd1/DUUnsbmCgG5SDIPLFLctPngLKTqIqiL3BSdOQQ3US2cziYbkK5dfdvT103SwiAS1s8EiscYyE7WxXFPNcuR1CUlr2oMyo4OsjMONSlNTZ1VsPY+snTsM9W4Afq1YUkRkbJ5E/VOhXT1TqYaN0C25g1BO3v9KYJ7kbRD8Eys2hTBsSBNi3Cd9U+BDwuJUgSjVD7d6XFJFKS2t4JDkYLMaPKhlqLRhr4UQREJUvQSXIOWxlo82JammOhZXNGmIloYhMwBbr/xwCjoUAJ6DQqSkJ2sKksKshORsrSQGaCISpQiqEvZidvRr64hRTDwWSVRzbI+Q+NQ6oa5Y+zIBwzRoj/NwtMkwUpbW9TsNJlxpyk5GXKqB6BSrLDhbdDxY7bSDNGrKyqYSREMbCS7Vm2/zZa/ZYT0TbvTFKWQgfSZeaaydFy0yIZyT71JUH/k1xMNBR6FIEWwHt++7tQ0J2pyEf8aRCRTl3ISkBTVq2saBV91aWtsMAFRu/pkzwHobfSx/bhx0PJXtD6LFmYgEjaPSKJ4ZCQBIgWQ+WSkLuPiWKQEMpPApo7zlHDAcY5qkswChQRkJ7tNETd4hhLVfWlSB5Mor4ZmYIElWNqQpTal2WlQMaQ2VFPOd2p0m8YUkD4ZTbZI76UIlkyk44VqUUKfTKpqIkIlZXdDk6Q9rU8W2VHutedOSC40zvlI2kFPd/1TwZnGlanEJE+XcgPb5lDF9CEgYkqrD0GqZpIUwbBVvaY3tulSBC3BmhgkGdqqSwkIB+LGgtJQ9wXhsOG451nXU7Mj1YSpc1mJZApSl/f91NDkIiDpc2H79eFQSulJ+RwCS7A0IWo/nvTNfsfvsO5tmFsMF+b3nAKSVi1qGGodD+nrnXpDhg34BOkHIJuqC4PAJ5siOB4kHfQbNJjQnSJYpe03UcqLtb3ONvF9H5KRvGDArkYVL+Ecqv4ssppGHxJeA6+BK1MUHD0NJtLM4mp5Fym7i1rsWxiGk4QE1LOnzkFwjBhkR+viOCbxUMoPiUdNg81azPP0gplOukhdLJttUOuIjvOMbXMLaCM6CLNTi0fq1DrQQRxz8cgSLI0ImjckayjRW6AbVBvWuut4MRdDERqdhrkUs9RkpsmsO0vBKWj3acadwRU3lU+A9m59ESqF5CmeW94WLb+lfUh0z6dikCKYpuOiRTaUnWQKVtdfQ9HVq5w4C4BP24/3Mkn3DKrIh0R1YF5DK7kpJ6yF063iQUDWEtVgaexiCEGjDXBi++CrDh1/zSpYkwKpxFqoKrUJtBAdXULjkjq1AXQQHaTOqcW02QR8PcQjrpoUpteJFjWpFs9mdM+13c8Y65eeTR1EshJPkYxeUup4hgbAEiyNCNSGpGlv0bwicymCCsVqJ1l3vGanSc1UimDKhhIm094ccZhPofZF6pI5gpy83qmXSmlKwSoEz9R6d93I8S0Go+DMIRTiL+wNkJtSwjbpba+utcFE4EOyOrCWt6JdQYP49Uf9+id9MbUUpgjGbdmvs4shgIhD2Yk/D6zVS1G0BGsi4NTi1c9EC1UtxCMmwerZ1PAsxU0R1Ek8pJrw2mpQWeKSOu33s57AZo6kLmrlbjAeWYKlEWnS8UzW8Gw/bpI0s7bfYcPbNJ4imJxgmVPVIN18rnqUtmisXq1Ks9tMNPfI/DOVrl7NIjtEhLJbi93kQveAXUjexa+tucFE4EP89DilvLDBhEZy02u0Ec+H6H7pvA9ltxrMofLjvTxraa5Dg2T3oXcNbIrgZCA22amH29ey25SYC3Kdi+OxEI9aQuKhwWZSIqkl5TOuTZ1Espb/tR3kirEjH0Ckme8ULdCNqUW9eqf46TRNg7VOEMxSKjvlxDVYzY65xhsQqIhJfaq3G8y6M0a6LQY+VfCUx7oXXy0yOS8M4Kb5G/k/r/9RY8+sxXCU3YXYKYImUtMikpBERdOpoEE06DcmyfRXAV+rehM12kii4oFmJTG6DwmJrk6UEjTaaHkXAWyK4KQgVFnUqFRw3eqDivFCUTvZyZd4iFMBtYYaNeZBa7peLWZaon41Kfb91ELq4qYI1oM/9xvBEpFFEfm4iDwS/rnrnRQRT0S+Ev5/T95+JkW1WGXd26CdoP14pCyZmDcF29Px4qsN0QLd5AI6jVpkMkUQYL4wz2piglynVqqZcYh0s7BMp50ulhb5lqUXMluYNXJ8E9hPMafkLiRYVIdpWVpT05I2eKhrVW4gIBcdfw1fjY617Z5yondhX3Lj10C1vBWtDSYC+8nuQ9AivabNfuBDsmsAB4Ng7Yd4E9T9qKDJwjBoJFiBTS9sQDDMZl2fTakCrbDRwhDoJB5x51JpTYWsgFod3ZxII/EI6tW6o++nVkUyLqnTaHOQK8aOPBzvAT6plLoR+GT4792wqZS6M/z/jfm5lw7RQjuJWtRoN5gxqICkaShhOsUMkjdvaHkttvwtwwpW0H48STpevV2nVqwZ8ynt/RPEWOONCcW+iTlBe+64ClakGuhLy+qlCMZWLpYpF/STm8CH0Z8LE9cAojlU9VjbmuieV+7dh9E+eH6Lrr9G2V3S60OCWVym7sMexeTHm97Q1hGf856yo4ME1C495kCbmlWW3G3WwmOOurb6lJ1ec468SR2MVpR6NrOv74Lz7ISNUAZD+SuA7Ms5WG8Cfif8++8Abx6TH1oRLbTr7XrsfYJ5U+Zu8Iw7TUEKiWqwTKeYRcdOko4X+W+2BqtCR3XY8ke8ydqGeicngpXk/nWbzBVmccU15dYkYt/EnJKzEDs9b8tbDpQTjQ0mCjKDQzF2DdaWd1H/wj5Bk4ktQwv7cqL6I/3XoN+yf7QPLW8ZMEAy3WrsRhstbwWhQNE5EC9+Jj/eRCrLqFRcpW9x3DvGiAV5sDh29CyOYxLJYEhvMGcpu81KPJuqDgTDkLPbjEcklb8CMoNIWaPNGPdT5hHRIDTEJXVqBaQaDEQ2hHERrCuUUs+Gfz8DXDFguykRuVdEPisib87HtfRYCBWseqcee59Gp2FUlQmG1SZrvtGbN2UyHS/hLKVGO0p7M0uwIL5apJSi3mlQM9QOHdLNDGu060afqQnFvok5ZXeBjt+MlR4XKSc6G0yISJAaFkO5MKWc9OqPYvjQJxe6CU41QXrcMlPaFbT4KYIRyZzSfg0W8OnQHfG2GKJnUW+zkz2MyY83kYKhhn/GlF8PF8caxqfEVZPUCkhFz+I4Ut5GEUl/BRxNz2+kSMVRdpwFPTZ7qtmo86zra10eW6mr60vVc+LeT402B0D/QKEQIvIJ4Oguv3rv9n8opZSIDHr9da1S6hkRuQ74lIjcp5R6bBdbPwL8CMA111yT0fP0iJSMlSQKVrvJtbNmfa4UkqlFK+0V5gtzFA2lLUJAHKJZSo6M5vkrIWk1qhZtq3e6YmrQ92Efa901POUZ9WmuMIcgiQjySqfOQmn/1znsxEGJOf3amwZThUNDtzWhnAQ+xFNvInKjnVwkaBW/5S0DTi+lTpsPCVIEt7yLLJSfp9V+0ZlDcGOlavbT8/SnCEJwH4rO8JrMtreyr+qv9n28iTq6+ReHbxeSAD02k5AdXTbjnmddX0OE2OmXKxptxjxPVdd3bZOkCOZ9njptDoAxgqWUes2g34nIWRE5ppR6VkSOAecGHOOZ8M/HReRvgbuAy4KPUuoDwAcA7r777vgFNJoRpWXFVbCUUqx0VrizeLtRvyoJ0/HyWKBXwvlca921WEpZRFpN+pVULep1gDSoYPXnc8VvcrHSrnP19HFjPu1VHJSYEy1SW149BsFaZqZwpREf4qhHW4YW9v05VDHIRfciZXdBeypIoCSu4qsuzpC390r54RwuvdcgUBKrCVU8/SmCwfHrzBavGuHDitZuluPGvo83vYVqHCWgptlmnqQuAcHSpuwkqPvSdp5h/MmTeCRRsHTFxyT3093t/Yg+jCtF8B7gneHf3wl8dOcGIrIgYRKoiBwCXgbcn5uHKeCIQ61Yja1gbXibtP12LmQmkQJiuHEDJB82XO/UccVlvqAh/3mQTwlb2ke1dsavVbHSa50/Cp7yaHQaRjsbTij2TcyJCFacNuUm6p8AptxDbHkXRm5nqrFB2ekv7Ef7oD89D+I32gjqxHymCvp9mHKXeuRpGPopgrrr0IJnK44PAck8EA0uYD/EG5kDiqg8iYdUASeeTW3EowYw2qbSSHZ6yk6MhhMHRanTRl7HQNIHuWL06IPxi8B3iMgjwGvCfyMid4vIB8NtbgHuFZGvAn8D/KJSau8EnwFYKC3EVrBW2ivhPjVzDhG1RI/fHa/eWTHuU1K1aKW9wkLRbP5+tVjFwYl9/+o5pC1CcP/iXqdGp4lCHcgUwRHYNzEnIlhb3eGLWqW8YFFraGG/5S2PjCmmUgRdZwpXpmN1sDPRwQ+2N9oY7sNW14yKFxwzPtEtyCyuM6XVfqSgxvLB318pgiMw8fFGRIIFaI4LVRE3nNeUp81CsLhX+RGPwOYcKo6yo6M7IyAyBTKTL3llCiii4jSc0EpeC/m+GBgAYymCw6CUWgZevcvP7wV+OPz7Z4DbcnYtM2rFGqc3T8fadqUTESyzXzoLxRqe8ljtrlEZ0bq763dpdlZzUWUgvoK10q5TM3ydHHGolapcbMdrO5xHiiAEz9RDWw/F2jZS1RYM379Jw36KOVNusKgdpRq0vAbga29sAMHC2ldBA4uiOzimmEoRhEhFOz9yuy3vIkvFq7Xbj85pq3uBSun6gduZSs+DgOiudr45cruWt2yIZAbH3OoOJ1ieaofNTg4Gwdo38cZZzLdmB4JUNn9wbFNK6VcfnIWhqZBGbEp1aIqgUl5Qu6T1PIffT6W6gU1NxENEUCMGHCvVArWBaCPMgnIWRjxDm8BWv3W9IYxLwdq3WCjVEihYwXYLRbNfOoulxdDeiEBJfgpI1OWuHjP1bSUHVQ2Ce7ESl2C16+EMs5JRn5ZKi9Q7DXzlj9w2Iu02RXD/ouhUcKQ0UjUw1T0vOGakXIwiecsUnDlcR0PL3x2YKhwaqeJFPpghN/HUG5Pzn4JrcGG0kti9aETJdKVEyanGIPsHagbW/sHIBXkb1Lq2xXEcm6hNoI3oVB+cRRj2DKt1oKv5PKv9Abu72mwCvmabw4lklLKolXg41eE2dc7d6tlcHGGzrt/mbm4YPfoBRK1YY8PbpOW1Rm4bLeRNL4YjshRHmYnIoWkyM+NOU3bKXIxB+pRSrLTrxokoBNcqiYKVB5FZKC3gKS+W2lfPibRbjA8iEqTodYerN6bS84JjhupNDJJnwn7gw+j0uK6/gae2jKl4MFq9aRlqkR4c8xCKLh1/eGzY8paN2I98GHUfomsUkVKLCcHIhWq0OK5ptjmMYJlYkC8NTxHUOPD3EpvDSF2PBOi0OeLaRr9zNMZsZ2mETVMEK47Nmj6bu7lh9OgHELUEs7BWOnXmCnOUDLZDB1hMQLB6dWGGU8xEhMXSYiyCtelt0vJbuShYi6UEClanTi2HeVPR/VuOca1W2nUcnJGpoBaTjViLWpPpeYV4aYpbXTNNNiIfRpGbLYPpeQWZxZWpkWmKW95yOGBX/wy/cmyie9FYel65sBTjPgTXyBKsCUPsBfk4Fsd52jRFPIYRLAPnKeO4tqPOsx78qVuRzPt+7uaG0aMfQCwkmIUVNW4wjWqxiituLDKTRzv0CIsx1aKeqpbDtVooLbDlb7HpbY7ctt7Oi2BFKZ4xCHJnhVqpGmu2mMXkohyDXJis/enXH41OETSVFjblHqKr1un6gz+rJq9BoCQejk1uTDToiaOi+apL22+YI7ruoZGpoj0Fq3DYiA8WZiDOIqi1IBVwN0QLZ0cfcRZnCVQDNWiQujGCVUcNSsP3w8+Xzs+Qewj8IY2CDJLXwTbD89R4PwOCNSRGjoWkGzjP3dwwevQDiEjBWomjYLXzGQgbtY+PpWCF7dDnDLZDj7AUU8HKk/TFTaf0lc9Kp85SycyiZTuSKZD5pFJajBdxFKyWdxGHIkVHv5pZcioIhZjkwhzBAoYqSNGMqHJhfCqaqWHPsP0aDCY4wTVQBn0IWsUPqwML7pHYGqxJw6iW13742dO6IB8xf8uATXEWAX9wTZSBBbk4S0Ab1FqONheBoKnErvBMXNtDIUkfUDbTI6/6Xr4ELwZWY7wYMPvCxxIszegrWHGUmXwaNwAslBbjKSDtFWrFfBSQxdIijU6Trt8d6ROYrwsLfIrIzHDiV+808JTHUtn8gmGuMEdRivHIaKee2zNlMT5MuYdo+w28QV8gBIvusrtoRDkRcXqt2gfBVx3afsNc7U+ohgwjOP3anzHWH3kXmDJF8HpzqIZcA8/wNSgcwlNbdP0BC0WC+1B2F4cOZLbYg4hUhYEES7+CNXIgbvSsOxqf55FE0uR5Dvjs+ibOM7K5e9xW/jLgaq77GmXzAlAIZ6DpsjmcpCvvPFAGmdVnczc3jB79AGKmMMOMO81ya3jKRNQOPa95RUsx0/Euti+yUMrnLeNieRGFGqn2reQ0bwr6BGsUGb0Y3t/FHBSsoF5t9P1TSnGxddHOwDoA6NVADUnR2+qeZ6pwxKgPraHkJqy7MZQWFqeL36Z3DsE1Si5GKVib3XNMu2buQ8GZw5Hy0FTNre45AKYLVxjxIU5HyS3vgq2/mkSMXKheAKb0LlR7NocsyGUWcXTajIjkgPP0z4NUENHYMTgia4PO07sAsoCIxhr9EeeJfwGcxWAemTab0XkOIZLOEqLzpf5IwnwBnENG56qCJVhGsFRa4kJ7OMFa6dSDdug5pXMF3fGG5N6GWG4vcygH0gDx1aILrWXmC3OUXf2tnneiFrOGLmo4sZQTGV2I0Xxjw9tgy9/K7f5ZjA+xyEX3LNMGCVbZXRph3+zCPk790Wb3HFPuIb0Lhu0+jKgD81WHlnfR2DXodZQcQm42u2cBjD0LcTpKbnUv9O6XxQRhlJrkXwBX80I1FgnQ/CyNWpB7y3qVJBip7OCfD+q0tNqMQzwMneegGOWd15+qF0eRzOGFjyVYBnCofIgLIxSsC63gy+hwOZ8vncXSIh3VYb27PnAbX/lcbK9wqJzPAj0iJxdbowjWBQ7ldJ2KTpH5wvzIjn0Rgc4jRRCihiCjrxPAUk73z2J86JGLEQTHJMEa1dxg0wsJlmuGXJScWlgHNrgGa6t71qyKN6IOLFDxlNHmDgHBGnwNNrvnjat4MCJV0ztvFaxJxAg1yeiCfKjNcRAP3SQgjrKzH84zRirkWIikJVgTiUPlJS60hg9/jBbDeRGHnlrUGayCrLTreMrLjWBF3fFGEYc8VTWI13xjuXWRGXeGaXc6F58WS4usdOpDhw1HpC+vZ8pifOgt7AfMwur4a3TVujFyA2GKoHcRf0C3L9PKiYiMTNEzTjJH1IH1SKYhBSvyYeg18M5RdpeMqngwmOwr5bHlXWRKYxG7RU6QKlAMUuR2g7+sf6EqVcAN64F2gRHFYwkQVPh5vQz+st4OghAqdRKmWe5m08B5Rp9Bf8B5mlDq3OGpkGaIZHSeg55bAy8GdnPDuIUDiEOlJbb8Lda9wWrRhdYyguSWYhZ1u4uI3W5YjhbopXwW6FPuFDPuDMtDUt+UUlxoLedKGg6XD3Fua/hsm+X2cm73DgJVylPe0PlqkWpqUwT3P4JubDJwUdtPzzNHLmYKRwHF5gCSt9k9iytTRroYRhjVZCIPFQ8Gk4vefTBUgwUBedvsnh34Qm/L8DUoOhVcmeoR6svsexcB37Zon0CICLhXgLf7vTWxOBZxhrf29i9oJzsiheA8/EHned7AeRaC2U+7qCxKKSPkVWQKpIrahWAFNvWnJQY2Z3clzEr5hkj6PDCF2uW5VcoL0k8NdxAES7CMICIDwxpdnG9dYKFUo+Dk01XpSDl4mM61BhOH82NIMVsqLfaI3W5odJp0VCdfgjV1mOX28lC16GL7Yq7XKUolHUb8LrSWKTvlXFrsW4wXjhSYcpd6C/idyINgTReOhbaeHeDDeaYLR4wWEk8Xjgy8BvmoeEFcHX0fzPkwUzhKV63TGdDFz3QtnogwXTjKZvfMAPvRNbAEayLhHNmVeCjVDciBiVQr9wrwLn+elGqDaiAmFsfO7kRSqRaotaDduG64h3Ynkmod1CZiQvUdRJjVKtAxc57OoPOsA552m70XA7sRZn8F8MM2+WZhCZYBRGTg/BCCdaGdX10RwGxhlml3mvNDFug9BStH4nBk6gjntgbI1QTXCXL2qXyYruoObHQRqWp5KlgRQT4/hCBfaF9gqbxkvDOOxd7ATOFKNjqnd/1dPz3P7MIeYGPQwto7a5TcBD4cY6P77K7qTR4ks+RUcWWajYEk07yKN5LoeueNXgPo34dd7Yc/nylcadQHC0Nwr4DdUuf8YL6amKitc44OWBwbHBDrXrF76pxJm87hETYNrHsGEGaz53moP2NrO6KfmSCSAwhzL23QNrmYTEQpWsOUmQutC7ml4kHA6I+UDw9VsC60lqkUKpQcja1IR+BI+TDnW+cHqkW9WrUcr1WfIO9+rda6a2x4GxyZMrto2Y6l0hKC9FTG3bDcWuawTQ88MJgpDlvUBl8sJuteIvI2kGAZbjABwaLdU5u0/fplv9vKgWCJCLNDiO6Wd864itcnupc/C11/g66/lgPRPTrwOdjoEaxjRn2wMAQnUAIue4lhYshwhAEKVn8Qbo4Lcs8kqTs6nASYOM9BCpaBIcN9m0fB3+V+7jfCvAOWYBnAbGGWKac8sN6p63e52F7JrYNghMPlw5xrDVGLWhdyVYoArpg6QmeIWhSlWeatYMFggnU2vIZHy2YXLdtRcAoslZYG3j+lFOdbF2wHwQOEmcKVbHTPBDnlO7DlnaPk1HAdc6MNCs40Jae2a2qYUj5b3QvmlZNisGjfjeDkkZ4X+HDlEKJ7jimD9VfQJy67EZwe0c7hPrS8ZTy/ddnvNrpnKMiMURXPwhzEvQLUBqgdKagRAXKO6rfpHAW1ivJ31LEbVB/EPQKqjlJbO2yGn23XwAsC5yj454J0y+0wSXacK8C/cLlNk+fpHgPvzC4kPVzPGCPpu7wY8Aye5w5YgmUAIsKh8qGBatFy+yIKlTuZOTJ1mAutwbVFZ7fOcsVUfqQB4Eg5+OIfRBzOts5RKVSYcqdy82mUWnR2K1i05H6tpg4PrMGKVLW8fbIYH2YKx1B02dylwcJG94xxYhH5sNvCfsu7gKLLdEH/4utS+0Ha2W4EJ/iZ5KKibXR3V7DWO6d7CpMplN1FHIq7Et310K9Zw+l50X3ezYeN7rPMFI7Z1OVJhRPGkZ1pZb0FuYFnyx1g0ws/Z44JshPa3JkOGdk0sCAX9yjgX16fZPDaintFaHNHhlWPeBgizLRB7WhoZpDsiHMktFm/5OfKexZwglRJw7AEyxCOTh3lzNbuKRPRz49Omf3i3Yl+bdHlXfvafpvl9kWO5e1TmGZ3dkAd1rNbZzg6nS9pKDgFFksLAwny2a1zCDImBXJ3n54Nn6m875/F+BApF5udy8nFeucUs8Xjxn2YLu7e3GC98zQAc4Z96BOsywnOeudppgtX4IrZlOeZ4pV0/FU63uolP/f8FlveOeP3QcRhunB0wDV4JvTxKqM+DFXROmeYLtq4NLGIyM6OtDLlnQaKhuqEjg6xWTZjcwCpU96zILMgFQM2o/O8NIYr7xmQecSE6juAMAfnuYCIgdEzvWfo0vigvNPgLAWdBo3Z3OXFgHMYkaJ+mztgCZYhXDl9jHNb5+n63ct+9+xm8GHKncz01KLLF+lnt86hUBzNWQFZKi3iijtQwTqzeTZ3IgqBOjWYIJ/lUHkptw6QPZ/Kh1ntrrLpbe7qE5D7/bMYH2aKu6s3Snmsd55hrni1eR8KR9nYleAFC/vZgtmFfcmdp+DM7apgrXefMW4ftpOLS31Y74bXII/7UDzGRmd3outI2fiQ30HXIPqZrb+aYAxSsLxnwT0atFXXjR7Z2fFM+8+Ce6UZNdQZsCD3ToNrSIGNiOTO8/ROm1EGAaKU5QHnacZmeNwdRNLoeQ58bg3a3OlCLlYOII5NHcPH7y18t+PZrbPMFeaYL+abkx4RldObl38J9lW1fBfojjgcKh3aVcFa727Q7DbHosocn76KZzZP75pOea51jityrL+KcHR62P07iyuuHTJ8gBAtWtd3KBeb3bMourkoWLOFq+iqdVrepar4WvdpwOmRQLM+HGN9lxqstZxUvEhF23kfeiTTsHoU+HDsMvuBTwHJNJ2eF9TaOZepaG1vlbZfZ7Zg/j5YGMLABfmzBknAILLzjHnisRuRNJGSCNuIR44Ey9ldTcI/Y45gDSSSz4CT9zN0xkga5G6wBMsQrpwOHtRnty5fDD+79exYVJnF0gLT7jTPbD5z2e/OjKmuCOCq6WM8s3n54mBcqZQAV01fGaZNXpqnrJQKa9Xy6yAY4fh0sFDb7Vqd3TrDkfIRXHHzdstiTCg405SdBTY6l36ee8pJDovaueI1AKy1n7zUh84pZgpHcXJIw9itBqrrb9LyLuRDMgc02tjongp+n9N9aHkXLpuFtZETyXSkyGzhKtY6lz4Ha50nAv9K1xr3wcIMRKbAOYzynr70FwaJh8g0SC2sl9lh0xQJkArIPKq74zx90zandzlPkwRriWAI76ldbJoiWIeAYpjiGUApZZakO1cAhUue28DmaXOkbqcLuVg5gDg2Qi26cgykQUS4avrKXRfoz2w+w2JpMddmEhGOzxznzNYZ2n7nkp+fDv0cx7W6KiIzG5deq+X2MhveJsdn8n8je7h8mKIUdyXIpzaf4di0rXM4aJgvnWS1881LfrYW1j/lkZo2VzoBwGq4kI6QVw0YwFzxWtY6T+Fv64rVT1E070PJWaDozO9yH07hyjRl1/y8vPnSSQBWtxFdpRTrnWdyUdACH06w2n7ikp9Fz8V88UQuPlgYgnstdJ/o/TMYMnzWbCe2wjXgbX+eW+CfR1wzz3MwnPbaHTa3wF9GDJ1nYPMa8J7o2/TXQDURQyRAxLn82vqrwTBlQ2RHxAH3OHSf6v9QrQBbBu9nIbS57aWPvwy0jd3PnbAEyxDKbpml0uJlCla93aDRaY5lgQ6BMnNq85nLWlc+uf4U185cMxafrp45jkL1CFXPp42nKDvlXOdNRbhyOgg0O8nMUxvBW59rpvO/f444XLmL2rflbXF269zY7p/F+DBfuo5m+/FLPs/rnadxKDKTQxfB2cKVOBQvIVhKKdY6T+ZSAwZQKV2Pr9qXKHk95SQHH0SE+dJ1rLYfv+Tna+0nmCtenUv3vIjArG0jeVveebpqg7liPurRfPEEq50nLxkbsNZ+EqGQG8mzMITCteBtWxx7pwAPcQ0+W+6JS0gdXvj5Nlk/UzhxCfHoLc5Nnmfhuh3nGSpLhohHcOxrd9gM44ZrcA1RONm3AxAphUbv57WXkNfe3wv5xERLsAzi6pmreXL9qUt+9sTGEwCcmB1PysTx6atY667R6DR6P2t5LZ7dOjO2BfrxkKyc2rhUsn5y/Smunrkax0QR7QjMFmZYKC5wageZeWrjKQQZI0G+iqc3Lk1heGrjaRTKEqwDiPniSTp+k5bXT2VttB9hvnQSySFdVMRlrngNa9uUiy3vPB1/lUrpBuP2ISCZAM1On+A0248B0vudaVSK119GdJvtx6iUbszF/mzxOELhEgWp2X4UgGpO92GudAJftS7pJLjaeYLZ4lW5pIpamIO41wbzmqK5VN1woVw4ac5m4ST4p1EqbOrUDT/frsHPtHsteKdRqh38OyIEBZM2T4D3NEqFGTzdx0Kb5q5tQCSf7r8M6eZ0nt0nUFFdu/d4DjaDFwO9uBydp2vw2m6DJVgGcd3sSU5vPct6d6P3syfWn0SQsS2GT8yeAODx9f6bhFObz6BQXDObzxvnnbhi6gglp8QTG/03R77yeXLjKU6MkTRcM3P1JT4BPL3xNEfKR8aSSglwcvYE9U6D5dbF3s+eCgnXtbOWYB00VCJysU09abYezW1hD8HCeju5abQfCX3Li2AFX5bbr0Gj/QizxeMUHAMth3dBpXQ9bb9Oyws+l22vyaZ3Njdy40iR2eJVl6QpRgRrvnR9Lj7MF6M0xf59WG0/btMD9wOiN/6RitVbHBtcqEaL4EhF6hEPc8+zFE4APkR1O70F+QnDNr2eTdUNXg4ZJa/utUCnN+NLdZ8AHKMKVnCe7W02HwOK4Jpbd4p7bTAkOxxorLxvhjbzUdQtwTKI6+eCxc83t5GZJ9af5OjU0bEt0E/MnqAgBR5Ze7T3s4hsjYv0ueJy/ex1PLza9+nM1llafmuspOGm+Rs5vXmatU5QOK6U4tG1xzkxRp9unAsWbI+uPdb72TfXv8l8YY6F4sK43LIYE6LFc7SYznthD1ArP4f1ztO0wzlQzVbgS14Eq+jMMl04SjMkdhBcj7zswzYVLbwPzR7JzIfcAFRLN7PSur/370brEabcQ5TdWk72bwCEevtBADr+OqudJ6iVb8nFvoVBRAQjVJFU9/FgZpJTM2ezENoM07pU9zFwrkCcOXM2LzvPx8A5ijgzBm2GCk6Usuc9Du5xM7OhIvSu7Td32DQ4MzBSqqI0ve5j4F5jdh5VRFIjotx9HArX5pLdAZZgGcXJ2eDmPrYWfFh95fPw6iM94jUOlJwiJ2av5ZFtZObB5kMslRZZKhkY3hcTN8/fxFMbT7ERqn0Prj4EwE1z+b2J34mb5gPbERk91zpHvVPn5vmbx+bT1TPHKTklHl279P7dPH9TLrUeFnsL04XDTLtXcLH1VQAubn0NINdF7UL5uQDUw8X9xdbXmClcldvCPvLh4tZ9ALS8FdY6T7IY+pWP/eB6X2wFPiyH92FhKj8fFqeex2b3DFvdC4EPra+yMHVbbvaL7jzzxRNc3Po6AI3Wg4BioXxrbj5YGELheqCI6gT3ls7XoWg4xhSuAwqoTvjSoPsQFAy/NCneBLiozjeCf3e+kcN5Xg8IdB8IbT4IBcPrnsJzQlvRed4HBdPnGd677oPhnw/lcJ7hOXWj8/w6FPKLR5ZgGcRsYYZrZ67lvkYQlJ5Yf5J1b53nVcb7hXPT3I18c/0JNr1NfOXz4OpD3FJ5zlgX6DdXbkKheHgtePN7f+N+FkuLY2kbHyFS+x5oBgHh/vDP51TGR7AKToEb5q7j/mYQjM9tnedCe5nnVJ4zNp8sxoul6TtY3gwI1oWtLyMUWJy6PTf7wQJaWN76Kkoplje/zKGpu3KzD3Bo6i42uqfZ6J5leesrACzl6EPJrVIpXs/y5pcBWN76CnPFE7l0EIywUH5eaPtrbHWXWe88zVL5jtzsAyxMPY+LW19DKb93H2o5El0LMxApQfFW6NwX1ER1H4ai2WdLZCogAp2vBJ31ug9B8U7DNqeDRX/nvqCznvc4Yvo8nTko3Ihqfxnlr4Q27zRsswLuSVTnayj/IninkJLp81wE95rgPL1zoc07zdp0l8A9Hpyndwb8c0gxv+/GsRAsEXmriHxDRHwRuXvIdq8VkYdE5FEReU+ePurCXQt38OjaY9TbDe5d+SIODs+tjpdg3bVwJ13V5SsrX+X+5gOsdde4s5bvF/FO3DB3A9PuNJ9fvpdNb5OvNb7O7dXbxkr6Sk6R51WfyxdW7sVXPp+/+HmuKB/hyql8WnwOwl21uzi1+QynN5/l8xe/AMAd1fyCxiRiP8ecQ1N3s+mdpdF6hPObn2OhfEtutUcQkIuF8vM4s/E/aLQfpuWvcGj6+bnZBzg0/QIAzm78Hec2Pocj5Z6ylheWpp/Pha0v0/YaXNj6Uu4kc3HqeRSdOc5sfJpzm58FyP0+HJl+MW2/zsXWfTy78T+olW9hqpAfydwr2Jfxpng7dO+D9hcAzzjxAKB0J3S+Bp17AR8pvcC8zeId0PkKtO8FlHEiGdi8M7T5xeDfuZzn7dD+Unie5HSed0Fnu808zvO24LpG1zaP8wwxLgXr68D3AJ8etIEESZK/AbwOuBV4u4hMXK7BSxa/BYA/f+ajfPr8/+TOhTuoFCtj9emGues5VFriv535a/76zMeZcWe4Y8wEq+QUedHi3dy78kXuOf2XtPwWLz/00rH6BPCSpW/hYnuFP3/mozzQfIgXL33L2FPxXrj4Alxxuef0/8Pfnv80N87dwJGpw2P1aQKwb2POlbOvRnC5b/lXWGl9gytnX527D8dmX8FK6+t8ffnXEVyOzb4iV/vV0s3MFa/lscaHeGbtrzk68zJcp5yrD1fPvRZPbfL5s/+Mrr/GlbOvytW+I0WOzryc0+t/w6ONP2TavSJ3knl05uUIBR64+H9zcetrHJvJ9znYQ9h38UbKrwC1iWq8ByhD6UXmbZa+FdQGqvEzwFSwQDdts/xtoFZRzfeCzORCdqT8raCaqObPgswGpMC4zVeAWkE13xcMPM6BeEj5W8FfRq3+PEjNfPol4Xn651Cr/xqcRSjmFxPHQrCUUg8opR4asdmLgEeVUo+roGfmh4A3mfdOL45OH+UlSy/mb8//d9a6a7z+2OvG7RKOOHzP8e/miY0n+WrjPr7r2GspOeNvo/tdR1+Lr3w+9ux/49bKLVw/l1+B+CC8cPFurpm5mntO/yWzhVm+44r8F687sVBa4NVHXsX/Wv4c51vnedNV//u4Xdrz2M8xZ6qwyPG513Ju83MUnXmurbwxdx9OzH83BZnl3OZnuGb+DbmmxkEwi+r66ttpth+h5a9wY/UHcrUPQUpitfQczm1+jkrpBq6YeUnuPlxffTsdv0m9dT831P5eMOAzR5TceU5U3sS5zc/iSpkTle/J1f5ewb6MN6WXBG2v/Qsw/b+bbTYRofytwbBYfxmm34w4sznY/DZwrgrP87vNNpvo2fx2cI6GNt+Sj82pV4NzJLT5vWYbXEQofwc4h8C/CDNvzcnm/xYQK/8CTH9fMIA4J+RnKTmuArYP/DkFfMtuG4rIjwA/AnDNNXuvVfW7T/4g189dx/Hpq7hhD5AGgJcuvZiSU6Ttt3npUv4Lgd1wdPoo7731PTy8+ggvP/SysStFEHQ4/Kc3/RM+u/xZbq/dznxxftwuAfD9V7+FK6ePcqh8iNuqzxu3O/sFExtz7jr8z1mcup1DU3dRdvPvJjlVWOTbrvrPnN/8Aicr35u7fYDrKm+l6Mwy5R5iafrO3O2LCC899ms8s/YJrpp7TW6dqrZjceo2Xnbs/Wx0T3Ni/s252we4fen/zXzxOpam72S6YJX1IZioeCNShIX/BK2/genvz8lmCRZ+E1r/HabflpPNMiz+JrQ+neN5lmHhP0P772Amr/OchoUPQvt/5WfTmYGF34L252Dm7TnZnAttfj43mxGMESwR+QRwdJdfvVcp9VGdtpRSHwA+AHD33XerEZvnjpJT4jVX5JsuMgoiwgsXB6aGjw0nZ09wMpzVtVdQK1V57bHvHLcbl6DgFPj2I68ctxt7Cgc55hScGa6vft9YfaiVb6ZWHl8DGBGHa+bfMDb7ANOFI9xQ+z/G6sMVMy8eq33XmRr7NcgDBzHeSOE6s4Nhd7V5vdHZV7vbvMF8x8KdNos3QjHfrslSfA4U822QNR6btwZNWnKGMYKllHpNxkM8A2yfQHY8/JmFhYXFZbAxx8LCIi/YeGNhYTEMe7lN+xeAG0XkpASJmm8D7hmzTxYWFvsXNuZYWFjkBRtvLCz2McbVpv27ReQU8BLgv4rIX4U/v1JEPgaglOoCPw78FfAA8CdKqW+Mw18LC4vJho05FhYWecHGGwsLi7E0uVBK/Tnw57v8/DTwXdv+/THgYzm6ZmFhsQ9hY46FhUVesPHGwsJiL6cIWlhYWFhYWFhYWFhYTBREqbE3wNIKETkPPBlz80PABYPu6MAk+AiT4eck+AiT4WcSH69VSu3bfs0JYs4k3FeYDD8nwUeYDD8nwUeI76eNN31Mwr2dBB9hMvycBB9hMvzMvMbZdwQrCUTkXqXU3utVvg2T4CNMhp+T4CNMhp+T4ONew6Rcs0nwcxJ8hMnwcxJ8hMnxcy9hEq7ZJPgIk+HnJPgIk+GnDh9tiqCFhYWFhYWFhYWFhYUmWIJlYWFhYWFhYWFhYWGhCQedYH1g3A7EwCT4CJPh5yT4CJPh5yT4uNcwKddsEvycBB9hMvycBB9hcvzcS5iEazYJPsJk+DkJPsJk+JnZxwNdg2VhYWFhYWFhYWFhYaETB13BsrCwsLCwsLCwsLCw0AZLsCwsLCwsLCwsLCwsLDThQBIsEXmtiDwkIo+KyHvG7c9uEJGrReRvROR+EfmGiPzEuH0aBBFxReTLIvKX4/ZlEESkJiIfEZEHReQBEXnJuH3aCRH5J+G9/rqI/JGITI3bJwAR+S0ROSciX9/2s0UR+biIPBL+uTBOH/c69nrMmaR4A3s/5kxCvAEbc/Yr9nq8gcmKOXs93sBkxJyDFm8OHMESERf4DeB1wK3A20Xk1vF6tSu6wD9VSt0KvBj4sT3qJ8BPAA+M24kR+DXgvymlngPcwR7zV0SuAv4xcLdS6nmAC7xtvF718F+A1+742XuATyqlbgQ+Gf7bYhdMSMyZpHgDez/m7Ol4Azbm7FdMSLyByYo5ez3ewB6POQcx3hw4ggW8CHhUKfW4UqoNfAh405h9ugxKqWeVUl8K/75K8GG5arxeXQ4ROQ68HvjguH0ZBBGpAt8G/GcApVRbKVUfq1O7owBMi0gBmAFOj9kfAJRSnwYu7vjxm4DfCf/+O8Cb8/RpwrDnY86kxBvY+zFnguIN2JizH7Hn4w1MTszZ6/EGJirmHKh4cxAJ1lXA09v+fYo9+KHeDhE5AdwFfG7MruyGfw/8fwB/zH4Mw0ngPPDbocz/QRGZHbdT26GUegb4ZeAp4FmgoZT66/F6NRRXKKWeDf9+BrhinM7scUxUzNnj8Qb2fszZ8/EGbMzZx5ioeAN7Pub8e/Z2vIEJiDkHMd4cRII1URCROeBPgZ9USjXH7c92iMgbgHNKqS+O25cRKADPB96vlLoLWGePpZeE+b1vIgiUVwKzIvL3xutVPKhg1oOd97APsJfjDUxMzNnz8QZszLHYG9jLMWdC4g1MQMw5iPHmIBKsZ4Crt/37ePizPQcRKRIEnj9QSv3ZuP3ZBS8D3igiTxCkIbxKRH5/vC7tilPAKaVU9HbsIwTBaC/hNcA3lVLnlVId4M+Al47Zp2E4KyLHAMI/z43Zn72MiYg5ExBvYDJiziTEG7AxZ79iIuINTETMmYR4A5MRcw5cvDmIBOsLwI0iclJESgRFdveM2afLICJCkE/7gFLq/ztuf3aDUupnlFLHlVInCK7jp5RSe+6NhFLqDPC0iNwc/ujVwP1jdGk3PAW8WERmwnv/avZYkeoO3AO8M/z7O4GPjtGXvY49H3MmId7AZMScCYk3YGPOfsWejzcwGTFnEuINTEzMOXDxpqDVnQmAUqorIj8O/BVBF5PfUkp9Y8xu7YaXAT8A3CciXwl/9s+VUh8bn0sTjX8E/EH4hfM48O4x+3MJlFKfE5GPAF8i6K70ZeAD4/UqgIj8EfBK4JCInAJ+DvhF4E9E5O8DTwLfNz4P9zYmJObYeKMXezregI05+xUTEm/Axhzd2NMx5yDGGwlSCy0sLCwsLCwsLCwsLCyy4iCmCFpYWFhYWFhYWFhYWBiBJVgWFhYWFhYWFhYWFhaaYAmWhYWFhYWFhYWFhYWFJliCZWFhYWFhYWFhYWFhoQmWYFlYWFhYWFhYWFhYWGiCJVgWFhYWFhYWFhYWFhaaYAmWhYWFhYWFhYWFhYWFJliCZbGnICIvFJGviciUiMyKyDdE5Hnj9svCwmL/wcYbCwuLPGFjzsGBHTRssecgIr8ATAHTwCml1L8Zs0sWFhb7FDbeWFhY5Akbcw4GLMGy2HMQkRLwBWALeKlSyhuzSxYWFvsUNt5YWFjkCRtzDgZsiqDFXsQSMAfME7zlsbCwsDAFG28sLCzyhI05BwBWwbLYcxCRe4APASeBY0qpHx+zSxYWFvsUNt5YWFjkCRtzDgYK43bAwmI7ROQHgY5S6g9FxAU+IyKvUkp9aty+WVhY7C/YeGNhYZEnbMw5OLAKloWFhYWFhYWFhYWFhSbYGiwLCwsLCwsLCwsLCwtNsATLwsLCwsLCwsLCwsJCEyzBsrCwsLCwsLCwsLCw0ARLsCwsLCwsLCwsLCwsLDTBEiwLCwsLCwsLCwsLCwtNsATLwsLCwsLCwsLCwsJCEyzBsrCwsLCwsLCwsLCw0IT/P+4ajn5rKnjwAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 定义绘制正弦函数的函数\n", + "def plot_sin_functions(num_functions):\n", + " y = np.linspace(0, 10, 1000) # 定义 y 轴范围\n", + " colors = plt.cm.viridis(np.linspace(0, 1, num_functions)) # 生成颜色序列\n", + "\n", + " fig, ays = plt.subplots(3, 3, figsize=(12, 9)) # 创建3y3子图\n", + "\n", + " # 绘制每个正弦函数\n", + " for i, ay in enumerate(ays.flat):\n", + " if i < num_functions:\n", + " frequency = (i + 1) * 0.5 # 通过增加倍数来调整频率\n", + " y = np.sin(frequency * y)\n", + " ay.plot(y, y, label=f'Function {i+1}', color=colors[i])\n", + " ay.set_title(f'Function {i+1}')\n", + " ay.set_ylabel('y')\n", + " ay.set_ylabel('sin(y)')\n", + " ay.legend()\n", + "\n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + "# 绘制9个正弦函数\n", + "plot_sin_functions(9)\n" + ] + }, + { + "cell_type": "markdown", + "id": "5e810dc0-2972-4ddb-b0b1-631a46ec879d", + "metadata": {}, + "source": [ + "如果能够将不同的特征投射到**不同频率的sin和cos函数上**,就可以让每个特征都投射到一个独特的维度上,各类不同的信息维度共同构成一个解构位置信息的空间,就能够形成对位置信息的深度解读。\n", + "\n", + "**
正余弦编码的意义②:通过调节频率,我们可以得到多种多样的sin和cos函数,

从而可以将位置信息投射到每个维度都各具特色、各不相同的高维空间,以形成对位置信息的更好的表示**" + ] + }, + { + "cell_type": "markdown", + "id": "eb4fcbb1-ee09-4810-8ac6-a5c81f79c0e2", + "metadata": {}, + "source": [ + "- 正弦位置编码(Sinusoidal Positional Encoding)\n", + "$$PE_{(pos, 2i)} = \\sin \\left( \\frac{pos}{10000^{\\frac{2i}{d_{\\text{model}}}}} \\right) $$\n", + "\n", + "- 余弦位置编码(Cosine Positional Encoding)\n", + "$$ PE_{(pos, 2i+1)} = \\cos \\left( \\frac{pos}{10000^{\\frac{2i}{d_{\\text{model}}}}} \\right) $$" + ] + }, + { + "cell_type": "markdown", + "id": "180b8539-cea9-4a11-adb2-909321b4358d", + "metadata": {}, + "source": [ + "接下来的问题就是如何赋予sin和cos函数不同的频率了——在sin和cos函数的自变量上乘以不同的值,就可以获得不同频率的sin和cos函数。\n", + "\n", + "$$y = sin(frequency * y)$$\n", + "\n", + "在位置编码的场景下,我们的自变量是样本的位置pos,因此特征的位置(2i和2i+1)就可以被用来创造不同的频率。在这里,我们对pos这个数字进行了scaling(压缩)的行为。具体地说,我们使用了$10000^{\\frac{2i}{d_{\\text{model}}}}$来作为我们缩放的因子,将它作为除数放在pos的下方。但这其实是在pos的基础上乘以$\\frac{1}{10000^{\\frac{2i}{d_{\\text{model}}}}}$这个频率的行为。因此,引入特征位置本身来进行缩放可以带来不同的频率,帮助我们将位置信息pos投射不同频率的三角函数上,确保不同位置(pos)在不同的特征维度(2i和2i+1)上有不同的编码值。\n", + "\n", + "那下一个问题是,这些正余弦函数的频率是随机的吗?我们应该如何控制它呢?正余弦编码最为巧妙的地方来了——通过让位置信息pos乘以$\\frac{1}{10000^{\\frac{2i}{d_{\\text{model}}}}}$这个频率,**特征编号比较小的特征会得到大频率,会被投射到高频率的正弦函数上,而特征编号较大的特征会得到小频率,会被投射到低频率的正弦函数上**👇" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "d7e3e910-b513-454f-8556-5f19ab50105f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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AQO44oorOO+887jllluYP38+zc3NXHXVVaxatYrbbruNhQsXMm/ePC677DIAbrzxRsaPH/+6x7Rp0173XnPmzKGxsZGDDz54t3M7HW43peomaIHH59zPpHe+O+s4kiRJKje/vRRWzO+UU9W2NENlDvYdC+/4RofHDxs2jMmTJwNw9tlnc/nllzNixAhGjx4NwLnnnsuMGTO4+OKLqamp4YILLmDq1KlMnToVgOnTpzN9+vQO3+fFF1/kgx/8ID/60Y+oqNj9cRxHgnZT9G37Fb705NMZJ5EkSZK6VkRssb29a3VyuRxz5sxh2rRp3HHHHZx66qlAcSNB69at453vfCdf/epXOeaYYzoltyNBuym/R38a1sGGl9ZkHUWSJEnlqIgRm2Jt2smbpT733HPMnj2bSZMmcdNNNzFx4kSuvvpqlixZwsiRI7n++us54YQTqKurY+PGjZx22mlMnjyZgw46COh4JKixsZH3vOc9nHPOOducIrerLIJ2U//9h1C3FBrXtWQdRZIkSepShxxyCDNmzOD8889nzJgxXHnllRxzzDGceeaZNDc3c+SRR3LRRRexevVqzjjjDOrr60kpccUVVxR1/p/+9Kf86U9/YtWqVVx33XUAXHfddYwfP363clsE7aaB+x3AitZmUlM+6yiSJElSl8rlctxwww1btJ100knMnTt3i7b99tuPOXPm7PT5zz77bM4+++zdyrgtXhO0myrzOXJNa0nNfbKOIkmSJKkIFkGdoKJ1HaTi505KkiRJPd3w4cNZsGBB1jF2iUVQJ4i0jlThDVMlSZKknsAiqDNU1tGcswiSJEmSegKLoE5QUVVPS64PK5c9m3UUSZIkSR2wCOoElX0TAE88vPMrXkiSJEnqWhZBnaBmcF8AVj61NNsgkiRJUi/y7LPPcsQRRzB+/Hje+MY38v3vf79Tzut9gjrBHgcO4eVlsPGltVlHkSRJknqN/fbbj9mzZ1NdXU1dXR1vetObOP3009l///1367yOBHWC4YcfDkDT+taMk0iSJEldY+nSpRx66KFMnz6dww47jGnTprFx40ZmzpzJhAkTGDt2LOeffz4NDQ0AXHrppYwZM4Zx48ZxySWXFPUeVVVVVFdXA9DQ0EBra+d837YI6gTDD30TFS2NpPqqrKNIkiRJXWbx4sV87GMfY9GiRQwYMIArrriC8847j1tu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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 设置参数\n", + "d_model = 512\n", + "i = np.arange(0, 512) # 维度索引从0到20\n", + "\n", + "# 绘制图像\n", + "plt.figure(figsize=(14, 8))\n", + "for pos in pos_values:\n", + " values = 1 / (10000 ** (2 * i / d_model))\n", + " plt.plot(i, values, label=f'pos={pos}')\n", + "\n", + "plt.title('i vs 1 / (10000^(2i/d_model))')\n", + "plt.ylabel('feature_indey')\n", + "plt.ylabel('1 / (10000^(2i/d_model))')\n", + "plt.legend()\n", + "plt.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "185f6c76-cbe2-44f8-8ab4-0ec871c9693c", + "metadata": {}, + "source": [ + "在这张图像上,横坐标是特征的位置编号i,纵坐标是$\\frac{1}{10000^{\\frac{2i}{d_{\\text{model}}}}}$,很显然特征编号越大频率越小。对三角函数来说,频率越小意味着当自变量移动1个单位时,函数值变化越小;频率越高,当自变量移动1个单位时,函数值变化就越剧烈。" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "5c51210e-50cc-4590-a7d2-3ef52f07b695", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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MjMzGTlyJLNnzyYqKorq6mqstfz85z/ngw8+wBjDPffcw5QpU5g3bx733nsviYmJrFixgnHjxvHiiy/u18h94403Dtsjk5aWxpQpU/jkk0/4+c9/Tnx8PL/97W+pr69n0KBBPPfcc0RFRfHhhx9y11130a1bN0488UQ2bdrEnDlzuPfee4mKiuKnP/0pAKNGjWLOnDmkpaXx4osv8o9//IOGhgYmTpzI448/TnBw8EF/57t27eK73/0umzZtAuCJJ57gww8/JD4+nrvuuguAu+++m549e/LDH/7wsP9Hh/qZAYKC9h88cckllzB79mxvS7A6TWddi0KCg3j51kkYgxYTFxHxUh77dLbWnmmtHXWAr44mV0VAarvHKe5tJUCcMSZkn+0ifisoyBxxcuWUs88+m4KCAoYOHcodd9zBF198ccD99u7dy6RJk8jLy+Pkk0/mqaeeOuB+r7zyStvQuueee+6w509MTCQnJ4fbb7+9rafk/vvvJzY2luXLl5Ofn8/pp5/OQw89RGRkJLm5ucyePftbx3jzzTfJzc0lLy+PTz/9lJ/97Gfs2LEDgGXLlvHII4+watUqNm3axPz58/eLYf78+YwbN+5b26699tq2n6OkpASAhIQEcnJyOPPMM3nggQf49NNPycnJISsri7/+9a/U1dVxyy238O6777J06VJ27tx52J9/9erVvPLKK8yfP5/c3FyCg4Pbfr6D/c5/8IMfcMopp5CXl0dOTg4jR45kxowZPP/88wC4XC5efvllrrvuuv3Od9JJJ7X9XO2/Pv3008PG2l5WVhZfffXVEb2mCxzsOnTAfdzXpVharlMeExsZetRr5omIiOd58xDBJcAQY8wAWi5gVwPXWGutMWYucAUt4+GnAV3WIybiSw7V0+QpUVFRLF26lK+++oq5c+cyZcoUHnroIaZPn/6t/cLCwrjwwgsBGDduHJ988skBj7fvEMF58+Yd8vyXXXZZ2zHffPNNAD799FNefvnltn169OhxyGN8/fXXTJ06leDgYHr16sUpp5zCkiVLiImJYcKECaSkpACQmZnJli1bOPHEE7/1+h07dpCUlPStbQcaIjhlyhQAvvnmG1atWtXWe9PQ0MDkyZNZs2YNAwYMYMiQIQBcd911PPnkk4eM/bPPPmPp0qWMHz8egNraWnr27Akc/Hf++eeftyVTwcHBxMbG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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 定义绘制正弦函数的函数\n", + "def plot_sin_functions():\n", + " y = np.linspace(0, 10, 1000) # 定义 y 轴范围\n", + " \n", + " fig, ays = plt.subplots(1, 2, figsize=(12, 6)) # 创建1y2子图\n", + "\n", + " # 绘制频率为1的正弦函数\n", + " frequency1 = 1\n", + " y1 = np.sin(frequency1 * y)\n", + " ays[0].plot(y, y1, label=f'Sin Function (Frequency = {frequency1})')\n", + " ays[0].set_title(f'Sin Function with Frequency = {frequency1}')\n", + " ays[0].set_ylabel('y')\n", + " ays[0].set_ylabel('sin(y)')\n", + " ays[0].legend()\n", + "\n", + " # 绘制频率为0.1的正弦函数\n", + " frequency2 = 0.1\n", + " y2 = np.sin(frequency2 * y)\n", + " ays[1].plot(y, y2, label=f'Sin Function (Frequency = {frequency2})')\n", + " ays[1].set_title(f'Sin Function with Frequency = {frequency2}')\n", + " ays[1].set_ylabel('y')\n", + " ays[1].set_ylabel('sin(y)')\n", + " ays[1].legend()\n", + "\n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + "# 绘制两个正弦函数在横向排列的子图中\n", + "plot_sin_functions()\n" + ] + }, + { + "cell_type": "markdown", + "id": "dd0c2077-2cd1-4eb4-a37d-29ced5a218ca", + "metadata": {}, + "source": [ + "因此,这里你就可以发现非常有趣的事实了——特征编号小的特征,会随着特征值的变化而产生剧烈的变化,即便是相邻的两个样本,在最初的几个特征进行位置编码时,也会产生迥然不同的结果,但是随着特征编号的变大,特征值的变化带来的变化会越来越小,并且会小到呈现出一种单调性(只上升、或者只下降)。当一个信息被映射到这样的高维空间时,我们会认为这个信息的全局趋势和局部细节都被捕捉到了。其中,特征编号比较大的那些维度捕捉到的是样本与样本之间按顺序排列的全局趋势,而特征编号比较小的那些维度捕捉到的是样本与样本的位置之间本身的细节差异。因此,正余弦编码是一种能够同时捕捉到全局位置趋势和细节位置差异的编码方式。\n", + "\n", + "**
正余弦编码的意义③:通过独特的计算公式,我们可以让特征编号小的特征被投射到剧烈变化的维度上,

并且让特征编号大的特征被投射到轻微变化、甚至完全单调的维度上,从而可以让小编号特征去

捕捉样本之间的局部细节差异,让大编号特征去捕捉样本之间按顺序排列的全局趋势**" + ] + }, + { + "cell_type": "markdown", + "id": "622f0950-291e-4108-ae0f-b1ff987f0f9c", + "metadata": {}, + "source": [ + "从这个角度来看,其实我们只需要设置一个随着i的增长变得越来越小的公式就可以了,实际公式本身其实并不一定非要是$\\frac{1}{10000^{\\frac{2i}{d_{\\text{model}}}}}$。但这个公式考虑了i相对于特征总量的相对位置,并且还使用了指数函数,它是能够最大程度放大i的影响的公式之一,因此我们使用它可以说是出于一种数学上的便利。当然,你也可以使用其他的公式,只要能够保证i的增长会让频率本身变得越来越小即可。" + ] + }, + { + "cell_type": "markdown", + "id": "5c8c0f27-0846-4ef1-8c63-977231bd6534", + "metadata": {}, + "source": [ + "现在我们可以来看一个具体例子,通过绘制图像来让大家清晰地看到,正余弦编码是如何帮助我们捕捉局部细节和总体趋势的。假设现在有30个样本(索引为1-30),每个样本有4个特征。我们将使用正弦函数编码偶数维度,使用余弦函数编码奇数维度,进行正余弦编码的具体计算。" + ] + }, + { + "cell_type": "markdown", + "id": "b7761492-e455-4459-88a9-a54f7339c612", + "metadata": {}, + "source": [ + "- 正弦位置编码(Sinusoidal Positional Encoding)\n", + "$$PE_{(pos, 2i)} = \\sin \\left( \\frac{pos}{10000^{\\frac{2i}{d_{\\text{model}}}}} \\right) $$\n", + "\n", + "- 余弦位置编码(Cosine Positional Encoding)\n", + "$$ PE_{(pos, 2i+1)} = \\cos \\left( \\frac{pos}{10000^{\\frac{2i}{d_{\\text{model}}}}} \\right) $$" + ] + }, + { + "cell_type": "markdown", + "id": "8b22bfcd-35bb-40f7-b84d-e4bfcb6defa8", + "metadata": {}, + "source": [ + "我请GPT帮我完成了相应的计算流程,最终生成了如下的表单👇" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "7cdc9e73-583b-4b0a-a3da-f101adeb464e", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "position = pd.read_csv(r\"D:\\pythonwork\\2024DL\\Position_Encoding_for_30_Samples.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "c5fe942e-560d-4ee0-ab8d-c6d67408b025", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
维度0维度1维度2维度3
00.8414710.5403020.0100000.999950
10.909297-0.4161470.0199990.999800
20.141120-0.9899920.0299960.999550
3-0.756802-0.6536440.0399890.999200
4-0.9589240.2836620.0499790.998750
5-0.2794150.9601700.0599640.998201
60.6569870.7539020.0699430.997551
70.989358-0.1455000.0799150.996802
80.412118-0.9111300.0898790.995953
9-0.544021-0.8390720.0998330.995004
10-0.9999900.0044260.1097780.993956
11-0.5365730.8438540.1197120.992809
120.4201670.9074470.1296340.991562
130.9906070.1367370.1395430.990216
140.650288-0.7596880.1494380.988771
15-0.287903-0.9576590.1593180.987227
16-0.961397-0.2751630.1691820.985585
17-0.7509870.6603170.1790300.983844
180.1498770.9887050.1888590.982004
190.9129450.4080820.1986690.980067
200.836656-0.5477290.2084600.978031
21-0.008851-0.9999610.2182300.975897
22-0.846220-0.5328330.2279780.973666
23-0.9055780.4241790.2377030.971338
24-0.1323520.9912030.2474040.968912
250.7625580.6469190.2570810.966390
260.956376-0.2921390.2667310.963771
270.270906-0.9626060.2763560.961055
28-0.663634-0.7480580.2859520.958244
29-0.9880320.1542510.2955200.955336
\n", + "
" + ], + "text/plain": [ + " 维度0 维度1 维度2 维度3\n", + "0 0.841471 0.540302 0.010000 0.999950\n", + "1 0.909297 -0.416147 0.019999 0.999800\n", + "2 0.141120 -0.989992 0.029996 0.999550\n", + "3 -0.756802 -0.653644 0.039989 0.999200\n", + "4 -0.958924 0.283662 0.049979 0.998750\n", + "5 -0.279415 0.960170 0.059964 0.998201\n", + "6 0.656987 0.753902 0.069943 0.997551\n", + "7 0.989358 -0.145500 0.079915 0.996802\n", + "8 0.412118 -0.911130 0.089879 0.995953\n", + "9 -0.544021 -0.839072 0.099833 0.995004\n", + "10 -0.999990 0.004426 0.109778 0.993956\n", + "11 -0.536573 0.843854 0.119712 0.992809\n", + "12 0.420167 0.907447 0.129634 0.991562\n", + "13 0.990607 0.136737 0.139543 0.990216\n", + "14 0.650288 -0.759688 0.149438 0.988771\n", + "15 -0.287903 -0.957659 0.159318 0.987227\n", + "16 -0.961397 -0.275163 0.169182 0.985585\n", + "17 -0.750987 0.660317 0.179030 0.983844\n", + "18 0.149877 0.988705 0.188859 0.982004\n", + "19 0.912945 0.408082 0.198669 0.980067\n", + "20 0.836656 -0.547729 0.208460 0.978031\n", + "21 -0.008851 -0.999961 0.218230 0.975897\n", + "22 -0.846220 -0.532833 0.227978 0.973666\n", + "23 -0.905578 0.424179 0.237703 0.971338\n", + "24 -0.132352 0.991203 0.247404 0.968912\n", + "25 0.762558 0.646919 0.257081 0.966390\n", + "26 0.956376 -0.292139 0.266731 0.963771\n", + "27 0.270906 -0.962606 0.276356 0.961055\n", + "28 -0.663634 -0.748058 0.285952 0.958244\n", + "29 -0.988032 0.154251 0.295520 0.955336" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "position" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "f9998144-59f0-4771-b046-cccd53f7acb6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "维度0 0.990607\n", + "维度1 0.991203\n", + "维度2 0.295520\n", + "维度3 0.999950\n", + "dtype: float64" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "position.may()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "51285d15-f79e-4d82-a706-6c525ce83ccb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "维度0 -0.999990\n", + "维度1 -0.999961\n", + "维度2 0.010000\n", + "维度3 0.955336\n", + "dtype: float64" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "position.min()" + ] + }, + { + "cell_type": "markdown", + "id": "74edeef0-0803-4ed7-80d4-3851ce5b1dd3", + "metadata": {}, + "source": [ + "在这个表单中,有4个特征全部进行正余弦编码后的结果,很显然,特征编号较小的特征(1和2特征)波动很大,但是特征编号相对较大的特征(3和4)波动就不是那么大。我们只计算了4个特征,是因为我们要绘制的3d图像只能够容纳3个特征,事实上当特征数量变得很多时,大部分特征都会呈现像特征3和特征4一样这样平缓的变化方式。\n", + "\n", + "为了展现局部特征和整体趋势的捕捉,我们使用特征2、3、4来绘制了3D图像,在图像中,我们可以明显地看到局部细节和总体趋势的捕捉👇" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "70719d5a-50e1-4e43-9978-93b1094fee54", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "marker": { + "color": [ + 0.9999500004166652, + 0.9998000066665778, + 0.9995500337489877, + 0.999200106660978, + 0.9987502603949664, + 0.9982005399352042, + 0.9975510002532796, + 0.9968017063026194, + 0.9959527330119944, + 0.9950041652780258, + 0.9939560979566968, + 0.9928086358538664, + 0.991561893714788, + 0.9902159962126372, + 0.9887710779360422, + 0.9872272833756268, + 0.9855847669095608, + 0.9838436927881214, + 0.9820042351172704, + 0.9800665778412416, + 0.9780309147241484, + 0.9758974493306056, + 0.9736663950053748, + 0.9713379748520296, + 0.9689124217106448, + 0.9663899781345132, + 0.9637708963658904, + 0.9610554383107708, + 0.9582438755126972, + 0.955336489125606 + ], + "colorscale": [ + [ + 0, + "#440154" + ], + [ + 0.1111111111111111, + "#482878" + ], + [ + 0.2222222222222222, + "#3e4989" + ], + [ + 0.3333333333333333, + "#31688e" + ], + [ + 0.4444444444444444, + "#26828e" + ], + [ + 0.5555555555555556, + "#1f9e89" + ], + [ + 0.6666666666666666, + "#35b779" + ], + [ + 0.7777777777777778, + "#6ece58" + ], + [ + 0.8888888888888888, + "#b5de2b" + ], + [ + 1, + "#fde725" + ] + ], + "opacity": 1, + "size": 6 + }, + "mode": "markers", + "text": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29" + ], + "textposition": "top center", + "type": "scatter3d", + "x": [ + 0.5403023058681398, + -0.4161468365471424, + -0.9899924966004454, + -0.6536436208636119, + 0.2836621854632262, + 0.960170286650366, + 0.7539022543433046, + -0.1455000338086135, + -0.9111302618846768, + -0.8390715290764524, + 0.0044256979880507, + 0.8438539587324921, + 0.9074467814501962, + 0.1367372182078336, + -0.7596879128588213, + -0.9576594803233848, + -0.2751633380515969, + 0.6603167082440802, + 0.9887046181866692, + 0.4080820618133919, + -0.5477292602242684, + -0.9999608263946372, + -0.5328330203333975, + 0.424179007336997, + 0.9912028118634736, + 0.6469193223286404, + -0.2921388087338362, + -0.9626058663135666, + -0.7480575296890003, + 0.154251449887584 + ], + "y": [ + 0.0099998333341666, + 0.019998666693333, + 0.0299955002024956, + 0.0399893341866341, + 0.0499791692706783, + 0.0599640064794445, + 0.0699428473375327, + 0.0799146939691727, + 0.089878549198011, + 0.0998334166468281, + 0.1097783008371748, + 0.1197122072889193, + 0.1296341426196948, + 0.1395431146442365, + 0.1494381324735992, + 0.1593182066142459, + 0.169182349066996, + 0.1790295734258241, + 0.1888588949765005, + 0.1986693307950612, + 0.2084598998460995, + 0.2182296230808693, + 0.2279775235351884, + 0.2377026264271345, + 0.2474039592545229, + 0.2570805518921551, + 0.2667314366888311, + 0.2763556485641137, + 0.2859522251048355, + 0.2955202066613395 + ], + "z": [ + 0.9999500004166652, + 0.9998000066665778, + 0.9995500337489877, + 0.999200106660978, + 0.9987502603949664, + 0.9982005399352042, + 0.9975510002532796, + 0.9968017063026194, + 0.9959527330119944, + 0.9950041652780258, + 0.9939560979566968, + 0.9928086358538664, + 0.991561893714788, + 0.9902159962126372, + 0.9887710779360422, + 0.9872272833756268, + 0.9855847669095608, + 0.9838436927881214, + 0.9820042351172704, + 0.9800665778412416, + 0.9780309147241484, + 0.9758974493306056, + 0.9736663950053748, + 0.9713379748520296, + 0.9689124217106448, + 0.9663899781345132, + 0.9637708963658904, + 0.9610554383107708, + 0.9582438755126972, + 0.955336489125606 + ] + } + ], + "layout": { + "height": 800, + "scene": { + "aspectmode": "auto", + "aspectratio": { + "x": 1, + "y": 1, + "z": 1 + }, + "camera": { + "center": { + "x": 0, + "y": 0, + "z": 0 + }, + "eye": { + "x": 1.295312601789196, + "y": 1.4932026924031352, + "z": 1.6431386191180295 + }, + "projection": { + "type": "perspective" + }, + "up": { + "x": 0, + "y": 0, + "z": 1 + } + }, + "xaxis": { + "range": [ + -1.5, + 1.5 + ], + "title": { + "text": "维度1" + }, + "type": "linear" + }, + "yaxis": { + "range": [ + 0, + 0.3 + ], + "title": { + "text": "维度2" + }, + "type": "linear" + }, + "zaxis": { + "range": [ + 0.95, + 1 + ], + "title": { + "text": "维度3" + }, + "type": "linear" + } + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "3D Scatter Plot" + }, + "width": 800 + } + }, + "image/png": "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m3q6O0vxHBsEAQIECBAgQKBWAeFqrVLuI0CAAAECBDKB2KkaNViHBvvTVVd+rjTBar48Y8cm06HRibZZrbIErI3crbrQYuY7dyPAbZcDn8Ih37l76Mh4Gp+crsRz3tvdmdXlVV+1EstpEgQIECBAoO0EhKttt+QmTIAAAQIEqi0wMzOT1fccHhOwFrXSRexWPVXA2shdskUZLqef2Z27vWn02GRdatkup+963xu7cYf6Zw88q+V69fV96fJL19Vyq3sIECBAgAABAoUICFcLYdYJAQIECBAgULTAyNhEw15LL3outfTXjB2s0WccPNTXW//aqrXMOe7JXycvU2mEWse+kvuWW3P3rf/yVjrwzoG09oK16ZP/4pMr6boun41n54z+ntTfV3t91aj7fNPWHenGazekG67dUJdxaIQAAQIECBAgsFIB4epKBX2eAAECBAgQKK2AgLVxS5O/yn1sfDqrfToz07i+lmo5D5aPT0y33Y7l2ME6NTWTDo8tvAY//39+np6654dZsJpf/Wv604b/fUO65t9+eSnahnw/D4ZPpwzA8JGxdMc9D6fzzzk7fWvL17Lazy4CBAgQIECAQDMFhKvN1Nc3AQIECBAg0HABAWv9ifODlQ4dmShN3c98J2TMdrGgsf4S5WhxTX9PWtXTmT4YGU9T079NuZ//989nwepi1/rr1qdbd/2bQicRJSTOGOhJnbFgK7h2PvJUihIBu+7bumjd5whiha8rQPZRAgQIECBAoCYB4WpNTG4iQIAAAQIEWlng8Oh4y9emXI5/o0oE5DsOxydit+rkvCBvOeNr5L150Hhg+HhTd9M2co4LtZ0H3geHZwPWt/7prbTzD3ekseGxUw5lw7/ZkL52358UMtzl1lddalB7ntubfvDMC2nb7dfPq8P62O496fs/fj6NjB7NygfctmmjkHUpTN8nQIAAAQIETltAuHradD5IgAABAgQItJLAh0fG2+pU+XoHrHl4F6FqHCBV5ivG2tfb9bGdnGUecz3GNnuwWE86dGQ8/Z/X/7v02k9/XlOzD/z8u+kTF36ipntP56a8Lm5Pd+fpfPyUn4k6rD97+ecnarDevePx9Mov3kjbb78+/e6l69J3dv0wpY6OdN+2W+retwYJECBAgAABAiEgXPUcECBAgAABAm0j8N8PHUuTU00sDlqwdD0C1lbYrboQ68k7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SYAAAQIECBAolcDMTEr7Dx9rSMBahjIAp8KOgPXd9w+k+7bdUqo1MRgCBAgQIECAAIHiBYSrxZvrkQABAgQIECBQCYHJqel0cHg8TU3XZwdrR0fKDq3q7+uuhI9JECBAgAABAgQIVF9AuFr9NTZDAgQIECBAgEDDBOoVsEZ91bPXlK8MQMPgNEyAAAECBAgQIFAJAeFqJZbRJAgQIECAAAECzRNYacC6elVXtmO1s7OjeZPQMwECBAgQIECAAIHTEBCungaajxAgQIAAAQIECMwXiIB1/+HjKWqxLucqe33V5czFvQQIECBAgAABAu0nIFxtvzU3YwIECBAgQIBAQwQmJqfTgeHaAtYoA3DmYE9a1dPVkLFolAABAgQIECBAgEARAsLVIpT1QYAAAQIECBBoE4Gj41Ppw5HxU862u6sjnTWkvmqbPBKmSYAAAQIECBCotIBwtdLLa3IECBAgQIAAgWIFZmZm0tHjU+nQ6MSCHQ/0daUzBnqLHZTeCBAgQIAAAQIECDRIQLjaIFjNEiBAgAABAgTaWWBkbCKNHJ08QdDRkdLQ6p40uLq7nVnMnQABAgQIECBAoGICwtWKLajpECBAgAABAgTKIpAHrFFf9ew1ygCUZV2MgwABAgQIECBAoH4CwtX6WWqJAAECBAgQIEDgJIGxY5Opt6czdXd1siFAgAABAgQIECBQOQHhauWW1IQIECBAgAABAgQIECBAgAABAgQIEChCQLhahLI+CBAgQIAAAQIECBAgQIAAAQIECBConIBwtXJLakIECBAgQIAAAQIECBAgQIAAAQIECBQhIFwtQlkfBAgQIECAAAECBAgQIECAAAECBAhUTkC4WrklNSECBAgQIECAAAECBAgQIECAAAECBIoQEK4WoawPAgQIECBAgAABAgQIECBAgAABAgQqJyBcrdySmhABAgQIECBAoL4CL+19LQ0N9qfLL11X34a1RoAAAQIECBAgQKDFBYSrLb6Ahk+AAAECBAgQaJTAe785mG7auiONjIymjs7O9Idf+P207fbrG9WddgkQIECAAAECBAi0nIBwteWWzIAJECBAgAABAo0XyIPVG6/dkG64dkN69fV9adOdO9N//U+7G9r58JGxtGawv6F9aJwAAQIECBAgQIBAvQSEq/WS1A4BAgQIECBAoEICj+7ek957/0C6b9st2az2vflOunvH42nblq+lT190QcMC0Md270m//PXb6YpL16WrrvxcOu+csyukaioECBAgQIAAAQJVExCuVm1FzYcAAQIECBAgUCeBfBdp/O/Nd+5M+X+/+9/2p4fvvSNd8dlL6tTT/Ga+cstfpOhj90Pb07qLL2xIHxolQIAAAQIECBAgUA8B4Wo9FLVBgAABAgQIEKi4wA+eeSErDxDX3TufSPt+/Xb6yRPfrvusY3fsK794I33voe12rdZdV4MECBAgQIAAAQL1FhCu1ltUewQIECBAgACBigu8+os30pa7Hkz/8Pd/VbeZxq7YPLQVrNaNVUMECBAgQIAAAQINFhCuNhhY8wQIECBAgACBqgnsfOSpbOfq7ge3rWhqsRs26qoODa5Om7bOlh0QrK6I1IcJECBAgAABAgQKFhCuFgyuOwIECBAgQIBAGQTe+83BtGPXD9O+X72VNn7pyuyV/zWD/accWuxY3fPTl9Mrr++rSwi657m9KQ7Oyi/BahmeDGMgQIAAAQIECBBYjoBwdTla7iVAgAABAgQIVEAgdojGoVE3XrshnX/u2izgXGrX6Et7X0s7HnkqXbX+srTt9uvrpvDY7j1Z/y88/UA2FhcBAgQIECBAgACBVhIQrrbSahkrAQIECBAgQKAOAvE6/s/2vnbitf4IVm++c/a1/BeffmBeD7Fb9fLPfLoOvS7eRASs775/IN237Zaa+omg93cvXbfkTtuaGnMTAQIECBAgQIAAgRUICFdXgOejBAgQIECAAIFWFIhw9fvPvDAvSI0yATdt3TFvZ2rcF/VVd917R/r8+ssaOtV9b76T1l10wZJ95DtdN37h99N9229d8n43ECBAgAABAgQIEGikgHC1kbraJkCAAAECBAiUUCCC1Ku/+o1sp+jGL64/McKogXr3zifSiz/6bjrvnLOzr0fAGvVYi7pi92zsTJ07rrzvPFiNsgRRK3ZoaKCuJQqKmqN+CBAgQIAAAQIEqiMgXK3OWpoJAQIECBAgQKBmgQgqn31ub1YaYG6t0698/c/TDX/0hQXDzZobX8GNUX81xvaTv/7LeTtZozzBpq07sjA1D3vv3vF4Ov93PpFu27RxBT36KAECBAgQIECAAIHTFxCunr6dTxIgQIAAAQIEWlpg0507s1qn33to+4mdqhGubvzSlYXuVj0Z8dXX96XLL133Mds8EJ473ihbEGGrw7Ba+lE0eAIECBAgQIBAywoIV1t26QycAAECBAgQILAygSgPsOXuh7KDrG68dkPa9+u30yuv70s/eeLbpTgsKsoDrPvUJ08EvzHbKFsQV62HX61MyKcJECBAgAABAgQInFpAuOoJIUCAAAECBAi0sUAEq1FXNYLV2P0Zr9ivGewvhUgEqeeduzZtnvPaf9SFjfFGAOwiQIAAAQIECBAg0GwB4WqzV0D/BAgQIECAAAECCwq89/6BtOWeh9Ou+7Zmu1djp+1NW3dkIXDUinURIECAAAECBAgQaLaAcLXZK6B/AgQIECBAgACBRQWiNMBdOx7PygNEfdi45tZcRUeAAAECBAgQIECgmQLC1Wbq65sAAQIECBAgQGBJgShd8HfP7c12rH5+/WVL3u8GAgQIECBAgAABAkUJCFeLktYPAQIECBAgQIAAAQIECBAgQIAAAQKVEhCuVmo5TYYAAQIECBAgQIAAAQIECBAgQIAAgaIEhKtFSeuHAAECBAgQIECAAAECBAgQIECAAIFKCQhXK7WcJkOAAAECBAgQIECAAAECBAgQIECAQFECwtWipPVDgAABAgQIECBAgAABAgQIECBAgEClBISrlVpOkyFAgAABAgQIECBAgAABAgQIECBAoCgB4WpR0vohQIAAAQIECBAgQIAAAQIECBAgQKBSAsLVSi2nyRAgQIAAAQIECBAgQIAAAQIECBAgUJSAcLUoaf0QIECAAAECBAgQIECAAAECBAgQIFApAeFqpZbTZAgQIECAAAECBAgQIECAAAECBAgQKEpAuFqUtH4IECBAgAABAgQIECBAgAABAgQIEKiUgHC1UstpMgQIECBAgAABAgQIECBAgAABAgQIFCUgXC1KWj8ECBAgQIAAAQIECBAgQIAAAQIECFRKQLhaqeU0GQIECBAgQIAAAQIECBAgQIAAAQIEihIQrhYlrR8CBAgQIECAAAECBAgQIECAAAECBColIFyt1HKaDAECBAgQIECAAAECBAgQIECAAAECRQkIV4uS1g8BAgQIECBAgAABAgQIECBAgAABApUSEK5WajlNhgABAgQIECBAgAABAgQIECBAgACBogSEq0VJ64cAAQIECBAgQIAAAQIECBAgQIAAgUoJCFcrtZwmQ4AAAQIECBAgQIAAAQIECBAgQIBAUQLC1aKk9UOAAAECBAgQIECAAAECBAgQIECAQKUEhKuVWk6TIUCAAAECBAgQIECAAAECBAgQIECgKAHhalHS+iFAgAABAgQIECBAgAABAgQIECBAoFICwtVKLafJECBAgAABAgQIECBAgAABAgQIECBQlIBwtShp/RAgQIAAAQIECBAgQIAAAQIECBAgUCkB4WqlltNkCBAgQIAAAQIECBAgQIAAAQIECBAoSkC4WpS0fggQIECAAAECBAgQIECAAAECBAgQqJSAcLVSy2kyBAgQIECAAAECBAgQIECAAAECBAgUJSBcLUpaPwQIECBAgAABAgQIECBAgAABAgQIVEpAuFqp5TQZAgQIECBAgAABAgQIECBAgAABAgSKEhCuFiWtHwIECBAgQIAAAQIECBAgQIAAAQIEKiUgXK3UcpoMAQIECBAgQIAAAQIECBAgQIAAAQJFCQhXi5LWDwECBAgQIECAAAECBAgQIECAAAEClRIQrlZqOU2GAAECBAgQIECAAAECBAgQIECAAIGiBISrRUnrhwABAgQIECBAgAABAgQIECBAgACBSgkIVyu1nCZDgAABAgQIECBAgAABAgQIECBAgEBRAsLVoqT1Q4AAAQIECBAgQIAAAQIECBAgQIBApQSEq5VaTpMhQIAAAQIECBAgQIAAAQIECBAgQKAoAeFqUdL6IUCAAAECBAgQIECAAAECBAgQIECgUgLC1Uotp8kQIECAAAECBAgQIECAAAECBAgQIFCUgHC1KGn9ECBAgAABAgQIECBAgAABAgQIECBQKQHhaqWW02QIECBAgAABAgQIECBAgAABAgQIEChKQLhalLR+CBAgQIAAAQIECBAgQIAAAQIECBColIBwtVLLaTIECBAgQIAAAQIECBAgQIAAAQIECBQlIFwtSlo/BAgQIECAAAECBAgQIECAAAECBAhUSkC4WqnlNBkCBAgQIECAAAECBAgQIECAAAECBIoSEK4WJa0fAgQIECBAgAABAgQIECBAgAABAgQqJSBcrdRymgwBAgQIECBAgAABAgQIECBAgAABAkUJCFeLktYPAQIECBAgQIAAAQIECBAgQIAAAQKVEhCuVmo5TYYAAQIECBAgQIAAAQIECBAgQIAAgaIEhKtFSeuHAAECBAgQIECAAAECBAgQIECAAIFKCQhXK7WcJkOAAAECBAgQIECAAAECBAgQIECAQFECwtWipPVDgAABAgQIECBAgAABAgQIECBAgEClBISrlVpOkyFAgAABAgQIECBAgAABAgQIECBAoCgB4WpR0vohQIAAAQIECBAgQIAAAQIECBAgQKBSAsLVSi2nyRAgQIAAAQIECBAgQIAAAQIECBAgUJSAcLUoaf0QIECAAAECBAgQIECAAAECBAgQIFApAeFqpZbTZAgQIECAAAECBAgQIECAAAECBAgQKEpAuFqUtH4IECBAgAABAgQIECBAgAABAgQIEKiUgHC1UstpMgQIECBAgAABAgQIECBAgAABAgQIFCUgXC1KWj8ECBAgQIAAAQIECBAgQIAAAQIECFRKQLhaqeU0GQIECBAgQIAAAQIECBAgQIAAAQIEihIQrhYlrR8CBAgQIECAAAECBAgQIECAAAECBColIFyt1HKaDAECBAgQIECAAAECBAgQIECAAAECRQkIV4uS1g8BAgQIECBAgAABAgQIECBAgAABApUSEK5WajlNhgABAgQIECBAgAABAgQIECBAgACBogSEq0VJ64cAAQIECBAgQIAAAQIECBAgQIAAgUoJCFcrtZwmQ4AAAQIECBAgQIAAAQIECBAgQIBAUQLC1aKk9UOAAAECBAgQIECAAAECBAgQIECAQKUEhKuVWk6TIUCAAAECBAgQIECAAAECBAgQIECgKAHhalHS+iFAgAABAgQIECBAgAABAgQIECBAoFICwtVKLafJECBAgAABAgQIECBAgAABAgQIECBQlIBwtShp/RAgQIAAAQIECBAgQIAAAQIECBAgUCkB4WqlltNkCBAgQIAAAQIECBAgQIAAAQIECBAoSkC4WpS0fggQIECAAAECBAgQIECAAAECBAgQqJSAcLVSy2kyBAgQIECAAAECBAgQIECAAAECBAgUJSBcLUpaPwQIECBAgAABAgQIECBAgAABAgQIVEpAuFqp5TQZAgQIECBAgAABAgQIECBAgAABAgSKEhCuFiWtHwIECBAgQIAAAQIECBAgQIAAAQIEKiUgXK3UcpoMAQIECBAgQIAAAQIECBAgQIAAAQJFCQhXi5LWDwECBAgQIECAAAECBAgQIECAAAEClRIQrlZqOU2GAAECBAgQIECAAAECBAgQIECAAIGiBISrRUnrhwABAgQIECBAgAABAgQIECBAgACBSgkIVyu1nCZDgAABAgQIECBAgAABAgQIECBAgEBRAsLVoqT1Q4AAAQIECBAgQIAAAQIECBAgQIBApQSEq5VaTpMhQIAAAQIECBAgQIAAAQIECBAgQKAoAeFqUdL6IUCAAAECBAgQIECAAAECBAgQIECgUgLC1Uotp8kQIECAAAECBAgQIECAAAECBAgQIFCUgHC1KGn9ECBAgAABAgQIECBAgAABAgQIECBQKQHhaqWW02QIECBAgAABAgQIECBAgAABAgQIEChKQLhalLR+CBAgQIAAAQIECBAgQIAAAQIECBColIBwtVLLaTIECBAgQIAAAQIECBAgQIAAAQIECBQlIFwtSlo/BAgQIECAAAECBAgQIECAAAECBAhUSkC4WqnlNBkCBAgQIECAAAECBAgQIECAAAECBIoSEK4WJa0fAgQIECBAgAABAgQIECBAgAABAgQqJSBcrdRymgwBAgQIECBAgAABAgQIECBAgAABAkUJCFeLktYPAQIECBAgQIAAAQIECBAgQIAAAQKVEhCuVmo5TYYAAQIECBAgQIAAAQIECBAgQIAAgaIE/n+7+unHMHFCZQAAAABJRU5ErkJggg==", + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import plotly.graph_objs as go\n", + "import pandas as pd\n", + "\n", + "# 数据\n", + "import pandas as pd\n", + "position = pd.read_csv(r\"D:\\pythonwork\\2024DL\\Position_Encoding_for_30_Samples.csv\")\n", + "\n", + "# 绘制3D散点图\n", + "fig = go.Figure(data=[go.Scatter3d(\n", + " x=position['维度1'],\n", + " y=position['维度2'],\n", + " z=position['维度3'],\n", + " mode='markers',\n", + " marker=dict(\n", + " size=6,\n", + " color=position['维度3'], # 设置颜色为维度3\n", + " colorscale='Viridis', # 颜色范围\n", + " opacity=1),\n", + " text=position.index.tolist(), # 添加样本编号作为文本标签\n", + " textposition='top center'\n", + ")])\n", + "\n", + "fig.update_layout(\n", + " title='3D Scatter Plot',\n", + " scene=dict(\n", + " xaxis=dict(title='维度1', range=[-1.5, 1.5]),\n", + " yaxis=dict(title='维度2', range=[0, 0.3]),\n", + " zaxis=dict(title='维度3', range=[0.95, 1])\n", + " ),\n", + " width=800, # 调整图像宽度\n", + " height=800 # 调整图像高度\n", + ")\n", + "\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f0f681df-9eec-40ae-a1b8-da04d337529b", + "metadata": {}, + "source": [ + "现在你已经彻底了解正余弦编码的运作过程了。在这一小节我们总结了3个正余弦编码的意义:" + ] + }, + { + "cell_type": "markdown", + "id": "5bc496e0-50f0-476d-bf18-3cf0093a6d38", + "metadata": {}, + "source": [ + "**
正余弦编码的意义①:sin和cos函数值域有限,可以很好地限制位置编码的数字大小。**\n", + "\n", + "
===================\n", + "\n", + "**
正余弦编码的意义②:通过调节频率,我们可以得到多种多样的sin和cos函数,

从而可以将位置信息投射到每个维度都各具特色、各不相同的高维空间,以形成对位置信息的更好的表示**\n", + "\n", + "
===================\n", + "\n", + "**
正余弦编码的意义③:通过独特的计算公式,我们可以让特征编号小的特征被投射到剧烈变化的维度上,

并且让特征编号大的特征被投射到轻微变化、甚至完全单调的维度上,从而可以让小编号特征去

捕捉样本之间的局部细节差异,让大编号特征去捕捉样本之间按顺序排列的全局趋势**" + ] + }, + { + "cell_type": "markdown", + "id": "9265b088-d45b-40a5-a624-764915bd8b2d", + "metadata": {}, + "source": [ + "但除此之外,正余弦编码还有一些额外的好处——\n", + "\n", + "- 首先最重要的是其**函数的周期性带来泛化性**:在模型训练过程中,我们可能使用的都是序列长度小于20的数据,但是当实际应用中遇到一个序列长度为50的数据,**正弦和余弦函数的周期性**意味着,即使模型在训练时未见过某个位置,它仍然可以生成一个合理的位置编码。它可用泛化到不同长度的序列。\n", + "\n", + "- **不增加额外的训练参数**:当我们在一个已经很大的模型(如 GPT-3 或 BERT)上添加位置信息时,我们不希望增加太多的参数,因为这会增加训练成本和过拟合的风险。正弦和余弦位置编码不增加任何训练参数。\n", + "\n", + "- **即便是相同频率下的正余弦函数,也可以通过周期性带来部分的相对位置信息,可以比绝对位置信息更有效**:正弦和余弦函数的周期性特征为模型提供了一种隐含的相对位置信息,使得模型能够更有效地理解序列中不同位置之间的相对关系。" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "41507a9b-9bd7-4f8e-b27c-ea914cd7c8c0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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MjMzGTlyJLNnzyYqKorq6mqstfz85z/ngw8+wBjDPffcw5QpU5g3bx733nsviYmJrFixgnHjxvHiiy/u18h94403Dtsjk5aWxpQpU/jkk0/4+c9/Tnx8PL/97W+pr69n0KBBPPfcc0RFRfHhhx9y11130a1bN0488UQ2bdrEnDlzuPfee4mKiuKnP/0pAKNGjWLOnDmkpaXx4osv8o9//IOGhgYmTpzI448/TnBw8EF/57t27eK73/0umzZtAuCJJ57gww8/JD4+nrvuuguAu+++m549e/LDH/7wsP9Hh/qZAYKC9h88cckllzB79mxvS7A6TWddi0KCg3j51kkYgxYTFxHxUh77dLbWnmmtHXWAr44mV0VAarvHKe5tJUCcMSZkn+0ifisoyBxxcuWUs88+m4KCAoYOHcodd9zBF198ccD99u7dy6RJk8jLy+Pkk0/mqaeeOuB+r7zyStvQuueee+6w509MTCQnJ4fbb7+9rafk/vvvJzY2luXLl5Ofn8/pp5/OQw89RGRkJLm5ucyePftbx3jzzTfJzc0lLy+PTz/9lJ/97Gfs2LEDgGXLlvHII4+watUqNm3axPz58/eLYf78+YwbN+5b26699tq2n6OkpASAhIQEcnJyOPPMM3nggQf49NNPycnJISsri7/+9a/U1dVxyy238O6777J06VJ27tx52J9/9erVvPLKK8yfP5/c3FyCg4Pbfr6D/c5/8IMfcMopp5CXl0dOTg4jR45kxowZPP/88wC4XC5efvllrrvuuv3Od9JJJ7X9XO2/Pv3008PG2l5WVhZfffXVEb2mCxzsOnTAfdzXpVharlMeExsZetRr5omIiOd58xDBJcAQY8wAWi5gVwPXWGutMWYucAUt4+GnAV3WIybiSw7V0+QpUVFRLF26lK+++oq5c+cyZcoUHnroIaZPn/6t/cLCwrjwwgsBGDduHJ988skBj7fvEMF58+Yd8vyXXXZZ2zHffPNNAD799FNefvnltn169OhxyGN8/fXXTJ06leDgYHr16sUpp5zCkiVLiImJYcKECaSkpACQmZnJli1bOPHEE7/1+h07dpCUlPStbQcaIjhlyhQAvvnmG1atWtXWe9PQ0MDkyZNZs2YNAwYMYMiQIQBcd911PPnkk4eM/bPPPmPp0qWMHz8egNraWnr27Akc/Hf++eeftyVTwcHBxMbG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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 定义绘制正弦函数的函数\n", + "def plot_sin_functions():\n", + " y = np.linspace(0, 10, 1000) # 定义 y 轴范围\n", + " \n", + " fig, ays = plt.subplots(1, 2, figsize=(12, 6)) # 创建1y2子图\n", + "\n", + " # 绘制频率为1的正弦函数\n", + " frequency1 = 1\n", + " y1 = np.sin(frequency1 * y)\n", + " ays[0].plot(y, y1, label=f'Sin Function (Frequency = {frequency1})')\n", + " ays[0].set_title(f'Sin Function with Frequency = {frequency1}')\n", + " ays[0].set_ylabel('y')\n", + " ays[0].set_ylabel('sin(y)')\n", + " ays[0].legend()\n", + "\n", + " # 绘制频率为0.1的正弦函数\n", + " frequency2 = 0.1\n", + " y2 = np.sin(frequency2 * y)\n", + " ays[1].plot(y, y2, label=f'Sin Function (Frequency = {frequency2})')\n", + " ays[1].set_title(f'Sin Function with Frequency = {frequency2}')\n", + " ays[1].set_ylabel('y')\n", + " ays[1].set_ylabel('sin(y)')\n", + " ays[1].legend()\n", + "\n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + "# 绘制两个正弦函数在横向排列的子图中\n", + "plot_sin_functions()\n" + ] + }, + { + "cell_type": "markdown", + "id": "a000479d-aba9-47af-81ee-a9afeb828588", + "metadata": {}, + "source": [ + "## 2.2 Encoder结构解析" + ] + }, + { + "cell_type": "markdown", + "id": "a91102be-93a2-46ae-8359-721bb7f0cb1d", + "metadata": {}, + "source": [ + "编码器(Encoder)结构包括两个子层:一个是自注意力(Self-Attention)层,另一个是前馈(Feed-Forward)神经网络。输入会先经过自注意力层,这层的作用是帮助模型关注输入序列中不同位置的信息。然后,经过前馈神经网络层,这是一个简单的全连接神经网络。两个子层都有一个残差连接(Residual Connection)和层标准化(Layer Normalization)。" + ] + }, + { + "cell_type": "markdown", + "id": "c357feb7-f752-47dc-8698-cd369d694d64", + "metadata": {}, + "source": [ + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "49692481-981f-41e5-812c-196400b69d31", + "metadata": {}, + "source": [ + "### 2.2.1 残差连接\n", + "\n", + "观察Transformer的结构不难发现——在多头注意力机制之后,我们输出的信息(通常用$z_1$表示)并没有直接传入前馈神经网络,而是经过了一个**Add & Normalize**层,这是什么操作,代表了什么含义呢?\n", + "\n", + "首先来看**Add**,这里的Add表示“加和”,是在多头注意力机制输出的信息的基础上加了一个输入数据y自身,这个数据y是从输入层传过来的。这种通过两条链路并行、一条链路进行复杂计算(在这里是多头注意力机制)、一条链路将输入数据y原封不动传到架构后方、并且最终让两条链路上的输出结果进行加和的操作,叫做残差操作。**与复杂链路并行、负责将y进行传输的链路就是残差链接**。\n", + "\n", + "在之前的课程里我们详细地讲解过残差网络,残差网络正是利用残差链接来对抗深度神经网络的“退化问题”。何凯明在2015年提出的残差网络(ResNet)https://aryiv.org/abs/1512.03385中提出了残差链接的构想,这是他当时构想的最基础的残差块的设计↓,如你所见,也是让残差链接与复杂链路并行的结构。\n", + "\n", + "![Alt text](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-16.png)" + ] + }, + { + "cell_type": "markdown", + "id": "67e6e903-9db0-45fa-8848-aa2cd16e8b07", + "metadata": {}, + "source": [ + "这种将y原封不动传到架构后方的操作可以解决梯度消失问题、可以让模型学到恒等映射(输入与输出相等)、可以让训练被简化、加速训练收敛、同时非常重要的是,还能避免网络在加深的时候出现退化问题。在之前讲解残差网络的时候,我们深读了残差网络的原始论文,详细解读了为什么残差链接让网络拟合恒等函数却能够获得很好的效果,讲解了这个反直觉的架构设计是如何逼迫网络变得越来越强。在Transformer中,残差链接可以说承担着各种方面的职责,从实验的结果来看,在各层次上加上残差链接可以让Transformer效果更好。\n", + "\n", + "在残差链接的所有效果中,我们可以从数学角度、非严格证明一下它为什么能够解决梯度消失问题。\n", + "\n", + "假设现在存在一个神经网络,**它由多个残差结构相连(就像transformer一样)**。每个残差结构被定义为F(x,W),这个结构是由一个复杂结构 + 一个残差链接并行而成的,其中$x$代表残差输入的数据,$W$代表该结构中的权重。设$x_i, x_{i+1}$分别代表残差结构F()的输入和输出,设$x_I$代表整个神经网络的输入,令relu激活函数为$r(y)=max(0,x)$,简写为$r()$。由此可得:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "x_{i+1} & = r(x_i + F(x_i, W_i)) \\\\ \\\\\n", + "x_{i+2} & =r(x_{i+1}+F(x_{i+1},W_{i+1})) \\\\ \\\\ \n", + "…… \\\\ \\\\\n", + "&\\text{如果relu激活函数是被激活状态(残差结构输出的值都大于0),则有} \\\\ \\\\\n", + "x_{i+1} & = x_i + F(x_i, W_i) \\\\ \\\\\n", + "x_{i+2} & =x_{i+1}+F(x_{i+1},W_{i+1}) \\\\ \\\\\n", + "…… \\\\ \\\\\n", + "&\\text{这是一个递归嵌套结构,如此递归推导可以得到} \\\\ \\\\\n", + "x_I & =x_i+\\sum_{n=i}^{I-1}F(x_n,W_n)\n", + "\\end{aligned}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8dfc84e1-70a2-4440-bd79-56e317376fe2", + "metadata": {}, + "source": [ + "此时如果我们对神经网络的结构求梯度,则会有——\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "\\frac{\\partial Loss}{\\partial x_{i}}&=\\frac{\\partial Loss}{\\partial x_{I}} * \\frac{\\partial x_{I}}{\\partial x_{i}} \\\\\n", + "&=\\frac{\\partial Loss}{\\partial x_{I}} * \\frac{\\partial(x_i+\\sum_{n=i}^{I-1}F(x_n,W_n))}{\\partial x_{i}} \\\\\n", + "&=\\frac{\\partial Loss}{\\partial x_{I}}*(1+\\frac{\\sum_{n=i}^{I-1}F(x_n,W_n)}{\\partial x_{i}})\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "从结果可以看出,因为有“1+”这一结构的存在,可以有效避免梯度消失(求解后梯度为0)的情况,这样网络深层处的梯度可以直接传递到网络的浅层、让迭代变得更加稳定。与此同时,残差网络在更新梯度时把一些乘法转变为了加法,同时也提高了计算效率。\n", + "\n", + "基于残差结构的这些优势,Transformer在注意力机制的外侧添加了残差链接,从而让encoder和decoder中的梯度传输都变得更加稳定。" + ] + }, + { + "cell_type": "markdown", + "id": "a2e03638-e8f5-4503-bfc2-27a01219cdd4", + "metadata": {}, + "source": [ + "### 2.2.2 Layer Normalization层归一化\n", + "\n", + "在了解了Add之后,我们来看一下**Normalize**。在Transformer结构中,Layer Normalization(层归一化)是一个至关重要的部分,它是一种特定的归一化技术,它在2016年被提出,用于减少训练深度神经网络时的内部协方差偏移(internal covariate shift)。我们在课程的Lesson13-15部分详细讲解过内部协方差偏移的关键知识,感兴趣的小伙伴可以回到可成lesson13-15去详细了解。\n", + "\n", + "与Batch Normalization(批归一化)不同,Layer Normalization不是对一个批次(batch)中的样本进行归一化,而是独立地对每个样本中的所有特征进行归一化(也就是对单一词向量、单一时间点的所有embedding维度进行归一化)。具体来说,对于每个样本,Layer Normalization会在特定层的所有激活上计算均值和方差,然后用这些统计量来归一化该样本的激活值。Transformer的Normalize使用了2016年Jimmy Lei Ba等人的的论文《Layer Normalization》https://aryiv.org/abs/1607.06450v1。" + ] + }, + { + "cell_type": "markdown", + "id": "fde3b0c2-f719-4654-b402-28b7a9d9e6e9", + "metadata": {}, + "source": [ + "- **为什么要进行Normalize呢?**\n", + "\n", + "> - **减少内部协方差偏移**:在深度学习模型训练过程中,参数的更新会影响后续层的激活分布,这可能导致训练过程不稳定。Layer Normalization通过规范化每一层的输出来减轻这种效应,有助于稳定训练过程。

\n", + "> - **加速训练速度**:归一化可以使得梯度更稳定,这通常允许更高的学习率,从而加快模型的收敛速度。

\n", + "> - **减少对初始值的依赖**:由于Layer Normalization使得模型对于输入数据的分布变化更为鲁棒,因此可以减少模型对于参数初始值的敏感性。

\n", + "> - **允许更深层网络的训练**:通过规范化每层的激活,Layer Normalization可以帮助训练更深的网络结构,而不会那么容易出现梯度消失或爆炸的问题。" + ] + }, + { + "cell_type": "markdown", + "id": "fe738142-3fc9-440a-9709-5ea5bb939b19", + "metadata": {}, + "source": [ + "- **为什么使用Layer Normalization(LN)而不使用Batch Normalization(BN)呢?**\n", + "\n", + "BN 和 LN 的差别就在$u_i$和 $\\sigma_i$这里,前者在某一个 Batch 内统计某特定神经元节点的输出分布(跨样本),后者在某一次迭代更新中统计同一层内的所有神经元节点的输出分布(同一样本下)。\n", + "![Alt text](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-29.png)\n", + "\n", + "最初BN 是为 CNN 任务提出的,需要较大的 BatchSize 来保证统计量的可靠性,并在训练阶段记录全局的$u$和 $\\sigma$供预测任务使用。而LN是独立于batch大小的,它只对单个输入样本的所有特征进行规范化。\n", + "\n", + "> * NLP任务中经常会处理长度不同的句子,使用LN时可以不考虑其它样本的长度。

\n", + "> * 在某些情况下,当可用的内存有限或者为了加速训练而使用更小的batch时,BN因为batch数量不足而受到了限制。

\n", + "> * 在某些NLP任务和解码设置中,模型可能会一个接一个地处理序列中的元素,而不是一次处理整个batch。这样BN就不是很适用了。

\n", + "> * 在Transformer模型中有很深的层次和自注意机制。通过对每一层的输入进行规范化,可以防止值的爆炸或消失,从而帮助模型更快地收敛。" + ] + }, + { + "cell_type": "markdown", + "id": "4749cc50-5e77-4418-aa13-bc8915e4cad3", + "metadata": {}, + "source": [ + "- 【加餐】各类Normalization的本质\n", + "\n", + "LN 是 Normalization(规范化)家族中的一员,由 Batch Normalization(BN)发展而来。基本上所有的规范化技术,都可以概括为如下的公式:\n", + "\n", + "$h_i = f(a_i) \\\\\n", + "{h_i}^{'}=f(\\frac{g_i}{\\sigma_i}(a_i-u_i)+b_i)$\n", + "\n", + "这个公式描述了Normalization技术中对于单个数据点$a_i$在某一层的激活值进行规范化的过程。这里是每个符号的含义:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "&a_i: \\text{原始神经网络层的激活值或输出。} \\\\ \\\\\n", + "&f: \\text{应用于规范化之后的值的激活函数。} \\\\ \\\\\n", + "&h_i: \\text{应用激活函数} f \\text{之后的激活值,是规范化步骤之前的输出。} \\\\ \\\\\n", + "&h'_i: \\text{最终的规范化输出值。} \\\\ \\\\\n", + "&\\sigma_i: \\text{用于规范化过程中的尺度调整的标准差。} \\\\ \\\\\n", + "&u_i: \\text{平均值。} \\\\ \\\\\n", + "&g_i: \\text{尺度参数。} \\\\ \\\\\n", + "&b_i: \\text{偏置参数。}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "对于隐层中某个节点的输出为对激活值$a_i$ 进行非线性变换$f()$ 后的 $h_i$\n", + "先使用均值$u_i$和方差 $\\sigma_i$对$a_i$ 进行**分布调整**。\n", + "如果以正态分布为例,就是把“高瘦”(红色)和“矮胖”(蓝紫色)的都调整回正常体型(绿色),把偏离y=0的(紫色)拉回中间来。\n", + "\n", + "![Alt text](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/transformer/image-28.png)\n", + "\n", + "* 这样可以将每一次迭代的数据调整为相同分布,消除极端值,提升训练稳定性。\n", + "* 同时“平移”操作,可以让激活值落入$f()$的梯度敏感区间即梯度更新幅度变大,模型训练加快。\n", + "\n", + "然而,在梯度敏感区内,隐层的输出接近于“线性”,模型表达能力会大幅度下降。引入 gain 因子$g_i$ 和 bias 因子 $b_i$,为规范化后的分布再加入一点“个性”。\n", + "\n", + "注: $g_i$和$b_i$作为**模型参数训练得到**,$u_i$和 $\\sigma_i$在**限定的数据范围内统计得到**。" + ] + }, + { + "cell_type": "markdown", + "id": "19a62d44-27fb-4e9e-a1a5-fd1fb49edf4e", + "metadata": {}, + "source": [ + "### 2.2.3 Feed-Forward Networks前馈网络\n", + "\n", + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "98cb8923-0d8a-4cd6-9bb2-c9f8375cd2b4", + "metadata": {}, + "source": [ + "根据Transformer的结构图可以看出,每一个多头注意力机制层都链接了一个前馈网络层。前馈网络(Feed-Forward Networks,FFNs),在神经网络的语境中,是指那些信息单向流动的网络结构。在这样的网络中,信息从输入层流向输出层,中间可能会经过多个隐藏层,但不会有任何反向的信息流,即不存在循环或者回路。因此在Transformer当中,实际上前馈神经网络就是**由线性层组成的深度神经网络结构**。它的主要职责是对输入数据进行**非线性变换,同时也负责产生输出值**。它的作用暗示了一个关键的事实——**自注意力机制大多数时候是一个线性结构**:加权求和是一个线性操作,即便我们是经过丰富的权重变化、由丰富的Q、K、V等矩阵点积的结果,还有softmax函数,但是自注意力机制依然是一个线性的过程。因此,在加入前馈神经网络之前,transformer本身不带有传统意义上的非线性结构。\n", + "\n", + "在现代深度学习架构中,特别是在Transformer模型中,前馈网络通常指的是一个特定的子层,它由两个线性变换组成,中间夹有一个激活函数,如ReLU或者GELU。具体结构可以表示为:\n", + "\n", + "1. **第一层线性变换**:

\n", + " $ z_1 = xW_1 + b_1 $\n", + " - $x$ 是输入向量。
\n", + " - $W_1$ 和 $b_1$ 是第一层的权重矩阵和偏置向量。

\n", + " \n", + "3. **ReLU激活函数**:

\n", + " $ a_1 = \\text{ReLU}(z_1) = \\max(0, z_1) $\n", + " - ReLU的作用是引入非线性,使得网络能够学习更复杂的函数映射。
\n", + " - ReLU函数将输入中的负值置为零,正值保持不变。

\n", + " \n", + "5. **第二层线性变换**:

\n", + " $ z_2 = a_1W_2 + b_2 $\n", + " - $a_1$ 是经过ReLU激活后的中间表示。
\n", + " - $W_2$ 和 $b_2$ 是第二层的权重矩阵和偏置向量。
\n", + " - 最终输出 $z_2$ 是前馈神经网络的输出。

\n", + "\n", + "合起来,前馈神经网络的完整表达式为:

\n", + "$$ FFN(x) = \\max(0, xW_1 + b_1)W_2 + b_2 $$\n", + "\n", + "Transformer模型中的前馈网络在自注意力层之后对每个位置的表示独立地应用相同的变换,这样可以进一步提高网络的表示能力。由于在前馈网络中对每个位置进行的是相同的操作,所以它们非常适合于并行计算。这种层通常被设计为宽度很大,以便在模型中捕获大量的特征并提供足够的模型容量。" + ] + }, + { + "cell_type": "markdown", + "id": "ffa475c5-a4dd-4e74-9bd0-7bfbcd686170", + "metadata": {}, + "source": [ + "以线性层作为输出层是许多深度学习架构的经典操作。Encoder在最后使用的前馈神经网络可以说是以线性层结尾,它本身有激活函数,可以产生输出,**因此Encoder编码器部分是可以单独使用的结构**。在许多情况下,我们可以单独使用 Encoder 的输出来执行各种任务,而不需要 Decoder 解码器部分,下面是一些经典的场景——\n", + "> **encoder走位特征提取器**:Encoder 的输出可以用作特征提取器,将输入序列转换为一系列有意义的特征表示。这些特征表示可以用于各种机器学习任务,如分类、聚类、序列标注等。

\n", + "> **encoder生成类似autoencoder的语义表示**:Encoder 的输出可以被用来获取输入序列的语义表示。这些语义表示可以用于进行语义相似度计算、文本匹配、信息检索等自然语言处理任务。

\n", + "> **序列到序列任务的编码器**:在一些序列到序列任务中,只需要对输入序列进行编码,而不需要生成输出序列。例如,文本摘要、问答系统中,只需将输入文本编码为一个语义表示,而无需生成摘要或答案。

\n", + "> **预训练模型的基础部分**:许多预训练模型,如BERT(Bidirectional Encoder Representations from Transformers)等,基于 Transformer Encoder 架构。在这些模型中,Encoder 的输出可以被用作下游任务的输入,从而提供丰富的语义信息。\n", + "\n", + "具体地来说,有许多任务可以仅使用 Encoder 完成。以下是一些常见的例子:\n", + "\n", + "> **情感分析**:情感分析任务旨在确定文本的情感倾向,如正面、负面或中性。在这种任务中,我们只需将输入文本编码为一个语义表示,然后通过该表示来预测文本的情感倾向,而不需要生成任何文本输出。

\n", + "> **文本分类**:文本分类任务要求将文本分配到预定义的类别中。例如,垃圾邮件过滤、新闻分类等。在这种任务中,我们可以使用 Encoder 将输入文本编码为一个语义表示,然后通过该表示来进行分类预测。

\n", + "> **命名实体识别**:命名实体识别任务要求在文本中识别和分类命名实体,如人名、地名、组织名等。在这种任务中,我们可以使用 Encoder 将输入文本编码为一个语义表示,然后通过该表示来对命名实体进行识别。

\n", + "> **关系抽取**:关系抽取任务旨在从文本中提取实体之间的关系。例如,在医学文本中,从病历中抽取药物与疾病之间的关系。在这种任务中,我们可以使用 Encoder 将输入文本编码为一个语义表示,然后通过该表示来提取实体之间的关系。

\n", + "> **文本生成的预训练**:在预训练语言模型中,我们可以使用 Encoder 将输入文本编码为一个语义表示,然后利用这个语义表示来预测下一个词或者生成文本序列。这在自然语言生成任务中非常有用,如对话生成、摘要生成等。" + ] + }, + { + "cell_type": "markdown", + "id": "5dc6bea2-aa9b-4d2c-ab43-af9b7aa8fe9c", + "metadata": {}, + "source": [ + "Encoder 在 Transformer 架构中扮演着至关重要的角色,其作用是将输入序列转换为一系列语义表示,以便后续任务的处理和预测。Encoder 的结构包括多个相同的层,每个层都由自注意力机制和前馈神经网络组成,其中自注意力机制用于捕捉输入序列中的全局依赖关系,前馈神经网络用于对每个位置的特征进行非线性变换和提取。Encoder 作为 Transformer 架构的核心组件之一,承担着将输入序列转换为语义表示的重要任务。它的结构设计体现了并行计算、信息流动、层级表示和模块化设计等关键原则,使得模型能够更好地理解和表示输入数据,并在各种文本相关任务中取得优异的性能。" + ] + }, + { + "cell_type": "markdown", + "id": "dd92da34-3e34-4a0c-ab28-5af265563e52", + "metadata": {}, + "source": [ + "## 2.3 Decoder结构解析" + ] + }, + { + "cell_type": "markdown", + "id": "2c710470-a356-4d18-8f6b-462cdbce760c", + "metadata": {}, + "source": [ + "### 2.3.1 完整Transformer与Decoder-Only结构的数据流" + ] + }, + { + "cell_type": "markdown", + "id": "1fa43624-0cc1-4504-b999-4acb38277062", + "metadata": {}, + "source": [ + "Decoder结构是Transformer中至关重要的结构,这不仅仅是因为Decoder是专门设计用来处理输出序列生成的结构,更是因为Decoder的用法非常灵活并且复杂。在之前Encoder的课程中,我们讲解了数个Encoder-Only结构的使用场景,在Transformer丰富的用法中,我们还可以选择使用按照完整的encoder+decoder结构、或者Decoder-Only架构——\n", + "\n", + "- **使用完整Transformer结构的任务**\n", + ">\n", + ">完整的Transformer结构包括编码器(encoder)和解码器(decoder)部分,通常用于需要将一个序列映射到另一个序列的任务,如:\n", + ">\n", + ">1. **机器翻译(Machine Translation):**\n", + "> - 将源语言的句子翻译成目标语言的句子。例如将英文句子翻译成中文句子。

\n", + ">\n", + ">2. **文本摘要(text Summarization):**\n", + "> - 将长文本总结为简短的摘要,例如将新闻文章总结为简短的新闻标题。

\n", + ">\n", + ">3. **图像字幕生成(Image Captioning):**\n", + "> - 为给定的图像生成描述性的文字(图生文)

\n", + ">\n", + ">4. **文本到语音(text-to-Speech, TTS):**\n", + "> - 将文本转换为语音信号,比如将输入文本转换为自然的语音输出。

\n", + ">\n", + ">5. **问答系统(Question Answering):**\n", + "> - 根据上下文回答用户的问题,或者给定一段文本,回答其中提到的具体问题。" + ] + }, + { + "cell_type": "markdown", + "id": "aec84123-36ed-472e-a6bf-f3eb62c61ea8", + "metadata": {}, + "source": [ + "- **只使用decoder结构的任务**\n", + "> \n", + "> 只使用decoder结构(通常被称为自回归模型或生成模型)适用于需要从部分输入生成完整序列的任务,如:\n", + "> \n", + "> 1. **大语言模型(Language Modeling):**\n", + "> - 任务描述:预测给定文本序列中的下一个词或字符,例如GPT系列模型用于生成连续的文本段落(当然,并不是所有的大语言模型都是decoder-only结构)。

\n", + "> \n", + "> 2. **文本生成(text Generation):**\n", + "> - 任务描述:根据部分输入生成完整的文本,比如根据开头的一句话生成一篇文章或故事,根据部分诗句生成完整的诗歌。

\n", + "> \n", + "> 3. **代码补全(Code Completion):**\n", + "> - 任务描述:根据部分输入代码生成完整的代码段。

\n", + ">\n", + "> 4. **对话生成(Dialogue Generation)**:\n", + "> - 任务描述:根据对话历史生成下一句回复。

\n", + ">\n", + "> 5. **问答系统(Question Answering):**\n", + "> - 根据上下文回答用户的问题,或者给定一段文本,回答其中提到的具体问题。\n", + "\n", + "这些任务利用Transformer的强大表示能力,通过不同的结构来适应不同的应用场景。完整的Transformer结构适合需要**从一个序列转换到另一个序列的任务**,一般我们会在需要**高度依赖原始数据信息、尤其是需要语义的转译**的时候使用这种结构,因为Encoder会有非常好的语义和数据信息解析功能,可以帮助架构更好地吸收原始数据的信息;而只使用decoder结构的模型适合**需要生成连续序列的任务**,当我们更强调基于原有的信息基础上进行“创新、创造、续写”,而对原有的数据的依赖程度不是那么高时,我们会选择decoder-only结构。" + ] + }, + { + "cell_type": "markdown", + "id": "7fce11bd-8f08-4705-be60-d5468cf77bf2", + "metadata": {}, + "source": [ + "当然了,一个任务对于原始信息的依赖程度是否高,这是可以讨论、甚至因人而异的判断。像机器翻译任务,最好能够原封不动将原始数据的语义表达出来,就会显然更适合完整的Transformer结构,但代码补全这样的、文本生成这样更强调续写的任务,就会更偏向于decoder-only,然而对于像大语言模型、对话系统这样无法明确判断出“多大程度依赖于原始输入信息的”任务,就会依据算法创造者的不同选择有不同的状态。例如大语言模型,GPT、llama等等大模型就是decoder-only结构,BERT模型是encoder-only结构、T5(text-to-text Transfer Transformer)和BART(Bidirectional and Auto-Regressive Transformers)模型则是使用了完整的Transformer结构。" + ] + }, + { + "cell_type": "markdown", + "id": "08e5d5a5-0dcd-4ec3-8117-776380950221", + "metadata": {}, + "source": [ + "为什么在Decoder篇章一开始,我们就要讲解不同的任务呢?与Encoder不同的是,Decoder结构在不同的任务中承担不同的角色、存在不同的网络架构、不同的训练模式以及不同的数据流,因此我们需要理解不同的任务、才能知道Decoder结构究竟是什么样的。接下来,就让我来看看Transformer完整结构与Decoder-only结构下的具体情况。" + ] + }, + { + "cell_type": "markdown", + "id": "37618e41-7a94-4ca3-a17a-e4664299de93", + "metadata": {}, + "source": [ + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "44cd7f20-67e3-4faf-a45b-62c1bda7f210", + "metadata": {}, + "source": [ + "### 2.3.2 Encoder-Decoder结构中的Decoder" + ] + }, + { + "cell_type": "markdown", + "id": "4a566223-dafb-4089-95b5-9989b9c24223", + "metadata": {}, + "source": [ + "上图所示的就是Transformer完整结构下的Decoder block的结构。之前在讲解Trans整体架构时我们就提到过,Decoder其实与Encoder非常类似,从图上来看,整个Decoder的结构包括如下核心内容:\n", + "\n", + "1. **输入与teacher forcing机制**

\n", + "Decoder的输入是**滞后1个单位的标签矩阵**(shifted right outputs),我们要将真实标签输入给模型,并且让真实标签指导模型的学习与预测,这种让模型通过正确的标签来学习的流程在Transformer中被称之为是teacher forcing强制教学机制。\n", + "\n", + "2. **Embedding与位置编码**

\n", + "标签矩阵首先通过嵌入层(embedding)转换成固定大小的向量。就像 Encoder 一样,Decoder 也会对这些嵌入向量添加位置编码,以包含序列中的位置信息。但这里需要注意的是,输入到Decoder层中的sequence_length维度可以与输入到Encoder中的sequence_length维度不一致。\n", + "> Encoder与Decoder架构中的Seq_len可以不一致,这其实非常好理解。假设是英文翻译成中文的机器翻译任务,为了表达相同的语义,英文句子长度与中文句子长度都应该不受限制,尽量精准地表达;不同语言、不用序列之间的规律本来就各不相同,有的语言比较高效、有的语言则追求尽量详尽,因此要求Encoder和Decoder的输入的数据长度相同是强人所难。" + ] + }, + { + "cell_type": "markdown", + "id": "8e319bc2-b5e8-467d-a586-fc656e7e2951", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
x1x2x3x4x5
0.18210.40000.22480.44400.7771
0.17210.50300.89480.23850.0987
最好的0.13420.82970.29780.71200.2565
时代0.12480.50030.75590.48040.2593
0.10320.14770.70230.72240.2768
0.17210.50300.89480.23850.0987
最坏的0.42630.46150.51690.75840.8388
时代0.12480.50030.75590.48040.2593
\n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
y1y2y3y4y5
It0.56210.89200.73120.25430.1289
was0.23140.67940.98230.84520.3417
the0.49320.20450.75310.65820.9731
best0.83420.29870.76420.21540.9812
of0.34170.57920.48210.67210.1234
times0.25310.73450.98120.54870.2378
it0.65230.12980.45760.98340.1876
was0.23140.67940.98230.84520.3417
the0.49320.20450.75310.65820.9731
worst0.15430.92710.38210.67450.4823
of0.34170.57920.48210.67210.1234
times0.25310.73450.98120.54870.2378
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b83c63be-bf40-4faa-88b0-9c3aff0a76f5", + "metadata": {}, + "source": [ + "> 不过这里就会引发无穷的问题,比如结构不相同的矩阵如何在同一个注意力机制中运行?最终输出的矩阵结构是什么?Decoder后续的结构会帮助我们解决这些问题。" + ] + }, + { + "cell_type": "markdown", + "id": "2511dfb9-4380-486a-b005-f7a81255672d", + "metadata": {}, + "source": [ + "3. **带掩码的自注意力层**(Masked Self-Attention)

\n", + "Decoder 的自注意力层在功能上与 Encoder 的自注意力层类似,它允许 Decoder 关注到之前所有生成的词。然而,为了防止在生成当前词时使用未来的信息(即避免信息泄露),使用了所谓的“掩码”技术(Masking)。这种技术通过将未来位置的值设置为负无穷大(在 softmax 操作前),使得这些位置的影响力为零。\n", + "\n", + "4. **编码器-解码器注意力层**(Encoder-Decoder Attention)

\n", + "这一层是 Decoder 特有的注意力层,它就是位于图像上、Decoder结构中间的那个注意力机制层。它允许 Decoder 的每个位置关注 Encoder 的全部输出。具体来说,这一层的查询(Q)来自前一层 Decoder 的输出,而键(K)和值(V)则来自 Encoder 的输出。通过这种方式,Decoder 能够利用输入序列中的相关信息来帮助生成正确的输出序列。\n", + "\n", + "5. **前馈神经网络网络、层归一化和残差链接**

\n", + "与 Encoder 中的前馈网络、层归一化以及残差链接相同,每个 Decoder 层包含一个前馈网络,该网络对每个位置应用相同的全连接层。这个网络通常包含两个线性变换,并在中间加入了一个激活函数,如 ReLU 或 GELU。\n", + "\n", + "**在这些结构当中,我们较为陌生的三个结构是“Teacher Forcing”、“带掩码的自注意力层”以及“编码器-解码器注意力层”**,我们先来了解一下数据滞后操作以及teacher forcing制度。" + ] + }, + { + "cell_type": "markdown", + "id": "06a325e9-1aa9-44c5-9be2-59b79ff40835", + "metadata": {}, + "source": [ + "#### 2.3.2.1 输入与teacher forcing" + ] + }, + { + "cell_type": "markdown", + "id": "ec1fe673-ba73-43da-b1ce-5ad9a67fdbcc", + "metadata": {}, + "source": [ + "Decoder的输入是**滞后1个单位的标签矩阵**(shifted right outputs),我们要将真实标签输入给模型,并且让真实标签指导模型的学习与预测,这种让模型通过正确的标签来学习的流程在Transformer中被称之为是teacher forcing强制教学机制。接下来让我们展开仔细讲讲。\n", + "\n", + "> **shift right操作**\n", + "\n", + "首先,在序列到序列任务中,我们会将标签矩阵进行滞后操作(shift)。" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3cd5cf47-975e-4fc2-81ab-8fad1d4c2a8b", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# 创建DataFrame\n", + "df = pd.DataFrame({\n", + " \"值\": [0.1543, 0.2731, 0.3627, 0.4812, 0.5238]\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b647d7bd-8278-4a30-bd4b-ad1ec60d181f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
00.1543
10.2731
20.3627
30.4812
40.5238
\n", + "
" + ], + "text/plain": [ + " 值\n", + "0 0.1543\n", + "1 0.2731\n", + "2 0.3627\n", + "3 0.4812\n", + "4 0.5238" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "markdown", + "id": "7b2b83b2-0171-48d4-9015-72ddca45fcf2", + "metadata": {}, + "source": [ + "对序列来说滞后是一种常见的操作👇是指将原有的序列向未来、向正向顺序的方向挪动位置,留出空值的行为:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a43c609e-abbf-4fde-add8-4e5c982a4804", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0NaN
10.1543
20.2731
30.3627
40.4812
\n", + "
" + ], + "text/plain": [ + " 值\n", + "0 NaN\n", + "1 0.1543\n", + "2 0.2731\n", + "3 0.3627\n", + "4 0.4812" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shift(1) #挪动一个位置,被叫做滞后1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "26e6959a-ce1c-4be9-96fb-feb33330efd4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0NaN
1NaN
20.1543
30.2731
40.3627
\n", + "
" + ], + "text/plain": [ + " 值\n", + "0 NaN\n", + "1 NaN\n", + "2 0.1543\n", + "3 0.2731\n", + "4 0.3627" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shift(2) #也可以挪动多个位置" + ] + }, + { + "cell_type": "markdown", + "id": "e045924f-ce18-4320-b5d9-6a129e588ce2", + "metadata": {}, + "source": [ + "当表现为编码前的序列时,就是从[y1, y2, y3, y4]变成[NaN, y1, y2, y3, y4],因此这个过程也被叫做“向右滞后”(shift right),其实代表的是在序列的最前方腾挪出位置,将已有的序列向后挤。在Transformer当中,我们一般会为解码器的输入标签添加起始标记\"SOS\"(start of sequence),并将这个起始标记作为标签序列的第一行,最终构成[\"sos\", y1, y2, y3, y4]这样的序列。当进行embedding编码后,会呈现为👇" + ] + }, + { + "cell_type": "markdown", + "id": "507f201f-c78e-4ed3-b0de-d3dba51106b6", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1It0.56210.89200.73120.25430.1289
2was0.23140.67940.98230.84520.3417
3the0.49320.20450.75310.65820.9731
4best0.83420.29870.76420.21540.9812
5of0.34170.57920.48210.67210.1234
6times0.25310.73450.98120.54870.2378
7it0.65230.12980.45760.98340.1876
8was0.23140.67940.98230.84520.3417
9the0.49320.20450.75310.65820.9731
10worst0.15430.92710.38210.67450.4823
11of0.34170.57920.48210.67210.1234
12times0.25310.73450.98120.54870.2378
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "09128284-e32f-4c51-831e-2d342d122423", + "metadata": {}, + "source": [ + "起始标记(Start of Sequence,SOS)和结束标记(End of Sequence,EOS)在序列到序列(Seq2Seq)任务中起着重要的作用,特别是在自然语言处理(NLP)和机器翻译等任务中。\n", + "\n", + "- 起始标记(SOS)的意义\n", + "> 1. **标识序列的开始**:SOS标记用于指示解码器开始生成序列。这在训练和推理过程中都非常重要。

\n", + "> 2. **初始化解码器**:在解码阶段,解码器需要一个初始输入来开始生成输出序列。SOS标记作为解码器的第一个输入,帮助其启动生成过程。

\n", + "> 3. **模型一致性**:通过在每个输出序列的开头添加SOS标记,模型在训练时可以学到序列生成的起点,从而在推理时保持一致的生成过程。\n", + "\n", + "- 结束标记(EOS)的意义\n", + "> 1. **标识序列的结束**:EOS标记用于指示生成的序列在何处结束。这对于模型在推理阶段停止生成非常重要。

\n", + "> 2. **控制生成长度**:在没有固定长度的输出序列中,EOS标记告诉模型何时停止生成,而不需要生成固定数量的时间步。这使得模型可以处理变长序列。

\n", + "> 3. **训练终止条件**:在训练过程中,模型学会在适当的时候生成EOS标记,从而正确地结束序列。\n", + "\n", + "假设我们有一个输入序列和一个目标序列:\n", + "\n", + "- 输入序列:`y = [\"这\", \"是\", \"最\", \"好\", \"的\", \"时\", \"代\"]`\n", + "- 目标序列:`y = [\"it\", \"was\", \"the\", \"best\", \"of\", \"times\"]`\n", + "\n", + "在Seq2Seq任务的训练过程中,由于Decoder结构会需要输入标签,因此我们必须要准备三种不同的数据,并进行如下的处理:\n", + "\n", + "1. **编码器输入**:`y`不需要添加起始标记和结束标记。\n", + "2. **解码器输入的标签**:在目标序列前添加起始标记(SOS)。\n", + "3. **解码器用来计算损失函数的标签**:在目标序列末尾添加结束标记(EOS)。\n", + "\n", + "处理后的序列就是:\n", + "\n", + "- **编码器输入**:`[\"这\", \"是\", \"最\", \"好\", \"的\", \"时\", \"代\"]`\n", + "- **解码器输入的标签**:`[\"SOS\", \"it\", \"was\", \"the\", \"best\", \"of\", \"times\"]`\n", + "- **解码器用来计算损失函数的标签**:`[\"it\", \"was\", \"the\", \"best\", \"of\", \"times\", \"EOS\"]`\n", + "\n", + "以下是一个简化的示例代码,展示如何使用PyTorch为序列添加起始标记和结束标记,并进行词嵌入:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "401f15ca-4b9e-4654-ad37-d86b3e8df629", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Decoder Input (with SOS): tensor([0, 2, 3, 4, 5, 6])\n", + "Decoder Output (with EOS): tensor([2, 3, 4, 5, 6, 1])\n", + "Embedded Decoder Input: tensor([[ 0.6930, 0.0392, 0.6529, 1.3837],\n", + " [ 0.1320, -1.5171, -0.2337, -1.1682],\n", + " [ 0.2960, -1.3404, 0.1997, 0.8595],\n", + " [-0.0201, -0.0039, 1.2342, -1.2684],\n", + " [ 0.4403, 0.9309, -0.3682, 0.6179],\n", + " [-0.4487, -0.2147, -0.5202, 1.3910]], grad_fn=)\n", + "Embedded Decoder Output: tensor([[ 0.1320, -1.5171, -0.2337, -1.1682],\n", + " [ 0.2960, -1.3404, 0.1997, 0.8595],\n", + " [-0.0201, -0.0039, 1.2342, -1.2684],\n", + " [ 0.4403, 0.9309, -0.3682, 0.6179],\n", + " [-0.4487, -0.2147, -0.5202, 1.3910],\n", + " [-0.0288, 2.0398, -0.3713, 1.0762]], grad_fn=)\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "\n", + "# 假设词汇表大小(包括特殊标记如SOS和EOS)\n", + "vocab_size = 10\n", + "embedding_dim = 4\n", + "\n", + "# 创建嵌入层\n", + "embedding_layer = nn.Embedding(vocab_size, embedding_dim)\n", + "\n", + "# 假设索引0是SOS,索引1是EOS\n", + "SOS_token = 0\n", + "EOS_token = 1\n", + "\n", + "# 目标序列的索引表示\n", + "target_sequence = [2, 3, 4, 5, 6] # 假设 \"it\", \"was\", \"the\", \"best\", \"of\"\n", + "\n", + "# 添加起始标记和结束标记\n", + "decoder_input = [SOS_token] + target_sequence\n", + "decoder_output = target_sequence + [EOS_token]\n", + "\n", + "# 转换为张量\n", + "decoder_input_tensor = torch.tensor(decoder_input)\n", + "decoder_output_tensor = torch.tensor(decoder_output)\n", + "\n", + "# 嵌入\n", + "embedded_decoder_input = embedding_layer(decoder_input_tensor)\n", + "embedded_decoder_output = embedding_layer(decoder_output_tensor)\n", + "\n", + "print(\"Decoder Input (with SOS):\", decoder_input_tensor)\n", + "print(\"Decoder Output (with EOS):\", decoder_output_tensor)\n", + "print(\"Embedded Decoder Input:\", embedded_decoder_input)\n", + "print(\"Embedded Decoder Output:\", embedded_decoder_output)" + ] + }, + { + "cell_type": "markdown", + "id": "5401cb15-6138-4646-adeb-5c95a77edfab", + "metadata": {}, + "source": [ + "> **teacher force**" + ] + }, + { + "cell_type": "markdown", + "id": "acbd0c53-2e54-4cde-8c62-f9f599d2eddd", + "metadata": {}, + "source": [ + "如果你非常熟悉序列模型的预测(比如时间序列的预测),那你应该早就见过很多使用真实标签+特征一起来指导模型学习的操作;例如,时间序列中存在“带标签的滑窗”技术。“带标签的滑窗”是一种特征矩阵构建方法,**它会将可以使用的那部分标签作为其中一个特征,和其他特征concat在一起构建特征矩阵**。使用带标签的滑窗后,特征信息与标签信息会一起被输入给模型,模型将会结合特征和可使用的标签两部分信息来共同决策。\n", + "\n", + "![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/LSTM/Case/05.png)\n", + "\n", + "在Transformer中,这种对标签的使用从时间序列数据扩大到了任意序列数据(对时间数据而言,可使用的标签就是当前预测时间点之前所有的时间点,对其他序列数据而言,例如文字数据,可使用的标签就是当前预测的文字位置之前的所有文字),并且将这种技巧从时间序列预测拓展到了序列到序列任务(seq2seq)。\n", + "\n", + "然而需要注意的是,时间序列任务是一种使用过去的信息来预测未来的任务,通常是利用一个序列的前半段数据来预测同一序列的后半段数据。**这意味着时间序列预测更多地依赖于生成式模型,旨在根据已有数据生成未来的数据点**。而Seq2Seq任务(序列到序列任务)并不总是遵循这种模式。例如,在机器翻译任务中,模型的目标是将一个语言的句子转换成另一种语言的句子,这并不是通过预测同一序列的未来部分来实现的。因此,时间序列预测更接近于生成式任务,而不是典型的序列到序列任务。" + ] + }, + { + "cell_type": "markdown", + "id": "7f4cc298-f61e-4659-9fad-d362d57651ec", + "metadata": {}, + "source": [ + "- **时间序列任务/生成式任务**:同一张表、过去预测未来\n", + "\n", + "| 时间点 | 值 |\n", + "|--------|----------|\n", + "| 1 | 0.1543 |\n", + "| 2 | 0.2731 |\n", + "| 3 | 0.3627 |\n", + "| 4 | 0.4812 |\n", + "| 5 | 0.5238 |" + ] + }, + { + "cell_type": "markdown", + "id": "a99d7333-0e93-46c9-924a-60c9020db6d7", + "metadata": {}, + "source": [ + "- **Encoder-decoder下的seq2seq任务**:两个序列大概率不是一张表,是用一张表去预测另一张表" + ] + }, + { + "cell_type": "markdown", + "id": "e8779e34-45c3-4e00-bbb5-cfc49d37e8d6", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1It0.56210.89200.73120.25430.1289
2was0.23140.67940.98230.84520.3417
3the0.49320.20450.75310.65820.9731
4best0.83420.29870.76420.21540.9812
5of0.34170.57920.48210.67210.1234
6times0.25310.73450.98120.54870.2378
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "501e54ea-98a9-4b6a-bdf3-4a4aad8c5d36", + "metadata": {}, + "source": [ + "因此在teacher force所强调的使用标签是**需要将特征矩阵和标签矩阵的信息融合后**再进行训练。以上面两张表单为例,设——\n", + "> 原始序列y = [\"这\",\"是\",\"最\",\"好\",\"的\",\"时\",\"代\"]

\n", + "> 真实标签y = [\"it\", \"was\", \"the\", \"best\", \"of\", \"times\"]

\n", + "> 编码器输出的预测结果为yhat,添加过初始词/结束词、经过embedding的矩阵为ebd_X和ebd_y\n", + "\n", + "那我们实际走的**训练流程**是:\n", + "\n", + "> - **第一步,输入ebd_X & ebd_y[0] >> 输出yhat[0],对应真实标签y[0]**" + ] + }, + { + "cell_type": "markdown", + "id": "8f388f17-a701-43f8-9cdb-d530c8f15fb7", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1It0.56210.89200.73120.25430.1289
2was0.23140.67940.98230.84520.3417
3the0.49320.20450.75310.65820.9731
4best0.83420.29870.76420.21540.9812
5of0.34170.57920.48210.67210.1234
6times0.25310.73450.98120.54870.2378
\n", + "
\n", + "

对应

\n", + " ➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "522677d2-9c70-4685-ac3a-4a9ef13bdd9a", + "metadata": {}, + "source": [ + "> - **第二步,输入ebd_X & ebd_y[:1] >> 输出yhat[1],对应真实标签y[1]**" + ] + }, + { + "cell_type": "markdown", + "id": "545c40ee-1c02-4832-832f-62266ea32802", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1It0.56210.89200.73120.25430.1289
2was0.23140.67940.98230.84520.3417
3the0.49320.20450.75310.65820.9731
4best0.83420.29870.76420.21540.9812
5of0.34170.57920.48210.67210.1234
6times0.25310.73450.98120.54870.2378
\n", + "
\n", + "

对应

\n", + " ➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "206e2daf-d007-46af-8d09-d6cbe96a3d57", + "metadata": {}, + "source": [ + "> - **第三步,输入ebd_X & ebd_y[:2] >> 输出yhat[2],对应真实标签y[2]**" + ] + }, + { + "cell_type": "markdown", + "id": "c366bc4b-95c1-450e-99c3-f9462641f898", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1It0.56210.89200.73120.25430.1289
2was0.23140.67940.98230.84520.3417
3the0.49320.20450.75310.65820.9731
4best0.83420.29870.76420.21540.9812
5of0.34170.57920.48210.67210.1234
6times0.25310.73450.98120.54870.2378
\n", + "
\n", + "

对应

\n", + " ➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9f2162a6-2a87-4c61-b5a2-d5fdf08e16ba", + "metadata": {}, + "source": [ + "……以此类推下去。不难发现,在这个流程中我们实现了【利用序列A + 序列B的前半段预测序列B的后半段】,这样的方式既没有泄露真实的标签,又能够为预测下一个词提供最大程度的准确的信息,这就是teacher forcing的本质。**在训练过程中,这个流程通过掩码自注意力机制+编码器-解码器注意力层合作的方式实现了并行**,所以Seq2Seq任务在训练时实际上并不是按照时间步顺序来运行,反而呈现为一次性输入特征矩阵+标签矩阵后,一次性获得整个预测的序列。\n", + "\n", + "然而在测试和推理过程中可就不一样。**在测试和推理的过程中,我们并没有真实的标签矩阵,因此需要将上一个时间步预测的结果作为Decoder需要的输入**。具体来看,在**测试流程**中:" + ] + }, + { + "cell_type": "markdown", + "id": "81e83662-e129-426e-9a8f-cedd78e00e7b", + "metadata": {}, + "source": [ + "- **第一步,输入 ebd_X & sos >> 输出时间步1的预测标签,对应真实标签y[0]**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + " ➕\n", + " \n", + "

输入Decoder:sos编码序列

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0a4a15a7-543c-4ff5-aaeb-8cf5476363d6", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
1yyy0.56210.89200.73120.25430.1289
\n", + "

对应

➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "d91564d9-3d48-4857-99ad-90f1edc7d2af", + "metadata": {}, + "source": [ + "> - **第二步,输入ebd_X & yhat[:1] >> 输出时间步2的标签,对应真实标签y[1]**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + " ➕\n", + " \n", + "

输入Decoder:yhat预测标签
(加入上一个时间步的预测结果)

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1yyy0.56210.89200.73120.25430.1289
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4f5804cc-87d0-4246-b9c2-836c1a04e15e", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
2yyy0.30740.87740.03640.06490.4704
\n", + "

对应

➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0530701a-b7b3-4d12-8ccf-f8980299ea2d", + "metadata": {}, + "source": [ + "> - **第三步,输入ebd_X & yhat[:2] >> 输出索引为3的标签,对应真实标签y[1]**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + " ➕\n", + " \n", + "

输入Decoder:yhat预测标签
(加入上一个时间步的预测结果)

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1yyy0.56210.89200.73120.25430.1289
2yyy0.30740.87740.03640.06490.4704
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "443b583c-6e6d-456b-9c88-e96f7d34e8d6", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
3yyy0.27530.29210.45990.64490.1852
\n", + "

对应

➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "4eeb6672-907a-4a8a-9091-489e78a0076a", + "metadata": {}, + "source": [ + "很显然,这是一个自回归的流程。在实际代码实现时,这个过程是线性的、必须按照一个字、一个字的方式来预测,但Transformer本身并不提供像RNN和LSTM那样逐步处理样本的结构,因此推理流程中,我们需要写循环代码来完成推理的过程。每一步生成一个新词,并将其作为输入添加到序列中,直到生成结束标记 \"EOS\" 或达到最大长度为止。这个流程会极大地限制生成类算法的预测速度,因此现在也有越来越多的技术来帮助我们改进这个环节,但是使用最多的依然是最经典的自回归策略。" + ] + }, + { + "cell_type": "markdown", + "id": "a9217f36-90e3-4272-a78e-63f5a8c293fd", + "metadata": {}, + "source": [ + "现在你已经知道在seq2seq任务中Transformer处理训练数据的流程了——\n", + "\n", + "> 原始序列y = [\"这\",\"是\",\"最\",\"好\",\"的\",\"时\",\"代\"]

\n", + "> 真实标签y = [\"it\", \"was\", \"the\", \"best\", \"of\", \"times\"]

\n", + "> 编码器输出的预测结果为yhat,添加过初始词/结束词、经过embedding的矩阵为ebd_y和ebd_y\n", + "\n", + "那我们实际走的**训练流程**是:\n", + "\n", + "> - **第一步,输入ebd_X & ebd_y[0] >> 输出yhat[0],对应真实标签y[0]**

\n", + "> - **第二步,输入ebd_X & ebd_y[:1] >> 输出yhat[1],对应真实标签y[1]**

\n", + "> - **第三步,输入ebd_X & ebd_y[:2] >> 输出yhat[2],对应真实标签y[2]**

\n", + "> 以此类推……\n", + "\n", + "在讲解这个过程时我们曾经提到,**在训练过程中,这个流程通过掩码自注意力机制+编码器-解码器注意力层合作的方式实现了并行**,所以Seq2Seq任务在训练时实际上并不是按照时间步顺序来运行,反而呈现为一次性输入特征矩阵+标签矩阵后,一次性获得整个预测的序列。\n", + "\n", + "实际流程中是并行,就意味着我们需要将完整的yhat输入给Transformer,在这里就会存在两个问题:\n", + "\n", + "1. 并行是如何实现的?\n", + "2. 将完整的yhat输入给Transformer,是如何避免标签泄漏的?\n", + "\n", + "整个Decoder结构中、掩码注意力机制、编码器解码器注意力层共同解决了这两个问题。接下来让我们一起来看看带掩码的注意力机制。" + ] + }, + { + "cell_type": "markdown", + "id": "6a065205-31a5-4091-a21d-5ccee92bb646", + "metadata": {}, + "source": [ + "#### 2.3.2.2 掩码注意力机制" + ] + }, + { + "cell_type": "markdown", + "id": "0fc1dbd4-96d6-4bd4-b2e6-3b59db7365d1", + "metadata": {}, + "source": [ + "在Transformer的Decoder中,掩码自注意力(Masked Self-Attention)确保在生成当前时间步的输出时,模型不能查看未来的输入。这是通过在注意力机制计算过程中应用一个掩码实现的,该掩码有效地将未来位置的注意力得分设置为非常低的值(通常是负无穷),这样模型就无法在预测当前词时利用未来的信息。这种方法确保了生成的输出是自回归的,即每个输出仅依赖于之前的输出,而不是未来的输入。" + ] + }, + { + "cell_type": "markdown", + "id": "76a70df6-fb90-4d23-873c-7149d6f2120d", + "metadata": {}, + "source": [ + "掩码自注意力机制是**通过修改基本的注意力机制公式**来实现的,基本的注意力公式如下:\n", + "\n", + "$$Attention(Q,K,V) = softmax(\\frac{QK^{T}}{\\sqrt{d_k}})V$$\n", + "\n", + "在这个公式的基础上引入掩码功能,则涉及到下面三个改变:\n", + "\n", + "1. 在计算 $QK^T$ 的点积后,但在应用softmax函数之前,**掩码自注意力机制通过使用一个掩码矩阵来修改这个点积结果**。这个掩码矩阵有特定的结构:对于不应该被当前位置注意的所有位置(即未来的位置),掩码会赋予一个非常大的负值(如负无穷)。\n", + "\n", + "2. 应用softmax函数:**当softmax函数应用于经过掩码处理的点积矩阵时,那些被掩码覆盖的位置(即未来的位置)的权重实际上会接近于零**。这是因为 e 的非常大的负数次幂几乎为零。\n", + "\n", + "3. 结果的动态调整:这样处理后,每个位置的输出在计算时只会考虑到它前面的位置或当前位置的信息,确保了生成的每一步都不会“看到”未来的数据。" + ] + }, + { + "cell_type": "markdown", + "id": "fdb4c775-b1a7-4c0a-8f30-b4963c562b7f", + "metadata": {}, + "source": [ + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "b556be60-89fc-4e55-a22d-e0f3fd0517c3", + "metadata": {}, + "source": [ + "我们可以来看具体的矩阵——\n", + "\n", + "- **没有掩码时的$QK^T$点积**(此时的Q、K都是从输出矩阵中生成的)

\n", + "$$\n", + "QK^T = \\begin{bmatrix}\n", + " q_1 \\cdot k_1^T & q_1 \\cdot k_2^T & \\cdots & q_1 \\cdot k_n^T \\\\\n", + " q_2 \\cdot k_1^T & q_2 \\cdot k_2^T & \\cdots & q_2 \\cdot k_n^T \\\\\n", + " \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", + " q_n \\cdot k_1^T & q_n \\cdot k_2^T & \\cdots & q_n \\cdot k_n^T\n", + " \\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4d5aa2ef-6533-4fec-8b8f-b1b8462c8033", + "metadata": {}, + "source": [ + "- **没有掩码时softmax函数结果**

\n", + "$$\n", + "softmax(QK^T) = \\begin{bmatrix}\n", + " \\frac{e^{q_1 \\cdot k_1^T}}{\\sum_{j=1}^n e^{q_1 \\cdot k_j^T}} & \\frac{e^{q_1 \\cdot k_2^T}}{\\sum_{j=1}^n e^{q_1 \\cdot k_j^T}} & \\cdots & \\frac{e^{q_1 \\cdot k_n^T}}{\\sum_{j=1}^n e^{q_1 \\cdot k_j^T}} \\\\\n", + " \\frac{e^{q_2 \\cdot k_1^T}}{\\sum_{j=1}^n e^{q_2 \\cdot k_j^T}} & \\frac{e^{q_2 \\cdot k_2^T}}{\\sum_{j=1}^n e^{q_2 \\cdot k_j^T}} & \\cdots & \\frac{e^{q_2 \\cdot k_n^T}}{\\sum_{j=1}^n e^{q_2 \\cdot k_j^T}} \\\\\n", + " \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", + " \\frac{e^{q_n \\cdot k_1^T}}{\\sum_{j=1}^n e^{q_n \\cdot k_j^T}} & \\frac{e^{q_n \\cdot k_2^T}}{\\sum_{j=1}^n e^{q_n \\cdot k_j^T}} & \\cdots & \\frac{e^{q_n \\cdot k_n^T}}{\\sum_{j=1}^n e^{q_n \\cdot k_j^T}}\n", + " \\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "adcac501-c476-4a9d-b13a-f1d3d7942615", + "metadata": {}, + "source": [ + "- **有掩码时,我们使用的掩码矩阵**

\n", + "$$\n", + "M = \\begin{bmatrix}\n", + " 0 & -\\infty & -\\infty & \\cdots & -\\infty \\\\\n", + " 0 & 0 & -\\infty & \\cdots & -\\infty \\\\\n", + " 0 & 0 & 0 & \\cdots & -\\infty \\\\\n", + " \\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", + " 0 & 0 & 0 & \\cdots & 0\n", + " \\end{bmatrix}\n", + " $$\n", + "\n", + "正如你所观察到的,这是一个上半部分全部是无穷大、下半部分全部是0的矩阵。**在进行掩码时,我们用掩码矩阵与原始$QK^T$点积进行加和**,然后再将加和结果放入softmax函数。" + ] + }, + { + "cell_type": "markdown", + "id": "c5ed5f6b-d401-421b-b3b3-9eb52afb0b28", + "metadata": {}, + "source": [ + "- **有掩码时,掩码矩阵对原始$QK^T$矩阵的影响**\n", + "\n", + "$$\n", + "QK^T + M = \\begin{bmatrix}\n", + " q_1 \\cdot k_1^T + 0 & q_1 \\cdot k_2^T - \\infty & \\cdots & q_1 \\cdot k_n^T - \\infty \\\\\n", + " q_2 \\cdot k_1^T + 0 & q_2 \\cdot k_2^T + 0 & \\cdots & q_2 \\cdot k_n^T - \\infty \\\\\n", + " \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", + " q_n \\cdot k_1^T + 0 & q_n \\cdot k_2^T + 0 & \\cdots & q_n \\cdot k_n^T + 0 \\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "887df9e2-98ae-4884-b6ec-e533f79dda21", + "metadata": {}, + "source": [ + "$$= \\begin{bmatrix}\n", + " q_1 \\cdot k_1^T & -\\infty & -\\infty & \\cdots & -\\infty \\\\\n", + " q_2 \\cdot k_1^T & q_2 \\cdot k_2^T & -\\infty & \\cdots & -\\infty \\\\\n", + " \\vdots & \\vdots & \\ddots & \\vdots & -\\infty \\\\\n", + " q_n \\cdot k_1^T & q_n \\cdot k_2^T & \\cdots & q_n \\cdot k_{n-1}^T & q_n \\cdot k_n^T\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "590ddd89-b7d9-4ecc-b462-a0c095732bf4", + "metadata": {}, + "source": [ + "经过掩码处理过的$QK^T$矩阵的右上角全部呈现为负无穷,左下角呈现为具体的值,在这种情况下应用softmax函数后,会得到:" + ] + }, + { + "cell_type": "markdown", + "id": "6e7a1d2d-785c-40db-b365-72ef595a3988", + "metadata": {}, + "source": [ + "- **有掩码时,softmax函数应用后的影响**\n", + "\n", + "$$\n", + "\\text{softmax}(QK^T + M) = \\begin{bmatrix}\n", + " \\frac{e^{q_1 \\cdot k_1^T}}{e^{q_1 \\cdot k_1^T}} & 0 & 0 & 0 \\\\\n", + " \\frac{e^{q_2 \\cdot k_1^T}}{e^{q_2 \\cdot k_1^T} + e^{q_2 \\cdot k_2^T}} & \\frac{e^{q_2 \\cdot k_2^T}}{e^{q_2 \\cdot k_1^T} + e^{q_2 \\cdot k_2^T}} & 0 & 0 \\\\\n", + " \\frac{e^{q_3 \\cdot k_1^T}}{e^{q_3 \\cdot k_1^T} + e^{q_3 \\cdot k_2^T} + e^{q_3 \\cdot k_3^T}} & \\frac{e^{q_3 \\cdot k_2^T}}{e^{q_3 \\cdot k_1^T} + e^{q_3 \\cdot k_2^T} + e^{q_3 \\cdot k_3^T}} & \\frac{e^{q_3 \\cdot k_3^T}}{e^{q_3 \\cdot k_1^T} + e^{q_3 \\cdot k_2^T} + e^{q_3 \\cdot k_3^T}} & 0 \\\\\n", + " \\frac{e^{q_4 \\cdot k_1^T}}{\\sum_{j=1}^{4} e^{q_4 \\cdot k_j^T}} & \\frac{e^{q_4 \\cdot k_2^T}}{\\sum_{j=1}^{4} e^{q_4 \\cdot k_j^T}} & \\frac{e^{q_4 \\cdot k_3^T}}{\\sum_{j=1}^{4} e^{q_4 \\cdot k_j^T}} & \\frac{e^{q_4 \\cdot k_4^T}}{\\sum_{j=1}^{4} e^{q_4 \\cdot k_j^T}}\n", + " \\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8c3e6a2e-eaa1-4d17-b652-a2006bc47e8f", + "metadata": {}, + "source": [ + "从softmax函数的具体公式来看,当输入值$z$高度接近负无穷时,以e为底的对数函数的取值会无穷地趋近于0,因此才会得到一个上半个三角全为0的矩阵。通过这种方式,可以让原始矩阵中的一部分信息被“掩盖”(变为0),这个操作就是掩码的本质。\n", + "\n", + "$$\\sigma(z)_i = \\frac{e^{z_i}}{\\sum_{j=1}^{K} e^{z_j}}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "5483bdbe-62a3-49ab-a3ea-1542dec43ac8", + "metadata": {}, + "source": [ + "在Transformer模型中,特别是在解码器的掩码自注意力机制中,矩阵$QK^T + M$是一切的关键。这里,掩码矩阵M的作用是确保在生成序列的每个步骤中,模型只能访问到当前和之前的信息,不能“看到”未来的信息。\n", + "\n", + "![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/Live/NLP%26LLMs/2-3.png)\n", + "\n", + "**为什么QK.T矩阵的右上角代表模型在观察未来的信息呢**?回到最初的QK相乘的图像上,假设现在Q是4行3列、K.T是3行4列,不难发现QK.T矩阵的16个因子分别是这样构成的 ↓\n", + "\n", + "$$\n", + "QK^T = \\begin{bmatrix}\n", + " q_\\boldsymbol{\\color{green}{1}} \\cdot k_\\boldsymbol{\\color{green}{1}}^T & q_\\boldsymbol{\\color{green}{1}} \\cdot k_\\boldsymbol{\\color{red}{2}}^T & q_\\boldsymbol{\\color{green}{1}} \\cdot k_\\boldsymbol{\\color{red}{3}}^T & q_\\boldsymbol{\\color{green}{1}} \\cdot k_\\boldsymbol{\\color{red}{4}}^T \\\\\n", + " q_\\boldsymbol{\\color{green}{2}} \\cdot k_\\boldsymbol{\\color{green}{1}}^T & q_\\boldsymbol{\\color{green}{2}} \\cdot k_\\boldsymbol{\\color{green}{2}}^T & q_\\boldsymbol{\\color{green}{2}} \\cdot k_\\boldsymbol{\\color{red}{3}}^T & q_\\boldsymbol{\\color{green}{2}} \\cdot k_\\boldsymbol{\\color{red}{4}}^T \\\\\n", + " q_\\boldsymbol{\\color{green}{3}} \\cdot k_\\boldsymbol{\\color{green}{1}}^T & q_\\boldsymbol{\\color{green}{3}} \\cdot k_\\boldsymbol{\\color{green}{2}}^T & q_\\boldsymbol{\\color{green}{3}} \\cdot k_\\boldsymbol{\\color{green}{3}}^T & q_\\boldsymbol{\\color{green}{3}} \\cdot k_\\boldsymbol{\\color{red}{4}}^T \\\\\n", + " q_\\boldsymbol{\\color{green}{4}} \\cdot k_\\boldsymbol{\\color{green}{1}}^T & q_\\boldsymbol{\\color{green}{4}} \\cdot k_\\boldsymbol{\\color{green}{2}}^T & q_\\boldsymbol{\\color{green}{4}} \\cdot k_\\boldsymbol{\\color{green}{3}}^T & q_\\boldsymbol{\\color{green}{4}} \\cdot k_\\boldsymbol{\\color{green}{4}}^T\n", + " \\end{bmatrix}\n", + "$$\n", + "\n", + "使用更简化的写法,你会发现脚标是这样构成的:\n", + "\n", + "$$\n", + "QK^T = \\begin{bmatrix}\n", + " \\boldsymbol{\\color{green}{1}}\\cdot\\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{1}} \\cdot\\boldsymbol{\\color{red}{2}} & \\boldsymbol{\\color{green}{1}} \\cdot\\boldsymbol{\\color{red}{3}} & \\boldsymbol{\\color{green}{1}} \\cdot\\boldsymbol{\\color{red}{4}} \\\\\n", + " \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{green}{2}} & \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{red}{3}} & \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{red}{4}} \\\\\n", + " \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{2}} & \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{3}} & \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{red}{4}} \\\\\n", + " \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{2}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{3}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{4}}\n", + " \\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "78d1d6c8-4922-4dc1-9b1d-9042149c14d3", + "metadata": {}, + "source": [ + "你发现什么了?QK都是由单词经过embedding后编码的矩阵,因此Q从上至下的顺序就是“从过去到未来、按句子阅读顺序”排列的顺序,而K作为转置矩阵,K从左到右的顺序就是“从过去到未来、按句子阅读顺序”排列的顺序。当我们使用信息Q去询问信息K时,就有——\n", + "\n", + "1. Q的脚标 = K的脚标,则Q在询问和自己在同一位置/同一时间点的信息\n", + "2. Q的脚标 > K的脚标,则Q在询问在句子前方的/过去的时间点的信息\n", + "3. Q的脚标 < K的脚标,则Q在询问在句子后方的/未来时间点的信息\n", + "\n", + "很显然,Q的脚标 < K的脚标的情况都集中在$QK^T$矩阵的右上角。因此,我们为右上角加上负无穷,并在softmax函数后将该部分信息化为0,就可以避免“未来的信息”泄漏给Transformer算法。" + ] + }, + { + "cell_type": "markdown", + "id": "e995a257-2647-42cb-91f8-62b864adb064", + "metadata": {}, + "source": [ + "到这里,你就明白−∞的引入、掩码矩阵的引入所具有的意义了:\n", + "\n", + "- **阻止信息泄露**:在解码过程中,为了保持输出的自回归性质(即每个输出仅依赖于先前的输出),模型不能提前访问未来位置的信息。在$QK^T$矩阵中添加负无穷正是为了这一点,将负无穷加到某些位置上,是为了在计算注意力权重时,这些位置的影响被完全忽略。\n", + "- **影响softmax函数**:在自注意力机制中,注意力权重是通过对$QK^T$应用softmax函数计算得出的。当softmax函数作用于包含负无穷的值时,这些位置的指数值会趋于零,导致它们在计算最终的注意力权重时的贡献也趋于零。因此,这些未来的位置不会对当前或之前的输出产生影响。\n", + "- **保持生成顺序性**:通过这种方式,Transformer能够按顺序逐个生成输出序列中的元素,每个元素的生成只依赖于之前的元素,从而有效地模拟序列生成任务中的时间顺序性和因果关系。\n", + "\n", + "简而言之,将矩阵$QK^T + M$中的上半部分变成负无穷实际上是一种控制措施,用于保证解码器在处理如机器翻译或文本生成等任务时,不会由于未来信息的干扰而产生错误或不自然的输出。这是确保模型生成行为的正确性和效率的关键技术手段。" + ] + }, + { + "cell_type": "markdown", + "id": "c0f70fc1-3600-41db-9f24-f6b80901737c", + "metadata": {}, + "source": [ + "> **掩码后的注意力机制的输出结果**" + ] + }, + { + "cell_type": "markdown", + "id": "cd60c256-8fe3-4fd3-8b56-a6be15bb7019", + "metadata": {}, + "source": [ + "- **Decoder中,多头注意力机制输出的softmax结果**(这部分信息来自于真实标签y)\n", + "\n", + "$$\n", + "\\text{softmax}(QK^T + M) = \\begin{bmatrix}\n", + " \\frac{e^{q_1 \\cdot k_1^T}}{e^{q_1 \\cdot k_1^T}} & 0 & 0 & 0 \\\\\n", + " \\frac{e^{q_2 \\cdot k_1^T}}{e^{q_2 \\cdot k_1^T} + e^{q_2 \\cdot k_2^T}} & \\frac{e^{q_2 \\cdot k_2^T}}{e^{q_2 \\cdot k_1^T} + e^{q_2 \\cdot k_2^T}} & 0 & 0 \\\\\n", + " \\frac{e^{q_3 \\cdot k_1^T}}{e^{q_3 \\cdot k_1^T} + e^{q_3 \\cdot k_2^T} + e^{q_3 \\cdot k_3^T}} & \\frac{e^{q_3 \\cdot k_2^T}}{e^{q_3 \\cdot k_1^T} + e^{q_3 \\cdot k_2^T} + e^{q_3 \\cdot k_3^T}} & \\frac{e^{q_3 \\cdot k_3^T}}{e^{q_3 \\cdot k_1^T} + e^{q_3 \\cdot k_2^T} + e^{q_3 \\cdot k_3^T}} & 0 \\\\\n", + " \\frac{e^{q_4 \\cdot k_1^T}}{\\sum_{j=1}^{4} e^{q_4 \\cdot k_j^T}} & \\frac{e^{q_4 \\cdot k_2^T}}{\\sum_{j=1}^{4} e^{q_4 \\cdot k_j^T}} & \\frac{e^{q_4 \\cdot k_3^T}}{\\sum_{j=1}^{4} e^{q_4 \\cdot k_j^T}} & \\frac{e^{q_4 \\cdot k_4^T}}{\\sum_{j=1}^{4} e^{q_4 \\cdot k_j^T}}\n", + " \\end{bmatrix}\n", + "$$\n", + "\n", + "当这个矩阵乘以v后,依然不会改变携带的信息,因此我们可以使用这个脚标来标注整个多头注意力机制输出的结果,使用数字简化则有——\n", + "\n", + "$$\n", + "\\text{Decoder softmax} = \\begin{bmatrix}\n", + " \\boldsymbol{\\color{green}{1}}\\cdot\\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{1}} \\cdot\\boldsymbol{\\color{red}{2}} & \\boldsymbol{\\color{green}{1}} \\cdot\\boldsymbol{\\color{red}{3}} & \\boldsymbol{\\color{green}{1}} \\cdot\\boldsymbol{\\color{red}{4}} \\\\\n", + " \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{green}{2}} & \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{red}{3}} & \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{red}{4}} \\\\\n", + " \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{2}} & \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{3}} & \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{red}{4}} \\\\\n", + " \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{2}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{3}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{4}}\n", + " \\end{bmatrix}\n", + "$$\n", + "\n", + "经过掩码之后,实际上是——\n", + "\n", + "$$\n", + "\\text{Decoder masked softmax} = \\begin{bmatrix}\n", + " \\boldsymbol{\\color{green}{1}}\\cdot\\boldsymbol{\\color{green}{1}} & 0 & 0 & 0\\\\\n", + " \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{2}} \\cdot \\boldsymbol{\\color{green}{2}} & 0 & 0\\\\\n", + " \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{2}} & \\boldsymbol{\\color{green}{3}} \\cdot \\boldsymbol{\\color{green}{3}} & 0\\\\\n", + " \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{1}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{2}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{3}} & \\boldsymbol{\\color{green}{4}} \\cdot \\boldsymbol{\\color{green}{4}}\n", + " \\end{bmatrix}\n", + "$$\n", + "\n", + "转换成注意力得分,则有——\n", + "\n", + "$$\n", + "\\text{Decoder-Masked-Attention} = \\begin{bmatrix}\n", + "a_{11} & 0 & 0 & 0 \\\\\n", + "a_{21} & a_{22} & 0 & 0 \\\\\n", + "a_{31} & a_{32} & a_{33} & 0 \\\\\n", + "a_{41} & a_{42} & a_{43} & a_{44}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "584d9d95-e023-44db-a856-b41760d9964e", + "metadata": {}, + "source": [ + "假设 $V$ 矩阵如下,由于矩阵V是从原始标签y生成的embedding矩阵,因此矩阵V的序列方向是从上到下。\n", + "$$\n", + "V = \\begin{bmatrix}\n", + "v_{1} & v_{1} & \\ldots & v_{1} \\\\\n", + "v_{2} & v_{2} & \\ldots & v_{2} \\\\\n", + "v_{3} & v_{3} & \\ldots & v_{3} \\\\\n", + "v_{4} & v_{4} & \\ldots & v_{4}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d72749be-0273-4c5d-a368-038b43c42382", + "metadata": {}, + "source": [ + "**特别注意!在这里为了避免脚标产生混淆,没有写特征维度脚标。此时我们所有的脚标都只代表了时间点,特征维度脚标被省略了!事实上真正的V矩阵应该是——**\n", + "\n", + "$$\n", + "V = \\begin{bmatrix}\n", + "v_{1}^1 & v_{1}^2 & \\ldots & v_{1}^d \\\\\n", + "v_{2}^1 & v_{2}^2 & \\ldots & v_{2}^d \\\\\n", + "v_{3}^1 & v_{3}^2 & \\ldots & v_{3}^d \\\\\n", + "v_{4}^1 & v_{4}^2 & \\ldots & v_{4}^d\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "**在我们此时的讨论流程中,特征维度脚标只有标识作用,与整体过程理解无关,因此在这里出于教学目的将其省略。但事实上它应该是存在的。**" + ] + }, + { + "cell_type": "markdown", + "id": "b76c6110-ecb1-4229-aa8d-5637e880a4dd", + "metadata": {}, + "source": [ + "将$\\text{Decoder-Masked-Attention}$ 矩阵与 $V$ 矩阵相乘,得到结果矩阵 $C$,就是带掩码的多头注意力机制的结果——\n", + "\n", + "$$\n", + "C = \\text{Decoder-Masked-Attention} \\times V\n", + "$$\n", + "\n", + "$$\n", + "C = \\begin{bmatrix}\n", + "a_{11} & 0 & 0 & 0 \\\\\n", + "a_{21} & a_{22} & 0 & 0 \\\\\n", + "a_{31} & a_{32} & a_{33} & 0 \\\\\n", + "a_{41} & a_{42} & a_{43} & a_{44}\n", + "\\end{bmatrix}\n", + "\\begin{bmatrix}\n", + "v_{1} & v_{1} & \\ldots & v_{1} \\\\\n", + "v_{2} & v_{2} & \\ldots & v_{2} \\\\\n", + "v_{3} & v_{3} & \\ldots & v_{3} \\\\\n", + "v_{4} & v_{4} & \\ldots & v_{4}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e7a9ebde-0c25-4b5e-9eab-65e3c4c96daf", + "metadata": {}, + "source": [ + "结果矩阵 $C$ 的元素 $c_{ij}$ 的计算如下:\n", + "\n", + "$$\n", + "c_{i} = \\sum_{k} a_{ik} \\cdot v_{k}\n", + "$$\n", + "\n", + "具体计算为:\n", + "\n", + "$$\n", + "C = \\begin{bmatrix}\n", + "a_{11}v_{1} & a_{11}v_{1} & \\ldots & a_{11}v_{1} \\\\\n", + "a_{21}v_{1} + a_{22}v_{2} & a_{21}v_{1} + a_{22}v_{2} & \\ldots & a_{21}v_{1} + a_{22}v_{2} \\\\\n", + "a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} & a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} & \\ldots & a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} \\\\\n", + "a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{3} + a_{44}v_{4} & a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{3} + a_{44}v_{4} & \\ldots & a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{2} + a_{44}v_{4}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d460efdc-188f-4da3-bee7-f3ca50523eba", + "metadata": {}, + "source": [ + "观察这个矩阵,你发现了什么?在这个矩阵中,v上携带的信息的时间点不会超出分数a中携带的信息的时间点,权重和句子信息在交互时都只能与“过去”的信息交互,而不能与“未来”的信息交互。通过这种方式,你可以看到最终带掩码的注意力机制是如何实现未来信息的不泄露的。" + ] + }, + { + "cell_type": "markdown", + "id": "7042cf71-fcbf-4619-85b8-e8c434784f1e", + "metadata": {}, + "source": [ + "#### 2.3.2.3 普通掩码 vs 前瞻掩码" + ] + }, + { + "cell_type": "markdown", + "id": "d7176153-1ecd-4975-aca4-c79a59c78e43", + "metadata": {}, + "source": [ + "在NLP的世界中,掩码最被人熟知的作用就是掩盖未来的信息、避免序列中未来的信息被泄露到算法中,然而掩码(Masking)是一种多功能的机制,其本质是为了“掩盖信息”,但并不局限于掩盖未来的信息。在注意力机制中、掩盖未来信息、不允许Q向未来的K发问的掩码被叫做“前瞻掩码”(look-ahead Masking),这里的“前瞻”正是代表了“未来”(对时间序列来说是未来的时间点、对文字序列来说是右侧的信息)。然而,掩码在Transformer中还有另一个巨大的作用,就是**掩盖噪音信息,避免噪音影响注意力机制的计算**。掩盖噪音的掩码是最普通的掩码之一,在NLP中它主要负责掩盖填充句子时产生的padding。" + ] + }, + { + "cell_type": "markdown", + "id": "80307ff1-42bf-4639-a0a6-46056a0e99c7", + "metadata": {}, + "source": [ + "![](https://skojiangdoc.oss-cn-beijing.aliyuncs.com/2023DL/Live/NLP%26LLMs/06_.png)" + ] + }, + { + "cell_type": "markdown", + "id": "025e8bd2-e65a-4bc8-9b03-fba0e78ffc2d", + "metadata": {}, + "source": [ + "Transformer的输入数据结构为(batch_size, seq_len, input_dimensions),不同句子的seq_len必须保持一致,然而在现实中我们不太可能让每个句子的长度都一致,因此句子过长的部分我们就会截断句子、句子太短的部分我们就会使用填充。这些填充大部分都是0填充,这些0填充与其他token正常编码的结果计算之后,就会在注意力分数中留下许多的噪音值,因此在将这些信息输出之前,我们就会需要在QK.T矩阵上进行“填充掩码”,来帮助注意力机制减少噪音带来的影响。\n", + "\n", + "很显然,**前瞻掩码通常只是解码器专属的,但是填充掩码是解码器和编码器都可以使用的**。在编码器的多头注意力机制中,那个“可选的掩码”就是填充掩码机制。" + ] + }, + { + "cell_type": "markdown", + "id": "89e4493e-e6c5-4d7e-87e9-553639bd9ce9", + "metadata": {}, + "source": [ + "![](https://data-science-blog.com/wp-content/uploads/2022/01/mha_img_original.png)" + ] + }, + { + "cell_type": "markdown", + "id": "ffa551d3-633a-45fe-ac9e-62ac465c42a4", + "metadata": {}, + "source": [ + "pytorch ==> 允许我们自创掩码矩阵M,输入到pytorch的各个层里进行掩码(QK.T + M)" + ] + }, + { + "cell_type": "markdown", + "id": "c97b2146-9873-436a-999c-6e98c4037898", + "metadata": {}, + "source": [ + "M + QK.T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e96b97a6", + "metadata": {}, + "outputs": [], + "source": [ + "Q K\n", + "\n", + "(32,10,512)\n", + "\n", + "(32,10,512)\n", + "\n", + "QK.T\n", + "\n", + "(32,10,512) * (32,512,10)\n", + "\n", + "(10, 512) * (512, 10) ==> (10,10)\n", + "\n", + "(32,8,10,10)\n", + "(batch_size, num_heads, seq_len, seq_len)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "329f55cc", + "metadata": {}, + "outputs": [], + "source": [ + "M ==> (batch_size, num_heads, seq_len, seq_len)" + ] + }, + { + "cell_type": "markdown", + "id": "57d23d5a-b5fc-4b7b-9a23-70bfe9ee663b", + "metadata": {}, + "source": [ + "- **填充掩码的实现函数**" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "bccd48e6-e101-4eda-b51f-8d42d0f469fa", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "\n", + "# 创造一个示例数据\n", + "batch_size = 4\n", + "seq_len = 10\n", + "embedding_dim = 8\n", + "seq = torch.randint(0, 5, (batch_size, seq_len, embedding_dim)) # 随机生成一些数据\n", + "\n", + "#填充部分\n", + "pad_token = 0\n", + "seq[0, 7:, :] = pad_token # 设置填充值\n", + "seq[1, 9:, :] = pad_token # 设置填充值\n", + "seq[3, 5:, :] = pad_token # 设置填充值" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "94e601fc", + "metadata": {}, + "outputs": [], + "source": [ + "#(4,10,8)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8cf81f21-9713-4ab2-8311-aa5f987164f8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[0, 2, 1, 4, 0, 2, 0, 3],\n", + " [3, 3, 4, 2, 4, 4, 1, 4],\n", + " [0, 4, 3, 2, 4, 2, 4, 3],\n", + " [1, 2, 2, 0, 0, 1, 1, 2],\n", + " [2, 2, 1, 3, 2, 2, 4, 3],\n", + " [2, 4, 4, 3, 2, 1, 1, 4],\n", + " [3, 1, 4, 0, 1, 3, 4, 1],\n", + " [0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0]])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seq[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "29fc1401-d43a-4abc-ac0e-471ef6af0268", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[4, 3, 0, 1, 1, 3, 2, 0],\n", + " [0, 2, 2, 3, 1, 3, 2, 2],\n", + " [3, 0, 2, 4, 0, 0, 3, 4],\n", + " [3, 1, 0, 0, 3, 4, 1, 1],\n", + " [4, 4, 4, 1, 3, 4, 2, 4],\n", + " [4, 3, 4, 3, 3, 0, 1, 1],\n", + " [2, 3, 0, 4, 4, 1, 0, 2],\n", + " [2, 2, 1, 2, 3, 0, 4, 2],\n", + " [3, 3, 2, 3, 3, 2, 4, 4],\n", + " [0, 0, 0, 0, 0, 0, 0, 0]])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seq[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "fa859651-79b4-4c16-b29b-9616b122cc8a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[4, 3, 0, 3, 3, 1, 0, 1],\n", + " [2, 3, 0, 2, 0, 1, 1, 2],\n", + " [0, 3, 4, 1, 2, 0, 1, 0],\n", + " [1, 4, 2, 0, 2, 0, 2, 4],\n", + " [2, 0, 2, 3, 2, 3, 1, 4],\n", + " [0, 1, 0, 0, 0, 2, 1, 0],\n", + " [2, 2, 4, 2, 3, 1, 2, 3],\n", + " [0, 3, 2, 0, 1, 3, 3, 2],\n", + " [3, 0, 2, 2, 4, 3, 2, 4],\n", + " [2, 1, 2, 3, 1, 0, 3, 3]])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seq[2]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "9cf06e5b-1935-4257-9ff3-97f6f7d6038d", + "metadata": {}, + "outputs": [], + "source": [ + "#怎么针对这些填充的行进行掩码?" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "7dedc250-b45c-4059-ac0d-355d3fe6db7e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[[ True, False, False, False, True, False, True, False],\n", + " [False, False, False, False, False, False, False, False],\n", + " [ True, False, False, False, False, False, False, False],\n", + " [False, False, False, True, True, False, False, False],\n", + " [False, False, False, False, False, False, False, False],\n", + " [False, False, False, False, False, False, False, False],\n", + " [False, False, False, True, False, False, False, False],\n", + " [ True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True]],\n", + "\n", + " [[False, False, True, False, False, False, False, True],\n", + " [ True, False, False, False, False, False, False, False],\n", + " [False, True, False, False, True, True, False, False],\n", + " [False, False, True, True, False, False, False, False],\n", + " [False, False, False, False, False, False, False, False],\n", + " [False, False, False, False, False, True, False, False],\n", + " [False, False, True, False, False, False, True, False],\n", + " [False, False, False, False, False, True, False, False],\n", + " [False, False, False, False, False, False, False, False],\n", + " [ True, True, True, True, True, True, True, True]],\n", + "\n", + " [[False, False, True, False, False, False, True, False],\n", + " [False, False, True, False, True, False, False, False],\n", + " [ True, False, False, False, False, True, False, True],\n", + " [False, False, False, True, False, True, False, False],\n", + " [False, True, False, False, False, False, False, False],\n", + " [ True, False, True, True, True, False, False, True],\n", + " [False, False, False, False, False, False, False, False],\n", + " [ True, False, False, True, False, False, False, False],\n", + " [False, True, False, False, False, False, False, False],\n", + " [False, False, False, False, False, True, False, False]],\n", + "\n", + " [[False, True, False, False, False, True, True, False],\n", + " [False, False, False, False, False, False, False, False],\n", + " [False, False, True, False, False, False, False, False],\n", + " [False, False, False, True, False, True, False, False],\n", + " [False, False, True, True, False, False, False, False],\n", + " [ True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True],\n", + " [ True, True, True, True, True, True, True, True]]])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(seq == pad_token) #具体的值是否等于掩码呢?" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "4c0ed979-9da0-44f7-a44e-73461b38ce2a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[False, False, False, False, False, False, False, True, True, True],\n", + " [False, False, False, False, False, False, False, False, False, True],\n", + " [False, False, False, False, False, False, False, False, False, False],\n", + " [False, False, False, False, False, True, True, True, True, True]])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(seq == pad_token).all(dim=-1) #只有全部是0的行,才是真正的掩码,在最后一个维度上查看是否整行都为0" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0b4b711a-7a54-445d-a456-528007586321", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 1., 1., 1., 1., 1.]])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(seq == pad_token).all(dim=-1).float() #使用float,这就是标注出来需要掩码的行" + ] + }, + { + "cell_type": "markdown", + "id": "21c17563-be8d-404e-9086-d4b50013f158", + "metadata": {}, + "source": [ + "#每一行是一个batch,每一列是这个batch中的一个token\n", + "\n", + "\n", + " token1 token2 token3 .。。。 token10\n", + "batch1 0 0 0 1\n", + "batch2 0 0 1 1\n", + "batch3 0 1 1 1\n", + "batch4 0 1 1 1 \n", + "。。。\n", + "\n", + "(batch_size,seq_len)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "ece8aa4f", + "metadata": {}, + "outputs": [], + "source": [ + "#40 x 10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea852ec4", + "metadata": {}, + "outputs": [], + "source": [ + "X (4,10,8)\n", + "Q\\K (4,10,8)\n", + "\n", + "K.T (4,8,10)\n", + "\n", + "QK.T (4,10,8) x (4,8,10)\n", + "\n", + "(4,1,10,10)\n", + "\n", + "(4,num_heads,10,10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "988e4b31", + "metadata": {}, + "outputs": [], + "source": [ + "QK.T (4,num_heads,10,10) #400\n", + "\n", + "M (4,num_heads,10,10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a5f9345", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "132f5208-c667-41c9-8ec0-22810db48919", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([4, 1, 10, 10])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#接下来,要将掩码的行转变为掩码矩阵\n", + "#QK.T矩阵的维度是(batch_size,num_heads,seq_len,seq_len)\n", + "#掩码矩阵为了要能够与QK.T矩阵相加,也必须是这个结构\n", + "#unsqueeze用于在特定位置增加维度,expand则用于复制&拓展维度\n", + "\n", + "(seq == pad_token).all(dim=-1).unsqueeze(1).unsqueeze(3).expand(-1, -1, -1, seq.size(1)).shape" + ] + }, + { + "cell_type": "markdown", + "id": "2f84798c-6241-4deb-8921-8a1b938f89b6", + "metadata": {}, + "source": [ + "**录制视频时代码expand维度有误,导致掩码部分变成了列,正确的代码请以课件为准**" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "beb6c2b2-e891-49b8-8e22-3a54db34969f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(seq == pad_token).all(dim=-1).unsqueeze(1).unsqueeze(3).expand(-1, -1, -1, seq.size(1)).float()" + ] + }, + { + "cell_type": "markdown", + "id": "b8e4cbe6-4435-450e-8bb0-b674f89478bc", + "metadata": {}, + "source": [ + "> - **reshape与expand的区别**" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "43aacc59-bfba-437b-a2a3-6e00246795eb", + "metadata": {}, + "outputs": [], + "source": [ + "s = torch.tensor([[0,1,2,3,4,5]])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "bdbf6ab9-afd2-4e39-b188-96face8823ba", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[0, 1, 2],\n", + " [3, 4, 5]])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.reshape(-1,3) #将原始的序列拆成2行3列,重组" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "fe75e99e-4acd-4dac-ac5f-0f7f8d816975", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[[0, 1, 2, 3, 4, 5],\n", + " [0, 1, 2, 3, 4, 5],\n", + " [0, 1, 2, 3, 4, 5]]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.unsqueeze(1).expand(-1, 3, -1) #升维之后,在升起的维度上将原始序列复制三遍,构成更高维的结果" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "f929b99d-3625-4344-80ec-e3f5210ab417", + "metadata": {}, + "outputs": [], + "source": [ + "def create_padding_mask(seq, pad_token=0):\n", + " # seq: (batch_size, seq_len, embedding_dim)\n", + " # 检查填充值位置\n", + " padding_mask = (seq == pad_token).all(dim=-1) # (batch_size, seq_len)\n", + " \n", + " # 增加维度以匹配注意力权重矩阵的形状\n", + " # (batch_size, num_heads, seq_len, seq_len)\n", + " padding_mask = padding_mask.unsqueeze(1).unsqueeze(3).expand(-1, -1, -1, seq.size(1))\n", + " \n", + " # 将填充值部分设置为负无穷大,有效数据部分设置为0\n", + " padding_mask = padding_mask.float() * -1e9 # (batch_size, num_heads, seq_len, seq_len)\n", + " \n", + " return padding_mask" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "1eb66347-89dc-41d5-bc17-e900c21b1385", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([4, 1, 10, 10])\n", + "tensor([[[[-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09]]],\n", + "\n", + "\n", + " [[[-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09]]],\n", + "\n", + "\n", + " [[[-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00]]],\n", + "\n", + "\n", + " [[[-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09]]]])\n" + ] + } + ], + "source": [ + "padding_mask = create_padding_mask(seq, pad_token)\n", + "print(padding_mask.shape)\n", + "print(padding_mask)" + ] + }, + { + "cell_type": "markdown", + "id": "e5ff1abd-5309-47ce-b59f-98b21e07dc06", + "metadata": {}, + "source": [ + "但注意!我们并不是随时随地都需要这个升维的过程。具体需要呈现怎样的掩码矩阵,需要根据掩码矩阵使用的时机、以及配合的库来考虑。如果是配合PyTorch中已经设置好的Transformer类来使用,则二维的掩码矩阵就足够了,Transformer类会自动执行将掩码矩阵升维的过程;如果是利用更底层的机制创建的Transformer,则会需要我们手动执行上述流程来匹配掩码的结构。在实际使用时,大家要根据实际情况选择是否主动对掩码矩阵进行升维。" + ] + }, + { + "cell_type": "markdown", + "id": "96f57de7-3ebd-489b-a4d3-bb6be4e84911", + "metadata": {}, + "source": [ + "无需升维的填充掩码函数如下——" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "b86652ca-c6ce-40c1-82ec-cecf5511e0d1", + "metadata": {}, + "outputs": [], + "source": [ + "def create_padding_mask(seq, pad_token=0):\n", + " # seq: (batch_size, seq_len, embedding_dim)\n", + " # 检查填充值位置\n", + " padding_mask = (seq == pad_token).all(dim=-1) # (batch_size, seq_len)\n", + " padding_mask = padding_mask.float() * -1e9\n", + " \n", + " return padding_mask" + ] + }, + { + "cell_type": "markdown", + "id": "b8be99bd-9980-408a-88f0-1e3f1b491924", + "metadata": {}, + "source": [ + "- **前瞻掩码的实现函数**" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "a5c596c4", + "metadata": {}, + "outputs": [], + "source": [ + "#QK.T (batch_size, num_heads, seq_len, seq_len)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c4456e0", + "metadata": {}, + "outputs": [], + "source": [ + "triu(生成的矩阵的结构,对角线所在的位置)\n", + "tril" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "11eb6796-3359-4b99-851b-57c66e2b99ab", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "\n", + "def create_look_ahead_mask(seq_len, start_seq = 1):\n", + " mask = torch.triu(torch.ones((seq_len, seq_len)),diagonal=start_seq) # triu 左下方的三角矩阵,diagonal控制对角线位置\n", + " #mask = mask.float() * -1e9 # 将未来的位置设置为负无穷大\n", + " return mask" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "2d7315da-e693-4b43-a3dc-fc9986420843", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[0., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 1., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_look_ahead_mask(10) #为了教学方便,现在展示的是1和0,实际应该是右上角负无穷,左下角0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ce79780", + "metadata": {}, + "outputs": [], + "source": [ + "(seq_len, seq_len)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27340ecd", + "metadata": {}, + "outputs": [], + "source": [ + "batch_size * num_heads\n", + "\n", + "32 * 8 = 256" + ] + }, + { + "cell_type": "markdown", + "id": "0e18c7b4-0078-420f-b0f5-133605f69578", + "metadata": {}, + "source": [ + "你注意到了吗?前瞻掩码矩阵的结构为(seq_len, seq_len),而填充掩码矩阵的结构为(batch_size,num_heads,seq_len,seq_len)。前者可以通过广播的方式与QK.T矩阵相加,后者则必须写明4个维度的信息,这是因为**前瞻掩码对所有的序列都是一样的掩码方式,但填充掩码却是在每个batch内都是不一致的**,因为每个batch内的句子可能会不一致。" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "6c0bd91e-837d-4e7c-99a9-bec5d827ad9e", + "metadata": {}, + "outputs": [], + "source": [ + "def create_look_ahead_mask(seq_len, start_seq = 1):\n", + " mask = torch.triu(torch.ones((seq_len, seq_len)),diagonal=start_seq) # triu 左下方的三角矩阵,diagonal控制对角线位置\n", + " mask = mask.float() * -1e9 # 将未来的位置设置为负无穷大\n", + " return mask" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "57dd6146-1b79-4bbd-bcd2-276c048a8b6f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-0.0000e+00, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -1.0000e+09, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -1.0000e+09, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -1.0000e+09,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -1.0000e+09, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -1.0000e+09, -1.0000e+09, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -1.0000e+09, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -1.0000e+09],\n", + " [-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00,\n", + " -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00]])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_look_ahead_mask(10) #右上角为负无穷,左下角为0" + ] + }, + { + "cell_type": "markdown", + "id": "c892c749-9b81-4679-90ad-3bc2c90e2a74", + "metadata": {}, + "source": [ + "#### 2.3.2.4 编码器-解码器注意力层" + ] + }, + { + "cell_type": "markdown", + "id": "42f286b3-69bd-4e2b-a6a1-340ae1af01d2", + "metadata": {}, + "source": [ + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "b8fbf3d5-90fa-417f-aac9-1ba78e6826dd", + "metadata": {}, + "source": [ + "在Transformer模型的解码器部分,编码器-解码器注意力层(通常称为“交叉注意力”层)起着至关重要的作用。这一层允许**解码器的每个位置访问整个编码器的输出**,这对于将输入序列的上下文信息整合到输出序列的生成中是必需的。这个层的设计是为了确保解码器能够基于完整的输入序列信息来生成每个输出元素。" + ] + }, + { + "cell_type": "markdown", + "id": "c2b029b5-f1c6-4c8f-8956-e9d41d9caecf", + "metadata": {}, + "source": [ + "首先,**编码器-解码器注意力层的输入是来自多头注意力机制的输出结果**。从Decoder的掩码注意力层中输出的是经过掩码后、每一行只携带特定时间段信息的结果$C_{decoder}$:\n", + "\n", + "$$\n", + "C_{decoder} = \\begin{bmatrix}\n", + "a_{11}v_{1} & a_{11}v_{1} & \\ldots & a_{11}v_{1} \\\\\n", + "a_{21}v_{1} + a_{22}v_{2} & a_{21}v_{1} + a_{22}v_{2} & \\ldots & a_{21}v_{1} + a_{22}v_{2} \\\\\n", + "a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} & a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} & \\ldots & a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} \\\\\n", + "a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{3} + a_{44}v_{4} & a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{3} + a_{44}v_{4} & \\ldots & a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{2} + a_{44}v_{4}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e2ec3ae6-4f94-4b56-933b-bd6174813a67", + "metadata": {}, + "source": [ + "**当我们使用覆盖的时间点来作为脚标**,则有:\n", + "\n", + "$$\n", + "C_{decoder} = \\begin{bmatrix}\n", + "c_{1} & c_{1} & \\ldots & c_{1} \\\\\n", + "c_{1 \\to 2} & c_{1 \\to 2} & \\ldots & c_{1 \\to 2} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "**同样的,这里出于教学目的,省略了特征维度上的脚标。现在你所看到的脚标只代表时间维度/序列长度的维度。**" + ] + }, + { + "cell_type": "markdown", + "id": "7c2b8a3e-97bf-45a0-b9a7-1efb4cac481a", + "metadata": {}, + "source": [ + "从Encoder中输出的是没有掩码的注意力机制结果$C_{encoder}$,由于没有掩码,所以Encoder中的注意力分数为——\n", + "\n", + "$$\n", + "\\text{A} = \\begin{bmatrix}\n", + "a_{11} & a_{12} & a_{13} & a_{14} \\\\\n", + "a_{21} & a_{22} & a_{23} & a_{24} \\\\\n", + "a_{31} & a_{32} & a_{33} & a_{34} \\\\\n", + "a_{41} & a_{42} & a_{43} & a_{44}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "同时,V矩阵为(省略了特征维度,脚标代表的是时间点、seq_len的信息)——\n", + "\n", + "$$\n", + "V = \\begin{bmatrix}\n", + "v_{1} & v_{1} & \\ldots & v_{1} \\\\\n", + "v_{2} & v_{2} & \\ldots & v_{2} \\\\\n", + "v_{3} & v_{3} & \\ldots & v_{3} \\\\\n", + "v_{4} & v_{4} & \\ldots & v_{4}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "由于$\\text{C}_{\\text{encoder}} = \\text{A} \\times V$,因此最终的结果矩阵 $\\text{C}_{\\text{encoder}}$ 是:\n", + "\n", + "$$\n", + "\\text{C}_{\\text{encoder}} = \\begin{bmatrix}\n", + "a_{11} \\cdot v_1 + a_{12} \\cdot v_2 + a_{13} \\cdot v_3 + a_{14} \\cdot v_4 & a_{11} \\cdot v_1 + a_{12} \\cdot v_2 + a_{13} \\cdot v_3 + a_{14} \\cdot v_4 & \\ldots & a_{11} \\cdot v_1 + a_{12} \\cdot v_2 + a_{13} \\cdot v_3 + a_{14} \\cdot v_4 \\\\\n", + "a_{21} \\cdot v_1 + a_{22} \\cdot v_2 + a_{23} \\cdot v_3 + a_{24} \\cdot v_4 & a_{21} \\cdot v_1 + a_{22} \\cdot v_2 + a_{23} \\cdot v_3 + a_{24} \\cdot v_4 & \\ldots & a_{21} \\cdot v_1 + a_{22} \\cdot v_2 + a_{23} \\cdot v_3 + a_{24} \\cdot v_4 \\\\\n", + "a_{31} \\cdot v_1 + a_{32} \\cdot v_2 + a_{33} \\cdot v_3 + a_{34} \\cdot v_4 & a_{31} \\cdot v_1 + a_{32} \\cdot v_2 + a_{33} \\cdot v_3 + a_{34} \\cdot v_4 & \\ldots & a_{31} \\cdot v_1 + a_{32} \\cdot v_2 + a_{33} \\cdot v_3 + a_{34} \\cdot v_4 \\\\\n", + "a_{41} \\cdot v_1 + a_{42} \\cdot v_2 + a_{43} \\cdot v_3 + a_{44} \\cdot v_4 & a_{41} \\cdot v_1 + a_{42} \\cdot v_2 + a_{43} \\cdot v_3 + a_{44} \\cdot v_4 & \\ldots & a_{41} \\cdot v_1 + a_{42} \\cdot v_2 + a_{43} \\cdot v_3 + a_{44} \\cdot v_4\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "5d8a3541-a1bc-4b60-9e64-46a51614e553", + "metadata": {}, + "source": [ + "同样的,**当我们使用覆盖的时间点来作为脚标**,则有:\n", + "\n", + "$$\n", + "C_{encoder} = \\begin{bmatrix}\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "09b5b9f3-a810-4c85-b363-98f2d0cb8705", + "metadata": {}, + "source": [ + "**同样的,这里出于教学目的,省略了特征维度上的脚标。现在你所看到的脚标只代表时间维度/序列长度的维度。事实上4列C虽然覆盖的时间维度一致,但却归属于不同的特征维度。**" + ] + }, + { + "cell_type": "markdown", + "id": "fa1b627a-e6fd-48e9-a32f-826632c52c79", + "metadata": {}, + "source": [ + "此时,$C_{encoder}$携带的是特征矩阵X的信息,$C_{encoder}$中的每个元素都携带了全部时间步上的信息,$C_{decoder}$携带的是真实标签的信息,$C_{decoder}$中的元素则是每一行代表了一段时间的信息,随着行数的增加这段时间窗口越来越长。编码器-解码器注意力层负责整合这两部分信息。具体来说,编码器解码器输出的结果结合的方式是——**将解码器中的标签信息$C_{decoder}$作为Q矩阵,将编码器中输出的特征信息$C_{encoder}$作为K和V矩阵,使用每行Q与全部的K、V相乘,来执行一种特殊的注意力机制**。\n", + "\n", + "这种特殊注意力机制的公式如下——\n", + "\n", + "$$\\text{Context}_1 = \\sum_{i} \\text{Attention}(Q_1, K_i) \\times V_i$$\n", + "\n", + "$$\\text{Context}_2 = \\sum_{i} \\text{Attention}(Q_2, K_i) \\times V_i$$\n", + "\n", + "$$\\text{Context}_3 = \\sum_{i} \\text{Attention}(Q_3, K_i) \\times V_i$$\n", + "\n", + "$$……$$" + ] + }, + { + "cell_type": "markdown", + "id": "9e12a0d8-7f4d-4fdd-9a48-cf96b6721d4b", + "metadata": {}, + "source": [ + "在这个公式中,Q与K转置相乘的地方不再是原来自注意力机制中“问答的点积”、而是转变为了交叉的点击——转换成矩阵则有,$C_{decoder}(Q)$的第一行乘以$C_{encoder}(K.T)$的第一列,加上$C_{decoder}(Q)$的第一行乘以$C_{encoder}(K.T)$的第二列,加上$C_{decoder}(Q)$的第一行乘以$C_{encoder}(K.T)$的第三列……直到所有的列都被乘完为止。\n", + "\n", + "$$\n", + "Context_1 = \\begin{bmatrix}\n", + "\\color{red}{c_{1}} & \\color{red}{c_{1}} & \\ldots & \\color{red}{c_{1}} \\\\\n", + "c_{1 \\to 2} & c_{1 \\to 2} & \\ldots & c_{1 \\to 2} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix} \\cdot \n", + "\\begin{bmatrix}\n", + "\\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} \\\\\n", + "\\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} \\\\\n", + "\\color{red}\\ldots & \\ldots & \\ldots & \\ldots \\\\\n", + "\\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "$$ + $$\n", + "\n", + "$$\n", + "\\begin{bmatrix}\n", + "\\color{red}{c_{1}} & \\color{red}{c_{1}} & \\ldots & \\color{red}{c_{1}} \\\\\n", + "c_{1 \\to 2} & c_{1 \\to 2} & \\ldots & c_{1 \\to 2} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix} \\cdot\n", + "\\begin{bmatrix}\n", + "c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} \\\\\n", + "c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} \\\\\n", + "\\ldots & \\color{red}{\\ldots} & \\ldots & \\ldots \\\\\n", + "c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "$$ + $$\n", + "\n", + "$$ …… $$\n", + "\n", + "$$ + $$\n", + "\n", + "$$\n", + "\\begin{bmatrix}\n", + "\\color{red}{c_{1}} & \\color{red}{c_{1}} & \\ldots & \\color{red}{c_{1}} \\\\\n", + "c_{1 \\to 2} & c_{1 \\to 2} & \\ldots & c_{1 \\to 2} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix} \\cdot\n", + "\\begin{bmatrix}\n", + "c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} \\\\\n", + "\\ldots & \\ldots & \\ldots & \\color{red}{\\ldots} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "544862ce-7029-462c-87dd-6aab943515a2", + "metadata": {}, + "source": [ + "这是**标签中的第一个时间步与特征中的所有时间步产生关联**。\n", + "\n", + "同样的我们有——\n", + "\n", + "$$\n", + "Context_2 = \\begin{bmatrix}\n", + "c_{1} & c_{1} & \\ldots & c_{1} \\\\\n", + "\\color{red}{c_{1 \\to 2}} & \\color{red}{c_{1 \\to 2}} & \\ldots & \\color{red}{c_{1 \\to 2}} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix} \\cdot\n", + "\\begin{bmatrix}\n", + "\\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} \\\\\n", + "\\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} \\\\\n", + "\\color{red}{\\ldots} & \\ldots & \\ldots & \\ldots \\\\\n", + "\\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "$$ + $$\n", + "\n", + "$$\n", + "\\begin{bmatrix}\n", + "c_{1} & c_{1} & \\ldots & c_{1} \\\\\n", + "\\color{red}{c_{1 \\to 2}} & \\color{red}{c_{1 \\to 2}} & \\ldots & \\color{red}{c_{1 \\to 2}} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix} \\cdot\n", + "\\begin{bmatrix}\n", + "c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} \\\\\n", + "c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4} \\\\\n", + "\\ldots & \\color{red}{\\ldots} & \\ldots & \\ldots \\\\\n", + "c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} & c_{1 \\to 4} & c_{1 \\to 4}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "$$ + $$\n", + "\n", + "$$ …… $$\n", + "\n", + "$$ + $$\n", + "\n", + "$$\n", + "\\begin{bmatrix}\n", + "c_{1} & c_{1} & \\ldots & c_{1} \\\\\n", + "\\color{red}{c_{1 \\to 2}} & \\color{red}{c_{1 \\to 2}} & \\ldots & \\color{red}{c_{1 \\to 2}} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix} \\cdot\n", + "\\begin{bmatrix}\n", + "c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}} \\\\\n", + "\\ldots & \\ldots & \\ldots & \\color{red}{\\ldots} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & c_{1 \\to 4} & \\color{red}{c_{1 \\to 4}}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "这是**标签中的第一个和第二个时间步与特征中的所有时间步产生关联**。" + ] + }, + { + "cell_type": "markdown", + "id": "fe229962-5745-48b4-b0bf-ee676904196d", + "metadata": {}, + "source": [ + "以此类推下去,直到形成新的注意力机制矩阵,后续进入softmax、并与V相乘的流程也类似。**你是否注意到,这个注意力机制事实上代表了什么**?还记得我们最初说decoder结构的输入与输出吗?" + ] + }, + { + "cell_type": "markdown", + "id": "667787a4-7a41-499f-99db-cf994e2c6e5e", + "metadata": {}, + "source": [ + "在decoder中我们实际走的**训练流程**是:\n", + "\n", + "> - **第一步,输入ebd_X & ebd_y[0] >> 输出yhat[0],对应真实标签y[0]**" + ] + }, + { + "cell_type": "markdown", + "id": "1390a055-99b9-429c-98ef-fc8c8047bb87", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1It0.56210.89200.73120.25430.1289
2was0.23140.67940.98230.84520.3417
3the0.49320.20450.75310.65820.9731
4best0.83420.29870.76420.21540.9812
5of0.34170.57920.48210.67210.1234
6times0.25310.73450.98120.54870.2378
\n", + "
\n", + "

对应

\n", + " ➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "b35be58e-b456-4854-b1e2-e1335d7e0f5c", + "metadata": {}, + "source": [ + "> - **第二步,输入ebd_X & ebd_y[:1] >> 输出yhat[1],对应真实标签y[1]**" + ] + }, + { + "cell_type": "markdown", + "id": "1894c009-80da-4d03-9c22-c77fa96744ea", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1It0.56210.89200.73120.25430.1289
2was0.23140.67940.98230.84520.3417
3the0.49320.20450.75310.65820.9731
4best0.83420.29870.76420.21540.9812
5of0.34170.57920.48210.67210.1234
6times0.25310.73450.98120.54870.2378
\n", + "
\n", + "

对应

\n", + " ➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "f8290514-7115-430b-b26e-461346862ee1", + "metadata": {}, + "source": [ + "> - **第三步,输入ebd_X & ebd_y[:2] >> 输出yhat[2],对应真实标签y[2]**" + ] + }, + { + "cell_type": "markdown", + "id": "69d579ae-115f-4522-bcbe-eb0036f3bd36", + "metadata": {}, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Encoder
特征矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "
\n", + "

输入Decoder
标签矩阵

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.56510.22200.51120.85430.1239
1It0.56210.89200.73120.25430.1289
2was0.23140.67940.98230.84520.3417
3the0.49320.20450.75310.65820.9731
4best0.83420.29870.76420.21540.9812
5of0.34170.57920.48210.67210.1234
6times0.25310.73450.98120.54870.2378
\n", + "
\n", + "

对应

\n", + " ➡\n", + "
\n", + "

真实标签y

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0It
1was
2the
3best
4of
5times
6\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "2daa4ae1-7a58-4778-b272-9b1ff4615ce0", + "metadata": {}, + "source": [ + "……以此类推下去。很显然,编码器-解码器注意力机制中的数学流程,正是【利用序列X + 序列y的前半段预测序列y的后半段】的计算方式!在这里每一步都是单独的方程,涉及到矩阵中不同的行,因此这里的所有时间步可以并行!本质上实现的是编码器-解码器注意力机制中、下列方程的并行 ↓\n", + "\n", + "$$\\text{Context}_1 = \\sum_{i} \\text{Attention}(Q_1, K_i) \\times V_i$$\n", + "\n", + "$$\\text{Context}_2 = \\sum_{i} \\text{Attention}(Q_2, K_i) \\times V_i$$\n", + "\n", + "$$\\text{Context}_3 = \\sum_{i} \\text{Attention}(Q_3, K_i) \\times V_i$$" + ] + }, + { + "cell_type": "markdown", + "id": "2e759e40-015e-4271-8add-5e911afa3c1d", + "metadata": {}, + "source": [ + "所以现在你知道编码器解码器层是如何实现信息整合的了。学到这里,我们来总结一下编码器-解码器注意力层的核心作用——\n", + "\n", + "1. **关联输入和输出**:在许多任务中,输出序列的生成需要依赖于输入序列的特定部分。这层允许模型学习在生成每个输出元素时应关注输入序列的哪些部分。\n", + "2. **灵活的上下文捕捉**:与自注意力层只能处理解码器自身的先前输出不同,编码器-解码器注意力层可以访问整个输入序列的上下文,这对于任务如机器翻译至关重要。\n", + "3. **增强解码器能力**:通过整合来自编码器的信息,这一设计显著增强了解码器处理复杂输入序列并准确生成输出的能力。\n", + "\n", + "总之,编码器-解码器注意力层是Transformer解码器的核心部分,使解码器能够利用编码器处理的完整输入信息,从而生成语义上连贯且上下文相关的输出。" + ] + }, + { + "cell_type": "markdown", + "id": "ce71908e-b9c8-46e6-b2b8-5f5444227d55", + "metadata": {}, + "source": [ + "### 2.3.3 Decoder-Only结构中的Decoder" + ] + }, + { + "cell_type": "markdown", + "id": "a1962038-11c8-42c3-b538-9e18b2fe5372", + "metadata": {}, + "source": [ + "现在,让我们来看看Decoder-only结构下的Decoder。在Decoder-only结构下的Decoder是专用于生成式任务的架构,它从整个Transformer结构中抽离出来、有独特的训练流程与结构。我们先从结构来看——\n", + "\n", + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "023a7e72-d9fa-430f-845e-8586e2411ffb", + "metadata": {}, + "source": [ + "训练——(teacher forcing - 不会累计错误)\n", + "\n", + "这是最好的时代 👉 xxx\n", + "\n", + "这是最好的时代,这 👉 xxx\n", + "\n", + "这是最好的时代,这是 👉 xxx\n", + "\n", + "测试——(autoregressive - 累计错误)\n", + "\n", + "这是最坏的时代 👉 xxx\n", + "\n", + "这是最坏的时代,xxx 👉 xxx\n", + "\n", + "这是最坏的时代,xxxxxx 👉 xxx" + ] + }, + { + "cell_type": "markdown", + "id": "92b59d15-b72d-4f18-875a-f9ec5cbdfd37", + "metadata": {}, + "source": [ + "如图所示,与原本的Decoder结构相比,Decoder-only状态下的Decoder不再存在编码器-解码器注意力层,整个结构会变得更像编码器Encoder,但依然保留着Teacher forcing和掩码机制。由于没有了编码器-解码器注意力层,因此原本依赖于编码器-解码器注意力层完成的整套训练和运算流程也都不再有效了,相对的,在Decoder-only结构中的Decoder大部分时候都采用“自回归”的训练流程——自回归流程在时间序列预测中是一种常用的方法,它逐步生成未来的值,每一步的预测依赖于前一步的实际值或预测值,而Decoder-only状态下的训练、预测流程都是这样的流程。**在自回归场景中,Decoder的任务是——**\n", + "\n", + "1. **利用序列的前半段预测序列的后半段**,因此Decoder的输入数据是一段时间序列、一段文字,输出的是对未来时间的预测、对未来文字的填补

\n", + "\n", + "2. **利用teacher forcing机制和自回归机制的本质,在训练和预测流程中使用标签来辅助预测**。具体地来说,在训练流程中,Decoder利用teacher forcing机制、不断将正确的标签作为特征数据使用;在测试流程中,Decoder利用自回归的属性,将前一步的预测值作为特征数据来使用。\n", + "\n", + "**在生成式任务中,一般我们不再区分“特征和标签”这两种不同的数据,在大多数生成式任务中,我们有且只有一种数据——就是需要继续生成、继续补充的那段序列**。生成式任务带有一定的“自监督”属性,我们训练用的数据、和要预测的数据都来自于同一段序列,因此标签数据在下一个时间步就会成为我们的特征数据,故而我们也不会特地再去区分特征和标签、而是会区分“输入”与“输出”。不过,从架构图上来看,除了要预测的序列本身之外,我们依然也可以给Decoder输入更多额外的信息(图上的inputs部分)。大部分时候,我们可以使用这条数据流线路向Decoder传递一些相应的“条件”与“背景知识”,可以帮助我们更好地进行信息的生成和填补。" + ] + }, + { + "cell_type": "markdown", + "id": "d9626c6f-84ec-4a09-83bc-99eb5d957a93", + "metadata": {}, + "source": [ + "具体来看,Decoder-only状态下的**训练流程**如下,假设需要预测的序列为y,编码好的结果为ebd_y,其中我们取ebd_y的前n个字符作为输入,n个字符后的字符作为标签:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5bddc57e", + "metadata": {}, + "outputs": [], + "source": [ + "训练——(teacher forcing - 不会累计错误)\n", + "\n", + "这是最好的时代 👉 xxx\n", + "\n", + "这是最好的时代,这 👉 xxx\n", + "\n", + "这是最好的时代,这是 👉 xxx\n", + "\n", + "测试——(autoregressive - 累计错误)\n", + "\n", + "这是最坏的时代 👉 xxx\n", + "\n", + "这是最坏的时代,xxx 👉 xxx\n", + "\n", + "这是最坏的时代,xxxxxx 👉 xxx" + ] + }, + { + "cell_type": "markdown", + "id": "d15876cf-fee0-4766-a173-bcb75d18fd57", + "metadata": {}, + "source": [ + "- **第1步,输入 ebd_y[0] >> 输出预测标签yhat[0],对应真实标签y[0]**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Decoder
序列的前半段

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.18210.40000.22480.44400.7771
\n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0yyy0.56210.89200.73120.25430.1289
\n", + "

对应

➡\n", + "
\n", + "

真实标签y
序列的后半段

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0
1
2最好的
3时代
4
5
6最坏的
7时代
8\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "60c5082e-e954-4592-a635-0c3cf4d08b52", + "metadata": {}, + "source": [ + "……\n", + "- **第n+1步,输入 ebd_y[:n] >> 输出预测标签yhat[n],对应真实标签y[n]**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Decoder
序列的前半段

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.18210.40000.22480.44400.7771
10.18210.40000.22480.44400.7771
20.17210.50300.89480.23850.0987
3最好的0.13420.82970.29780.71200.2565
4时代0.12480.50030.75590.48040.2593
\n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
4yyy0.56210.89200.73120.25430.1289
\n", + "

对应

➡\n", + "
\n", + "

真实标签y
序列的后半段

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0
1
2最好的
3时代
4
5
6最坏的
7时代
8\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "ddd26efa-b0b6-4095-aa9d-cc04904e47c2", + "metadata": {}, + "source": [ + "- **第n+2步,输入 ebd_y[:n+1] >> 输出预测标签yhat[n+1],对应真实标签y[n+1]**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Decoder
序列的前半段

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.18210.40000.22480.44400.7771
10.18210.40000.22480.44400.7771
20.17210.50300.89480.23850.0987
3最好的0.13420.82970.29780.71200.2565
4时代0.12480.50030.75590.48040.2593
50.18210.40000.22480.44400.7771
\n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
5yyy0.56210.89200.73120.25430.1289
\n", + "

对应

➡\n", + "
\n", + "

真实标签y
序列的后半段

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0
1
2最好的
3时代
4
5
6最坏的
7时代
8\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "63a5a743-5962-4da9-a04a-50af96e61923", + "metadata": {}, + "source": [ + "- **第n+3步,输入 ebd_y[:n+2] >> 输出预测标签yhat[n+2],对应真实标签y[n+2]**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Decoder
序列的前半段

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
0\"sos\"0.18210.40000.22480.44400.7771
10.18210.40000.22480.44400.7771
20.17210.50300.89480.23850.0987
3最好的0.13420.82970.29780.71200.2565
4时代0.12480.50030.75590.48040.2593
50.18210.40000.22480.44400.7771
60.17210.50300.89480.23850.0987
\n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
6yyy0.56210.89200.73120.25430.1289
\n", + "

对应

➡\n", + "
\n", + "

真实标签y
序列的后半段

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引
0
1
2最好的
3时代
4
5
6最坏的
7时代
8\"eos\"
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "ec456494-41a8-424d-8370-420dd48cb091", + "metadata": {}, + "source": [ + "而在**推理流程**中,Decoder中运行的流程如下所示——" + ] + }, + { + "cell_type": "markdown", + "id": "34ea7606-fd90-4985-87e6-53a440f508ac", + "metadata": {}, + "source": [ + "- **第一步,输入 ebd_y(全部的数据) >> 输出下一步的预测标签**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Decoder
全部的序列

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
\n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
4yyy0.56210.89200.73120.25430.1289
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "120b23d6-6ab6-4a17-9005-1848ebde133c", + "metadata": {}, + "source": [ + "- **第二步,输入 ebd_y(全部的数据)+ 预测的yhat >> 输出下一步的预测标签**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Decoder
全部的序列

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
4yyy0.56210.89200.73120.25430.1289
\n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
5yyy0.56210.89200.73120.25430.1289
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "72d09ff7-aa85-4635-bf11-00071d5caf2b", + "metadata": {}, + "source": [ + "- **第三步,输入 ebd_y(全部的数据)+ 预测的yhat >> 输出下一步的预测标签**\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "

输入Decoder
全部的序列

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
00.18210.40000.22480.44400.7771
10.17210.50300.89480.23850.0987
2最好的0.13420.82970.29780.71200.2565
3时代0.12480.50030.75590.48040.2593
4yyy0.56210.89200.73120.25430.1289
5yyy0.56210.89200.73120.25430.1289
\n", + "

预测出

➡\n", + "
\n", + "

当前时间步的预测标签yhat

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
索引y1y2y3y4y5
6yyy0.56210.89200.73120.25430.1289
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e4e767b0-4593-4a1f-90d4-7188ab29a1ad", + "metadata": {}, + "source": [ + "以此类推,直到预测出“eos”后停止。**与Transformer中的Decoder一致,训练流程是可以并行的,这一点通过带掩码的注意力机制来实现**。而推理流程是必须严格遵守自回归要求的、在下一个时间步预测之前必须将上一个时间步的结果计算出来,因此**推理流程中则需要使用循环的方式**来进行预测。" + ] + }, + { + "cell_type": "markdown", + "id": "1f02882e-87fd-4d72-97a0-1e675b228db2", + "metadata": {}, + "source": [ + "- **不从第一个样本开始训练的流程如何实现?**" + ] + }, + { + "cell_type": "markdown", + "id": "4cd986a4-9f01-4be4-b9df-d42d2ea23650", + "metadata": {}, + "source": [ + "
\"描述文字\"" + ] + }, + { + "cell_type": "markdown", + "id": "406f0103-d27a-4934-85cc-8a2ff8c60917", + "metadata": {}, + "source": [ + "从Decoder的掩码注意力层中输出的是经过掩码后、每一行只携带特定时间段信息的结果$C_{decoder}$:\n", + "\n", + "$$\n", + "C_{decoder} = \\begin{bmatrix}\n", + "a_{11}v_{1} & a_{11}v_{1} & \\ldots & a_{11}v_{1} \\\\\n", + "a_{21}v_{1} + a_{22}v_{2} & a_{21}v_{1} + a_{22}v_{2} & \\ldots & a_{21}v_{1} + a_{22}v_{2} \\\\\n", + "a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} & a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} & \\ldots & a_{31}v_{1} + a_{32}v_{2} + a_{33}v_{3} \\\\\n", + "a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{3} + a_{44}v_{4} & a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{3} + a_{44}v_{4} & \\ldots & a_{41}v_{1} + a_{42}v_{2} + a_{43}v_{2} + a_{44}v_{4}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "cb2340e4-db1f-4649-90a3-a1038eeb9630", + "metadata": {}, + "source": [ + "**当我们使用覆盖的时间点来作为脚标**,则有:\n", + "\n", + "$$\n", + "C_{decoder} = \\begin{bmatrix}\n", + "c_{1} & c_{1} & \\ldots & c_{1} \\\\\n", + "c_{1 \\to 2} & c_{1 \\to 2} & \\ldots & c_{1 \\to 2} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix}\n", + "$$\n", + "\n", + "**同样的,这里出于教学目的,省略了特征维度上的脚标。现在你所看到的脚标只代表时间维度/序列长度的维度。**" + ] + }, + { + "cell_type": "markdown", + "id": "a0b4f1bb-5796-4528-a134-19e98a189717", + "metadata": {}, + "source": [ + "此时你会发现,我们必须从单词1开始预测,其流程为:\n", + "\n", + "> 单词1 用于预测 单词2

\n", + "> 单词1、2 用于预测 单词3

\n", + "> 单词1、2、3 用于预测 单词4" + ] + }, + { + "cell_type": "markdown", + "id": "775919e2-3986-4ca4-8fc7-e8b537310386", + "metadata": {}, + "source": [ + "但事实上,在生成式的例子中,我们可能会倾向于一开始就给与比较多的信息。我们真正要做的是“利用句子的前半段”去预测“句子的后半段”,大部分时候我们其实很少使用简单的几个单词、或1个单词来进行训练。而是倾向于使用下面的流程——\n", + "\n", + "> 单词1:n 用于预测 单词n+1

\n", + "> 单词1:n+1 用于预测 单词n+2

\n", + "> 单词1:n+2 用于预测 单词n+3" + ] + }, + { + "cell_type": "markdown", + "id": "a64c9b94-284c-4738-a0c4-a178ea81deea", + "metadata": {}, + "source": [ + "如果要实现上面的流程,可以怎么做呢?可以通过移动前瞻掩码矩阵的对角线来实现——" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "b7c6fbf5-e8ca-489e-bd4c-3f32ac674d0b", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "\n", + "def create_look_ahead_mask(seq_len, start_seq = 1):\n", + " mask = torch.triu(torch.ones((seq_len, seq_len)),diagonal=start_seq) # triu 左下方的三角矩阵,diagonal控制对角线位置\n", + " #mask = mask.float() * -1e9 # 将未来的位置设置为负无穷大\n", + " return mask" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "14030c34-efc4-405d-9e61-90ce434ceda9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[0., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 1., 1., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 1., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_look_ahead_mask(10) #为了教学方便,现在展示的是1和0,实际应该是右上角负无穷,左下角0" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "c60161b9-8f5c-49ab-b152-31a24bf4f76a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[0., 0., 0., 0., 1., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 1., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 1., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 1., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_look_ahead_mask(10,start_seq=4) #通过调节对角线,可以让掩码的区域缩小,从而可以允许更多信息的注入" + ] + }, + { + "cell_type": "markdown", + "id": "d041f9e0-0620-4666-b104-a4a86eda87dd", + "metadata": {}, + "source": [ + "当前瞻掩码从第一个时间步开始时,掩码注意力层输出的结果覆盖的时间步为:\n", + "\n", + "$$\n", + "C_{decoder} = \\begin{bmatrix}\n", + "c_{1} & c_{1} & \\ldots & c_{1} \\\\\n", + "c_{1 \\to 2} & c_{1 \\to 2} & \\ldots & c_{1 \\to 2} \\\\\n", + "c_{1 \\to 3} & c_{1 \\to 3} & \\ldots & c_{1 \\to 3} \\\\\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6b473aba-cd11-4654-89ff-561f98eaef93", + "metadata": {}, + "source": [ + "当前瞻掩码从第4个时间步开始时,掩码注意力层输出的结果覆盖的时间步为:\n", + "\n", + "$$\n", + "C_{decoder} = \\begin{bmatrix}\n", + "c_{1 \\to 4} & c_{1 \\to 4} & \\ldots & c_{1 \\to 4} \\\\\n", + "c_{1 \\to 5} & c_{1 \\to 5} & \\ldots & c_{1 \\to 5} \\\\\n", + "c_{1 \\to 6} & c_{1 \\to 6} & \\ldots & c_{1 \\to 6} \\\\\n", + "c_{1 \\to 7} & c_{1 \\to 7} & \\ldots & c_{1 \\to 7}\n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "69f86f4a-81ea-4fde-a76c-cc3038ef2744", + "metadata": {}, + "source": [ + "这样可以第一次预测过程中所使用的标签为“前n个字”而不是“第一个字”。当然,这已经是属于“自定义掩码”的范围,在实际中并不多见。但通过这种掩码方式,可以要求解码器产出的注意力分数完整接收前几个字之间的相互关系、从而一开始就使用“前半段话”来进行训练。在之后实现Decoder-only预测的过程中,我们将会更详细地讲解这个流程。" + ] + }, + { + "cell_type": "markdown", + "id": "8548805f-deb6-4fe2-8309-caed8139022f", + "metadata": {}, + "source": [ + "在探索了Transformer模型的全貌之后,我们可以看到这一架构之所以在自然语言处理和其他序列处理任务中表现卓越,归功于其创新的设计和高效的信息处理能力。从自注意力机制到编码器和解码器的层叠结构,每一部分都精心设计以最大化上下文信息的利用,并提高计算的并行性。Transformer不仅改变了我们处理文本的方式,也为机器学习领域提供了一种强大的工具,用以解决一系列复杂的序列建模问题。\n", + "\n", + "自注意力机制使模型能够灵活地捕捉序列内的长距离依赖,而无需依赖于递归网络结构,从而避免了梯度消失和计算效率低下的问题。编码器层通过逐层处理输入数据,有效地提取和聚合信息;而解码器层则利用编码器的输出,结合自回归的方式逐步构建输出序列。通过这种方式,Transformer能够在翻译、文本生成、摘要等任务中生成准确且连贯的文本。\n", + "\n", + "此外,编码器-解码器注意力机制是理解输入与输出之间复杂关系的关键,它使得模型能够在生成每个输出时都考虑到与输入序列的具体关联。这种能力使得Transformer不仅适用于传统的NLP任务,还可以扩展到如图像处理和多模态任务中,展示了其极大的灵活性和广泛的适用性。\n", + "\n", + "总的来说,Transformer的出现标志着深度学习在处理序列数据方面的一个重大进步。随着研究的深入和技术的发展,我们期待看到更多基于Transformer的创新应用,这将进一步推动人工智能领域的边界向前发展。" + ] + } + ], + "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 +} diff --git a/大模型架构/Transformer/1. 注意力机制的简介.ipynb b/大模型架构/Transformer/1. 注意力机制的简介.ipynb new file mode 100644 index 0000000..2154f10 --- /dev/null +++ b/大模型架构/Transformer/1. 注意力机制的简介.ipynb @@ -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", + "> **面试考点**

\n", + "作为一种权重计算机制、注意力机制有多种实现形式。经典的注意力机制(Attention)进行的是跨序列的样本相关性计算,这是说,经典注意力机制考虑的是序列A的样本之于序列B的重要程度。这种形式常常用于经典的序列到序列的任务(Seq2Seq),比如机器翻译;在机器翻译场景中,我们会考虑原始语言系列中的样本对于新生成的序列有多大的影响,因此计算的是原始序列的样本之于新序列的重要程度。\n", + "

不过在Transformer当中我们使用的是“自注意力机制”(Self-Attention),这是在一个序列内部对样本进行相关性计算的方式,核心考虑的是序列A的样本之于序列A本身的重要程度。\n", + "\n", + "在Transformer架构中我们所使用的是自注意力机制,因此我们将重点围绕自注意力机制来展开讨论,我们将一步步揭开自注意力机制对于Transformer和序列算法的意义——" + ] + }, + { + "cell_type": "markdown", + "id": "1b1915f6-6acb-47b9-8fff-3d68b8a6c5c7", + "metadata": {}, + "source": [ + "- 首先,**为什么要判断序列中样本的重要性?计算重要性对于序列理解来说有什么意义?**\n", + "\n", + "在序列数据当中,每个样本对于“理解序列”所做出的贡献是不相同的,能够帮助我们理解序列数据含义的样本更为重要,而对序列数据的本质逻辑/含义影响不大的样本则不那么重要。以文字数据为例——\n", + "\n", + "**
尽管今天下了雨,但我因为_________而感到非常开心和兴奋
**\n", + "\n", + "**
__________,但我因为拿到了梦寐以求的工作offer而感到非常开心和兴奋
**\n", + "\n", + "观察上面两句话,我们分别抠除了一些关键信息。很显然,第一个句子令我们完全茫然,但第二个句子虽然缺失了部分信息,但我们依然理解事情的来龙去脉。从这两个句子我们明显可以看出,不同的信息对于句子的理解有不同的意义。" + ] + }, + { + "cell_type": "markdown", + "id": "96f2e49b-16c2-40ab-9457-a129b78c0fbe", + "metadata": {}, + "source": [ + "在实际的深度学习预测任务当中也是如此,假设我们依然以这个句子为例——\n", + "\n", + "**
尽管今天下了雨,但我因为拿到了梦寐以求的工作offer而感到非常开心和兴奋
**\n", + "\n", + "假设模型对句子进行情感分析,很显然整个句子的情感倾向是积极的,在这种情况下,“下了雨”这一部分对于理解整个句子的情感色彩贡献较小,相对来说,“拿到了梦寐以求的工作offer”和“感到非常开心和兴奋”这些部分则是理解句子传达的正面情绪的关键。因此对序列算法来说,如果更多地学习“拿到了梦寐以求的工作offer”和“感到非常开心和兴奋”这些词,就更有可能对整个句子的情感倾向做出正确的理解,就更有可能做出正确的预测。\n", + "\n", + "当我们使用注意力机制来分析这样的句子时,自注意力机制可能会为“开心”和“兴奋”这样的词分配更高的权重,因为这些词直接关联到句子的情感倾向。在很长一段时间内、长序列的理解都是深度学习世界的业界难题,在众多研究当中研究者们尝试着从记忆、效率、信息筛选等等方面来寻找出路,而注意力机制所走的就是一条“提效”的道路。**如果我们能够判断出一个序列中哪些样本是重要的、哪些是无关紧要的,就可以引导算法去重点学习更重要的样本,从而可能提升模型的效率和理解能力**。" + ] + }, + { + "cell_type": "markdown", + "id": "23bade20-d62b-4f8e-a191-8b102524bc12", + "metadata": {}, + "source": [ + "- 第二,**那样本的重要性是如何定义的?为什么?**\n", + "\n", + "自注意力机制通过**计算样本与样本之间的相关性**来判断样本的重要性,在一个序列当中,如果一个样本与其他许多样本都高度相关,则这个样本大概率会对整体的序列有重大的影响。举例说明,看下面的文字——\n", + "\n", + "**
经理在会议上宣布了重大的公司______计划,员工们反应各异,但都对未来充满期待。
**\n", + "\n", + "在这个例子中,我们抠除的这个词与“公司”、“计划”、“会议”、“宣布”和“未来”等词汇都高度相关。如果我们针对这些词汇进行提问,你会发现——\n", + "\n", + "**公司**做了什么?
\n", + "**宣布**了什么内容?
\n", + "**计划**是什么?
\n", + "**未来**会发生什么?
\n", + "**会议**上的主要内容是什么?\n", + "\n", + "所有这些问题的答案都围绕着这一个被抠除的词产生。这个完整的句子是——\n", + "\n", + "**
经理在会议上宣布了重大的公司重组计划,员工们反应各异,但都对未来充满期待。
**\n", + "\n", + "被抠掉的部分是**重组**。很明显,重组这个词不仅提示了事件的性质、是整个句子的关键,而且也对其他词语的理解有着重大的影响。这个单词对于理解句子中的事件——公司正在经历重大变革,以及员工们的情绪反应——都至关重要。如果没有“重组”这个词,整个句子的意义将变得模糊和不明确,因为不再清楚“宣布了什么”以及“未来期待”是指什么。因此,“重组”这个词很明显对整个句子的理解有重大影响,而且它也和句子中的其他词语高度相关。\n", + "\n", + "相对的,假设我们抠掉的是——\n", + "\n", + "**
经理在会议上宣布了重大的公司重组计划,______反应各异,但都对未来充满期待。
**\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),而作为非核心的词的那个词被认为是在“应答”(Key),AB之间的相关性就是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 +} diff --git a/大模型架构/Transformer/2. 自注意力机制的计算.ipynb b/大模型架构/Transformer/2. 自注意力机制的计算.ipynb new file mode 100644 index 0000000..2c34136 --- /dev/null +++ b/大模型架构/Transformer/2. 自注意力机制的计算.ipynb @@ -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": [ + "**Step3:softmax函数归一化**\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 +} diff --git a/大模型架构/Transformer/3. 多头注意力机制.ipynb b/大模型架构/Transformer/3. 多头注意力机制.ipynb new file mode 100644 index 0000000..14936c3 --- /dev/null +++ b/大模型架构/Transformer/3. 多头注意力机制.ipynb @@ -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$ 来进行变换得到Query,Keys,Values。而Multi-Head Attention使用多组$W^Q,W^K,W^V$ 得到多组Query,Keys,Values,然后每组分别计算得到一个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 +}