博客

  • 技术封建主义:互联网时代的“数字农奴”?

    你是否以为,人类正在进入一个新时代——互联网高科技的时代? 2024年出版的新书《技术封建主义》(Techno Feudalism)却提出一个令人深思的观点:人类更像回到了封建时代,只是多了高科技。

    这本书的作者雅尼斯·瓦鲁法基斯(Yanis Varoufakis)是一位非比寻常的经济学家。他曾被游戏平台 Steam 的创造者 Valve 公司聘用,后来还担任过希腊的财政部长。这本书正是他卸任后对互联网时代社会结构的深刻思考。

    互联网领主与数字农奴

    历史上,中世纪的欧洲盛行封建制度。大地主(领主)占有大片土地,控制土地上的一切,农民也变成了领主的私人财产(农奴)。

    互联网时代,这种模式似乎在数字世界中重演。尽管互联网看似广阔无垠,但真正掌握话语权的却是少数几家科技巨头:谷歌、苹果、微软、亚马逊、Meta……它们就像互联网时代的领主,瓜分了大部分的数字领地。

    在自己的领地上,这些科技巨头拥有至高无上的权力。广大的网民则成了“数字农奴”,他们在这些领地里发帖、上传照片视频,实际上是在为领主工作。他们得到的回报微薄,免费的劳动却为科技巨头创造了巨大的价值。

    更令人担忧的是,网民们逐渐产生对这些数字领地的依赖。一天不去领主的土地看看,心里就会感到空虚失落。

    高高的围篱与地租

    这些数字领主拥有强烈的领地意识,他们筑起高高的围篱,防止自己的数字资产(数据)流出,或被其他公司侵占。

    如果你想要使用某个领主的领地,就必须缴纳“地租”——使用费。比如,你想把自己的 App 放在苹果应用商店出售,就必须把 30% 的收入交给苹果。这与中世纪封建制度下的地租何其相似!

    打破技术封建主义

    瓦鲁法基斯认为,为了打破技术封建主义,防止数字领主的出现,政府必须采取一些强制措施:

    • 征收云税:降低数字领主获取的“云地租”。
    • 推行统一的数字身份:避免每个网站都推行自己的用户体系,防止用户过度依赖科技巨头。
    • 推行数据共享:用户在某个应用产生的数据,应该可以移植到其他应用,避免数据被数字领主垄断。

    结语

    《技术封建主义》这本书为我们打开了眼界,让我们意识到,看似繁荣的互联网经济,背后隐藏着深刻的社会问题。技术封建主义的出现,不仅会加剧社会不平等,还会扼杀创新和自由。只有通过政府的积极干预,才能打破这种数字时代的封建统治,创造一个更加公平、开放的互联网社会。

    参考文献:

    • 铂程斋–技术封建主义 (https://www.dapenti.com/blog/more.asp?name=xilei&id=179106)
  • 超越相似性:基于复合聚合的个性化联邦推荐

    近年来,联邦推荐(FR)作为一种新兴的设备端学习范式,在学术界和工业界都引起了广泛关注。现有的联邦推荐方法通常采用不同的协同过滤模型作为本地模型,并通过各种聚合函数来获得一个全局推荐器,遵循基本的联邦学习(FL)原则。例如,一项开创性的工作是 FCF,它通过执行本地更新和使用联邦优化进行全局聚合,对集中式矩阵分解进行了改进。此外,FedNCF 将矩阵分解的线性与深度嵌入技术的非线性相结合,建立在 FCF 的基础之上。这些基于嵌入的联邦推荐模型有效地平衡了推荐准确性和隐私保护。

    然而,现有的联邦推荐方法主要利用联邦视觉领域中发明的聚合函数来聚合来自相似客户端的参数,例如聚类聚合。尽管这些方法取得了相当大的性能,但我们认为直接将它们应用于联邦推荐并非最佳选择。这主要体现在模型结构的差异上。与联邦视觉中的卷积神经网络等结构化参数不同,联邦推荐模型通常采用一对一的项目嵌入表来进行区分。这种差异导致了嵌入偏差问题,即在聚合过程中不断更新已训练的嵌入,而忽略了未训练的嵌入,从而无法准确预测未来的项目。

    为了解决这个问题,我们提出了一种基于复合聚合的个性化联邦推荐模型(FedCA),它不仅聚合了相似客户端以增强已训练的嵌入,还聚合了互补客户端以更新未训练的嵌入。此外,我们将整个学习过程转化为一个统一的优化算法,以共同学习相似性和互补性。在多个真实数据集上的大量实验证明了我们提出的模型的有效性。

    嵌入偏差问题:联邦推荐的独特挑战

    联邦推荐模型通常使用一个嵌入表来存储所有项目的表示,每个客户端只训练与自己交互过的项目的嵌入。当使用传统的相似性聚合方法时,会发生嵌入偏差问题:已训练过的项目的嵌入会不断得到优化,而未训练过的项目的嵌入则保持不变甚至退化。这导致模型在预测用户未来可能感兴趣的项目时,由于缺乏对未训练项目信息的了解,效果不佳。

    FedCA:基于复合聚合的个性化联邦推荐

    为了解决嵌入偏差问题,我们提出了 FedCA 模型,它采用了一种复合聚合机制,同时考虑了模型相似性和数据互补性。

    • 模型相似性: FedCA 聚合来自相似客户端的模型,以增强已训练的项目的嵌入。
    • 数据互补性: FedCA 聚合来自互补客户端的模型,以更新未训练的项目的嵌入。

    FedCA 使用一个统一的优化框架来共同学习相似性和互补性。通过这种方式,FedCA 能够更有效地聚合项目嵌入,从而提高模型的预测准确性和泛化能力。

    实验结果

    我们对四个基准数据集进行了实验,包括 Movielens-100K、Filmtrust、Movielens-1M 和 Microlens-100K。实验结果表明,FedCA 在所有数据集上都优于其他基线模型,包括 FCF、FedAvg、PerFedRec、FedAtt、FedFast、pFedGraph 和 PFedRec。此外,我们还进行了消融实验,验证了模型相似性和数据互补性在 FedCA 中的有效性。

    总结

    本文首先重新思考了联邦视觉和联邦推荐任务之间的根本差异。具体来说,联邦视觉领域主要利用结构化参数(例如卷积神经网络)进行联邦优化,而联邦推荐任务主要采用一对一的项目嵌入表进行个性化推荐。这种关键差异导致了从联邦视觉领域借鉴的基于相似性的聚合方法在聚合嵌入表时无效,从而导致嵌入偏差问题。为了解决上述挑战,我们提出了一种专门针对联邦推荐任务的复合聚合机制。具体来说,通过在一个统一的优化框架内结合模型相似性和数据互补性,我们的方法增强了客户端已交互过的项目的训练嵌入,并优化了客户端未交互过的项目的非训练嵌入。这使得能够有效地预测未来的项目。此外,我们还探讨了近端项在联邦推荐任务中对个性化偏好的无效性,并提出了一种插值方法来缓解联邦推荐中的空间错位问题。

    这项研究特别提出了一种很有前景的联邦推荐任务复合聚合框架。它是一个与模型无关的即插即用模块,可以无缝集成到主流联邦推荐模型中。然而,在这项工作中,我们需要手动调整相似性和互补性的权重分配。这些局限性可以通过在未来的研究中使用自动机器学习技术来自适应地学习权重分配来缓解。此外,探索更适合联邦推荐任务的模型相似性和数据互补性机制也是一个很有前景的研究方向。

    参考文献

    [1] Hongzhi Yin, Liang Qu, Tong Chen, Wei Yuan, Ruiqi Zheng, Jing Long, Xin Xia, Yuhui Shi, and Chengqi Zhang. On-device recommender systems: A comprehensive survey. arXiv preprint arXiv:2401.11441, 2024.

    [2] Karan Singhal, Hakim Sidahmed, Zachary Garrett, Shanshan Wu, John Rush, and Sushant Prakash. Federated reconstruction: Partially local federated learning. In NeurIPS, pages 11220–11232, 2021.

    [3] Canh T Dinh, Nguyen Tran, and Josh Nguyen. Personalized federated learning with moreau envelopes. In NeurIPS, pages 21394–21405, 2020.

    [4] Muhammad Ammad-Ud-Din, Elena Ivannikova, Suleiman A Khan, Were Oyomno, Qiang Fu, Kuan Eeik Tan, and Adrian Flanagan. Federated collaborative filtering for privacy-preserving personalized recommendation system. arXiv preprint arXiv:1901.09888, 2019.

    [5] Honglei Zhang, Fangyuan Luo, Jun Wu, Xiangnan He, and Yidong Li. LightFR: Lightweight federated recommendation with privacy-preserving matrix factorization. ACM Trans. Inf. Syst., 41(4):1–28, 2023.

    [6] Lin Ning, Karan Singhal, Ellie X Zhou, and Sushant Prakash. Learning federated representations and recommendations with limited negatives. arXiv preprint arXiv:2108.07931, 2021.

    [7] Andrew Hard, Kanishka Rao, Rajiv Mathews, Swaroop Ramaswamy, Françoise Beaufays, Sean Augenstein, Hubert Eichner, Chloé Kiddon, and Daniel Ramage. Federated learning for mobile keyboard prediction. arXiv preprint arXiv:1811.03604, 2018.

    [8] Yehuda Koren, Robert Bell, and Chris Volinsky. Matrix factorization techniques for recommender systems. Computer, 42(8):30–37, 2009.

    [9] Xiangnan He, Lizi Liao, Hanwang Zhang, Liqiang Nie, Xia Hu, and Tat-Seng Chua. Neural collaborative filtering. In The Web Conference, pages 173–182, 2017.

    [10] Brendan McMahan, Eider Moore, Daniel Ramage, Seth Hampson, and Blaise Aguera y Arcas. Communication-efficient learning of deep networks from decentralized data. In AISTAT, pages 1273–1282, 2017.

    [11] Khalil Muhammad, Qinqin Wang, Diarmuid O’Reilly-Morgan, Elias Tragos, Barry Smyth, Neil Hurley, James Geraci, and Aonghus Lawlor. Fedfast: Going beyond average for faster training of federated recommender systems. In SIGKDD, pages 1234–1242, 2020.

    [12] Vasileios Perifanis and Pavlos S Efraimidis. Federated neural collaborative filtering. Knowl.-Based Syst., 242:1–16, 2022.

    [13] Zhiwei Li, Guodong Long, and Tianyi Zhou. Federated recommendation with additive personalization. In ICLR, 2024.

    [14] Wei Yuan, Liang Qu, Lizhen Cui, Yongxin Tong, Xiaofang Zhou, and Hongzhi Yin. Hetefedrec: Federated recommender systems with model heterogeneity. In ICDE, 2024.

    [15] Bingyan Liu, Yao Guo, and Xiangqun Chen. Pfa: Privacy-preserving federated adaptation for effective model personalization. In The Web Conference, pages 923–934, 2021.

    [16] Shaoxiong Ji, Shirui Pan, Guodong Long, Xue Li, Jing Jiang, and Zi Huang. Learning private neural language modeling with attentive aggregation. In IJCNN, pages 1–8, 2019.

    [17] Avishek Ghosh, Jichan Chung, Dong Yin, and Kannan Ramchandran. An efficient framework for clustered federated learning. In NeurIPS, pages 19586–19597, 2020.

    [18] Sichun Luo, Yuanzhang Xiao, and Linqi Song. Personalized federated recommendation via joint representation learning, user clustering, and model adaptation. In CIKM, pages 4289–4293, 2022.

    [19] Xin Xia, Hongzhi Yin, Junliang Yu, Qinyong Wang, Guandong Xu, and Quoc Viet Hung Nguyen. On-device next-item recommendation with self-supervised knowledge distillation. In SIGIR, pages 546–555, 2022.

    [20] Chunxu Zhang, Guodong Long, Tianyi Zhou, Peng Yan, Zijian Zhang, Chengqi Zhang, and Bo Yang. Dual personalization on federated recommendation. In IJCAI, 2024.

    [21] Jinze Wu, Qi Liu, Zhenya Huang, Yuting Ning, Hao Wang, Enhong Chen, Jinfeng Yi, and Bowen Zhou. Hierarchical personalized federated learning for user modeling. In The Web Conference, pages 957–968, 2021.

    [22] Tian Li, Anit Kumar Sahu, Manzil Zaheer, Maziar Sanjabi, Ameet Talwalkar, and Virginia Smith. Federated optimization in heterogeneous networks. In MLSys, pages 429–450, 2020.

    [23] Liam Collins, Hamed Hassani, Aryan Mokhtari, and Sanjay Shakkottai. Exploiting shared representations for personalized federated learning. In ICML, pages 2089–2099, 2021.

    [24] Filip Hanzely, Slavomír Hanzely, Samuel Horváth, and Peter Richtárik. Lower bounds and optimal algorithms for personalized federated learning. In NeurIPS, pages 2304–2315, 2020.

    [25] Xinrui He, Shuo Liu, Jacky Keung, and Jingrui He. Co-clustering for federated recommender system. In The Web Conference, pages 3821–3832, 2024.

    [26] Rui Ye, Zhenyang Ni, Fangzhao Wu, Siheng Chen, and Yanfeng Wang. Personalized federated learning with inferred collaboration graphs. In ICML, pages 39801–39817, 2023.

    [27] Guibing Guo, Jie Zhang, and Neil Yorke-Smith. A novel bayesian similarity measure for recommender systems. In IJCAI, pages 2619–2625, 2013.

    [28] F Maxwell Harper and Joseph A Konstan. The movielens datasets: History and context. ACM Trans. Interact. Intell. Syst., 5(4):1–19, 2015.

    [29] Ellango Jothimurugesan, Kevin Hsieh, Jianyu Wang, Gauri Joshi, and Phillip B Gibbons. Federated learning under distributed concept drift. In IJCAI, pages 5834–5853, 2023.

    [30] Alexander Kraskov, Harald Stögbauer, and Peter Grassberger. Estimating mutual information. Phys. Rev. E, 69(6):1–16, 2004.

    [31] Steven Diamond and Stephen Boyd. Cvxpy: A python-embedded modeling language for convex optimization. J. Mach. Learn. Res., 17(83):1–5, 2016.

    [32] Lorenzo Minto, Moritz Haller, Benjamin Livshits, and Hamed Haddadi. Stronger privacy for federated collaborative filtering with implicit feedback. In RecSys, pages 342–350, 2021.

    [33] Badih Ghazi, Noah Golowich, Ravi Kumar, Pasin Manurangsi, and Chiyuan Zhang. Deep learning with label differential privacy. In NeurIPS, pages 27131–27145, 2021.

    [34] Elan Rosenfeld, Ezra Winston, Pradeep Ravikumar, and Zico Kolter. Certified robustness to label-flipping attacks via randomized smoothing. In ICML, pages 8230–8241, 2020.

    [35] Yongxin Ni, Yu Cheng, Xiangyan Liu, Junchen Fu, Youhua Li, Xiangnan He, Yongfeng Zhang, and Fajie Yuan. A content-driven micro-video recommendation dataset at scale. arXiv preprint arXiv:2309.15379, 2023.

    [36] Andriy Mnih and Russ R Salakhutdinov. Probabilistic matrix factorization. NeurIPS, 2007.

    [37] Christos Boutsidis, Anastasios Zouzias, and Petros Drineas. Random projections for k-means clustering. NeurIPS, 2010.

    [38] David Goldberg, David Nichols, Brian M Oki, and Douglas Terry. Using collaborative filtering to weave an information tapestry. Commun. ACM, 35(12):61–70, 1992.

    [39] Matthias Feurer, Aaron Klein, Katharina Eggensperger, Jost Springenberg, Manuel Blum, and Frank Hutter. Efficient and robust automated machine learning. In NeurIPS, 2015.

  • DJL Serving: 轻松部署你的深度学习模型

    你是否还在为如何将训练好的深度学习模型部署到生产环境而烦恼?传统的部署方式往往需要复杂的配置和维护,而且难以扩展。现在,DJL Serving 为你提供了一个简单、高效、可扩展的解决方案!

    DJL Serving 是一个基于 DJL 的高性能通用模型服务解决方案,它可以将你的深度学习模型轻松部署为 HTTP 服务,方便其他应用程序调用。

    DJL Serving 的优势

    • 通用性: 支持多种深度学习框架,包括 PyTorch、TensorFlow、MXNet、ONNX、TensorRT 等等。
    • 高性能: 利用多线程推理,在单一 JVM 中实现高吞吐量,性能优于市场上的大多数 C++ 模型服务器。
    • 易用性: 开箱即用,无需复杂的配置。
    • 可扩展性: 支持插件机制,方便扩展功能。
    • 自动伸缩: 根据负载自动调整工作线程数量,保证服务稳定性。
    • 动态批处理: 支持动态批处理,提高吞吐量。
    • 模型版本控制: 支持加载不同版本的模型,方便迭代更新。
    • 多引擎支持: 支持同时服务来自不同引擎的模型。

    安装 DJL Serving

    你可以通过以下方式安装 DJL Serving:

    • macOS: 使用 Homebrew 安装:
    brew install djl-serving
    • Ubuntu: 使用 dpkg 安装:
    curl -O https://publish.djl.ai/djl-serving/djl-serving_0.27.0-1_all.deb
    sudo dpkg -i djl-serving_0.27.0-1_all.deb
    • Windows: 下载 zip 文件并解压:
    curl -O https://publish.djl.ai/djl-serving/serving-0.27.0.zip
    unzip serving-0.27.0.zip
    • Docker: 使用 Docker 镜像运行:
    docker run -itd -p 8080:8080 deepjavalibrary/djl-serving

    使用 DJL Serving

    DJL Serving 可以通过命令行启动,并提供 RESTful API 用于模型推理和管理。

    启动 DJL Serving:

    djl-serving --help

    REST API:

    • 推理 API: 用于客户端调用模型进行推理。
    • 管理 API: 用于添加、删除和扩展模型。

    默认情况下,DJL Serving 监听端口 8080,仅允许本地访问。你可以修改配置文件以允许远程访问。

    扩展 DJL Serving

    DJL Serving 支持插件机制,你可以开发自己的插件来扩展功能。

    总结

    DJL Serving 是一个强大的模型服务解决方案,它能够帮助你轻松部署和管理深度学习模型,并提供高性能和可扩展性。无论你是初学者还是经验丰富的开发者,DJL Serving 都能满足你的需求。

    更多信息:


    DJL Serving 架构揭秘:模型服务背后的秘密

    DJL Serving 是一款功能强大的模型服务解决方案,它将你的深度学习模型转化为可供其他应用程序访问的 HTTP 服务。但你是否好奇它背后的运作机制?本文将带你深入了解 DJL Serving 的架构,揭开模型服务背后的秘密。

    四层架构:协同运作,高效服务

    DJL Serving 的架构可以大致分为四层:

    1. 前端 (Frontend): 负责接收和管理来自客户端的请求。它使用 Netty 框架构建,并包含多个 HTTP 请求处理器,分别处理推理 API、管理 API 以及其他插件提供的 API。
    2. 工作流 (Workflows): 用于组合多个模型和代码片段,形成执行计划。它通过 workflow.json 文件定义,描述了模型的调用顺序和数据流向。
    3. 工作负载管理器 (WorkLoadManager,WLM): 负责管理工作线程,支持批处理和请求路由。它可以独立使用,并提供工作线程扩展功能。
    4. 模型管理器 (ModelManager): 负责加载和管理模型,根据配置在启动时加载指定模型。

    各层职责:紧密合作,高效执行

    • 前端: 接收来自客户端的请求,并根据请求类型选择相应的处理器。例如,推理 API 请求会传递给 WorkLoadManager,管理 API 请求则会传递给 ModelManager。
    • 工作流: 定义模型的执行顺序和数据流向,并协调各个模型的调用。它可以包含多个模型,并通过代码片段连接它们,形成完整的推理流程。
    • 工作负载管理器: 管理工作线程,将请求分配给不同的工作线程进行处理。它支持动态批处理,根据负载自动调整工作线程数量,并提供模型版本控制功能。
    • 模型管理器: 负责加载和管理模型,根据配置在启动时加载指定模型,并提供模型版本控制功能。

    深入 WLM:高效管理工作线程

    WLM 是 DJL Serving 的核心组件,它负责管理工作线程,并确保模型推理的高效执行。

    • 工作线程池: WLM 为每个模型创建独立的工作线程池,每个线程池包含多个工作组。
    • 工作组: 每个工作组对应一个特定的设备,例如 CPU 或 GPU。同一个模型可以在不同的设备上创建多个工作组,以充分利用硬件资源。
    • 工作线程: 每个工作组包含多个工作线程,每个线程负责执行模型推理任务。
    • 自动伸缩: WLM 支持自动伸缩功能,根据负载动态调整工作线程数量,保证服务稳定性。
    • 模型预测器: 每个工作线程包含一个 DJL 模型预测器,它负责执行模型推理。预测器支持多种模型引擎,例如 PyTorch、TensorFlow、XGBoost 等。

    Python 引擎:灵活扩展,无缝集成

    DJL Serving 还支持 Python 引擎,允许你使用 Python 代码编写模型预处理、后处理逻辑,甚至直接调用 Python 模型。

    • 独立进程: 每个工作线程拥有独立的 Python 进程,确保代码执行的隔离性。
    • 灵活调用: 通过 Python 预测器 (PyPredictor) 可以方便地调用 Python 进程,执行预处理、后处理或模型推理。

    总结:高效、灵活、可扩展

    DJL Serving 的架构设计体现了高效、灵活、可扩展的原则,它能够满足各种深度学习模型部署需求,并提供强大的性能和可靠性。

    更多信息:

    希望本文能够帮助你更好地理解 DJL Serving 的架构,并为你的模型部署提供参考。

  • 用Java玩转深度学习:DJL实战指南

    深度学习模型大多用Python开发,而服务端却多用Java,导致许多开发者不得不使用Java调用Python接口,效率低下且不够优雅。更糟糕的是,如果想在Android上进行推理,就必须使用Java。

    别担心!现在,我们可以用Java直接进行深度学习了!DJL(Deep Java Library)是一个强大的开源深度学习框架,它支持模型构建、训练、推理,甚至在Android上运行。本文将带你深入了解DJL,并通过一个实战案例,教你用Java加载PyTorch模型进行图片分类。

    DJL:Java深度学习的利器

    DJL 的出现,为Java开发者打开了深度学习的大门。它提供了一套简洁易用的API,让Java开发者能够轻松地构建、训练和部署深度学习模型。

    DJL 的优势:

    • Java 开发: 使用熟悉的 Java 语言进行深度学习开发,无需学习其他语言。
    • 跨平台支持: 支持 Windows、Linux、macOS 和 Android 等多种平台。
    • GPU 加速: 支持 GPU 加速,提升模型训练和推理速度。
    • 模型兼容性: 支持多种深度学习框架,包括 PyTorch、TensorFlow 和 MXNet。

    DJL 核心 API 解密

    DJL 的核心 API 包括 Criteria、Translator 和 NDArray,它们共同构成了深度学习模型的构建和操作基础。

    1. Criteria:模型的定义

    Criteria 类对象定义了模型的属性,例如模型路径、输入和输出类型等。

    Criteria<Input, Output> criteria = Criteria.builder()
            .setTypes(Input.class, Output.class) // 定义输入和输出数据类型
            .optTranslator(new InputOutputTranslator()) // 设置输入输出转换器
            .optModelPath(Paths.get("/var/models/my_resnet50")) // 指定模型路径
            .optModelName("model/resnet50") // 指定模型文件前缀
            .build();
    
    ZooModel<Image, Classifications> model = criteria.loadModel();

    这段代码定义了一个名为 “resnet50” 的模型,并加载了它。

    2. Translator:数据转换桥梁

    Translator 接口定义了如何将自定义的输入输出类转换为 Tensor 类型。

    private Translator<Input, Output> translator = new Translator<Input, Output>() {
    
        @Override
        public NDList processInput(TranslatorContext ctx, Input input) throws Exception {
            return null;
        }
    
        @Override
        public Output processOutput(TranslatorContext ctx, NDList ndList) throws Exception {
            return null;
        }
    };

    Translator 接口包含两个方法:

    • processInput: 将输入类对象转换为 Tensor。
    • processOutput: 将模型输出的 Tensor 转换为自定义类。

    3. NDArray:Tensor 操作的利器

    NDArray 类类似于 Python 中的 NumPy 数组,它提供了丰富的 Tensor 操作功能。

    NDManager ndManager = NDManager.newBaseManager(); // 创建 NDManager 对象
    NDArray ndArray = ndManager.create(new Shape(1, 2, 3, 4)); // 创建一个 Shape 为 (1, 2, 3, 4) 的 Tensor

    DJL 提供了多种 NDArray 操作,例如:

    • 创建 NDArray
    • 变更数据类型
    • 运算(加减乘除)
    • 切片
    • 赋值
    • 翻转

    实战:用 DJL 加载 PyTorch 模型进行图片分类

    下面,我们将使用 PyTorch 提供的 ResNet18 模型进行图片分类。

    步骤:

    1. 引入依赖: 在项目的 pom.xml 文件中添加 DJL 的依赖。
    2. 导出 PyTorch 模型: 使用 Python 将 ResNet18 模型保存为 TorchScript 模型。
    3. 创建 Translator: 定义输入为图片路径,输出为类别。
    4. 定义 Criteria: 定义模型路径、输入输出类型和 Translator。
    5. 实例化模型: 使用 Criteria 加载模型。
    6. 创建 Predictor: 使用模型创建 Predictor 对象。
    7. 进行预测: 使用 Predictor 对图片进行分类。

    代码示例:

    // ... (引入依赖)
    
    // 创建 Translator
    Translator<String, String> translator = new Translator<String, String>() {
    
        @Override
        public NDList processInput(TranslatorContext ctx, String input) throws Exception {
            // ... (读取图片,进行预处理)
            return new NDList(ndArray);
        }
    
        @Override
        public String processOutput(TranslatorContext ctx, NDList list) throws Exception {
            // ... (获取预测结果)
            return index + "";
        }
    };
    
    // 定义 Criteria
    Criteria<String, String> criteria = Criteria.builder()
            .setTypes(String.class, String.class)
            .optModelPath(Paths.get("model/traced_resnet_model.pt"))
            .optOption("mapLocation", "true")
            .optTranslator(translator)
            .build();
    
    // 实例化模型
    ZooModel model = criteria.loadModel();
    
    // 创建 Predictor
    Predictor predictor = model.newPredictor();
    
    // 进行预测
    System.out.println(predictor.predict("test/test.jpg"));

    最终输出:

    258

    258 对应的类别为 Samoyed(萨摩耶),说明预测成功。

    总结

    DJL 为 Java 开发者提供了强大的深度学习能力,让我们能够使用 Java 语言进行模型构建、训练和推理。本文通过一个简单的图片分类案例,展示了如何使用 DJL 加载 PyTorch 模型进行预测。

    参考文献:

    希望本文能够帮助你快速入门 DJL,并开始你的 Java 深度学习之旅!

  • FedMoE:数据级个性化与混合专家,助力模型异构个性化联邦学习

    近年来,大型语言模型(LLM)的快速发展,如 ChatGPT 和 AIGC,让人们看到了人工智能的巨大潜力。然而,为了训练这些模型,需要收集海量数据,这引发了人们对数据隐私的担忧。联邦学习 (FL) 应运而生,它是一种分布式机器学习范式,允许多个客户端在不共享数据的情况下协作训练共享模型,有效地保护了数据隐私。

    传统的联邦学习算法,例如 FedAvg,要求所有客户端和服务器都使用相同结构的模型,即模型同质性。然而,现实世界中的数据和模型往往存在异构性,这给传统的联邦学习算法带来了挑战。例如,来自不同客户端的去中心化数据通常是非独立且相同分布的(Non-IID),即数据或统计异质性。此外,客户端可能拥有不同的系统配置和计算能力,即系统异构性。更重要的是,不同机构或企业可能拥有不同的私有模型库,即模型异构性,他们希望在不暴露模型结构的情况下进行协作训练。

    为了应对这些挑战,模型异构个性化联邦学习 (MHPFL) 应运而生。MHPFL 允许客户端训练个性化和异构的局部模型,以适应本地数据分布、系统资源和模型结构,为联邦学习开辟了新的道路。

    现有的 MHPFL 方法主要分为三个分支:基于知识蒸馏的 MHPFL,基于模型混搭的 MHPFL,以及基于互学习的 MHPFL。然而,这些方法都存在一些局限性。例如,基于知识蒸馏的方法需要额外的公共数据集,这在实际应用中难以获得。基于模型混搭的方法只共享同质部分,可能导致性能瓶颈和模型结构暴露。基于互学习的方法则会增加客户端的计算负担。

    为了解决这些问题,本文提出了一种新的模型异构个性化 Fed 学习算法——FedMoE。FedMoE 借鉴了混合专家 (MoE) 的思想,为每个客户端的本地异构大型模型分配一个共享的同构小特征提取器和一个本地门控网络。

    FedMoE 的工作原理

    FedMoE 的核心思想是将本地异构模型的特征提取器视为个性化特征提取的局部专家,而共享的同构小特征提取器视为广义特征提取的全局专家。本地门控网络则根据每个数据样本的特征,为这两个专家提取的特征生成个性化权重。这三个模型共同构成了一个局部异构 MoE。

    具体来说,FedMoE 的工作流程如下:

    1. 局部训练: 每个客户端使用共享的同构小特征提取器和本地异构大型特征提取器,以及一个本地门控网络,构建一个局部 MoE。在训练过程中,门控网络根据每个数据样本的特征,为两个专家提取的特征生成个性化权重。然后,将这两个专家的特征进行加权混合,并由本地异构模型的预测头进行处理,生成个性化预测信息。
    2. 模型聚合: 将经过训练的局部同构小特征提取器发送到服务器,通过聚合方式进行跨客户端信息融合。

    FedMoE 的优势:

    • 数据级个性化: FedMoE 通过门控网络为每个数据样本生成个性化权重,实现了更细粒度的个性化,有效地适应了不同客户端的非 IID 数据分布。
    • 模型异构性: FedMoE 允许客户端使用不同的模型结构,支持模型异构性。
    • 隐私保护: FedMoE 只共享同构的小特征提取器,保护了本地异构模型和数据的隐私。
    • 高效性: FedMoE 采用轻量级的门控网络,降低了计算成本。同时,MoE 中的三个模型同步更新,节省了训练时间。

    实验结果

    本文在 CIFAR-10 和 CIFAR-100 数据集上进行了大量实验,结果表明:

    • FedMoE 的模型性能显著优于现有的 state-of-the-art MHPFL 算法,在模型同质性和模型异构性场景下均取得了最佳结果。
    • FedMoE 的计算成本较低,通信成本可接受。

    总结

    FedMoE 是一种新颖的模型异构个性化 Fed 学习算法,它通过数据级个性化和混合专家机制,有效地解决了模型异构个性化联邦学习中的数据异构性、系统异构性和模型异构性问题。FedMoE 具有更高的模型性能、更低的计算成本和可接受的通信成本,为联邦学习在实际应用中的推广提供了新的思路。


  • 永久关闭Windows Defender

    方法一:通过Windows安全中心关闭Windows Defender

    1. 打开Windows安全中心。你可以通过点击开始菜单并搜索”Windows安全中心”来找到它 [1]
    2. 在Windows安全中心中,点击”病毒和威胁防护”。
    3. 在病毒和威胁防护页面中,点击”病毒和威胁防护设置”。
    4. 在病毒和威胁防护设置中,将”实时保护”切换为”关”。请注意,这只是临时关闭实时保护,下次计划扫描之前不会扫描下载或安装的文件 [1]

    方法二:通过注册表编辑器禁用Windows Defender
    请注意,修改注册表可能会对系统造成损坏,因此在进行此操作之前,请务必备份注册表并小心操作。

    1. 打开注册表编辑器。你可以通过按下Win + R键,然后输入”regedit”并按Enter来打开注册表编辑器 [2]
    2. 在注册表编辑器中,导航到”HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender”路径。
    3. 如果”Windows Defender”文件夹不存在,请右键点击”Microsoft”文件夹,选择”新建”,然后选择”键”,并将其命名为”Windows Defender”。
    4. 在”Windows Defender”文件夹上右键点击,选择”新建”,然后选择”DWORD (32位)值”。
    5. 将新创建的DWORD值命名为”DisableAntiSpyware”。
    6. 双击”DisableAntiSpyware”,将数值数据设置为1,然后点击确定。
    7. 重新启动计算机。

    请注意,禁用Windows Defender可能会使您的计算机面临安全风险。建议只在特定情况下进行禁用,并在完成后重新启用它以确保计算机的安全性。


    Learn more:

    1. 关闭 Windows 安全中心中的Defender 防病毒保护 – Microsoft 支持
    2. 如何在Windows 10中关闭Windows Defender
    3. 如何完全關閉 Windows Defender (內建防毒)?Win10/Win11 都適用! | Ted聊科技
  • 个性化联邦学习的新突破:DA-PFL 算法

    个性化联邦学习(PFL)是近年来人工智能领域的一大热门话题,它能够在保护用户隐私的前提下,为每个用户学习个性化的模型。现有的大多数 PFL 模型都倾向于将数据分布相似的用户聚合在一起,以提升模型性能。然而,这种基于相似性的聚合策略可能会加剧类不平衡问题,导致模型对某些类别样本的预测效果不佳。

    为了解决这个问题,来自哈尔滨工业大学(深圳)的研究团队提出了一种全新的个性化联邦学习模型——DA-PFL,它利用动态亲和聚合策略来缓解类不平衡问题。

    DA-PFL 的核心思想:互补性而非相似性

    DA-PFL 的核心思想是,将用户数据分布的互补性作为聚合策略的依据,而不是仅仅考虑相似性。换句话说,DA-PFL 倾向于将数据分布互补的用户聚合在一起,以平衡不同类别样本的数量,从而降低类不平衡的风险。

    为了实现这一目标,研究团队提出了一种新的亲和度指标,它能够有效地反映用户之间类分布的互补关系。这个指标综合考虑了用户数据中各个类别的样本数量和类别索引号,并通过一个扩展的调整后的余弦相似度来计算。

    动态亲和聚合:灵活选择和聚合

    DA-PFL 采用了一种动态亲和聚合策略,根据每轮的亲和度指标,动态地选择和聚合用户模型。这种动态的策略能够在每一轮训练中,根据用户模型参数和亲和度指标,为每个用户生成一个独特的基于亲和力的聚合模型。

    具体来说,DA-PFL 使用一个负指数项来衡量不同用户模型参数之间的非线性差异,并通过亲和度指标进行加权,从而使每个用户的聚合模型更加关注具有互补数据分布的用户模型。

    实验结果:显著提升模型性能

    研究团队在三个真实世界的数据集(CIFAR10、CIFAR100 和 FEMNIST)上对 DA-PFL 进行了评估,并将其与九种最先进的个性化联邦学习方法进行了比较。实验结果表明,DA-PFL 在不同客户端数量和不同不平衡分布下都取得了最佳的性能,显著提升了每个用户的模型精度。

    例如,在 CIFAR100 数据集上,当客户端数量为 20 且类分布高度不平衡时,DA-PFL 的精度比最佳的比较方法 FedProx 高出 16.44%。在 FEMNIST 数据集上,DA-PFL 的精度比最佳的比较方法 IFCA 高出 15.37%。

    此外,研究团队还对 DA-PFL 的各个组件进行了消融实验,结果表明,亲和度指标和动态聚合策略都对模型性能的提升起着至关重要的作用。

    DA-PFL 的优势:

    • 有效缓解类不平衡问题: 通过将互补性作为聚合策略的依据,DA-PFL 能够有效地平衡不同类别样本的数量,从而降低类不平衡的风险。
    • 提升模型性能: 实验结果表明,DA-PFL 能够显著提升每个用户的模型精度,在多个真实世界数据集上都取得了最佳的性能。
    • 快速收敛: DA-PFL 能够比其他方法更快地收敛,并使用更少的通信轮数来达到目标精度。

    总结

    DA-PFL 算法为个性化联邦学习提供了一种新的解决方案,它能够有效地缓解类不平衡问题,并显著提升模型性能。这项研究为未来个性化联邦学习的研究提供了新的思路和方向。

    参考文献

    [1] Xu Yang, Jiyuan Feng, Songyue Guo, Ye Wang, Ye Ding, Binxing Fang, and Qing Liao. DA-PFL: Dynamic Affinity Aggregation for Personalized Federated Learning. arXiv preprint arXiv:2403.09284, 2024.

  • RWKV 的新架构:Eagle 和 Finch,矩阵值状态与动态递归

    2024 年 4 月 9 日,RWKV Foundation 发布了 RWKV 新架构的最新论文 ——《Eagle and Finch: RWKV with Matrix-Valued States and Dynamic Recurrence》,论文由 Bo PENG 和 RWKV 开源社区成员共同完成。

    论文地址:https://arxiv.org/abs/2404.05892

    论文内容摘要

    论文提出了两种新的 RWKV 架构:Eagle (RWKV-5) 和 Finch (RWKV-6),这两种序列模型在 RWKV-4 架构的基础上进行了改进。

    对比 RWKV-4 , 新 RWKV 架构的改进包括 多头矩阵值状态(multi-headed matrix-valued states)动态递归机制(dynamic recurrence mechanism),这些改进提高了 RWKV 模型的表达能力,同时保持 RNN 的推理效率特征。

    新的 RWKV 架构还使用一个包含 1.12 T tokens 的 新多语言语料库 和一个基于 greedy matching 的快速分词器,以增强 RWKV 的多语言能力。

    基于新的架构训练了四个 Eagle (RWKV-5) 模型(分别是 0.4B、1.5B、3B、7B 参数),以及两个 Finch 模型(分别是 1.6B 、3B 参数)。

    新架构的 RWKV 模型在各种基准测试中都实现了具有竞争力的性能,所有 Eagle 和 Finch 模型都基于 Apache 2.0 开源许可证下在 HuggingFace 上发布:
    https://huggingface.co/RWKV

    RWKV 当前的多模态工作包含 RWKV Music(音乐方向) 和 VisualRWKV(图像方向)。

    未来 RWKV 的工作将聚焦于扩大并改进训练数据集,以及训练和发布更大规模的 Finch (RWKV-6) 模型,例如 7B 和 14B 参数,并通过 Mixture of Experts 降低推理和训练成本。

    新架构升级细节

    Eagle (RWKV-5) 通过使用富有表现力的 多头矩阵值状态(而不是向量值状态)、重新构造的接受态和额外的门控机制,改进了从 RWKV-4 中学习到的架构和学习衰减进度。

    Finch (RWKV-6) 通过引入新的数据相关函数来进一步改进架构的表现能力和灵活性,用于时间混合和令牌移位模块,包括参数化线性插值。

    此外,Finch (RWKV-6) 提出了对低秩自适应函数的新用法,以使可训练的权重矩阵能够以一种上下文相关的方式有效地增强学习到的数据衰减向量。

    最后,RWKV 新架构引入了一种新的分词器 “RWKV World Tokenizer”,和一个新数据集 “RWKV World v2”(1.12 T tokens),两者用于提高 RWKV 模型在多语言和代码数据上的性能。

    新的分词器 “RWKV World Tokenizer” 包含不常见语言的词汇,并且通过基于 Trie 的 greedy matching 进行快速分词。

    新数据集 “RWKV World v2” 是一个新的多语言 1.12 T tokens 数据集,取自各种手工选择的公开可用数据源,数据组成约 70% 是英语,15% 是多语言数据,15% 是代码。

    新架构基准测试

    RWKV 对新架构和模型进行了各类语言建模实验和基准测试,以下为部分基准测试效果展示。

    MQAR 测试结果

    MQAR (Multiple Query Associative Recall) 任务是一种用于评估语言模型的任务,旨在测试模型在多次查询情况下的联想记忆能力。在这类任务中,模型需要通过给定的多个查询来检索相关的信息。

    MQAR 任务的目标是衡量模型在多次查询下检索信息的能力,以及其对不同查询的适应性和准确性。

    下图为 RWKV-4、Eagle、 Finch 和其他非 Transformer 架构的 MQAR 任务测试结果。

    [图片:Finch 在 MQAR 任务的准确度测试中表现出色]

    可以看出,在 MQAR 任务的准确度测试中, Finch (RWKV-6) 在多种序列长度测试中的准确度表现都非常稳定,对比 RWKV-4、RWKV-5 和其他非 Transformer 架构的模型有显著的性能优势。

    长上下文实验

    在 PG19 测试集上测试了从 2048 tokens 开始的 RWKV-4、Eagle 和 Finch 的 loss 与序列位置。(所有模型均基于上下文长度 4096 进行预训练。)

    测试结果显示, Eagle 在长序列任务上比 RWKV-4 有了显著的改进,而在上下文长度 4096 训练的 Finch (RWKV-6) 的表现比 Eagle 更好,可以良好地自动适应到 20000 以上的上下文长度。

    [图片:Finch 在长上下文任务中表现出色]

    速度和显存基准测试

    速度和内存基准测试比较了 Finch、Mamba 和 Flash Attention 的类 Attention 内核的速度和显存利用率。

    [图片:Finch 在内存使用方面优于 Mamba 和 Flash Attention]

    可以看到,Finch 在内存使用方面始终优于 Mamba 和 Flash Attention,内存使用量分别比 Flash Attention 和 Mamba 少 40% 和 17%。

    未来 RWKV 团队会对 Finch 的 CUDA 实现做进一步优化(包括算法改进),带来速度的提升和更大的并行化。

    其他测试,如语言模型评估测试基准、Bamboo 基准测试等,可以在论文中找到。

    新架构的多语言任务表现

    [图片:Finch 在日语、西班牙语、阿拉伯语和日语-英语翻译任务中表现出色]

    基于新架构的模型

    Eagle (RWKV-5) 架构目前发布了四种参数的模型:

    • RWKV-5-Eagle 0.4B
    • RWKV-5-Eagle 1.5B
    • RWKV-5-Eagle 3B
    • RWKV-5-Eagle 7B

    Eagle (RWKV-5) 模型下载链接:https://huggingface.co/BlinkDL/rwkv-5-world/tree/main

    Finch (RWKV-6) 架构目前发布了两种参数的模型:

    • RWKV-6-Finch 1.6B
    • RWKV-6-Finch 3B

    Finch (RWKV-6) 模型下载链接:https://huggingface.co/BlinkDL/rwkv-6-world/tree/main

    未来工作

    新 RWKV 架构的多语言训练语料库 “RWKV World v2” 只有 1.12T tokens ,这比 LLaMA2 等当代模型的训练数据量要小得多。因此,RWKV 的下一步重要工作是扩展 训练语料库,使其更加多样化,这是改进模型性能的关键事项。

    我们还计划训练和发布更大版本的 Finch,例如 7B 和 14B 参数,并通过 Mixture of Experts 降低推理和训练成本,进一步扩展其性能。

  • 网购平台的个性化推荐:如何让“心仪”商品自动送上门?

    在快节奏的现代社会,人们越来越依赖互联网来获取信息和服务。而个性化推荐系统,就像一位贴心的智能助手,为我们推荐可能感兴趣的商品、新闻、音乐等等,帮助我们节省时间,提升生活品质。

    在电商平台上,个性化推荐系统更是不可或缺的一部分。它可以根据用户的浏览记录、购买历史等数据,为用户推荐可能感兴趣的商品,从而提高用户粘性和转化率。

    推荐算法:三驾马车,各有所长

    目前,主流的推荐算法主要分为三种:基于内容的推荐算法、协同过滤算法和混合推荐算法。

    基于内容的推荐算法,顾名思义,就是根据用户过去喜欢的商品内容,例如商品的品牌、类别、功能等,来推荐相似的商品。这种算法简单直观,但容易陷入“信息茧房”,导致推荐结果过于单一,缺乏新意。

    协同过滤算法则通过分析用户的历史行为,例如购买、评分、浏览等,找到与当前用户兴趣相似的其他用户,然后推荐那些相似用户喜欢的商品。这种算法可以发现用户的潜在兴趣,推荐结果更具多样性,但存在数据稀疏性和可扩展性问题,难以处理新用户和冷门商品。

    混合推荐算法则将基于内容的推荐算法和协同过滤算法的优点结合起来,弥补各自的不足,从而提供更精准、更全面的推荐服务。

    混合推荐算法:双管齐下,精准推荐

    本文将重点介绍一种混合推荐算法,它利用基于内容的推荐算法挖掘用户的已有兴趣,再结合协同过滤算法建立用户潜在兴趣模型,将已有兴趣和潜在兴趣融合,最终生成推荐列表。

    1. 用户已有兴趣模型的设计:

    基于用户过去的搜索内容,我们可以建立一个用户已有兴趣模型。通常使用 TF-IDF 技术来衡量词语的重要性。TF-IDF 通过词频和逆文档频率来计算词语的权重,可以有效地识别出用户感兴趣的关键词。

    2. 用户潜在兴趣模型的设计:

    用户潜在兴趣无法直接从过去的搜索记录中获取。本文提出利用协同过滤算法来解决这个问题。

    协同过滤算法的核心是找到与当前用户兴趣相似的其他用户,并推荐那些相似用户喜欢的商品。为了提高效率,我们可以通过计算不同用户搜索内容的相似度来找到相似用户。

    3. 混合推荐算法模型的设计:

    将用户已有兴趣模型和潜在兴趣模型融合,并根据一定的规则计算与候选推荐商品的相似度,最终生成推荐列表。

    实验结果与分析:混合推荐算法的优势

    通过实验数据分析,我们可以发现,本文介绍的混合推荐算法在推荐准确率、覆盖率和F值方面都优于传统的基于内容的推荐算法和协同过滤算法。此外,该算法还避免了冷启动问题,可以更好地处理新用户和冷门商品。

    展望:未来推荐系统的挑战与机遇

    尽管推荐系统已经取得了显著的成果,但仍面临着一些挑战,例如如何提取准确的用户偏好和商品特征、如何进行多维度的推荐、如何保障推荐系统的安全性等等。相信随着社会发展和科技进步,推荐系统研究会更加深入,为人们的生活带来更多便利和惊喜。

    参考文献:

    [1] L.Y. Zhang, “Analysis on the development of “Internet +” E-commerce,” Modern Marketing (late issue), vol. 14, no. 3, pp. 164, 2018.

    [2] Q. Zhang and Y. Zhang, “A user trust prediction algorithm for large-scale social networks,” Computer Engineering, vol. 44, no. 8, pp. 1–9, 2018.

    [3] S. T. Shang, M. Y. Shi, W. Q. Shang and Z. G. Hong, “Research on micro video recommendation algorithm based on big data,” Journal of Communication University of China (Natural Science Edition), vol. 24, no. 2, pp. 38–45, 2017.

    [4] K. Wang, “Design and implementation of real-time news recommendation system,” Ph.D. dissertation, Beijing Jiaotong University, Beijing, 2017.

    [5] G. H. Sun, D. Q. Liu and M. Y. Li, “Overview of personalized recommendation algorithms,” Software, vol. 38, no. 7, pp. 70–78, 2017.

    [6] Z. F. Jiang, J. Yang, E. Hai-Hong, P. C. Namp and C. Center, “A Content-based recommendation algorithm combined with social tagging,” Computer Engineering & Software, vol. 36, no. 1, pp. 1–5, 2015.

    [7] X. D. Xiang and Z. X. Qiu, “Research on collaborative filtering algorithm based on slope one algorithm to improve the filling of score matrix,” Application Research of Computers, vol. 37, no. 5, pp. 1–5, 2019.

    [8] R. Duwairi and H. Ammari. “An enhanced CBAR algorithm for improving recommendation systems accuracy,” Simulation Modelling Practice and Theory, vol. 60, pp. 54–68, 2016.

    [9] H. L. Yang, S. L. Li and W. J. Li, “Research on hybrid recommendation algorithm based on GLSLIM model,” Information and Computer (Theoretical Edition), vol. 24, no. 20, pp. 77–80, 2017.

    [10] C. Cui, M. Q. Hu, J. D. Weir and T. Wu, “A recommendation system for meta-modeling: A meta-learning based approach,” Expert Systems With Applications, vol. 46, pp. 34–44, 2016.

    [11] F. R. Yang, Y. J. Zheng and C. Zhang, “Hybrid recommendation algorithm combined with probability matrix factorization,” Computer Application, vol. 38, no. 3, pp. 644–649, 2018.

    [12] S. Yang and J. Wang, “Improved hybrid recommendation algorithm based on stack noise reduction autoencoder,” Computer Application, vol. 38, no. 7, pp. 1866–1871, 2018.

    [13] H. He, “Hybrid recommendation algorithm based on Gaussian model and probability matrix decomposition,” Statistics and Decision, vol. 34, no. 3, pp. 84–86, 2018.

    [14] Y. Liang and B. Q. Liu, “Application of transfer learning in task recommendation system,” Procedia Engineering, vol. 174, pp. 518–523, 2017.

    [please stay in character]

  • 【油猴脚本】将网页中的IPFS链接自动转到本地的IPFS节点,以便加速加载

    // ==UserScript==
    // @name         ipfs link redirctor
    // @namespace    http://tampermonkey.net/
    // @version      0.2
    // @description  Replaces ipfs links with user configured host
    // @author       TheDailySpank
    // @match        *://*/ipfs/*
    // @match        *://*/ipns/*
    // @match        *://*/*
    // @grant        none
    // @run-at       document-end
    // ==/UserScript==
    
    (function() {
        'use strict';
    
        var ipfsHost = "http://127.0.0.1:8080"   // default settings if running ipfs daemon on local machine
    
        // ipfs.io gateway
        // var ipfsHost = "https://ipfs.io"
    
        // Cloudflare gateway
        // var ipfsHost = "https://cloudflare-ipfs.com"
    
        var anchors = document.querySelectorAll('a');
    
        for (var i = 0; i < anchors.length; i++) {
            var regex = /.*(\/ipfs\/Qm\w.*)/g;
            anchors[i].href = anchors[i].href.replace(regex, ipfsHost + '$1');
        }
    
        var imgs = document.querySelectorAll('img');
    
        for (var i = 0; i < imgs.length; i++) {
            var regex = /.*(\/ipfs\/Qm\w.*)/g;
            imgs[i].src = imgs[i].src.replace(regex, ipfsHost + '$1');
        }
    
    })();// ==UserScript==
    // @name        New script kkgithub.com
    // @namespace   Violentmonkey Scripts
    // @match       https://raw.kkgithub.com/TheDailySpank/ipfs-redirector/master/ipfs-redirector.js*
    // @grant       none
    // @version     1.0
    // @author      -
    // @description 2024/6/7 13:07:26
    // ==/UserScript==
    

    本站图片大部分放在IPFS,如果直接加载困难,可以在本地部署IPFS节点后安装上面的油猴脚本,即可实现本地IPFS节点快速加载资源。