ハイパーパラメータの調整は機械学習モデルの最適化に不可欠ですが、そのプロセスは計算コストが高く複雑になる場合があります。従来のグリッド最適化、ランダム探索、さらにはベイズ最適化手法では、ハイパーパラメータ空間の重要な領域が見逃され、最適化されていないモデルにつながることがよくあります。
この講演では、空間充填DOEを用いてハイパーパラメータ調整の課題に効率的にアプローチするJMPアドインを紹介します。空間充填DOEを用いることで、ハイパーパラメータの組み合わせがパラメータ空間全体にわたってより均等にサンプリングされるため、必要な評価回数が削減され、最適な設定を見つける可能性が高まります。
この講演では、JMP 18で改善されたPythonとの統合機能と、JMP内でDOEなどの機能を活用することでデータサイエンティストがどのようなメリットを得られるかについても解説します。高度な統計手法と実用的で使いやすいツールを組み合わせることで、多様なアプリケーションにおけるモデルのパフォーマンス向上を実現します。
こんにちは。講演にお越しいただきありがとうございます。今回の講演は、空間充填設計を用いたハイパーパラメータ調整による機械学習の改善についてです。私の名前はピーター・ハーシュ、共同講演者はスコット・アレンです。機械学習の改善に向けた私たちのアプローチを説明する前に、いくつかの結果を共有したいと思います。
2人の出場者が10個の予測モデルを構築するという課題を与えられました。これらの予測モデルはいずれもカテゴリカルな回答でした。2人の出場者の経歴を見てみると、片方のコーナーには世界的に有名なデータサイエンティスト、ラス・ウォルフィンガー氏がいますが、もう片方のコーナーにはそうではない人がいます。これは、私がマイケル・ジョーダンと1対1でバスケットボールをプレイするようなものです。非常に不均衡な結果になると思われるかもしれません。
ご覧の通り、結果は非常に僅差で、世界的に有名ではないデータサイエンティストの方が実際にはより良い結果を残しました。一体なぜこんなことが可能なのでしょうか?Torch Companionアドインこそが私の秘密兵器でした。このアドインは、私たち全員のモデリング結果を向上させるのに役立ちます。まるで1対1のバスケットボールの試合でレブロン・ジェームズをチームメイトに迎えたような気分です。
まず、とても簡単なクイズから始めましょう。この画像を見ると、猫に見えますか、それとも犬に見えますか?この画像はどうでしょうか?猫に見えますか、それとも犬に見えますか?とても簡単です。犬が左側にいて、猫が右側にいることは分かりますが、この画像が犬か猫かはどうやってわかるのでしょうか?重要な特徴は何でしょうか?もしモデルを構築するとしたら、そのモデルを猫か犬を識別できるようにどのようにトレーニングするのでしょうか?ニューラルネットワークの構築方法を視覚的に表した図があります。この場合、画像は手書きの4の数字で、各層のサイズが4ノードの3層に分割されています。
各ノードは元の入力を異なる方法で表現し、これらのノードとレイヤーを組み合わせることで予測を行います。データセットごとに複雑さのレベルは異なります。上の例を見ると、点が緑か赤かを識別するだけのモデルは、犬か猫の写真を見ている下の例よりもはるかに単純なモデルかもしれません。犬か猫の写真を見ている下の例の方が、はるかに複雑なモデルが必要になるかもしれません。レイヤーの数とレイヤーサイズ、あるいはレイヤーあたりのノード数はハイパーパラメータと呼ばれ、各モデルを最適化するために調整する必要があります。
様々な問題に対処するために、モデルをどのように調整すればよいでしょうか? ここはJMP内のTorchチューニングアドインの起動ウィンドウです。様々なオプションがあります。エポック、学習率、層のサイズ、活性化関数など、様々な項目を設定できます。これらのオプションを全て使えば、何百万通りもの組み合わせを実行できます。どこから始めればいいのでしょうか?
ハイパーパラメータ空間を探索する際には、いくつかの選択肢があります。まず1つ目はグリッドサーチです。これは最も一般的で、完全実施要因計画に最も関連していると思います。これを検討すると、すべての因子のあらゆる組み合わせを検討することになり、250万通り以上の異なるモデルを実行する必要が生じます。ほとんどの場合、これは多すぎます。また、特定の因子の組み合わせをランダムに選択して実行するランダムサーチを行うこともできます。
ベイズ最適化のアプローチも考えられますし、ラス・ウォルフィンガー氏に依頼するという方法もあります。ラス氏をスピードダイヤルに登録していたり、ラス氏に似たデータサイエンティストが他にいればなおさら良いのですが、必ずしもそうとは限りません。私やスコット氏、あるいは普通の実験家は、この問題をどのように解決できるでしょうか?私たちはこれを実験のように扱います。JMPではどのように実験を行うのでしょうか?因子ごとに行うのでしょうか?いいえ、ドレイク氏はそれは良い考えではないと考えています。おそらく実験を設計するべきでしょう。このアプローチの仕組みについて少しお話しした後、スコット氏にバトンタッチします。
ピーターさん、ありがとうございます。ここでは、このTorch Companionがどのような機能で構成されているのかを簡単に説明し、いくつか例を挙げて、アドインの使い方を少し見ていきます。その前に、このアドインに何が含まれているのか少し説明させてください。
このアドインは、JMPの様々な機能、例えば表関数、DOEプラットフォーム、Russと彼のチームが開発したTorchディープラーニングアドイン、そしてグラフビルダーの出力などを統合するものです。このアドインでは、これらの機能はすべて個別に実行することも可能ですが、このアドインの目的はシームレスなワークフローを実現することです。このアドインの操作方法は、多くのJMPプラットフォームと同様に、ユーザーが応答、因子、検証となる列を指定します。次に、Torchパラメータ、この場合はパラメータの範囲、あるいは様々なオプションを選択し、それをTorchアドインに渡します。これらのインターフェースのいくつかを簡単に見ていきましょう。
列ダイアログは、標準的なJMPプラットフォームで表示されるものと非常によく似ており、ここで応答、因子、検証列を読み込みます。因子は数値、文字、あるいはこの場合は画像モデルにすることができます。TorchアドインがJMPにもたらすユニークな機能の一つは、画像モデルを参照できる機能だと思いますので、このアドインにもこの機能を組み込みました。「OK」をクリックすると、仕様ウィンドウが表示されます。Russと少し作業を行い、最適なモデルに近づくためにどのようなパラメータをスクリーニングすればよいか、このダイアログにどのような情報を含めるべきかについてアドバイスを得ました。
ここでの目標は、Torch Companion を Torch Deep Learning Add-in と組み合わせて使用することです。調整が必要な様々なパラメータをすべて網羅しているわけではありませんが、実際には、これにより最適なモデルに近づき、より効率的に作業を進めることができます。モデル、表形式モデルの種類、画像モデルの種類など、いくつかのパラメータを調整できます。また、モデル構造のパラメータオプション、特に DOE 試行回数を確認することもできます。このように設定することで、一度に 1 つのモデル、つまり 1 つの要素ずつ実行するのではなく、パラメータの範囲を設定するだけで、ワンクリックで 200 または 300 のモデルを確認できるようになります。
いくつかのオプションがグレー表示になっていることにお気づきでしょうか。このアドインをTorchや機械学習全般を初めて使う人でも簡単に使えるようにしたかったので、ここにいくつかのガードレールを組み込みました。Peterも、このガードレールのいくつかを気に入ってくれたと思います。
ええ、確かに軌道に乗るために必要でした。助かりました。
これらの様々なモデルに馴染みのない方のために、最も一般的なモデルと、適切な出発点となるモデルをいくつか事前に選択しておきます。このアドインを使ってパラメータをスクリーニングしたい場合は、「パラメータをスクリーニング」チェックボックスをオンにすると、様々なパラメータを確認できるようになります。ここでも、データテーブルの内容によっては最適ではない可能性のあるオプションがグレー表示されます。また、一般的な活性化関数をいくつか選択し、これらのパラメータの一部を2の倍数または2の累乗でスケーリングするように設定しています。これにより、例えばレイヤーサイズなど、非常に幅広い範囲のスクリーニングをより効率的に行うことができます。
ここでは高度なオプションもいくつか用意しておきたいと思います。高度なオプションを選択すると、Torchアドインで利用可能な様々なモデルタイプ、様々な表形式モデルタイプ、そして利用可能な様々な活性化関数にアクセスできるようになります。Torchディープラーニングの知識レベルに応じて、シンプルなルートを選択することも、高度なルートを選択することもできます。これがどのように機能するか、例を見てみましょう。この例では、エポックと学習率の範囲など、いくつかのオプションが事前にロードされています。レイヤーサイズをいくつか選択し、これを100に設定しました。試行回数は必要に応じて増やしたり減らしたりできます。
すべてのパラメータ範囲を設定したら、「実行」をクリックします。「実行」をクリックすると、アドインの裏側が開きます。「実行」をクリックすると、テーブル操作を行った後、空間充填図が作成されます。そして、空間充填設計テーブルの各行がTorch Deep Learningに渡されます。実は、講演を始める前にモデルを作成し、500個のTorchモデルを実行するように設定しました。講演中も順調に進んでいるのが分かります。空間充填設計の各行を順に処理し、エポックごとの損失関数の推移を少し示しています。これは、適切なパラメータを選択したことを示すものです。講演はこのまま続け、数分後に改めて確認します。
Torchディープラーニングアドインが実行され、数百、数十、あるいは指定した数のモデルがすべて完成すると、追加のテーブル関数とグラフビルダーを使用して結果が要約され、出力またはレポートウィンドウが表示され、結果を解釈できます。この解釈に基づいて、2つの異なるパスが存在します。1つはパラメータ指定に戻るパスです。満足のいくモデルが得られなかったのかもしれません。あるいは、改善の余地があると思われるかもしれません。
新しいパラメータ範囲を設定し、異なる関数を選択して、サイクルを再開すると、新しい結果が元の結果に追加されます。あるいは、非常に優れていて自信があり、これ以上改良する必要がないモデルが見つかった場合は、それらをTorch Deep Learningアドインに直接渡して、モデルをさらに改良したり、比較して保存してデプロイしたり、コンパニオンでは調整できないパラメータを調整したりすることができます。これが私たちが作成したワークフローです。これをまとめるのは楽しかったのですが、モデル構築のほとんどの重労働を担ったのはPeterでした。Peter、このアドインの使用経験についてお話しいただけますか。
ここにソフトウェア開発者の方がいらっしゃいましたら、スコットがアドインの開発者で、私がテスターだったとお考えいただければと思います。いくつか思い浮かんだことがあります。これはDOE(実験計画法)です。DOEは多くの場合、単一のDOEを実行し、そのDOEから学習し、その上で最適なDOEを構築するという反復的なプロセスです。いくつかのモデルから得た結果を見ると、ほとんどの場合、複数のDOEを実行していることがわかります。多くの場合、これらのモデルは数秒で非常に速く実行されるため、非常に多くのモデルを実行できます。しかし、場合によってははるかに時間がかかり、複数のDOEを実行しなければならないこともあります。最初から100個も実行したくないでしょう。例えば、一番上のモデルは画像モデルで、各モデルの実行に約10分かかりました。
200個のモデルから始めると、週末まで待つことになるでしょう。その後、他のモデルをいくつか見てみると、それぞれ4秒しかかからない200個のモデルを実行する方が少しはマシかもしれません。この点についていくつかアドバイスがあります。私は最初はホールドアウトクロスバリデーションセットを使うのが好きです。Kフォールドを使うよりもはるかに速いからです。実際に試してみて、Kフォールドが気に入ったら、Torchで起動して検証列を切り替えることができますが、チューニングには、その検証セットを使うのが良いと思います。
また、スコットが組み込んだ時間チェック機能も気に入っています。画像モデルのように、モデルに長い時間がかかるのではないかと心配な場合は、チューニングアドインでチェックすることができます。
よかった。ありがとう、ピーター。Rustを除けば、JMPではおそらく誰よりも多くのトーチモデルを構築してきたのではないでしょうか。
間違いなく最もパフォーマンスが悪いもの。
話題を変えてアドインに入り、いくつかのレポートと、これらのモデルをどのようにスクリーニングし最適化できるかを見てみましょう。モデルを確認してみましょう。まだ完了ではありません。指定した500個のうち、270個ほどが取得できました。
これに組み込んだもう一つの機能は、キャンセル機能です。キャンセルする理由は様々ですが、例えば予想よりも時間がかかっている場合や、時間が足りない場合など、様々な理由が考えられます。いずれにしても、キャンセル可能です。トーチエラーを受け入れると、次回の実行を続行するか、あるいは次回の実行を続行するかを選択できます。例えば、画像モデルを実行している場合、全ては比較的速く実行されているものの、1つだけ非常に長い時間がかかるような場合などです。
DOEをそのまま続行して、基本的にはスキップして次のDOEに進むか、DOEの実行を完全に停止するかを選択できます。ここではその手順を説明します。DOEを停止してレポートを作成し、レポートウィンドウがここに表示されます。これがレポートウィンドウです。DOEには500件のデータが入っていますが、そのうち270件の結果が表示されています。
では、この結果表を見てみましょう。ここから始めるにあたって、最も重要な要素をいくつか見ていきましょう。まずは要約統計量です。表は検証R二乗に基づいて整理されており、検証R二乗が高いほど行番号は小さくなります。次に、様々なパラメータ設定、様々な入力、そしてモデルの実行にかかった時間やこれまでに実行されたDOEの数などの出力にアクセスできます。
最初に確認できる診断ツールは、R二乗ヒートマップです。これは、検証R二乗とトレーニングR二乗をプロットしただけです。検証とトレーニングの両方で高いR二乗値を持つモデルが望ましいのですが、ここではR二乗値に幅があることがわかります。Torchや機械学習を初めて使う方にとって、これは重要な考慮事項だと思います。パラメータを設定する際に、どのようなパラメータを設定すればよいか分からなければ、モデルがこのような結果になってしまう可能性があります。「良いモデルを構築できるはずがない」と思うかもしれません。
その後、いくつかのパラメータを調整すると、もしかしたら悪化するかもしれません。複数のパラメータをスクリーニングすることで、そのモデルで何ができるのかをよりよく理解できるようになります。この例では、検証とトレーニングで高い決定係数を持つ非常に優れたモデルがいくつかあることがわかります。データフィルターもいくつか組み込まれていますが、これらはすべてグラフビルダー内なので、このデータを取得して好きなようにグラフ化できます。また、個々のパラメータを確認できるタブが2つあります。学習率やエポックなどのモデル調整パラメータと、それらの経時的またはモデル空間での傾向、そして活性化関数やその他のレイヤー構造パラメータです。
ここで考慮すべき点の一つは、様々な種類の活性化関数をスキャンすることです。ピーター、これらのモデルを実行した際に、興味深い結果に出会ったと聞いています。
まさにその通りです。このアドインの開発を始めた頃、Russは単一の活性化関数を検討し、ReLUを使うことを勧めてくれました。ReLUは最も一般的で、誰もが使っているものです。良い出発点になるでしょう。ReLUがうまく機能するケースもありましたが、ほとんどの場合、他の活性化関数の方が少し優れていることがわかりました。Russのアプローチが優れているわけではないのですが、これらすべての活性化関数を検討し、その活性化関数を微調整することで少しでも良い結果が得られるかどうかを確認できたのは良かったです。
いいえ。確かに、ここの意図の一つは、これらの活性化関数について知らない場合、あるいは知っている場合でも、データセットやモデルの種類、あるいは経験に基づいて、どの関数が適切かがわかるかもしれないということです。もしわからない場合は、このツールが全ての関数をスキャンするのに役立ちます。今回は6つの関数をスキャンしましたが、他にも20個の関数があるので、確認してみてください。
パラメータ重要度の出力もあります。これは、簡単なブートストラップフォレストモデルを構築して、どのハイパーパラメータまたはチューニングパラメータがレスポンス(この場合はR-squared検証)に影響を与えるのに最も重要かを確認しているだけです。また、個々のモデルの詳細も表示されています。結果テーブルには、一意のモデルIDを示す列がありますので、これらのモデルのいずれかを詳細に調べたい場合は、その列を開くだけです。これはTorchの実行中にエクスポートされたものなので、検証セットのR-squaredに基づいてすべてを要約している場合でも、引き続きアクセスできます。すべてのモデルの要約統計がすべて利用可能です。
レポートウィンドウに表示したかったことはこれでほぼ網羅できたと思います。最後に、このアドインでできることをいくつかワークフローオプションを使ってまとめてみました。まずは再実行です。今回のケースでは、いくつかのモデルに満足しているかもしれませんが、使用されている活性化関数を確認し、レイヤー数やレイヤーサイズを増やしたい場合など、仕様に戻って特定の関数を絞り込むことができます。
おそらく、これら3つだけを確認したいかもしれませんが、もっと大きなレイヤーサイズを確認したい場合もあるでしょう。その場合、例えば50個だけを確認したいと指定し、「実行」をクリックして、選択した一連のパラメータだけを実行し、さらに50個実行して、その結果をテーブルに追加します。これは検討すべきワークフローオプションの一つです。もう一つは、赤い三角形で囲まれたオプションです。このモデル、あるいはこれら2つのモデルで満足のいく結果が得られた場合は、Torchアドインに取り込んで直接実行したい場合もあるでしょう。
それぞれのパラメータ設定を何度も確認して覚えておき、Torchアドインに入力する必要はありません。赤い三角形の「選択したパラメータを実行」をクリックするだけです。「選択したパラメータを実行」をクリックすると、パラメータが取得され、Torchアドインに渡されて実行されます。そして、ネイティブのTorchアドインでレポートが生成されます。これで、各モデルの比較が可能になります。適切なパラメータをすべて渡したので、より直接的に、おそらく最も適合度の高いモデルを比較し、要約統計量についてもより明確な指標を得ることができます。
最後に、実行に時間のかかるモデルがあるかもしれません。その場合、1日ですべてのチューニングを完了するのは難しいかもしれません。これを保存して後で戻ってきたい場合は、赤い三角をクリックして、結果のデータテーブルを保存します。保存したら、任意の場所に保存して、後で再読み込みできます。ここでは、その仕組みを説明します。
これを閉じて「OK」をクリックします。保存したデータテーブルを再読み込みしたい場合は、元のデータテーブルに戻ります。これはモデリングに使用していたデータテーブルです。アドイン(コンパニオン)を実行し、「Recall(呼び出し)」をクリックします。チューニング時に指定した列と同じ列を入力していることを確認し、「OK」をクリックします。ここで様々なパラメータを指定する代わりに、「load(読み込み)」ボタンを使用します。これはまだ表示されていませんでした。
では、ここをクリックしてチューニング結果を開き、「開く」をクリックします。ダイアログウィンドウが表示され、「はい、x変数、y変数、検証列は同じです」と表示されます。これらのいずれかが最初に実行したものと一致しない場合は、読み込まれません。「OK」をクリックすると、以前のチューニング実行が表示され、すべてのグラフが再生成されます。仕様に戻って、再度実行を開始できます。
お見せしたかったのはこれで全部だと思います。Torchアドインには他にもいくつかオプションがあり、Russと彼のチームが開発したTorchディープラーニングアドインと合わせて使っていただきたいです。使い始めると、他にも便利な機能がいくつか見つかると思います。さて、それではPeterにバトンタッチして、結果の一部、あるいは最終結果について少しお話ししましょう。
いいですね。スコット、ありがとう。ここで赤字で示されているのは、私が自分のモデルで得た検証R2乗の結果で、青字で示されているのはラスが彼のモデルで得た結果です。これはラスを批判しているわけではありません。ラスは優れたデータサイエンティストですが、これはむしろ、因子を一つずつ使うよりもDOEを使うことの威力を示すための宣伝だと思います。
これは、化学者とデータサイエンティストにモデルを実行させる場合、DOEを使用すれば、化学者は優秀なデータサイエンティストと同等の成果を上げられる、あるいはそれ以上の成果を上げられる可能性があることを示しています。チューニングアドインは、誰もがその能力を得られるようにします。スコットが言ったように、これはTorchアドインに取って代わるものではなく、Torchアドインと連携して機能し、マーケットプレイスで入手可能になります。どちらも入手可能です。
ラスに勝ったことで、オリンピックのメダルを自分に贈りました。誰にとっても、そしてデータサイエンスのバックグラウンドを持たない人にとっても、これはかなり良い結果だと思うからです。猫と犬の識別について話し始めましたが、これを実際の仕事の世界に当てはめて考えてみると、ディープラーニングやニューラルネットワークのようなアプローチで使用できる様々な画像モデルや表形式のモデルが存在することが想像できます。そして、これらのハイパーパラメータを調整することで、より良い結果が得られるのです。
これらの画像は、Torchアドインのストーリーブックにある様々な例から引用したものです。誰もがこのアプローチを適用できるようなデータを持っていると思います。もちろん、Russに感謝の意を表したいと思います。彼には少し苦労をかけたかもしれませんが、このアドインの開発において、彼が大きな助けとなり、私があちこちに散らばることなく、ガイドラインを設けてくれるなど、大変助かりました。そしてもちろん、この講演を選出してくれたJMP運営委員会にも感謝いたします。先ほども申し上げましたが、TorchアドインとTuningアドインはどちらもマーケットプレイスで入手可能です。ダウンロードをご希望の場合は、こちらのQRコード、またはmarketplace.jmp.comにアクセスしてください。ありがとうございました。
ありがとう。