分类: AGI

  • LightGBM:电商广告点击率预估利器

    引言

    在电商平台中,广告点击率 (CTR) 预估对于广告投放效果至关重要。准确预测用户点击广告的概率,可以帮助广告主优化广告投放策略,提升广告收益。LightGBM 作为一种高效的梯度提升决策树算法,在 CTR 预估任务中表现出色。本篇文章将以 lightgbm_tinycriteo.ipynb 示例为例,介绍如何使用 LightGBM 训练 CTR 预估模型,并探讨模型优化策略。

    LightGBM 简介

    LightGBM 是微软开源的一种梯度提升框架,它使用基于树的学习算法,并针对分布式计算和高效率进行了优化。LightGBM 具有以下优势:

    • 训练速度快,效率高。
    • 内存占用低。
    • 预测精度高。
    • 支持并行计算和 GPU 加速。
    • 能够处理大规模数据。

    数据准备

    本示例使用 Criteo 数据集,该数据集是 CTR 预估领域的经典基准数据集。原始数据集包含 39 个特征,其中 13 个为数值特征 (I1-I13),26 个为类别特征 (C1-C26)。由于原始数据集规模较大,本示例使用了一个包含约 10 万个样本的子集。

    # 定义特征列和标签列
    nume_cols = ["I" + str(i) for i in range(1, 14)]
    cate_cols = ["C" + str(i) for i in range(1, 27)]
    label_col = "Label"
    
    # 加载数据集
    header = [label_col] + nume_cols + cate_cols
    with TemporaryDirectory() as tmp:
        all_data = criteo.load_pandas_df(size=SIZE, local_cache_path=tmp, header=header)

    将数据集按照时间顺序划分为训练集、验证集和测试集,划分比例为 8:1:1。

    # 划分数据集
    length = len(all_data)
    train_data = all_data.loc[:0.8*length-1]
    valid_data = all_data.loc[0.8*length:0.9*length-1]
    test_data = all_data.loc[0.9*length:]

    模型训练与评估

    基础用法

    对于 LightGBM 的基础用法,只需对类别特征进行简单的顺序编码即可。

    # 顺序编码
    ord_encoder = ce.ordinal.OrdinalEncoder(cols=cate_cols)
    
    # 编码数据
    train_x, train_y = encode_csv(train_data, ord_encoder, label_col)
    valid_x, valid_y = encode_csv(valid_data, ord_encoder, label_col, "transform")
    test_x, test_y = encode_csv(test_data, ord_encoder, label_col, "transform")

    创建 LightGBM 数据集,并设置模型参数。

    # 创建 LightGBM 数据集
    lgb_train = lgb.Dataset(train_x, train_y.reshape(-1), params=params, categorical_feature=cate_cols)
    lgb_valid = lgb.Dataset(valid_x, valid_y.reshape(-1), reference=lgb_train, categorical_feature=cate_cols)
    lgb_test = lgb.Dataset(test_x, test_y.reshape(-1), reference=lgb_train, categorical_feature=cate_cols)
    
    # 训练模型
    lgb_model = lgb.train(params,
                          lgb_train,
                          num_boost_round=NUM_OF_TREES,
                          valid_sets=lgb_valid,
                          categorical_feature=cate_cols,
                          callbacks=[lgb.early_stopping(EARLY_STOPPING_ROUNDS)])
    
    # 预测测试集结果
    test_preds = lgb_model.predict(test_x)
    
    # 计算 AUC 和 Logloss
    auc = roc_auc_score(np.asarray(test_y.reshape(-1)), np.asarray(test_preds))
    logloss = log_loss(np.asarray(test_y.reshape(-1)), np.asarray(test_preds))
    
    print({"auc": auc, "logloss": logloss})

    优化用法

    为了进一步提升模型性能,可以对类别特征进行标签编码和二进制编码,并将数值特征的缺失值填充为均值。

    # 标签编码和二进制编码
    num_encoder = lgb_utils.NumEncoder(cate_cols, nume_cols, label_col)
    train_x, train_y = num_encoder.fit_transform(train_data)
    valid_x, valid_y = num_encoder.transform(valid_data)
    test_x, test_y = num_encoder.transform(test_data)
    
    # 训练模型
    # ...
    
    # 预测测试集结果
    test_preds = lgb_model.predict(test_x)
    
    # 计算 AUC 和 Logloss
    auc = roc_auc_score(np.asarray(test_y.reshape(-1)), np.asarray(test_preds))
    logloss = log_loss(np.asarray(test_y.reshape(-1)), np.asarray(test_preds))
    
    print({"auc": auc, "logloss": logloss})

    模型保存与加载

    训练完成后,可以使用 save_model 方法保存模型,并使用 Booster 类加载模型。

    # 保存模型
    with TemporaryDirectory() as tmp:
        save_file = os.path.join(tmp, "finished.model")
        lgb_model.save_model(save_file)
        loaded_model = lgb.Booster(model_file=save_file)
    
    # 使用加载的模型进行预测
    test_preds = loaded_model.predict(test_x)

    总结

    LightGBM 是一种高效的梯度提升决策树算法,在 CTR 预估任务中表现出色。通过对类别特征进行编码和缺失值填充等优化策略,可以进一步提升模型性能。

  • GeoIMC:融合几何信息的电影推荐算法

    引言

    推荐系统领域中,矩阵分解技术是协同过滤算法的重要分支。传统的矩阵分解方法通常只考虑用户和物品之间的交互信息,而忽略了用户和物品本身的特征。GeoIMC 算法将用户和物品的特征信息融入到矩阵分解过程中,并利用黎曼优化方法求解模型参数,从而提升推荐效果。

    GeoIMC 算法原理

    GeoIMC 算法基于 Jawanpuria 等人 (2019) 的研究成果,将用户和物品的特征信息融入到矩阵分解过程中。以 MovieLens-100K (ML100K) 数据集为例,假设 $X \in R^{m \times d_1}$ 和 $Z \in R^{n \times d_2}$ 分别表示用户和电影的特征矩阵,$M \in R^{m \times n}$ 表示用户对电影的评分矩阵。GeoIMC 算法将评分矩阵建模为 $M = XUBV^TZ^T$,其中 $U \in R^{d_1 \times k}$、$V \in R^{d_2 \times k}$ 和 $B \in R^{k \times k}$ 分别为正交矩阵、正交矩阵和对称正定矩阵。模型参数通过 Pymanopt 工具包进行黎曼优化求解。

    数据准备

    本示例使用 MovieLens 100K 数据集,并使用与 Xin Dong 等人 (2017) 相同的方法生成用户和电影的特征向量。

    # 创建临时目录下载 ML100K 数据集
    dp = tempfile.mkdtemp(suffix='-geoimc')
    movielens.download_movielens(MOVIELENS_DATA_SIZE, f"{dp}/ml-100k.zip")
    with zipfile.ZipFile(f"{dp}/ml-100k.zip", 'r') as z:
        z.extractall(dp)
    
    # 加载数据集和特征
    dataset = ML_100K(
        normalize=normalize,
        target_transform='binarize'
    )
    dataset.load_data(f"{dp}/ml-100k/")

    模型训练

    使用 IMCProblem 类初始化 GeoIMC 问题,并设置正则化参数和模型秩。

    np.random.seed(10)
    prblm = IMCProblem(
        dataset.training_data,
        lambda1=regularizer,
        rank=rank
    )
    
    # 求解优化问题
    prblm.solve(
        max_time,
        max_iters,
        verbosity
    )

    生成推荐结果

    使用 Inferer 类初始化推理器,并使用训练得到的模型参数预测用户对电影的评分。

    # 初始化推理器
    inferer = Inferer(
        method='dot'
    )
    
    # 预测评分
    predictions = inferer.infer(
        dataset.test_data,
        prblm.W
    )

    模型评估

    使用 rmsemae 函数计算模型的均方根误差 (RMSE) 和平均绝对误差 (MAE)。

    # 准备测试集和预测结果数据框
    user_ids = dataset.test_data.get_data().tocoo().row
    item_ids = dataset.test_data.get_data().tocoo().col
    test_df = pd.DataFrame(
        data={
            "userID": user_ids,
            "itemID": item_ids,
            "rating": dataset.test_data.get_data().data
        }
    )
    predictions_df = pd.DataFrame(
        data={
            "userID": user_ids,
            "itemID": item_ids,
            "prediction": [predictions[uid, iid] for uid, iid in list(zip(user_ids, item_ids))]
        }
    )
    
    # 计算 RMSE 和 MAE
    RMSE = rmse(
        test_df,
        predictions_df
    )
    MAE = mae(
        test_df,
        predictions_df
    )
    
    print(f"""
    RMSE: {RMSE}
    MAE: {MAE}
    """)

    总结

    GeoIMC 算法通过将用户和物品的特征信息融入到矩阵分解过程中,并利用黎曼优化方法求解模型参数,能够有效提升推荐效果。本示例展示了如何使用 Recommenders 工具包实现 GeoIMC 算法,并对模型性能进行了评估。

    参考文献

    [1] Pratik Jawanpuria, Arjun Balgovind, Anoop Kunchukuttan, Bamdev Mishra. Learning Multilingual Word Embeddings in Latent Metric Space: A Geometric Approach. Transaction of the Association for Computational Linguistics (TACL), Volume 7, p.107-120, 2019.

    [2] Xin Dong, Lei Yu, Zhonghuo Wu, Yuxia Sun, Lingfeng Yuan, Fangxi Zhang. A Hybrid Collaborative Filtering Model withDeep Structure for Recommender Systems.
    Proceedings of the Thirty-First AAAI Conference on Artificial Intelligence (AAAI-17), p.1309-1315, 2017.

  • FastAI:快速构建电影推荐系统

    引言

    FastAI 作为一个易于使用且功能强大的深度学习库,为推荐系统的构建提供了便捷的工具。本篇文章将以 fastai_movielens.ipynb 示例为例,介绍如何利用 FastAI 框架,快速构建一个基于协同过滤的电影推荐系统,并对模型性能进行评估。

    数据准备

    本示例使用经典的 MovieLens 数据集,该数据集包含用户对电影的评分信息。首先,使用 recommenders.datasets.movielens 模块加载数据集,并确保用户 ID 和电影 ID 以字符串类型加载,避免与嵌入 ID 混淆。

    ratings_df = movielens.load_pandas_df(
        size=MOVIELENS_DATA_SIZE,
        header=[USER,ITEM,RATING,TIMESTAMP]
    )
    
    # 确保 ID 以字符串类型加载
    ratings_df[USER] = ratings_df[USER].astype('str')
    ratings_df[ITEM] = ratings_df[ITEM].astype('str')

    接下来,使用 python_stratified_split 函数将数据集划分为训练集/验证集和测试集,划分比例为 75:25。

    train_valid_df, test_df = python_stratified_split(
        ratings_df,
        ratio=0.75,
        min_rating=1,
        filter_by="item",
        col_user=USER,
        col_item=ITEM
    )
    
    # 从测试集中移除“冷启动”用户
    test_df = test_df[test_df.userID.isin(train_valid_df.userID)]

    模型训练

    FastAI 提供了 collab_learner 函数,用于快速构建协同过滤模型。默认情况下,collab_learner 使用 EmbeddingDotBias 模型,该模型为用户和电影创建嵌入向量,并将它们映射到指定维度的浮点数空间。

    # 设置随机种子以确保结果可复现
    np.random.seed(101)
    torch.manual_seed(101)
    torch.cuda.manual_seed_all(101)
    
    # 创建 CollabDataLoaders
    data = CollabDataLoaders.from_df(train_valid_df,
                                         user_name=USER,
                                         item_name=ITEM,
                                         rating_name=RATING,
                                         valid_pct=0)
    
    # 创建 collab_learner
    learn = collab_learner(data, n_factors=N_FACTORS, y_range=[0,5.5], wd=1e-1)

    collab_learner 中,n_factors 参数表示隐含特征维度,y_range 参数设置评分范围,wd 参数设置权重衰减以进行正则化。

    使用 fit_one_cycle 函数训练模型,并设置学习率和迭代次数。

    with Timer() as train_time:
        learn.fit_one_cycle(EPOCHS, lr_max=5e-3)

    生成推荐结果

    为了生成推荐结果,首先需要获取模型已知的所有用户和电影,以及测试集中的用户。

    # 获取所有用户和电影
    total_users, total_items = learner.dls.classes.values()
    total_items = total_items[1:]
    total_users = total_users[1:]
    
    # 获取测试集中的用户
    test_users = test_df[USER].unique()
    test_users = np.intersect1d(test_users, total_users)

    然后,构建测试集用户和所有已知电影的笛卡尔积,并移除训练集中出现过的用户-电影组合。

    # 构建笛卡尔积
    users_items = cartesian_product(np.array(test_users),np.array(total_items))
    users_items = pd.DataFrame(users_items, columns=[USER,ITEM])
    
    # 移除训练集中出现过的组合
    training_removed = pd.merge(users_items, train_valid_df.astype(str), on=[USER, ITEM], how='left')
    training_removed = training_removed[training_removed[RATING].isna()][[USER, ITEM]]

    最后,使用 score 函数对模型进行评分,并获取 Top-K 推荐结果。

    with Timer() as test_time:
        top_k_scores = score(learner,
                             test_df=training_removed,
                             user_col=USER,
                             item_col=ITEM,
                             prediction_col=PREDICTION)

    模型评估

    使用 recommenders.evaluation.python_evaluation 模块中的评估指标对模型进行评估。

    # 排序指标评估
    eval_map = map(test_df, top_k_scores, col_user=USER, col_item=ITEM,
                   col_rating=RATING, col_prediction=PREDICTION,
                   relevancy_method="top_k", k=TOP_K)
    
    eval_ndcg = ndcg_at_k(test_df, top_k_scores, col_user=USER, col_item=ITEM,
                          col_rating=RATING, col_prediction=PREDICTION,
                          relevancy_method="top_k", k=TOP_K)
    
    # ... 其他排序指标评估 ...
    
    # 评分预测指标评估
    eval_rmse = rmse(test_df, scores, col_user=USER, col_item=ITEM, col_rating=RATING, col_prediction=PREDICTION)
    eval_mae = mae(test_df, scores, col_user=USER, col_item=ITEM, col_rating=RATING, col_prediction=PREDICTION)
    
    # ... 其他评分预测指标评估 ...
    
    # 打印评估指标
    print(f"Model:\t\t{learn.__class__.__name__}\n"
          f"Top K:\t\t{TOP_K}\n"
          f"MAP:\t\t{eval_map:.6f}\n"
          f"NDCG:\t\t{eval_ndcg:.6f}\n"
          # ... 打印其他排序指标 ...
          f"RMSE:\t\t\t{eval_rmse:.6f}\n"
          f"MAE:\t\t\t{eval_mae:.6f}\n"
          # ... 打印其他评分预测指标 ...
         )

    总结

    本篇文章以 fastai_movielens.ipynb 为例,介绍了如何使用 FastAI 快速构建一个基于协同过滤的电影推荐系统。FastAI 提供了简洁的接口和高效的训练方法,使得构建推荐系统变得更加容易。

  • 深度知识感知网络:DKN 新闻推荐算法解析

    引言

    在信息爆炸的时代,如何从海量新闻中为用户推荐感兴趣的内容,成为了推荐系统研究的热点之一。传统的基于 ID 的协同过滤算法往往难以捕捉新闻内容的语义信息,而基于内容的推荐算法则需要人工提取新闻特征,效率低下。深度知识感知网络 (DKN) 算法应运而生,它结合了深度学习和知识图谱的优势,能够自动学习新闻内容的语义表示,并利用知识图谱中的实体信息提升推荐效果。

    DKN 算法原理

    DKN 算法的核心思想是将新闻内容和知识图谱信息融合到一个深度学习模型中,通过联合学习语义级和知识级的新闻表示,实现更精准的推荐。具体来说,DKN 算法主要包含以下几个步骤:

    1. 知识图谱表示学习: 使用 TransX 方法将知识图谱中的实体和关系嵌入到低维向量空间中,得到实体嵌入向量。
    2. 新闻语义表示学习: 使用卷积神经网络 (CNN) 对新闻标题进行编码,得到新闻语义嵌入向量。
    3. 知识感知卷积神经网络 (KCNN): 将实体嵌入向量和新闻语义嵌入向量融合,并使用 KCNN 进行特征提取,得到最终的新闻表示向量。
    4. 注意力机制: 使用注意力机制对用户的历史点击行为进行加权平均,得到用户的兴趣表示向量。
    5. 点击率预测: 将新闻表示向量和用户兴趣表示向量输入到一个全连接神经网络中,预测用户点击该新闻的概率。

    MIND 数据集

    MIND 数据集是一个大规模英文新闻数据集,包含了 1,000,000 用户、161,013 篇新闻文章和 15,777,377 条点击日志。每篇新闻文章包含丰富的文本内容,包括标题、摘要、正文、类别和实体。每条点击日志包含用户的点击事件、未点击事件以及该用户在该次点击之前的历史点击行为。

    本示例使用 MIND 数据集的子集 MIND demo,包含 500 用户、9,432 篇新闻文章和 6,134 条点击日志。

    DKN 模型训练

    首先,需要下载 MIND demo 数据集和预训练的词嵌入、实体嵌入和上下文嵌入文件。

    tmpdir = TemporaryDirectory()
    data_path = os.path.join(tmpdir.name, "mind-demo-dkn")
    
    # ... 定义数据文件路径 ...
    
    if not os.path.exists(yaml_file):
        download_deeprec_resources("https://recodatasets.z20.web.core.windows.net/deeprec/", tmpdir.name, "mind-demo-dkn.zip")

    然后,设置模型超参数,并创建 DKN 模型。

    # 设置超参数
    EPOCHS = 10
    HISTORY_SIZE = 50
    BATCH_SIZE = 500
    
    # 创建 DKN 模型
    hparams = prepare_hparams(yaml_file,
                              news_feature_file = news_feature_file,
                              user_history_file = user_history_file,
                              wordEmb_file=wordEmb_file,
                              entityEmb_file=entityEmb_file,
                              contextEmb_file=contextEmb_file,
                              epochs=EPOCHS,
                              history_size=HISTORY_SIZE,
                              batch_size=BATCH_SIZE)
    
    model = DKN(hparams, DKNTextIterator)

    最后,使用训练集和验证集对模型进行训练。

    model.fit(train_file, valid_file)

    模型评估

    模型训练完成后,可以使用测试集对模型性能进行评估。

    res = model.run_eval(test_file)
    print(res)

    评估指标包括 AUC、Group AUC、Mean MRR、NDCG@5 和 NDCG@10。

    总结

    DKN 算法是一种结合了深度学习和知识图谱的先进新闻推荐算法,能够有效提升推荐效果。微软 Recommenders 工具提供了 DKN 算法的示例代码,方便用户快速上手并进行实验。

  • 基于 PySpark 的电影推荐系统:深入解析 ALS 算法

    引言

    协同过滤算法是推荐系统中应用最广泛的算法之一,而交替最小二乘法 (ALS) 则是协同过滤算法中的一种经典算法。本篇文章将以微软 Recommenders 工具中的 als_movielens.ipynb 示例为例,详细介绍如何使用 PySpark 实现基于 ALS 算法的电影推荐系统,并对模型性能进行评估。

    数据准备

    本示例使用经典的 MovieLens 数据集,该数据集包含了用户对电影的评分信息。首先,需要使用 recommenders.datasets.movielens 模块加载数据集,并指定使用的数据集大小和数据格式。

    # 定义数据格式
    schema = StructType(
        (
            StructField(COL_USER, IntegerType()),
            StructField(COL_ITEM, IntegerType()),
            StructField(COL_RATING, FloatType()),
            StructField(COL_TIMESTAMP, LongType()),
        )
    )
    
    # 加载 MovieLens 100k 数据集
    data = movielens.load_spark_df(spark, size=MOVIELENS_DATA_SIZE, schema=schema)
    data.show()

    接下来,使用 spark_random_split 函数将数据集划分为训练集和测试集,划分比例为 75:25。

    train, test = spark_random_split(data, ratio=0.75, seed=123)

    模型构建

    使用 PySpark MLlib 中的 ALS 模块构建 ALS 模型。

    # 设置模型参数
    als = ALS(
        rank=10,
        maxIter=15,
        implicitPrefs=False,
        regParam=0.05,
        coldStartStrategy='drop',
        nonnegative=False,
        seed=42,
        **header
    )
    
    # 训练模型
    with Timer() as train_time:
        model = als.fit(train)

    在 ALS 模型中,rank 参数表示隐含特征维度,maxIter 参数表示最大迭代次数,regParam 参数表示正则化系数。

    生成推荐结果

    为了避免推荐用户已经评分过的电影,需要将训练集中出现过的用户-电影组合从推荐结果中剔除。

    with Timer() as test_time:
        # 生成所有用户-电影组合
        users = train.select(COL_USER).distinct()
        items = train.select(COL_ITEM).distinct()
        user_item = users.crossJoin(items)
    
        # 预测评分
        dfs_pred = model.transform(user_item)
    
        # 剔除训练集中出现过的用户-电影组合
        dfs_pred_exclude_train = dfs_pred.alias("pred").join(
            train.alias("train"),
            (dfs_pred[COL_USER] == train[COL_USER]) & (dfs_pred[COL_ITEM] == train[COL_ITEM]),
            how='outer'
        )
    
        # 获取最终推荐结果
        top_all = dfs_pred_exclude_train.filter(dfs_pred_exclude_train[f"train.{COL_RATING}"].isNull()) \
            .select('pred.' + COL_USER, 'pred.' + COL_ITEM, 'pred.' + "prediction")
    
        # 触发计算
        top_all.cache().count()

    模型评估

    使用 SparkRankingEvaluationSparkRatingEvaluation 模块对模型进行评估。

    # 排序指标评估
    rank_eval = SparkRankingEvaluation(test, top_all, k = TOP_K, col_user=COL_USER, col_item=COL_ITEM,
                                        col_rating=COL_RATING, col_prediction="prediction",
                                        relevancy_method="top_k")
    
    # 评分预测指标评估
    rating_eval = SparkRatingEvaluation(test, prediction, col_user=COL_USER, col_item=COL_ITEM,
                                        col_rating=COL_RATING, col_prediction="prediction")
    
    # 打印评估指标
    print(f"Model:\tALS\n"
          f"Top K:\t{rank_eval.k}\n"
          f"MAP:\t{rank_eval.map_at_k():.6f}\n"
          f"NDCG:\t{rank_eval.ndcg_at_k():.6f}\n"
          f"Precision@K:\t{rank_eval.precision_at_k():.6f}\n"
          f"Recall@K:\t{rank_eval.recall_at_k():.6f}\n"
          f"RMSE:\t{rating_eval.rmse():.6f}\n"
          f"MAE:\t{rating_eval.mae():.6f}\n"
          f"Explained variance:\t{rating_eval.exp_var():.6f}\n"
          f"R squared:\t{rating_eval.rsquared():.6f}")

    总结

    本篇文章以 als_movielens.ipynb 为例,详细介绍了如何使用 PySpark 实现基于 ALS 算法的电影推荐系统,并对模型性能进行了评估。 ALS 算法原理简单,易于实现,并且可以通过调节参数来控制模型的复杂度,适用于各种规模的数据集。

  • 快速上手推荐系统:微软 Recommenders 示例精解

    引言

    想要快速体验不同推荐算法的魅力,并构建自己的推荐系统原型?微软 Recommenders 工具的 00_quick_start 目录提供了一系列开箱即用的 Jupyter Notebook 示例,涵盖了从数据准备、模型构建到模型评估的完整流程。

    示例概览

    00_quick_start 目录下的示例 Notebook 涵盖了多种经典和先进的推荐算法,并使用了不同的数据集和运行环境,具体如下表所示:

    示例数据集运行环境描述
    alsMovieLensPySpark使用交替最小二乘法 (ALS) 预测电影评分,在 PySpark 环境中运行。
    dknMINDPython CPU, GPU使用深度知识感知网络 (DKN) 进行新闻推荐,利用知识图谱信息,在 Python+GPU (TensorFlow) 环境中运行。
    fastaiMovieLensPython CPU, GPU使用 FastAI 推荐系统预测电影评分,在 Python+GPU (PyTorch) 环境中运行。

    注意: 表格中只列举了部分示例,完整列表请参考 README.md

    示例详解

    下面以 sar_movielens.ipynb 为例,介绍如何使用 Recommenders 快速构建一个简单的推荐系统。

    1. 数据准备

    该示例使用了 MovieLens 数据集,其中包含用户对电影的评分信息。首先,需要使用 recommenders.datasets.movielens 模块加载数据集。

    from recommenders.datasets.movielens import load_pandas_dataframe
    
    # 加载 MovieLens 100k 数据集
    df = load_pandas_dataframe(size='100k')

    2. 模型构建

    该示例使用了简单的推荐算法 (SAR),该算法基于用户历史行为计算物品之间的相似度,并根据相似度进行推荐。

    from recommenders.models.sar import SAR
    
    # 创建 SAR 模型
    model = SAR(
        col_user="userID",
        col_item="itemID",
        col_rating="rating",
        similarity_type="cosine",
        time_decay_coefficient=1.0,
        time_unit="week",
    )
    
    # 训练模型
    model.fit(df)

    3. 模型评估

    模型训练完成后,可以使用 recommenders.evaluation.python_evaluation 模块中的评估指标对模型进行评估。

    from recommenders.evaluation.python_evaluation import map_at_k, ndcg_at_k
    
    # 生成推荐结果
    top_k = 10
    user_ids = df["userID"].unique()
    recommendations = model.recommend_k_items(df, user_ids, top_k=top_k)
    
    # 计算评估指标
    map_value = map_at_k(df, recommendations, col_user="userID", col_item="itemID", col_rating="rating", k=top_k)
    ndcg_value = ndcg_at_k(df, recommendations, col_user="userID", col_item="itemID", col_rating="rating", k=top_k)
    
    print(f"MAP@{top_k}: {map_value:.4f}")
    print(f"NDCG@{top_k}: {ndcg_value:.4f}")

    总结

    微软 Recommenders 提供的快速入门示例可以帮助您快速了解不同推荐算法的原理和使用方法,并构建自己的推荐系统原型。

  • 将 Recommenders 示例无缝迁移到 AzureML 云平台

    引言

    随着推荐系统规模的扩大和对训练效率要求的提高,将本地实验迁移到云平台成为一种趋势。Azure 机器学习服务(AzureML)为开发者提供了一个强大的云端环境,可以用于数据准备、模型训练、测试、部署、管理和跟踪。

    本指南将以 run_notebook_on_azureml.ipynb 为例,介绍如何将 Recommenders 示例 Notebook 提交到 AzureML 计算目标,利用云平台的优势加速推荐系统开发流程。

    AzureML 简介

    AzureML 提供了丰富的功能,包括:

    • 管理云资源,用于监控、记录和组织机器学习实验。
    • 支持本地和云端训练模型,包括 GPU 加速训练。
    • 易于扩展,只需创建并指向新的计算目标即可应对数据集增长。

    准备工作

    使用 AzureML 之前,需要完成以下准备工作:

    • 拥有 Azure 订阅。如果没有,可以创建一个免费帐户,并试用 Azure 机器学习服务的免费或付费版本。
    • 安装 azure.contrib.notebook 包。
    #!pip install "azureml.contrib.notebook>=1.0.21.1"

    连接到 AzureML 工作区

    AzureML 工作区是用于组织和协调机器学习工作流的 Azure 资源,它协调存储、数据库和计算资源,为实验、部署、推理和模型监控提供额外功能。

    以下代码将获取或创建一个 AzureML 工作区,并将配置保存到 aml_config/config.json 文件中。

    ws = Workspace.create(
        name="<WORKSPACE_NAME>",
        subscription_id="<SUBSCRIPTION_ID>",
        resource_group="<RESOURCE_GROUP>",
        location="<WORKSPACE_REGION>"
        exist_ok=True,
    )

    创建或连接 Azure 机器学习计算资源

    Azure 机器学习计算是一种托管计算基础设施,允许用户轻松创建单节点到多节点的计算资源。

    以下代码将创建一个 CPU 集群作为远程计算目标。

    # 远程计算(集群)配置
    VM_SIZE = 'STANDARD_D2_V2'
    MIN_NODES = 0
    MAX_NODES = 2
    
    CLUSTER_NAME = 'cpucluster'
    
    try:
        compute_target = ComputeTarget(workspace=ws, name=CLUSTER_NAME)
        print("找到现有计算目标")
    except:
        print("正在创建新的计算目标...")
        # 指定新集群的配置
        compute_config = AmlCompute.provisioning_configuration(
            vm_size=VM_SIZE,
            min_nodes=MIN_NODES,
            max_nodes=MAX_NODES
        )
        # 使用指定的名称和配置创建集群
        compute_target = ComputeTarget.create(ws, CLUSTER_NAME, compute_config)
        # 等待集群完成,显示输出日志
        compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

    提交 Notebook

    以下代码将 sar_movielens.ipynb Notebook 提交到 AzureML 计算目标。

    NOTEBOOK_NAME = 'sar_movielens.ipynb'
    experiment_name = NOTEBOOK_NAME.strip(".ipynb")
    # ... 设置运行配置 ...
    
    cfg = NotebookRunConfig(source_directory='../',
                                notebook='notebooks/00_quick_start/' + NOTEBOOK_NAME,
                                output_notebook='outputs/out.ipynb',
                                parameters={"MOVIELENS_DATA_SIZE": "100k", "TOP_K": 10},
                                run_config=run_config)
    
    run = exp.submit(cfg)
    run

    监控运行进度

    可以使用 Jupyter 小部件监控运行进度。小部件会每隔 10-15 秒提供一次实时更新,直到作业完成。

    RunDetails(run).show()

    查看指标

    运行完成后,可以使用 run.get_metrics() 查看记录的指标。

    metrics = run.get_metrics()
    print(metrics)

    释放计算资源

    为避免不必要的费用,请确保在使用后释放创建的计算目标。

    # 删除计算目标
    compute_target.delete()

    总结

    通过将 Recommenders 示例 Notebook 提交到 AzureML 云平台,可以充分利用云计算的优势,加速推荐系统开发流程。AzureML 提供了丰富的功能和灵活的配置选项,可以满足不同规模和需求的推荐系统开发。

  • 微软 Recommenders:推荐系统实战宝典

    引言

    构建一个高效的推荐系统并非易事,需要对数据进行预处理、选择合适的算法、进行模型训练和评估,最终才能将其部署到生产环境。为了帮助开发者和研究人员更好地应对这些挑战,微软开源了 Recommenders 工具,并提供了一系列 Jupyter Notebook 示例和最佳实践,涵盖了推荐系统开发的完整流程。

    示例概览

    Recommenders 的示例 Notebook 按照功能和用途被组织在不同的目录下,具体如下表所示:

    目录是否支持本地运行描述
    00_quick_start快速入门示例,演示如何在本地环境中使用推荐算法构建推荐系统。
    01_prepare_data数据准备示例,为不同的推荐算法准备和加载数据。
    02_model_collaborative_filtering协同过滤算法模型训练和评估示例,深入探讨算法原理和实现细节。

    本地运行示例

    大部分示例 Notebook 都可以在本地 Linux 机器上直接运行,只需按照 说明 正确设置环境即可。

    注意: 某些示例可能需要异构计算实例,例如安装了 Spark 框架的 CPU 机器集群或配备 GPU 设备的机器。因此,建议在 Linux 数据科学虚拟机 (Ubuntu) 上运行这些 Notebook,因为该虚拟机预先配置了单节点 Spark 和/或 GPU 设备。

    Azure 云端增强

    为了提高大规模开发推荐系统的效率,部分示例 Notebook 还使用了 Azure 云产品和服务,例如:

    • Azure 机器学习服务: 用于训练、部署、自动化和管理机器学习模型的云服务,在示例中广泛用于超参数调整、指标跟踪和监控、计算资源扩展以及 Web 服务部署等任务。
    • Azure 数据科学虚拟机: 主要用作远程服务器,用户可以轻松配置本地和云环境以运行示例 Notebook。
    • Azure Cosmos DB: 用于存储数据,例如在模型部署示例中,将模型生成的推荐结果存储在 Cosmos DB 中以实现实时服务。
    • Azure Databricks: 主要用于在分布式计算环境中开发基于 Spark 的推荐系统,例如 Spark ALS 算法。
    • Azure Kubernetes 服务: 用于服务推荐模型或使用推荐结果为应用程序服务。

    将现有 Notebook 提交到 Azure 机器学习

    run_notebook_on_azureml 示例 Notebook 提供了一个框架,可以直接将现有 Notebook 提交到 Azure 机器学习计算目标。设置好计算目标并创建运行配置后,只需替换 Notebook 文件名即可直接提交 Notebook。

    cfg = NotebookRunConfig(source_directory='../',
                                notebook='examples/00_quick_start/' + NOTEBOOK_NAME,
                                output_notebook='outputs/out.ipynb',
                                parameters={"MOVIELENS_DATA_SIZE": "100k", "TOP_K": 10},
                                run_config=run_config)

    所有使用 store_metadata 记录的指标和参数都将作为跟踪指标存储在运行中。最初提交的 Notebook 将作为输出 Notebook out.ipynb 存储在 Azure 门户的输出选项卡中。

    总结

    微软 Recommenders 提供的示例 Notebook 为开发者和研究人员提供了一个宝贵的学习资源,可以帮助他们快速掌握构建高性能推荐系统的最佳实践。无论是本地运行还是借助 Azure 云平台,Recommenders 都能帮助您轻松构建个性化推荐体验。

  • 深入浅出推荐系统:微软开源工具 Recommenders 解析

    引言

    在信息爆炸的时代,人们面对海量数据往往无所适从。推荐系统应运而生,它通过分析用户的历史行为和偏好,为用户提供个性化的推荐内容,帮助用户快速找到自己感兴趣的信息。从电商平台的商品推荐,到社交媒体的内容推送,再到音乐软件的歌曲推荐,推荐系统已经渗透到我们生活的方方面面。

    微软开源工具 Recommenders 正是为构建、实验和部署各种经典和先进的推荐系统而生。它提供了一系列 Jupyter Notebook 示例和最佳实践,涵盖了推荐系统构建的五个关键任务:

    1. 数据准备:为不同的推荐算法准备和加载数据。
    2. 模型构建:使用各种经典和深度学习推荐算法构建模型,例如交替最小二乘法(ALS)或极深因子分解机(xDeepFM)。
    3. 模型评估:使用离线指标评估算法性能。
    4. 模型选择和优化:调整和优化推荐模型的超参数。
    5. 模型部署:在 Azure 生产环境中部署模型。

    Recommenders 提供了多个实用工具,用于支持加载数据集、评估模型输出和划分训练/测试数据等常见任务。它还包含了一些先进算法的实现,供用户自学和定制自己的应用程序。

    算法概览

    Recommenders 提供了丰富的推荐算法,涵盖了协同过滤、基于内容的过滤等多种类型,具体如下表所示:

    算法类型描述示例
    交替最小二乘法 (ALS)协同过滤适用于大型数据集的显式或隐式反馈的矩阵分解算法,针对可扩展性和分布式计算能力进行了优化。它在 PySpark 环境中工作。快速入门 / 深入探讨
    注意力异步奇异值分解 (A2SVD)协同过滤基于序列的算法,旨在使用注意力机制捕获用户的长期和短期偏好。它在 CPU/GPU 环境中工作。快速入门

    注意: 表格中只列举了部分算法,完整列表请参考 README.md

    算法比较

    为了方便用户比较不同算法的性能,Recommenders 提供了一个 基准测试 Notebook。该 Notebook 使用 MovieLens 数据集,以 75/25 的比例将其划分为训练集和测试集,并使用多个协同过滤算法训练推荐模型。

    下表展示了在 Movielens 100k 数据集上运行 15 个 epoch 后,不同算法的评估指标结果:

    算法MAPnDCG@kPrecision@kRecall@kRMSEMAER2Explained Variance
    ALS0.0047320.0442390.0484620.0177960.9650380.7530010.2556470.251648
    BiVAE0.1461260.4750770.4117710.219145N/AN/AN/AN/A

    注意: 表格中只列举了部分算法的评估结果,完整列表请参考 README.md

    总结

    微软开源工具 Recommenders 为研究人员、开发者和爱好者提供了一个强大的平台,可以快速构建、实验和部署各种经典和先进的推荐系统。它提供了丰富的算法、示例和最佳实践,并且易于使用和扩展,是构建高性能推荐系统的理想选择。

    参考文献

    • D. Li, J. Lian, L. Zhang, K. Ren, D. Lu, T. Wu, X. Xie, “Recommender Systems: Frontiers and Practices”, Springer, Beijing, 2024. 链接.
    • A. Argyriou, M. González-Fierro, and L. Zhang, “Microsoft Recommenders: Best Practices for Production-Ready Recommendation Systems”, WWW 2020: International World Wide Web Conference Taipei, 2020. 链接
    • … | … | … |

    注意: 以上只列举了部分参考文献,完整列表请参考 README.md

  • SalUn : 通过基于梯度的权重显著性赋能图像分类和生成中的机器遗忘

    引言

    随着数据法规的不断演变,机器遗忘 (MU) 已成为增强当今人工智能模型信任度和安全性的重要工具。然而,现有的 MU 方法侧重于数据和/或权重视角,在遗忘准确性、稳定性和跨领域适用性方面往往存在局限性。为了应对这些挑战,我们引入了 MU 的“权重显著性”概念,并将其与模型解释中的输入显著性进行了类比。这一创新将 MU 的注意力从整个模型转移到特定的模型权重上,从而提高了有效性和效率。由此产生的方法被称为显著性遗忘 (SalUn),它缩小了与“精确”遗忘(从移除遗忘数据点后从头开始重新训练模型)的性能差距。据我们所知,SalUn 是第一个能够有效消除遗忘数据、类别或概念在图像分类和生成任务中的影响的原则性 MU 方法。例如,SalUn 在高方差随机数据遗忘中具有稳定性优势,例如,在 CIFAR-10 数据集上与精确遗忘相比,差距为 0.2%。此外,在防止条件扩散模型生成有害图像方面,SalUn 实现了近 100% 的遗忘准确率,优于当前最先进的基线,如 Erased Stable Diffusion 和 Forget-Me-Not。代码可在 https://github.com/OPTML-Group/Unlearn-Saliency 获取。

    警告:本文包含的模型输出可能具有冒犯性。

    机器遗忘的挑战

    现有的机器遗忘方法存在两大局限性:

    • 不稳定性: 现有的 MU 方法在面对不同数量的遗忘数据时,其性能表现出显著的差异。例如,当遗忘数据量从 10% 增加到 50% 时,一些方法的遗忘效果会大幅下降。此外,一些方法的性能也受到超参数选择的影响,导致不稳定性。
    • 缺乏通用性: 许多 MU 方法主要应用于图像分类,而新兴的用于生成建模的扩散模型 (DMs) 也需要有效的 MU 技术来保护版权并防止生成有害内容。然而,现有的 MU 方法在图像生成任务中效果不佳。

    SalUn:权重显著性是 MU 的关键

    为了解决上述局限性,我们提出了 SalUn,它利用了梯度信息来构建权重显著性图,并将其用于指导遗忘过程。

    基于梯度的权重显著性图

    我们借鉴了梯度信息在输入显著性图中的应用,提出了构建权重显著性图来辅助 MU 的想法。权重显著性图可以将预遗忘模型权重 (θo) 分解为两个不同的部分:在 MU 期间标记为更新的显著模型权重和保持不变的完整模型权重。

    我们使用遗忘损失 (`f(θ; Df)) 相对于遗忘数据集 Df 下模型权重变量 θ 的梯度,并应用硬阈值操作来获得权重显著性图:

    mS = 1 (|∇θ`f(θ; Df) |θ=θo| ≥ γ), 

    其中 1(g ≥ γ) 是一个元素级指示函数,如果 gi ≥ γ,则第 i 个元素的值为 1,否则为 0,|·| 是元素级绝对值运算,γ > 0 是硬阈值。

    基于权重显著性图,我们可以将遗忘模型 θu 表示为:

    θu = mS  (∆θ + θo) + (1 − mS)  θo, 

    其中 是元素级乘积,1 表示全 1 向量。这意味着在 MU 期间的权重更新中,注意力可以集中在显著权重上。

    SalUn 的实现

    SalUn 将权重显著性图 (mS) 集成到遗忘过程中,并利用随机标签 (RL) 方法来更新显著权重。

    在图像分类中,SalUn 的优化问题可以表示为:

    minimize ∆θ L(1)SalUn(θu) := E(x,y)∼Df,y0≠y [`CE(θu; x, y0)] + αE(x,y)∼Dr [`CE(θu; x, y)], 

    其中 y0 是与 y 不同的随机图像标签,θu 已在 (4) 中定义。

    在图像生成中,SalUn 的优化问题可以表示为:

    minimize ∆θ L(2)SalUn(θu) := E(x,c)∼Df,t,∼N(0,1),c0≠c ||θu(xt|c0) − θu(xt|c)||22 + β`MSE(θu; Dr), 

    其中 c0 ≠ c 表示概念 c0 与 c 不同,θu 是由 (4) 给出的基于显著性的遗忘模型,β > 0 是一个正则化参数,用于在遗忘数据集 Df 上的基于 RL 的遗忘损失与非遗忘数据集 Dr 上的扩散训练损失 `MSE(θu; Dr) 之间进行优化权衡。

    实验结果

    我们在图像分类和生成任务上进行了大量的实验,验证了 SalUn 的有效性。

    图像分类

    在图像分类任务中,我们重点关注随机数据遗忘,并在 CIFAR-10 数据集上使用 ResNet-18 模型进行评估。我们比较了 SalUn 与其他 7 种 MU 基线方法的性能,包括 FT、RL、GA、IU、`1-sparse、BS 和 BE。

    实验结果表明,SalUn 在两种遗忘场景(10% 随机数据遗忘和 50% 随机数据遗忘)中均实现了与 Retrain 最小的平均性能差距。此外,SalUn 在遗忘效果 (UA 和 MIA) 和模型保真度 (RA 和 TA) 之间取得了最佳平衡,同时保持了计算效率。

    图像生成

    在图像生成任务中,我们重点关注两种遗忘场景:使用 DDPM 的类遗忘和使用 LDM 的概念遗忘。

    实验结果表明,SalUn 在类遗忘和概念遗忘任务中均优于其他 MU 基线方法,同时保持了良好的图像生成质量。

    NSFW 概念遗忘

    我们还评估了 SalUn 在概念遗忘中的有效性,以消除通过不当图像提示 (I2P) 引入的 NSFW 概念的影响。

    实验结果表明,SalUn 生成的有害图像最少,显著优于其他 MU 基线方法。

    结论

    我们提出了 SalUn,这是一个基于权重显著性的机器遗忘框架,它有效地解决了现有 MU 方法的局限性,并适用于图像分类和生成任务。SalUn 在防止稳定扩散生成有害内容方面非常有效,即使遇到不当图像提示也是如此。

    参考文献

    • Adebayo, J., Gilmer, J., Muelly, M., Goodfellow, I., Hardt, M., & Kim, B. (2018). Sanity checks for saliency maps. Advances in neural information processing systems, 31.
    • Bae, G., Lee, S., Jeong, S., Park, J., & Kim, N. (2023). Diffusion art or digital forgery? investigating data replication in diffusion models. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 15494-15503).
    • Becker, F., & Liebig, T. (2022). Approximate machine unlearning via random label flipping. In Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security (pp. 2000-2013).
    • Bedapudi, N. (2019). Nudenet: Open source nudity detection. https://github.com/notAI-tech/NudeNet.
    • Birhane, A., Prabhu, V., & Mitchell, M. (2021). Multimodal datasets: misogyny, pornography, and malignant stereotypes. arXiv preprint arXiv:2110.01963.
    • Carlini, N., Tramer, F., Wallace, E., Jagielski, M., Herbert-Voss, A., Lee, K., … & Usenix Security. (2022). Extracting training data from diffusion models. In 31st {USENIX} Security Symposium ({USENIX} Security 22) (pp. 423-440).
    • Chattopadhay, A., Sarkar, A., Howlader, P., & Balasubramanian, V. N. (2018). Grad-cam++: Generalized gradient-based visual explanations for deep convolutional networks. In 2018 IEEE Winter Conference on Applications of Computer Vision (WACV) (pp. 839-847). IEEE.
    • Chen, Y., Zhang, X., & Zhu, S. (2022a). Certified graph unlearning. In Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security (pp. 2104-2117).
    • Chen, T., Zhang, Z., Liu, S., Chang, S., & Wang, Z. (2022b). Adversarial weight perturbation helps robust generalization. Advances in Neural Information Processing Systems, 35, 20269-20282.
    • Chen, Y., Zhang, X., & Zhu, S. (2023). Approximate machine unlearning via class-discriminative boundary shifting. In Proceedings of the 40th International Conference on Machine Learning (pp. 4488-4501). PMLR.
    • Cheng, Y., Chen, Y., Zhang, X., & Zhu, S. (2023). Efficient graph unlearning with guar- antees. arXiv preprint arXiv:2305.16868.
    • Chien, S., Zhou, Y., Honorio, J., & Li, L. (2022). Certified removal of data points for ma- chine learning. arXiv preprint arXiv:2205.06735.
    • Dai, D., Dong, L., Hao, Y., Sui, Z., Ke, F., & Zhang, J. (2021). Knowledge neurons in pre- trained transformers. arXiv preprint arXiv:2104.08656.
    • De Cao, N., Aziz, W., & Titov, I. (2021). Editing factual knowledge in language models. arXiv preprint arXiv:2104.08164.
    • Dwork, C., McSherry, F., Nissim, K., & Smith, A. (2006). Calibrating noise to sensitivity in private data analysis. In Theory of cryptography conference (pp. 265-284). Springer.
    • Frankle, J., & Carbin, M. (2018). The lottery ticket hypothesis: Finding sparse, trainable neural networks. arXiv preprint arXiv:1803.03635.
    • Gandikota, V., Liu, R., Abbeel, P., & Recht, B. (2023). Erased stable diffusion. arXiv preprint arXiv:2301.12796.
    • Ginart, A., Guan, M., Valiant, G., & Zou, J. (2019). Making ai forget you: Data deletion in machine learning. Advances in Neural Information Processing Systems, 32.
    • Golatkar, A., Achille, A., & Soatto, S. (2020). Eternal sunshine of the spotless net: Forgetting in deep networks. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 9304-9312).
    • Graves, A., Shokri, R., & Goldwasser, S. (2021). Breaking certified defenses: Semantic adversarial examples with spoofed robustness certificates. In International Conference on Machine Learning (pp. 3664-3673). PMLR.
    • Grosse, D., LeCun, Y., & Schoelkopf, B. (2023). Data attribution for deep learning models based on integrated gradients. In Proceedings of the 40th International Conference on Machine Learning (pp. 11258-11271). PMLR.
    • Guo, C., Goldstein, T., Hannun, A., & van der Maaten, L. (2019). Certified data removal from machine learning models. arXiv preprint arXiv:1911.03030.
    • Han, S., Pool, J., Tran, J., & Dally, W. (2015). Learning both weights and connections for efficient neural network. Advances in neural information processing systems, 28.
    • He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 770-778).
    • Heng, S., & Soh, H. (2023). Forget-me-not: Accurate diffusion model unlearning via data synthesis and model pruning. arXiv preprint arXiv:2308.14558.
    • Ho, J., & Salimans, T. (2022). Classifier-free diffusion guidance. Advances in Neural Information Processing Systems, 35, 16294-16305.
    • Hoofnagle, C. J., Borgesius, F. Z., Whittington, R., & Mayer-Schönberger, V. (2019). The right to be forgotten. Stanford Law Review, 70(6), 1443-1532.
    • Howard, J., & Gugger, S. (2020). Fastai: A layered api for deep learning. Information, 11(2), 108.
    • Ilyas, A., Park, S., Bastani, O., & Reagen, B. (2022). Data debugging with shapley expla- nations. In Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security (pp. 1982-1999).
    • Izzo, Z., Smart, M., Chaudhuri, K., & Zou, J. Y. (2021). Approximate data deletion from machine learning models: Algorithms and evaluations. arXiv preprint arXiv:2110.04788.
    • Jain, P., Liu, S., & Kamar, E. (2023). Unlearn what you’ve learned: Adaptive pre- training for knowledge transfer. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 14398-14407).
    • Jeyakumar, J. V., Batra, D., Parikh, D., & Kim, S. (2020). Influence functions in deep learning are fragile. arXiv preprint arXiv:2006.14065.
    • Jia, J., Fan, C., Liu, J., Wei, D., & Liu, S. (2023). Full-stack evaluation of machine unlearning in image classification. arXiv preprint arXiv:2305.17537.
    • Koh, P. W., & Liang, P. (2017). Understanding black-box predictions via influence func- tions. In International conference on machine learning (pp. 1885-1894). PMLR.
    • Krizhevsky, A., Hinton, G., et al. (2009). Learning multiple layers of features from tiny images.
    • Le, Y., & Yang, X. (2015). Tiny imagenet visual recognition challenge. CS 231N, 7(7), 3.
    • Liu, Z., Lin, Y., Cao, Y., Hu, H., Wei, Y., Zhang, Z., … & Guo, B. (2021). Swin transformer: Hierarchical vision transformer using shifted windows. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 10012-10022).
    • Liu, Y., Ma, X., Bailey, J., & Lu, F. (2022a). Black-box unlearning of backdoor poisoned deep neural networks. arXiv preprint arXiv:2205.05728.
    • Liu, Y., Lyu, L., Feng, S., Xu, X., & Zhang, T. (2022b). Machine unlearning for federated learning: Fundamental limits and algorithms. arXiv preprint arXiv:2209.01941.
    • Meng, K., Bau, D., & Lakkaraju, H. (2022). Locating and editing factual associations in gpt. Advances in Neural Information Processing Systems, 35, 17343-17355.
    • Menik, A., & Ramaswamy, S. (2023). Modularity in large language models. arXiv preprint arXiv:2302.03000.
    • Neel, S., Roth, A., & Sharifi-Malvajerdi, S. (2021). Descent-to-delete: Gradient-based methods for machine unlearning. In International Conference on Machine Learning (pp. 8274-8283). PMLR.
    • Netzer, Y., Wang, T., Coates, A., Bissacco, A., Wu, B., & Ng, A. Y. (2011). Reading digits in natural images with unsupervised feature learning.
    • Oesterling, F., Roth, A., & Neel, S. (2023). Machine unlearning for fairness. In Proceedings of the 40th International Conference on Machine Learning (pp. 25892-25907). PMLR.
    • Parikh, N., Boyd, S., et al. (2014). Proximal algorithms. Foundations and Trends® in Optimization, 1(3), 127-239.
    • Park, S., Bastani, O., & Ilyas, A. (2023).

    Q: 这篇论文试图解决什么问题?

    A: 这篇论文试图解决的问题是机器学习(ML)模型中的机器遗忘(Machine Unlearning, MU)问题。具体来说,它关注以下几个关键点:

    1. 数据隐私和合规性:随着数据保护法规(如“被遗忘权”)的实施,需要一种方法来有效地从预训练的ML模型中移除特定数据点、类别或概念的影响,以保护用户隐私和满足法规要求。
    2. 模型安全性:在计算机视觉领域,需要防止模型受到后门攻击,提高模型的公平性,以及增强预训练方法以提高迁移学习能力。
    3. 内容生成控制:在文本到图像的生成模型中,需要防止生成敏感、有害或非法的图像内容,尤其是在面对不适当的提示(如裸露内容)时。
    4. 现有MU方法的局限性:现有的MU方法在遗忘准确性、稳定性和跨领域适用性方面存在局限性。这些方法通常分为两类:精确MU(如重新训练模型)和近似MU(如基于影响函数的遗忘)。精确MU方法计算资源消耗大,而近似MU方法虽然实用,但准确性和稳定性仍有待提高。

    为了解决这些问题,论文提出了一种新的MU方法,称为“权重显著性”(Weight Saliency),并开发了一种名为SalUn(Saliency Unlearning)的方法。这种方法通过关注模型中的特定权重而不是整个模型,提高了MU的有效性和效率。SalUn旨在缩小与精确遗忘(从头开始重新训练模型)的性能差距,并在图像分类和生成任务中实现有效的遗忘。

    Q: 有哪些相关研究?

    A: 论文中提到的相关研究领域和具体工作包括:

    1. 机器遗忘(Machine Unlearning)
      • 精确遗忘方法,如重新训练(Retrain)模型。
      • 近似遗忘方法,如差分隐私(DP)-强制遗忘、认证数据移除、随机标记(Random Labeling)、梯度上升(Gradient Ascent)、Fisher遗忘等。
    2. 图像分类中的机器遗忘
      • 研究如何从图像分类模型中移除特定数据点或类别的影响。
      • 相关工作包括使用概率方法、差分隐私和各种遗忘策略。
    3. 图像生成中的机器遗忘
      • 研究如何在条件扩散模型(如DDPM和LDM)中实现有效的遗忘,以防止生成有害内容。
      • 相关工作包括概念擦除(Concept Erasing)和学习遗忘(Learning to Forget)。
    4. 数据和模型显著性分析
      • 输入显著性映射,如像素级敏感度图和类歧视定位方法。
      • 数据归因(Data Attribution),用于模型解释、调试、高效训练和提高模型泛化能力。
      • 模型显著性,如权重稀疏性,用于模型剪枝以提高效率。
    5. 自然语言处理(NLP)中的模型编辑
      • 研究如何通过直接修改模型权重来定位和编辑模型中的特定知识。
    6. 机器遗忘的挑战
      • 研究机器遗忘方法在稳定性和泛化性方面的局限性。
    7. 机器遗忘的评估
      • 提出了全面的“全栈”机器遗忘评估方法,包括遗忘准确性(UA)、成员推断攻击(MIA)、剩余准确性(RA)、测试准确性(TA)和运行时间效率(RTE)。

    这些相关研究为论文提出的SalUn方法提供了理论基础和技术背景。论文通过整合这些研究成果,提出了一种新的原则性机器遗忘方法,旨在提高遗忘的准确性和效率。

    Q: 论文如何解决这个问题?

    A: 论文通过引入“权重显著性”(Weight Saliency)的概念来解决机器遗忘(MU)问题,并提出了一种名为SalUn(Saliency Unlearning)的方法。以下是SalUn方法的关键步骤和特点:

    1. 权重显著性映射:SalUn首先利用遗忘损失(forgetting loss)相对于模型权重的梯度来构建权重显著性映射。这个映射能够识别出在遗忘过程中需要特别关注的模型权重。
    2. 权重更新:在MU过程中,SalUn专注于更新显著性映射中标记为显著的权重,同时保持其他权重不变。这样可以更有效地更新模型,以减少对遗忘数据点的依赖。
    3. 随机标记(Random Labeling):SalUn结合了随机标记方法,通过为遗忘数据集分配随机标签并对模型进行微调,来强制模型遗忘特定数据点。
    4. 优化问题:SalUn定义了一个优化问题,旨在最小化遗忘数据点上的分类误差,同时通过正则化项保持模型在非遗忘数据点上的泛化能力。
    5. 可扩展性:SalUn方法具有很好的可扩展性,可以应用于不同的MU场景,包括图像分类和生成任务。在图像生成任务中,SalUn通过关联遗忘概念和不匹配的图像来实现遗忘。
    6. 实验验证:论文通过在CIFAR-10、CIFAR-100、SVHN、Tiny ImageNet等数据集上的实验,以及在ResNet-18、VGG-16、Swin-T等模型上的评估,验证了SalUn方法的有效性。实验结果表明,SalUn在遗忘准确性、成员推断攻击、剩余准确性、测试准确性和运行时间效率方面均优于现有方法。
    7. 软阈值SalUn:论文还提出了SalUn的软阈值版本,该版本使用软阈值而不是硬阈值来确定权重显著性映射。尽管软阈值SalUn在实践中没有超越硬阈值版本,但它提供了一种更灵活的权重更新方法。

    通过这些方法,SalUn能够有效地减少与精确遗忘方法(从头开始重新训练模型)之间的性能差距,同时保持了计算效率。这种方法为图像分类和生成任务中的机器遗忘问题提供了一种新的原则性解决方案。

    Q: 论文做了哪些实验?

    A: 论文中进行了一系列的实验来验证SalUn方法的有效性,这些实验包括:

    1. 图像分类任务的遗忘性能评估
      • 在CIFAR-10、CIFAR-100、SVHN、Tiny ImageNet等数据集上,使用ResNet-18、VGG-16、Swin-T等模型架构,进行了随机数据遗忘和类别遗忘的实验。
      • 评估了SalUn与其他7种机器遗忘基线方法(包括FT、RL、GA、IU、ℓ1-sparse、BS和BE)的性能。
      • 使用了多种评估指标,包括遗忘准确性(UA)、成员推断攻击(MIA)、剩余准确性(RA)、测试准确性(TA)和运行时间效率(RTE)。
    2. 图像生成任务的遗忘性能评估
      • 在DDPM和LDM(基于LDM的稳定扩散)模型上进行了类别遗忘和概念遗忘的实验。
      • 使用了CIFAR-10和Imagenette数据集,以及与遗忘类别或概念相关的文本提示。
      • 评估了SalUn在防止生成特定类别或概念图像方面的有效性,并通过FID(Fréchet Inception Distance)和UA来衡量生成图像的质量。
    3. 权重显著性的重要性验证
      • 通过将权重显著性映射(mS)集成到传统的机器遗忘方法中,展示了权重显著性在提高遗忘效果方面的作用。
    4. 软阈值SalUn的比较
      • 对比了硬阈值和软阈值版本的SalUn在图像分类任务中的性能。
    5. 不同遗忘数据量的影响
      • 研究了不同遗忘数据量(10%、20%、30%、40%和50%)对SalUn和其他基线方法性能的影响。
    6. 迭代遗忘性能
      • 在CIFAR-10数据集上进行了迭代遗忘实验,逐步遗忘数据并评估SalUn的性能。
    7. 不同模型架构的适用性
      • 在VGG-16和Swin-T模型上评估了SalUn在不同模型架构中的适用性和性能。
    8. NSFW(不适宜内容)概念遗忘
      • 使用SalUn来防止SD模型生成与不适宜内容相关的图像,并通过NudeNet检测器对生成的图像进行分类。

    这些实验结果表明,SalUn在多种评估指标上均优于现有方法,特别是在高变异性随机数据遗忘和防止生成有害图像方面表现出色。此外,SalUn在保持模型泛化能力的同时,能够有效地实现遗忘目标。

    Q: 有什么可以进一步探索的点?

    A: 尽管SalUn方法在机器遗忘领域取得了显著的进展,但仍有一些潜在的研究方向可以进一步探索:

    1. 跨领域适应性:研究SalUn方法在其他领域(如自然语言处理、音频处理等)的适用性和有效性。
    2. 长期遗忘效果:评估SalUn在长期遗忘场景下的性能,例如在连续遗忘多个数据集或概念后,模型的稳定性和泛化能力。
    3. 遗忘与模型压缩的结合:探索将SalUn与模型压缩技术结合的可能性,以实现更高效的模型更新和部署。
    4. 遗忘过程中的隐私保护:研究在执行SalUn过程中如何进一步保护用户数据的隐私,例如通过引入差分隐私或其他隐私保护技术。
    5. 遗忘的可解释性:提高SalUn方法的可解释性,帮助用户理解模型为何遗忘特定数据,以及遗忘过程对模型性能的具体影响。
    6. 遗忘的自动化和优化:开发自动化工具来确定最佳的遗忘策略,包括遗忘数据的选择、权重显著性阈值的设定以及遗忘过程中的超参数调整。
    7. 遗忘与模型鲁棒性:研究遗忘过程对模型鲁棒性的影响,以及如何设计遗忘策略来提高模型对对抗攻击的抵抗力。
    8. 遗忘与模型更新的结合:探索在模型更新过程中如何有效地整合遗忘操作,以实现模型知识的持续更新和优化。
    9. 遗忘的法律和伦理考量:研究遗忘技术在法律和伦理层面的挑战,以及如何确保遗忘操作符合相关法规和道德标准。
    10. 遗忘的实时性:研究如何在实时或近实时环境中执行SalUn,以适应动态变化的数据环境和即时遗忘需求。

    这些研究方向不仅有助于提高SalUn方法的性能和适用性,还能推动机器遗忘领域的整体发展,使其更好地服务于数据隐私保护、模型安全和伦理合规等重要领域。

    Q: 总结一下论文的主要内容

    A: 这篇论文的主要内容可以总结如下:

    1. 问题定义:论文针对机器学习模型中的机器遗忘(MU)问题,特别是在数据隐私保护、模型安全性和内容生成控制方面的挑战。
    2. 现有方法的局限性:指出现有MU方法在遗忘准确性、稳定性和跨领域适用性方面的不足。
    3. 权重显著性概念:引入权重显著性的概念,将注意力从整个模型转移到特定的、有影响力的模型权重上,以提高MU的有效性和效率。
    4. SalUn方法:提出了一种名为SalUn(Saliency Unlearning)的新方法,该方法通过权重显著性指导遗忘过程,缩小了与精确遗忘(从头开始重新训练模型)的性能差距。
    5. 实验验证:在多个数据集和模型架构上进行了广泛的实验,验证了SalUn在图像分类和生成任务中的有效性。实验结果表明,SalUn在遗忘准确性、成员推断攻击、剩余准确性、测试准确性和运行时间效率方面均优于现有方法。
    6. 应用场景:展示了SalUn在防止生成有害图像内容(如裸露内容)方面的应用,以及在不同遗忘数据量下的性能稳定性。
    7. 软阈值SalUn:探讨了SalUn的软阈值版本,虽然在实践中没有超越硬阈值版本,但提供了一种更灵活的权重更新方法。
    8. 未来研究方向:提出了进一步研究的潜在方向,包括跨领域适应性、长期遗忘效果、遗忘与模型压缩的结合、遗忘过程中的隐私保护等。

    总的来说,这篇论文通过引入权重显著性的概念,提出了一种新的原则性机器遗忘方法SalUn,并通过实验验证了其在多个任务中的有效性,为机器遗忘领域提供了新的视角和解决方案。