ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Core ML 3フレームワーク
Core ML 3は、これまでオンデバイスの機械学習では利用できなかった高度なモデルタイプに新たに対応しています。このセッションでは、モデルのパーソナライズにより、Appをパーソナライズできる度合いを大きく広げる方法について説明します。モデルをリンクさせる方法や、既存のモデルのコンバージョンに使うCore MLツールの向上点について、より深く理解していただけます。
リソース
関連ビデオ
WWDC19
-
ダウンロード
(音楽)
(拍手)
私はマイケル・ブレナン Core MLに携わるエンジニアです 今回 皆さんにご紹介するのは Core ML 3です
Core MLは機械学習機能を 簡単に埋め込むことで 幅広いアプリケーション開発に 役立ちます その上で重要なのはモデルです
モデルはトレーニングライブラリから 入手可能で モデルを簡単に変換するツールも 提供されています
新しいCreate MLでは モデルの入手をさらに簡易化しました
このセッションで紹介するのは デバイス上の モデルのパーソナライズや ニューラルネットワークの 新しい機能などの複数のトピックです
まずはモデルのパーソナライズです
通常 モデルはアプリケーションに バンドルかダウンロードされています 一度 デバイスが完全に可変になると アプリケーション内でパフォーマンスを 頻繁に最適化します
モデルがアプリケーションと連携すると すべてのユーザに 同じサービスを提供できます
しかしユーザは千差万別です
アプリケーションのニーズや 使用方法はそれぞれ異なります そして それこそがチャンスです
自分専用にパーソナライズされた モデルがあったら?
このユーザでご説明します データ送付用の クラウドサービスを作成し そこにデータを蓄積します そのデータを元に 新しいモデルが作成され ユーザへ提供されます
これはデベロッパとユーザの 両者にとって課題が多い方法でした
デベロッパの課題は クラウドの作成による追加費用と 大量のデータ分析の 基盤作りと管理でした そして ユーザの課題は明らかに データを外部にさらすことでした それは誰も望まないでしょう クラウド内のデータは プライベートではありません
一方Core ML 3はデバイス上で パーソナライズが完結できます
(拍手) 標準的なモデルと ユーザによって生まれたデータ これだけでパーソナライズが可能です
データはデバイスから外へ 出ないので安全です Serverも不要なので 場所を選びません アップデートのためだけの ネットワーク環境も不要です
現在のモデルの内部を見てみましょう
現状では パラメータが大部分を占めています ニューラルネットワークの場合であれば いくつものレイヤ ライセンスや作者などの メタデータ インターフェイス これらがアプリケーション開発で 重要になるでしょう これはモデルの相互性を示しています
Core ML 3では パラメータを追加しています モデルのアップデート箇所と 内容を説明しています これが新しく加わった アップデートインターフェイスです
インターフェイスから すべての機能にアクセス可能です 大きなデータをカプセル化し 1つのモデルファイルに含めたのです
予測機能ではインプットに対して アウトプットを導き出します モデルを より学ばせることで より正確な新しいモデルを生み出します
Core ML 3では分類子や ニューラルネットワークの モデルのアップデートが可能です そのモデルの埋め込みを パイプライン共々行い― 両方をアップデートさせます
デモを使ってご説明しましょう ここからはアニルが説明します よろしく (拍手) どうも こんにちは モデルのパーソナライズを使い ユーザ向けカスタマイズを行います 教師向けの宿題採点アプリケーションに パーソナライズの機能を 追加しました まずは基本動作を紹介します デモスクリーンにします
今回使用するのは 採点アプリケーションです 生徒の宿題の写真を撮り スクリーン上で 採点を行うことができます 正解の場合のチェックと― 間違いの場合のバツ とてもシンプルな機能です PencilKitにより入力された採点を Core MLモデルが認識し変換します
今回 私が追加した機能は 生徒を励ますために活躍します シールです 生徒はご褒美のシールを 宿題に貼られるのが大好きです ですから 採点アプリケーションに シール機能があれば便利です シール機能は 上部のプラスボタンを押します
一覧の中から1つ選びましょう 適切な位置に移動させ サイズを調整します
できました もっと簡単な方法があれば ユーザも喜びます
いい案がありますか?
ユーザが使っているのは Apple Pencilだけです スクリーンの好きな場所に 素早く絵を描くのはどうでしょう アプリケーションが適切なシールと 置く場所を選択するのです
これこそ機械学習の分野です スライドに戻して説明します Core MLの利用者なら モデルを事前学習させ シールをアプリケーションに含めようと 考えるかもしれません 可能ですが 問題点もあります 1つ目はシールの豊富さです 事前学習では 膨大な学習データを必要とします しかし ユーザによっては 特定のシールしか使いません
2つ目は―
今後出てくる新しいシールへの 対応が難しいことです 改めて学習させたり アップデート版を作ったり ダウンロードをしたりする 必要がでてきます
3つ目は すべてのユーザにとって 事前学習はうまくいくのかという点です
ユーザによって 描く絵は様々です 100人に この顔の絵を 描いてもらったら 50以上の異なる絵になるでしょう 人によってイメージは異なります どう解決すればよいでしょう
アプリケーションがユーザに 絵の描き方を教えるべきでしょうか
それとも ユーザがアプリケーションを学習させ ユーザの絵を認識する能力を 高めるべきでしょうか それが モデルのパーソナライズです
ユーザから集めたデータを元に モデルのパーソナライズで ユーザに最適なモデルになるよう 学習させます その方法をお見せします
採点アプリケーションに戻ります 問題3は少し難しいですが 生徒は正解しています 図形の中には4つの 三角形が含まれています ここへシールを貼りたいと思います 前回とは違う方法です 見ていてください
アプリケーションは 絵を理解できませんでした 初めて描いた絵ですから当然です シールを貼るために ショートカットを作成します 前回と同じシールを選びます
アプリケーションは このシールを選ぶ場合の 絵のサンプルを求めています シールと全く同じ絵である 必要はありません ユーザにとって 選びたいシールと 絵に関連性があれば問題ありません 私の場合は星の絵にしてみます このシールを選びたい時の絵です
アプリケーションは 何パターンか求めてきます 数秒でショートカットが追加されました シールと私の絵が並んでいます もう1つ 追加してみましょう ハイタッチのシールはどうでしょう こちらです
どんな絵がいいでしょうか 簡単に描けるものがいいですね 数字の5にしてみましょう
数パターン描いて完了です 採点スクリーンに戻って シールを追加してみます
どうです? (拍手) シール画面へ移動して 選択する手間が省けます 次の問題も正解なので 小さい星も描いてみましょう 右上には大きな5を描いてみます どうです? (拍手) これは 簡単な一例です この機能を使えば可能性が広がります 最後に この機能の実装のために 必要な準備をお伝えします 最初に行うのは 更新可能なCore MLの インポートです Xcode内の見え方です
先ほどのようにモデルを パーソナライズする場合 近傍法が適切です
こちらは事前学習済み ニューラルネットワークの特徴抽出で 近傍法の予測分析の向上を 助けるものです モデルの詳細は 気にする必要がありません Core MLはモデルの詳細を APIの表面から取り込めるからです
予測にも使えます Xcodeにも引き続き 予測の インプットとアウトプットがあります
今回新しくなったのは アップデートの箇所です パーソナライゼーションに必要な インプットを設定します 必要なのは グレースケールの画像シールと それに連携する絵 実際に画面に展開されるシールです Core MLのAuto Generatedの クラスは 予測を助けるものでした 今回は新しいクラスを設け トレーニングデータを 反映することが可能です このクラスを見ると Xcodeの設定が 反映されています 絵とシールがありますね
モデルのパーソナライズに必要な トレーニングデータを ユーザから集めます パーソナライズ自体は 3つの簡単な手順です まず 更新可能な モデルURLを入手します 入手元はバンドルや 以前のモデルの スナップショットです
次にトレーニングデータを 指定フォーマットで用意します その方法は― 初めに評価されたクラスを使っても 独自に作成しても構いません そしてアップデートタスクを開始します
完了するとcompletionHandlerが 起動します 予測機能が使えるモデルに アップデートされました 簡単でしょう ぜひアプリケーションに 活用してください 次はマイケルから より高度なパーソナライズを 説明します どうも (拍手)
アニル ありがとう
アニルはモデルの基礎について 説明してくれました データはユーザ独自のものです 簡単な絵を描くだけで 適切なアウトプットを選びます 最初は簡単にはいきません 事前学習の ニューラルネットワークがあっても 分類情報が空では機能しません 答えが出ないのです
そこで情報を追加します 左側は先ほどのトレーニングデータです シールと手書きの絵ですね そこへk近傍法のベースモデルを アップデートタスクへ 追加します すると モデルが新しく変化します
トレーニングデータを元に より確実な予測をします 以前との違いは k近傍法のアップデートのみです
今回 新しく加わった アップデートプロセスを管理する― MLUpdateTaskを見てみましょう プロセスの状態を表すステートと タスクの再開とキャンセルの 機能があります
構成は モデルのベースURL 設定とトレーニングデータ
アニルが説明した completionHandlerも加わります アップデートされたタスク コンテキストを含みます 予測やクエリ情報を更新し アップデート後に モデルの書き出しを可能にします
コードはとても分かりやすいです MLUpdateTaskの構成に 必要なのはURL 設定 completionHandlerです 正解率を利用し ブロック範囲外のモデルは そのまま保存します 先ほどのデモのような便利な機能です 複雑なニューラルネットワークでは どうでしょう
ニューラルネットワークの基本は インプットと重みを含むレイヤの 集合体がアウトプットを生みます
アウトプットを調整するには レイヤの重みを調整する必要があります そのために レイヤをアップデート可能にすべきです
アウトプットが正解から 外れる可能性は? 正確なアウトプットに導かなければ 損失関数となります そこには差分があります そこで必要なのがオプティマイザです 正解ではないアウトプットを 正解に導くため調整を行います
Core ML 3には 畳み込みレイヤ 全結合レイヤの アップデートや バックプロパゲーション能力などの 機能があります クロスエントロピーと平均二乗誤差の 分類もサポートされます さらに確率的勾配降下法と Adamアルゴリズムも含みます
優秀です しかしニューラルネットワークには 他のパラメータもあります 学習率やepochなどです これらはすべてモデル内に カプセル化されるでしょう
ランタイムを 変更したい場合は―
アップデートされたパラメータの ディクショナリをオーバーライドします これらの値は modelConfigurationの中です MLParameterKeyで値を選択します 幅広い選択枠です
モデルにとって どの数値が最適か迷ったら Xcodeビューで パラメータ値を確認できます パラメータの詳しい値と 定義されたパラメータが確認できます
さらに高度なAPIの柔軟性を 求める人もいるでしょう その場合 MLUpdateTaskに MLUpdateProgressHandlerを 組み込みます 完了ハンドラなどの代わりに 特定のイベントを認識します トレーニングの始まりや 終了した際には プログレスハンドラが起動します そして更新されたコンテキストが 提供されます
さらに コールバックの 原因となるイベントや 重要な数値指標をご紹介します トレーニングロスのクエリに役立ちます
コードは簡単です MLUpdateProgressHandlerの構築 キーとなるイベント 起動するブロックを指定
そして完了ハンドラを提供します MLUpdateTaskでは完了ハンドラを 入力します
モデルのアップデート方法を ご紹介しましたが いつアップデートするのが 最適でしょうか? 先ほどの採点アプリケーションでは 絵を描いた後に反映されました 絵のデータが モデルに送られたのです 大量のデータ点がある場合は 最適ではありません 複雑なモデルの場合も同じです そこで活躍するのが バックグラウンドタスクです ランタイムを分配します アプリケーションやデバイスを 起動していなくても可能です BGTaskSchedulerを使い BGProcessingTaskRequestを 作成します アップデートと計算に 数分かかります 詳しくは… (拍手) 優秀です Advances in App Background Executionのセッションを ぜひご確認ください
また 更新可能モデルは トレーニングライブラリから変換すると 入手可能です 冒頭で言ったとおりです モデルを変換する場合 単に関連フラグをパスします すると モデルは希望する最適化に合う 学習可能パラメータを受け取ります それらをモデルに組み込みます あとは以前と同じ方法です
モデルを直接 修正することも可能です
オンデバイスの パーソナライゼーションを使い 各ユーザー向けのアプリが作成できます それは 柔軟な新しいAPIで 実現可能です クラウドは必要ありません この先は 私の代わりにアシームが ニューラルネットワークに追加された 機能を説明します (拍手)
Core MLに 多くの新機能が追加されました それを紹介する前に ニューラルネットワークの 基本的な話をします
ニューラルネットワークは タスク解決に適しています 画像やドキュメント 音声の内容を 理解しようとします これを活用した アプリケーションが多くあります
ニューラルネットワークの 構造を見てみると より分かりやすいでしょう ではやってみます ただし 研究開発者としてではなく 別の視点から見てみましょう プログラマの立場になってみます Core MLモデルの内部は 図式のようになっています さらに詳しく見てみると 図式はコードの代わりです 詳しく見てみましょう
誰でも理解できる 非常にシンプルなコードの一部です これを図式にしたのが右側です お分かりかもしれませんが コード内の動作を― 図式で表しました 文字のxyzも図に示されています ニューラルネットワークのコードは このような図式になります 先ほどの図に似ていますが 異なる点をいくつかご紹介します
一つ目は 先ほどの単純な数値変数ではなく いくつかの属性を有す 多次元変数を保持する点です 形状とランクという 属性が付随し― 多くの特徴を示しています 二つ目は 多次元変数にもたらす作用が 特別な数学関数になっている点です レイヤやオペレーションとも言われます
ニューラルネットワークを よく見てください
ニューラルネットワークは本質的に 図式あるいはプログラムです そしてそれは 大きな多次元変数と 複雑な数学関数を含みます つまり 高度な計算と 大量のデータを扱うプログラムです Core MLの利点は これらの複雑な機能を 一つのフォーマットに要約することです そのため プログラムを最適化し 効率よく実行してくれます
昨年発表したCore ML 2では 非環式グラフを使い 簡単に シンプルなコードを表示できました 約40種類のレイヤがありました これらを使うと 大半の畳み込みや回帰性構造を 表示できました では 今年の改善点は? 先ほどの基礎的な話からも 分かるように コードがさらに 複雑になり得ることは明白です 例えば 一般的に使われるのが スクリーンにあるような 枝分かれした図式です Core ML 3では ニューラルネットワーク内の― 枝分かれした同じ概念を 表示できるようになりました (拍手) もう一つの一般的な図式はループです Core MLネットワークでは よく使われます さらに複雑なコードの特徴と言えば 動的コードを書いている時に 頻繁に行うこと つまり ランタイムでのメモリの割り当てです このコードには メモリの割り当ては インプット次第と示されているので ランタイムの変更ができます 今年のCore MLで 同じ事をしましょう ダイナミックレイヤを使用し 図式のインプットを基盤にした マルチ配列の形状を変化させます Core MLグラフに なぜ複雑なコードを追加したか 疑問に思う人もいるでしょう 理由はシンプルです ニューラルネットワークの研究では さらに性能を高めるために 積極的にアイデアを 探求しているからです 実際 最新の ニューラルネットワークには 制御フローが埋め込まれています 研究者たちは 常に新しいオペレーションを 調査しています 今年は多くのレイヤを Core MLに追加しました 既存のレイヤを包括的にするだけでなく 基礎的な数学操作を追加しました 新しいレイヤは レイヤの観点から とても際だったものになっています (拍手)
制御フローや動的作用 新しいレイヤにより Core MLの機能は豊かになりました 多くの人気のアーキテクチャに適合し Core MLが活用できます スクリーンでは その一部をお見せしています ハイライトされているのは ここ数ヶ月で適合したもので 機械学習を強化しています もう気軽にCore MLを使用し アプリケーションに活用できますね すばらしいです (拍手) では 新しいCore MLを どのように使用するか これは昨年と変わりません 2つの方法があります Core MLはオープンソースの Protobufなので どのプログラミング言語でも モデルをプログラムできます それが1つ目の方法です しかし 多くの人は コンバータを希望するでしょう Core MLの指示で 自動的に変換してくれるためです この2つの点を詳しく説明しましょう
これはシンプルな ニューラルネットワークです 使用するのはCore MLツールで Protobuf仕様周辺の― シンプルなPythonのラッパーといい 容易に適合できるようになります アーキテクチャを理解している モデルなら このアプローチがお勧めです プレトレインされた重さがあるなら データ構造の配列もそろっています ニューラルネットワークは 場合によっては複雑なので コンバータの使用が望ましいでしょう コンバータはGitHubで入手可能です 機械学習フレームワークを ターゲットにしましょう Core ML 3の仕様は どのコンバータにも適合し 安定しています 過去に使用したコンバータでは エラーが表示された人もいるでしょう レイヤやレイヤの属性不足で 起こっていました その問題は アップデートによって解消されるので Core ML 3を存分に使用できます (拍手)
今まで説明ばかりでしたので 実際の動作をお見せします アレン お願いします (拍手) どうも
ありがとう アシーム 私はアレンです Core ML 3の機能を生かし 自然言語処理に 機械学習を取り入れた アプリケーションを紹介します
私は歴史書が好きです 面白い歴史の記事を読むと 浮かんだ疑問に対して 答えを知りたくなります しかしせっかちで 記事全部を読む気力がありません 代わりに 記事を確認してくれる アプリケーションを作り 答えを教えてもらえたら 便利ですよね そこで Core ML 3の新機能を使い アプリケーションを作りました
これがそうです これはNeXTという会社の 歴史の記事です とても長い記事なので すべてを読む時間はありません この会社について質問があります
最初の質問をしてみます
“NeXTの創設者は?”
“スティーブ・ジョブズ” (拍手) 正解のようです もう1つ試しましょう
“本社の場所は?”
“カリフォルニア州 レッドウッドシティ” (拍手) 近所ですね
もう1つは非常に関心のある質問です 試してみましょう
“エンジニアの給料は?”
“7万5000ドルまたは5万ドル” なるほど (拍手)
すごいですよね 次に―
アプリケーションの詳細を説明します
中心となるのは 最新の機械学習のモデル Transformerを用いた 双方向言語モデルです 通称 BERTモデルと呼ばれています BERTモデルとは何か これはニューラルネットワークであり 自然言語を理解し 複合型のタスクを実行します
中身はどうなっているでしょうか モジュールが並んでいます モジュールの中には 多くのレイヤがあります 見た目はむしろ複雑です しかし Core ML 3の新機能を使えば 簡単にアプリケーションに 組み込めます
まずはモデルの入手方法です モデルギャラリーのWebサイトから 入手可能です モデルを学習させ 変換することも可能です 私はテンサーフローを使い モデルに学習させました その時のワークスペースです 散らかっていてすみません 新しいCore MLコンバータを使うには Protobufフォーマットにモデルを エクスポートするだけです
これです あとは3行のPythonコードを 書くだけです TF Core ML converterを インポートし 変換関数を呼び出し MLモデルとして保存します
簡単にモデルを アプリケーションに取り込めました しかし 質疑応答に対応させるには もう少し手順が必要です 質疑応答のモデルには 質問文を準備し ワークトークンのように区切ります モデルは回答の場所を予測します デモでハイライトされていましたね
ここからアプリケーションを 組み立てます モデルだけでは アプリケーションは成り立ちません 他のフレームワークが持つ 多くの機能を利用し 組み立てます 例えばSpeech to Text APIを使い 声を文字に変換します 自然言語APIを使い 字句解析を行います 最後に AVFoundationの Text-to-Speech APIで 回答の音声を再生します すべてがデバイス上の 機械学習機能に付随します 起動にネットワークは 必要ありません (拍手) ありがとう これらを駆使すれば アプリケーションに 新しい可能性を生み出せます 以上です どうも (拍手)
アレン ありがとう
最後に 今年Core MLに追加された 3つの機能も紹介します とても便利に感じると思います 一つ目はこちらです
画面上には2つのモデルがあり 異なる動物の種を分類しています 中身を見ると 両方ともパイプラインモデルで 共通の特徴抽出を含んでいます とてもよく見かけるモデルの特徴です ディープニューラルネットワークを 訓練して機能を取得し それを他のニューラルネットワークに 取り込むのです
この方法ですと 同じモデルが 2つのパイプラインで起動します 効率が低いですね 効率を上げるため リンクモデルを使用します こちらです
アイデアは単純です リンクモデルは 並んでいるモデルの リファレンスです モデル間で一つのモデルを共有するのが 非常に簡単になります
さらに別視点でリンクモデルを見ると 共有ライブラリに接続しているような 動きをしています 保持するパラメータは 接続しているモデルの名前と 検索パスのみです 更新可能モデルや パイプラインを使う時に役立つでしょう 次の機能です
画像をインプットとして受け取る Core MLモデルがある場合 今までは CVPixelBufferの 形式にする必要がありました しかし 画像元が別のソースや 異なる形式の場合はどうなるでしょうか 大半の場合 Vision Frameworkを使えば VNCoreMLRequestクラスを介して Core MLを起動できます これには 多くの異なるフォーマットの 画像に対応するという利点があります 前処理や画像処理 トリミングなどもできます ただし 直接Core ML APIを 呼び出す場合もあります 例えば APIのアップデートを 起動しようとする場合などです そのような場合のために initializerメソッドを作りました ご覧ください URLやCG画像から 直接 画像を入手できます (拍手) Core MLでの画像が 使いやすくなります
最後の機能は MLModelConfigurationという クラスです Core MLモデルが実行できる デバイスに制約をかけます 例えばデフォルト値が“all”の場合 ニューラルエンジンを含む すべてのデバイスを指します このクラスには さらにいくつかのオプションがあります
一つ目はモデルが実行可能な 推奨するMetalデバイスを 指定できる機能です Core MLモデルをMacで使う場合 多くの異なるGPUがあるので 非常に役立つでしょう
蓄積精度を下げるオプションもあります モデルがGPUで学習している場合 float32ではなくfloat60で 蓄積します 最適な処理スピードを 保持してくれます 精度を下げた場合 必ずモデルが正確か確認してください モデルによっては 機能が低下する可能性もあります 設定を変えた場合は 常にテストをしてみましょう ぜひモデルに これらのオプションを試してください
このセッションでは 多くの事を話しました まずはパーソナライズについて Core MLモデルをデバイス上で アップデートすることで ユーザによるパーソナライズが 容易になります そして 多くの機能を プログラムに追加することで 最新のニューラルネットワークを アプリケーションに組み込めます 便利なAPIやGPUでのオプションも 紹介しました こちらは今回の内容に 関連するセッションです ありがとうございました (拍手)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。