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

Discover machine learning enhancements in Create ML

元の動画を見る

ハイライト

Create ML は iOS 17 と macOS Sonoma で多言語 BERT テキスト分類、Apple Neural Scene Analyzer 特徴抽出、マルチラベル画像分類器、SwiftUI result builders ベースのカスタムデータ拡張 API を導入し、開発者がより少ない訓練データでより正確な機械学習モデルを構築できるようになりました。


主要内容

課題:訓練済みモデルには大量のデータと専門知識が必要

ゼロから大規模モデルを訓練するには、数千時間、数百万のラベル付きファイル、ドメイン専門家の参加が必要です。一般の開発者にはこのコストを負担できません。

Apple の解決策は転移学習(transfer learning)です。事前訓練済みモデルを特徴抽出器として使い、開発者は少量のタスク固有の訓練データを提供するだけで、すぐに使えるモデルを得られます。WWDC23 ではこの方向で 3 つのことを行いました:

  1. テキスト分類:ELMo を BERT に置き換え、多言語対応で精度向上
  2. 画像理解:マルチラベル分類器を新規追加。1 枚の画像に複数のラベルを付与可能
  3. データ拡張:SwiftUI スタイルの result builders でカスタム拡張パイプラインを定義

詳細

BERT テキスト分類(01:06

Create ML アプリの Settings タブに BERT 埋め込みオプションが追加されました:

Model Parameters:
  Algorithm: Transfer Learning
  Embedding: BERT
Language: Automatic (または具体的な言語を指定)

キーポイント:

  • BERT モデルは数十億のラベル付きテキストで事前訓練されている
  • 多言語訓練データの混合に対応し、単一言語分類器の精度も向上
  • iOS 17、iPadOS 17、macOS Sonoma が必要
  • Create ML アプリで直接選択でき、追加設定は不要

Apple Neural Scene Analyzer 特徴抽出(02:21

画像分類器は最新版の Apple Neural Scene Analyzer を特徴抽出器として使用できるようになりました:

Model Parameters:
Feature Extractor: Apple Neural Scene Analyzer (最新バージョン)

キーポイント:

  • 出力埋め込みサイズが旧バージョンより小さい
  • 訓練速度が速く、精度も高い
  • メモリ使用量が低い
  • Photos アプリの検索など実際の機能で使用されている

マルチラベル画像分類器(03:17

従来の単一ラベル分類器は各画像に最適なラベルを 1 つだけ選択します。マルチラベル分類器は複数のラベルを同時に予測できます。

訓練データは 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 アプリで “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 アプリの 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. フォトアルバムアプリにスマートタグを追加する:マルチラベル画像分類器で写真に複数のタグを自動付与。価値:ユーザーの写真ライブラリには大量の未ラベル画像があり、手動タグ付けは現実的でない。マルチラベル分類器は「ビーチ」「夕日」「人物」など複数要素を同時に識別可能。始め方:数百枚のラベル付き写真を収集し、Create ML のマルチラベル分類器テンプレートで訓練、アルバムアプリに統合して新規写真に自動タグ付け

  2. 訓練データ不足をデータ拡張で解決する:訓練サンプルが数十枚しかない場合、カスタム拡張器で無限のバリエーションを生成。価値:医療画像や産業検査など多くの垂直領域ではラベル付きデータが極めて高価。拡張技術で少量サンプルから汎化能力の高いモデルを訓練可能。始め方:シーンに適した拡張パイプラインを定義(医療画像は反転に不向きだがコントラスト・明るさ調整は有効)、update メソッドで反復訓練

  3. 多言語カスタマーサービスチケット分類器を構築する:BERT 埋め込みで複数言語のチケットを処理する分類モデルを訓練。価値:多国籍企業のカスタマーサービスは多言語チケットを処理する必要があり、従来の方式では複数の単一言語モデルを維持する必要がある。BERT の多言語能力で 1 つのモデルが全言語をカバー。始め方:各言語のカスタマーサービスチケットサンプルを収集し、Create ML で BERT 埋め込みを選択して訓練、macOS サーバーにデプロイ

  4. インタラクティブ評価でモデルの盲点を発見する:Create ML アプリの Metrics タブで False Negatives を分析し、モデルが常に見落とすカテゴリを特定。価値:モデルは特定シーンで性能が低いが、開発者は具体的にどれか分からないことが多い。インタラクティブ評価で各誤分類画像を確認し、パターンを素早く特定可能。始め方:訓練後に Metrics タブへ移動し、False Negatives でソート、見落とし画像の共通特徴を確認し、ターゲットを絞った訓練データを追加


関連セッション

コメント

GitHub Issues · utterances