Datawhale 数学建模导论第十章学习笔记

多模数据与智能模型

数字图像处理与计算机视觉

数字图像的表示与处理

  • HSV表示法概念:是一种描述颜色的方式,其中H代表色调(Hue),S代表饱和度(Saturation),V代表明度(Value)。
  • 在图像处理中,HSV空间经常用于颜色分割、颜色识别等任务。
  • RGB概念:是一种加色模型,它是通过红、绿、蓝三种颜色的组合来表示颜色的。每种颜色的强度都通过一个0-255的数值来表示。
  • 高斯平滑概念:(Gaussian Blurring)是图像处理中常用的一种技术,
  • 高斯平滑适用场景:用于减少图像噪声和细节层次。
  • 高斯平滑基本思想:它通过对图像中的每一个像素点,取其本身和邻域内的其他像素点的加权平均值来实现平滑效果。权重由高斯函数计算得出,距离中心越远的像素点,权重越小。
  • 腐蚀操作概念:是一种形态学操作,
  • 腐蚀操作适用场景:用来消除图像中的小物体、断开连接在一起的物体等。
  • 腐蚀操作的基本思想:将结构元素在图像上滑动,如果结构元素下的所有像素都是前景像素(通常为白色),则该位置的中心像素被认为是前景像素,否则为背景像素。
  • 锐化操作概念:是一种用于增强图像边缘和细节的技术。
  • 计算机对数字图像的处理:计算机把数字图像看作一个很大的矩阵,把图像中每个像素看作矩阵的一个元素,用矩阵元素的值表示图像对应位置的像素点明暗程度以及颜色情况。
  • python处理图像/视频的库:OpenCV
  • 用OpenCV可以对图像的操作:
  1. 读取项目中的一张图并展示
  2. 可以使用cvtColor函数将图像从RGB空间转换到HSV空间
  3. 实现图像的裁剪可以通过数组索引的方式实现
  4. 可以通过GaussianBlur实现高斯平滑的效果
  5. 使用滤波器来实现锐化,比如拉普拉斯滤波器或者自定义的卷积核。

 数字图像的特征点检测

  • 特征点概念:是数字图像处理中用于图像分析和处理的关键信息点,它们可以代表图像中的显著特征,如角点、边缘和其他结构。
  • 有效的特征点检测的用处:是很多计算机视觉任务的基础,包括图像匹配、物体识别和追踪等。
  • 特征点分类:

Sobel特征点检测

  • 基于的算法:Sobel算子
  • Sobel算子核心思想:将图像分成水平和垂直两个方向,然后在每个方向上计算梯度并求和,最后将两个方向上的梯度幅值差作为边缘强度。
  • Sobel算子计算方法:通过应用两个3x3的卷积核对图像进行卷积操作,分别计算图像在水平和垂直方向上的梯度变化,从而识别出图像中的边缘。
  • Sobel算子适用场景:常用于边缘检测,能够突出图像中的边缘特征,有效减少数据量,保留图像的重要结构属性,为后续图像处理和分析提供基础。

Canny算子

  • Canny算子计算步骤:
  1. 利用高斯滤波器对输入图像进行平滑处理,以减少图像中的噪声。
  2. 通过对平滑后的图像应用Sobel或Prewitt等算子,计算每个像素点的梯度幅值和方向。
  3. 非极大值抑制过程会在梯度图像上比较每个像素点在其梯度方向上的值,并保留局部最大值点,抑制非边缘像素。
  4. Canny算子使用双阈值检测,根据设定的高阈值和低阈值,将梯度图像中的像素点分为强边缘、弱边缘和非边缘三个部分。
  5. 通过连接强边缘像素和与之相连的弱边缘像素,形成完整的边缘。
  • Canny算子优点:具有更高的准确性和更低的错误率,能够产生单一像素宽度的边缘响应,并尽量减少将噪声和细节等误判为边缘的情况。

Harris角点检测

  • 角点概念:通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。
  • 适用场景:用于在图像中检测出角点特征,在计算机视觉领域中有广泛的应用,如目标跟踪、运动检测、视频剪辑、三维建模以及目标识别等。
  • Harris角点检测的原理:主要基于图像的灰度变化和局部窗口的协方差矩阵。
  • Harris角点检测的步骤:
  1. 将彩色图像转换为灰度图像;
  2. 根据灰度值计算每个像素的梯度,通常使用Sobel算子;
  3. 计算每个像素周围窗口内梯度的自相关矩阵;
  4. 根据自相关矩阵计算Harris响应函数,用于评估每个像素周围区域是否为角点。

ORB(Oriented FAST and Rotated BRIEF)特征点检测

  • ORB(Oriented FAST and Rotated BRIEF)特征点检测概念:是一种快速且高效的局部特征点提取和描述方法,它结合了FAST特征点检测算法和BRIEF描述子算法,并通过一系列改进和融合实现了更高的效率和鲁棒性。
  • ORB(Oriented FAST and Rotated BRIEF)特征点检测步骤:
  1. 利用FAST算法来快速检测图像中的角点。这些角点通常是图像中像素值发生急剧变化的区域,如边缘、角等。为了提高特征点的旋转不变性,ORB算法会对检测到的角点进行方向计算,为每个角点分配一个主方向。
  2. ORB算法使用BRIEF描述子算法为每个角点生成一个紧凑的二进制特征向量。这个特征向量仅包含0和1,其顺序根据特定角点和其周围像素区域的灰度强度变化而定。这种二进制特征向量可以节省内存空间和计算时间,同时保持较高的特征匹配准确性。
  3. 适用场景:
  • 在实时视觉应用,如SLAM(同时定位与地图构建)和无人机视觉等领域中得到了广泛应用。
  • 它提供了一种有效的方式来从图像中提取和描述关键特征点,以便进行后续的匹配、跟踪和三维重建等任务。
  • ORB特征点还具有平移不变性,简单的几何变换不影响ORB特征点的计算与匹配。

计算机视觉

  • 聚焦点:图像信息如何在计算机中存储、表示、处理、分析、理解并应用。

图像分类任务

  • 概念:是计算机视觉领域中的一项基本任务,
  • 其目标:将输入的图像自动分配到预先定义的类别中。例如,一个图像分类系统可能将输入的图片识别为动物、植物、建筑或其他类别。这种分类依赖于从图像中提取的特征,这些特征可能包括颜色、纹理、形状等信息。研究者们一直在试图寻找不需要手工设计特征的分类模型。

目标检测任务

  • 概念:是计算机视觉领域的一个重要分支,旨在识别图像或视频中的特定目标,并给出它们的位置信息。
  • 这个任务通常涉及内容:定位目标物体的边界框,并识别其类别。
  • 评估目标检测算法的性能的评价指标:准确率(Precision)、召回率(Recall)、F1分数以及mAP(mean Average Precision)。

图像分割任务

  • 概念:是指将图像划分为若干个互不相交的区域,每个区域都代表图像中的一个物体或场景的一部分。
  • 这一任务在计算机视觉中重要性:它有助于从复杂的图像中提取出有意义的信息

图像生成任务

  • 概念:是计算机视觉领域的一个重要分支,它涉及到生成具有特定属性的图像。
  • 这个任务的目标:是根据给定的输入信息,生成一张新的图像。
  • 图像生成任务优秀模型:生成对抗网络(GAN)。

GAN网络

  • 概念:即生成对抗网络,是一种在图像生成任务中表现尤为出色的深度学习模型。
  • GAN网络构成:
  1. 生成器。生成器的任务是生成新的数据样本,如图像
  2. 判别器。而判别器任务是判断这些生成的样本与真实数据之间的差异。

这两个部分通过对抗学习的方式相互竞争,使生成器不断提高其生成逼真样本的能力,同时判别器也持续提高其辨别真伪样本的能力。

  • 它的核心思想正是我们在第3章中讲到的博弈论。
  • 适用场景:计算机视觉、自然语言处理和创意艺术等多个领域。

计算语言学与自然语言处理

文本的嵌入表示

独热编码(One-Hot Encoding)

  • 基本思想:将所有文本中的单词进行统计,将每个单词转化为1个0-1向量。
  • 适用场景:处理单个词、短语等极短文本,不适合对长文本进行建模。

TF-IDF算法

TF-IDF的基本表达式形如:

数字信号处理与智能感知 

数字信号的傅里叶变换

傅里叶变换的适用场景:

  1. 在信号处理领域,它可以帮助我们过滤或减少噪音。
  2. 在图像处理中,傅里叶变换用于分析图像的频率属性,帮助进行图像增强和边缘检测。
  3. 它也是通信技术中不可或缺的一部分,用于编码和传输信号。

使用NumPy库中的fft模块,进行一维离散傅里叶变换:

import numpy as np

import matplotlib.pyplot as plt

# 创建一个包含一些频率成分的信号

fs = 150.0;  # 采样频率

ts = 1.0/fs; # 采样间隔

t = np.arange(0,1,ts) # 时间向量

ff = 5;  # 频率

y = np.sin(2*np.pi*ff*t)

# 对信号进行傅里叶变换

n = len(y) # 长度

k = np.arange(n)

T = n/fs

frq = k/T # 两侧的频率范围

Y = np.fft.fft(y)/n # fft计算并归一化

# 由于对称性,我们只取一半

Y = Y[range(n//2)]

frq = frq[range(n//2)]

# 绘图

plt.subplot(2,1,1)

plt.plot(t,y)

plt.xlabel('Time')

plt.ylabel('Amplitude')

 

plt.subplot(2,1,2)

plt.plot(frq,abs(Y),'r') # 绘制频谱图

plt.xlabel('Freq (Hz)')

plt.ylabel('|Y(freq)|')

plt.tight_layout()

plt.show()

在这个例子中,我们首先创建了一个包含单一频率成分的信号。然后,我们使用np.fft.fft函数对该信号进行傅里叶变换,并绘制了原始信号和频谱图。值得注意的是,由于傅里叶变换的结果在频率轴上是对称的,我们通常只展示一半的频谱图。

这只是一个入门级的示例。在更复杂的实际应用中,你可能需要处理包含多个频率成分的信号,或者进行更高级的操作,如窗函数处理和滤波等。

此外,如果你要处理的数据是二维的(如图像),你可以使用二维傅里叶变换,这可以通过np.fft.fft2函数来实现。二维傅里叶变换在图像处理中特别有用,比如在图像增强或边缘检测等应用中。

数字信号的统计指标

时域特征:

  • 最大值:信号在观测期间的最高点,表示信号能够达到的最大幅度。

  • 最小值:与最大值相对,表示信号在观测期间的最低点。

  • 峰值:信号最大值和最小值的差值,常用于描述信号的振幅。

  • 偏度:度量信号分布的对称性。正偏度意味着信号的尾部向右延伸较长,负偏度则表示尾部向左延伸较长。

 

 频域

  • 适用场景:不要求信号具有长期的稳定性,而是关注于信号功率如何在各个频率上分布,从而适用于分析广泛的信号类型,包括随机和非平稳信号。

 

数字信号的滤波与分解 

Python 提供了多个强大的库来支持数字信号处理,其中 scipy 和 numpy 是最常用的工具。

在Python中,你可以使用多种库来对信号进行滤波,其中最常见的库包括scipynumpy

准备工作:安装必要的库。在Python中开始信号处理之前,我们需要确保已经安装了必要的库。通过以下命令,您可以快速安装numpy和scipy:

pip install numpy scipy

然后,我们从创建一个包含两个不同频率成分的合成信号开始。这种信号可以帮助我们演示滤波效果的直观性,并应用不同类型的滤波器:

import numpy as np

import matplotlib.pyplot as plt

 

# 设置采样频率

fs = 1000 # Hz,表示每秒采样1000次

 

# 生成时间向量,持续1秒

t = np.linspace(0, 1, fs, endpoint=False)

 

# 定义信号中的两个频率

f1, f2 = 5, 120 # Hz

 

# 使用正弦波叠加生成信号

x = np.sin(2 * np.pi * f1 * t) + 0.5 * np.sin(2 * np.pi * f2 * t)

 

# 绘制这个复合信号

plt.figure(figsize=(10, 4))

plt.plot(t[:100], x[:100], label='Original Signal')

plt.title('原始信号')

plt.xlabel('时间 [秒]')

plt.ylabel('振幅')

plt.legend()

plt.show()

我们的目标是去除信号中的高频部分。为此,我们将设计一个低通滤波器,只允许频率低于60Hz的部分通过。

from scipy import signal

# 设计一个低通滤波器,截止频率为60Hz

b, a = signal.iirfilter(N=8, Wn=60 / (fs / 2), btype='low', ftype='butter')

# 现在,我们使用刚刚设计的滤波器处理信号,并观察滤波效果。

# 通过滤波器处理信号

y = signal.lfilter(b, a, x)

# 绘制滤波后的信号与原始信号对比

plt.figure(figsize=(10, 8))

plt.subplot(2, 1, 1)

plt.plot(t[:100], x[:100])

plt.title('原始信号')

plt.xlabel('时间 [秒]')

plt.ylabel('振幅')

 

plt.subplot(2, 1, 2)

plt.plot(t[:100], y[:100])

plt.title('经过低通滤波的信号')

plt.xlabel('时间 [秒]')

plt.ylabel('振幅')

plt.tight_layout()

plt.show()

 

 

在这个例子中,我们创建了一个包含两个频率成分(5Hz和120Hz)的信号。然后,我们设计了一个8阶的IIR低通滤波器,其截止频率为60Hz,并使用signal.lfilter函数将滤波器应用于信号。最后,我们绘制了原始信号和滤波后的信号,如图所示。

除了低通滤波器外,scipy.signal模块还为我们提供了一系列强大的工具,可以用来设计不同类型的滤波器,从基本的低通和高通滤波器到更复杂的带通和带阻滤波器。你可以通过调整滤波器的类型和参数来满足你的需求。在这里举出一些所支持的高级滤波:

巴特沃斯滤波器:通过scipy.signal.butter函数设计。这种滤波器以其平坦的通带特性而闻名,能够在通带内保持较一致的幅度响应,非常适合需要避免频率失真的应用场合。

切比雪夫滤波器:通过scipy.signal.cheby1(类型I)和scipy.signal.cheby2(类型II)函数设计。这些滤波器在通带或阻带中具有等波纹性能,使得它们在特定的频率范围内可以实现更快的衰减速率,适用于对滤波器性能要求较高的情况。

椭圆滤波器:通过scipy.signal.ellip设计,这类滤波器在通带和阻带都具有等波纹特性,并且能够在较低的滤波器阶数下实现非常陡峭的截止特性,非常适合对过渡带有严格要求的应用。

贝塞尔滤波器:通过scipy.signal.bessel设计,这种滤波器在所有滤波器中最注重相位特性的线性,使之成为处理音频和其他需要精确相位信息的信号的理想选择。

FIR滤波器设计:scipy.signal还提供了firwin和firwin2函数,用于设计具有指定频率响应的有限脉冲响应(FIR)滤波器。这类滤波器通常更易于设计并且能够完全实现线性相位特性。

除了基本的滤波器设计,scipy.signal还支持更高级的功能,如使用窗函数法设计滤波器、优化滤波器系数等。这些高级技术允许用户在保证滤波性能的同时,优化滤波器的结构和效率。使用这些滤波方法时,你可以通过调整滤波器的阶数、截止频率、类型等参数来优化滤波器的性能。此外,scipy.signal还提供了其他功能强大的信号处理函数,如卷积、相关、频谱分析等,以支持更复杂的信号处理任务。

如果你需要更高级的滤波功能,例如窗函数设计、滤波器系数优化等,你可能需要深入了解数字信号处理的理论,并查阅scipy.signal模块的文档以获取更多信息。请注意,设计滤波器时需要根据具体的应用需求选择合适的滤波器类型和参数。在设计滤波器之前,了解数字信号处理的基本原理和滤波器的特性是非常重要的。

在数字信号处理的实践中,我们不仅需要考虑如何设计和优化滤波器,还经常需要处理信号的非线性和非平稳特性。这就引出了一种非常有用的分析方法:经验模态分解(Empirical Mode Decomposition,简称EMD)是一种用于分析非线性、非平稳信号的方法。它可以将一个复杂的信号分解成一系列本征模态函数(Intrinsic Mode Functions,简称IMF),这些IMF代表了信号在不同时间尺度上的特征。

简单来说,EMD就像是一种“筛”信号的方法。想象你手里有一堆不同大小的沙子,你想要把它们分开。EMD就像是一个筛子,它可以帮助你逐步把大颗粒、中颗粒和小颗粒的沙子分开。对于信号来说,这个“筛子”就是EMD算法,而“沙子”就是信号中的不同成分。这使得EMD成为分析复杂信号的有效工具,尤其是在处理音频和生物医学信号等领域中非常有用。

接下来我们会进行EMD的编程实战,你需要安装 PyEMD 库。打开你的命令行工具,并输入以下命令来安装:

pip install EMD-signal

这行命令会从 Python 包索引(PyPI)下载并安装 PyEMD 库,让你可以在你的代码中使用它。接下来,我们将编写一个 Python 脚本来执行经验模态分解。这里是详细的步骤和代码解释:

首先,我们需要导入几个 Python 库,包括用于数据操作的 numpy,用于数据可视化的 matplotlib.pyplot,以及 PyEMD 库中的 EMD 类。我们还使用 scipy.signal 来添加噪声,增强示例的实用性。

import numpy as np

import matplotlib.pyplot as plt

from PyEMD import EMD

import scipy.signal as signal

 

我们将生成一个简单的测试信号,包括两个不同频率的正弦波,并加上随机噪声。这个信号将作为 EMD 分解的输入。

t = np.linspace(0, 1, 200)  # 时间向量

s = np.sin(11*2*np.pi*t) + np.sin(22*2*np.pi*t) + 0.2*np.random.normal(size=t.size)  # 信号生成

 

使用 EMD 类初始化一个分解器,并对信号 s 进行分解,提取出多个内在模态函数(IMF)。

emd = EMD()

IMFs = emd(s)

 

最后,我们使用 matplotlib 库来绘制原始信号和每个分解出的 IMF。这有助于可视化分解的效果,更好地理解每个 IMF 的物理意义。

plt.figure(figsize=(12, 9))

plt.subplot(len(IMFs)+1, 1, 1)

plt.plot(t, s, 'r')

plt.title("Input signal: 's(t)'")

plt.xlabel("Time [s]")

for n, imf in enumerate(IMFs):

  plt.subplot(len(IMFs)+1, 1, n+2)

  plt.plot(t, imf, 'g')

  plt.title("IMF "+str(n+1))

  plt.xlabel("Time [s]")

plt.tight_layout()

plt.show()

如图所示,这段代码首先生成了一个包含两个不同频率正弦波和噪声的信号。然后,它使用EMD类来初始化一个经验模态分解器,并将信号传递给分解器。分解器会返回一系列IMFs,这些IMFs代表了信号中的不同成分。最后,代码使用matplotlib库来绘制原始信号和每个IMF的图形。 

多模态数据与人工智能 

模态概念:是一个指生物通过感知器官(如眼睛、耳朵)和经验来接收和处理信息的方式的概念。

多模态概念:指结合多种感知方式或信息来源。

多模态模型的发展中,主要可以分为以下五个核心组件:

1. 模态编码器(Modality Encoder, ME)

图像编码器(Image Encoder):用于将图像数据转化为机器可处理的特征表示。

视频编码器(Video Encoder):专门处理视频数据,提取时间和空间特征。

音频编码器(Audio Encoder):转换音频输入为特征,便于后续的处理和分析。

2. 输入投影器(Input Projector, IP)

线性投影器(Linear Projector):通过简单的线性变换将输入数据映射到一个新的空间。

多层感知器(MultiLayer Perceptron, MLP):使用深层网络结构进行更复杂的数据转换。

交叉注意力(CrossAttention):允许模型关注输入数据中的关键部分,以提高信息的相关性和准确性。

Q-Former:一种基于Transformer的结构,用于处理和优化多模态数据的交互。

3. 大模型基座(LLM Backbone)

ChatGLM、LLaMA、Qwen、Vicuna等:这些大模型为多模态学习提供了强大的基础架构,支持高效的信息处理和复杂任务的执行。

4. 输出投影器(Output Projector, OP)

Tiny Transformer:一个轻量级的Transformer模型,专注于高效的输出生成。

Multi-Layer Perceptron (MLP):用于将内部表示转换为最终输出,如文本、图像或音频。

5. 模态生成器(Modality Generator, MG)

Stable Diffusion、Zeroscope、AudioLDM等:这些生成器用于创造新的多模态输出,如图像、音频或其它类型的合成数据。

多模态基础知识--Transformer

Transformer结构如下图所示:

 

Transformer的核心构成包括:

自注意力机制(Self-Attention Mechanism): Transformer模型摒弃了传统RNN结构的时间依赖性,通过自注意力机制实现对输入序列中任意两个位置之间的直接关联建模。每个词的位置可以同时关注整个句子中的其他所有词,计算它们之间的相关性得分,然后根据这些得分加权求和得到该位置的上下文向量表示。这种全局信息的捕获能力极大地提高了模型的表达力。

多头注意力(Multi-Head Attention): Transformer进一步将自注意力机制分解为多个并行的“头部”,每个头部负责从不同角度对输入序列进行关注,从而增强了模型捕捉多种复杂依赖关系的能力。最后,各个头部的结果会拼接并经过线性变换后得到最终的注意力输出。

位置编码(Positional Encoding): 由于Transformer不再使用RNN的顺序处理方式,为了引入序列中词的位置信息,它采用了一种特殊的位置编码方法。这种方法对序列中的每个位置赋予一个特定的向量,该向量的值与位置有关,确保模型在处理过程中能够区分不同的词语顺序。

编码器-解码器架构(Encoder-Decoder Architecture): Transformer采用了标准的编码器-解码器结构,其中,编码器负责理解输入序列,将其转换成高级语义表示;解码器则依据编码器的输出,结合自身产生的隐状态逐步生成目标序列。在解码过程中,解码器还应用了自注意力机制以及一种称为“掩码”(Masking)的技术来防止提前看到未来要预测的部分。

残差连接(Residual Connections): Transformer沿用了ResNet中的残差连接设计,以解决随着网络层数加深带来的梯度消失或爆炸问题,有助于训练更深更复杂的模型。

层归一化(Layer Normalization): Transformer使用了层归一化而非批量归一化,这使得模型在小批量训练时也能获得良好的表现,并且有利于模型收敛。

多模态任务对齐

文本转Embedding
Tokenization(分词):Tokenization 是将文本切分为模型可处理的token或子词的过程。此步骤通常采用 BPE 或WordPiece 分词算法,不仅帮助控制词典大小,同时保留了表达文本序列的能力。相关的关键点总结如下:

图像转换Embedding

图像数据也采用与文本类似的处理方法,通过 Vit Transformer 模型进行处理。首先,把图像分成固定大小的patch,类比于LLM中的Tokenization操作;然后通过线性变换得到patch embedding,类比LLM中的Embedding操作。由于Transformer的输入就是token embeddings序列,所以将图像的patch embedding送入Transformer后就能够直接进行特征提取,得到图像全局特征的embeddings。

具体步骤:

  1. ·输入图像大小:224x224像素,3个颜色通道(RGB)+ 预处理:归一化,但不改变图像大小图像切分
  2.  假设每个patch大小为14x14像素,图像被切分成(224/14) × (224/14) =256个patches 线性嵌入
  3.  将每个14x14x3的patch展平成一个一维向量,向量大小为 14×14×3=588
  4. 通过一个线性层将每个patch的向量映射到其他维的空间(假设是D维),例如D=768 , 每个patch被表示为一个D维的向量。最后,由于Transformer内部不改变这些向量的大小,就可以用256*768的embeddings表示一张图像。

 

 

模态对齐

模态对齐概念:是指将来自不同模态的数据转化为能够相互对应的统一形式,从而使得不同模态之间可以协同工作,共同完成任务。在处理图像和文本的任务中,模态对齐特别关键,因为它允许模型理解并关联视觉信息和语言信息。

例如,在图像标注任务中,模型需要不仅识别出图像中的物体,如"小狗",还需要将其与相应的文本描述对齐。如果图像中的"小狗"和文本中的"小狗"在各自的模态空间中被不同地表示,模型就需要通过某种方式来桥接这种差异,使得两者能够匹配。常用的模态对齐方法包括但不限于使用联合嵌入空间、对齐损失函数和跨模态转换网络。

img

图片对齐语言示意图

这种对齐通常涉及步骤:

  1. 特征提取: 这就像是从故事和图片中各自提炼出关键信息。对于计算机,这意味着使用算法从图片中识别出像是轮廓、颜色和形状这样的视觉元素,同时从文本中识别出关键词和语义结构。这样做的结果是,无论是图片还是文字,都转换成了计算机能理解的数字列表——也就是向量。
  2. 特征变换: 接下来,就像是将故事的翻译成插画的“语言”,或者反过来。这个过程需要确保提取的特征可以在一个共同的“向量空间”中进行比较。有时候,这就像是在不同的文化中找到共同的表达方式,让一种表达形式能够反映另一种的含义。
  3. 对齐策略: 现在,我们需要一种方法来确认故事和插图确实是对应的。在计算机的世界里,这可以通过增加两者之间相似度的方法来实现。想象一下,你通过比较故事和插图之间的相似点,来确认它们是匹配的。
  4. 端到端训练: 最后,就像在不断的游戏中学习,计算机通过不停地尝试和调整来更好地匹配故事和图片。它会逐渐学会如何提取特征、变换它们,并找到最佳的对齐方式。

通过这种方式,计算机最终能够处理并理解多种形式的信息,无论是看到的图片还是读到的文本。这项技术不仅应用于图像和文本,还可以扩展到视频、音频和更多其他类型的数据。模态对齐让计算机能够在更复杂、更接近人类理解世界的方式上工作,这对于创造聪明、灵活的人工智能系统来说至关重要。

多模态模型训练流程

在这个领域,我们的教程继续深入了解多模态大型语言模型的训练,这个过程分成两个紧密联系的阶段:多模态预训练(Multimodal Pre-Training, MM PT)和多模态指令调优(Multimodal Instruction Tuning, MM IT)。

这两个阶段的具体细节:

(1)多模态预训练(MM PT):

目标:在这个阶段,我们专注于训练输入投影器(Input Projector, IP)和输出投影器(Output Projector, OP),目的是让模型学会如何把视觉、听觉和语言等不同的信息模态转换成统一的表示形式。简单来说,就是教会大型语言模型(Large Language Model, LLM)的主干网络如何理解和处理这些不同来源的信息。

数据集:通常,这里涉及的是像X-Text这样的多模态数据集,其中包含了图像-文本对(Image-Text),视频-文本对(Video-Text)以及音频-文本对(Audio-Text)。这样的数据集让模型有机会学习如何把不同形式的信息对应起来,就好比学习多种语言的翻译。

优化:在预训练的过程中,核心的任务是优化IP和OP的参数,以最小化条件文本生成损失(conditional text generation loss)。这涉及到一个过程,让模型学会如何将模态编码器(Modality Encoder)输出的特征和文本特征相对齐,从而生成可以直接喂给LLM主干网络的特征。

(2)多模态指令调优(MM IT):

目标:当模型基本理解了不同模态信息后,我们进入指令调优阶段。这里的目标是细化模型的能力,使其能够更好地根据特定的、格式化的指令来执行任务。就像在预训练后教会模型如何根据具体的操作手册来行动。

方法:这个阶段的方法分为两种。首先是监督式微调(Supervised Fine-Tuning, SFT),它将前一阶段学习到的数据转换成特定的指令格式,然后对模型进行进一步训练。另外一种方法是基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF),这种方法依赖于对模型产生的输出给予反馈,进一步改进模型的性能。

数据集:在这个阶段使用的数据集一般包括了视觉问答(Visual Question Answering, VQA)任务、基于指令的执行任务等,这些可以是简单的单轮问答形式,也可以是更复杂的多轮对话形式。

通过以上两个阶段,我们不仅让模型学会了如何处理和理解不同的信息模态,还教会了它如何根据特定指令行动。这使得模型在面对多样化的实际任务时,能够有着更为出色的表现和更高的灵活性。

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值