Week 25: 深度学习补遗:多模态学习
文章目录
- Week 25: 深度学习补遗:多模态学习
- 摘要
- Abstract
- 1. 多模态学习
- 1.1 基本概念
- 1.2 信贷风控中的多模态特征
- 1.3 注意力机制
- 2. 多模态融合策略
- 2.1 早期融合(Early Fusion)
- 2.1.1 概念
- 2.1.2 简要代码实现
- 2.2 晚期融合(Late Fusion)
- 2.3 混合融合(Hybrid Fusion)
- 2.3.1 概念
- 2.3.2 简要代码实现
- 2.4 多模态嵌入
- 2.4.1 概要
- 2.4.2 简要代码实现
- 总结
Week 25: 深度学习补遗:多模态学习
摘要
本周主要了解了多模态学习技术,通过对多模态数据融合的数学原理与其中注意力机制的应用,对多模态特征的处理方法有了基础的了解和认识。
Abstract
This week’s focus has been on multimodal learning techniques. Through examining the mathematical principles underlying multimodal data fusion and the application of attention mechanisms within these frameworks, a foundational understanding of methods for processing multimodal features has been established.
1. 多模态学习
1.1 基本概念
在人工智能领域,"模态"指的是数据存在的不同形式或来源。多模态学习的核心思想是通过整合来自不同源头的异构信息,创建一个比单一模态更全面、更准确的理解框架。
设有 MMM 种不同的模态 {M1,M2,...,MM}\{M_1, M_2, ..., M_M\}{M1,M2,...,MM},每种模态 MiM_iMi 包含一组特征向量 Xi={xi1,xi2,...,xin}X_i = \{x_{i1}, x_{i2}, ..., x_{in}\}Xi={xi1,xi2,...,xin},多模态学习的本质是找到一个融合函数 FFF,使得:
F(X1,X2,...,XM)=YF(X_1, X_2, ..., X_M) = Y F(X1,X2,...,XM)=Y
其中 YYY 是最终的预测结果或表示向量。
1.2 信贷风控中的多模态特征
在信贷风控场景中,客户数据天然具备多模态特性:
-
数值模态(Numerical Modality)
- 收入、年龄、贷款金额等连续数值
- 基础统计特征:均值、方差、分位数等
-
分类模态(Categorical Modality)
- 性别、教育程度、职业类型等离散标签
- 具有有限取值空间的属性信息
-
时序模态(Temporal Modality)
- 用户行为的时间序列数据
- 还款历史、消费模式的时间变化
-
文本模态(Text Modality)
- 贷款申请描述、客服对话记录
- 非结构化的文字信息
-
行为模态(Behavioral Modality)
- 点击流数据、设备使用模式
- 隐性的行为特征
1.3 注意力机制
不同模态的重要性在不同情况下会有所不同,现今的数据集很容易出现非常庞大的模态数量,注意力机制允许模型动态地决定。注意力机制实际上让模型能够调整当前更应该关注哪些模态和每个模态内部哪些特征更重要。
因此,在多模态下,注意力机制的重要性更加彰显。
2. 多模态融合策略
2.1 早期融合(Early Fusion)
2.1.1 概念
在特征层面直接拼接所有模态:
Xfused=concat(X1,X2,...,XM)X_{fused} = concat(X_1, X_2, ..., X_M) Xfused=concat(X1,X2,...,XM)
-
优点:
简单直接,保留所有信息
-
缺点:
可能存在模态间信息冲突
2.1.2 简要代码实现
import torch
import torch.nn as nnclass SimpleFusion(nn.Module):def __init__(self, feature_dims):super().__init__()# 为每个模态计算重要性权重self.weights = nn.Parameter(torch.ones(len(feature_dims)) / len(feature_dims))def forward(self, modal_features):# 计算加权的模态融合weighted_features = []for i, features in enumerate(modal_features):weighted_features.append(features * self.weights[i])# 拼接所有加权特征fused = torch.cat(weighted_features, dim=1)return fused, self.weightsmodal_features = [numeric_feat, categorical_feat, text_feat] # 各模态特征
fusion = SimpleFusion([10, 8, 15]) # 各模态维度
fused_output, modality_weights = fusion(modal_features) # 融合结果
2.2 晚期融合(Late Fusion)
每个模态独立建模,最后在决策层融合:
Y=∑i=1Mwi⋅YiY = \sum_{i=1}^M w_i \cdot Y_i Y=i=1∑Mwi⋅Yi
其中 wiw_iwi 是学习到的融合权重
2.3 混合融合(Hybrid Fusion)
2.3.1 概念
结合以上两种方法的优点,通过注意力机制实现动态权重分配
2.3.2 简要代码实现
class MultiModalAttention(nn.Module):def __init__(self, feature_dim, num_heads=4):super().__init__()self.attention = nn.MultiheadAttention(feature_dim, num_heads, batch_first=True)def forward(self, modal_features):# 将所有模态特征拼接成序列batch_size = modal_features[0].shape[0]seq_features = torch.stack(modal_features, dim=1) # [batch, modalities, feature_dim]# 应用多头注意力attended, attn_weights = self.attention(seq_features, seq_features, seq_features)# 全局平均池化pooled = attended.mean(dim=1) # [batch, feature_dim]return pooled, attn_weights# 使用示例
attn_fusion = MultiModalAttention(64, num_heads=8)
output, weights = attn_fusion([numeric_feat, categorical_feat, text_feat])
2.4 多模态嵌入
2.4.1 概要
多模态嵌入技术的核心目标是将不同类型的数据特征映射到一个统一的高维语义空间中,使得在该空间内,具有相似语义含义的不同模态特征能够获得相近的向量表示。这一技术在处理包含数值、文本、分类等多种特征类型的数据时具有重要意义。通过降维映射的方式,多模态嵌入可以保留原始特征中的有效信息,同时消除不同模态间的异构性障碍。传统方法往往需要复杂的特征工程来手工设计融合策略,而嵌入学习通过端到端的训练过程,能够自动发现最优的模态组合方式。
简要来说,多模态的嵌入实际上就是利用线性映射或者神经网络对各个不同的模态特征在高维向量空间上进行嵌入,使得其形态统一便于下一步计算,在多模态的模型训练中是非常必要的一步。
给定不同模态的特征 X1,X2,...,XnX_1, X_2, ..., X_nX1,X2,...,Xn,嵌入过程可表示为:
hi=fi(Xi)(模态特定映射)z=g([h1,h2,...,hn])(融合映射)\begin{aligned} h_i &= f_i(X_i)\text{(模态特定映射)} \\ z &= g([h_1, h_2, ..., h_n])\text{(融合映射)} \end{aligned} hiz=fi(Xi)(模态特定映射)=g([h1,h2,...,hn])(融合映射)
其中 fif_ifi 是第 iii 个模态的嵌入函数,ggg 是融合函数,zzz 是最终的统一表示。
2.4.2 简要代码实现
import torch
import torch.nn as nnclass SimpleEmbedding(nn.Module):def __init__(self, input_dims, embedding_dim=64):super().__init__()# 为每个模态创建独立的嵌入变换网络self.embeddings = nn.ModuleList([nn.Sequential(nn.Linear(dim, embedding_dim), nn.Tanh())for dim in input_dims])# 融合网络:将多模态嵌入组合为统一表示self.fusion = nn.Linear(len(input_dims) * embedding_dim, embedding_dim)def forward(self, modal_features):# 独立嵌入各模态特征embedded = [emb(features) for emb, features in zip(self.embeddings, modal_features)]# 在特征维度上拼接所有嵌入向量concatenated = torch.cat(embedded, dim=1)# 通过融合层获得最终的多模态表示unified = self.fusion(concatenated)return unified# 应用示例:处理包含数值、分类、文本特征的数据
embedding = SimpleEmbedding([10, 8, 15], embedding_dim=64)
unified_embedding = embedding([numeric_feat, categorical_feat, text_feat])
总结
本周在比赛中初识了多模态类型的数据,利用这个机会较为初步的认识了多模态的数据的处理。在时序预测中,多模态数据的融合是一个潜力比较大且比较热门的领域,多模态数据的处理和融合策略极大的影响着模型对数据集的拟合能力。本周在了解了多模态底层原理的同时,较为简要的对其代码部分进行了简要的了解,后续将考虑在论文阅读中加强对多模态融合前沿时序模型进行了解。
