尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【Transformer入门】从函数到Transformer

【Transformer入门】从函数到Transformer 一、前言平平无奇的计算机大学生本科上完你是否想了解一下最近现代、最AI的Transformer。我作为一个科研小白研0无聊故计划去学习什么是Transformer怎么拼凑的Transformer因此本文浅入浅出从最初到当今技术发展以及Transformer的真实面貌。二、入门1. 函数传统函数是x到y的映射关系遇到不能轻易看出来的或者难以找到完全拟合的函数用猜或者近似解来解决即“符号主义-联结主义”。后遇到复杂的数学模型产生了线性函数-非线性函数的衍化其间产生了激活函数概念形如常写作即可看成X输入层-Y输出层X可以为多个上述激活函数的所参与的函数变换可以看成X输入层-a隐藏层-Y输出层。上述内容即为前向传播实则就是努力去构建一个函数用未知数X猜出Y的值目标是去算出w和b两个变量。2. 如何求解w和b什么样的参数是好的 总的真实值与预测值的差距尽量小为解决绝对值计算困难产生了均方误差MSE的概念来解释损失函数Loss一般用L表示的好坏其中的预测值就是根据函数模型来的即想得到最好的函数模型使损失函数最小就是求解让L最小的w和b的值。求w和b式子展开代入化简后求偏导等于0求解找到损失函数中w和b在这个函数中所应取到的最小值二元函数上述求解方法即为传统的线性回归。此外现实计算中不能简单求偏导求到最优这种情况即可用wb值去试试是有参考性的试值过程中w和b的改变也会引起损失函数值的改变这种改变就是其偏导数的值。这种方法即为梯度下降。第t次迭代和第t-1次迭代的公式如下这里引入了学习率的概念其中η为学习率就转换为了求两个偏导数的值由最初的X输入层-a隐藏层-Y输出层推导出可见由x到L的链式关系故可用链式求导法则求到w和b的偏导是我们要求的那个目标激活函数的未知变量以为例可见求L对的偏导可以看作从右到左式子依次求偏导也就是从后往前依次求偏导此后以求导为依据更新参数。神经网络的一次训练前向传播一次从x计算到y之后后向传播求偏导更新参数。3. 前述方法问题与解决方法过拟合训练数据上表现很好但是在新数据上很糟糕的现象泛化能力在没见过的数据上的表现能力。如何解决过拟合简化模型防止学会其中的噪声和正常的随机波动增加数据量如果无法收集尝试数据增强从原数据创造一些新数据以增强模型的鲁棒性训练时在损失函数中进行修改使其为为正则化系数M为层数深度j为第j层。此方法为正则化方法其一为L1正则化其二为L2正则化因绝对值之和为L1范数平方和的平方根为L2范数其中L2正则化用的为L2范数的平方Dropout丢弃随机丢弃一些参数在某些训练时不会过度依赖某个参数以增强所有参数的鲁棒性。此外训练时会出现的问题还有梯度消失激活函数导数 1连乘衰减、梯度爆炸导数 1 或初始化过大连乘增长、收敛速度过慢病态曲率、鞍点、学习率难调、计算开销过大参数/数据规模庞大等。4. CNN参考矩阵运算抽象为即有在神经网络中根据前后关系也就有了L为层数每一层的输入是上一层的输出。方便GPU进行并行运算。对于图片由于全连接FC所有神经元都连接起来例如输入有10个输出有20个则参数量为200的参数量过大且要将二维图片展为一维向量容易丢失空间结构因此提出了CNN卷积神经网络引入卷积核实则可以看成是9个参数由此构成了卷积层Conv又有池化层Pooling压缩特征图尺寸下采样保留最重要信息则CNN的神经网络可以看为可以有多个池化层和卷积层以及全连接层。适合静态数据图片等。5. RNN目的是区分一个句子中不同词的词性最初是如何在计算机中表示一个词产生了词嵌入概念即通过深度学习的方法获得可以表达一个词的向量。把这些向量送入神经网络依旧出现了类似于CNN的问题并且一个词的词义无法和这个句子中前一个或几个词的词义联系起来故产生了RNN循环神经网络在隐藏层将结果传入H作为后续词义解析参考的信息其中右上尖括号值为词语在句中位置h为其中RNN的特色内容向下一位置的解析传播同一套应用于序列的所有时间步权值共享。RNN公式总结来说为多了前一时期的隐藏状态传入。但是RNN也存在一些问题即无法捕捉长期依赖长句子无法并行计算GRU和LSTM改进缓解无法根治因此诞生Transformer。三、Transformer1. 自注意力机制给句子中每个词加一个位置编码把这个位置编码加入上述的词向量即拥有了在句子中的位置信息那么如何拥有上下文信息设置新的三个矩阵可以理解成上面的参数但是是以矩阵的形式训练的时候主要是训练这三个矩阵:将每个词的词向量与相同的上述三个矩阵分别相乘得到词向量的n为第几个词。在实际计算中多列词向量构成了一个大的词矩阵因此相乘出的结果就是q矩阵k矩阵v矩阵上述三者中每一列代表了每一个词所对应的内容。其中q: Query查询我在找什么信息k: Key键我能提供什么信息的关键字v: Value值我实际能提供的信息内容其后把第一个词的q与包含自己的其他词的k做点积就能得到这个词和其他的相似度后分别拿这个相似度与各个对应的v值相乘各个结果相加得到一个加和后的值即得到了对于第一个词的上下文有关的信息扩展到每个词简言之就是在第个词的视角下把每个词的权重都有所顾及把全部上下文信息都包含了进来。此外为了防止点积过大导致梯度消失将上述式子变形为特别除了一个,即K向量的维度的开根号又有softmax归一化保证权重不会很大方便后续训练。得到上述公式后就得到了注意力矩阵中位置的值推广至矩阵运算就能得到Transformer中自注意力机制输入最基本的词向量对《Attention Is All You Need》中是以上标标注q、k、v的实际意义和上文中的符号意义相同分别投影计算得分即上文提及的把第一个词的q与包含自己的其他词的k做点积得到这个词和其他的相似度这里是矩阵形式上文展示了向量中的一个值的求法这里是得分矩阵由上文最初的构成。之后进行Softmax归一化:这里的矩阵注意力权重矩阵就是由后面softmax后的构成的。最后根据上文的一个值的求法对应的得到最后上下文矩阵注意力函数其输出就是上下文矩阵这就是自注意力机制。2. 多头注意力机制多头注意力就是把单头注意力的整个流程用多组不同的并行跑多次得到多个输出再把它们拼接起来。每个头按照上述的自注意力机制去得到自己的上下文矩阵h为头的序号每个头都会产生一个。之后将这些矩阵进行拼接得到多头注意力输出其中是输出投影矩阵作用在拼接后的多头输出上把多头的特征融合成最终的表示。这里的拼接指的是类如词一在第一个头对于其他词产生了[1,2,3]第二个头则[4,5,6]拼接之后为[1,2,3,4,5,6]也就是维度改变不会新增行数。3. 残差连接与层归一化Add Norm残差连接Add就是在子层输入和输出之间加一条直连运算把最初的输入和多头注意力的输出相加目的是保证梯度无论如何梯度都能保持大于X从根本上缓解了梯度越来越小的梯度消失。层归一化LayerNormLN则是用类似正态分布的方式强制把输出分布近似于正态分布防止残差相加后的数值爆炸。下述式子分别是Transformer原始论文中的Post-LN以及现代大模型主流的Pre-LN残差连接与归一化在现代主流中Sublayer表示Transformer架构中的各种层包含多头自注意力、FFN、交叉注意力。现代的大模型算法先把输入层归一化后进行sublayer处理然后再残差连接Pre-LN。4. 前馈网络Position-wise Feed-Forward NetworksFFN由上述注意力机制的原理可见Transformer做的都是线性运算例如加权求和操作只是线性变换的组合因此为使模型可以更好的表达需要表达的事务需要引入非线性变换内容故提出前馈神经网络FFN来进行表达。FFN由三部分构成升维、激活函数、降维。升维就是将得到的矩阵升维展开细分其中内容以便寻求更好的表达激活函数通过一个激活函数对进行处理达到非线性的需求Transformer原文是采用ReLU激活函数降维将细节处理完毕之后的矩阵缩放回原来的维度上述的W和b伙同最初的QKV三个W矩阵相同都是最初随机值通过学习得到。5. 交叉注意力机制Transformer分为Encoder和Decoder。Decoder中独有的、连接 Encoder 与 Decoder 的信息桥梁用一方去查另一方——Q 来自 DecoderK 和 V 来自 Encoder。即Decoder去Encoder查字典类似于翻译中用英文单词找到词典中与其最相似的汉语词汇通过计算 Q 与所有 K 的相似度并归一化得到注意力权重矩阵再以该权重对 V 进行加权求和从而将源序列中与当前生成任务最相关的信息提取并融合为一个新的上下文矩阵输出给 Decoder 的后续子层。Cross-Attention的注意力权重矩阵​ A[i][j]就是Decoder的第i个词对于Encoder的第j个词的相似度得分。6. Liner层与最后的SoftmaxDecoder中最后处理部分的层经过交叉注意力以及一系列残差连接、归一化和前馈网络最后会输出一个m个位置的上下文向量也就是输入的每个词Q对于不同位置K的权重经过一系列优化后的结果。把这个上下文信息的矩阵进行与一个叫做输出投影矩阵W可理解为用于给上下文信息矩阵打分存有词语的隐含意义)进行点乘加入适当的偏置b就能得出每个位置对于每个词的分数logits例如解码策略是贪心策略时就是当生成一句话时这个位置大概率最可能生成哪个词就是那个权重最大的那个词。上述Liner层输出了各个位置对于各个词的原始匹配分最后的Softmax层就负责将这个匹配分分布成符合符合概率分布的结果所有值介于0到1之间且和为1拉大高分数和低分数的差距让模型的判断更明确。7. Encoder-Decoder 整体架构图 Attention Is All Your Need中的整体架构示意图Encoder编码器负责源序列语义理解的编码模块。在上图的左半部分经过嵌入和位置编码输入到多次进行的多头注意力模块以及残差连接、归一化随后进入前馈网络增加非线性的能力之后同样残差连接归一化……最后编码器输出KV矩阵传入解码器。Decoder解码器依旧是经过嵌入和位置编码输入但是其后注意力模块包含掩码即使句子从左到右词语依次输入遮盖后续内容防止当前位置看到未来词。经过多头注意力后残差连接、归一化随后进入到一个交叉注意力的部分它的输入是编码器传来的K、V和解码器前述内容的Q输出一个一个新的上下文矩阵随后依旧是通过残差、归一化、前馈、残差、归一化执行N次最后经过Liner层和Softmax得到可能性输出。四、Transformer其他知识点1. 嵌入矩阵嵌入矩阵是Transformer输入时候的第一个要进入的模块是指按照输入通过分词器Tokenizer分为几个词Token然后根据这几个token的数字表示在嵌入矩阵找出对应的位置上的向量类似于数组下标的样子。初始的嵌入矩阵是随机的在训练过程中会随着其他矩阵一起在反向传播过程中更新最后会变得含有有效信息。现代的算法中Liner层的常常等同于嵌入矩阵的转置被称为参数共享。2. Transformer的训练总体的训练过程和“入门”部分算w和b的方法相似无非是更新的不只是一个参数而是一个矩阵同样满足“前向传播算损失 → 反向传播算梯度 → 梯度下降更新参数”的过程。五、后记转眼间就差一个月也该读研一了到现在为止只是扩展了一下之前学的Golang然后学了一下LLM的基础也就是这篇文章。回看本科时的几篇文章确实也挺慨叹的不过考研也是顺利落地了唯恐浪费时间所以就每天稍微学一点保持一下状态后面没想好要做什么其实golang还有一部分内容没有学到时候时机成熟再学吧。才疏学浅上面的内容都是自己看了一些视频外加询问AI自己总结的可能也有表达有误的地方尽请拨冗指正。
返回列表