基于视觉语言模型的多模态训练
对图像和文本数据进行处理,实现多模态信息融合和交互。
图像编码(Faster+RCNN)、文本编码、特征融合
主要工作:图像部分,利用预训练的图像编码器(CNN、Faster+RCNN)从图像中提取特征。文本部分,使用词嵌入将文本序列编码为向量表示。并通过引入交叉注意力机制将图像各区域和文本相关部分进行关联,使二者能在共享的语义空间中进行有效交互。
语言掩码(Mask Laguage Model,MLM):随机mask15%的词,利用视觉文本联合预测,最小化交叉熵损失函数,促进多模态语义对齐
图像区域掩码(Mask region model):文本随机掩码,图像对掩码区域置零,
图像文本匹配(image text matching):随机将图像文本对中的图像替换成其他图片,判断预测图片文本是否匹配
词汇区域对齐(word region align)
词嵌入
1. 什么是词嵌入?
- 将文本数据转换为计算机可处理的数字形式。
2. 如何实现
2.1 one-hot
- 基本思想:将每个词语或字符表示为一个稀疏度为1的向量,只有一个元素为1,其余为0。考虑词的顺寻,根据词汇表的索引来确定非零元素的位置。
- 举例:有一个包含 5 个不同词汇的词汇表:[“I”, “banana”, “orange”, “grape”, “like”],希望将句子 “I like banana” 转换为 One-Hot 向量。
“banana” 对应的 One-Hot 向量为 [0, 1, 0, 0, 0],句子 “I like banana” 对应的 One-Hot 编码矩阵为:
[
[1, 0, 0, 0, 0], # "I"
[0, 0, 0, 0, 1], # "like"
[0, 1, 0, 0, 0], # "banana"
]
- 缺点:当输入文本过长时会产生非常稀疏的高维向量,维度灾难,难以优化,无法表现上下文语义关联情况。
2.2 Bag of Words
-
基本思想:将文本数据表示为一个固定长度的向量,其中每个元素表示词汇表中对应词汇的出现频率或者计数。
-
实现步骤
- 构建词汇表。需包含所有在文本数据中出现的词汇。
- 编码文本。对于每个文本样本,将其表示为一个固定长度(等于词汇表的大小)的向量,每个元素表示词汇表中对应词汇的出现频率或者次数。
- 向量化。每个文本样本都被表示成一个向量,成为文本的词袋向量。
-
举例:包含 5 个不同词汇的词汇表:[“I”, “banana”, “orange”, “grape”, “like”],对唯一编号对每个单词进行编码,[“I”:1, “banana”:2, “orange”:3, “grape”:4, “like”:5],句子 “I like banana” 转换为 Bag of Words 向量为[1, 5, 2]。
-
缺点: 前后俩词的相似度与其编码值的相似度无联系,忽略了词汇顺序,表征文本信息不充分。
import numpy as np
sentences = ['The cat sat on the mat.', 'The cat ate a banana.']
token_idx = {} # word——index 空字典存word和其编码
# 遍历sentences中的单词(token),并赋编码值,
for sentence in sentences:
for word in sentence.split(): # 单词之间以空格处切分
if not word in token_idx: # 避免重复赋值
token_idx[word] = len(token_idx) + 1
max_length = 10 # 每个sentences只考虑前10个单词
# one-hot
# results的三个维度(句子序号,单词序号,token对应的向量的长度)
results_oneHot = np.zeros(shape=(len(sentences),
max_length,
max(token_idx.values())+1 ))
for i, sentence in enumerate(sentences):
for j, word in list(enumerate(sentence.split()))[:max_length]:
idx = token_idx.get(word) # 得到word编码值
results_oneHot[i,j,idx] = 1 #
# bag of word
results_BagOfWord = np.zeros(shape=(len(sentences),max_length))
for i, sentence in enumerate(sentences):
for j, word in list(enumerate(sentence.split()))[:max_length]:
idx = token_idx.get(word)
results_BagOfWord[i,j] = idx
2.3 Word2Vec
-
一种用于将词汇映射到低维连续向量空间的深度学习模型。
-
基本思想:根据目标词汇去预测其上下文或根据目标词汇的上下文去预测目标词汇
-
实现方式
- 连续词袋模型(Continuous bag of words,CBOW)。根据上下文中的词汇来预测目标词汇。
- 输入层:一个固定大小的上下文窗口中的词汇,每个词汇通常表示为one-hot或其他形式;
- 投影层:将输入的one-hot编码或其他形式转换为低微连续向量,也成为词嵌入;
- 隐藏层:通常为平均池化层,将词嵌入向量求平均,得到上下文的表示;
- 输出层:softmax激活函数将上下文的表示映射到词汇表中每个词汇的概率分布。模型通过概率分布预测目标词汇。
- skip-gram模型:根据目标词汇来预测上下文中的词汇,
- 输入层:接收一个目标词汇,通常表示为 one-Hot 编码或其他稠密表示形式;
- 投影层:将输入的one-hot编码或其他形式转换为低微连续向量,也成为词嵌入;
- 隐藏层:直接将投影层的输出作为隐藏层的输出;
- 输出层: Softmax 激活函数将目标词汇的表示映射到词汇表中每个词汇的概率分布。通过这个概率分布,模型可以预测目标词汇的上下文中的词汇。
- 通过训练一个浅层神经网络来学习词汇的分布式表示。通常使用负采样(Negative Sampling)或层次 Softmax(Hierarchical Softmax)等技术来加速训练过程。训练完成后,每个词嵌入都可以捕捉输入词汇之间的语义关系,例如在向量空间中相似的词汇会具有相近的词嵌入。
- 连续词袋模型(Continuous bag of words,CBOW)。根据上下文中的词汇来预测目标词汇。
2.4 GloVe 模型
-
利用全局统计信息来学习词嵌入,而不是像 Word2Vec 模型那样使用局部上下文信息。具体来说,GloVe 模型利用了全局词汇共现矩阵,其中每个元素表示了两个词汇在同一个上下文中出现的频率或计数。