ハイライト
iOS 17、iPadOS 17、macOS Sonoma では、Natural Language フレームワークに BERT(Bidirectional Encoder Representations from Transformers)ベースの多言語コンテキスト埋め込みモデルが導入され、27 言語・3 つの文字体系に対応しました。Create ML で多言語テキスト分類と単語タグ付けモデルを訓練でき、BERT 埋め込みを入力層として PyTorch や TensorFlow モデルに統合することもできます。
主要内容
課題:NLP モデル訓練における言語の壁
テキスト分類や単語タグ付けモデルを構築する際、開発者は現実的な問題に直面します。各言語ごとに個別の訓練が必要です。英語ユーザー向けに英語分類器を訓練しても、イタリア語やドイツ語ユーザーが増えると、データの再収集、再訓練、再デプロイが必要になります。
低リソース言語ではさらに困難です。ベトナム語やチェコ語をサポートしたくても、十分なラベル付きサンプルが見つかりません。従来の静的埋め込み(Word2Vec など)は単純な語からベクトルへのマッピングであり、言語間の類似性を活用できません。
Apple のアプローチ:多言語 BERT 埋め込み
BERT の核心は Transformer アーキテクチャのマルチヘッド自己注意機構(multi-headed self-attention)です。モデルがテキストの異なる部分に複数の方法で同時に注目し、文脈に応じて同じ語に異なるベクトルを生成します。「food」は “fast food joint” と “food for thought” で異なる埋め込みベクトルになります。
Apple は 3 つの多言語 BERT モデルを訓練しました:
- ラテン文字モデル:英語、フランス語、ドイツ語、イタリア語、スペイン語などをカバー
- キリル文字モデル:ロシア語、ウクライナ語などをカバー
- CJK モデル:中国語、日本語、韓国語をカバー
合計 27 言語に対応。言語間の類似性により、一つの言語の訓練データが他の言語にも役立ちます。これを言語横断的相乗効果と呼びます。
詳細
Create ML で多言語テキスト分類器を訓練する(06:54)
訓練データは JSON、ディレクトリ、CSV 形式で用意できます。JSON 形式の多言語訓練データの例:
[
{ "text": "Hey, want to grab lunch tomorrow?", "label": "personal" },
{ "text": "Ciao, vuoi pranzare domani?", "label": "personal" },
{ "text": "Meeting rescheduled to 3pm", "label": "business" },
{ "text": "La riunione è spostata alle 15", "label": "business" },
{ "text": "50% off all items this weekend!", "label": "commercial" },
{ "text": "¡50% de descuento este fin de semana!", "label": "commercial" }
]
キーポイント:
- 訓練データは複数言語を混在させられ、BERT 埋め込みが自動処理
- ラベルは感情、トピック、優先度など任意のカスタムカテゴリ
- JSON が最も柔軟。CSV とディレクトリ構造もサポート
Create ML アプリで BERT 埋め込みをアルゴリズムとして選択(08:03):
// Create ML app の Settings タブで選択:
// Algorithm: Transfer Learning
// Embedding: BERT
// Script: Latin (使用する言語に応じて選択)
キーポイント:
- BERT オプションは Create ML アプリのモデルパラメータに表示される
- 対応する文字体系(Latin、Cyrillic、CJK)を選択する必要がある
- 多言語訓練時は “automatic” を選択し、モデルに言語検出を任せる
- 従来の ELMo 埋め込みより訓練時間は長いが、精度は高い
NLContextualEmbedding API の使用(09:42)
Create ML 以外でも、Natural Language フレームワークで直接 BERT 埋め込みを操作できます:
import NaturalLanguage
// 英語に適した埋め込みモデルを探す
let embedding = NLContextualEmbedding(language: .english)
// モデルがダウンロード済みか確認
if !embedding.hasAvailableAssets {
try? embedding.requestAssets()
}
// モデルの属性を取得
let dimension = embedding.dimensionality
let identifier = embedding.modelIdentifier
// テキストに適用
let string = "food for thought"
let result = try? embedding.embeddingResult(for: string, language: .english)
// 各単語の埋め込みベクトルを走査
result?.enumerateTokens(in: string.startIndex..<string.endIndex) { vector, range in
print("Token: \(string[range])")
print("Vector dimension: \(vector.count)")
return true
}
キーポイント:
NLContextualEmbeddingは Natural Language フレームワークの新クラスlanguageパラメータでターゲット言語を指定し、フレームワークが対応する BERT モデルを自動選択hasAvailableAssetsでモデルリソースのダウンロード状況を確認。初回使用時はダウンロードが必要な場合があるrequestAssets()でダウンロードを事前にトリガーし、推論時の待ち時間を回避modelIdentifierは文字列で、訓練と推論で同じモデルを使用することを保証embeddingResultは各トークンのベクトルを含むNLContextualEmbeddingResultを返す
PyTorch/TensorFlow モデルへの BERT 埋め込みの利用(11:17)
BERT 埋め込みは汎用入力層として任意の訓練パイプラインに統合できます:
import NaturalLanguage
import CoreML
// ステップ 1: macOS 上でトレーニングデータの埋め込みベクトルを取得
let embedding = NLContextualEmbedding(language: .english)
try? embedding.requestAssets()
let trainingTexts = ["example text 1", "example text 2"]
var embeddings: [[Double]] = []
for text in trainingTexts {
let result = try? embedding.embeddingResult(for: text, language: .english)
var vector: [Double] = []
result?.enumerateTokens(in: text.startIndex..<text.endIndex) { v, _ in
vector.append(contentsOf: v.map { Double($0) })
return true
}
embeddings.append(vector)
}
// ステップ 2: 埋め込みベクトルを PyTorch/TensorFlow のトレーニングに渡す
// Python では:
// import torch
// x = torch.tensor(embeddings)
// model = YourCustomModel()
// output = model(x)
// ステップ 3: トレーニング済みモデルを Core ML に変換
// coremltools.convert() を使用
// ステップ 4: デバイス上で推論する際に、再度 NLContextualEmbedding で入力埋め込みを取得
// それを Core ML モデルに渡す
キーポイント:
- 訓練段階で macOS 上の
NLContextualEmbeddingを使って埋め込みベクトルを抽出 - ベクトルを NumPy/PyTorch テンソルとしてモデル訓練に渡す
- Core ML Tools で訓練済みモデルを
.mlpackageに変換 - 推論段階ではデバイス上で埋め込み抽出を繰り返し、同じ
modelIdentifierを使用して訓練と推論の一貫性を保つ - セッションでは BERT 埋め込みで Stable Diffusion をファインチューニングし、多言語テキストから画像生成を実現
重要ポイント
-
チャットアプリに多言語メッセージ自動分類を追加する:BERT 埋め込みで分類器を訓練し、ユーザーメッセージを個人、仕事、広告などに自動分類。価値:現代のチャットアプリは世界中のユーザーを持つが、従来の方式では言語ごとに個別モデルが必要。BERT の多言語能力で 1 つのモデルが 27 言語をカバー。始め方:各言語のメッセージサンプルを収集し、Create ML で BERT 埋め込みを選択して分類器を訓練、iOS 17 以降のデバイスにデプロイ
-
言語横断コンテンツモデレーションシステムを構築する:多言語 BERT 埋め込みで不適切コンテンツを検出。価値:コンテンツモデレーションは通常主要言語のみをカバーし、低リソース言語が盲点になる。BERT の言語横断的相乗効果により、小言語の訓練データが少なくても類似言語の知識を活用できる。始め方:英語と主要言語で不適切コンテンツサンプルをラベル付けし、BERT で分類器を訓練、未訓練言語への汎化能力をテスト
-
カスタム Core ML モデルに BERT 埋め込みを統合する:PyTorch でモデルを訓練しているなら、BERT 埋め込みを入力層として従来の語埋め込みに置き換える。価値:BERT の文脈認識能力は静的埋め込みを大きく上回り、曖昧なテキストでの性能が向上。始め方:macOS 上で
NLContextualEmbeddingを使って訓練データの埋め込みベクトルを抽出し、既存モデルの入力層を置き換え、訓練後に Core ML Tools で変換 -
デバイス上の多言語検索強化を実装する:BERT 埋め込みでアプリ内テキスト検索を改善。価値:従来のキーワードマッチングは意味的類似性を理解できない。BERT 埋め込みでは「自動車」と「車」がベクトル空間で近くなり、意味検索が可能。始め方:ドキュメントライブラリの BERT 埋め込みベクトルを事前計算し、検索時にクエリテキストの埋め込みを計算、コサイン類似度で結果をランク付け
関連セッション
- Discover machine learning enhancements in Create ML — Create ML の BERT テキスト分類とマルチラベル画像分類
- Improve Core ML integration with async prediction — Core ML の非同期予測 API でモデル推論の応答性を向上
- Use Core ML Tools for machine learning model compression — モデル圧縮技術で BERT モデルのサイズを削減
コメント
GitHub Issues · utterances