TensorFlow 機械学習ガイド : テキスト分類 (5) ハイパーパラメータの調整、モデルの配備、バッチ訓練 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 08/23/2018
* 本ページは、developers.google.com サイトの Machine Learning Guides : Text classification の以下のページを
翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
Step 5: ハイパーパラメータを調整する
モデルを定義して訓練するためにハイパーパラメータの数字を選択しなければなりませんでした。直感、例そしてベストプラクティス推奨に依拠しました。けれども、ハイパーパラメータ値の最初の選択は最善の結果を産まないかもしれません。それは訓練のための良い開始点を与えてくれるだけです。総ての問題は異なり、これらのハイパーパラメータの調整は手元の問題の特殊性をより良く表わすためにモデルを改良することに役立ちます。使用したハイパーパラメータの幾つかとそれらの調整が意味するものを見てみましょう :
- モデルの層数: ニューラルネットワークの層の数はその複雑さの指標です。この値を選択する際に慎重でなければなりません。多すぎる層はモデルに訓練データについて多過ぎる情報を学習することを可能にし、overfitting を引き起こします。少な過ぎる層はモデルの学習能力を制限することができて、underfitting を引き起こします。テキスト分類データセットのためには、1, 2, そして 3 層 MLP で実験しました。2 層を持つモデルは上手く遂行し、ある場合には 3 層モデルよりもより良かったです。同様に、4 と 6 層を持つ sepCNN を試し、4 層モデルが上手く遂行しました。
- 層毎のユニット数: 層のユニットは層が遂行する変換のための情報を保持しなければなりません。最初の層については、これは特徴数により駆動されます。続く層内では、ユニット数は前の層からの表現を拡大するか縮小するかの選択に依拠します。層間の情報損失を最小化してみます。範囲 [8, 16, 32, 64] のユニット数を試して、32/64 ユニットが上手く動作しました。
- Dropout 比率: Dropout 層は正則化のためにモデルで使用されます。それらは overfitting のための予防として drop する入力の比率を定義します。推奨範囲: 0.2–0.5 です。
- 学習率: これらはニューラルネットワーク重みが反復間で変更する比率です。巨大な学習率は重みの巨大な変動を引き起こすかもしれません、そしてそれらの最適な値を決して見つけられないかもしれません。低い学習率は良いですが、モデルは収束するためにより多くの反復を取るでしょう。低く始めるのは良い考えです、例えば 1e-4 です。訓練が非常に遅いのであれば、この値を増やします。モデルが学習してないのであれば、学習率を減少してみてください。
調整した 2 つの追加のハイパーパラメータがあります、これは sepCNN モデルに固有のものです :
- カーネル・サイズ: 畳み込みウィンドウのサイズです。推奨値: 3 または 5 です。
- 埋め込み次元: 単語埋め込みを表わすために使用することを望む次元数です — i.e., 各単語ベクトルのサイズです。推奨値: 50-300 です。実験では、事前訓練された埋め込み層を持つ 200 次元を持つ GloVe 埋め込みを使用しました。
これらのハイパーパラメータで遊んでみて何が最善に動作するかを見てください。ひとたび貴方のユースケースについて最もパフォーマンスの良いパラメータを選択すれば、貴方のモデルは配備される準備ができました。
Step 6: モデルを配備する
Google Cloud 上で機械学習モデルを訓練、調整そして配備することができます。プロダクションのために貴方のモデルを配備する際のガイダンスについて以下のリソースを見てください :
- TensorFlow serving で Keras モデルをどのようにエクスポートするかの チュートリアル。
- TensorFlow serving ドキュメント。
- Google Cloud 上でモデルを訓練して配備するための ガイド。
貴方のモデルを配備するとき以下の主要なことに留意してください :
- プロダクション・データは訓練と評価データと同じ分布に従ってください。
- 定期的により多くの訓練データを集めて再評価してください。
- データ分布が変われば、モデルを再訓練してください。
おわりに
テキスト分類は様々なプロダクションに渡るアプリケーションに伴う基礎的な機械学習問題です。このガイドでは、テキスト分類のワークフローを幾つかのステップに分解しました。各ステップについて、貴方の特定のデータセット特性に基づいてカスタマイズしたアプローチを提案してきました。特に、number of samples の number of words per sample に対する比率を利用して、ベスト・パフォーマンスに迅速に近づけるモデル・タイプを提案します。他のステップはこの選択まわりに設計されています。このガイドに従って、付随するコード、そしてフローチャートが貴方が学習し、理解し、そして貴方のテキスト分類問題への素早い素案としてのソリューションを得る助けとなることを望みます。
Appendix: バッチ訓練
非常に巨大なデータセットはプロセスに割り当てられたメモリに収まらないかもしれません。前のステップでは、パイプラインを設定しました、そこではデータセット全体をメモリに持ち込み、データを準備して、そして訓練関数に作業用セットを渡します。代わりに、Keras はバッチでデータを取得する、代わりの訓練関数 (fit_generator) を提供します。これはデータ・パイプラインの変換をデータの小さい (batch_size の倍数) 部分に適用することを可能にします。実験の間、DBPedia, Amazon レビュー, Ag ニュース, そして Yelp レビューのようなデータセットのためにバッチ処理を使用しました。
次のコードはどのようにデータバッチを生成してそれらを fit_generator に供給するかを示します。
def _data_generator(x, y, num_features, batch_size): """Generates batches of vectorized texts for training/validation. # Arguments x: np.matrix, feature matrix. y: np.ndarray, labels. num_features: int, number of features. batch_size: int, number of samples per batch. # Returns Yields feature and label data in batches. """ num_samples = x.shape[0] num_batches = num_samples // batch_size if num_samples % batch_size: num_batches += 1 while 1: for i in range(num_batches): start_idx = i * batch_size end_idx = (i + 1) * batch_size if end_idx > num_samples: end_idx = num_samples x_batch = x[start_idx:end_idx] y_batch = y[start_idx:end_idx] yield x_batch, y_batch # Create training and validation generators. training_generator = _data_generator( x_train, train_labels, num_features, batch_size) validation_generator = _data_generator( x_val, val_labels, num_features, batch_size) # Get number of training steps. This indicated the number of steps it takes # to cover all samples in one epoch. steps_per_epoch = x_train.shape[0] // batch_size if x_train.shape[0] % batch_size: steps_per_epoch += 1 # Get number of validation steps. validation_steps = x_val.shape[0] // batch_size if x_val.shape[0] % batch_size: validation_steps += 1 # Train and validate model. history = model.fit_generator( generator=training_generator, steps_per_epoch=steps_per_epoch, validation_data=validation_generator, validation_steps=validation_steps, callbacks=callbacks, epochs=epochs, verbose=2) # Logs once per epoch.
以上