Highlight
Create ML 在 iOS 17 和 macOS Sonoma 中引入了多语言 BERT 文本分类、Apple Neural Scene Analyzer 特征提取、多标签图像分类器,以及基于 SwiftUI result builders 的自定义数据增强 API,让开发者用更少训练数据构建更准确的机器学习模型。
核心内容
问题:训练好的模型需要大量数据和专业知识
从零训练一个大规模模型需要数千小时、数百万标注文件,以及领域专家的参与。普通开发者很难承担这个成本。
Apple 的解决思路是迁移学习(transfer learning):用预训练模型作为特征提取器,开发者只需提供少量任务特定的训练数据,就能快速得到可用的模型。WWDC23 在这个方向上做了三件事:
- 文本分类:用 BERT 替换 ELMo,支持多语言且准确率更高
- 图像理解:新增多标签分类器,一张图片可以有多个标签
- 数据增强:用 SwiftUI 风格的 result builders 定义自定义增强流水线
详细内容
BERT 文本分类(01:06)
Create ML app 的 Settings 标签页新增了 BERT 嵌入选项:
Model Parameters:
Algorithm: Transfer Learning
Embedding: BERT
Language: Automatic (或指定具体语言)
关键点:
- BERT 模型在数十亿标注文本上预训练
- 支持多语言训练数据混合,也提升单语言分类器准确率
- 需要 iOS 17、iPadOS 17 或 macOS Sonoma
- 在 Create ML app 中直接选择即可,无需额外配置
Apple Neural Scene Analyzer 特征提取(02:21)
图像分类器现在可以使用最新版本的 Apple Neural Scene Analyzer 作为特征提取器:
Model Parameters:
Feature Extractor: Apple Neural Scene Analyzer (最新版)
关键点:
- 输出嵌入尺寸比旧版本更小
- 训练速度更快,准确率更高
- 内存占用更低
- 在 Photos app 的搜索等功能中实际使用
多标签图像分类器(03:17)
传统单标签分类器只能为每张图片选一个最佳标签。多标签分类器可以同时预测多个标签。
训练数据用 JSON 格式标注(04:39):
[
{
"image": "succulent_001.jpg",
"annotations": ["Haworthia", "Jade", "Aloe", "window_sill"]
},
{
"image": "succulent_002.jpg",
"annotations": ["cactus", "person", "pot"]
},
{
"image": "succulent_003.jpg",
"annotations": ["Aloe"]
}
]
关键点:
- 每张图片标注为一个标签数组
- 可以混合单标签和多标签样本
- 在 Create ML app 中选择 “Multi-Label Image Classifier” 模板
训练完成后,用 Vision 框架进行推理(08:42):
import Vision
import CoreML
// 加载编译后的 Core ML 模型
let model = try! VNCoreMLModel(for: SucculentClassifier().model)
// 创建分类请求
let request = VNCoreMLRequest(model: model)
// 创建图像请求处理器
let handler = VNImageRequestHandler(url: imageURL)
// 执行请求
try? handler.perform([request])
// 获取分类结果
if let results = request.results as? [VNClassificationObservation] {
for observation in results {
// 过滤低于阈值的预测
if observation.confidence > 0.4 {
print("\(observation.identifier): \(observation.confidence)")
}
}
}
关键点:
VNCoreMLModel包装 Core ML 模型供 Vision 框架使用VNImageRequestHandler处理图像输入- 每个标签有独立的置信度阈值,在 Metrics 标签页中查看
- 过滤时用
confidence属性与对应标签的阈值比较
交互式模型评估(06:48)
Create ML app 的 Metrics 标签页提供了详细的评估数据:
- MAP Score(Mean Average Precision):整体模型质量指标,越高越好
- 每个标签的指标:False Positives、False Negatives、Precision、Recall、Confidence Threshold
- False Positives:模型预测了但实际不存在的标签
- False Negatives:实际存在但模型未预测的标签
关键点:
- MAP Score 同时考虑精确率和召回率
- 关注 Precision 和 Recall 低的类别,针对性补充训练数据
- Confidence Threshold 是每个标签的决策边界,预测置信度高于此阈值才认为存在
自定义数据增强 API(09:31)
Create ML Components 框架新增了基于 result builders 的增强 API:
import CreateMLComponents
// 定义增强器
struct MyAugmenter: Augmenter {
let backgrounds: [CIImage]
var body: some Augmenter<AnnotatedImage, AnnotatedImage> {
// 50% 概率水平翻转
ApplyRandomly(probability: 0.5) {
FlipHorizontally()
}
// 随机旋转 -15° 到 15°
ApplyRandomly(probability: 0.5) {
Rotate(
angle: UniformRandomFloatingPointParameter(
range: -15.0...15.0
)
)
}
// 随机裁剪
ApplyRandomly(probability: 0.5) {
Crop(ratio: 0.8...1.0)
}
// 自定义变换:随机背景
ApplyRandomly(probability: 0.3) {
RandomImageBackground(backgrounds: backgrounds)
}
}
}
// 自定义随机变换器
struct RandomImageBackground: RandomTransformer {
let backgrounds: [CIImage]
func applied(to input: AnnotatedImage, rng: inout RNG) -> AnnotatedImage {
// 随机选择背景
let background = backgrounds.randomElement(using: &rng)!
// 随机选择放置位置
let x = Int.random(in: 0..<background.extent.width, using: &rng)
let y = Int.random(in: 0..<background.extent.height, using: &rng)
// 将输入图像放置在背景上
var output = input
output.image = composite(input.image, onto: background, at: CGPoint(x: x, y: y))
return output
}
}
关键点:
Augmenter协议使用 SwiftUI 风格的 result buildersApplyRandomly以指定概率应用变换UniformRandomFloatingPointParameter生成随机参数- 每个变换按顺序应用:先翻转,再旋转,再裁剪,最后换背景
- 增强结果是
AsyncSequence,变换惰性执行 - 自定义变换器遵循
RandomTransformer协议,接收随机数生成器
用增强数据训练(14:17)
import CreateMLComponents
// 创建空模型
var classifier = ImageClassifier()
// 创建训练循环
for iteration in 0..<100 {
// 打乱并增强训练数据
let augmented = trainingData
.shuffled()
.applied(MyAugmenter(backgrounds: backgroundImages))
// 分批处理
for batch in augmented.batches(of: 16) {
try await classifier.update(batch)
}
// 计算验证准确率
let validationAccuracy = try await classifier.evaluation(
on: validationData
).classificationMetrics.accuracy
// 早停:如果 5 轮没有改善就停止
if !hasImproved(for: 5) {
break
}
}
关键点:
update方法适合增强训练,因为每轮数据都不同batches(of:)将异步序列分组为批次- 验证准确率下降意味着模型开始过拟合,应该停止训练
- 早停可以防止模型记忆训练数据,提升泛化能力
核心启发
-
为相册 App 添加智能标签:用多标签图像分类器自动为照片添加多个标签。为什么值得做:用户照片库中有海量未标注图片,手动打标签不现实。多标签分类器可以同时识别”海滩”、“日落”、“人物”等多个元素。怎么开始:收集几百张标注好的照片,用 Create ML 的多标签分类器模板训练,集成到相册 App 中自动为新增照片打标签。
-
用数据增强解决训练数据不足:当你只有几十张训练样本时,用自定义增强器生成无限变体。为什么值得做:很多垂直领域(如医疗影像、工业质检)的标注数据极其昂贵。增强技术可以用少量样本训练出泛化能力强的模型。怎么开始:定义适合场景的增强流水线(如医学图像不适合翻转,但适合调整对比度和亮度),用
update方法迭代训练。 -
构建多语言客服工单分类器:用 BERT 嵌入训练一个能处理多种语言的工单分类模型。为什么值得做:跨国企业的客服系统需要处理多语言工单,传统方案需要维护多个单语言模型。BERT 的多语言能力让一套模型覆盖所有语言。怎么开始:收集各语言的客服工单样本,用 Create ML 选择 BERT 嵌入训练分类器,部署到 macOS 服务器端处理。
-
用交互式评估发现模型盲点:在 Create ML app 的 Metrics 标签页中分析 False Negatives,找出模型总是漏掉的类别。为什么值得做:模型在某些场景下表现差,但开发者往往不知道具体是哪些。交互式评估让你看到每张误分类图片,快速定位问题。怎么开始:训练完成后进入 Metrics 标签页,按 False Negatives 排序,查看漏检图片的共性特征,针对性补充训练数据。
关联 Session
- Explore Natural Language multilingual models — BERT 多语言嵌入的底层原理和 NLContextualEmbedding API
- Use Core ML Tools for machine learning model compression — 压缩训练好的 Create ML 模型以减小 App 体积
- Improve Core ML integration with async prediction — Core ML 的异步预测 API,让模型推理不阻塞主线程
评论
GitHub Issues · utterances