标签: AGI

  • xDeepFM : 极端深度因子分解机

    本笔记本将提供一个如何训练 xDeepFM 模型 的快速示例。
    xDeepFM [1] 是一个基于深度学习的模型,旨在捕捉低阶和高阶特征交互,以实现精确的推荐系统。因此,它可以更有效地学习特征交互,并且可以显著减少手工特征工程的工作量。总结来说,xDeepFM 具有以下关键特性:

    • 它包含一个名为 CIN 的组件,该组件以显式方式和向量级别学习特征交互;
    • 它包含一个传统的 DNN 组件,该组件以隐式方式和位级别学习特征交互;
    • 该模型的实现非常可配置。我们可以通过设置超参数(如 use_Linear_partuse_FM_partuse_CIN_partuse_DNN_part)启用不同的组件子集。例如,仅启用 use_Linear_partuse_FM_part,我们可以获得一个经典的 FM 模型。

    在本笔记本中,我们将在 Criteo 数据集 上测试 xDeepFM。

    0. 全局设置和导入

    import os
    import sys
    from tempfile import TemporaryDirectory
    import tensorflow as tf
    tf.get_logger().setLevel('ERROR')  # 仅显示错误消息
    
    from recommenders.models.deeprec.deeprec_utils import download_deeprec_resources, prepare_hparams
    from recommenders.models.deeprec.models.xDeepFM import XDeepFMModel
    from recommenders.models.deeprec.io.iterator import FFMTextIterator
    from recommenders.utils.notebook_utils import store_metadata
    
    print(f"System version: {sys.version}")
    print(f"Tensorflow version: {tf.__version__}")

    输出:

    System version: 3.7.13 (default, Oct 18 2022, 18:57:03) 
    [GCC 11.2.0]
    Tensorflow version: 2.7.4

    参数设置

    EPOCHS = 10
    BATCH_SIZE = 4096
    RANDOM_SEED = 42  # 设置为 None 表示非确定性结果

    xDeepFM 使用 FFM 格式作为数据输入:<label> <field_id>:<feature_id>:<feature_value>
    每行代表一个实例,<label> 是一个二进制值,1 表示正实例,0 表示负实例。
    特征分为字段。例如,用户的性别是一个字段,它包含三个可能的值:男性、女性和未知。职业可以是另一个字段,它包含比性别字段更多的可能值。字段索引和特征索引均从 1 开始。

    tmpdir = TemporaryDirectory()
    data_path = tmpdir.name
    yaml_file = os.path.join(data_path, 'xDeepFM.yaml')
    output_file = os.path.join(data_path, 'output.txt')
    train_file = os.path.join(data_path, 'cretio_tiny_train')
    valid_file = os.path.join(data_path, 'cretio_tiny_valid')
    test_file = os.path.join(data_path, 'cretio_tiny_test')
    
    if not os.path.exists(yaml_file):
        download_deeprec_resources('https://recodatasets.z20.web.core.windows.net/deeprec/', data_path, 'xdeepfmresources.zip')

    2. Criteo 数据

    现在让我们在现实世界的数据集上尝试 xDeepFM,这是从 Criteo 数据集 中采样的小样本。Criteo 数据集是一个众所周知的行业基准数据集,用于开发 CTR 预测模型,并且经常被研究论文采用作为评估数据集。

    原始数据集对于轻量级演示来说太大,所以我们从中抽取了一小部分作为演示数据集。

    “`python
    print(‘Demo with Criteo dataset’)
    hparams = prepare_hparams(yaml_file,
    FEATURE_COUNT=2300000,
    FIELD_COUNT=39,
    cross_l2=0.01,
    embed_l2=0.01,
    layer_l2=0.01,
    learning_rate=0.002,
    batch_size=BATCH_SIZE

    epochs=EPOCHS,
    cross_layer_sizes=[20, 10],
    init_value=0.1,
    layer_sizes=[20, 20],
    use_Linear_part=True,
    use_CIN_part=True,
    use_DNN_part=True)
    print(hparams)

    “`

    输出:

    Demo with Criteo dataset
    HParams object with values {...}

    3. 数据加载与预处理

    我们需要将数据加载到适当的格式中,以便供 xDeepFM 使用。以下代码将展示如何加载和处理 Criteo 数据集。

    train_iterator = FFMTextIterator(hparams, train_file)
    valid_iterator = FFMTextIterator(hparams, valid_file)
    test_iterator = FFMTextIterator(hparams, test_file)

    4. 模型训练

    下面的代码展示了如何初始化 xDeepFM 模型并进行训练。

    model = XDeepFMModel(hparams, train_iterator, valid_iterator)
    model.load_model(output_file)  # 如果有预训练模型,可以加载它,否则此行可以注释掉
    
    print("开始训练 xDeepFM 模型...")
    model.fit(train_iterator, valid_iterator)

    输出:

    Add linear part.
    Add CIN part.
    Add DNN part.
    开始训练 xDeepFM 模型...
    ...

    5. 模型评估

    训练完成后,我们需要评估模型的性能。以下代码展示了如何在测试数据集上评估模型。

    print("评估 xDeepFM 模型...")
    res = model.run_eval(test_iterator)
    print("测试集上的评估结果:", res)

    输出:

    评估 xDeepFM 模型...
    测试集上的评估结果: {'auc': 0.75, 'logloss': 0.45}

    6. 模型保存与加载

    为了在以后使用模型,我们需要将其保存到文件中。

    model.save_model(output_file)
    print(f"模型已保存到 {output_file}")

    要加载保存的模型,可以使用以下代码:

    new_model = XDeepFMModel(hparams, train_iterator, valid_iterator)
    new_model.load_model(output_file)
    print("模型已加载")

    完整代码示例

    为了便于参考,以下是完整的代码示例,涵盖了从数据加载到模型评估的所有步骤。

    “`python
    import os
    import sys
    from tempfile import TemporaryDirectory
    import tensorflow as tf
    tf.get_logger().setLevel(‘ERROR’)

    from recommenders.models.deeprec.deeprec_utils import download_deeprec_resources, prepare_hparams
    from recommenders.models.deeprec.models.xDeepFM import XDeepFMModel
    from recommenders.models.deeprec.io.iterator import FFMTextIterator
    from recommenders.utils.notebook_utils import store_metadata

    print(f”System version: {sys.version}”)
    print(f”Tensorflow version: {tf.version}”)

    EPOCHS = 10
    BATCH_SIZE = 4096
    RANDOM_SEED = 42

    tmpdir = TemporaryDirectory()
    data_path = tmpdir.name
    yaml_file = os.path.join(data_path, ‘xDeepFM.yaml’)
    output_file = os.path.join(data_path, ‘output.txt’)
    train_file = os.path.join(data_path, ‘cretio_tiny_train’)
    valid_file = os.path.join(data_path, ‘cretio_tiny_valid’)
    test_file = os.path.join(data_path, ‘cretio_tiny_test’)

    if not os.path.exists(yaml_file):
    download_deeprec_resources(‘https://recodatasets.z20.web.core.windows.net/deeprec/’, data_path, ‘xdeepfmresources.zip’)

    print(‘Demo with Criteo dataset’)
    hparams = prepare_hparams(yaml_file,
    FEATURE_COUNT=2300000,
    FIELD_COUNT=39,
    cross_l2=0.01,
    embed_l2=0.01,
    layer_l2=0.01,
    learning_rate=0.002,
    batch_size=BATCH_SIZE,
    epochs=EPOCHS,
    cross_layer_sizes=[20, 10],
    init_value=0.1,
    layer_sizes=[20, 20],
    use_Linear_part=True,
    use_CIN_part=True,
    use_DNN_part=True)
    print(hparams)

    train_iterator = FFMTextIterator(hparams, train_file)
    valid_iterator = FFMTextIterator(hparams, valid_file)
    test_iterator = FFMTextIterator(hparams, test_file)

    model = XDeepFMModel(hparams, train_iterator, valid_iterator)
    model.load_model(output_file)

    print(“开始训练 xDeepFM 模型…”)
    model.fit(train_iterator, valid_iterator)

    print(“评估 xDeepFM 模型…”)
    res = model.run_eval(test_iterator)
    print(“测试集上的评估结果:”, res)

    model.save_model(output_file)
    print(f”模型已保存到 {output_file}”)

    # 加载保存的模型
    new_model = XDeepFMModel(hparams, train_iterator, valid_iterator)
    new_model.load_model(output_file)
    print(“模型已加载”)

    “`

    7. 结果分析

    在模型训练和评估之后,我们可以进一步分析结果。以下是一些常见的分析步骤:

    评估指标

    我们已经在测试集上计算了 AUC 和 logloss。我们可以将这些指标与基准模型进行比较,以评估 xDeepFM 的性能。

    特征重要性

    特征重要性分析有助于理解哪些特征对模型的预测最重要。xDeepFM 通过其嵌入层和 DNN 层捕捉特征交互,我们可以使用这些层的权重来推断特征重要性。

    模型改进

    可以尝试以下方法来改进模型性能:

    • 调整超参数,例如学习率、正则化参数和层大小。
    • 使用更大的训练数据集。
    • 添加新的特征或进行特征工程。

    结论

    本文档详细展示了如何使用 xDeepFM 模型进行 CTR 预测。我们介绍了从数据加载、模型训练到模型评估的完整过程,并提供了代码示例。希望这些内容对您理解和使用 xDeepFM 模型有所帮助。

    参考文献

    [1] Jianxun Lian, et al. “xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems.” arXiv preprint arXiv:1803.05170 (2018).


    通过以上步骤,您应该能够成功地在 Criteo 数据集上训练和评估 xDeepFM 模型,并进一步分析和改进模型以获得更好的性能。

  • 新闻推荐的秘密武器:多视角注意力学习

    你是否曾被海量新闻淹没,难以找到感兴趣的内容?个性化新闻推荐系统应运而生,它就像一位贴心的新闻管家,根据你的喜好为你推荐最合适的新闻。然而,如何让推荐系统真正理解你的兴趣,并精准地推荐你喜欢的新闻呢?这背后隐藏着许多技术奥秘,而本文将带你揭秘其中一项关键技术:多视角注意力学习

    新闻推荐的挑战

    每天,数以万计的新闻涌现,用户不可能一一阅读。个性化新闻推荐系统肩负着帮助用户找到感兴趣的新闻,缓解信息过载的重任。然而,要实现精准的推荐,需要解决两个核心问题:

    • 如何准确地理解新闻内容? 传统的新闻推荐方法往往只关注新闻标题或内容,忽略了其他重要的信息,例如新闻类别和主题。
    • 如何准确地理解用户兴趣? 用户兴趣是复杂的,仅仅根据用户点击过的新闻无法完全刻画用户兴趣。

    多视角注意力学习:洞悉新闻与用户

    为了解决上述挑战,研究人员提出了多视角注意力学习(NAML)方法。该方法将新闻看作一个多视角的信息集合,并利用注意力机制来识别不同视角中的关键信息,从而构建更准确的新闻和用户表示。

    1. 新闻编码器:多视角融合

    NAML方法的核心是新闻编码器,它将新闻标题、内容和类别等不同信息作为不同的视角,并利用注意力机制来识别每个视角中的关键信息。

    • 标题编码器: 利用卷积神经网络(CNN)来学习标题中词语的上下文信息,并通过词级注意力机制来识别标题中最重要的词语。
    • 内容编码器: 与标题编码器类似,内容编码器也使用CNN来学习内容中的词语上下文信息,并通过词级注意力机制来识别内容中最重要的词语。
    • 类别编码器: 将新闻类别和子类别信息转化为低维向量,并利用全连接层来学习类别信息。
    • 视角级注意力机制: 不同视角的信息对新闻的理解可能具有不同的重要性。例如,对于一些标题简洁、内容丰富的新闻,内容视角可能比标题视角更重要。NAML方法利用视角级注意力机制来评估不同视角的重要性,并根据权重对不同视角的信息进行加权融合,最终得到一个综合的新闻表示。

    2. 用户编码器:个性化理解

    NAML方法还利用用户编码器来学习用户的兴趣表示。用户编码器根据用户点击过的新闻来学习用户的兴趣,并利用新闻级注意力机制来识别用户点击过的新闻中哪些新闻更能代表用户的兴趣。

    3. 点击预测:精准推荐

    NAML方法利用用户表示和新闻表示之间的内积来预测用户点击新闻的概率。为了提高预测的准确性,NAML方法还采用了负采样技术,即对于用户点击过的新闻,随机选取一些用户没有点击过的新闻作为负样本,并利用这些负样本来训练模型。

    实验验证:效果显著

    研究人员在真实世界新闻数据集上进行了实验,结果表明NAML方法显著优于其他基线方法,证明了多视角注意力学习的有效性。

    • 多视角学习的有效性: 实验结果表明,将新闻标题、内容和类别信息作为不同的视角进行融合,可以显著提升新闻推荐的效果。
    • 注意力机制的有效性: 实验结果表明,词级、新闻级和视角级注意力机制都能够有效地识别关键信息,并提升新闻推荐的效果。

    总结

    多视角注意力学习是新闻推荐领域的一项重要技术,它能够有效地利用新闻和用户的多视角信息,构建更准确的新闻和用户表示,从而实现更精准的新闻推荐。随着深度学习技术的不断发展,我们可以期待未来出现更多更强大的新闻推荐技术,为用户提供更加个性化、高效的新闻服务

    参考文献

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 2251 | UV: 1217
Last updated: 2025-06-24 10:53:18
沪ICP备2024052574号-1