WWDC Quick Look 💓 By SwiftGGTeam
Discover machine learning enhancements in Create ML

Discover machine learning enhancements in Create ML

观看原视频

Highlight

Create ML 在 iOS 17 和 macOS Sonoma 中引入了多语言 BERT 文本分类、Apple Neural Scene Analyzer 特征提取、多标签图像分类器,以及基于 SwiftUI result builders 的自定义数据增强 API,让开发者用更少训练数据构建更准确的机器学习模型。


核心内容

问题:训练好的模型需要大量数据和专业知识

从零训练一个大规模模型需要数千小时、数百万标注文件,以及领域专家的参与。普通开发者很难承担这个成本。

Apple 的解决思路是迁移学习(transfer learning):用预训练模型作为特征提取器,开发者只需提供少量任务特定的训练数据,就能快速得到可用的模型。WWDC23 在这个方向上做了三件事:

  1. 文本分类:用 BERT 替换 ELMo,支持多语言且准确率更高
  2. 图像理解:新增多标签分类器,一张图片可以有多个标签
  3. 数据增强:用 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 builders
  • ApplyRandomly 以指定概率应用变换
  • 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:) 将异步序列分组为批次
  • 验证准确率下降意味着模型开始过拟合,应该停止训练
  • 早停可以防止模型记忆训练数据,提升泛化能力

核心启发

  1. 为相册 App 添加智能标签:用多标签图像分类器自动为照片添加多个标签。为什么值得做:用户照片库中有海量未标注图片,手动打标签不现实。多标签分类器可以同时识别”海滩”、“日落”、“人物”等多个元素。怎么开始:收集几百张标注好的照片,用 Create ML 的多标签分类器模板训练,集成到相册 App 中自动为新增照片打标签。

  2. 用数据增强解决训练数据不足:当你只有几十张训练样本时,用自定义增强器生成无限变体。为什么值得做:很多垂直领域(如医疗影像、工业质检)的标注数据极其昂贵。增强技术可以用少量样本训练出泛化能力强的模型。怎么开始:定义适合场景的增强流水线(如医学图像不适合翻转,但适合调整对比度和亮度),用 update 方法迭代训练。

  3. 构建多语言客服工单分类器:用 BERT 嵌入训练一个能处理多种语言的工单分类模型。为什么值得做:跨国企业的客服系统需要处理多语言工单,传统方案需要维护多个单语言模型。BERT 的多语言能力让一套模型覆盖所有语言。怎么开始:收集各语言的客服工单样本,用 Create ML 选择 BERT 嵌入训练分类器,部署到 macOS 服务器端处理。

  4. 用交互式评估发现模型盲点:在 Create ML app 的 Metrics 标签页中分析 False Negatives,找出模型总是漏掉的类别。为什么值得做:模型在某些场景下表现差,但开发者往往不知道具体是哪些。交互式评估让你看到每张误分类图片,快速定位问题。怎么开始:训练完成后进入 Metrics 标签页,按 False Negatives 排序,查看漏检图片的共性特征,针对性补充训练数据。


关联 Session

评论

GitHub Issues · utterances