【推荐系统】深度学习训练框架(九):推荐系统与LLM在Dataset、Tokenizer阶段的异同

在推荐系统中,Dataset与Tokenizers(分词器)的对应关系,可以理解为 "数据管理与特征处理器" 的协作。但核心区别在于:推荐系统处理的是结构化、多元的特征,而LLM处理的是自然语言文本。

简单来说:

  • Dataset 的角色几乎不变:仍然是数据的管理者、组织者和提供者。
  • Tokenizer 的角色被"特征处理器/编码器"替代 :它们负责将各种原始特征(用户ID、电影ID、年龄、历史序列等)转换成模型可以理解的数值化向量

下表清晰地展示了这种核心映射关系和差异:

概念 NLP (文本) 推荐系统 (结构化数据)
Dataset 的职责 存储和管理(文本, 标签)对, 提供访问接口。 存储和管理(用户特征, 物品特征, 上下文, 标签)对, 提供访问接口。
核心处理单元 Tokenizer 特征处理器 (Feature Processor)
它的任务 文本字符串 转换为词元ID列表 (input_ids)。 各类原始特征 转换为数值向量/嵌入
处理对象 单一的文本序列。 多元特征:用户ID、物品ID、类别、数值、序列等。
典型输出 {'input_ids': [...], 'attention_mask': [...], ...} {'user_embedding': ..., 'item_embedding': ..., 'category': ..., 'price': ...}
核心目的 捕捉词法、句法、语义信息。 捕捉用户兴趣、物品属性、交互上下文信息。

💡 深入理解:推荐系统中的"特征处理器"

推荐系统的"特征处理器"不是一个单一模块,而是一个处理流水线,针对不同类型的特征使用不同的编码方法:

  1. 类别型特征 (如用户ID、电影ID、城市)

    • 对应关系 : 最接近NLP中的Tokenizer
    • 处理方法 : 使用 Embedding Layer
    • 过程 : 原始ID (如 user_123) → 通过查表映射为一个稠密向量。这个向量就是该ID的"嵌入",用于在向量空间中表达其潜在特征。
    • 代码体现 : 通常在模型定义中,会看到 torch.nn.Embedding(num_users, embedding_dim)
  2. 数值型特征 (如年龄、价格、评分次数)

    • 处理方法标准化/归一化 后直接输入,或也通过一个全连接层转换。
    • 过程: 原始数值 → 缩放处理 → 作为标量或向量输入模型。
  3. 序列型特征 (如用户最近点击的10个商品ID)

    • 对应关系: 类似NLP中处理一个句子。
    • 处理方法 : 先对每个ID做嵌入 ,再将得到的向量序列输入 RNN、Transformer 等序列模型来捕捉顺序兴趣。
    • 过程[item_id_1, item_id_2, ...] → 各自嵌入 → 序列模型 → 得到一个代表用户短期兴趣的向量。

📊 一个电影推荐的代码实例

以经典的MovieLens数据集为例,我们来看一个简化版的推荐系统Dataset如何工作:

python 复制代码
import torch
from torch.utils.data import Dataset
import pandas as pd
from sklearn.preprocessing import LabelEncoder, StandardScaler

class MovieLensDataset(Dataset):
    def __init__(self, df):
        self.data = df
        
        # 初始化各种"特征处理器"(替代了单一的Tokenizer)
        self.user_encoder = LabelEncoder() # 处理用户ID
        self.item_encoder = LabelEncoder() # 处理电影ID
        self.scaler = StandardScaler()     # 处理数值特征
        
        # 拟合所有处理器
        self.user_ids = self.user_encoder.fit_transform(df['userId'])
        self.item_ids = self.item_encoder.fit_transform(df['movieId'])
        self.ratings = df['rating'].values.astype('float32')
        
        # 假设我们还有用户年龄特征
        self.user_ages = self.scaler.fit_transform(df['age'].values.reshape(-1, 1)).flatten()
    
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, idx):
        # Dataset负责组织数据
        user_id = self.user_ids[idx]
        item_id = self.item_ids[idx]
        rating = self.ratings[idx]
        user_age = self.user_ages[idx]
        
        # 注意:这里返回的是"处理好的特征ID/数值",
        # 真正的嵌入转换通常在模型内部(nn.Embedding)完成。
        return {
            'user_id': torch.tensor(user_id, dtype=torch.long), # 类似input_ids,但含义单一
            'item_id': torch.tensor(item_id, dtype=torch.long),
            'user_age': torch.tensor(user_age, dtype=torch.float32), # 数值特征
            'rating': torch.tensor(rating, dtype=torch.float32) # 要预测的标签
        }

# 模型定义中会有对应的嵌入层
class RecommenderModel(torch.nn.Module):
    def __init__(self, num_users, num_items, embedding_dim=16):
        super().__init__()
        # 这些Embedding层就是特征处理的核心
        self.user_embedding = torch.nn.Embedding(num_users, embedding_dim)
        self.item_embedding = torch.nn.Embedding(num_items, embedding_dim)
        # 处理数值特征的全连接层
        self.age_fc = torch.nn.Linear(1, embedding_dim)
        
    def forward(self, batch):
        user_emb = self.user_embedding(batch['user_id']) # 将ID转为向量
        item_emb = self.item_embedding(batch['item_id'])
        age_emb = self.age_fc(batch['user_age'].unsqueeze(1))
        # 组合所有特征向量,进行预测...
        combined = user_emb + item_emb + age_emb
        return combined

🎯 总结与类比

步骤 NLP 世界 推荐系统世界
1. 原始输入 一段文本句子。 一组结构化特征(用户, 物品, 上下文)。
2. 特征处理 Tokenizer 将词转为 input_ids 各种编码器 将特征转为 ID/数值/向量
3. 模型理解 nn.Embeddinginput_ids 转为词向量。 nn.Embeddingnn.Linear 等将 特征ID/数值 转为特征向量。
4. 核心目标 捕捉语义, 完成分类/翻译等。 捕捉匹配信号, 预测用户对物品的偏好(评分/点击概率)。

本质是相同的Dataset负责数据的组织与加载 ,而"特征处理器"(替代了Tokenizer)负责将原始数据翻译成模型能理解的数学语言(向量)

如果你在构建一个具体的推荐场景(例如新闻推荐或电商推荐),我可以帮你进一步梳理其中需要哪些具体的"特征处理器"以及如何设计Dataset

相关推荐
凋零蓝玫瑰2 小时前
几何:数学世界的空间密码
人工智能·算法·机器学习
roman_日积跬步-终至千里2 小时前
【模式识别与机器学习(13)】神经网络与深度学习(二):卷积神经网络、正则化、优化算法、循环神经网络
深度学习·神经网络·机器学习
小程故事多_802 小时前
基于LangGraph与Neo4j构建智能体级GraphRAG:打造下一代膳食规划助手
人工智能·aigc·neo4j
Bdygsl2 小时前
数字图像处理总结 Day 2 —— 数字化
图像处理·人工智能·计算机视觉
智谱开放平台2 小时前
让 AI 真正懂仓库:如何用 CLAUDE.md 将 Claude Code 的工作效率发挥到极致
人工智能·claude
糯米酒2 小时前
不想使用docker部署n8n的看过来,你可以这样做
人工智能
爪哇部落算法小助手3 小时前
每日两题day61
数据结构·c++·算法
roman_日积跬步-终至千里3 小时前
【模式识别与机器学习(17)】聚类分析教程【2】:高级方法与离群点分析
人工智能·机器学习·支持向量机