見出し画像

Core ML 3を使用したオンデバイストレーニング

以下の記事が面白かったので、ざっくり訳してみました。

On-device training with Core ML – part 1

0. はじめに

モバイルでの機械学習は年々人気が高まっています。WWDC 2019は、アプリに機械学習を追加するための機能がたくさん盛り込まれました。

最大の発表の1つは、「Core ML 3」がiPhone/iPadでのモデルの訓練をサポートするようになったことです。数年前、誰がモバイルデバイスでモデルを訓練すると思っていたでしょうか。

この一連の投稿では、オンデバイストレーニングについて詳しく説明します。「k-Nearest Neighbors」と「ディープニューラルネットワーク」を使用して、カスタマイズ可能な画像分類器を訓練する方法を説明します。

これは4部構成のシリーズの最初のものです。

・オンデバイストレーニングの概要
・じゃんけん
・k-Nearest Neighbors
・ニューラルネットワークの訓練

ソースコードはGitHubを参照してください。

1. 訓練の代わりのパーソナライズ

正直に言うと、「ディープラーニングモデルの訓練」は少し大げさ過ぎているかもしれません。Appleは一貫して、訓練ではなく「デバイス上のパーソナライゼーション」と呼んでいます。

これらの新しいAPIの目標は、既存のモデルをわずかに微調整するだけだからです。「転移学習」または「オンライン学習」の一種であると考えてください。
たとえば、「Face ID」はこの手法を利用して、携帯電話の所有者の顔を学習し、顔が時間とともに変化した時でもモデルを最新の状態に保ちます。重要なのは、全ての人にとって問題なく機能する汎用モデルから始め、次に各ユーザー向けにパーソナライズされたモデルを作成することです。これは、多くのユーザーデータに基づいて単一のモデルが更新される「Federated Learning」とは異なります。

「Federated Learning」は、分散型の訓練を「エッジで」行う手法です。集中型サーバーで訓練する代わりに、数千または数百万のユーザーのデバイスを使用して訓練します。
「Federated Learning」では、ユーザー自身のデータをプライベートに保ちながら訓練することもできますが、個々のユーザーごとにパーソナライズされたモデルは作成できません。全員のデータから少し学習し、それを1つの大きなモデルに結合します。

それに比べ「Core ML」のオンデバイスパーソナライゼーションでは、1つのベースラインモデルが、それぞれが1人のユーザーに合わせて調整されます。「Federated Learning」はおそらく「Core ML」モデルでも実行できますが、そのためのパイプラインは現在iOSにはありません。

2. Core ML vs. Create ML

混乱を避けるために先に言っておきますが、「オンデバイストレーニング」と「Create ML」はまったく関係ありません。

「Create ML」は、macOS用のAppleのモデル訓練ツールです。画像・音声・テキスト分類子などの単純なモデルをすばやく構築するのに最適です。他のAppleの訓練ツールである「Turi Create」と同様に、転移学習を採用して訓練時間を短縮します。

「Create ML」と「Core ML」は連携して動作するように設計されています。
訓練後、モデルを「Core ML形式」で直接保存できます。最初に変換ツールを実行する必要はありません。SwiftスクリプトまたはSwift PlayGroundからモデルを訓練できます。

ただし、「オンデバイストレーニング」ではこの「Create ML」をまったく使用しないことに注意してください。オンデバイスモデルのパーソナライズは、「Create ML」ではなく「Core ML」で行われます。

これは機能の重複のように見えるかもしれませんが、両方のフレームワークはわずかに異なる方法で訓練を行います。「Create ML」は、できるだけ多くのデータを使用してモデルのベースラインバージョンを構築するのに適していますが、「Core ML」のオンデバイスパーソナライゼーションは、比較的少ないユーザーデータを使用してモデルを微調整することを目的としています。

したがって、これらの訓練APIの使用方法に疑問がある場合は、正しいフレームワークのドキュメントを参照してください。

3. 最初に事前に訓練したモデルが必要です

モデルを微調整するには、事前に訓練したモデルが必要です。

訓練されていないモデルの重みは、ランダムに選択された数字で構成されています。このようなモデルに予測を要求すると、ランダムな推論が行われます。賢明な予測を得るには、最初にモデルを訓練する必要があります。

多くの場合、ユーザーは大枠では似つつも詳細は異なるデータを持っています。その場合、オンデバイスパーソナライゼーションを使用して、各ユーザーの特定の用途にモデルを適合させるのが理にかなっています。

これを可能にするには、一般的なデータで事前に訓練したモデルを提供する必要があります。これは、アプリと共に出荷されるベースラインモデルになります。その後、オンデバイストレーニングを使用して、このユーザーとそのデータに関する新しいことをモデルに学習させることができます。

学習データとして「写真」を取り上げます。ペットを認識してタグ付けするために、一般的な人や動物の画像で訓練されたベースラインモデルを提供して、はじめからペットの種類かを理解できるようにします。もちろん、ペットは同じ種類でも見た目は違います。そして、モデルはまだペットの名前を知りません。オンデバイストレーニングを使用して、個々のペットの名前を学習します。

携帯電話がペットの写真に関するすべてをゼロから学習することを期待するのはばかげているでしょう。多大な労力がかかるだけでなく、大量の訓練データも必要になります。既にトレーニング済みのモデルを開始点として使用し、個々のユーザーごとにわずかに変更する方がはるかに賢明です。

4. ゼロから訓練する必要はないのか?

各ユーザーのデータが完全に一意であれば、ゼロからの訓練は理にかなっています。他のユーザーのデータとは異なる必要があります。さらに、データは単純で(画像や音声ではなく)、比較的少量でなければなりません。

前のセクションで説明したように、多くのユーザーのデータに同様のパターンが含まれている場合、一般的なデータで事前に訓練したベースモデルを使用する方がよいでしょう。

ただし、各ユーザーのデータが十分に異なるため、モデルの事前訓練では何の助けにもならないとします。その場合は、ユーザーごとに一意のモデルをゼロから訓練する必要があります。

ここで私が話しているのは、「線形回帰」「ロジスティック回帰」、または「ツリーベース」のモデルです。これらの種類のモデルを適度な量の単純なベクトルデータで訓練すると、非常に高速になります。ただし、現在、「Core ML」ではそのようなモデルを訓練できません。これを行うには、独自のモデルをロールする必要があります。

しかし、ニューラルネットワークなどのモデルは、ハードウェア的にゼロから訓練することができません。理論上。モバイルデバイスは、何時間も最高速度で動作するようには構築されていません。電話はすぐに熱くなり、プロセッサを遅くするためにヒートスロットリングを開始します。さらに、バッテリーを急速に消耗させ、その間ユーザーは他のアプリを使用することができません。バックグラウンドで訓練することもできますが、私が知る限り、CPUを使用するだけで、GPUよりも約10倍遅いです。

おわかりのように、モバイル上でニューラルネットワークをゼロから訓練することはお勧めしません。

5. なぜデバイスで訓練するのか?

いくつかの理由から、デバイスで訓練を行うことをお勧めします。

各ユーザーの希望やニーズに合わせたモデルを作成できます。公平を期すために、これはクラウドでも実行できますが、高価なサーバーを実行し、ユーザーのデータをネットワーク経由で送信する必要があります。訓練はデバイス上で行われるため、ユーザーのデータはデバイスから離れる必要がなく、ユーザーのプライバシーを保護します。明らかに、これはすべてのML訓練に適したソリューションではありません。上で述べたように、大きなモデルをゼロから訓練するために使用することはありません。

このテクニックを使用する意味があるのは、デバイスでの少量の訓練でモデルを改善するのに十分な場合のみです。「より良い」とはユーザーごとに異なることを意味する場合があります。

6. オンデバイストレーニングには何が必要か?

前述したように、事前に訓練したモデルが必要です。これには通常、ある種のニューラルネットワークが含まれます。「k-Nearest Neighbors」(k-NN)の場合でも、通常、特徴抽出用のニューラルネットワークとk-NN分類器で構成されるパイプラインがあります。

事前に訓練したモデルは、更新を許可するように構成された通常の「Core ML mlmodel」ファイルです。

これには以下が含まれます。

・モデルは更新可能としてマークする
・モデルには、訓練用の学習データと根拠のある目標を提供する特別な訓練入力がある

ニューラルネットワークの場合、mlmodelには以下も含まれます。

・訓練が必要なレイヤーも更新可能とマークする
・損失関数(クロスエントロピーまたは平均二乗誤差)
・オプティマイザ(SGDまたはAdam)
・エポック数などのハイパーパラメータのデフォルト値

ニューラルネットワークが小さい場合を除き、すべてのレイヤーを訓練グ可能に設定することはできません。通常、訓練できるのは最後のレイヤーのみです。そうしないと、訓練に時間がかかりすぎます。

coremltoolsを使用してモデルを「Core ML形式」に変換する場合、respect_trainable引数をコンバーターに渡すと、モデルが自動的に更新可能になります。ただし、後で既存のmlmodelファイルにこれらの変更を加えることもできますが、少し手間がかかります。この方法については、このシリーズのパート3および4で説明します。

7. ラベルを忘れない

デバイス上でのパーソナライズのポイントは、ユーザー自身のデータでモデルを訓練することです。ただし、データだけでは十分ではありません。データが何を表しているのかを知る必要があります。そうでないと、モデルはデータから何も学習できません。

ここで話している種類の機械学習は、教師あり学習です。つまり、訓練の学習データに加えて、これらの学習データのラベルも必要になります。多くの場合、何らかの方法でラベルを提供する必要があるのはユーザーです。

たとえば、アプリはペットの見た目を検出し、登場する写真に自動的にタグを付けることを学習できます。ただし、最初にアプリにペットの名前(ラベルなど)を伝える必要があります。

8. Core ML 3での訓練の制限

現在、「Core ML」は次のモデルの訓練をサポートしています。

k-Nearest Neighbor
ニューラルネットワーク(分類、回帰)

パイプラインの一部である場合、これらのモデルを訓練することも可能ですが、それがパイプラインの最後のモデルである場合のみです。「線形回帰」や「決定木」などの他のモデルタイプは、「Core ML」で訓練できません。

ニューラルネットワークの場合、次のレイヤータイプのみを訓練できます。

畳み込み層
全結合層

他の多くのレイヤータイプを介した逆伝播はサポートされていますが、すべてではありません。サポートされていないレイヤーに続くレイヤーのみを訓練できますが、その前のレイヤーは訓練できません。

「Core ML」の将来のバージョンでは、他の多くのレイヤータイプも訓練できるようになると確信しています。重みはあるがまだ訓練できないレイヤータイプには、バッチノルム、埋め込み、バイアス、スケール、およびLSTMやGRUなどのRNNレイヤーが含まれます。これらを訓練したい場合は、来年まで待ってください。

「Core ML 3」は、損失関数の限られた選択肢を提供します。

カテゴリークロスエントロピー
平均二乗誤差(MSE)

複数の出力を持つモデルは、複数の損失関数を持つこともできます。たとえば、クラスラベルと境界ボックスの両方を予測するモデルでは、クラスラベル出力にクロスエントロピーを使用し、境界ボックスにMSEを使用します。ただし、現在、これらの損失を重み付けする方法がないため、一方が他方より多くカウントされます。また、独自の損失関数を定義する方法もありません。

現在、次のオプティマイザが利用可能です。

plain SGD
Adam

また、学習率、モーメンタム、ミニバッチサイズなど、これらのオプティマイザーハイパーパラメータをmlmodelファイルで定義します。ただし、実行時にこれら(の一部)をオーバーライドできます。

あなたが現在できない他のいくつかのことは次の通りです。

レイヤーを徐々にフリーズ解除
一般的な微調整戦略は、結果に満足するまで最後のレイヤーを訓練し、さらに多くのレイヤーをフリーズ解除し、それらも訓練することです。これは「Core ML」では不可能です。レイヤーは訓練可能かどうかのいずれかです。これはmlmodelファイルで定義されています。

すべての更新可能なレイヤーに使用される学習率は1つのみ
大したことではありませんが、より高度な訓練パッケージを使用すると、レイヤー(グループ)ごとに異なる学習率を使用できます。これにより、非常に小さな学習率でより一般的なレイヤーを更新し、より大きな学習率でタスクに固有のレイヤーを更新できます。

9. おわりに

「Core ML 3」は「TensorFlow」や「PyTorch」の代替品ではありません。しかし、これらの制限があっても、デバイスでの機械学習でできることのエキサイティングな新しい可能性を提供します。

この記事が気に入ったらサポートをしてみませんか?