前言
在多模数据中,涉及以下领域
数字图像处理与计算机视觉
计算语言学与自然语言处理
数字信号处理与智能感知
多模态学习——融合不同的数据类型(如图像和文本):
是机器学习的一个重要分支。
是处理复杂数据分析问题的关键
❤️ ❤️ ❤️ ❤️ ❤️
系列文章导航
【数学建模导论】Task01 数据处理与拟合模型
【数学建模导论】Task02 权重生成与评价模型
【数学建模导论】Task03 时间序列与投资模型
【数学建模导论】Task04 机器学习
【数学建模导论】Task05 多模数据与智能模型
1 数字图像处理与计算机视觉
1.1 数字图像的表示与处理
鼠标右键 -> 在新标签页中打开图像
1.2 数字图像的特征点
鼠标右键 -> 在新标签页中打开图像
2 计算语言学与自然语言处理
2.1 Python处理字符串
# Python支持多种方式来创建和操作字符串。
str1 = 'Hello, World!'
str2 = "Welcome to Python"
str3 = '''This is a multi-line string.'''
print(str1)
print(str2)
print(str3)
# Python提供了字符串的大小写转换方法
str_lower = str1.lower() # 转换为小写
str_upper = str1.upper() # 转换为大写
print(str_lower) # 输出: hello, world!
print(str_upper) # 输出: HELLO, WORLD!
# Python还支持字符串的切片操作
substring = str2[7:13] # 提取索引7到12之间的字符(不包括13)。其实还可以指定步长
print(substring) # 输出: to Python
# Python还提供了查找字符串中特定子串的功能
index = str1.find('World') # 查找'World'的索引
print(index) # 输出: 7
# Python还提供了替换字符串中特定子串的功能
new_str = str1.replace('World', 'Python') # 将'World'替换为'Python'
print(new_str) # 输出: Hello, Python!
# Python支持正则表达式(对于更复杂的文本处理任务)
import re
# 使用正则表达式查找所有数字
numbers = re.findall(r'\d+', str3)
print(numbers) # 输出: ['1', '2'](假设str3中包含数字)
# 使用正则表达式替换字符串中的模式
new_str4 = re.sub(r'\s+', '_', str2) # 将所有空格替换为下划线
print(new_str4) # 输出: Welcome_to_Python
3 数字信号处理与智能感知
3.1 数字信号的傅里叶变换
鼠标右键 -> 在新标签页中打开图像
代码
import numpy as np # 导入numpy库,用于科学计算
import matplotlib.pyplot as plt # 导入matplotlib库,用于绘图
# 创建了一个包含单一频率成分的信号(生成一个正弦波信号)
fs = 150.0; # 设置采样频率为150 Hz
ts = 1.0/fs; # 计算采样间隔,即每个采样点之间的时间差
t = np.arange(0, 1, ts) # 生成时间向量,从0到1秒,步长为采样间隔
ff = 5; # 设置正弦波的频率为5 Hz
y = np.sin(2 * np.pi * ff * t) # 使用numpy生成正弦波,公式为sin(2πft),其中f为频率,t为时间向量
# 对信号进行傅里叶变换
n = len(y) # 获取信号长度
k = np.arange(n) # 创建一个从 0 到 n-1 的数组,用于表示频率域的索引
T = n / fs # 计算总的采样时间 (或者 T = n * ts)
frq = k / T # 计算频率范围,频率等于索引除以总时间
Y = np.fft.fft(y) / n # 使用`np.fft.fft`函数对信号进行傅里叶变换,并将其结果归一化
# 绘制原始信号
plt.subplot(2, 1, 1) # 创建一个2行1列的子图,并选择第一个子图
plt.plot(t, y) # 绘制时间域信号
plt.xlabel('Time') # 设置x轴标签为时间
plt.ylabel('Amplitude') # 设置y轴标签为振幅
# 绘制频谱图
# 只保留正频率部分,因为对于实数输入,傅里叶变换是对称的
Y = Y[range(n // 2)] # 取前半部分
frq = frq[range(n // 2)] # 同样取频率范围的前半部分
plt.subplot(2, 1, 2) # 选择第二个子图
plt.plot(frq, abs(Y), 'r') # 绘制频率域信号,使用红色线条表示
plt.xlabel('Freq (Hz)') # 设置x轴标签为频率
plt.ylabel('|Y(freq)|') # 设置y轴标签为|Y(freq)|,表示频谱幅度
# 调整子图布局,使其紧凑
plt.tight_layout()
plt.show() # 显示图表
回显
3.2 数字信号的统计指标
时域特征
鼠标右键 -> 在新标签页中打开图像
频域特征
鼠标右键 -> 在新标签页中打开图像
时频域特征
鼠标右键 -> 在新标签页中打开图像
4 多模态数据与人工智能
4.1 多模态概念与意义
鼠标右键 -> 在新标签页中打开图像
4.2 多模态模型发展关系及时间线
鼠标右键 -> 在新标签页中打开图像
arXiv:2401.13601 [cs.CL]
4.3 多模态基础知识–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 使用了层归一化而非批量归一化,
- 这使得模型在小批量训练时也能获得良好的表现,并且有利于模型收敛。
4.4 多模态任务对齐
鼠标右键 -> 在新标签页中打开图像
使用 Tramsformer (BERT) 模型的步骤
- 输入文本:
“thank you very much” - Tokenization(分词):
[“thank”, “you”, “very”,“much”] - Embedding(嵌入):
假设每个 token 被映射到一个 2048 维的向量,
“thank you very much”被转换成 4 * 2048 的embeddings
使用 Vit Transformer 模型的步骤
- 输入图像大小:224 x 224 像素,3 个颜色通道(RGB),
预处理:归一化,但不改变图像大小图像切分: - 假设每个 patch 大小为 14 x 14 像素,
图像被切分成 (224/14) × (224/14) = 256 个 patches 线性嵌入: - 将每个 14 x 14 x 3 的 patch 展平成一个一维向量,向量大小为 14×14×3=588
- 通过一个线性层将每个 patch 的向量映射到其他维的空间(假设是 D 维),
例如 D = 768 , 每个 patch 被表示为一个 D 维的向量。 - 最后,由于 Transformer 内部不改变这些向量的大小,
就可以用 256 * 768 的 embeddings 表示一张图像。
模态对齐-通常的步骤
- 特征提取:
这就像是从故事和图片中各自提炼出关键信息。
对于计算机,这意味着使用算法
从图片中识别出像是轮廓、颜色和形状这样的视觉元素,
同时从文本中识别出关键词和语义结构。
无论是图片还是文字,都转换成了计算机能理解的数字列表——也就是向量。 - 特征变换:
接下来,就像是将故事的翻译成插画的“语言”,或者反过来。
这个过程需要确保提取的特征可以在一个共同的“向量空间”中进行比较。
有时候,这就像是在不同的文化中找到共同的表达方式,
让一种表达形式能够反映另一种的含义。 - 对齐策略:
现在,我们需要一种方法来确认故事和插图确实是对应的。
在计算机的世界里,这可以通过增加两者之间相似度的方法来实现。
想象一下,你通过比较故事和插图之间的相似点,来确认它们是匹配的。 - 端到端训练:
最后,就像在不断的游戏中学习,
计算机通过不停地尝试和调整来更好地匹配故事和图片。
它会逐渐学会如何提取特征、变换它们,并找到最佳的对齐方式。
4.5 多模态模型训练流程
鼠标右键 -> 在新标签页中打开图像
Read more
- 数学建模导论 intro-mathmodel
(知识密度大、代码理论兼备)
https://datawhalechina.github.io/intro-mathmodel/#/ - Python科学计算 scientific-computing(数学建模导论的前置课程)
(知识密度小、代码实操强悍)
https://datawhalechina.github.io/scientific-computing/#/