首页 人工智能

深度学习表格数据:ResNet-like 与 FT-Transformer 架构解析及应用

分类:人工智能
字数: (0527)
阅读: (8993)
内容摘要:深度学习表格数据:ResNet-like 与 FT-Transformer 架构解析及应用,

在图像和文本领域大放异彩的深度学习,在处理表格数据时却常常不如传统机器学习模型,例如 XGBoost 或 LightGBM。这主要是因为表格数据的结构化特性和特征工程的依赖性。本文将深入探讨如何利用 ResNet-like 架构和 FT-Transformer 架构,改进深度学习模型在表格数据上的表现,并分享实战经验,包括如何避开常见的坑。

问题场景:金融风控模型优化

假设我们面临一个金融风控场景,需要根据用户的个人信息、交易记录、消费习惯等多维度数据,预测用户逾期的概率。传统方法是使用 XGBoost,并通过大量的特征工程,例如 one-hot 编码、特征交叉等,来提升模型效果。但是,特征工程耗时耗力,而且容易引入人为偏差。我们希望利用深度学习模型,自动学习特征,减少人工干预。

深度学习表格数据:ResNet-like 与 FT-Transformer 架构解析及应用

ResNet-like 架构:深度残差网络的表格数据改造

原理剖析

ResNet(残差网络)在图像识别领域取得了巨大成功,其核心思想是引入残差连接,缓解梯度消失问题,使得可以训练更深的网络。在表格数据处理中,我们可以借鉴 ResNet 的思想,构建 ResNet-like 的全连接网络。关键点在于将每个全连接层块设计成包含残差连接的形式。

深度学习表格数据:ResNet-like 与 FT-Transformer 架构解析及应用

代码示例(PyTorch)

import torch
import torch.nn as nn

class ResBlock(nn.Module):
    def __init__(self, input_dim, hidden_dim, dropout_rate=0.1): # 定义ResBlock的参数
        super(ResBlock, self).__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim) # 第一层全连接层
        self.bn1 = nn.BatchNorm1d(hidden_dim) # BatchNorm归一化
        self.relu = nn.ReLU() # ReLU激活函数
        self.fc2 = nn.Linear(hidden_dim, input_dim) # 第二层全连接层,输出维度与输入维度相同,方便残差连接
        self.bn2 = nn.BatchNorm1d(input_dim) # BatchNorm归一化
        self.dropout = nn.Dropout(dropout_rate) # Dropout防止过拟合

    def forward(self, x):
        residual = x # 保存原始输入,用于残差连接
        out = self.fc1(x) # 第一层全连接
        out = self.bn1(out) # BatchNorm归一化
        out = self.relu(out) # ReLU激活函数
        out = self.dropout(out) # Dropout
        out = self.fc2(out) # 第二层全连接
        out = self.bn2(out) # BatchNorm归一化
        out = out + residual # 残差连接
        out = self.relu(out) # ReLU激活函数
        return out

class TabularResNet(nn.Module):
    def __init__(self, input_dim, hidden_dims, num_res_blocks, output_dim, dropout_rate=0.1):
        super(TabularResNet, self).__init__()
        self.embedding = nn.Linear(input_dim, hidden_dims[0]) # 输入特征的embedding
        self.res_blocks = nn.ModuleList([ResBlock(hidden_dims[i], hidden_dims[i+1], dropout_rate) for i in range(num_res_blocks)]) # 创建多个ResBlock
        self.output_layer = nn.Linear(hidden_dims[-1], output_dim) # 输出层
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = self.embedding(x)
        for block in self.res_blocks: # 遍历每个ResBlock
            x = block(x) # 通过ResBlock
        x = self.output_layer(x) # 通过输出层
        x = self.sigmoid(x)
        return x

# 模型实例化
input_dim = 100 # 输入特征维度
hidden_dims = [64, 128, 64] # 隐藏层维度
num_res_blocks = len(hidden_dims) - 1 # ResBlock数量
output_dim = 1 # 输出维度 (二分类)
model = TabularResNet(input_dim, hidden_dims, num_res_blocks, output_dim)

# 示例数据
batch_size = 32
x = torch.randn(batch_size, input_dim) # 随机生成输入数据

# 前向传播
output = model(x)
print(output.shape) # 输出维度 [32, 1]

实战避坑

  • Batch Normalization 的使用:在每个全连接层之后,建议添加 Batch Normalization 层,加速收敛,提高模型泛化能力。但是要注意,BN 在测试时,使用训练集的均值和方差,而不是当前 batch 的均值和方差。
  • Dropout 的使用:为了防止过拟合,可以在每个 ResBlock 中添加 Dropout 层。Dropout 的比例需要根据实际情况调整。
  • 学习率的选择:ResNet-like 模型通常需要较小的学习率,例如 1e-3 或 1e-4。可以使用学习率衰减策略,例如 Cosine Annealing。

FT-Transformer:Feature Tokenizer 与 Transformer 的融合

原理剖析

FT-Transformer(Feature Tokenizer Transformer)是一种专门为表格数据设计的 Transformer 结构。它将每个特征视为一个 token,通过 Feature Tokenizer 将原始特征转换为 embedding,然后输入到 Transformer Encoder 中。这样可以充分利用 Transformer 的自注意力机制,学习特征之间的关系。

深度学习表格数据:ResNet-like 与 FT-Transformer 架构解析及应用

代码示例(PyTorch)

import torch
import torch.nn as nn
from transformers import BertConfig, BertModel

class FeatureTokenizer(nn.Module):
    def __init__(self, num_features, embedding_dim):
        super(FeatureTokenizer, self).__init__()
        self.embedding_layers = nn.ModuleList([nn.Embedding(num_embeddings=100, embedding_dim=embedding_dim) for _ in range(num_features)]) # 假设每个特征最多有 100 个不同的值

    def forward(self, x):
        # x: (batch_size, num_features)
        embeddings = []
        for i in range(x.shape[1]): # 遍历每个特征
            embeddings.append(self.embedding_layers[i](x[:, i].long())) # 获取每个特征的embedding
        embeddings = torch.stack(embeddings, dim=1) # 将所有特征的embedding堆叠在一起
        return embeddings # (batch_size, num_features, embedding_dim)

class FTTransformer(nn.Module):
    def __init__(self, num_features, embedding_dim, num_transformer_layers, num_attention_heads, num_classes):
        super(FTTransformer, self).__init__()
        self.feature_tokenizer = FeatureTokenizer(num_features, embedding_dim) # Feature Tokenizer
        self.config = BertConfig(hidden_size=embedding_dim, num_hidden_layers=num_transformer_layers, num_attention_heads=num_attention_heads, intermediate_size=embedding_dim * 4)
        self.transformer = BertModel(self.config)
        self.linear = nn.Linear(embedding_dim, num_classes) # 线性分类层
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        # x: (batch_size, num_features)
        embeddings = self.feature_tokenizer(x) # 通过 Feature Tokenizer 获取 embedding
        transformer_output = self.transformer(inputs_embeds=embeddings).last_hidden_state # 通过 Transformer
        cls_token = transformer_output[:, 0, :] # 使用第一个token作为分类的token,对应BERT的[CLS] token
        output = self.linear(cls_token) # 通过线性层分类
        output = self.sigmoid(output) # Sigmoid函数
        return output

# 模型实例化
num_features = 50 # 特征数量
embedding_dim = 64 # embedding维度
num_transformer_layers = 2 # Transformer层数
num_attention_heads = 4 # 注意力头数
num_classes = 1 # 分类数量
model = FTTransformer(num_features, embedding_dim, num_transformer_layers, num_attention_heads, num_classes)

# 示例数据
batch_size = 32
x = torch.randint(0, 100, (batch_size, num_features)) # 随机生成输入数据

# 前向传播
output = model(x)
print(output.shape) # 输出维度 [32, 1]

实战避坑

  • 特征数量的影响:FT-Transformer 的计算复杂度与特征数量成平方关系。当特征数量较多时,可以考虑使用特征选择或降维技术,减少计算量。
  • Tokenizer 的选择:Feature Tokenizer 可以使用 Embedding 层,也可以使用预训练的 Transformer 模型。选择合适的 Tokenizer 可以提高模型效果。
  • Transformer 参数的选择:Transformer 的层数、注意力头数等参数需要根据实际情况调整。可以使用 Grid Search 或 Bayesian Optimization 等方法,寻找最优参数。

总结

ResNet-like 架构和 FT-Transformer 架构为深度学习处理表格数据提供了新的思路。在实际应用中,需要根据具体场景选择合适的模型,并进行充分的调参和优化。同时,也要注意避开常见的坑,例如 Batch Normalization 的使用、学习率的选择、特征数量的影响等。希望本文能够帮助读者更好地理解和应用深度学习模型,解决表格数据处理问题。在实际部署时,可以使用 Nginx 作为反向代理服务器,配置负载均衡,提高系统的并发连接数。使用宝塔面板可以方便地管理服务器。

深度学习表格数据:ResNet-like 与 FT-Transformer 架构解析及应用

深度学习表格数据:ResNet-like 与 FT-Transformer 架构解析及应用

转载请注明出处: CoderPunk

本文的链接地址: http://m.acea4.store/blog/089052.SHTML

本文最后 发布于2026-03-30 09:45:38,已经过了28天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 工具人 6 天前
    这篇ResNet-like的实现很清晰,学习了!
  • 风一样的男子 11 小时前
    Batch Normalization那里说的很到位,之前就踩过这个坑!测试集和训练集要分开计算均值方差。
  • 沙县小吃 5 天前
    Batch Normalization那里说的很到位,之前就踩过这个坑!测试集和训练集要分开计算均值方差。
  • 柠檬精 4 天前
    请问在实际项目中,ResNet-like和FT-Transformer哪个效果更好呢?有没有一些选择的经验?
  • 吃瓜群众 15 小时前
    FT-Transformer的例子很实用,之前一直没搞懂Feature Tokenizer怎么用。