.. _chap_2: 生命周期 ======== 构建一个实际可用的人工智能模型包括四个主要阶段,如 :numref:`fig_生命周期` 所示。首先,进行数据收集,准备所需的训练数据。接着,进行模型训练,让模型从数据中自动学习。然后,通过测试和改进,评估和优化模型性能。最后,将训练好的模型部署到实际环境中供用户使用。 .. _fig_生命周期: .. figure:: images/2_生命周期.png :width: 900px 人工智能模型开发生命周期 .. _sec_data_collection: 数据收集 -------- 就像建造高楼需要坚实的基石,优质的数据是培养强大人工智能模型的关键。通过数据,人工智能学会了图像识别、语言理解甚至未来预测。选择和处理高质量数据是塑造卓越人工智能的关键。在本节中,我们将通过五个经典数据集,介绍数据的收集和处理方法。 图像数据 ~~~~~~~~ .. _fig_ImageNet_Logo: .. figure:: images/2.1.1_Imagenet.jpeg :width: 810px ImageNet数据集 **ImageNet** :cite:`deng2009imagenet` 是一个庞大的计算机视觉数据集,包含超过一千万张图片和高质量人工标注,广泛用于目标识别和图像分类等任务(见 :numref:`fig_ImageNet_Logo` )。构建ImageNet的第一步是从互联网上收集大量候选图像,这些图像的初步准确率约为10%。为了增加图像数量,ImageNet使用多个关键词搜索相关图像,例如搜索“whippet”(一种犬类)时,不仅包括“whippet dog”和“whippet greyhound”,还翻译关键词为中文、西班牙文、荷兰文和意大利文,从而扩展搜索范围。最终,为每种含义收集了超过一万张候选图片。 获取候选图片后,需对其进行清洗。ImageNet利用AMT平台 :cite:`4562953` 发布人工标注任务,邀请大量AMT用户参与数据清洗。标注的目的是排除与目标含义不符的图像。例如,若“whippet”图片中不包含该犬类,则该图像被排除。ImageNet采用投票方式,将每张图片分配给多个人进行判断,只有在获得多数正面反馈时,该图片才被纳入数据集。 .. _fig_Cityscapes: .. figure:: images/2.1.1_Cologne.png :width: 810px Cityscapes数据集中对德国科隆市的高质量密集像素级标注 **Cityscapes** :cite:`Cordts_2016_CVPR` 是一个大规模的城市场景图像数据集,专门用于语义分割和目标检测。该数据集包含50个城市的复杂街景图像,为城市环境中的自动驾驶研究提供支持。通过在车辆上安装摄像头录制视频,Cityscapes共获取了数十万帧图像。其中,5000张来自27个城市的图像经过了精细的像素级标注(见 :numref:`fig_Cityscapes` ),此外,来自23个城市的20000张图像进行了粗略标注。标注内容包括30类对象(如行人、车辆)的多边形框和语义标签。精细标注的图像还包含对象的深度排序信息。数据集中还附带了车辆航位、外部温度和GPS轨迹等信息。 在图像处理过程中,Cityscapes进行了Debayer操作和内外部校准 :cite:`10.1117/12.545396` 。Debayer操作通过对邻近像素的颜色信息进行插值,填补单通道彩色图像中的缺失颜色信息,从而生成完整的彩色图像。 文本数据 ~~~~~~~~ **Common Crawl**\ [1]_ 是一个开源网络抓取项目,提供了大量的网页数据,规模达到拍字节(Petabyte,PB)级,对当前人工智能发展至关重要。例如,在GPT-3的训练数据中,Common Crawl占据了60% :cite:`brown2020language` 。该项目利用网页爬虫技术定期从互联网获取原始网页数据(WARC)、元数据(WAT)以及文本提取(WET)。 尽管Common Crawl数据集规模巨大,但数据较为杂乱,需进行清洗和预处理。GPT-3的预处理分为三个步骤:首先,训练分类器区分高质量和低质量文本,过滤掉低质量数据;其次,采用模糊去重技术删除重复部分,提升模型质量并防止过拟合;最后,加入其他高质量文本数据(如维基百科)以进一步提升数据集质量。 .. _fig_Alpaca: .. figure:: images/2.1.2_Alpaca.png :width: 450px Alpaca训练集的收集过程 **Alpaca训练集** Alpaca :cite:`taori2023alpaca` 是一个对话语言模型,通过对LLaMA 7B :cite:`touvron2023llama` 模型进行监督微调得到。其训练数据源于OpenAI的text-davinci-003模型生成的指令跟随式数据。构建训练集时,研究者首先手动创建了一个包含175条“指令-输出”对的种子任务集,每条对包含一个指令和相应的输出(见 :numref:`fig_Alpaca` )。例如,指令“列出一些新年计划”对应的输出为“减肥、多锻炼、健康饮食”。随后,研究者使用text-davinci-003模型基于该种子任务集生成了52000条“指令-输出”对,构成了Alpaca的训练集。 然而,一些学者发现Alpaca的训练集中存在缺陷,如生成数据中出现幻觉、输出为空或不合法、指令不清晰、不合理,甚至包含生成图片的指令。为解决这些问题,Alpaca-cleaned项目 [2]_ 对训练集进行了清理,得到了更干净、质量更高的数据集。 多模态数据 ~~~~~~~~~~ **LAION** :cite:`schuhmann2022laion` 是一个大规模的多模态图文数据集,包含约58.5亿个“图像-文本”对。该数据集的构建基于前文提到的Common Crawl数据集。具体而言,LAION利用Common Crawl的元数据文件,通过解析HTML IMG标签,查找带有alt-text的图像,并将这些图像与对应的alt-text配对,形成图文对。alt-text是指图像无法显示时提供的替代文本。接着,LAION使用CLD3 :cite:`cld3` 进行文本语言检测,并对图文对进行分类,以区分文本语言为英语、其他语言或未知语言。 LAION的数据预处理分为两个步骤。首先,对Common Crawl的元数据进行筛选,剔除图像过小、替代文本过短,以及可能是恶意、大型或冗余的图像,以确保数据集的质量。其次,使用ViT-B/32 CLIP :cite:`radford2021learning` 模型计算图像和文本的余弦相似度,删除相似度过低的图文对,以保留具有较强语义关联的图文对。经过这些处理,数据集中保留了约58.5亿个样本,删除了约90%的原始图文对。 :numref:`fig_LAION` 展示了一个LAION数据集的例子。 .. _fig_LAION: .. figure:: images/2.1.3_LAION(横).png :width: 450px LAION-5B数据集中的一个英文图文对样例 **Conceptual Captions** 谷歌公司的Conceptual Captions 3M(简称CC3M) :cite:`sharma2018conceptual` 是一个包含330万个“图像-文本”对的多模态数据集。著名开源多模态大模型LLaVA :cite:`liu2024visual` 即是在经过过滤的CC3M子集CC-595K上进行预训练的。CC3M首先通过在互联网上搜索图像及其关联的alt-text文本,构建候选“图像-文本”对。接着,通过自动化流程对这些候选对进行提取、过滤和转换,以确保文本的干净程度、信息量、流畅性和可学习性。该流程包括以下四个步骤: 1. **图像过滤**\ : 这一步对图像进行初步筛选,仅保留长宽均大于400像素且长宽比不超过2的JPEG图像,并剔除包含不良内容的图像,删除约65%的候选图像。 2. **文本过滤**\ : 在这一步,CC3M利用Google Cloud Natural Language API分析alt-text内容,剔除结构不良、重复词汇多、首字母未大写或大写词汇过多、包含不常见词汇、极端评价、不良信息以及包含固定前缀或后缀的文本数据,最终留下约3%的文本。 3. **图文过滤**\ : 除了对图像和文本单独过滤外,还检查图文对的匹配度。利用Google Cloud Vision API对每张图像分配5到20个标签,判断文本内容是否与这些标签匹配,这一步筛选掉了60%的数据。 4. **文本转换**\ : 在前三个步骤中,已过滤掉99%的候选数据。最后,通过Google Knowledge Graph Search API和Google Cloud Natural Language API将难以学习的专有名词转换为更通用的超义词,例如,将“ Harrison Ford”替换为“演员”。然后,按解析后的实体(如“演员”)聚类,仅保留类内样本数量超过100的“图像-文本”对,确保数据集的代表性。 :numref:`fig_CC` 展示了一个经过CC3M筛选的“图像-文本”对示例:左侧是筛选后的图像,右上角的alt-text为原始图片描述,右下角的Conceptual Captions文本为处理后的文本。 .. _fig_CC: .. figure:: images/2.1.3_CC.png :width: 810px CC3M数据集中的样本示例 **LLaVA微调训练集** 多模态大模型LLaVA使用CC-595K数据集进行预训练。预训练后,LLaVA在其他大模型生成的数据上进行了微调。具体而言,LLaVA首先利用ChatGPT或GPT-4在COCO数据集 :cite:`10.1007/978-3-319-10602-1_48` 的基础上生成了指令跟随数据集LLaVA-Instruct-158K :cite:`liu2024visual` 。为保持指令和回答的多样性与深入推理,LLaVA将每张图片描述为两段文字:一段描述图片中的场景,另一段描述物体的概念和边界框位置。这些描述作为提示词输入ChatGPT或GPT-4中。例如, :numref:`fig_LLaVA-Instruct-158K` 中的图片场景描述为:“一群人站在一辆黑色SUV外面,带着各种行李,试图将所有行李装进车辆中。” 对物体的描述为:“人:[0.681, 0.242, 0.774, 0.694],背包:[0.384, 0.696, 0.485, 0.914],行李箱:…” 。 .. _fig_LLaVA-Instruct-158K: .. figure:: images/2.1.3_LLaVA-Instruct-158K.png :width: 720px LLaVA-Instruct-158K数据集图片示例 LLaVA设计了三种输出模式: 1. **对话类型**\ :大语言模型提出问题并回答,涵盖物体类型、数量、行为、位置和相对位置等。例如:“提问:图片中的汽车是什么类型的?回答:图片中有一辆黑色SUV。” 2. **详细描述类型**\ :对图片进行详细描述。例如:“图片显示的是一个地下停车场,一辆黑色SUV停在那里,场景中有三个人正在将行李装进SUV中……”。 3. **复杂推理类型**\ :类似对话类型的问答,但要求更深入的推理。例如:“提问:这些人面临什么困难?回答:他们在将各种行李装进SUV中面临挑战……”。 LLaVA仅手工设计了少量示例,其他输出由大语言模型自动生成。最终,LLaVA收集了约158,000个“图像-文本”指令跟随数据样本,包括58,000个对话、23,000个详细描述和77,000个复杂推理样例。 .. _sec_model training and ft: 模型训练与微调 -------------- 在人工智能模型的生命周期中,模型训练和微调是构建高效智能系统的核心环节。人工智能模型不仅需要坚实的数据基础,还需经过精心的训练和微调才能稳定发挥作用。经过细致训练和调整的模型才能在特定任务中实现最佳性能。本节将详细探讨如何通过科学的训练方法和巧妙的微调技术,将人工智能模型打造为应对各种复杂问题的强大工具。 标准训练 ~~~~~~~~ 模型训练旨在通过特定算法在大量数据上优化模型,使其具备完成特定任务的能力。在这一过程中,模型参数会被调整,以学习复杂的表征并提高泛化能力。 以\ **有监督学习**\ 为例,假设模型将从样本空间 :math:`{\mathcal{X}}`\ 中获取所有可能的样本。我们希望训练一个模型\ :math:`f`\ (如线性模型或神经网络),将样本\ :math:`{\boldsymbol{x}}`\ 准确映射到其真实标签\ :math:`y`\ 。这一过程被称为\ **期望风险最小化**\ ,目标是: .. math:: \min_{\theta} \mathbb{E}_{({\boldsymbol{x}}, y) \sim p({\boldsymbol{x}}, y)}\left[{\mathcal{L}}(f({\boldsymbol{x}}), y)\right] 其中, :math:`p({\boldsymbol{x}}, y)`\ 是数据的真实分布,\ :math:`\theta`\ 是模型\ :math:`f`\ 的参数,\ :math:`{\mathcal{L}}(\cdot, \cdot)` 是损失函数,例如平方损失: .. math:: {\mathcal{L}}(f({\boldsymbol{x}}), y) = \frac{1}{2}(f({\boldsymbol{x}}) - y)^2 由于真实数据分布通常未知,我们使用\ **经验风险最小化**\ ,在数据集 :math:`D` 上进行优化: .. math:: \min_{\theta} \mathbb{E}_{({\boldsymbol{x}}, y) \in D}\left[{\mathcal{L}}(f({\boldsymbol{x}}), y)\right] 当数据集 :math:`D`\ 趋近于样本空间\ :math:`{\mathcal{X}}`\ 时,经验风险最小化的结果接近于期望风险最小化。然而,实际数据集\ :math:`D` 可能仅为样本空间的一个小子集,存在过拟合风险。为此,我们在最小化经验风险时加入正则化项,即\ **结构风险最小化**\ : .. math:: \min_{\theta} \mathbb{E}_{({\boldsymbol{x}}, y) \in D}\left[{\mathcal{L}}(f({\boldsymbol{x}}), y) + \lambda J(f)\right] 其中 :math:`J(f)`\ 表示模型复杂度,通常使用模型参数的\ :math:`L_2`\ 范数表示,\ :math:`\lambda` 是正则化系数,用于平衡损失项和正则化项。 选择优化算法时,我们通常使用\ **梯度下降法**\ 。由于目标函数可能不是凸的,我们利用梯度信息迭代地寻找极小值点: .. math:: \theta := \theta - \alpha \frac{\partial \mathbb{E}_{({\boldsymbol{x}}, y) \in D}[{\mathcal{L}}(f({\boldsymbol{x}}), y)]}{\partial \theta} 其中 :math:`\alpha` 是步长,决定了每步更新的幅度。 每次遍历所有训练样本称为一个\ *周期*\ 或\ *轮次*\ (epoch)。经过若干周期后,模型的经验风险会收敛到一个极小值,但可能是局部最小值或鞍点。为解决这些问题,\ **随机梯度下降**\ (SGD)和\ **小批量梯度下降**\ (Mini-batch Gradient Descent)等方法应运而生。SGD 在每次迭代中仅使用一个样本,而小批量梯度下降则使用数据集中的一个小子集。此外,还提出了多种改进算法,如 AdaGrad、RMSProp、Adam 和 AdamW,以提高模型的收敛速度并避免局部最优解。 对于\ **无监督学习**\ 任务,数据中不包含标签信息 :math:`y`\ 。这些任务要求算法在无标注的数据上自主学习数据的内在知识,包括特征降维、异常检测、概率密度估计、聚类和表征学习等。无监督学习过程如下: .. math:: \begin{aligned}\text{学习}: & \quad {\mathcal{A}}(D) \rightarrow f \\\text{使用}: & \quad f(X) \rightarrow r\end{aligned} 其中, :math:`{\mathcal{A}}`\ 是学习算法,\ :math:`D`\ 是数据集,\ :math:`f`\ 是学习得到的模型,\ :math:`X`\ 是输入数据,\ :math:`r` 是分析结果。 接下来,我们将介绍经典的图像模型和文本模型结构及其训练方法。 .. _fig_CNN: .. figure:: images/2.2.1_CNN.png :width: 499px 卷积神经网络结构示意图 图像模型 ^^^^^^^^ 图像模型通过分析图片中的像素信息来识别、分类和理解图像内容,是计算机视觉任务的核心模型。 **卷积神经网络**\ (Convolutional Neural Network, CNN)是一种经典的图像模型,如 :numref:`fig_CNN` 所示。卷积神经网络使用\ *卷积层*\ 提取图像特征,帮助模型识别图像中的模式和结构。通过\ *池化层*\ 对特征图进行下采样,减少数据量同时保留关键信息,从而提高模型的计算效率和鲁棒性。 在\ *卷积层*\ 中,使用一个小型矩阵作为卷积核,通过滑动计算生成特征图。 :numref:`fig_卷积` 展示了一个卷积操作的步骤。计算公式为: .. math:: 0×(-1) + 3×0 + 3×1 + 3×(-1) + 5×0 + 2×1 + 6×(-1) + 8×0 + 8×1 = 4 其他图像部分经过相同的卷积操作后,即可得到整张图像的卷积输出。 .. _fig_卷积: .. figure:: images/2.2.1_卷积示意图.png :width: 720px 卷积操作示意图 *池化层*\ 如 :numref:`fig_池化` 所示。经典的池化操作有两种:最大池化和平均池化。最大池化在每个池化窗口中选择最大值作为输出,而平均池化计算窗口内元素的平均值作为输出。 .. _fig_池化: .. _sec_2.2.1.2: .. figure:: images/2.2.1_池化示意图.png :width: 523px 池化操作示意图 在卷积神经网络的训练过程中,可训练的参数包括卷积核的权重和偏置,以及全连接层的权重和偏置。这些参数通过\ **反向传播**\ (backpropagation)算法进行学习。每一轮的参数更新过程如下: 1. 对训练数据进行前向传播,计算第 :math:`l` 层的输出: .. math:: \begin{array}{l}{\boldsymbol{Z}}^{[l]} = {\boldsymbol{W}}^{[l]} * {\boldsymbol{A}}^{[l-1]} + {\boldsymbol{B}}^{[l]}, \\{\boldsymbol{A}}^{[l]} = \sigma({\boldsymbol{Z}}^{[l]})\end{array} 其中,\ :math:`{\boldsymbol{W}}^{[l]}`\ 是第\ :math:`l`\ 层的权重(卷积核),\ :math:`{\boldsymbol{A}}^{[l-1]}`\ 是上一层的激活输出,\ :math:`{\boldsymbol{B}}^{[l]}`\ 是偏置,\ :math:`\sigma(\cdot)` 是激活函数。 2. 使用模型的最终输出 :math:`\hat{{\boldsymbol{y}}}`\ 与实际标签\ :math:`{\boldsymbol{y}}`\ 计算损失\ :math:`{\mathcal{L}}(\hat{{\boldsymbol{y}}}, {\boldsymbol{y}})`\ 。 3. 通过反向传播算法计算损失对每个参数的梯度 :math:`\frac{\partial {\mathcal{L}}}{\partial {\boldsymbol{W}}^{[l]}}`\ 和\ :math:`\frac{\partial {\mathcal{L}}}{\partial {\boldsymbol{B}}^{[l]}}`\ 。 4. 更新参数: .. math:: \begin{array}{l}{\boldsymbol{W}}^{[l]} := {\boldsymbol{W}}^{[l]} - \alpha \frac{\partial {\mathcal{L}}}{\partial {\boldsymbol{W}}^{[l]}}, \\{\boldsymbol{B}}^{[l]} := {\boldsymbol{B}}^{[l]} - \alpha \frac{\partial {\mathcal{L}}}{\partial {\boldsymbol{B}}^{[l]}}\end{array} 其中,\ :math:`\alpha` 是学习率。 文本模型 ^^^^^^^^ 文本模型专注于处理和理解文本数据,通过学习文本中的语义和结构,使计算机能够更好地理解和应用自然语言。常见的应用任务包括文本分类、情感分析和命名实体识别。 **循环神经网络**\ (Recurrent Neural Network, RNN)是经典的文本模型之一。RNN具有记忆能力,能够捕捉文本中的上下文关系,在语言建模、机器翻译和文本生成等任务中表现优异。 :numref:`fig_RNN` 展示了简单循环神经网络 :cite:`elman1990finding` 沿时间维度展开的示意图。这里,\ :math:`{\boldsymbol{x}}_1, {\boldsymbol{x}}_2, {\boldsymbol{x}}_3`\ 是输入序列,\ :math:`\hat{{\boldsymbol{y}}}_1, \hat{{\boldsymbol{y}}}_2, \hat{{\boldsymbol{y}}}_3`\ 是输出序列,\ :math:`{\boldsymbol{h}}_t`\ 是时刻\ :math:`t`\ 的隐状态,它依赖于前一时刻的隐状态\ :math:`{\boldsymbol{h}}_{t-1}`\ 和当前输入\ :math:`{\boldsymbol{x}}_t`\ 。隐状态的计算公式为: .. math:: {\boldsymbol{h}}_t = \sigma({\boldsymbol{z}}_t) = \sigma({\boldsymbol{U}} {\boldsymbol{x}}_t + {\boldsymbol{W}} {\boldsymbol{h}}_{t-1}) 其中,\ :math:`{\boldsymbol{U}}`\ 和\ :math:`{\boldsymbol{W}}`\ 是权重矩阵,\ :math:`\sigma(\cdot)` 是非线性激活函数。循环神经网络的输出计算公式为: .. math:: \hat{{\boldsymbol{y}}}_t = {\boldsymbol{V}} {\boldsymbol{h}}_t 其中,\ :math:`{\boldsymbol{V}}` 是权重矩阵。 .. _fig_RNN: .. figure:: images/2.2.1_RNN网络结构.png :width: 540px 简单循环神经网络结构示意图 与卷积神经网络类似,循环神经网络也可以通过梯度下降进行训练。假设模型的输入序列为 :math:`{\boldsymbol{x}}_{1: T}`\ ,输出序列为\ :math:`\hat{{\boldsymbol{y}}}_{1: T}`\ 。对于时刻\ :math:`t`\ 的输出\ :math:`\hat{{\boldsymbol{y}}}_t`\ 和对应的监督信息\ :math:`{\boldsymbol{y}}_t`\ ,定义时刻\ :math:`t`\ 的损失函数为\ :math:`{\mathcal{L}}_t(\hat{{\boldsymbol{y}}}_t, {\boldsymbol{y}}_t) = {\mathcal{L}}_t({\boldsymbol{V}} {\boldsymbol{h}}_t, {\boldsymbol{y}}_t)`\ ,整个序列的损失函数为\ :math:`{\mathcal{L}} = \sum_{t=1}^T {\mathcal{L}}_t`\ 。该损失函数关于参数的梯度包括\ :math:`\frac{\partial {\mathcal{L}}}{\partial {\boldsymbol{U}}}`\ 、\ :math:`\frac{\partial {\mathcal{L}}}{\partial {\boldsymbol{W}}}`\ 和\ :math:`\frac{\partial {\mathcal{L}}}{\partial {\boldsymbol{V}}}`\ 。 循环神经网络的梯度计算主要有两种算法:\ **实时循环学习算法**\ (Real Time Recurrent Learning, RTRL) :cite:`williams2013gradient` 和 **随时间反向传播算法**\ (Backpropagation Through Time, BPTT) :cite:`williams1990efficient` 。 **实时循环学习算法**\ 的核心思想是在前向计算过程中即时计算隐状态对参数的偏导数,并通过链式法则实时更新损失函数对参数的梯度。假设第 :math:`t+1`\ 时刻的隐状态为\ :math:`{\boldsymbol{h}}_{t+1} = \sigma({\boldsymbol{U}} {\boldsymbol{x}}_{t+1} + {\boldsymbol{W}} {\boldsymbol{h}}_t)`\ 。以参数矩阵\ :math:`{\boldsymbol{W}}`\ 中的一个参数\ :math:`w_{i, j}`\ 为例,第\ :math:`t+1`\ 时刻的损失函数\ :math:`{\mathcal{L}}_{t+1}`\ 对\ :math:`w_{i, j}` 的偏导数计算如下: .. math:: \begin{aligned}\frac{\partial {\mathcal{L}}_{t+1}}{\partial w_{i, j}} & = \frac{\partial {\mathcal{L}}_{t+1}}{\partial {\boldsymbol{h}}_{t+1}} \frac{\partial {\boldsymbol{h}}_{t+1}}{\partial w_{i, j}} \\& = \frac{\partial {\mathcal{L}}_{t+1}}{\partial {\boldsymbol{h}}_{t+1}} ({\boldsymbol{I}}_i([{\boldsymbol{h}}_t]_j) + \frac{\partial {\boldsymbol{h}}_t}{\partial w_{i, j}} {\boldsymbol{W}}^{\top}) \frac{\partial {\boldsymbol{h}}_{t+1}}{\partial {\boldsymbol{z}}_{t+1}}\end{aligned} 其中,\ :math:`{\boldsymbol{I}}_i(x)`\ 是除第\ :math:`i`\ 行外其余值为 0 的行向量。实时循环学习算法从初始时刻开始,计算隐状态\ :math:`{\boldsymbol{h}}` 时也计算隐状态对参数的偏导数,从而按照时间顺序计算损失函数对参数的偏导数。 **随时间反向传播算法**\ 通过在时间上展开循环神经网络,将其视为一个前馈神经网络,然后利用反向传播算法计算各个时刻参数的梯度。以参数矩阵 :math:`{\boldsymbol{W}}`\ 中的一个参数\ :math:`w_{i, j}` 为例: .. math:: \begin{aligned}\frac{\partial {\mathcal{L}}_t}{\partial w_{i, j}} & = \sum_{k=1}^t \frac{\partial {\boldsymbol{z}}_k}{\partial w_{i, j}} \frac{\partial {\mathcal{L}}_t}{\partial {\boldsymbol{z}}_k} \\& = \sum_{k=1}^t {\boldsymbol{I}}_i([{\boldsymbol{h}}_{k-1}]_j) \frac{\partial {\mathcal{L}}_t}{\partial {\boldsymbol{z}}_k}\end{aligned} 其中, .. math:: \begin{aligned}\frac{\partial {\mathcal{L}}_t}{\partial {\boldsymbol{z}}_k} & = \frac{\partial {\boldsymbol{h}}_k}{\partial {\boldsymbol{z}}_k} \frac{\partial {\boldsymbol{z}}_{k+1}}{\partial {\boldsymbol{h}}_k} \frac{\partial {\mathcal{L}}_t}{\partial {\boldsymbol{z}}_{k+1}} \\& = \operatorname{diag}(\sigma^{\prime}({\boldsymbol{z}}_k)) {\boldsymbol{W}}^{\top} \frac{\partial {\mathcal{L}}_t}{\partial {\boldsymbol{z}}_{k+1}}\end{aligned} 将 :math:`\frac{\partial {\mathcal{L}}_t}{\partial {\boldsymbol{z}}_k}`\ 记作\ :math:`\delta_{t, k}`\ ,即为\ *误差项*\ ,则有: .. math:: \delta_{t, k} = \operatorname{diag}(\sigma^{\prime}({\boldsymbol{z}}_k)) {\boldsymbol{W}}^{\top} \delta_{t, k+1} 因此: .. math:: \frac{\partial {\mathcal{L}}_t}{\partial w_{i, j}} = \sum_{k=1}^t [\delta_{t, k}]_i [{\boldsymbol{h}}_{k-1}]_j 随时间反向传播算法将问题转化为标准的前馈神经网络以简化计算,但需要保存中间时刻的梯度,导致较大的存储开销。 .. _fig_Transformer: .. figure:: images/2.2.1_Transformer示意图.png :width: 335px Transformer结构示意图 除了经典的循环神经网络,\ **Transformer** :cite:`vaswani2017attention` 是一种开创性的文本模型结构,并已被扩展到视觉领域(如ViT :cite:`dosovitskiy2020image` ),成为现代大模型(如GPT-4 :cite:`achiam2023gpt` )的基础。Transformer摒弃了循环神经网络中的循环机制,改用\ *自注意力机制*\ 来学习输入和输出之间的依赖关系,并支持更大程度的并行化。 如 :numref:`fig_Transformer` 所示,Transformer 由编码器和解码器两部分组成。文本数据首先通过编码器进行编码,然后通过解码器进行解码并输出。经典的Transformer架构包含六个编码器和六个解码器。每个编码器包括一个\ *多头注意力层*\ 和一个前馈神经网络层,接收上一个编码器的输出作为输入;每个解码器包含两个多头注意力层和一个前馈神经网络层,接收上一个解码器的输出和整个编码器的输出作为输入。 在将文本数据输入模型之前,需要进行以下预处理: - **词元化**\ :将文本分割成词元。例如,文本“The cat sat on the mat”词元化后变为 [“The”,“cat”,“sat”,“on”,“the”,“mat”,“.”]。词元化并不总是一一对应,常用词组如“do not”可能被视为一个词元,而复杂词汇如“Antidisestablishmentarianism”可能被拆分为多个词元 [“Anti”,“dis”,“establish”,“ment”,“arian”,“ism”]。 - **词向量映射**\ :将每个词元映射到词向量空间。类似于地理坐标系,词向量空间中的距离反映了词元的语义相似度。由于语言的复杂性,词向量的维度通常很大,例如基础Transformer模型的词向量维度为512。 - **位置编码**\ :除了词义外,词元在上下文中的位置也很重要。Transformer通过位置编码来考虑词元的位置。位置编码使用正弦和余弦函数计算: .. math:: \begin{aligned}PE_{(\operatorname{pos}, 2i)} & = \sin (\operatorname{pos} / 10000^{2i/d_{model}}), \\PE_{(\operatorname{pos}, 2i+1)} & = \cos (\operatorname{pos} / 10000^{2i/d_{model}})\end{aligned} 其中,\ :math:`\operatorname{pos}`\ 表示词元的位置;\ :math:`2i`\ 和\ :math:`2i+1`\ 表示位置向量中的元素;\ :math:`10000`\ 是经验值;\ :math:`d_{model}` 是位置向量的维度,与词向量维度相等。 计算出词元的词向量和位置向量后,将它们相加,形成输入矩阵。这是Transformer模型的输入。Transformer的核心是\ **自注意力机制**\ 。自注意力机制使用三个向量:\ *查询向量* :math:`{\boldsymbol{Q}}`\ 、\ *键向量*\ :math:`{\boldsymbol{K}}`\ 和 *值向量*\ :math:`{\boldsymbol{V}}`\ ,这三者均由输入乘以对应的权重矩阵\ :math:`{\boldsymbol{W}}_{\boldsymbol{Q}}`\ 、\ :math:`{\boldsymbol{W}}_{\boldsymbol{K}}`\ 和\ :math:`{\boldsymbol{W}}_{\boldsymbol{V}}` 得到。这些权重矩阵是可学习的。自注意力的输出计算如下: .. math:: \operatorname{Attention}({\boldsymbol{Q}}, {\boldsymbol{K}}, {\boldsymbol{V}}) = \operatorname{softmax} \left( \frac{{\boldsymbol{Q}} {\boldsymbol{K}}^{\top}}{\sqrt{d_k}} \right) {\boldsymbol{V}} 其中,\ :math:`d_k`\ 是\ :math:`{\boldsymbol{K}}` 向量的维度。自注意力机制将上下文信息添加到原输入矩阵中。 **多头注意力**\ 是使用多组不同权重矩阵计算的 :math:`{\boldsymbol{Q}}`\ 、\ :math:`{\boldsymbol{K}}`\ 和\ :math:`{\boldsymbol{V}}`\ 向量,分别得到它们的输出矩阵后拼接,再通过一个线性层加权求和,得到最终的多头注意力层输出。解码器的第一个多头注意力层使用掩码操作,在预测第\ :math:`i`\ 个词时,遮住\ :math:`i+1` 之后的词信息。自注意力层之后还有一个全连接前馈神经网络层: .. math:: \operatorname{FFN}({\boldsymbol{x}}) = \max(0, {\boldsymbol{x}} {\boldsymbol{W}}_1 + {\boldsymbol{b}}_1) {\boldsymbol{W}}_2 + {\boldsymbol{b}}_2 其中,\ :math:`{\boldsymbol{W}}_1`\ 、\ :math:`{\boldsymbol{b}}_1`\ 、\ :math:`{\boldsymbol{W}}_2`\ 和\ :math:`{\boldsymbol{b}}_2` 为可学习的参数。Transformer使用梯度下降优化,并采用AdamW优化器进行参数更新。 .. _sec_2.2.2: 大规模预训练 ~~~~~~~~~~~~ 近年来,随着计算能力和数据量的显著提升,大规模预训练已经成为推动视觉、语言以及多模态大模型快速发展的关键技术。通过大规模预训练,模型能够学习到丰富的特征表示,从而在下游任务中展现出强大的泛化能力。下面将详细介绍服务于视觉大模型、大语言模型以及多模态大模型的大规模预训练方法。 视觉大模型预训练 ^^^^^^^^^^^^^^^^ .. _fig_2.2.2.1-ViT: .. figure:: images/2.2.2.1-ViT.png :width: 810px ViT结构示意图 视觉大模型的预训练在图像和视频处理任务中发挥了重要作用。以下是对主流视觉大模型——视觉Transformer(ViT)的基本结构的简要介绍,以及两种常用的视觉大模型预训练方法。 **视觉Transformer(ViT)** :cite:`dosovitskiy2020image` 模型借鉴了文本Transformer架构,是Transformer在视觉领域的重要扩展。ViT的核心思想是将图像分割为多个图像块(patch),将这些小块视为序列中的元素,并使用Transformer中的自注意力机制处理这些小块,实现对图像的全局感知。与传统卷积神经网络相比,ViT在捕捉图像中的长距离依赖关系方面具有更好的泛化能力和灵活性。 ViT的结构如 :numref:`fig_2.2.2.1-ViT` 所示,有三个主要特点: - **图像块切分**\ :ViT将图像分割为多个大小为16x16的正方形图像块,每个图像块通过全连接层映射为固定维度的向量序列,所有图像块的向量序列组成了Transformer的输入。 - **类别词元**\ :借鉴自然语言处理中的[CLS] token,ViT引入了一个特殊的类别词元,并将其添加到输入序列的开头。这个类别词元的表示用于最终的分类任务。 - **位置编码**\ :由于Transformer架构本身无法捕捉序列中的位置信息,ViT为每个图像块添加位置编码。位置编码值加到经过全连接层处理的词元序列中,以帮助模型理解图像块的空间顺序。 ViT的出现具有重要意义,它不仅推动了计算机视觉领域的进步,还为多模态融合提供了新的视角。通过使用相同的Transformer结构和不同模态的分词器(Tokenizer),我们可以将图像、文本、音频等多种数据类型融合,构建更强大、更灵活的多模态大模型。这标志着我们首次有望通过一个统一的强大模型完成所有模态的学习,迈出了通用人工智能的重要一步。 ViT模型的预训练通常包括两个阶段: - **大规模预训练**\ :在大规模图像数据集(如JFT-300M、ImageNet-21K等)上进行预训练,以学习通用视觉特征。 - **微调阶段**\ :在特定的下游任务(如图像分类、目标检测、语义分割等)上进行微调,以适应具体的应用场景。 在预训练阶段,许多视觉大模型通过自监督学习算法在无标注图像数据集上进行训练。以下是两种代表性的自监督学习算法: - **SimCLR**\ :基于对比学习的算法。 - **MAE**\ :基于图像重建的算法。 .. _fig_2.2.2.1-SimCLR: .. figure:: images/2.2.2.1-SimCLR.png :width: 400px SimCLR算法示意图 **SimCLR** :cite:`chen2020simple` 是一种经典的自监督对比学习算法,广泛用于视觉表征学习。如 :numref:`fig_2.2.2.1-SimCLR` 所示,SimCLR的核心思想是通过最大化同一图像不同视图之间的相似性,同时最小化不同图像之间的相似性来学习特征表示。SimCLR通过组合多种数据增强技术、引入非线性投影头、使用更大的批量以及更多的训练步数,显著提升了模型的表征学习能力。 具体来说,SimCLR首先通过随机裁剪、颜色失真和高斯模糊等数据增强技术将图像\ :math:`{\boldsymbol{x}}`\ 转换为不同的视图\ :math:`\hat{{\boldsymbol{x}}}_i`\ 和\ :math:`\hat{{\boldsymbol{x}}}_j`\ ,形成\ *正样本对*\ 。与其他图像形成的对则构成\ *负样本对*\ 。SimCLR使用一个深度学习编码器(如ResNet)提取不同视图图像的表征向量,并通过一个基于多层感知机(MLP)的投影头将这些向量映射到对比损失空间,最终在该空间中定义对比损失函数。对比损失函数通过余弦相似度(或欧氏距离)定义样本对之间的表征距离,指导模型在拉近正样本间距离的同时拉远负样本间的距离。 在损失函数方面,SimCLR使用带有归一化温度缩放的交叉熵损失。对于正样本对 :math:`({\boldsymbol{z}}_i, {\boldsymbol{z}}_j)`\ ,其损失定义为: .. math:: \mathcal{L}({\boldsymbol{z}}_i, {\boldsymbol{z}}_j) = -\log \frac{e^{sim({\boldsymbol{z}}_i, {\boldsymbol{z}}_j) / \tau}}{\sum_{k=1}^{2N} [k \neq i] e^{sim({\boldsymbol{z}}_i, {\boldsymbol{z}}_k) / \tau}} 其中,\ :math:`sim({\boldsymbol{u}}, {\boldsymbol{v}}) = \frac{{\boldsymbol{u}}^T {\boldsymbol{v}}}{\|{\boldsymbol{u}}\| \|{\boldsymbol{v}}\|}`\ 表示向量\ :math:`{\boldsymbol{u}}`\ 和\ :math:`{\boldsymbol{v}}`\ 的相似度(例如余弦相似度),\ :math:`\tau`\ 是温度参数,用于调整损失函数的平滑程度。此损失函数鼓励模型将增强视图的表示\ :math:`({\boldsymbol{z}}_i, {\boldsymbol{z}}_j)`\ 在特征空间中拉近,同时将其与同批次中的其他样本\ :math:`({\boldsymbol{z}}_k)_{k \neq i}` 推远。 .. _fig_2.2.2.1-mae: .. figure:: images/2.2.2.1-mae.png :width: 707px MAE训练示意图 **MAE**\ :与 SimCLR 不同,MAE(Masked Autoencoder ) :cite:`he2022masked` 是一种基于重构学习的自监督学习算法,证明了对比学习并非唯一的自监督学习范式。图像重构(经典的无监督学习任务)也可以让模型在没有人工标注的情况下学习有用的特征。MAE 的主要创新点在于其非对称的“编码器-解码器”架构,以及在高掩码率下进行表征学习的能力。 如 :numref:`fig_2.2.2.1-mae` 所示,MAE 首先将图像分割成固定大小的图像块(如 16x16 像素块),并随机遮挡其中的 75%。这种高比例的随机掩码策略有效去除冗余信息,使任务更具挑战性,并迫使模型学习全局特征。 MAE 采用了非对称的编码器-解码器架构,其中\ *编码器*\ 基于 ViT 结构,但只处理未被遮挡的像素块。编码器通过线性投影和位置嵌入将未遮挡的图像块转换为特征向量,并通过一系列 Transformer 块进行处理。由于只处理一小部分图像块,编码器的计算量和内存需求显著降低。 *解码器*\ 输入的数据包括编码后的可见图像块和被遮挡图像块的掩码令牌。每个掩码令牌是一个共享的、可学习的向量,表示需要预测的被遮挡图像块。解码器通过添加位置嵌入并应用一系列 Transformer 块,对这些数据进行处理,从而重构原始图像。解码器的输出是一个像素值向量,表示每个图像块。最后一层是线性投影,其输出通道数与图像块中的像素值数量相同。MAE 的损失函数为均方误差(MSE)损失,仅在被遮挡的图像块上计算。 大语言模型预训练 ^^^^^^^^^^^^^^^^ .. _fig_2.2.2.2_ELMo: .. figure:: images/2.2.2.2节ELMo示意图.png :width: 653px ELMo方法示意图 :cite:`2023自然语言处理导论` 在计算机视觉领域,通常使用如 ImageNet 等大规模数据集对模型进行预训练,以便从海量图像中学习各种视觉特征,从而提高下游任务的泛化能力。受到这种做法的启发,自然语言处理领域也开始采用类似的范式,并逐渐成为主流。以 ELMo :cite:`peters-etal-2018-deep` 为代表的词向量模型首次探索了语言模型的预训练;随后,基于 Transformer 架构的 GPT :cite:`radford2018improving` 和 BERT :cite:`devlin2018bert` 预训练模型取得了显著成功,开启了自然语言处理领域的“预训练-微调”新时代。本节将介绍这三种预训练模型。 **ELMo模型** :cite:`peters-etal-2018-deep` 是一种深度上下文词向量表示方法,通过双向语言模型(biLM)学习词语表示,并结合 biLM 不同层的输出,以捕捉更丰富的语义和语法信息。ELMo的结构如 :numref:`fig_2.2.2.2_ELMo` 所示,包括三个主要部分:输入层、隐藏层和输出层。 **输入层** 使用字符级卷积神经网络对词语进行编码,从而有效处理词表外的词语。每个词被视为字符序列,每个字符经过卷积神经网络转换为向量,得到词的字符向量表示。随后,池化层对卷积输出进行池化,生成每个词的词级表示。此外,ELMo使用高速公路网络(highway network)进一步转换卷积神经网络的输出,以避免梯度消失或爆炸。ELMo的两个独立编码器分别进行前向和后向语言模型建模,在预训练时,利用前向和反向长短期记忆网络(LSTM)输出预测下一个词。 **隐藏层** 由多层LSTM组成,用于学习词语的上下文相关表示。不同层的LSTM捕获不同粒度的语言信息,低层捕捉语法信息,高层捕捉语义信息。 在下游任务中,ELMo根据任务要求对 biLM 不同层的输出进行线性组合,得到最终的词向量表示。线性组合的权重由任务决定,并在训练过程中学习得到。 ELMo通过结合 biLM 不同层的输出,能够捕捉丰富的上下文信息,包括语法和语义。其词向量表示可以有效应用于各种自然语言处理任务,显著提高性能,并在训练数据较少的情况下也能取得良好效果。这种模型为自然语言处理任务提供了一种强大且灵活的词向量表示方法,显著提升了任务性能。 .. _fig_2.2.2.2_GPT: .. figure:: images/2.2.2.2节GPT示意图.png :width: 855px GPT示意图(左图:模型结构;右图:各下游任务训练示意图) **GPT模型**\ :OpenAI的GPT模型 :cite:`radford2018improving` 探索了使用Transformer结构进行生成式预训练的路径。与传统的Transformer编码器-解码器结构不同,GPT只使用了解码器部分,如 :numref:`fig_2.2.2.2_GPT` 所示。解码器由多层堆叠而成,每层包括以下子层: - **掩码自注意力层**\ :自注意力机制捕捉输入序列中的长距离依赖关系。掩码确保模型在预测某个词时只能访问该词之前的信息,符合语言模型的特性。 - **位置编码**\ :为了解决自注意力机制缺乏顺序概念的问题,位置编码用于表示词语在句子中的顺序。 - **全连接层**\ :进一步提取自注意力层输出的特征。 - **层归一化**\ :加速模型训练并提高稳定性。 - **词嵌入层**\ :将输入词语转换为对应的向量表示。 GPT的预训练过程是使用Transformer解码器对大规模文本进行语言建模。在BookCorpus数据集(包含约11,000本未出版书籍的文本,涵盖多种类型)上进行训练,目标是最大化在给定上下文的情况下预测下一个词的概率: .. math:: \mathcal{L}^{PT}({\boldsymbol{w}})=-\sum_{i=1}^{n} \operatorname{log} P({\boldsymbol{w}}_i | {\boldsymbol{w}}_0...{\boldsymbol{w}}_{i-1};\theta) 其中,\ :math:`\theta`\ 表示模型参数。简单来说,GPT的预训练通过将大量文本数据输入到Transformer解码器中,让模型学习如何根据上下文预测下一个单词。实验表明,这一过程使模型学到了丰富的语言知识,包括语法、语义和常识。预训练完成后,GPT会根据具体任务进行微调,例如在文本分类任务中,通常会在解码器的最后一层添加一个分类器。 .. _fig_2.2.2.2_BERT: .. figure:: images/2.2.2.2节BERT示意图.png :width: 855px BERT模型示意图 **BERT模型** :cite:`devlin2018bert` 是另一个具有代表性的预训练大语言模型。与仅使用单向语言模型(从左到右或从右到左)的方法不同,BERT采用掩码语言模型进行深度双向表示的预训练。这使得BERT在所有层都能同时考虑左右上下文,从而获得更丰富的语义表示。如 :numref:`fig_2.2.2.2_BERT` 所示,BERT由多层Transformer编码器组成,主要分为输入层、编码层和输出层。在预训练过程中,BERT的最后包含两个输出层:MLM(掩码语言建模)和NSP(下一句预测),分别对应两种预训练任务。 BERT的预训练使用了BooksCorpus和英文维基百科这两个大型文本语料库。语料库中的单词通过WordPiece分词算法拆分成更小的语义单元,以提高模型对未登录词(不在词汇库中的词或短语)的处理能力。每个训练样本由两个句子组成,这两个句子通过特殊的[SEP]标记符分隔。句子对的开头添加一个特殊的[CLS]标记符,用于表示整个句子对的语义。为了区分句子对中的两个句子,BERT为每个句子分配一个唯一的段嵌入,同时为每个词分配一个位置嵌入以表示词序信息。 BERT的预训练包括两个任务:MLM和NSP。MLM任务随机掩盖句子对中15%的词,并用[MASK]标记替换这些词,模型需要根据上下文预测被掩盖的词。NSP任务要求模型判断第二个句子是否为第一个句子的下一个句子。在损失函数方面,MLM任务使用交叉熵损失,NSP任务使用二元交叉熵损失。最终训练目标是最大化MLM和NSP任务的联合概率。预训练完成后,BERT可以用于各种下游自然语言处理任务,如文本分类、问答、序列标注等。 多模态大模型预训练 ^^^^^^^^^^^^^^^^^^ 多模态预训练通常利用多种模态的数据(如图像、文本、语音、视频等)进行联合学习。当前主流的多模态大模型主要是视觉语言模型,这些模型的预训练通常基于大量的“图像-文本”数据对,通过特定的优化目标来使模型理解并对齐图像和文本信息。以下介绍三种经典视觉语言模型的预训练方法:CLIP、Stable Diffusion 和 LLaVA。 .. _fig_2.2.2.3_CLIP: .. figure:: images/2.2.2.3_CLIP示意图.png :width: 810px CLIP训练框架示意图 **CLIP**\ (Contrastive Language–Image Pre-Training) :cite:`radford2021learning` [3]_ 由OpenAI提出,是一种通过对比学习实现“图像-文本”联合训练的多模态预训练框架。与传统的对比学习方法不同,CLIP的训练数据是图像-文本对,即图像和其对应的文本描述。CLIP的核心思想是通过最大化匹配图文对的表征相似性,同时最小化不匹配图文对的表征相似性,从而实现跨模态表征学习。 CLIP不需要预测每张图片对应的文本,而是判断图片与给定文本是否匹配,这大大提高了训练效率。具体而言,CLIP使用从互联网上爬取的4亿个图文对进行预训练,同时训练一个\ *图像编码器*\ 和一个\ *文本编码器*\ ,使两个编码器输出的图像和文本特征在同一特征空间中对齐。 如 :numref:`fig_2.2.2.3_CLIP` 所示,CLIP主要包括两个部分:一个图像编码器和一个文本编码器。其中,图像编码器可以选择ResNet或ViT,而文本编码器使用Transformer架构。在预训练过程中,假设每批次包含\ :math:`N`\ 个图文对,图像和文本数据首先分别输入图像编码器和文本编码器进行编码。编码后的特征通过线性投影层映射到统一的表征空间,得到图像特征向量\ :math:`[I_1, I_2, \ldots, I_N]`\ 和文本特征向量\ :math:`[T_1, T_2, \ldots, T_N]`\ 。对任意\ :math:`i, j \in \{1,2, \ldots, N\}`\ ,如果\ :math:`i=j`\ ,则\ :math:`T_i`\ 和\ :math:`I_i`\ 是正样本对,否则\ :math:`T_i`\ 和\ :math:`I_j`\ 是负样本对。CLIP将具有对应关系的\ :math:`N`\ 个图文组合视为\ *正样本*\ ,其余\ :math:`N^2-N`\ 个组合视为\ *负样本*\ 。通过内积操作计算所有\ :math:`T_i`\ 和\ :math:`I_j`\ 的余弦相似度,并最大化正样本间的相似度,同时最小化负样本间的相似度,从而训练文本和图像编码器。 CLIP的特别之处在于其强大的零样本迁移能力。它可以在没有特定任务数据集微调的情况下,利用自然语言描述识别新的视觉概念。预训练的CLIP模型在多个下游任务(包括图像分类、图像生成、图像检索等)上表现出色,经过微调后效果更加显著。 .. _fig_2.2.2.3_SD: .. figure:: images/2.2.2.3_SD示意图.png :width: 720px Stable Diffusion模型结构示意图 **Stable Diffusion** :cite:`rombach2022high` 是一个先进的文图生成模型,也是\ **隐空间扩散模型**\ (Latent Diffusion Model, LDM)。其核心思想是在低维隐空间中进行扩散,显著降低计算复杂度,同时保持生成图像的高质量。如 :numref:`fig_2.2.2.3_SD` 所示,Stable Diffusion主要包括以下三个部分: - **自编码器**\ :由编码器和解码器组成。编码器将输入图像编码为低维隐空间表示,而解码器在扩散过程结束后将这些表示解码回高分辨率图像。 - **CLIP文本编码器**\ :将输入的文本提示(如“骑马的宇航员”)编码为特征向量。Stable Diffusion使用预训练的CLIP文本编码器将文本转化为隐空间中的特征表示,确保文本提示与生成图像的一致性。 - **UNet**\ :在隐空间中迭代去噪,通过多个步骤生成逼真的图像表示。UNet架构包含编码器和解码器部分,使用ResNet块进行下采样和上采样,并通过交叉注意力层引入文本信息。UNet专门用于噪声预测和图像生成,而非传统的图像分割。 具体而言,Stable Diffusion的\ *自编码器*\ 是基于“编码器-解码器”架构的图像压缩模型。对于大小为 :math:`H \times W \times 3`\ 的输入图像,编码器将其转换为大小为\ :math:`h \times w \times c`\ 的隐空间表示,其中\ :math:`f = \frac{H}{h} = \frac{W}{w}`\ 为下采样率,c为特征通道数。在训练自编码器时,除了使用\ :math:`L_1` 重建损失外,Stable Diffusion还引入了感知损失和基于图像块的对抗训练方法,以确保图像重建的局部真实性。同时,训练中采用KL-reg和VQ-reg正则化手段,以防隐空间表示的标准差过大。 Stable Diffusion使用预训练的\ *CLIP文本编码器*\ 进行文本特征提取,编码后的文本特征通过交叉注意力机制输入到UNet中。在训练过程中,CLIP文本编码器的参数保持固定。 Stable Diffusion的UNet结构包括交叉注意力下采样模块和交叉注意力上采样模块,每个模块包含残差层、自注意力层、前向传播层和交叉注意力层。模型通过预测噪声进行训练,使用均方差损失函数和多阶段训练模式来逐步优化模型。 .. _fig_2.2.2.3_llava: .. figure:: images/2.2.2.3_llava示意图.png :width: 720px LLaVA模型结构示意图 **LLaVA**\ (Large Language and Vision Assistant) :cite:`liu2024visual` 是一个主流的多模态大模型,旨在通过视觉和语言指令实现多种任务的通用理解,支持文本和图像两种输入。LLaVA的核心创新在于其构建方法:使用GPT-4生成多模态指令遵循数据,并在这些数据上对模型进行微调,以实现通用的视觉与语言理解能力。 LLaVA的结构如 :numref:`fig_2.2.2.3_llava` 所示,主要包括三个部分: - **视觉编码器**\ :使用预训练的CLIP视觉编码器ViT-L/14将输入图像\ :math:`\mathbf{X}_\mathrm{v}`\ 编码为特征向量。 - **投影映射层**\ :将图像编码特征通过线性映射层\ :math:`\mathbf{W}`\ 投射到词向量表征空间。 - **大语言模型**\ :使用Vicuna :cite:`chiang2023vicuna` 模型对文本和图像特征进行理解和学习。 对于每张图像 :math:`\mathbf{X}_\mathrm{v}`\ ,LLaVA生成多轮对话数据\ :math:`(\mathbf{X}_\mathrm{q}^1, \mathbf{X}_A^1, \cdots, \mathbf{X}_\mathrm{q}^T, \mathbf{X}_A^T)`\ ,其中\ :math:`T`\ 是对话轮数。这些数据被组织成序列,所有答案被视为模型的输出响应。第\ :math:`t`\ 轮的指令\ :math:`\mathbf{X}_\text{instruct}^t` 定义如下: .. math:: \mathbf{X}_{\text{instruct}}^t = \begin{cases}\text{随机选择} [\mathbf{X}_\mathrm{q}^1, \mathbf{X}_\mathrm{v}] \text{或} [\mathbf{X}_\mathrm{v}, \mathbf{X}_\mathrm{q}^1], & \text{第一轮 } t = 1 \\\mathbf{X}_\mathrm{q}^t, & \text{其余轮次 } t > 1\end{cases} 对于长度为 :math:`L`\ 的序列,LLaVA通过以下公式计算目标答案\ :math:`\mathbf{X}_A` 的概率: .. math:: p(\mathbf{X}_A \mid \mathbf{X}_\mathrm{v}, \mathbf{X}_\text{instruct}) = \prod_{i=1}^{L} p_{\theta}(x_{i} \mid \mathbf{X}_\mathrm{v}, \mathbf{X}_\text{instruct,