标签: AI

  • 个性化推荐的联邦学习新思路:基于图引导的个性化框架

    在信息爆炸的时代,推荐系统成为了我们生活中不可或缺的一部分,帮助我们从海量信息中筛选出感兴趣的内容。然而,传统的推荐系统往往需要收集用户的全部行为数据,这不仅存在隐私泄露的风险,也引发了人们对数据安全的担忧。为了解决这一问题,联邦推荐应运而生。

    联邦推荐是一种新的服务架构,它可以在不将用户数据共享给服务器的情况下提供个性化的推荐服务。现有的联邦推荐方法通常在每个用户的设备上部署一个推荐模型,并通过同步和聚合物品嵌入来协调模型的训练。然而,这些方法忽略了用户之间存在着不同的偏好,简单地将所有用户的物品嵌入进行平均聚合,会导致聚合后的嵌入信息量减少,影响个性化推荐的效果。

    图引导的个性化框架:GPFedRec

    为了解决这一问题,本文提出了一种新颖的 图引导的个性化框架(GPFedRec),用于联邦推荐。GPFedRec 通过利用一个自适应的图结构来捕捉用户偏好的相关性,从而增强了不同用户之间的协作。此外,GPFedRec 将每个用户的模型训练过程整合到一个统一的联邦优化框架中,使得模型能够同时利用共享的和个性化的用户偏好。

    GPFedRec 的核心思想

    GPFedRec 的核心思想是基于用户之间偏好的相似性构建一个用户关系图。在每个训练轮次中,服务器首先从用户设备收集本地训练的物品嵌入,然后利用图引导的聚合机制更新物品嵌入,从而获得每个用户的个性化物品嵌入。同时,服务器还会根据所有用户的个性化物品嵌入计算一个全局共享的物品嵌入,代表着所有用户的共同偏好。最后,服务器将个性化物品嵌入和全局共享的物品嵌入分别发送给用户设备,用于指导本地模型的训练。

    GPFedRec 的优势

    • 增强用户协作: GPFedRec 通过用户关系图,将具有相似偏好的用户联系在一起,使得每个用户能够从其他相似用户的偏好中学习,从而更好地捕捉个性化偏好。
    • 兼顾个性化和普适性: GPFedRec 同时利用个性化物品嵌入和全局共享的物品嵌入,一方面能够提供个性化的推荐,另一方面也能够捕捉到所有用户的共同偏好,提高推荐的普适性。
    • 隐私保护: GPFedRec 继承了联邦学习的分布式训练机制,将用户数据保留在本地,并可以进一步集成差分隐私技术,进一步增强隐私保护。

    实验结果

    在五个基准数据集上的实验结果表明,GPFedRec 在提供个性化推荐方面取得了显著的性能提升,超越了现有的联邦推荐方法和集中式推荐方法。此外,实验还验证了 GPFedRec 的鲁棒性和可扩展性。

    总结

    GPFedRec 是一种新颖的联邦推荐框架,它通过图引导的个性化机制,有效地捕捉了用户偏好的相关性,并增强了用户之间的协作。GPFedRec 在提供个性化推荐方面取得了显著的性能提升,并具有良好的隐私保护能力。

    参考文献

    [1] Chunxu Zhang, Guodong Long, Tianyi Zhou, Peng Yan, Zijian Zhang, and Bo Yang. 2023. Graph-guided Personalization for Federated Recommendation. In Proceedings of ACM Conference (Conference’17). ACM, New York, NY, USA, 11 pages.

  • 探索的长期价值:神经线性老虎机的实践

    神经线性老虎机 (NLB) 虽然简单,但直接将其融入工业训练和服务流程中却面临着挑战,主要体现在三个方面:

    1. 模型更新频率高: NLB 算法需要对每个样本更新协方差矩阵 Σt,然后计算预测方差,这需要在每个样本上进行计算量密集的逆矩阵计算 (Σt−1)。另一方面,大多数工业推荐模型是在批处理设置(Jeunen 和 Goethals,2021;Bendada 等人,2020)中进行训练的,模型会持续地在一大批日志上进行训练,并每天或每天多次进行检查点和导出。为了提高效率,我们将 NLB 的更新分解为两个阶段:
      • 训练阶段: 当我们处理日志中的每个训练数据时,使用公式 4 持续更新协方差矩阵 Σt,其中 ϕ 是(不断变化的)学习到的嵌入函数。当训练完成后,我们只更新一次精度矩阵 Σt−1,确保昂贵的逆矩阵计算以更低的频率执行,即每次训练运行只执行一次。
      • 服务更新阶段: 对于每个来到系统的用户 𝐮,我们使用固定的精度矩阵计算预测方差,并从后验分布中抽取预测奖励。我们将前 K 个结果呈现给用户,并收集相应的反馈。
    2. 方差估计的稳定性和变体: 方差估计需要对协方差矩阵 Σ−1 进行求逆,当协方差矩阵接近奇异时,会导致稳定性问题。我们研究了两种稳定且高效的方差计算方法:伪逆(Penrose,1955)和 Cholesky 分解(Press 等人,2007;Krishnamoorthy 和 Menon,2013),并比较了它们的计算成本和估计精度。伪逆提供了一种自然的方法来解决欠定线性系统。为了避免精度矩阵更新中的奇异性,我们将逆 Σ−1 替换为其伪逆变体 Σ†,当协方差矩阵为满秩时,它等价于 Σ−1。当系统欠定时,它提供了参数 β 的最小 L2 范数的唯一解。Cholesky 分解是另一种流行的方法,可以计算参数和二次不确定性项,避免显式矩阵求逆。具体来说,它计算正定协方差矩阵 Σ 的 Cholesky 分解,其中 L 是下三角矩阵。在此之后,公式 5 中的方差项可以改写为: σ2ϕ(𝐮,𝐚)TΣ−1ϕ(𝐮,𝐚) = σ2ϕ(𝐮,𝐚)T(LLT)−1ϕ(𝐮,𝐚) = σ2z(𝐮,𝐚)Tz(𝐮,𝐚) 其中 z(𝐮,𝐚):=L−1ϕ(𝐮,𝐚),可以通过使用前向替换 Lz(𝐮,𝐚)=ϕ(𝐮,𝐚) 轻松解决,复杂度仅为 𝒪(d2)。类似地,给定 Cholesky 分解,可以通过连续使用下三角矩阵 L 解决两个线性系统来求解参数 β。 我们研究了这两种方法在估计精度和训练速度方面的优缺点。图 7 (左) 绘制了预测奖励与神经网络预测 r^(𝐮,𝐚) 之间的平均绝对差,即 |ϕ(𝐮,𝐚)Tβ^−r^(𝐮,𝐚)|,其中 r^(𝐮,𝐚) 作为真实值 𝔼[r(𝐮,𝐚)] 的替代。我们看到 Cholesky 分解确实给出了更小的误差,这表明它在解的精度和稳定性方面具有优势。训练速度如图 7 (右) 所示,我们确实看到伪逆比 Cholesky 分解快得多,因为在我们的案例中,矩阵的大小很小,d=128。因此,我们继续使用伪逆选项。
    3. 扩展到分类任务: 在预测完成率、点击率和点赞率等情况下,任务是分类而不是回归。众所周知,当奖励为二元时,广义线性模型(例如逻辑回归)比线性模型表现更出色(Filippi 等人,2010)。先前的工作已经研究了当支付函数是上下文特征的广义线性模型时,即 𝔼[𝐫]=μ(ϕ(𝐮,𝐚)Tβ),其中 μ 是已知的链接函数,β 是未知参数,例如 GLM-UCB(Li 等人,2017)和 GLM-TSL(Kveton 等人,2020)。在广义线性模型 (GLM) 设置中,挑战在于 β 的最大似然估计 (MLE) 不再像线性模型那样允许一次性封闭形式的更新,即在 GLM 中,我们需要通过解决以下公式来获得每个时间步 t 的 β 的 MLE: ∑τ=1t−1(𝐫τ−μ(ϕ(𝐮τ,𝐚τ)Tβ))ϕ(𝐮τ,𝐚τ)=0 这在每个回合中使用所有先前的观察结果,并带来昂贵的每个样本梯度更新。 然而,很容易看出,β^ 只需要预测奖励的 μ(ϕ(𝐮,𝐚)Tβ^) 的后验分布均值。对于它,存在一个廉价的替代方案,即原始二元标签预测 𝐫^(𝐮,𝐚) 的 logit,它是当前系统的副产品,并提供对均值的稳定估计。 在选择要执行的最优动作时,我们选择使 ϕ(𝐮,𝐚)Tβ 最大化的动作 𝐚,因为当 μ 是严格递增函数时,它等价于 argmax μ(ϕ(𝐮,𝐚)Tβ)。 这个想法与 Ding 等人 (2021) 提出的 SGD-TS 算法有类似的味道,该算法表明,在上下文特征的差异性假设下,在线 SGD 结合 TS 探索可以为有限臂 GLM 问题实现 O~(T. 的遗憾。与 SGD-TS 不同,我们计算了精确的矩阵伪逆,以获得更准确的不确定性估计,而不是通过对角矩阵进行近似。不确定性估计与线性情况相同,我们可以通过简单地维护协方差矩阵来计算它。在对线性 logit 空间中的后验进行采样后,我们可以通过链接函数 μ 将样本转换为原始空间。

    实验

    我们在大型短视频推荐平台上进行了一系列在线 A/B 测试,以评估基于神经线性老虎机的排名系统的性能。我们还检查了不确定性测量的属性和可靠性。

    我们首先在控制组和处理组上运行了 0.3% 的流量的用户分流 A/B 测试,持续六周,以观察用户指标。控制组是生产中的原始排名模型,处理组是利用神经线性老虎机的基于探索的排名系统。对于 NLB,如 5.2 节所述,我们在流式方式中更新协方差矩阵,而精度矩阵 Σ† 则在每次训练运行时离线更新,以与训练管道保持一致。为了确保矩阵求逆的稳定性,我们将正则化超参数设置为 ϵ=1e−6 (公式 4)。为了选择噪声参数 σ2,我们计算了 5 个不同训练模型的集合的不确定性(作为一种昂贵的真实值测量),并选择了常数超参数 σ2=10,使得从集合和神经线性老虎机获得的不确定性大致处于同一数量级。

    神经线性老虎机的表现:内容新鲜度和用户满意度

    直观地,基于不确定性的探索系统(例如 NLB)会更多地暴露新鲜和尾部内容,这会改变整体内容语料库分布,并从这些区域获取有价值的学习信号,进而转化为用户参与度的提升。

    表 2 报告了在不同时间段内发布的新鲜内容上的正向交互次数增加。标题行中的时间区间(例如 1 小时)根据不同的新鲜度级别对内容进行分组。不同新鲜度级别内容上正向交互次数的显著增加证明了探索可以帮助系统有效地探索新鲜内容,并获取有价值的学习信号。有趣的是,我们还看到满意的每日活跃用户数量随着时间的推移而稳定增加,如图 8 所示。我们推测这种提升可能来自以下两个方面。首先,系统帮助用户发现新颖的兴趣,因为我们还看到用户在提供正向交互的独特主题数量上增加了 +1.25%。同时,用户更喜欢在专门针对短视频内容的特定表面上看到新鲜内容。

    不确定性估计的属性和可靠性

    神经线性老虎机中的关键组成部分之一是二次不确定性项,它捕捉了不同 (𝐮,𝐚) 对的探索项的强度。虽然在理论上可以量化,但可视化不确定性在不同用户和内容类型之间如何变化仍然是一个有趣的问题。为了检查这一点,我们选择了三个代表性特征,其中两个捕捉内容属性:1) 内容发布时间以来的天数(即内容年龄);2) 终身正向交互次数(即内容流行度);以及一个捕捉用户属性的特征:3) 用户在平台上提供的总交互次数(即用户活跃度)。

    我们使用斯皮尔曼秩相关系数来衡量这些特征与神经线性老虎机计算的不确定性项之间的关系,该系数评估了两个变量之间的单调关系。表 3 报告了所选三个特征与神经线性老虎机计算的不确定性之间的斯皮尔曼秩相关系数。有趣的是,可以观察到,当前系统对于新鲜和不太流行的内容更加不确定,而对于不同活跃度级别的用户则或多或少保持中立。此外,我们计算了特征与从集合模型获得的不确定性之间的斯皮尔曼秩相关性,结果表明内容特征为 -0.3,用户特征为 0。这些结果与从神经线性老虎机计算的结果相似,表明了不确定性估计的可靠性。

    神经线性老虎机对语料库指标变化的影响

    为了检查神经线性老虎机的探索能力,即它如何使内容语料库的大小受益,我们执行了 5% 的用户-语料库-协同分流实验,将 5% 的语料库和用户分别分流到控制组和处理组。对于基于神经线性老虎机的基于探索的排名系统,我们看到 Discoverable Corpus @100,7 增加了 +5.33%,Discoverable Corpus @1000,7 增加了 +5.66%。与基于利用的系统相比,神经线性老虎机更公平地分配内容。具体来说,探索后指标的改进表明尾部内容的可发现性更高。

    讨论和未来工作

    在本文中,我们对探索通过系统中一个重要的中介,即内容语料库,对用户的长期价值进行了系统研究。我们解决了测量挑战,设计了新的指标和实验框架,以捕捉探索对内容语料库的益处,并建立了可发现语料库增长与长期用户满意度提升之间的联系。我们通过在一个大型商业推荐平台上进行广泛的现实世界现场实验来验证它们,并展示了我们的宝贵发现。

    我们进一步研究了神经线性老虎机算法,用于在生产中构建基于不确定性的探索系统。值得指出的是,当前设置是针对单任务预测和探索量身定制的。相反,大多数现代推荐系统旨在捕捉多种丰富的反馈来源,并且通常在其实际应用中使用多任务学习。如何在这些更复杂的多任务设置下有效地进行探索是一个有趣的未来方向。

    参考文献

    (1) Abbasi-Yadkori 等人 (2011)
    Yasin Abbasi-Yadkori, Dávid Pál, and Csaba Szepesvári. 2011. Improved algorithms for linear stochastic bandits. Advances in neural information processing systems 24 (2011).

    (2) Agarwal 等人 (2014)
    Alekh Agarwal, Daniel Hsu, Satyen Kale, John Langford, Lihong Li, and Robert Schapire. 2014. Taming the monster: A fast and simple algorithm for contextual bandits. In International Conference on Machine Learning. PMLR, 1638–1646.

    (3) Agrawal 和 Goyal (2013)
    Shipra Agrawal and Navin Goyal. 2013. Thompson sampling for contextual bandits with linear payoffs. In International conference on machine learning. PMLR, 127–135.

    (4) Aharon 等人 (2015)
    Michal Aharon, Oren Anava, Noa Avigdor-Elgrabli, Dana Drachsler-Cohen, Shahar Golan, and Oren Somekh. 2015. Excuseme: Asking users to help in item cold-start recommendations. In Proceedings of the 9th ACM Conference on Recommender Systems. 83–90.

    (5) Auer 等人 (2002)
    Peter Auer, Nicolo Cesa-Bianchi, and Paul Fischer. 2002. Finite-time analysis of the multiarmed bandit problem. Machine learning 47, 2 (2002), 235–256.

    (6) Bajari 等人 (2021)
    Patrick Bajari, Brian Burdick, Guido W Imbens, Lorenzo Masoero, James McQueen, Thomas Richardson, and Ido M Rosen. 2021. Multiple randomization designs. arXiv preprint arXiv:2112.13495 (2021).

    (7) Bendada 等人 (2020)
    Walid Bendada, Guillaume Salha, and Théo Bontempelli. 2020. Carousel personalization in music streaming apps with contextual bandits. In Proceedings of the 14th ACM Conference on Recommender Systems. 420–425.

    (8) Chapelle 和 Li (2011)
    Olivier Chapelle and Lihong Li. 2011. An empirical evaluation of thompson sampling. Advances in neural information processing systems 24 (2011).

    (9) Chen (2021)
    Minmin Chen. 2021. Exploration in recommender systems. In Fifteenth ACM Conference on Recommender Systems. 551–553.

    (10) Chen 等人 (2019)
    Minmin Chen, Alex Beutel, Paul Covington, Sagar Jain, Francois Belletti, and Ed H Chi. 2019. Top-k off-policy correction for a REINFORCE recommender system. In Proceedings of the Twelfth ACM International Conference on Web Search and Data Mining. 456–464.

    (11) Chen 等人 (2021)
    Minmin Chen, Yuyan Wang, Can Xu, Ya Le, Mohit Sharma, Lee Richardson, Su-Lin Wu, and Ed Chi. 2021. Values of User Exploration in Recommender Systems. In Fifteenth ACM Conference on Recommender Systems. 85–95.

    (12) Cheung 等人 (2019)
    Wang Chi Cheung, Vincent Tan, and Zixin Zhong. 2019. A Thompson sampling algorithm for cascading bandits. In The 22nd International Conference on Artificial Intelligence and Statistics. PMLR, 438–447.

    (13) Chu 等人 (2011)
    Wei Chu, Lihong Li, Lev Reyzin, and Robert Schapire. 2011. Contextual bandits with linear payoff functions. In Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics. JMLR Workshop and Conference Proceedings, 208–214.

    (14) Covington 等人 (2016)
    Paul Covington, Jay Adams, and Emre Sargin. 2016. Deep neural networks for youtube recommendations. In Proceedings of the 10th ACM conference on recommender systems. 191–198.

    (15) Ding 等人 (2021)
    Qin Ding, Cho-Jui Hsieh, and James Sharpnack. 2021. An efficient algorithm for generalized linear bandit: Online stochastic gradient descent and thompson sampling. In International Conference on Artificial Intelligence and Statistics. PMLR, 1585–1593.

    (16) Durand 等人 (2018)
    Audrey Durand, Charis Achilleos, Demetris Iacovides, Katerina Strati, Georgios D Mitsis, and Joelle Pineau. 2018. Contextual bandits for adapting treatment in a mouse model of de novo carcinogenesis. In Machine learning for healthcare conference. PMLR, 67–82.

    (17) Filippi 等人 (2010)
    Sarah Filippi, Olivier Cappe, Aurélien Garivier, and Csaba Szepesvári. 2010. Parametric bandits: The generalized linear case. Advances in Neural Information Processing Systems 23 (2010).

    (18) Houthooft 等人 (2016)
    Rein Houthooft, Xi Chen, Yan Duan, John Schulman, Filip De Turck, and Pieter Abbeel. 2016. Vime: Variational information maximizing exploration. Advances in neural information processing systems 29 (2016).

    (19) Imbens 和 Rubin (2015)
    Guido W Imbens and Donald B Rubin. 2015. Causal inference in statistics, social, and biomedical sciences. Cambridge University Press.

    (20) Jadidinejad 等人 (2020)
    Amir H Jadidinejad, Craig Macdonald, and Iadh Ounis. 2020. Using Exploration to Alleviate Closed Loop Effects in Recommender Systems. In Proceedings of the 43rd International ACM SIGIR Conference on Research and Development in Information Retrieval. 2025–2028.

    (21) Jeunen 和 Goethals (2021)
    Olivier Jeunen and Bart Goethals. 2021. Top-k contextual bandits with equity of exposure. In Proceedings of the 15th ACM Conference on Recommender Systems. 310–320.

    (22) Jiang 等人 (2019)
    Ray Jiang, Silvia Chiappa, Tor Lattimore, András György, and Pushmeet Kohli. 2019. Degenerate feedback loops in recommender systems. In Proceedings of the 2019 AAAI/ACM Conference on AI, Ethics, and Society. 383–390.

  • 探索的长期价值:衡量、发现和算法

    推荐系统已经成为人们日常生活中不可或缺的一部分,为用户提供推荐平台上的相关内容。许多系统被训练来预测和利用用户对推荐的即时反应,例如点击、停留时间和购买,在个性化方面取得了巨大成功(Sarwar 等人,2001;Koren 等人,2009;Covington 等人,2016;Zhang 等人,2019)。然而,这些基于利用的系统被称为会受到闭环反馈效应的影响(Jiang 等人,2019;Jadidinejad 等人,2020),在这种效应中,推荐系统和用户相互强化彼此的选择。用户被推荐的项目所吸引,只对所选项目提供反馈;系统利用有偏差的反馈数据进行训练,进一步巩固和强化用户配置文件,使其更倾向于之前与之交互的内容。结果,用户越来越局限于更狭窄的内容集,而平台上的许多内容仍然未被发现。

    探索是打破这种反馈循环的关键。通过向用户展示不太确定的内容(Jadidinejad 等人,2020;Chen 等人,2021),它主动获取有关未知用户内容对的未来学习信号,以填补系统中的知识空白。这样做,探索可以向用户介绍新颖的内容,我们称之为用户探索(Chen 等人,2021;Song 等人,2022;Schnabel 等人,2018);它还可以使更多新鲜和尾部内容(以及内容提供者)在平台上可发现,我们称之为项目探索(Chen,2021;Aharon 等人,2015)。我们将重点讨论项目探索。

    虽然有效的探索技术(Li 等人,2010;Agarwal 等人,2014;Silver 等人,2016;Chen 等人,2019)在老虎机和强化学习文献中得到了积极的研究,但在现实世界工业系统中部署它们已被证明很困难。主要挑战在于衡量(Chen,2021)探索的确切益处,这将作为从纯粹基于利用的系统转向基于探索的系统的具体和可衡量的证据。虽然探索技术如上限置信区间(Auer 等人,2002;Chu 等人,2011)和汤普森采样(Thompson,1933;Chapelle 和 Li,2011;Riquelme 等人,2018)在数学上已被证明比贪婪方法具有更好的遗憾,但尚不清楚这种益处是否会转化为具有噪声和延迟反馈以及不可测试的建模假设的工业推荐设置。

    衡量探索益处存在三个主要挑战。第一个是待检查的指标,因为探索的益处需要很长时间才能显现,并且难以在常规的 A/B 测试中捕捉到。同时,推荐不太确定的内容通常会导致短期用户参与指标的损失。因此,确定一些可以作为探索与长期用户体验之间桥梁的中间实体至关重要。

    我们专注于通过探索对系统中内容语料库的中间影响来研究探索的价值。我们系统地研究了探索如何扩大内容语料库,进而转化为长期用户参与度提升。第二个挑战是实验设计,正如我们将在后面解释的那样,常用的用户分流 A/B 测试(Kohavi 等人,2020)无法捕捉到探索对内容语料库的益处,因为控制组和实验组之间存在信息泄漏。我们引入了一个新的实验框架来衡量探索对内容语料库变化的影响。最后一个挑战在于设计可以在现实世界工业规模环境中使用的基于探索的系统。为此,我们采用了一种可扩展的探索算法,即神经线性老虎机(NLB)(Riquelme 等人,2018),以充分释放和检验探索的潜在益处。NLB 在从深度神经网络学习的表示之上执行线性回归,作为上下文特征来估计不确定性。它很好地融入现代基于深度学习的推荐系统(Covington 等人,2016),同时在计算准确的不确定性估计方面保持简单。

    总之,我们做出了以下贡献:

    • 用于研究探索益处的指标: 我们揭示了探索的测量挑战,并提供了第一个全面研究,系统地量化了推荐系统中探索的价值。我们的方法利用内容语料库作为连接探索和用户体验的重要中间量,并定义语料库指标来衡量不同探索处理的有效性。
    • 用于衡量探索价值的实验框架: 为了防止控制组和处理组之间的语料库泄漏,我们提出了一种新的用户-语料库-协同分流实验框架,以无偏的方式衡量探索对所提议的语料库指标的影响。
    • 通过神经线性老虎机设计基于探索的系统: 虽然 NLB 算法已在理论上得到研究,但我们讨论了将其集成到工业推荐系统中的挑战,并详细说明了我们的实现。我们通过大规模现场实验进一步验证了它的成功,并指出了构建基于探索的推荐系统的令人兴奋的未来方向。
    • 通过大规模现场实验进行验证和发现: 我们通过在大型短视频推荐平台上进行广泛的现场实验来验证实验设计。我们展示了探索如何扩大内容语料库,并最终将语料库改进与长期用户体验联系起来。

    探索的长期价值:扩大语料库

    在本节中,我们研究了通过语料库变化来研究探索的益处。总之,在不确定区域进行探索会增加新鲜和尾部内容的曝光度和可发现性,并改变整体语料库分布,进而改善长期用户体验。我们首先定义语料库指标,即可发现语料库;然后介绍一个新的用户-语料库-协同分流实验框架来衡量探索对可发现语料库的益处。最后,我们展示了一项长期研究,展示了语料库变化对用户体验的影响。

    语料库指标

    基于利用的系统会导致高度倾斜的语料库分布,其中一小部分语料库占据了大量的用户交互,而其余语料库几乎没有被发现。我们提出了一种语料库指标,该指标捕捉了每个视频接收的交互次数中的语料库分布。为了避免由于内容本身的性能更好(即接收更多交互)而产生的任何混淆因素,仅仅是因为它从探索处理中获得了更多展示,我们使用探索后语料库性能来衡量探索效果。

    具体来说,我们为内容设置了一个 X’ 的毕业门槛,即正向用户交互次数。换句话说,一旦内容收到超过 X’ 次的正向用户交互,它就不再有资格接受进一步的探索处理。此时,内容进入探索后阶段,需要靠自身生存。也就是说,探索处理用于引导冷启动内容,但内容的成功仍然主要取决于其自身质量以及在移除进入门槛后的受众相关性。鉴于此,我们正式定义了系统 π 的 Discoverable Corpus @X,Y.

    Discoverable Corpus @X,Y = (在探索后时间段 Y 内收到超过 X 次正向用户交互的内容数量) / (在探索后时间段 Y 内收到超过 X 次正向用户交互的总内容数量)

    该指标捕捉了从尾部到头部的一系列内容的数量变化。对于较小的 X. 它衡量了尾部内容的性能,而对于较大的 X,它衡量了头部和热门内容的增长。理想情况下,系统的探索能力越强,Discoverable Corpus @X,Y 在各种 X 区间内的值就越大,同时保持相对中立的用户体验作为保障。用于评估的时间窗口,即 Y,规定了允许新探索的语料库增长的时段。在我们的实验中,我们使用 7 天窗口来捕捉短期语料库增长,以及 3 个月窗口来捕捉长期增长。

    用户-语料库-协同分流实验

    传统的用户分流 A/B 测试(Imbens 和 Rubin,2015;Kohavi 等人,2020)提供了一个强大的工具来衡量任何推荐更改对用户方面的影响。在用户分流 A/B 测试中,我们将用户随机分配到控制组和处理组,让他们接受相应的处理,并比较两组之间的用户端指标,例如点击次数、停留时间、满意度调查响应。

    然而,这些实验无法捕捉到任何语料库变化,例如由于探索处理而导致的内容获得更多展示或用户交互的数量。由于两组共享相同的语料库,因此任何对语料库的处理效果都会在组之间泄漏。

    因此,我们提出了用户-语料库-协同分流 A/B 测试,它是多重随机化设计 (MRD)(Bajari 等人,2021)的一种实例,通过设计特定的分配矩阵来实现。特别是,它除了随机将 x% 的用户按比例分配到控制组和实验组之外,还将 x% 的语料库随机分配到控制组和处理组。如图 2 所示,控制组的用户只接收来自控制组语料库的推荐,处理组的用户也是如此。与原始用户分流实验相比,语料库的随机分割可以防止处理效果泄漏,并允许衡量处理效果对基于语料库的指标的影响。我们将用户和语料库保持比例,例如 5% 的用户探索 5% 的语料库,因此探索处理的有效性与 100% 的用户探索整个语料库时的完整部署一致。否则,可以想象,使用 5% 的用户流量来探索整个语料库 (100%) 将导致语料库分布的微小变化。

    探索增加了可发现语料库

    设置:

    我们进行了一项用户-语料库-协同分流现场实验,其中 1) 控制组运行基于利用的系统,如图 1 所示,以填补平台上的所有位置;2) 处理组运行一个简单的基于探索的系统,该系统专门为新鲜和尾部内容保留专用位置,同时使用与控制组相同的系统填充其他位置。探索系统使用一个提名器,根据候选内容与历史用户消费的相似性来提名新鲜和尾部候选内容。提名的候选内容由与控制组相同的排名系统进行排名。

    我们首先通过衡量 Discoverable Corpus @X0,7 (7 天时间段) 来检查探索系统的短期益处。

    如图 3 所示,我们观察到 Discoverable Corpus @100,7 (左) 和 Discoverable Corpus @1000,7 (右) 的数量显著增加(即收到超过 X0=100 和 X0=1000 次探索后正向交互的内容数量)。这验证了基于探索的系统在短期内有效地提升了内容获得早期成功的数量。此外,控制组和处理组之间的差距随着时间的推移而不断扩大,我们发现这是由于处理组中的内容提供者比控制组中的内容提供者创建了更多可发现的内容。虽然由于篇幅有限,我们不会深入探讨探索如何使内容提供者受益,但这是一个值得在未来研究中探讨的主题。

    虽然在短期内使内容获得早期成功很重要,但这并不一定能保证语料库的持续长期增长。理想情况下,探索系统应该能够识别出有潜力的高质量内容,这些内容在最初的引导后能够传播开来。为了评估内容的长期探索后增长,我们分析了 Discoverable Corpus @Xl,3 (3 个月时间段) 在不同的 Xl 区间内的变化。如表 1 所示,探索处理始终提高了 Discoverable Corpus @Xl,3 在不同 Xl 区间内的值。值得注意的是,增长的百分比在不同的 Xl 区间内保持着显著的一致性,大约在 50% 左右。

    扩大可发现语料库的长期价值

    以上讨论确定了探索按比例在不同的交互区间内扩大可发现语料库,并发现“未来”的头部和尾部内容。在本节中,我们将通过将可发现语料库大小的变化与长期用户体验联系起来,来完成论点的闭环。为了量化用户满意度,我们使用一个指标来统计平台上每天具有满意交互(基于满意度调查预测)的活跃用户数量,在整篇文章中,我们将此指标称为满意的每日活跃用户。

    这项研究的核心是允许每个用户访问一个缩减的固定语料库 C’⊂C. 并观察满意的每日活跃用户数量的变化。为了消除任何混淆因素,即确保在通过缩减的语料库过滤提名候选内容后,第二阶段(排名)中评分的候选内容数量相同,我们相应地增加了第一阶段的提名数量。

    我们进行了 4 周的消融研究,控制组和处理组都运行与图 1 中描述的相同的多分阶段推荐系统。每组接收 5% 的总流量。控制组接收提名器输出的所有候选内容,而处理组使用附录 B 中算法 2 中详细介绍的语料库消融过程,随机从平台中过滤掉 x% 的语料库。

    研究结果如图 5 所示。从左图可以看出,满意的每日活跃用户数量在不同的消融规模下都出现了显著下降。此外,消融的负面影响随着时间的推移而增加,这表明它对长期用户满意度具有持久性的负面影响。有趣的是,右图显示了可发现语料库大小变化与满意的每日活跃用户数量之间单调的关系(大致线性),由此我们推测,增加可发现语料库大小将导致积极的用户体验。

    然而,值得一提的是,这种线性关系可能只在特定范围的语料库大小内成立。此外,当可发现语料库达到一定规模时,扩大语料库可能会产生饱和效应。确定这种关系的确切性质是未来研究的一个令人兴奋的方向,但超出了本文的范围。总之,探索增加了可发现语料库的大小,这进一步转化为长期用户满意度的提升。

  • 零样本商品推荐:多任务商品知识图谱预训练

    在当今信息爆炸的时代,推荐系统已经成为我们日常生活不可或缺的一部分。然而,现有的推荐系统在处理“零样本商品”时面临着巨大挑战。所谓“零样本商品”,指的是在训练阶段没有与用户发生过交互的商品。由于缺乏历史数据,传统推荐算法难以对这些商品进行有效的推荐。

    近年来,预训练语言模型(PLMs)在提取通用商品表示方面取得了显著进展。然而,这些模型忽略了商品之间至关重要的关系信息。为了解决这一问题,一篇名为《基于多任务商品知识图谱预训练的零样本商品推荐》的论文提出了一种全新的零样本商品推荐(ZSIR)范式,该范式通过对商品知识图谱(PKG)进行预训练来细化来自 PLMs 的商品特征。

    商品知识图谱预训练的挑战

    论文指出,商品知识图谱预训练面临着三大挑战:

    1. PKG 中存在多种类型的关系: 商品之间的关系多种多样,例如商品类别、品牌、属性等,如何有效地建模这些多类型关系是一个挑战。
    2. 商品通用信息与关系之间的语义差异: PLMs 提取的商品通用信息可能与商品知识图谱中的关系信息存在语义差异,例如,一个商品的通用信息可能是“手机”,而其在知识图谱中的关系可能是“品牌为苹果”。
    3. PKG 与下游 ZSIR 任务之间的领域差异: PKG 通常包含大量商品信息,而下游 ZSIR 任务通常只关注一小部分商品。如何将 PKG 中的知识有效地迁移到下游任务是一个挑战。

    多任务预训练与任务导向适配层

    为了应对这些挑战,论文提出了四种预训练任务和一种新颖的任务导向适配层(ToA):

    1. 关系预测: 预测商品之间的关系,例如商品类别、品牌、属性等。
    2. 属性预测: 预测商品的属性,例如颜色、尺寸、价格等。
    3. 商品相似性预测: 预测商品之间的相似度,例如,两个商品是否属于同一类别。
    4. 商品推荐预测: 预测用户对商品的喜好程度,例如,用户是否会购买该商品。

    ToA 层旨在将 PKG 中的知识有效地迁移到下游 ZSIR 任务。它通过学习一个映射函数,将 PKG 中的商品表示映射到 ZSIR 任务中的商品表示。

    模型微调与实验结果

    论文还讨论了如何将模型微调到新的推荐任务,并使 ToA 层适应 ZSIR 任务。实验结果表明,该模型在知识预测和 ZSIR 任务上都取得了显著的效果。

    总结

    这篇论文提出了一种基于多任务商品知识图谱预训练的零样本商品推荐方法,有效地解决了现有的推荐系统在处理零样本商品时面临的挑战。该方法通过对 PKG 进行多任务预训练,并利用 ToA 层将知识迁移到下游任务,显著提升了推荐效果。

    参考文献

    Fan, Z. , Liu, Z., Heinecke, S., Zhang, J., Wang, H., Xiong, C., & Yu, P. S. (2023). Zero-shot item-based recommendation via multi-task product knowledge graph pre-training. arXiv preprint arXiv:2305.07633.


    零样本商品推荐:知识图谱赋能新突破

    在信息爆炸的时代,个性化推荐系统已经成为我们日常生活中不可或缺的一部分。然而,现有的推荐系统在面对“零样本商品”时往往力不从心。所谓“零样本商品”,指的是那些在训练阶段没有与用户发生过任何交互的商品。由于缺乏历史数据,传统的推荐算法难以对这些商品进行有效的推荐,导致用户体验下降。

    为了解决这一难题,一篇名为《基于多任务商品知识图谱预训练的零样本商品推荐》的论文,提出了一种全新的推荐范式,为零样本商品推荐领域带来了突破性的进展。

    知识图谱:解锁商品关系的宝藏

    该论文的核心思想是利用“商品知识图谱”(PKG)来提升商品特征的表达能力。商品知识图谱就像一张庞大的商品关系网络,它记录了商品之间的各种关联信息,例如商品类别、品牌、属性、用户评价等。通过对商品知识图谱进行预训练,模型可以学习到商品之间的深层关系,从而更好地理解商品的语义和属性。

    多任务学习:精雕细琢商品特征

    论文作者们巧妙地设计了四种预训练任务,分别针对商品知识图谱的不同方面进行学习:

    1. 关系预测: 预测商品之间的关系,例如商品类别、品牌、属性等。
    2. 属性预测: 预测商品的属性,例如颜色、尺寸、价格等。
    3. 商品相似性预测: 预测商品之间的相似度,例如,两个商品是否属于同一类别。
    4. 商品推荐预测: 预测用户对商品的喜好程度,例如,用户是否会购买该商品。

    通过多任务学习,模型可以从多个角度学习商品特征,并最终得到更加全面、准确的商品表示。

    任务导向适配层:桥接知识与推荐

    为了将商品知识图谱中学习到的知识有效地迁移到下游的零样本商品推荐任务中,论文还提出了一个新颖的“任务导向适配层”(ToA)。ToA 层就像一个桥梁,将商品知识图谱中的商品表示映射到推荐任务中的商品表示,从而实现知识的无缝衔接。

    实验验证:效果显著,前景广阔

    论文在18个市场数据集上进行了全面的实验验证,结果表明,该模型在知识预测和零样本商品推荐任务上都取得了显著的效果,优于现有的其他方法。

    未来展望:知识图谱引领推荐新时代

    该论文的成果为零样本商品推荐领域带来了新的思路和方法,也为未来推荐系统的发展指明了方向。随着知识图谱技术的不断发展,我们可以期待更加智能、高效的推荐系统,为用户提供更加个性化、精准的推荐服务。

    作者介绍

    论文的主要作者包括:Ziwei Fan、Zhiwei Liu、Shelby Heinecke、Jianguo Zhang、Huan Wang、Caiming Xiong和Philip S. Yu。他们分别来自多个机构,包括清华大学、微软研究亚洲、纽约大学等。以Caiming Xiong为例,他之前的代表作包括《Language Models are Unsupervised Multitask Learners》和《Inductive Bias of Deep Learning on Information-rich Data》等,在自然语言处理领域享有盛誉。

    相关研究

    近年来,知识图谱在推荐系统中的应用越来越广泛。一些相关的研究成果包括:

    • “Graph Neural Networks with Generated Parameters for Relation Extraction”,作者:Lei Cui、Shijie Li、Jie Zhou,机构:南京大学;
    • “Graph Convolutional Networks with Motif and Variable Temporal Aggregation for Traffic Forecasting”,作者:Yaguang Li、Yexin Li、Rose Yu、Cynthia Rudin,机构:杜克大学、麻省理工学院等。

    这些研究成果表明,知识图谱在推荐系统中具有巨大的潜力,未来将会有更多基于知识图谱的推荐方法出现。

    参考文献

    Fan, Z. , Liu, Z., Heinecke, S., Zhang, J., Wang, H., Xiong, C., & Yu, P. S. (2023). Zero-shot item-based recommendation via multi-task product knowledge graph pre-training. arXiv preprint arXiv:2305.07633.

  • 用 Ollama 创建微调后的模型

    前言

    我们将介绍如何用 Ollama 创建微调过的模型,让对话效果更符合特定化需要。

    一、微调大模型

    1. LORA 微调

    微调大模型的方法有很多,这里我们使用 LORA 微调方法。微调大模型需要比较高的显存,推荐在云服务器上进行训练,系统环境为 Linux。训练方法可以参考 DataWhale 的教程。

    1.1 选择基础大模型

    基础大模型我们选择 Chinese-Mistral-7B-Instruct-v0.1,模型文件可以在 Hugging Face魔搭社区 下载。

    1.2 下载基础大模型

    使用魔搭社区的 Python 脚本进行下载,执行前需要先运行 pip install modelscope

    from modelscope import snapshot_download
    
    # 模型存放路径
    model_path = '/root/autodl-tmp'
    # 模型名字
    name = 'itpossible/Chinese-Mistral-7B-Instruct-v0.1'
    model_dir = snapshot_download(name, cache_dir=model_path, revision='master')

    2. 选择数据集

    微调大模型要想获得比较好的效果,拥有高质量的数据集是关键。可以选择用网上开源的,或者是自己制作。以中文数据集弱智吧为例,约 1500 条对话数据,数据集可以从 Hugging Face 下载。

    3. LORA 微调

    3.1 安装依赖

    使用 Miniconda 创建 Python 环境,Python 版本为 3.10。

    依赖文件 requirements.txt 内容如下:

    transformers
    streamlit==1.24.0
    sentencepiece==0.1.99
    accelerate==0.29.3
    datasets
    peft==0.10.0

    运行 pip install -r requirements.txt 安装依赖。

    3.2 编写训练脚本

    3.2.1 指定模型路径

    from datasets import Dataset
    import pandas as pd
    from transformers import (
        AutoTokenizer,
        AutoModelForCausalLM,
        DataCollatorForSeq2Seq,
        TrainingArguments,
        Trainer, )
    import torch,os
    from peft import LoraConfig, TaskType, get_peft_model
    import warnings
    warnings.filterwarnings("ignore", category=UserWarning) # 忽略告警
    
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    # 模型文件路径
    model_path = r'/root/autodl-tmp/itpossible/Chinese-Mistral-7B-Instruct-v0.1'
    # 训练过程数据保存路径
    name = 'ruozhiba'
    output_dir = f'./output/Mistral-7B-{name}'
    #是否从上次断点处接着训练,如果需要从上次断点处继续训练,值应为True
    train_with_checkpoint = False

    3.2.2 加载 tokenizer

    # 加载tokenizer
    tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True)
    tokenizer.pad_token = tokenizer.eos_token

    3.2.3 加载数据集

    df = pd.read_json(f'./dataset/{name}.json')
    ds = Dataset.from_pandas(df)
    print(ds)

    3.2.4 处理数据集

    需要将数据集的内容按大模型的对话格式进行处理,不同的模型,对话格式不一样,比如 Qwen1.5、Llama3 的对话格式都不一样。以下面这一条对话数据为例。

    处理前的内容:

    {
      "instruction": "只剩一个心脏了还能活吗?",
      "input": "",
      "output": "能,人本来就只有一个心脏。"
    }

    处理后,喂给大模型的内容:

    <s>[INST] <<SYS>>
    <</SYS>>
    只剩一个心脏了还能活吗? [/INST] 能,人本来就只有一个心脏。 </s>
    # 对数据集进行处理,需要将数据集的内容按大模型的对话格式进行处理
    def process_func_mistral(example):
        MAX_LENGTH = 384  # Llama分词器会将一个中文字切分为多个token,因此需要放开一些最大长度,保证数据的完整性
        instruction = tokenizer(
            f"<s>[INST] <<SYS>>\n\n<</SYS>>\n\n{example['instruction']+example['input']}[/INST]",add_special_tokens=False)  # add_special_tokens 不在开头加 special_tokens
        response = tokenizer(f"{example['output']}", add_special_tokens=False)
        input_ids = instruction["input_ids"] + response["input_ids"] + [tokenizer.pad_token_id]
        attention_mask = instruction["attention_mask"] + response["attention_mask"] + [1]  # 因为pad_token_id咱们也是要关注的所以 补充为1
        labels = [-100] * len(instruction["input_ids"]) + response["input_ids"] + [tokenizer.pad_token_id]
        if len(input_ids) > MAX_LENGTH:  # 做一个截断
            input_ids = input_ids[:MAX_LENGTH]
            attention_mask = attention_mask[:MAX_LENGTH]
            labels = labels[:MAX_LENGTH]
        return {
            "input_ids": input_ids,
            "attention_mask": attention_mask,
            "labels": labels
        }
    
    inputs_id = ds.map(process_func_mistral, remove_columns=ds.column_names)

    3.2.5 加载模型

    #加载模型
    model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device, torch_dtype=torch.bfloat16, use_cache=False)
    model.enable_input_require_grads()  # 开启梯度检查点时,要执行该方法
    print(model)

    3.2.6 设置 LORA 训练参数

    config = LoraConfig(
        task_type=TaskType.CAUSAL_LM,
        target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
        inference_mode=False,  # 训练模式
        r=8,  # Lora 秩
        lora_alpha=32,  # Lora alaph,具体作用参见 Lora 原理
        lora_dropout=0.1  # Dropout 比例
    )

    3.2.7 设置训练参数

    model = get_peft_model(model, config)
    model.print_trainable_parameters()
    args = TrainingArguments(
        output_dir=output_dir,
        per_device_train_batch_size=2,
        gradient_accumulation_steps=2,
        logging_steps=20,
        num_train_epochs=2,
        save_steps=25,
        save_total_limit=2,
        learning_rate=1e-4,
        save_on_each_node=True,
        gradient_checkpointing=True
    )

    3.2.8 开始训练

    trainer = Trainer(
        model=model,
        args=args,
        train_dataset=inputs_id,
        data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
    )
    
    # 如果训练中断了,还可以从上次中断保存的位置继续开始训练
    if train_with_checkpoint:
        checkpoint = [file for file in os.listdir(output_dir) if 'checkpoint' in file][-1]
        last_checkpoint = f'{output_dir}/{checkpoint}'
        print(last_checkpoint)
        trainer.train(resume_from_checkpoint=last_checkpoint)
    else:
        trainer.train()

    3.2.9 完整的训练脚本

    from datasets import Dataset
    import pandas as pd
    from transformers import (
        AutoTokenizer,
        AutoModelForCausalLM,
        DataCollatorForSeq2Seq,
        TrainingArguments,
        Trainer, )
    import torch,os
    from peft import LoraConfig, TaskType, get_peft_model
    import warnings
    warnings.filterwarnings("ignore", category=UserWarning) # 忽略告警
    
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    # 模型文件路径
    model_path = r'/root/autodl-tmp/itpossible/Chinese-Mistral-7B-Instruct-v0.1'
    # 训练过程数据保存路径
    name = 'ruozhiba'
    output_dir = f'./output/Mistral-7B-{name}'
    #是否从上次断点处接着训练
    train_with_checkpoint = True
    
    
    # 加载tokenizer
    tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True)
    tokenizer.pad_token = tokenizer.eos_token
    
    
    #加载数据集
    df = pd.read_json(f'./dataset/{name}.json')
    ds = Dataset.from_pandas(df)
    print(ds)
    
    # 对数据集进行处理,需要将数据集的内容按大模型的对话格式进行处理
    def process_func_mistral(example):
        MAX_LENGTH = 384  # Llama分词器会将一个中文字切分为多个token,因此需要放开一些最大长度,保证数据的完整性
        instruction = tokenizer(
            f"<s>[INST] <<SYS>>\n\n<</SYS>>\n\n{example['instruction']+example['input']}[/INST]",add_special_tokens=False)  # add_special_tokens 不在开头加 special_tokens
        response = tokenizer(f"{example['output']}", add_special_tokens=False)
        input_ids = instruction["input_ids"] + response["input_ids"] + [tokenizer.pad_token_id]
        attention_mask = instruction["attention_mask"] + response["attention_mask"] + [1]  # 因为pad_token_id咱们也是要关注的所以 补充为1
        labels = [-100] * len(instruction["input_ids"]) + response["input_ids"] + [tokenizer.pad_token_id]
        if len(input_ids) > MAX_LENGTH:  # 做一个截断
            input_ids = input_ids[:MAX_LENGTH]
            attention_mask = attention_mask[:MAX_LENGTH]
            labels = labels[:MAX_LENGTH]
        return {
            "input_ids": input_ids,
            "attention_mask": attention_mask,
            "labels": labels
        }
    inputs_id = ds.map(process_func_mistral, remove_columns=ds.column_names)
    
    #加载模型
    model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device, torch_dtype=torch.bfloat16, use_cache=False)
    print(model)
    model.enable_input_require_grads()  # 开启梯度检查点时,要执行该方法
    config = LoraConfig(
        task_type=TaskType.CAUSAL_LM,
        target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
        inference_mode=False,  # 训练模式
        r=8,  # Lora 秩
        lora_alpha=32,  # Lora alaph,具体作用参见 Lora 原理
        lora_dropout=0.1  # Dropout 比例
    )
    
    model = get_peft_model(model, config)
    model.print_trainable_parameters()
    args = TrainingArguments(
        output_dir=output_dir,
        per_device_train_batch_size=2,
        gradient_accumulation_steps=2,
        logging_steps=20,
        num_train_epochs=2,
        save_steps=25,
        save_total_limit=2,
        learning_rate=1e-4,
        save_on_each_node=True,
        gradient_checkpointing=True
    )
    trainer = Trainer(
        model=model,
        args=args,
        train_dataset=inputs_id,
        data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
    )
    # 如果训练中断了,还可以从上次中断保存的位置继续开始训练
    if train_with_checkpoint:
        checkpoint = [file for file in os.listdir(output_dir) if 'checkpoint' in file][-1]
        last_checkpoint = f'{output_dir}/{checkpoint}'
        print(last_checkpoint)
        trainer.train(resume_from_checkpoint=last_checkpoint)
    else:
        trainer.train()

    4. 将 checkpoint 转换为 LORA

    新建一个 checkpoint_to_lora.py,将训练的 checkpoint 保存为 LORA。

    from transformers import AutoModelForSequenceClassification,AutoTokenizer
    import os
    
    # 需要保存的lora路径
    lora_path= "/root/lora/Mistral-7B-lora-ruozhiba"
    # 模型路径
    model_path = '/root/autodl-tmp/itpossible/Chinese-Mistral-7B-Instruct-v0.1'
    # 检查点路径
    checkpoint_dir = '/root/output/Mistral-7B-ruozhiba'
    checkpoint = [file for file in os.listdir(checkpoint_dir) if 'checkpoint-' in file][-1] #选择更新日期最新的检查点
    model = AutoModelForSequenceClassification.from_pretrained(f'/root/output/Mistral-7B-ruozhiba/{checkpoint}')
    # 保存模型
    model.save_pretrained(lora_path)
    tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True)
    tokenizer.pad_token = tokenizer.eos_token
    # 保存tokenizer
    tokenizer.save_pretrained(lora_path)

    5. 合并模型

    新建一个 merge.py 文件,将基础模型和 LORA 模型合并为一个新的模型文件。

    from transformers import AutoModelForCausalLM, AutoTokenizer
    import torch
    from peft import PeftModel
    from peft import LoraConfig, TaskType, get_peft_model
    
    model_path = '/root/autodl-tmp/itpossible/Chinese-Mistral-7B-Instruct-v0.1'
    lora_path = "/root/lora/Mistral-7B-lora-ruozhiba"
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    # 合并后的模型路径
    output_path = r'/root/autodl-tmp/itpossible/merge'
    
    # 等于训练时的config参数
    config = LoraConfig(
        task_type=TaskType.CAUSAL_LM,
        target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
        inference_mode=False,  # 训练模式
        r=8,  # Lora 秩
        lora_alpha=32,  # Lora alaph,具体作用参见 Lora 原理
        lora_dropout=0.1  # Dropout 比例
    )
    
    base = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, low_cpu_mem_usage=True)
    base_tokenizer = AutoTokenizer.from_pretrained(model_path)
    lora_model = PeftModel.from_pretrained(
        base,
        lora_path,
        torch_dtype=torch.float16,
        config=config
    )
    model = lora_model.merge_and_unload()
    model.save_pretrained(output_path)
    base_tokenizer.save_pretrained(output_path)

    二、量化模型

    1. 转换模型文件

    基础模型和 LORA 合并后的模型,仍然为多个 safetensors,需要将多个 safetensors 合并为一个 bin。合并方法需要使用 llama.cpp 中 convert.py 转换脚本,github 地址 https://github.com/ggerganov/llama.cpp。转换方法详见 ollama 使用自定义大模型 – CSDN 博客

    python convert.py /root/autodl-tmp/itpossible/merge --outtype f16 --outfile /root/autodl-tmp/itpossible/convert.bin

    执行转换后,可以得到一个 convert.bin 文件,约等于 14G. 为了节约存储空间,之前的合并模型文件夹可以删除了。

    rm -rf /root/autodl-tmp/itpossible/merge

    2. 量化模型

    对 llama.cpp 项目编译后,有个 quantize 可执行文件

    /root/ollama/llm/llama.cpp/quantize /root/autodl-tmp/itpossible/convert.bin q5_k_m

    得到文件 ggml-model-Q5_K_M. gguf,量化参数有多个标准可以选择,选择不同的量化,模型的推理效果不一样。

    三、ollama 创建模型

    使用 Ollama,根据 ggml-model-Q5_K_M. gguf 创建模型,方法详见 ollama 使用自定义大模型_ollama 上面好用的大模型-CSDN博客

    四、总结

    1. 我还分别使用了 llama3-8b,qwen1.5-1.8b 进行 LORA 微调,但是在使用 llama.cpp 进行模型转换环节,出现了 NotImplementedError: BPE pre-tokenizer was not recognized - update get_vocab_base_pre(),从官网查询了很多 issues,暂未找到解决的办法,所以目前只有 Chinese-Mistral-7B-Instruct-v0.1 成功了。
    2. Ollama 的 modelfile 中还提供了添加 ADAPTER 的方法,也就是将 LORA 单独作为 ADAPTER,试了一下,模型推理效果不正确,暂未找到原因。目前,试验成功的方法只有这一个。将基础模型 + LORA 模型合并后,再用 Ollama 创建模型,推理效果达到了预期。
    3. 我只训练了不到半小时,要想微调后的对话效果更好,需要更多的数据集,和更长时间的训练。

    参考文献


  • PALR:个性化感知的推荐系统新范式

    PALR:个性化感知的推荐系统新范式

    大型语言模型(LLM)近年来在自然语言处理领域取得了巨大突破,其强大的语言理解和生成能力也开始被应用于推荐系统,为个性化推荐带来了新的可能性。然而,现有的LLM在推荐系统中的应用大多局限于零样本或少样本测试,或者使用参数量较小的模型进行训练,难以充分发挥LLM的推理能力,也无法利用商品丰富的参数化信息。

    为了解决这些问题,研究人员提出了一个名为PALR的新框架,旨在将用户的历史行为(例如点击、购买、评分等)与LLM相结合,生成用户偏好的商品推荐。

    PALR:如何将用户行为与LLM结合?

    PALR框架主要包含两个阶段:

    1. 候选检索: 首先,利用用户与商品的交互信息,例如用户点击过的商品、购买过的商品等,作为指导,从商品库中检索出候选商品。

    2. LLM排序: 然后,将检索到的候选商品以自然语言的形式输入到一个经过微调的LLM模型中,该模型参数量高达70亿,并通过指令明确要求模型从候选商品中选择最佳推荐结果。

    PALR的优势:

    • 个性化推荐: PALR通过结合用户历史行为,能够更好地理解用户的个性化需求,提供更符合用户口味的推荐结果。
    • 充分利用LLM能力: PALR使用参数量更大的LLM模型,能够充分发挥LLM的推理能力,并利用商品丰富的参数化信息,进行更精准的推荐。
    • 高效推荐: PALR通过候选检索阶段,缩小了推荐范围,提高了推荐效率。

    PALR的实验结果:

    研究人员在多个顺序推荐任务上对PALR进行了测试,结果表明,PALR在各种指标上都优于现有的推荐模型,证明了该框架的有效性。

    PALR的未来展望:

    PALR框架为推荐系统的发展提供了新的方向,未来可以从以下几个方面进行改进:

    • 更强大的LLM模型: 研究人员可以探索使用参数量更大、性能更强的LLM模型,进一步提升推荐效果。
    • 更丰富的用户行为信息: 可以利用更多种类的用户行为信息,例如用户评论、搜索记录等,构建更精准的用户画像。
    • 更灵活的推荐策略: 可以开发更灵活的推荐策略,例如根据不同场景、不同用户群体,提供不同的推荐结果。

    结语

    PALR框架的提出,标志着LLM在推荐系统中的应用迈上了新的台阶。相信随着技术的不断发展,LLM将在个性化推荐领域发挥越来越重要的作用,为用户提供更智能、更个性化的服务,开启推荐系统的新时代。

    参考文献

    • [2305.07622] PALR: Personalization Aware LLMs for Recommendation (https://arxiv.org/abs/2305.07622)
  • 大型语言模型在推荐系统中的应用:一场智能推荐的革命

    近年来,大型语言模型(LLM)在自然语言处理领域取得了巨大进步,其强大的能力也开始应用于推荐系统,为个性化推荐带来了新的突破。本文将带您深入了解LLM在推荐系统中的应用,并探讨其带来的机遇和挑战。

    LLM:推荐系统的“超级大脑”

    大型语言模型,顾名思义,是基于深度学习的语言模型,通过海量文本数据的训练,具备强大的语言理解和生成能力。在推荐系统中,LLM可以发挥以下作用:

    • 更精准的用户画像: LLM可以分析用户的历史行为、偏好和兴趣,构建更精准的用户画像,从而提供更符合用户需求的推荐结果。
    • 更丰富的商品理解: LLM可以理解商品的描述、属性和关联信息,并将其与用户的需求进行匹配,提供更符合用户口味的商品推荐。
    • 更个性化的推荐策略: LLM可以根据用户的个性化需求,生成更具针对性的推荐策略,例如提供个性化的商品推荐列表、推荐理由、商品组合等。

    LLM在推荐系统中的两种主要范式

    目前,LLM在推荐系统中的应用主要分为两种范式:

    1. 判别式推荐LLM(DLLM4Rec): 这种范式主要利用LLM的语言理解能力,对用户和商品进行特征提取,并基于这些特征进行推荐。例如,可以利用LLM对用户评论进行情感分析,从而更好地理解用户的喜好。

    2. 生成式推荐LLM(GLLM4Rec): 这种范式主要利用LLM的语言生成能力,生成推荐理由、商品描述等,为用户提供更丰富的推荐信息。例如,可以利用LLM根据用户的兴趣生成个性化的商品推荐文案,提升用户体验。

    LLM在推荐系统中的挑战与未来

    虽然LLM为推荐系统带来了巨大潜力,但也面临着一些挑战:

    • 数据质量和规模: LLM的训练需要大量高质量的数据,而推荐系统的数据往往存在噪声和稀疏性,这会影响LLM的训练效果。
    • 模型可解释性: LLM的决策过程往往难以解释,这会影响推荐系统的可信度和用户对推荐结果的接受程度。
    • 计算资源需求: LLM的训练和推理需要大量的计算资源,这会限制其在实际应用中的推广。

    未来,LLM在推荐系统中的应用将朝着以下方向发展:

    • 更轻量级的模型: 研究人员将致力于开发更轻量级的LLM模型,降低其计算资源需求,使其更易于部署到实际应用中。
    • 更强的可解释性: 研究人员将致力于提升LLM模型的可解释性,使推荐结果更透明,更易于用户理解。
    • 更丰富的应用场景: LLM将被应用于更多类型的推荐系统,例如新闻推荐、音乐推荐、视频推荐等,为用户提供更智能、更个性化的服务。

    结语

    大型语言模型的出现,为推荐系统带来了新的机遇和挑战。相信随着技术的不断发展,LLM将在推荐系统中发挥越来越重要的作用,为用户提供更精准、更个性化的服务,开启智能推荐的新时代。

    参考文献

    • [2305.19860] A Survey on Large Language Models for Recommendation (https://arxiv.org/abs/2305.19860)
  • 大型语言模型在推荐系统中的应用:一场悄然兴起的变革

    近年来,大型语言模型(LLM)在自然语言处理领域取得了突破性进展,其强大的能力也开始渗透到推荐系统领域,为推荐系统带来了新的机遇和挑战。

    传统的推荐系统主要依赖于用户和物品的特征,例如用户的历史行为、物品的属性等。然而,这些特征往往无法完全捕捉到用户和物品之间的复杂关系,导致推荐结果的准确性和个性化程度有限。

    大型语言模型的出现为推荐系统带来了新的希望。LLM 能够学习到更深层次的语义信息,并能将这些信息用于推荐决策。例如,LLM 可以分析用户的文本评论,理解用户的喜好和需求,从而推荐更符合用户口味的物品。

    大型语言模型在推荐系统中的应用主要分为两大类:

    1. 判别性推荐LLM(DLLM4Rec):

    这类模型主要利用 LLM 的强大能力来学习用户和物品的表示,并利用这些表示来进行推荐。例如,我们可以利用 LLM 对用户评论进行编码,将用户和物品映射到同一个向量空间,然后根据向量之间的距离进行推荐。

    2. 生成式推荐LLM(GLLM4Rec):

    这类模型利用 LLM 的生成能力来生成推荐结果。例如,我们可以利用 LLM 生成用户可能感兴趣的物品描述,或者根据用户的历史行为生成推荐列表。

    大型语言模型在推荐系统中的应用带来了诸多优势:

    • 更精准的推荐: LLM 能够学习到更深层次的语义信息,从而提高推荐结果的准确性。
    • 更个性化的推荐: LLM 能够根据用户的兴趣和需求进行个性化推荐,满足用户的多样化需求。
    • 更丰富的推荐内容: LLM 能够生成更丰富、更具吸引力的推荐内容,例如更详细的物品描述、更具创意的推荐列表等。

    然而,大型语言模型在推荐系统中的应用也面临着一些挑战:

    • 数据需求量大: LLM 的训练需要大量数据,这对于一些数据量较小的推荐系统来说是一个挑战。
    • 计算资源消耗大: LLM 的训练和推理需要大量的计算资源,这对于一些资源有限的推荐系统来说是一个挑战。
    • 可解释性不足: LLM 的决策过程往往难以解释,这对于一些需要透明度和可解释性的推荐系统来说是一个挑战。

    尽管面临着一些挑战,大型语言模型在推荐系统中的应用仍然具有巨大的潜力。相信随着技术的不断发展,大型语言模型将在推荐系统中发挥越来越重要的作用,为用户带来更加精准、个性化和丰富的推荐体验。

    参考文献:

    • Wu, Likang, et al. “A Survey on Large Language Models for Recommendation.” arXiv preprint arXiv:2305.19860 (2023).

    注: 本文参考了 [2305.19860] A Survey on Large Language Models for Recommendation 的内容,并进行了改写和整理,以使其更易于阅读和理解。

  • 算法交易:更复杂,更不可预测?

    近年来,算法交易在金融市场中迅速崛起,彻底改变了金融资产的交易方式。然而,算法交易带来的影响并非简单地提高了交易效率,而是带来了更复杂、更不可预测的市场动态。本文将带您深入探讨算法交易如何改变了金融市场的复杂性和不确定性。

    算法交易的兴起:从自动化到智能化

    算法交易是指使用预先编写的交易指令自动执行交易,这些指令会根据时间、价格、交易量等因素进行调整。算法交易利用了计算机的速度和计算能力,在交易速度和效率上远远超过了人工交易。

    算法交易的发展可以追溯到 20 世纪 70 年代,当时纽约证券交易所推出了“指定订单周转系统”(DOT)。随着全电子交易市场的兴起,程序化交易也随之出现,它允许根据各种因素自动执行交易。20 世纪 80 年代,程序化交易在标普 500 股票和期货市场之间广泛使用,形成了指数套利策略。

    21 世纪初,算法交易的复杂性和智能化程度大幅提升。2001 年,IBM 研究人员在国际人工智能联合会议上发表了一篇论文,证明了在金融市场中使用的电子拍卖的实验性实验室版本中,两种算法策略(IBM 自己的 MGD 和惠普的 ZIP)能够始终优于人工交易者。

    2005 年,美国证券交易委员会(SEC)实施了“国家市场系统法规”,改变了交易方式,例如“交易通过规则”,该规则规定市场订单必须以最佳可获得价格发布和执行,从而防止经纪公司从匹配买卖订单的价格差异中获利。

    随着更多电子交易市场的开放,其他算法交易策略也随之出现,例如:

    • 市场做市:通过持续发布高于当前市场价格的卖出限价单(或报价)或低于当前价格的买入限价单(或出价)来获取买入价差。
    • 统计套利:利用统计模型识别多个证券之间的价格差异,并通过同时买入和卖出这些证券来获取无风险利润。
    • 事件套利:利用特定事件(例如合同签署、监管批准、司法裁决等)来改变两种或多种金融工具的价格或利率关系,从而获取利润。
    • 高频交易:以高周转率和高订单交易比率为特征的算法交易形式。

    算法交易带来的复杂性和不确定性

    研究表明,算法交易虽然能够提高市场流动性,但也带来了新的复杂性和不确定性。

    微观层面的确定性与宏观层面的不确定性

    算法交易遵循预先设定的规则,在微观层面,算法的自动化行为使某些部分的交易动态更加可预测。然而,在宏观层面,整体的交易动态变得更加复杂和不可预测。

    更细致的市场洞察与更大的不确定性

    算法交易能够深入挖掘市场数据,发现人类交易者无法察觉的细微价格差异,从而在更细致的层面上进行交易。然而,这种更细致的市场洞察也带来了更大的不确定性,因为市场动态变得更加复杂,可能的交易结果也更加多样化。

    信息理论:理解复杂性和不确定性的关系

    信息理论为我们提供了一个框架,帮助我们理解算法交易带来的复杂性和不确定性的关系。

    • 信息熵:信息熵衡量的是一个随机变量的不确定性。信息熵越大,不确定性越大;信息熵越小,不确定性越小。
    • 预测复杂性:预测复杂性衡量的是预测一个动态过程所需的最小信息量。预测复杂性越大,动态过程越复杂;预测复杂性越小,动态过程越简单。
    • 剩余不确定性:剩余不确定性衡量的是在已知过去信息的情况下,对未来事件的不确定性。剩余不确定性越大,预测的准确性越低;剩余不确定性越小,预测的准确性越高。

    研究表明,算法交易会增加交易动态的预测复杂性和剩余不确定性。这似乎是一个矛盾,但信息理论解释了这种现象:算法交易创造了新的结构,但同时也增加了可能的交易结果,从而导致更大的不确定性。

    算法交易的未来:更复杂,更不可预测?

    算法交易的快速发展带来了新的挑战,例如:

    • 黑箱问题:算法交易的复杂性使得交易者难以理解算法的决策过程,增加了市场风险。
    • 系统性风险:算法交易的快速执行速度可能会导致市场波动加剧,甚至引发系统性风险。
    • 市场操纵:一些交易者利用算法进行市场操纵,例如“欺骗性报价”和“报价填充”。

    算法交易的未来发展趋势是更加复杂和智能化。随着人工智能技术的不断发展,算法交易将变得更加强大,也更加难以理解和控制。这将给金融市场带来更大的挑战,也需要监管机构和市场参与者共同努力,确保算法交易的健康发展。

    参考文献

    • Hilbert, M. , & Darmon, D. (2020). How Complexity and Uncertainty Grew with Algorithmic Trading. Entropy, 22(5), 499. https://doi.org/10.3390/e22050499
    • The New Investor, UCLA Law Review, available at: https://ssrn.com/abstract=2227498
    • The New Financial Industry, Alabama Law Review, available at: https://ssrn.com/abstract=2417988
    • Virtu Financial Form S-1, available at https://www.sec.gov/Archives/edgar/data/1592386/000104746914002070/a2218589zs-1.htm
    • Wikipedia: Algorithmic trading
  • 超级智能的未来:十年展望与挑战

    随着人工智能技术的飞速发展,我们正站在一个全新时代的门槛上。在未来十年,我们有望见证从人类水平的人工智能(AGI)到远超人类智能的超级智能的转变。本文将探讨这一变革背后的技术趋势、潜在的社会影响以及我们必须面对的挑战。

    技术进步:从AGI到超级智能

    在过去的几年里,人工智能已经从简单的模式识别和数据处理,发展到了能够进行复杂推理和创造的智能系统。根据Leopold Aschenbrenner在《态势感知的未来十年》中的分析,我们正处于一个关键的转折点,AGI的实现已不再遥不可及。

    “到2027年实现AGI是非常可信的。” —— Leopold Aschenbrenner

    AI的进步不仅仅局限于模拟人类的智能。事实上,一旦达到人类智能水平,AI将能够自我改进,引发所谓的“智能爆炸”。这将使得AI的能力在极短的时间内得到指数级的提升,从而迅速超越人类智能。

    社会影响:经济与军事的重塑

    超级智能的出现将对全球经济和军事格局产生深远的影响。拥有超级智能的国家将获得前所未有的科技优势,从而在国际竞争中占据主导地位。这不仅意味着技术上的突破,还可能引发全新的军事革命。

    “超级智能将带来决定性的经济和军事优势。” —— 同上

    然而,这种优势也伴随着巨大的风险。如果超级智能落入不负责任的手中,或者在国际竞争中失去控制,其后果将是灾难性的。

    挑战与应对:确保安全与伦理

    面对超级智能的挑战,我们必须确保技术的发展方向符合人类的长远利益。这包括建立严格的安全协议,防止AI的滥用,并确保技术的伦理使用。

    Leopold Aschenbrenner强调了在AI研究中加强安全意识的重要性,并提出了一系列应对策略,包括技术监控、算法透明度以及国际合作。

    “确保AGI的机密和权重免受国家行为者的威胁将是一项巨大的努力,我们还没有走上正轨。” —— 同上

    此外,超级智能的发展也需要全球性的法律和伦理框架,以确保所有国家都能在公平和安全的基础上参与竞争。

    结语:未来已来

    未来十年,我们将面临前所未有的挑战和机遇。超级智能的实现不仅将重塑我们的世界,还将重新定义人类在宇宙中的地位。现在,正是我们采取行动,为这一变革做好准备的时刻。


    参考文献:

    • Aschenbrenner, L. (JUNE 2024). 态势感知的未来十年.
人生梦想 - 关注前沿的计算机技术 acejoy.com