每日一点编程小知识, 跟着尕燚龙体验编程乐趣,畅游编程海洋
第一章 大模型之基础知识
第1 节
亲爱的同学们,欢迎来到尕燚龙的编程课堂。今天我们将开启大模型编程系列的教程。在这个人工智能飞速发展的时代,大模型已经成为了我们不可或缺的提效工具。它能够像人类一样与我们对话,理解各种不同的语言,帮我们处理复杂的任务,统计归纳海量数据的关系,生成具有创意的内容等等。可以说大模型在方方面面展现出了惊人的能力。那么,什么是大模型呢?它与传统的深度学习模型有何区别?又有哪些显著的优势?大模型的网络结构与工作机制是什么?接下来,让我们一起揭开大模型的神秘面纱。
首先,让我们从大模型的定义开始。大模型,顾名思义,是指那些拥有海量参数的深度学习模型。这些模型通常包含数十亿甚至数百亿个参数,例如: OpenAI 公司的 GPT-3 有 1750 亿参数, GPT-4 有 1.8 万亿参数。因为拥有海量参数,这使得大模型能够更好的捕捉到数据中的细微特征,从而能理解更复杂的语义和处理更具有挑战的任务。
与传统的深度学习模型 对比 一下,先说说 大模型 不如传统深度学习模型的方面,包括:传统深度学习模型的推理速度较快,模型结构相对简单,在处理特定任务时表现较好,例如:命名实体识别、目标检测等。
说完 大模型 不如传统深度学习模型的方面,在说说大模型 优于 传统深度学习模型的方面,主要包括两点:
因为受到参数和网络结构限制,传统深度学习无法处理复杂的任务。具体来说: CNN 网络虽然擅长捕捉局部特征,但缺乏整体的上下文信息,在图像语义理解与位置关系说明等复杂任务上显得力不从心。 RNN 与 LSTM 网络虽然能够处理序列数据,但它们只能按顺序逐个处理序列,无法并行处理序列,全局信息捕捉能力较弱,对长文本训练容易出现梯度消失或梯度爆炸等问题。这就导致这两个模型无法完成长文本理解与关键信息提取等复杂任务 。大模型因为利用了 Transformer 网络结构,巧妙地解决了传统深度学习模型存在的这些问题,实现了对长文本、复杂语义的深刻理解。
传统深度学习模型的泛化能力较弱,即针对特定任务训练后很难迁移到其他任务上。 而大模型因为经过预训练学习了大量的数据和知识,在特定任务上进行微调后,就可以展现出更好的泛化能力和多任务处理能力。 以下是几个具体的示例:
文案撰写:大模型能够理解复杂的语言结构和语境,生成高质量的文案。例如,使用 GPT-4 生成的文案不仅语法正确,还能准确传达作者的意图。
数据统计与理解: 大模型能够处理和分析大量的数据,提取关键信息。 例如: 在金融领域,大模型可以帮助分析师快速理解市场趋势和做出决策。
代码生成:大模型可以用于生成或补全代码。例如, GitHub 推出的 Copilot 功能就是基于大模型技术,能够根据开发者的注释和代码上下文,自动生成代码片段,极大地提高了编程的效率。
上面讲到大模型是利用 Transformer 网络结构来实现的,接下来我们详细介绍一下 Transformer 网络结构。 Transformer 网络结构是由 Vaswani 等人在 2017 年的论文《 Attention is All You Need 》中提出的。该网络结构采用并行处理序列数据的方式,通过加入位置编码和多个自注意力机制( self-attention ),来学习序列的顺序信息和序列之间的相互关系。其网络结构图如下所示:
按模块划分,网络可以被分为四个模块,粉色的是输入模块,左边灰色框是编码模块(encoder block ),右边灰色框是解码模块(decoder block ),最上方是输出模块,下面 我们来依次对这些模块里的网络层进行介绍:
嵌入层( input/output
embedding ):将输入序列的每个文本嵌入到一个高维向量来表示,将文本转换为向量形式,可以让模型学习单词之间的语义相似性。嵌入的方式有很多,例如按词表矩阵对每个文本进行向量初始化,或直接使用一些 Embedding 模型,如: Word2Vec 、 Glove 等模型来进行向量初始化。
位置编码层( positional
encoding ):由于 Transformer 是并行处理序列,序列 之间 存在顺序关系的理解,因此需要位置编码来学习序列的顺序关系,这对捕捉 序列 的时间动态和促进准确理解至关重要。位置编码主要分为两种:绝对位置编码和相对位置编码,在 Transformer 结构中,采用的是相对位置编码,编码方式利用了三角函数来计算,其公式为:
其中, pos 是序列的位置, d 是维度(与嵌入层向量维度相同), 2i 是偶数维度, 2i+1 是奇数维度。
多头自注意力机制层( multi-head
attention ):多头自注意力机制层 Transformer 的核心,在 介绍 多头自注意力机制层之前,先介绍一下自注意力机制层( self attention ),如下图所示:
下面来解释一下这个图,输入序列 X ,通过与三个线性变换矩阵 WQ 、 WK 、 WV 相乘得到 Q 、 K 、 V 三个矩阵, Q 、 K 、 V 三个矩阵分布表示:查询向量( Q )、键向量( K )、值向量( V ), Q 、 K 、 V 三个矩阵按如下公式计算来得到注意力机制结果:
这里, dk 是键向量( K )的维度, T 表示矩阵转置, softmax 是做归一化指数操作。用一个图来表示计算过程为:
介绍完自注意力机制层,在来说一下多头注意力机制层,如下图所示:
从图中不难看出,多头注意力机制就是多个自注意力机制层的叠加,即利用 Concat 操作将所有自注意力机制的结果 Zi 拼接在一起,然后通过一个线性层,输出得到多头注意力机制的最终结果 Z ,用图表示为:
使用多头注意力机制的好处是:它能够同时关注输入序列的不同部分,扩展了模型专注于不同位置的能力。
残差 & 归一化层( add&norm ):在每个子层之间加入残差连接和归一化,残差连接可以提升模型训练的稳定性,防止模型梯度消失和爆炸,归一化可以加快模型训练的速度,帮助模型稳定学习。
前馈神经网络层( feed
forward ):前馈神经网络层 由 两个全连接层组成,第一个全连接层后加入 RELU 激活函数进行非线性 映射 ,其公式如下所示:
输出层:由全连接层与 softmax 层组成,输出最终的结果。
介绍完网络层,在回来说一下编码模块(encoder block )与解码模块(decoder block ),transformer 网络中的编码模块与解码模块都有6 个,每个编码模块有一个多头注意力机制层,每个解码模块有两个多头注意力机制层,需要注意的是:解码模块的第一个多头注意力机制层需要加入掩码操作(Mask )。即每个位置都遮盖了它后面的序列,计算过程如下图所示:
在第二个多头注意力机制层的K, V 矩阵使用编码模块的 残差 & 归一化层的输出 结果,而Q 矩阵使用上一个解码模块的输出。
下面我们用 pytorch 来实现上面介绍的一些网络层与模块,包括:自注意力机制层、多头自注意力机制层、位置编码、位置掩码以及编码模块:
这里使用 torch.einsum 函数来进行 Q 、 K 、 V 之间的点乘,也可以使用 torch.matmul 来进行计算
这里 div_term 是分母,其计算的转换公式利用了对数的换底公式,如下所示:
register_buffer 是 nn.Module 的一个方法,作用是记录不需要计算梯度但要跟随模型参数一起保存、加载或者移动 (cuda) 的变量。
这里的 input1 确定维度大小, input2 确定掩码( mask )位置, padmask 是 1 表示保留对应位置的序列, 0 表示不保留对应位置的序列。
通过今天的讲解,我们对大模型有了 初步 的了解。 包括 介绍大模型是什么、大模型与传统深度学习模型的区别、大模型的优势、以及大模型的网络结构 Transformer ,通过网络结构说明了大模型的工作机制,最后我们用 Pytorch 实现了部分大模型的网络结构,这对理解大模型的内部算法很有帮助。在 下次 课程中,我们将进一步介绍常用的编码模型、解码模型和编解码模型,以及使用 transformers 模块处理大模型。亲爱的同学们,今天的课程就到这里。希望你们对大模型有了较为清晰的认识,并期待下次课程中我们能一起探索更多关于 大 模型的知识。下次见!
文章导航