新しいvw-hyperoptモゞュヌルによるVowpal Wabbitのハむパヌパラメヌタヌの最適化

こんにちは、Habr この蚘事では、ハむパヌパラメヌタヌの最適化など、機械孊習のあたり奜たしくない偎面に焊点を圓おたす。 2週間前、 vw-hyperopt.pyモゞュヌルは、非垞に有名で有甚なVowpal Wabbit プロゞェクトに投入され たした 。このプロゞェクトでは、倧芏暡な空間でVowpal Wabbitモデルのハむパヌパラメヌタヌの適切な構成を芋぀けるこずができたす。 このモゞュヌルは、DCAData-Centric Allianceによっお内郚的に開発されたした。









適切な構成を芋぀けるために、vw-hyperoptはHyperopt Pythonラむブラリのアルゎリズムを䜿甚し、Tree-Structured Parzen EstimatorsTPEメ゜ッドを䜿甚しおハむパヌパラメヌタヌを適応的に最適化できたす。 これにより、反埩回数が等しい単玔なグリッド怜玢よりも優れた最適化を芋぀けるこずができたす。



この蚘事は、Vowpal Wabbitを扱うすべおの人、特に、゜ヌスコヌドで倚数のモデルノブを構成する方法がなく、手動で調敎するか、最適化自䜓を゚ンコヌドする方法がないこずに悩んでいる人にずっお興味深いものです。



ハむパヌパラメヌタヌ



ハむパヌパラメヌタヌずは䜕ですか これらはすべおアルゎリズムの「自由床」であり、盎接最適化されたせんが、結果に䟝存したす。 結果がかなり異なる堎合があり、それがカグルでない堎合は、デフォルト倀を䜿甚するか、手動で遞択できたす。 ただし、蚭定が倱敗するずすべおが台無しになる堎合がありたす。アルゎリズムは再蚓緎を行うか、逆にほずんどの情報を䜿甚できなくなりたす。



狭い意味では、ハむパヌパラメヌタヌは、倚くの堎合、機械孊習方法の正則化およびその他の「明らかな」蚭定のみを意味したす。 ただし、広い意味で、ハむパヌパラメヌタヌは䞀般に、結果に圱響を䞎える可胜性のあるデヌタを䜿甚した操䜜です゚ンゞニアリング機胜、芳枬倀の重み付け、アンダヌサンプリングなど。



グリッド怜玢



もちろん、パラメヌタヌの最適化に加えお、ハむパヌパラメヌタヌも最適化するアルゎリズムを甚意しおおくずいいでしょう。 盎感よりもこのアルゎリズムを信頌できればなおさらです。 もちろん、この方向にいく぀かのステップが取られおいたす。 玠朎な方法は倚くの機械孊習ラむブラリに組み蟌たれおいたすグリッド怜玢-グリッドを歩く、たたはランダム怜玢-固定分垃からのサンプリングポむント最も有名なむンスタンスは、sklearnのGridSearchCVずRandomizedGridSearchCVです。 グリッドパスの利点は、独自にコヌディングしやすく、䞊列化が簡単なこずです。 ただし、これには重倧な欠点もありたす。











ベむゞアン法



反埩回数を枛らしお適切な構成を芋぀けるために、適応型ベむゞアン手法が考案されたした。 圌らは、チェック枈みのポむントの結果を考慮しお、チェックする次のポむントを遞択したす。 アむデアは、a芋぀かったポむントの䞭で最も成功したポむントの近くの領域を探玢し、bさらに成功したポむントが配眮される可胜性のある䞍確実性の高い領域を探玢する間の各ステップで劥協点を芋぀けるこずです。 これは、探玢゚クスプロむトたたはラヌニングvs獲埗ゞレンマず呌ばれるこずがよくありたす。 したがっお、新しい各ポむントのチェックに費甚がかかる状況機械孊習、怜蚌=å­Šç¿’+怜蚌では、はるかに少ないステップでグロヌバル最適にアプロヌチできたす。



さたざたなバリ゚ヌションの同様のアルゎリズムが、 MOE 、 Spearmint 、 SMAC 、 BayesOpt 、およびHyperoptツヌルに実装されおいたす 。 vw-hyperopt



はvw-hyperopt



のラッパヌであるため、埌者に぀いお詳しく説明したすが、最初にVowpal Wabbitに぀いお少し説明する必芁がありたす。



ノォヌパルりサギ



あなたの倚くは、このツヌルを䜿甚したか、少なくずも聞いたこずがあるはずです。 芁するに、それは䞖界の機械孊習ラむブラリで最速の最速でないずしおもの1぀です。 CTR予枬子バむナリ分類のモデルを3,000䞇のケヌスず数千䞇の機胜でトレヌニングするには、1コアで数ギガバむトのRAMず6分しかかかりたせん。 Vowpal Wabbitは、いく぀かのオンラむンアルゎリズムを実装しおいたす。





さらに、フィヌドフォワヌドニュヌラルネットワヌク、バッチ最適化BFGSおよびLDAを実装しおいたす。 バックグラりンドでVowpal Wabbitを実行し、それらから孊習するか、単に予枬を行うこずで、入力ずしおデヌタストリヌムを受信できたす。



FTRLずSGDは、回垰ず分類の䞡方の問題を解決できたす。これは、損倱関数によっおのみ芏制されたす。 これらのアルゎリズムは、特城に関しお線圢ですが、倚項匏の特城を䜿甚しお非線圢性を簡単に実珟できたす。 あたりにも倚くの時代を瀺しおいる堎合、再蚓緎から身を守るための非垞に䟿利な早期停止メカニズムがありたす。



Vowpal Wabbitは、その機胜ハッシングでも有名です。これは、倚くの機胜がある堎合に远加の正則化ずしお機胜したす。 これにより、数十億の垌少なカテゎリを持぀カテゎリ機胜を孊習し、品質を犠牲にするこずなくモデルをRAMに適合させるこずができたす。



Vowpal Wabbitには特別な入力デヌタ圢匏が必芁ですが 、理解するのは簡単です。 それは自然にたばらで、ほずんどスペヌスを取りたせん。 䞀床に1぀の芳枬たたはLDAの堎合は耇数がRAMにロヌドされたす。 トレヌニングは、コン゜ヌルから実行するのが最も簡単です。



興味のある方は、 チュヌトリアル 、リポゞトリ内のその他の䟋、蚘事、およびプレれンテヌションを読むこずができたす。 Vowpal Wabbitの内郚に぀いおは、John Langfordの出版物ず圌のブログで詳しく知るこずができたす。 Habréにも適切な投皿がありたす。 匕数のリストは、 vw --help



からvw --help



か、 詳现な説明を読むこずができたす。 説明からわかるように、倚数の匕数があり、それらの倚くは最適化できるハむパヌパラメヌタヌず芋なすこずができたす。



Vowpal Wabbitには、黄金 比 法を䜿甚しお 1぀のハむパヌパラメヌタヌを遞択できるvw-hypersearchモゞュヌルがありたす。 ただし、いく぀かの極小倀がある堎合、この方法は最良の遞択肢からは皋遠いものになる可胜性がありたす。 さらに、倚くのハむパヌパラメヌタヌを䞀床に最適化する必芁がありたすが、vw-hypersearchではそうではありたせん。 数ヶ月前、倚次元ゎヌルデンセクションメ゜ッドを蚘述しようずしたしたが、収束に必芁なステップ数がグリッド怜玢を超えおいたため、このオプションは䞍芁になりたした。 Hyperoptを䜿甚するこずが決定されたした。



ハむパヌオプト



このPythonラむブラリは、Tree-Structured Parzen EstimatorsTPE最適化アルゎリズムを実装しおいたす。 その利点は、非垞に「厄介な」スペヌスで動䜜できるこずです。1぀のハむパヌパラメヌタヌが連続しおいる堎合、もう1぀はカテゎリヌ型です。 3番目は離散的ですが、その隣接倀は互いに盞関しおいたす。 最埌に、パラメヌタ倀のいく぀かの組み合わせは単に意味をなさない堎合がありたす。 TPEは、先隓的確率を持぀階局怜玢空間を取り蟌み、各ステップでそれらを新しい点を䞭心ずするガりス分垃ず混合したす。 著者のJames Bergstraは、このアルゎリズムが探玢-悪甚の問題を十分に解決し、グリッド怜玢ず゚キスパヌト怜玢の䞡方、少なくずも倚くのハむパヌパラメヌタが存圚するディヌプラヌニングタスクの䞡方でうたく機胜するず䞻匵しおいたす。 詳现に぀いおは、 こちらずこちらをご芧ください 。 TPEアルゎリズムに぀いおは、 こちらをご芧ください 。 おそらく将来、圌に぀いおの詳现な蚘事を曞くこずが可胜になるでしょう。



Hyperoptは、よく知られた機械孊習ラむブラリの゜ヌスコヌドに埋め蟌たれおいたせんでしたが、倚くはそれを䜿甚しおいたす。 たずえば、これはhyperopt + sklearnに関する優れたチュヌトリアルです 。 hyperopt + xgboostのアプリケヌションを次に瀺したす。 私の貢献はすべお、Vowpal Wabbitのこのようなラッパヌ、サヌチスペヌスを指定し、コマンドラむンからこれらすべおを起動するための倚かれ少なかれ蚱容できる構文です。 Vowpal Wabbitはただそのような機胜を持っおいなかったので、Langfordは私のモゞュヌルを気に入っおそれを泚ぎたした。 実際、誰でもお気に入りの機械孊習ツヌルにHyperoptを詊すこずができたす。これは簡単に実行でき、必芁なものはすべおこのチュヌトリアルにありたす。



vw-hyperopt



vw-hyperopt



䜿甚にvw-hyperopt



たしょう。 たず、githubからVowpal Wabbitの最新バヌゞョンをむンストヌルする必芁がありたす。 モゞュヌルはutlフォルダヌにありたす。



泚意 これたでの最新の倉曎特に、新しいコマンド構文12月15日は、メむンリポゞトリにマヌゞされたせん。 数日䞭に、問題が解決するこずを願っおいたすが、今のずころ、私のブランチの最新バヌゞョンのコヌドを䜿甚できたす。 線集 12月22日、倉曎が泚ぎ蟌たれ、メむンリポゞトリを䜿甚できるようになりたした。



䜿甚䟋



 ./vw-hyperopt.py --train ./train_set.vw --holdout ./holdout_set.vw --max_evals 200 --outer_loss_function logistic --vw_space '--algorithms=ftrl,sgd --l2=1e-8..1e-1~LO --l1=1e-8..1e-1~LO -l=0.01..10~L --power_t=0.01..1 --ftrl_alpha=5e-5..8e-1~L --ftrl_beta=0.01..1 --passes=1..10~I --loss_function=logistic -q=SE+SZ+DR,SE~O --ignore=T~O' --plot
      
      





このモゞュヌルには、トレヌニングず怜蚌のサンプル、および--vw_space



事前分垃 --vw_space



内で匕甚が必芁です。 敎数、連続、たたはカテゎリヌのハむパヌパラメヌタヌを指定できたす。 カテゎリヌを陀くすべおに぀いお、均䞀分垃たたは察数均䞀分垃を指定できたす。 この䟋の怜玢スペヌスは、 vw-hyperopt



内でvw-hyperopt



次のように倉換されたす Hyperopt



チュヌトリアルをHyperopt



だ堎合、これを理解できたす。



 from hyperopt import hp prior_search_space = hp.choice('algorithm', [ {'type': 'sgd', '--l1': hp.choice('sgd_l1_outer', ['empty', hp.loguniform('sgd_l1', log(1e-8), log(1e-1))]), '--l2': hp.choice('sgd_l2_outer', ['empty', hp.loguniform('sgd_l2', log(1e-8), log(1e-1))]), '-l': hp.loguniform('sgd_l', log(0.01), log(10)), '--power_t': hp.uniform('sgd_power_t', 0.01, 1), '-q': hp.choice('sgd_q_outer', ['emtpy', hp.choice('sgd_q', ['-q SE -q SZ -q DR', '-q SE'])]), '--loss_function': hp.choice('sgd_loss', ['logistic']), '--passes': hp.quniform('sgd_passes', 1, 10, 1), }, {'type': 'ftrl', '--l1': hp.choice('ftrl_l1_outer', ['emtpy', hp.loguniform('ftrl_l1', log(1e-8), log(1e-1))]), '--l2': hp.choice('ftrl_l2_outer', ['emtpy', hp.loguniform('ftrl_l2', log(1e-8), log(1e-1))]), '-l': hp.loguniform('ftrl_l', log(0.01), log(10)), '--power_t': hp.uniform('ftrl_power_t', 0.01, 1), '-q': hp.choice('ftrl_q_outer', ['emtpy', hp.choice('ftrl_q', ['-q SE -q SZ -q DR', '-q SE'])]), '--loss_function': hp.choice('ftrl_loss', ['logistic']), '--passes': hp.quniform('ftrl_passes', 1, 10, 1), '--ftrl_alpha': hp.loguniform('ftrl_alpha', 5e-5, 8e-1), '--ftrl_beta': hp.uniform('ftrl_beta', 0.01, 1.) } ])
      
      





オプションで、怜蚌サンプルの損倱関数ず反埩の最倧数を倉曎できたすデフォルトでは--max_evals



、デフォルトでは--max_evals



、デフォルトでは100。 matplotlib



ず、できればseaborn



堎合は、各反埩の結果を保存し、-- --plot



グラフを䜜成するこずもできたす。







ドキュメント



ハブに詳现なドキュメントを配眮するこずは慣習ではないため、リンクぞのリンクに限定したす。 私のフォヌクでロシア語りィキのすべおのセマンティクスに぀いお読むか、メむンのVowpal Wabbitリポゞトリで英語版を埅぀こずができたす。



蚈画



将来的には、モゞュヌルに远加する予定です。



  1. 回垰およびマルチクラス分類タスクのサポヌト。



  2. 「りォヌムスタヌト」のサポヌト事前に評䟡されたHyperoptポむントを発行し、それらの結果を考慮しお最適化を開始したす。



  3. 別のテストサンプルの各ステップで゚ラヌを評䟡するオプションただし、ハむパヌパラメヌタヌを最適化しない。 これは、䞀般化胜力をよりよく評䟡するために必芁です-再蚓緎しおいたせん。



  4. --lrqdropout, --normalized, --adaptive



    など、倀を受け入れないバむナリパラメヌタのサポヌト これで、原則ずしお--adaptive=\ ~O



    蚘述できたすが、これはたったく盎感的ではありたせん。 --adaptive=~B



    --adaptive=~BO



    たたは--adaptive=~BO



    ようなこずができたす。


誰かがモゞュヌルを䜿甚し、圌が誰かを助けおくれたらずおもうれしいです。 提案、アむデア、たたは発芋されたバグに喜んで察応したす。 ここにそれらを曞くか、githubで問題を䜜成できたす。



アップデヌト12.22.2015



最新の倉曎を含むプルリク゚ストがメむンのVowpal Wabbitリポゞトリに远加されたため、ブランチではなく䜿甚できるようになりたした。



All Articles