# streamLearn **Repository Path**: lamda-nju/stream-learn ## Basic Information - **Project Name**: streamLearn - **Description**: 本项目旨在为流数据学习(stream learning)算法的开发提供一个统一的平台,集成了多种流数据学习算法,并配备了相应的测试数据生成方法。平台包含流数据的生成、调度、学习和测试等功能模块,能够满足不同算法在动态流数据环境下的开发和验证需求。通过提供一个高度集成的工具链,用户可以便捷地进行流数据算法的设计、实验与调优,推动流数据学习领域的研究与应用发展。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 623 - **Forks**: 14 - **Created**: 2024-06-07 - **Last Updated**: 2025-06-06 ## Categories & Tags **Categories**: mathlibs **Tags**: 机器学习, 流数据, Python, 增量学习, 分布变化 ## README # StreamLearn 流数据学习 ## 一. 简介
streamlearn
流数据是指以流式形式持续到来的数据,通常由于算力限制和存储约束,无法采用传统的批量训练方法对全数据集进行处理。因此,流数据学习任务必须依赖于实时更新机制,即在数据到来时立即进行处理和模型更新。流数据学习不仅面临计算资源的限制,还需要解决动态开放环境中出现的各种挑战,包括数据噪声、特征变化、标签分布变化等复杂问题。这些挑战要求算法能够高效应对不确定性和变化,保持稳定性和鲁棒性。 本项目旨在为流数据学习算法的开发提供一个统一的平台,集成了多种流数据学习算法,并配备了相应的测试数据生成方法。平台包含流数据的生成、调度、学习和测试等功能模块,能够满足不同算法在动态流数据环境下的开发和验证需求。通过提供一个高度集成的工具链,用户可以便捷地进行流数据算法的设计、实验与调优,推动流数据学习领域的研究与应用发展。同时,平台支持对多源异质流数据、分布变化和噪声等复杂情境的适应,具备处理资源受限环境下的流数据任务的能力。 ## 二. 快速开始 ### 2.1 配置环境 ``` conda env create -n stream conda activate stream conda install python=3.12 && conda install pytorch torchvision pytorch-cuda=12.4 -c pytorch -c nvidia && conda install scikit-learn scipy pandas tqdm matplotlib ``` 或者使用`environment.yaml`: ``` conda env create -f ./environment.yaml -n stream ``` ### 2.2 下载数据集 在项目根目录下运行: ``` wget -O dataset.tar.gz https://box.nju.edu.cn/f/13b5935d67884d60b209/?dl=1 && \ tar -zxvf ./dataset.tar.gz ``` ### 2.3 运行算法 使用以下模板运行算法: ``` python -m StreamLearn.Simulator.test.main \ --seed 随机种子 \ --tasks 任务名称1 任务名称2 ... \ ...任务的参数 ``` ### 2.4 运行示例 ``` > python -m StreamLearn.Simulator.test.main --tasks gdro wgdro --dataset_mode balance --m 10 --lr_GDRO 0.005 Setting seed to 0 tasks: ['gdro', 'wgdro'] ----- Time: 4 ----- --- Task 0: In node 0, start_time=3, running... --- Task 1: To be allocated. WGDRO: [np.float32(7.3735423), np.float32(7.774508), np.float32(7.5486617), np.float32(7.779788), np.float32(7.418446), np.float32(7.5103617), np.float32(7.895818), np.float32(8.018695), np.float32(7.3569784), np.float32(7.4766808)] ----- Time: 13 ----- --- Task 0: In node 0, start_time=3, running... --- Task 1: In node 1, start_time=4, running... GDRO: [np.float32(2.684156), np.float32(2.5641873), np.float32(2.473041), np.float32(2.3754532), np.float32(2.3421597), np.float32(2.4208539), np.float32(2.4114404), np.float32(2.4584618), np.float32(2.4029634), np.float32(2.3806708)] ----- Time: 14 ----- --- Task 0: In node 0, start_time=3, running... --- Task 1: In node 1, start_time=4, running... ``` 这表明启动了GDRO和WGDRO算法,并分别指派到了两个节点上完成了训练。 ## 三. 使用说明 首先介绍具体的接口,然后对本项目中已经实现的算法进行简要的介绍。 ### 3.1 调用接口 详见[任务与参数列表](./StreamLearn/Config/README.md)。 ### 3.2 已实现的算法 这里对本项目中已经实现的算法原理和功能进行简要的介绍,详情请参考末尾的参考文献。 #### 分布变化鲁棒算法 针对多源异质流数据中的分布变化场景,我们提出了适应性强的鲁棒算法,以应对流数据分布变化带来的挑战。特别地,我们分别设计了两种优化算法:GDRO(Group Distributionally Robust Optimization)算法和加权GDRO(WGDRO)算法,分别解决了不同数据分布吞吐量差异的影响。此外,我们还提出了两种超额损失优化算法:MERO(Minimax Excess Risk Optimization)算法和加权MERO(WMERO)算法,用以增强算法在异质噪声环境下的鲁棒性。这些方法在理论上给出了最优的样本复杂度,并通过大量实验验证了其在实际流数据环境中的有效性。 传统的分布鲁棒优化(DRO)问题侧重于最小化一组分布中的最大风险,然而,Agarwal和Zhang(2022)提出的MERO算法采用超额风险来进一步优化鲁棒性,相比传统DRO,MERO能够更有效地抑制异质噪声带来的不利影响。我们开发了高效的随机逼近算法,通过随机凸优化技术,针对MERO问题进行优化,将其转化为具有偏梯度的随机凸-凹优化(SCCO)问题。尽管偏差使得现有的理论不完全适用,但我们证明了该偏差是可控的,从而保证了接近最优的收敛速度。此外,我们还提出了一种新的基于分布的随机优化方法,进一步提高了算法的收敛效率。 #### 流式分布式矩阵元素估计 在流数据学习中,针对大规模分布式环境下的矩阵近似和元素估计任务,我们提出了DS-FD算子和分布式NDV算子。DS-FD算子通过动态滑动窗口机制,实现了对数据流中矩阵近似的实时更新,能够有效应对不断变化的数据分布,保证了算法的稳定性与准确性。分布式NDV算子则通过分布式计算框架,支持大规模数据的并行处理,极大提高了流数据处理的计算效率和可扩展性。针对资源受限的环境,这些算法能够在保证高效处理的同时,减少计算资源的消耗。此外,算法也能够适应分布变化的场景,确保在复杂和动态的数据流环境下,持续提供高效且可靠的性能。 #### 类别和特征增量的流数据学习 随着数据采集方式的变化,特征空间逐步扩展,类别数量也会相应增加,尤其在动态环境中。例如,在活动识别任务中,随着新传感器特征的加入,能够区分更多类型的活动。针对特征和类别同时增量的问题,本文提出了一种特征与类别同步增量(SAFC)学习方法。该方法采用双阶段学习策略,首先确保对旧数据的模型重用,然后通过正则化项帮助新分类器在旧数据基础上进行优化。我们还推导出了理论界限,验证了该方法的有效性和泛化能力。通过扩展至多次增量的情形,我们证明了该方法在实践中的应用潜力,尤其是在活动识别等领域,表现出色。 #### 流数据中的类别增量学习 在类别增量学习(CIL)中,分类模型需要适应新类别的加入,并避免遗忘旧类别。传统的CIL方法通常依赖保存历史类别的代表样本,但近年来的研究表明,保存历史模型能够显著提高性能。然而,这种做法通常不计入内存预算,导致比较不公平。我们提出了一种全新的评估方法,将模型大小纳入内存预算进行全面对比,发现保存历史模型的效果并不总是理想,尤其在内存资源有限的情况下。基于这一点,我们提出了MEMO(Memory-efficient Expandable Model),一种基于共享通用表示扩展的算法,通过高效地提取多样化的表示,保持代表性样本,确保算法在内存受限的情况下仍能提供高效性能。实验表明,MEMO在多个标准数据集上均表现出色,具有很高的竞争力。 #### 资源受限情况下流式任务调度系统 在资源受限的流式任务调度系统中,我们提出了一种动态优化策略,能够根据流数据的分布变化选择合适的学习算法,并对任务的物理节点分布进行优化。具体来说,该系统能够根据实时数据流的特点,自动选择最适合的学习算法,并通过精确的调度策略,在有限的计算资源下最大化任务执行效率。结合分布式计算框架,系统能够灵活地调整任务的分配,确保资源的高效利用。我们还设计了一些优化方法,如自适应负载均衡和任务优先级管理,从而确保在资源受限的环境中,系统能够根据不同场景动态调整任务执行方式,达到最佳性能。这种调度系统的设计,使得流数据处理能够在多变的条件下,依然保持高效和稳定的表现。 #### 参考文献 1. [Efficient Stochastic Approximation of Minimax Excess Risk Optimization](https://arxiv.org/abs/2306.00026) 2. [Stochastic Approximation Approaches to Group Distributionally Robust Optimization and Beyond](https://arxiv.org/abs/2302.09267) 3. [Incremental Learning for Simultaneous Augmentation of Feature and Class](https://ieeexplore.ieee.org/document/10227560) 4. [A Model or 603 Exemplars: Towards Memory-Efficient Class-Incremental Learning](https://arxiv.org/abs/2205.13218) 5. [Learnability with Time-Sharing Computational Resource Concerns](https://academic.oup.com/nsr/article/11/10/nwae204/7693120?login=true) 6. [MATRIX SKETCHING IN BANDITS: CURRENT PITFALLS AND NEW FRAMEWORK](https://arxiv.org/pdf/2410.10258)