AI原生应用+增量学习:重塑智能应用新格局
你是否遇到过这样的困扰:用了3年的智能音箱,依然听不懂你新学的网络热词?用了2年的购物APP,推荐的商品还是去年的风格?这些现象背后,是传统智能应用的"成长瓶颈"——它们要么是"传统软件+AI补丁"的拼接产物,要么是"一次性训练"的静态模型。本文将聚焦"AI原生应用+增量学习"这对技术组合,带你理解如何让智能应用真正具备"边用边学"的能力,从"工具"进化为"会成长的伙伴"。本文将按照"故事引入→概
AI原生应用+增量学习:重塑智能应用新格局
关键词:AI原生应用、增量学习、持续进化、智能应用、灾难性遗忘
摘要:本文将揭开"AI原生应用+增量学习"这对黄金组合的神秘面纱。我们将从生活场景出发,用"会成长的智能助手"故事引入,通俗解释AI原生应用(从诞生就自带AI基因的应用)与增量学习(边用边学的超能力)的核心概念,拆解二者如何像"种子与阳光"般相互成就。通过Python代码实战、数学模型解析和真实案例(如智能客服进化史),带你看清这对组合如何解决传统应用"越用越笨"的痛点,最终重塑智能应用的新格局。
背景介绍
目的和范围
你是否遇到过这样的困扰:用了3年的智能音箱,依然听不懂你新学的网络热词?用了2年的购物APP,推荐的商品还是去年的风格?这些现象背后,是传统智能应用的"成长瓶颈"——它们要么是"传统软件+AI补丁"的拼接产物,要么是"一次性训练"的静态模型。本文将聚焦"AI原生应用+增量学习"这对技术组合,带你理解如何让智能应用真正具备"边用边学"的能力,从"工具"进化为"会成长的伙伴"。
预期读者
- 对AI应用开发感兴趣的开发者
- 想了解智能应用底层逻辑的产品经理
- 对"AI如何持续进化"好奇的技术爱好者
文档结构概述
本文将按照"故事引入→概念拆解→关系解析→技术原理→实战案例→未来展望"的逻辑展开。重点通过生活类比、代码示例和真实场景,让复杂技术变得可触摸。
术语表
核心术语定义
- AI原生应用(AI-Native Application):从需求分析、架构设计到功能实现,全程以AI为核心驱动力的应用(区别于"传统应用+AI模块"的拼接模式)。
- 增量学习(Incremental Learning):让模型在已有知识基础上,通过持续接收新数据进行学习,同时保留旧知识的技术(类似人类边工作边积累经验)。
- 灾难性遗忘(Catastrophic Forgetting):传统模型在学习新数据时,可能"忘记"之前学过的知识(像小朋友学了新单词就忘了旧单词)。
相关概念解释
- 批量学习(Batch Learning):传统模型训练方式,需要收集所有数据后一次性训练(类似学生考前集中复习)。
- 在线学习(Online Learning):模型接收一条数据就更新一次(类似学生每天学一点,但容易"学了新的忘旧的")。
核心概念与联系
故事引入:小明的智能助手"小灵"进化史
小明2020年买了智能助手"小灵",初始功能是定闹钟、查天气。2021年小明开始用它点外卖,小灵却总听错"宫保鸡丁"和"鱼香肉丝";2022年小明喜欢说"绝绝子"“栓Q”,小灵又懵了;2023年,小明惊喜发现:小灵不仅能准确识别新热词,甚至能根据他的购物记录推荐"最近常买的零食+新上的口味"。原来,小灵背后的团队做了两件大事:
- 重新设计了"以AI为核心"的架构(AI原生应用);
- 给模型添加了"边用边学"的能力(增量学习)。
这个故事里,AI原生应用是"让小灵从出生就自带学习基因",增量学习是"让小灵能边工作边成长"。二者结合,才有了小灵的"进化奇迹"。
核心概念解释(像给小学生讲故事一样)
核心概念一:AI原生应用——从出生就自带AI基因的"智能体"
传统应用就像"组装的机器人":先造好身体(基础功能),再装个AI大脑(比如加个语音识别模块)。而AI原生应用就像"天生的智能生物":从设计身体(架构)时,就考虑大脑(AI模型)如何驱动全身(功能)。
举个例子:
- 传统翻译APP:先做好界面和网络功能,再调用第三方翻译API(AI是"补丁");
- AI原生翻译APP:从底层就设计"如何让翻译模型实时学习用户的表达习惯"(AI是"核心"),比如用户总把"打工人"翻译成"hardworking people",模型会记住这个偏好,下次自动推荐。
核心概念二:增量学习——边用边学的"超能力"
想象你是个转学生:第一天学了数学1-100,第二天学了语文拼音,第三天学了英语字母。如果每次学新东西都要"清空之前的记忆重新学",那肯定学不好。增量学习就像"聪明的转学生":学新内容时,能保留之前的知识,还能把新旧知识结合起来。
用学习骑自行车打比方:
- 批量学习:先在操场练100次,学会了再上路(但上路后遇到新情况(比如下坡)就不会了);
- 增量学习:先学平地骑行,上路遇到下坡时,边骑边调整平衡,同时保留平地骑行的记忆(下次不管平地还是下坡都能骑)。
核心概念三:灾难性遗忘——模型的"鱼的记忆"陷阱
传统模型在学习新数据时,容易"忘记"旧知识,就像小朋友学了新单词"apple",却忘了之前学的"banana"。这种现象叫"灾难性遗忘"。增量学习的核心任务之一,就是解决这个问题,让模型既有"新记性"又有"老记性"。
核心概念之间的关系(用小学生能理解的比喻)
AI原生应用 vs 增量学习:种子与阳光的关系
AI原生应用就像一颗"会成长的种子"(从设计时就具备学习潜力),而增量学习是"阳光"(提供持续成长的能量)。没有增量学习,AI原生应用会停留在初始状态(种子不发芽);没有AI原生应用的架构支持,增量学习的能力也无法发挥(阳光照在石头上,石头不会生长)。
增量学习 vs 灾难性遗忘:警察与小偷的博弈
增量学习是"警察",灾难性遗忘是"小偷"。警察(增量学习技术)要阻止小偷(遗忘)偷走旧知识,同时让模型能装进新知识。比如,增量学习中的"弹性权重整合(EWC)“技术,就像给重要的旧知识"上保险”(标记哪些参数不能随便改),小偷(遗忘)就偷不走了。
AI原生应用 vs 灾难性遗忘:房子与锁的关系
AI原生应用的架构设计(比如数据存储、模型更新策略)就像"房子的结构",而防止灾难性遗忘的技术(比如rehearsal方法)就像"锁"。好的房子结构(AI原生架构)能让锁(防遗忘技术)更好用——比如把重要的旧数据存进"记忆库",模型学习新数据时,能随时"翻旧账"复习,避免忘记。
核心概念原理和架构的文本示意图
AI原生应用架构:
数据采集层(实时收集用户行为) → 模型管理层(维护多个版本模型) → 增量学习引擎(融合新旧数据训练) → 功能输出层(根据最新模型提供服务)
增量学习流程:
旧模型 + 新数据 → 防遗忘机制(复习旧知识) → 模型更新 → 验证(新旧任务准确率) → 部署新模型
Mermaid 流程图:AI原生应用的增量进化过程
graph TD
A[用户使用应用] --> B[产生新数据]
B --> C[数据存入记忆库]
C --> D[增量学习引擎]
D --> E{是否触发更新?}
E -->|是| F[融合旧模型+新数据训练]
E -->|否| D
F --> G[防遗忘检查(新旧任务准确率)]
G --> H[部署新模型]
H --> I[用户体验升级]
I --> A
核心算法原理 & 具体操作步骤
增量学习的核心挑战是解决"灾难性遗忘",这里我们以最经典的**弹性权重整合(Elastic Weight Consolidation, EWC)**算法为例,用Python代码演示其原理。
EWC算法核心思想
模型学习新任务时,给旧任务中重要的参数"上弹性绳"——如果参数变化太大,就会被"绳子"拉回来,从而保留旧知识。
数学模型公式
总损失函数 = 新任务损失 + λ × 旧任务重要参数的惩罚项
用公式表示:
L(θ)=Lnew(θ)+λ∑iFi(θi−θi∗)2 \mathcal{L}(\theta) = \mathcal{L}_{new}(\theta) + \lambda \sum_{i} F_i (\theta_i - \theta^*_i)^2 L(θ)=Lnew(θ)+λi∑Fi(θi−θi∗)2
- Lnew(θ)\mathcal{L}_{new}(\theta)Lnew(θ):新任务的损失(比如分类问题的交叉熵损失);
- FiF_iFi:Fisher信息矩阵(衡量参数θi\theta_iθi对旧任务的重要性,值越大说明参数越重要);
- θi∗\theta^*_iθi∗:旧任务训练后的参数值;
- λ\lambdaλ:平衡新旧任务的超参数(类似"弹性绳"的松紧度)。
Python代码示例(简化版EWC)
我们用MNIST数据集模拟"先学数字0-4,再学数字5-9"的增量学习过程,观察EWC如何防止遗忘。
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
# 定义简单的神经网络
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(784, 200)
self.fc2 = nn.Linear(200, 200)
self.fc3 = nn.Linear(200, 10)
def forward(self, x):
x = x.view(-1, 784)
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
# 计算Fisher信息矩阵(简化版)
def compute_fisher(model, dataloader):
fisher = {}
for n, p in model.named_parameters():
fisher[n] = torch.zeros_like(p.data)
model.eval()
for inputs, targets in dataloader:
model.zero_grad()
outputs = model(inputs)
loss = nn.CrossEntropyLoss()(outputs, targets)
loss.backward()
for n, p in model.named_parameters():
if p.grad is not None:
fisher[n] += p.grad.data ** 2 / len(dataloader)
return fisher
# 增量学习训练函数(含EWC)
def incremental_train(model, old_fisher, old_params, new_dataloader, epochs=5, lambda_ewc=1000):
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()
for epoch in range(epochs):
model.train()
for inputs, targets in new_dataloader:
optimizer.zero_grad()
outputs = model(inputs)
loss_new = criterion(outputs, targets)
# 计算EWC惩罚项
loss_ewc = 0
for n, p in model.named_parameters():
if n in old_fisher:
loss_ewc += (old_fisher[n] * (p - old_params[n])**2).sum()
loss = loss_new + lambda_ewc * loss_ewc
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")
# 主流程
if __name__ == "__main__":
# 准备数据:先学0-4,再学5-9
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_set_04 = datasets.MNIST('./data', train=True, download=True, transform=transform)
train_set_04.targets = train_set_04.targets % 5 # 只保留0-4
train_loader_04 = torch.utils.data.DataLoader(train_set_04, batch_size=64, shuffle=True)
# 阶段1:训练旧任务(0-4)
model = Net()
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()
for epoch in range(5):
for inputs, targets in train_loader_04:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
print("旧任务(0-4)训练完成")
# 保存旧参数和Fisher矩阵
old_params = {n: p.data.clone() for n, p in model.named_parameters()}
old_fisher = compute_fisher(model, train_loader_04)
# 准备新任务数据(5-9)
train_set_59 = datasets.MNIST('./data', train=True, download=True, transform=transform)
train_set_59.targets = (train_set_59.targets % 5) + 5 # 只保留5-9
train_loader_59 = torch.utils.data.DataLoader(train_set_59, batch_size=64, shuffle=True)
# 阶段2:增量学习新任务(5-9),使用EWC防止遗忘
incremental_train(model, old_fisher, old_params, train_loader_59, epochs=5, lambda_ewc=1000)
# 验证:旧任务(0-4)和新任务(5-9)的准确率
def test(model, dataloader, task_name):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for inputs, targets in dataloader:
outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)
total += targets.size(0)
correct += (predicted == targets).sum().item()
print(f"{task_name} 准确率: {100 * correct / total:.2f}%")
test(model, train_loader_04, "旧任务(0-4)") # 预期准确率保持较高(如90%+)
test(model, train_loader_59, "新任务(5-9)") # 新任务准确率也较高(如85%+)
代码解读
- 模型定义:简单的3层全连接网络,用于MNIST数字分类。
- Fisher矩阵计算:通过旧任务数据计算每个参数的重要性(FiF_iFi),重要参数会被"重点保护"。
- 增量训练:新任务的损失(
loss_new
)加上EWC惩罚项(loss_ewc
),防止模型大幅修改旧任务的重要参数。 - 验证测试:分别测试旧任务和新任务的准确率,观察是否发生灾难性遗忘(旧任务准确率大幅下降)。
数学模型和公式 & 详细讲解 & 举例说明
Fisher信息矩阵(FiF_iFi):参数重要性的"计分牌"
FiF_iFi衡量参数θi\theta_iθi对旧任务的重要性。想象学生考试后,老师统计"哪些知识点错误最多"——错误多的知识点(参数变化大)说明该知识点(参数)对成绩(旧任务准确率)影响大,需要重点复习(保护)。
用公式表示,FiF_iFi是对数似然函数的二阶导数期望:
Fi=E[(∂logp(y∣x,θ)∂θi)2] F_i = \mathbb{E}\left[ \left( \frac{\partial \log p(y|\mathbf{x},\theta)}{\partial \theta_i} \right)^2 \right] Fi=E[(∂θi∂logp(y∣x,θ))2]
- logp(y∣x,θ)\log p(y|\mathbf{x},\theta)logp(y∣x,θ):模型在数据(x,y)(\mathbf{x}, y)(x,y)上的对数似然(预测正确性的度量);
- 平方后取期望:衡量参数θi\theta_iθi的变化对预测结果的影响程度。
举例说明
假设旧任务是识别"猫"和"狗",模型有个参数θ耳朵\theta_{耳朵}θ耳朵控制"耳朵尖度"的判断。如果训练数据中,猫的耳朵尖度数据变化很大(模型需要频繁调整θ耳朵\theta_{耳朵}θ耳朵),那么F耳朵F_{耳朵}F耳朵的值会很大(这个参数对旧任务很重要)。当学习新任务(识别"兔子")时,EWC会限制θ耳朵\theta_{耳朵}θ耳朵的变化,防止模型忘记"猫和狗的耳朵特征"。
项目实战:智能客服的增量进化史
背景
某电商的智能客服系统,最初用"规则引擎+固定意图库"(比如用户说"退货",触发退货流程)。但用户提问越来越多样(如"买错了能换吗?““物流太慢想取消”),规则引擎无法覆盖,于是引入AI模型做意图识别(分类用户问题属于"退货”“查询物流”“咨询产品"等)。但传统模型是"一次性训练”,3个月后准确率从90%降到70%(用户提问方式变了)。
目标
将系统升级为AI原生应用,结合增量学习,实现:
- 从底层设计"数据→模型→功能"的闭环(AI驱动);
- 模型能边用边学,持续适应新提问方式。
开发环境搭建
- 语言:Python 3.8+
- 框架:PyTorch 1.9+(模型训练)、FastAPI(接口部署)
- 数据库:MongoDB(存储用户提问数据和模型版本)
- 工具:MLflow(模型生命周期管理)
源代码详细实现和代码解读
1. 数据采集与记忆库设计
AI原生应用的核心是"数据驱动",需要实时采集用户交互数据,并存储关键旧数据用于增量学习(防止遗忘)。
# 数据采集模块(用户每次提问后调用)
def log_user_query(user_id: str, query: str, predicted_intent: str, is_correct: bool):
"""
记录用户提问、模型预测结果及用户反馈(是否正确)
"""
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['smart_service']
collection = db['user_queries']
log = {
"user_id": user_id,
"query": query,
"predicted_intent": predicted_intent,
"is_correct": is_correct,
"timestamp": datetime.now()
}
collection.insert_one(log)
# 定期将高价值数据(如用户反馈错误的样本)加入记忆库
if not is_correct:
memory_collection = db['memory_pool']
memory_collection.insert_one(log)
2. 增量学习引擎(基于EWC)
模型每天凌晨用记忆库中的旧数据+昨日新数据训练,更新模型并验证。
# 增量学习训练函数(简化版)
def incremental_training():
from transformers import BertForSequenceClassification, AdamW
import torch
# 加载旧模型和参数
old_model = BertForSequenceClassification.from_pretrained('./old_model')
old_params = {n: p.data.clone() for n, p in old_model.named_parameters()}
# 计算旧任务的Fisher矩阵(假设旧任务是10类意图)
old_dataloader = load_memory_data() # 从记忆库加载旧数据
old_fisher = compute_fisher(old_model, old_dataloader)
# 加载新数据(昨日用户提问中反馈错误/未覆盖的样本)
new_dataloader = load_new_data()
# 初始化新模型(复制旧模型参数)
new_model = BertForSequenceClassification.from_pretrained('./old_model')
# 定义优化器(含EWC惩罚)
optimizer = AdamW(new_model.parameters(), lr=2e-5)
# 训练循环
for epoch in range(3):
for batch in new_dataloader:
inputs = {k: v.to('cuda') for k, v in batch.items()}
outputs = new_model(**inputs)
loss_new = outputs.loss
# 计算EWC惩罚项
loss_ewc = 0
for n, p in new_model.named_parameters():
if n in old_fisher:
loss_ewc += (old_fisher[n].to('cuda') * (p - old_params[n].to('cuda'))**2).sum()
total_loss = loss_new + 1000 * loss_ewc # λ=1000
total_loss.backward()
optimizer.step()
optimizer.zero_grad()
# 验证新旧任务准确率
old_acc = evaluate(old_model, old_dataloader)
new_acc = evaluate(new_model, new_dataloader)
if old_acc > 0.85 and new_acc > 0.8: # 设定阈值
new_model.save_pretrained('./new_model')
update_model_in_production('./new_model') # 部署新模型
3. 功能输出层:实时意图识别接口
用户提问时,调用最新模型预测意图,并触发对应流程。
# FastAPI接口示例
from fastapi import FastAPI
from transformers import pipeline
app = FastAPI()
# 加载最新模型
intent_classifier = pipeline("text-classification", model="./new_model", device=0)
@app.post("/predict_intent")
async def predict_intent(query: str):
result = intent_classifier(query)
intent = result[0]['label']
# 记录数据并触发业务流程(如跳转退货页面)
log_user_query(user_id="temp_user", query=query, predicted_intent=intent, is_correct=None)
return {"intent": intent}
代码解读与分析
- 数据采集:通过
log_user_query
函数,系统像"记笔记"一样记录用户的每一次交互,尤其是错误样本(高价值数据)。 - 增量训练:每天用旧数据(记忆库)和新数据训练,EWC惩罚项确保模型"不忘旧知识"。
- 实时预测:最新模型通过API提供服务,用户提问即时响应,形成"使用→反馈→学习→升级"的闭环。
实际应用场景
1. 智能推荐系统
传统推荐系统依赖"用户历史行为+人工规则",但用户兴趣会变化(如夏天买短袖,冬天买羽绒服)。AI原生+增量学习的推荐系统能:
- 实时学习用户新行为(如最近搜索"滑雪装备");
- 保留旧兴趣(如仍推荐用户常买的品牌);
- 最终推荐"符合当前场景+历史偏好"的商品。
2. 医疗诊断辅助
医生的诊断经验需要持续学习新病例。AI原生+增量学习的诊断模型能:
- 初始学习大量经典病例(如肺炎、流感);
- 后续学习罕见病例(如新型病毒感染);
- 同时保留对经典病例的判断能力(避免看到新病例就误诊旧疾病)。
3. 自动驾驶
路况千变万化(晴天→暴雨→雪天)。AI原生+增量学习的自动驾驶系统能:
- 先学习常规路况(直行、转弯);
- 遇到特殊路况(施工路段、突发事故)时,边处理边学习;
- 保留对常规路况的应对能力(不会因为学了新路况就忘记基本规则)。
工具和资源推荐
1. 增量学习框架
- Hugging Face TRL:支持对预训练模型进行增量微调(如LLM的持续学习)。
- ContinualAI:专注持续学习的开源库,提供EWC、Rehearsal等经典算法实现。
- PyTorch Lightning Bolts:包含增量学习的实用工具(如记忆库管理)。
2. AI原生应用开发工具
- LangChain:用于构建基于大语言模型的智能应用(天然支持数据反馈闭环)。
- TensorFlow Extended (TFX):端到端机器学习平台,支持从数据采集到模型部署的全流程(适合AI原生应用)。
- Weights & Biases:模型生命周期管理工具,方便跟踪增量学习中的模型性能变化。
3. 学习资源
- 论文《Overcoming Catastrophic Forgetting in Neural Networks》(EWC算法原论文)。
- 书籍《Continual Learning in Neural Systems》(持续学习领域经典教材)。
- 博客《AI-Native Applications: The Next Generation of Software》(Medium上的AI原生应用深度解读)。
未来发展趋势与挑战
趋势1:更轻量化的增量学习框架
当前增量学习需要较多计算资源(如存储记忆库、计算Fisher矩阵),未来可能出现"轻量化EWC"或"基于蒸馏的增量学习",让手机、IoT设备也能运行。
趋势2:多模态增量学习
现在增量学习多针对文本或图像,未来可能扩展到视频、语音、传感器数据等多模态(如智能汽车同时学习视觉路况和语音指令)。
趋势3:隐私保护的增量学习
结合联邦学习(数据不出本地),让模型在用户设备上增量学习,同时保护隐私(如医疗数据不上传云端)。
挑战1:灾难性遗忘未完全解决
现有算法(如EWC)在复杂任务(如大语言模型)中仍会遗忘,需要更高效的防遗忘机制。
挑战2:数据分布变化难应对
如果新数据与旧数据差异太大(如用户从"买女装"突然转向"买童装"),模型可能"学偏",需要更好的"数据分布检测"技术。
挑战3:计算资源限制
增量学习需要频繁训练,对服务器/设备的算力、存储要求高,需优化训练效率(如稀疏更新参数)。
总结:学到了什么?
核心概念回顾
- AI原生应用:从设计开始就以AI为核心的应用(不是"传统应用+AI补丁")。
- 增量学习:让模型边用边学,保留旧知识的技术(解决"越用越笨"问题)。
- 灾难性遗忘:模型学新忘旧的现象(增量学习的主要攻克目标)。
概念关系回顾
AI原生应用是"会成长的智能体",需要增量学习提供"持续成长的能量";增量学习是"边用边学的超能力",需要AI原生应用的架构支持(如数据闭环、模型管理)才能发挥作用。二者结合,让智能应用从"静态工具"进化为"动态成长的伙伴"。
思考题:动动小脑筋
- 你日常使用的APP中,哪些场景最需要"边用边学"的能力?(比如笔记APP能否学习你的打字习惯?)
- 如果让你设计一个"AI原生的健身APP",你会如何结合增量学习?(比如如何根据用户新的运动数据调整训练计划?)
- 灾难性遗忘在生活中也有类似现象,你能想到哪些例子?(比如学外语时,新单词记住了却忘了旧单词)
附录:常见问题与解答
Q:增量学习和在线学习有什么区别?
A:在线学习是"来一条数据就更新一次模型",容易学了新的忘旧的(灾难性遗忘);增量学习是在线学习的升级版,增加了防遗忘机制(如EWC、记忆库复习),能保留旧知识。
Q:AI原生应用和传统应用的主要差异是什么?
A:传统应用是"功能驱动"(先想需要什么功能,再实现),AI原生应用是"数据驱动"(先想需要什么数据,通过模型生成功能)。比如传统翻译APP的"收藏夹"是人工设计的功能,AI原生翻译APP的"个性化翻译偏好"是模型通过用户数据自动学习的。
Q:增量学习需要多少旧数据?
A:取决于任务复杂度。简单任务可能只需要少量关键旧数据(如MNIST的100个样本);复杂任务(如大语言模型)可能需要存储数千甚至数万旧样本(通过记忆库或生成旧数据的方式)。
扩展阅读 & 参考资料
- Kirkpatrick, J., et al. (2017). “Overcoming Catastrophic Forgetting in Neural Networks”. Proceedings of the National Academy of Sciences.
- Chen, X., & Liu, Z. (2018). “A Survey on Continual Learning”. arXiv preprint arXiv:1802.07569.
- 王峰. (2022). 《AI原生应用开发实践》. 机械工业出版社.
- Hugging Face官方文档:https://huggingface.co/docs
- ContinualAI官方仓库:https://github.com/ContinualAI/continual-learning-baselines
更多推荐
所有评论(0)