随着计算机视觉、自然语言处理、语音识别等技术的快速发展,现有的人工智能技术在处理单模态数据方面取得了显著的成效。然而,在现实生活中,数据呈现的形式多种多样,例如我们阅读的文字、听到的声音、观看的视频等,这些多源异构信息称为多模态数据,而机器学习领域将挖掘和分析多模态数据的一类算法归为多模态学习方法。为使人工智能更好地理解真实环境,多模态学习近年来引起了研究者的广泛关注,在相关应用领域取得了长足的进步。
小编为你送上项目地址
点击阅读原文即可GET
https://github.com/njustkmg/PaddleMM
多模态学习工具包PaddleMM基于百度飞桨,提供模态联合学习和跨模态学习算法模型库,为处理图片文本等多模态数据提供高效的解决方案,助力多模态学习应用落地:
多模态模型库
当前,PaddleMM针对图片和文本模态提供了多模态算法模型库(更新中),包括多模态分类、跨模态检索、图文生成和预训练框架四个模块。
多模态分类
多模态分类算法主要分为模型无关的算法(如早融合/晚融合)和基于模型的算法(如CMML、LMF、TMC),具体如下:
跨模态检索
ShowAttendTell[8]:使用VGG编码图像信息得到feature map,利用LSTM进行解码,在解码过程中引入注意力机制选取特定的图像上下文信息指导当前阶段的单词生成;
AoANet[9]:使用类似Transformer结构搭建编码器和解码器,并拓展原始的自注意力提出attention on attention(AOA)模块。
预训练框架
工具包说明
PaddleMM分为数据处理、模型库、训练器三个模块。其中,数据模块包括对图像和文本的不同处理形式,如图像的全局特征、局部特征处理,文本的统计信息、分词、BERT处理;模型库涵盖多模态分类、跨模态检索、图文生成等不同任务;训练器针对不同任务给出不同的训练流程,在模型训练中提供不同的训练策略,并收录了不同任务的多种测试指标。
如下图所示,在PaddleMM调用中,需要定义模型配置文件、数据目录和实验记录地址三个变量,我们将所有模型的超参数存放在configs文件夹中,模型的配置文件中会包括两类超参数,第一类是工具包相关超参数,如任务类型,需要文本和图像的处理格式等,在实验中工具包会根据这些信息选择相应的数据读取方式、训练器和测试指标,配置文件中的另一类参数是具体的模型超参数,即模型在使用中推荐的最优超参数。
模型开发
具体来说,CMML输入的有标记和无标记多模态数据,通过文本预测网络和图像预测网络分别计算单模态预测,接着计算以下优化目标:
充分性度量:通过模态注意力学习网络对有标记数据的单模态预测计算权重并自适应加权融合,与真实标记计算交叉熵损失函数;
差异性度量:计算有标记数据的不同模态预测差异,该部分旨在于最大化不同模态预测差异凸显模态强弱,提高模型泛化能力;
鲁棒一致性:对于无标记数据的不同模态预测计算Huber损失,该部分旨在于排除不一致样本的干扰,以实现对模型的鲁棒性约束。
AI Studio项目地址:
https://aistudio.baidu.com/aistudio/projectdetail/2423256
数据加载
模型开发
CMML主体模型由三个部分组成:
文本预测网络
self.txt_hidden = nn.Sequential(
nn.Linear(input_dim, hidden_dim*2),
nn.ReLU(),
nn.Linear(hidden_dim*2, hidden_dim),
nn.ReLU()
)
self.txt_predict = nn.Linear(hidden_dim, num_labels)
图像预测网络
self.resnet = models.resnet34(pretrained=True)
self.resnet = nn.Sequential(*list(self.resnet.children())[:-1])
self.img_hidden = nn.Linear(512, hidden_dim)
self.img_predict = nn.Linear(hidden_dim, num_labels)
模态注意力学习网络
self.attn_mlp = nn.Linear(hidden_dim, 1)
self.attn_mlp = nn.Sequential(
nn.Linear(hidden_dim, int(hidden_dim/2)),
nn.ReLU(),
nn.Linear(int(hidden_dim/2), 1)
)
在训练中,CMML需要计算以下三种优化目标:
充分性度量
supervised_txt_hidden = self.txt_hidden(supervised_txt)
supervised_txt_predict = self.txt_predict(supervised_txt_hidden)
supervised_txt_predict = self.sigmoid(supervised_txt_predict)
supervised_img_hidden = self.resnet(supervised_img)
supervised_img_hidden = paddle.reshape(supervised_img_hidden, shape=[supervised_img_hidden.shape[0], 512])
supervised_img_hidden = self.img_hidden(supervised_img_hidden)
supervised_img_predict = self.img_predict(supervised_img_hidden)
supervised_img_predict = self.sigmoid(supervised_img_predict)
attn_txt = self.attn_mlp(supervised_txt_hidden)
attn_img = self.attn_mlp(supervised_img_hidden)
attn_modality = paddle.concat([attn_txt, attn_img], axis=1)
attn_modality = self.softmax(attn_modality)
attn_img = paddle.zeros(shape=[1, len(label)])
attn_img[0] = attn_modality[:, 0]
attn_img = paddle.t(attn_img)
attn_txt = paddle.zeros(shape=[1, len(label)])
attn_txt[0] = attn_modality[:, 1]
attn_txt = paddle.t(attn_txt)
supervised_hidden = attn_txt * supervised_txt_hidden + attn_img * supervised_img_hidden
supervised_predict = self.modality_predict(supervised_hidden)
supervised_predict = self.sigmoid(supervised_predict)
mm_loss = self.criterion(supervised_predict, label)
差异性度量
similar = paddle.bmm(supervised_img_predict.unsqueeze(1), supervised_txt_predict.unsqueeze(2))
similar = paddle.reshape(similar, shape=[supervised_img_predict.shape[0]])
norm_matrix_img = paddle.norm(supervised_img_predict, p=2, axis=1)
norm_matrix_text = paddle.norm(supervised_txt_predict, p=2, axis=1)
div = paddle.mean(similar / (norm_matrix_img * norm_matrix_text))
鲁棒一致性
unsimilar = paddle.bmm(unsupervised_img_predict.unsqueeze(1), unsupervised_txt_predict.unsqueeze(2))
unsimilar = paddle.reshape(unsimilar, shape=[unsupervised_img_predict.shape[0]])
unnorm_matrix_img = paddle.norm(unsupervised_img_predict, p=2, axis=1)
unnorm_matrix_text = paddle.norm(unsupervised_txt_predict, p=2, axis=1)
dis = 2 - unsimilar / (unnorm_matrix_img * unnorm_matrix_text)
mask_1 = paddle.abs(dis) < self.cita
tensor1 = paddle.masked_select(dis, mask_1)
mask_2 = paddle.abs(dis) >= self.cita
tensor2 = paddle.masked_select(dis, mask_2)
tensor1loss = paddle.sum(tensor1 * tensor1 / 2)
tensor2loss = paddle.sum(self.cita * (paddle.abs(tensor2) - 1 / 2 * self.cita))
unsupervised_loss = (tensor1loss + tensor2loss) / unsupervised_img.shape[0]
模型训练
总结
相关链接
多模态学习资料:
https://github.com/njustkmg/Multi-Modal-Learning
https://aistudio.baidu.com/aistudio/projectdetail/2423256
感谢百度人才智库TIC部门和百度飞桨平台对工具包开发的支持:
NJUST-KMG小组:
http://www.njustkmg.cn/
百度人才智库TIC部门:
https://ai.baidu.com/solution/recruitment
百度飞桨平台:
https://www.paddlepaddle.org.cn/
参考文献
获取更多技术内容~
随着计算机视觉、自然语言处理、语音识别等技术的快速发展,现有的人工智能技术在处理单模态数据方面取得了显著的成效。然而,在现实生活中,数据呈现的形式多种多样,例如我们阅读的文字、听到的声音、观看的视频等,这些多源异构信息称为多模态数据,而机器学习领域将挖掘和分析多模态数据的一类算法归为多模态学习方法。为使人工智能更好地理解真实环境,多模态学习近年来引起了研究者的广泛关注,在相关应用领域取得了长足的进步。
小编为你送上项目地址
点击阅读原文即可GET
https://github.com/njustkmg/PaddleMM
多模态学习工具包PaddleMM基于百度飞桨,提供模态联合学习和跨模态学习算法模型库,为处理图片文本等多模态数据提供高效的解决方案,助力多模态学习应用落地:
多模态模型库
当前,PaddleMM针对图片和文本模态提供了多模态算法模型库(更新中),包括多模态分类、跨模态检索、图文生成和预训练框架四个模块。
多模态分类
多模态分类算法主要分为模型无关的算法(如早融合/晚融合)和基于模型的算法(如CMML、LMF、TMC),具体如下:
跨模态检索
ShowAttendTell[8]:使用VGG编码图像信息得到feature map,利用LSTM进行解码,在解码过程中引入注意力机制选取特定的图像上下文信息指导当前阶段的单词生成;
AoANet[9]:使用类似Transformer结构搭建编码器和解码器,并拓展原始的自注意力提出attention on attention(AOA)模块。
预训练框架
工具包说明
PaddleMM分为数据处理、模型库、训练器三个模块。其中,数据模块包括对图像和文本的不同处理形式,如图像的全局特征、局部特征处理,文本的统计信息、分词、BERT处理;模型库涵盖多模态分类、跨模态检索、图文生成等不同任务;训练器针对不同任务给出不同的训练流程,在模型训练中提供不同的训练策略,并收录了不同任务的多种测试指标。
如下图所示,在PaddleMM调用中,需要定义模型配置文件、数据目录和实验记录地址三个变量,我们将所有模型的超参数存放在configs文件夹中,模型的配置文件中会包括两类超参数,第一类是工具包相关超参数,如任务类型,需要文本和图像的处理格式等,在实验中工具包会根据这些信息选择相应的数据读取方式、训练器和测试指标,配置文件中的另一类参数是具体的模型超参数,即模型在使用中推荐的最优超参数。
模型开发
具体来说,CMML输入的有标记和无标记多模态数据,通过文本预测网络和图像预测网络分别计算单模态预测,接着计算以下优化目标:
充分性度量:通过模态注意力学习网络对有标记数据的单模态预测计算权重并自适应加权融合,与真实标记计算交叉熵损失函数;
差异性度量:计算有标记数据的不同模态预测差异,该部分旨在于最大化不同模态预测差异凸显模态强弱,提高模型泛化能力;
鲁棒一致性:对于无标记数据的不同模态预测计算Huber损失,该部分旨在于排除不一致样本的干扰,以实现对模型的鲁棒性约束。
AI Studio项目地址:
https://aistudio.baidu.com/aistudio/projectdetail/2423256
数据加载
模型开发
CMML主体模型由三个部分组成:
文本预测网络
self.txt_hidden = nn.Sequential(
nn.Linear(input_dim, hidden_dim*2),
nn.ReLU(),
nn.Linear(hidden_dim*2, hidden_dim),
nn.ReLU()
)
self.txt_predict = nn.Linear(hidden_dim, num_labels)
图像预测网络
self.resnet = models.resnet34(pretrained=True)
self.resnet = nn.Sequential(*list(self.resnet.children())[:-1])
self.img_hidden = nn.Linear(512, hidden_dim)
self.img_predict = nn.Linear(hidden_dim, num_labels)
模态注意力学习网络
self.attn_mlp = nn.Linear(hidden_dim, 1)
self.attn_mlp = nn.Sequential(
nn.Linear(hidden_dim, int(hidden_dim/2)),
nn.ReLU(),
nn.Linear(int(hidden_dim/2), 1)
)
在训练中,CMML需要计算以下三种优化目标:
充分性度量
supervised_txt_hidden = self.txt_hidden(supervised_txt)
supervised_txt_predict = self.txt_predict(supervised_txt_hidden)
supervised_txt_predict = self.sigmoid(supervised_txt_predict)
supervised_img_hidden = self.resnet(supervised_img)
supervised_img_hidden = paddle.reshape(supervised_img_hidden, shape=[supervised_img_hidden.shape[0], 512])
supervised_img_hidden = self.img_hidden(supervised_img_hidden)
supervised_img_predict = self.img_predict(supervised_img_hidden)
supervised_img_predict = self.sigmoid(supervised_img_predict)
attn_txt = self.attn_mlp(supervised_txt_hidden)
attn_img = self.attn_mlp(supervised_img_hidden)
attn_modality = paddle.concat([attn_txt, attn_img], axis=1)
attn_modality = self.softmax(attn_modality)
attn_img = paddle.zeros(shape=[1, len(label)])
attn_img[0] = attn_modality[:, 0]
attn_img = paddle.t(attn_img)
attn_txt = paddle.zeros(shape=[1, len(label)])
attn_txt[0] = attn_modality[:, 1]
attn_txt = paddle.t(attn_txt)
supervised_hidden = attn_txt * supervised_txt_hidden + attn_img * supervised_img_hidden
supervised_predict = self.modality_predict(supervised_hidden)
supervised_predict = self.sigmoid(supervised_predict)
mm_loss = self.criterion(supervised_predict, label)
差异性度量
similar = paddle.bmm(supervised_img_predict.unsqueeze(1), supervised_txt_predict.unsqueeze(2))
similar = paddle.reshape(similar, shape=[supervised_img_predict.shape[0]])
norm_matrix_img = paddle.norm(supervised_img_predict, p=2, axis=1)
norm_matrix_text = paddle.norm(supervised_txt_predict, p=2, axis=1)
div = paddle.mean(similar / (norm_matrix_img * norm_matrix_text))
鲁棒一致性
unsimilar = paddle.bmm(unsupervised_img_predict.unsqueeze(1), unsupervised_txt_predict.unsqueeze(2))
unsimilar = paddle.reshape(unsimilar, shape=[unsupervised_img_predict.shape[0]])
unnorm_matrix_img = paddle.norm(unsupervised_img_predict, p=2, axis=1)
unnorm_matrix_text = paddle.norm(unsupervised_txt_predict, p=2, axis=1)
dis = 2 - unsimilar / (unnorm_matrix_img * unnorm_matrix_text)
mask_1 = paddle.abs(dis) < self.cita
tensor1 = paddle.masked_select(dis, mask_1)
mask_2 = paddle.abs(dis) >= self.cita
tensor2 = paddle.masked_select(dis, mask_2)
tensor1loss = paddle.sum(tensor1 * tensor1 / 2)
tensor2loss = paddle.sum(self.cita * (paddle.abs(tensor2) - 1 / 2 * self.cita))
unsupervised_loss = (tensor1loss + tensor2loss) / unsupervised_img.shape[0]
模型训练
总结
相关链接
多模态学习资料:
https://github.com/njustkmg/Multi-Modal-Learning
https://aistudio.baidu.com/aistudio/projectdetail/2423256
感谢百度人才智库TIC部门和百度飞桨平台对工具包开发的支持:
NJUST-KMG小组:
http://www.njustkmg.cn/
百度人才智库TIC部门:
https://ai.baidu.com/solution/recruitment
百度飞桨平台:
https://www.paddlepaddle.org.cn/
参考文献
获取更多技术内容~