ハイライト
Create ML は iOS 17 と macOS Sonoma で多言語 BERT テキスト分類、Apple Neural Scene Analyzer 特徴抽出、マルチラベル画像分類器、SwiftUI result builders ベースのカスタムデータ拡張 API を導入し、開発者がより少ない訓練データでより正確な機械学習モデルを構築できるようになりました。
主要内容
課題:訓練済みモデルには大量のデータと専門知識が必要
ゼロから大規模モデルを訓練するには、数千時間、数百万のラベル付きファイル、ドメイン専門家の参加が必要です。一般の開発者にはこのコストを負担できません。
Apple の解決策は転移学習(transfer learning)です。事前訓練済みモデルを特徴抽出器として使い、開発者は少量のタスク固有の訓練データを提供するだけで、すぐに使えるモデルを得られます。WWDC23 ではこの方向で 3 つのことを行いました:
- テキスト分類:ELMo を BERT に置き換え、多言語対応で精度向上
- 画像理解:マルチラベル分類器を新規追加。1 枚の画像に複数のラベルを付与可能
- データ拡張: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:)は非同期シーケンスをバッチにグループ化- 検証精度の低下は過学習の兆候。訓練を停止すべき
- 早期停止はモデルが訓練データを記憶するのを防ぎ、汎化能力を向上
重要ポイント
-
フォトアルバムアプリにスマートタグを追加する:マルチラベル画像分類器で写真に複数のタグを自動付与。価値:ユーザーの写真ライブラリには大量の未ラベル画像があり、手動タグ付けは現実的でない。マルチラベル分類器は「ビーチ」「夕日」「人物」など複数要素を同時に識別可能。始め方:数百枚のラベル付き写真を収集し、Create ML のマルチラベル分類器テンプレートで訓練、アルバムアプリに統合して新規写真に自動タグ付け
-
訓練データ不足をデータ拡張で解決する:訓練サンプルが数十枚しかない場合、カスタム拡張器で無限のバリエーションを生成。価値:医療画像や産業検査など多くの垂直領域ではラベル付きデータが極めて高価。拡張技術で少量サンプルから汎化能力の高いモデルを訓練可能。始め方:シーンに適した拡張パイプラインを定義(医療画像は反転に不向きだがコントラスト・明るさ調整は有効)、
updateメソッドで反復訓練 -
多言語カスタマーサービスチケット分類器を構築する:BERT 埋め込みで複数言語のチケットを処理する分類モデルを訓練。価値:多国籍企業のカスタマーサービスは多言語チケットを処理する必要があり、従来の方式では複数の単一言語モデルを維持する必要がある。BERT の多言語能力で 1 つのモデルが全言語をカバー。始め方:各言語のカスタマーサービスチケットサンプルを収集し、Create ML で BERT 埋め込みを選択して訓練、macOS サーバーにデプロイ
-
インタラクティブ評価でモデルの盲点を発見する:Create ML アプリの Metrics タブで False Negatives を分析し、モデルが常に見落とすカテゴリを特定。価値:モデルは特定シーンで性能が低いが、開発者は具体的にどれか分からないことが多い。インタラクティブ評価で各誤分類画像を確認し、パターンを素早く特定可能。始め方:訓練後に Metrics タブへ移動し、False Negatives でソート、見落とし画像の共通特徴を確認し、ターゲットを絞った訓練データを追加
関連セッション
- Explore Natural Language multilingual models — BERT 多言語埋め込みの基盤原理と NLContextualEmbedding API
- Use Core ML Tools for machine learning model compression — 訓練済み Create ML モデルを圧縮してアプリサイズを削減
- Improve Core ML integration with async prediction — Core ML の非同期予測 API でモデル推論がメインスレッドをブロックしない
コメント
GitHub Issues · utterances