Highlight
Create ML 框架从 macOS 扩展到 iOS 15 和 iPadOS 15,开发者可以在用户设备上直接训练 Core ML 模型,实现自适应的个性化 App 体验,且用户数据始终不离开设备。
核心内容
从静态模型到动态学习
以前,App 里的机器学习模型是静态的。开发者用 Create ML app 在 Mac 上训练好模型,打包进 App,用户下载后模型就不会再变。这种方案有几个问题:模型无法适应每个用户的独特偏好;更新模型需要发新版 App;用户数据要上传到服务器才能训练,隐私有风险。
WWDC2021 把 Create ML 框架带到了 iOS 和 iPadOS。现在 App 可以直接在设备上训练模型,学习用户的行为和偏好,实时调整体验。数据始终留在本地,隐私得到保护。训练完成后直接用于推理,不需要部署模型到服务器。
支持的任务类型
Create ML on iOS 支持多种任务模板(02:27):
- 图像分类、风格迁移(Style Transfer)
- 文本分类
- 声音分类
- 表格数据分类与回归(Tabular Classifier / Regressor)
- 手部姿态与动作分类(Hand Pose / Action Classifier)
风格迁移:现场训练个性化滤镜
演讲者演示了一个照片滤镜 App。用户选择一张风格图片(比如孩子的涂鸦),App 在设备上训练一个风格迁移模型,然后立刻用这个模型处理照片(03:42)。
训练只需要一张风格图和一组内容图。用户可以提供自己的照片作为内容图,让模型学习如何把风格应用到这类照片上。训练参数包括风格强度、风格密度和迭代次数,可以根据效果调整。
表格回归:餐厅推荐系统
另一个例子是餐厅点餐 App(10:07)。App 收集三类信息:菜品内容(关键词、食材)、上下文(用餐时间)、用户行为(点了什么)。用这些信息训练一个线性回归模型,预测用户对每道菜的偏好分数。
模型训练只需要几次订单就能开始给出推荐。用户点午餐时,模型推荐适合午餐的菜品;点晚餐时,推荐适合晚餐的菜品。随着订单增多,推荐越来越精准。
详细内容
风格迁移模型训练代码
(07:58)
// 定义训练数据源:一张风格图 + 一组内容图
let data = MLStyleTransfer.DataSource.images(
styleImage: styleUrl,
contentDirectory: contentUrl
)
// 定义会话参数:指定 checkpoint 保存位置
let sessionParameters = MLTrainingSessionParameters(sessionDirectory: sessionUrl)
// 定义训练任务
let job = try MLStyleTransfer.train(
trainingData: data,
sessionParameters: sessionParameters
)
// 训练完成后保存模型
try model.write(to: writeToUrl)
// 编译模型供后续使用
let compiledURL = try MLModel.compileModel(at: writeToUrl)
let mlModel = try MLModel(contentsOf: compiledURL)
// 用训练好的模型做推理
let inputImage = try MLDictionaryFeatureProvider(dictionary: ["image": image])
let stylizedImage = try mlModel.prediction(from: inputImage)
关键点:
MLStyleTransfer.DataSource.images把风格图和内容图目录封装成数据源MLTrainingSessionParameters控制训练会话的行为,包括 checkpoint 保存路径MLStyleTransfer.train启动异步训练,返回一个可以监控进度的 job- 模型需要先
write再compileModel,编译后的.mlmodelc才能被MLModel加载 - 推理时使用
MLDictionaryFeatureProvider构造输入,键名"image"对应模型输入
表格回归模型训练代码
(13:39)
// 从菜品关键词和用餐时间生成特征
func featuresFromMealAndKeywords(meal: String, keywords: [String]) -> [String: Double] {
// 把关键词和用餐时间组合,捕捉内容与上下文的交互
let featureNames = keywords + keywords.map { meal + ":" + $0 }
// 每个特征值为 1.0,表示该特征存在
return featureNames.reduce(into: [:]) { features, name in
features[name] = 1.0
}
}
关键点:
- 特征工程的核心是把 “用餐时间:关键词” 作为组合特征,让模型学习 “午餐时喜欢披萨” 这种上下文相关的偏好
- 每个特征用 1.0 表示存在,这是稀疏特征的标准表示方式
(14:08)
var trainingKeywords: [[String: Double]] = []
var trainingTargets: [Double] = []
for item in userPurchasedItems {
// 正例:用户点了这道菜
trainingKeywords.append(
featuresFromMealAndKeywords(meal: item.meal, keywords: item.keywords)
)
trainingTargets.append(1.0)
// 负例:用户没点的其他关键词
let negativeKeywords = allKeywords.subtracting(item.keywords)
trainingKeywords.append(
featuresFromMealAndKeywords(meal: item.meal, keywords: Array(negativeKeywords))
)
trainingTargets.append(-1.0)
}
关键点:
- 必须同时提供正例和负例,模型才能学会区分喜欢和不喜欢的菜品
- 负例用
allKeywords.subtracting(item.keywords)生成,代表同一餐时用户没选择的其他关键词 - 目标值用 1.0 和 -1.0,让回归器输出可正可负的偏好分数
(14:37)
// 把数据封装成 DataFrame
var trainingData = DataFrame()
trainingData.append(column: Column(name: "keywords", contents: trainingKeywords))
trainingData.append(column: Column(name: "target", contents: trainingTargets))
// 训练线性回归模型
let model = try MLLinearRegressor(
trainingData: trainingData,
targetColumn: "target"
)
关键点:
DataFrame和Column是 Create ML 的数据结构,类似 pandas 的 DataFrameMLLinearRegressor是四种表格回归算法之一,适合这个场景因为特征稀疏且线性可分targetColumn指定要预测的目标列
(14:58)
// 构造待预测的输入数据
var inputData = DataFrame()
inputData.append(column: Column(name: "keywords", contents: dishKeywords))
// 调用模型预测
let predictions = try model.predictions(from: inputData)
关键点:
- 预测时构造的 DataFrame 列名必须与训练时一致
predictions返回每道菜的偏好分数,分数越高表示用户越可能喜欢
核心启发
1. 个性化照片滤镜 App
- 做什么:让用户用自己的照片或绘画作品训练专属滤镜,实时应用到相机拍摄的照片上
- 为什么值得做:风格迁移模型可以在几秒内完成训练,用户能立刻看到效果,体验极具个性化
- 怎么开始:用
MLStyleTransfer.train在设备上训练,参考代码中的MLStyleTransfer.DataSource.images构造数据源
2. 智能笔记分类助手
- 做什么:根据用户过去的分类习惯,自动为新笔记推荐标签和文件夹
- 为什么值得做:文本分类器可以在设备上训练,学习用户的个人分类模式,不需要把笔记内容上传到云端
- 怎么开始:用
MLTextClassifier训练,把用户的历史笔记作为训练数据,标签是用户之前手动设置的分类
3. 自适应音乐推荐
- 做什么:根据用户在不同时间、地点、活动状态下的听歌历史,预测当前场景下用户想听什么
- 为什么值得做:表格回归可以融合多种上下文特征(时间、地点、活动),给出比简单规则更精准的推荐
- 怎么开始:用
MLLinearRegressor或MLBoostedTreeRegressor,特征包括时间、地点、歌曲元数据,目标是用户是否完整播放了歌曲
4. 自定义手势控制游戏
- 做什么:让用户定义自己的手势来控制游戏角色或触发特效
- 为什么值得做:手部姿态分类器可以识别用户自定义的手势,结合 Vision 的手部关键点检测,实现零学习成本的操作方式
- 怎么开始:用 Create ML 训练
MLHandPoseClassifier,输入是 Vision 的VNHumanHandPoseObservation.keypointsMultiArray()
关联 Session
- Classify hand poses and actions with Create ML — 训练自定义手势分类模型,与 Create ML on-device 训练结合使用
- Tune your Core ML models — 了解 Core ML 模型优化,提升 on-device 模型的执行效率
- Detect people, faces, and poses using Vision — Vision 框架的人体分析能力,可与 Create ML 训练的分类器结合
- Build an Action Classifier with Create ML — WWDC20 的动作分类器 session,了解 Create ML 训练流程的基础
评论
GitHub Issues · utterances