博客

  • 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,并通过实验验证了其在多个任务中的有效性,为机器遗忘领域提供了新的视角和解决方案。

  • Ollama:让大型语言模型触手可及

    导语: 近年来,大型语言模型(LLM)发展迅猛,但对于普通用户而言,搭建和使用LLM仍有一定门槛。Ollama应运而生,它是一个轻量级、可扩展的框架,致力于让每个人都能轻松构建和运行本地LLM。

    一键安装,轻松上手

    Ollama 提供了简单易用的安装方式,无论你是 macOS、Windows 还是 Linux 用户,都能快速开始使用。

    macOS:

    下载

    Windows (预览版):

    下载

    Linux:

    curl -fsSL https://ollama.com/install.sh | sh

    您也可以参考手动安装指南进行安装。

    Docker:

    Ollama 也提供了官方 Docker 镜像 ollama/ollama,您可以在 Docker Hub 上找到它: https://hub.docker.com/r/ollama/ollama

    海量模型库,总有一款适合你

    Ollama 支持 ollama.com/library 上提供的众多模型,以下是一些示例:

    模型参数量大小下载
    Llama 38B4.7GBollama run llama3
    Llama 370B40GBollama run llama3:70b
    Phi 3 Mini3.8B2.3GBollama run phi3
    Phi 3 Medium14B7.9GBollama run phi3:medium
    Gemma 29B5.5GBollama run gemma2
    Gemma 227B16GBollama run gemma2:27b

    您可以根据自身需求选择合适的模型,例如,运行 Llama 3 模型,只需执行以下命令:

    ollama run llama3

    需要注意的是,运行大型模型需要足够的内存,建议至少 8GB 内存运行 7B 模型,16GB 内存运行 13B 模型,32GB 内存运行 33B 模型。

    个性化定制,打造专属模型

    Ollama 不仅提供了丰富的模型库,还支持用户自定义模型,您可以:

    1. 从 GGUF 文件导入模型:
    • 创建名为 Modelfile 的文件,并在其中使用 FROM 指令指定本地 GGUF 模型文件的路径。例如: FROM ./vicuna-33b.Q4_0.gguf
    • 使用 ollama create 命令创建模型: ollama create example -f Modelfile
    • 运行模型: ollama run example
    1. 从 PyTorch 或 Safetensors 导入模型:
    1. 自定义提示词:
    • 您可以通过 Modelfile 文件为模型设置自定义提示词。例如,以下 Modelfile 文件将 llama3 模型的角色设定为超级玛丽中的马里奥: FROM llama3 # 设置温度参数,值越高越有创造力,值越低越连贯 PARAMETER temperature 1 # 设置系统消息 SYSTEM """ 你将扮演超级玛丽中的马里奥,请以马里奥的身份回答问题。 """
    • 创建并运行模型: ollama create mario -f ./Modelfile ollama run mario >>> 你好 你好!我是你的朋友马里奥。 更多自定义提示词的示例,请参考 examples 目录。

    功能强大的命令行工具

    Ollama 提供了一套简洁易用的命令行工具,方便用户管理和使用模型。

    • ollama create: 从 Modelfile 创建模型。
    • ollama pull: 下载模型。
    • ollama rm: 删除模型。
    • ollama cp: 复制模型。
    • ollama show: 显示模型信息。
    • ollama list: 列出本地模型。
    • ollama serve: 启动 Ollama 服务。

    灵活的 REST API

    Ollama 还提供了 REST API,方便用户通过编程方式与模型交互。

    • 生成文本:
    curl http://localhost:11434/api/generate -d '{
      "model": "llama3",
      "prompt":"为什么天空是蓝色的?"
    }'
    • 与模型聊天:
    curl http://localhost:11434/api/chat -d '{
      "model": "llama3",
      "messages": [
        { "role": "user", "content": "为什么天空是蓝色的?" }
      ]
    }'

    更多 API 详情请参考 API 文档

    丰富的社区集成

    Ollama 拥有活跃的社区,开发者们贡献了众多集成工具,涵盖 Web、桌面、终端、数据库、移动端等多个平台,例如:

    • Web & 桌面: Open WebUI, Enchanted, Hollama, Lollms-Webui 等等。
    • 终端: oterm, Ellama Emacs client, gen.nvim 等等。
    • 数据库: MindsDB, chromem-go 等等。
    • 移动端: Enchanted, Maid 等等。

    总结

    Ollama 为用户提供了一个简单易用、功能强大的平台,让每个人都能轻松构建和运行本地大型语言模型。无论您是 LLM 爱好者、开发者还是研究人员,Ollama 都能为您提供强大的支持。

    参考文献

  • 新奇性算法,也称为新奇性搜索(Novelty Search)

    新奇性算法,也称为新奇性搜索(Novelty Search),是一种非传统的优化和搜索方法,它与传统的目标驱动型算法形成鲜明对比。该算法的核心思想不在于直接追求某个预设的目标或优化某个特定的目标函数,而是鼓励探索未知和新颖的解决方案。它基于自然进化的原理,即新奇的行为或特性往往能开启通往更多新奇发现的路径,从而促进创新和多样性。

    核心概念

    • 新奇性作为驱动力:新奇性算法通过评估解决方案的新颖程度来指导搜索过程,而不是直接的性能或目标达成度。
    • 探索未知:算法鼓励智能体或系统探索那些前所未有的行为或状态空间,即使这些行为在短期内不直接导向传统意义上的成功。
    • 踏脚石概念:新奇性行为可以作为进一步发现的起点,类似于自然进化中创新的积累,新奇性可以是达到更复杂目标的间接路径。
    • 应用领域:新奇性搜索在机器人学、人工智能、游戏AI、以及需要创新解决方案的任何领域都有应用,它能够帮助发现传统方法可能忽视的解决方案。

    实践案例

    • 迷宫实验:在迷宫实验中,新奇性探索算法的机器人通过尝试新路径,而非直接寻找出口,最终走出迷宫的次数多于目标驱动型算法,显示了其在探索未知方面的优势。
    • 图片孵化器:一个科学实验通过“图片孵化器”网站,展示了新奇性算法如何通过不断繁育图像,生成前所未有的图像,如从基础形状进化到复杂图像,如汽车,这体现了新奇性如何促进创新生成。

    思考与应用

    新奇性算法挑战了我们对目标设定的传统理解,提倡在某些情况下,无目标的探索可能比直接追求目标更能促进创新和长期的成功。在教育、创新项目管理、以及人工智能的开放式探索中,这种方法鼓励人们接受不确定性,拥抱探索过程中的偶然性,从而可能发现更为广阔的可能性空间。


    新奇性搜索在机器学习领域的应用广泛,它通过鼓励探索未知和新颖的解决方案,推动了多个方面的创新。以下是一些具体实例:

    1. 机器人学
      • 迷宫导航:机器人通过新奇性搜索,不直接寻找出口,而是探索新的路径,最终学会了高效穿越复杂环境。
      • 双足机器人行走:新奇性搜索帮助双足机器人通过不断尝试新奇的步态,而非直接设定行走目标,学会了更自然、更稳定的行走方式。
    2. 自动编程与软件工程
      • 通过新奇性搜索,可以发现新的编程模式或算法,帮助优化代码结构,甚至自动修复错误。例如,Heather Goldsby使用新奇性搜索来发现计算机程序中的错误,这表明该方法能有效识别和改进代码的创新性部分。
    3. 材料科学与药物发现
      • 在材料设计中,新奇性搜索可以引导研究人员探索具有新奇性质的化合物,这些化合物可能具有前所未有的物理或化学特性,对于开发新材料至关重要。
      • 在药物发现领域,算法可以探索化学空间,寻找具有新奇药理活性的分子,这在传统目标导向方法难以触及的领域尤为重要。
    4. 机器学习算法优化
      • 新奇性搜索可以用于优化神经网络架构或超参数,通过寻找新颖的配置而非直接最小化损失函数,可能发现更高效或更适应特定任务的模型结构。
    5. 游戏AI与创意生成
      • 在游戏AI中,新奇性搜索可以生成创新的策略和游戏行为,使AI角色的行为更加不可预测和有趣。
      • 在艺术和创意领域,如生成艺术作品,新奇性搜索可以探索新的视觉或音乐表达,创造独特的艺术作品。
    6. 多智能体系统
      • 在多智能体系统中,新奇性搜索可以促进智能体之间的非直接竞争或合作,通过探索新的交互模式,提高整个系统的适应性和复杂任务的解决能力。

    这些应用展示了新奇性搜索在促进创新、增加解决方案多样性以及在复杂、非线性问题上的潜力。通过鼓励探索未知,新奇性搜索为机器学习和人工智能领域带来了新的视角和方法。


    通过新奇性搜索解决复杂问题,主要依赖于以下几个步骤和原则:

    1. 放弃直接目标:首先,不同于传统方法直接设定最终目标,新奇性搜索鼓励探索未知领域,不设定具体目标或优化指标,而是寻找行为或解决方案的新颖性。
    2. 定义新奇性标准:新奇性是相对于已知解决方案的差异度。需要建立一个机制来评估解决方案的新颖性,这通常基于与历史解的比较,如通过行为的统计特征或解决方案的结构差异来衡量。18
    3. 初始探索:启动搜索过程,生成一系列初始解决方案或行为模式,并记录这些行为的特征,作为新奇性评估的基准。
    4. 迭代与评估
      • 在每次迭代中,算法生成新的解决方案或策略。
      • 评估这些新解的新奇性,保留那些与现有解相比具有显著差异的。
      • 这些新奇解成为下一步探索的起点,即使它们当前可能不直接指向问题的解决方案。
    5. 累积知识:新奇性搜索过程中,虽然不直接追求解决方案,但通过不断积累的新奇解,可能会无意中发现解决问题的关键特征或中间步骤。
    6. 适应性与多样性:鼓励多样性,即使某些尝试看似无效,也可能为后续的创新提供灵感。在复杂问题中,多样性是克服局部最优的关键。
    7. 分析与整合:随着时间的推移,通过分析新奇解的模式,可能揭示出解决复杂问题的新途径。这需要人类的介入,理解这些新奇解背后的潜在价值,并可能手动或通过其他算法整合这些发现。
    8. 反馈循环:虽然新奇性搜索不直接设定目标,但可以设置反馈机制,确保探索的方向与问题的某些关键方面保持相关性,避免完全无目的的探索。
    9. 跨领域应用:新奇性搜索的原理可以应用于多个领域,如机器人控制、算法设计、创意生成等,通过跨领域的灵感,可能发现意想不到的解决方案。

    通过上述步骤,新奇性搜索利用探索的广度而非直接的深度来解决复杂问题,这种方法特别适合于那些目标不明确或解决方案空间高度不确定的问题。它通过不断尝试和学习新奇事物,最终可能间接地达到或超越传统目标驱动方法的成果。


    评估新奇性搜索中解决方案的新奇性,通常涉及以下几个关键步骤和考虑因素:

    1. 定义行为空间:首先,需要明确解决方案或行为的表示空间,这可以是解决方案的参数空间、行为轨迹、或是任何可以量化其特性的多维空间。
    2. 构建行为特征:为每个解决方案提取特征,这些特征应该能够描述解决方案的关键方面,比如在机器人学中,可以是步态的节奏、步幅长度等。特征的选择对新奇性的准确评估至关重要。
    3. 历史行为数据库:维护一个历史解的数据库,记录已评估过的解决方案的特征。这个数据库用于比较新解与历史解的新颖性。
    4. 新奇性度量
      • 距离度量:使用如欧氏距离或余弦相似度等,计算新解特征与历史解特征集的平均距离。距离越大,新奇性越高。
      • 覆盖度:评估新解是否落在历史解的覆盖区域之外,如果新解在历史解的“行为地图”中开辟了新的区域,那么它就被认为是新奇的。
      • 聚类分析:通过聚类算法识别行为模式,新解如果与任何现有聚类显著不同,则认为具有新奇性。
    5. 非目标性评估:新奇性评估不考虑解决方案的性能或目标达成度,仅基于其与历史解的差异性。
    6. 阈值设定:设定一个新奇性阈值,低于此阈值的解决方案被视为不新奇,不会被保留或进一步探索。
    7. 时间或代际窗口:有时,新奇性评估会考虑最近几代或一段时间内的解,以确保新奇性评估反映最近的探索进展。
    8. 人工或专家审查:在某些情况下,新奇性评估可能需要人工审查,特别是在解决方案的复杂性或领域专业知识要求较高的情况下。
    9. 动态调整:随着搜索的进行,新奇性的定义和评估标准可能需要调整,以反映当前探索的深度和广度。

    通过上述方法,新奇性搜索能够系统地识别和保留那些在当前探索中具有独特性的解决方案,促进对未知领域的探索,即使这些新奇解在初期可能不直接带来性能上的提升。


    在新奇性搜索(Novelty Search, NS)的实现基础中,保存新颖项信息的核心在于设计一个能够有效记录和管理探索过程中遇到的新颖解决方案的数据结构。以下是实现这一过程的关键步骤和组件:

    1. 定义 NoveltyItem 类
      • 属性:每个 NoveltyItem 应包含至少两个关键属性:个体的特征向量(代表解决方案的特性)和该个体的新颖性得分。特征向量用于后续的比较和新奇性评估,而新颖性得分则是基于与历史解的比较得出的。
      • 方法:可能包括计算或更新新颖性得分的方法,以及用于存储和检索个体特征的接口。
    2. 新颖性列表(Novelty List)管理
      • 数据结构:使用列表、队列或更高级的数据结构(如平衡二叉搜索树、哈希表)来存储 NoveltyItem 对象。选择哪种数据结构取决于对查找效率、插入速度和内存使用的需求。
      • 插入机制:每当评估一个新个体的新颖性时,将其作为 NoveltyItem 对象插入到列表中,并根据需要更新新颖性得分。
      • 管理历史记录:为了保持数据结构的效率和实用性,可能需要定期或达到一定容量时移除最“不新奇”的个体,确保只保留最具代表性的或最近的解。
    3. 新颖性评估
      • 计算新奇性:对于每个新个体,计算其特征与新颖性列表中所有个体特征的相似度,可以使用距离度量(如欧氏距离)。
      • 得分更新:基于相似度计算新颖性得分,得分越低表示越新奇。这一步可能需要一个全局或局部的阈值来决定一个个体是否足够新奇以被保留。
    4. 更新与维护
      • 定期更新:随着搜索的进行,新颖性列表需要定期更新,移除不再新奇的个体,保持列表的动态性和有效性。
      • 多样性保持:确保列表中包含多样化的解决方案,避免过早收敛到特定的解决方案类型。

    通过这样的实现,NS 能够有效地跟踪和利用探索过程中的新颖性信息,促进对未知解决方案空间的探索,而不是直接追求性能优化。这种方法鼓励算法探索新的行为或解决方案,从而在复杂和多变的问题中找到创新的路径。