TensorFlow Hub : キーコンセプト (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
再作成日時 : 04/09/2018
* 本ページは、TensorFlow の本家サイトの Hub – Key Concepts 3編を翻訳した上で適宜、補足説明したものです:
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
モジュールを利用する
モジュールをインスタンス化する
TensorFlow Hub モジュールはモジュール・オブジェクトをその URL かファイルシステム・パスの文字列で作成することにより TensorFlow プログラムにインポートされます、次のようにです :
m = hub.Module("path/to/a/module_dir")
これはモジュール変数を現在の TensorFlow グラフに追加します。それらの initializer の実行は事前訓練された変数をディスクから読むでしょう。同様に、テーブルと他の状態がグラフに追加されます。
モジュールをキャッシュする
URL からモジュールを作成するとき、モジュールのコンテンツはローカルシステムの一時ディレクトリにダウンロードされてキャシュされます。モジュールがキャッシュされる位置は TFHUB_CACHE_DIR 環境変数を使用して override されます。
例えば、TFHUB_CACHE_DIR を /my_module_cache に設定して :
$ export TFHUB_CACHE_DIR=/my_module_cache
そしてそれから URL からモジュールを作成すると :
m = hub.Module("https://tfhub.dev/google/progan-128/1")
モジュールを /my_module_cache にダウンロードしてアンパックする結果になります。
モジュールを適用する
ひとたびインスタンス化されれば、モジュール m は tensor 入力から tensor 出力への Python 関数のようにゼロかそれ以上の回数呼び出すことができます :
y = m(x)
各々のそのような呼び出しは現在の TensorFlow グラフに x から y を計算する演算を追加します。もしこれが訓練された重みを持つ変数を伴うのであれば、これらは総てのアプリケーション間で共有されます。
モジュールは一つ以上の方法で適用されることを可能にするためにマルチに命名されたシグネチャを定義できます (Python オブジェクトがどのようにメソッドを持つかに類似しています)。モジュールのドキュメントは利用可能なシグネチャを記述するべきです。上の呼び出しは “default” と命名されたシグネチャを適用します。任意のシグネチャはその名前をオプションの signature= 引数へ渡すことにより選択できます。
もしシグネチャが複数の入力を持つのであれば、それらはシグネチャにより定義されたキーとともに、それらは dict (辞書) として渡されなければなりません。同様に、シグネチャが複数の出力を持つのであれば、シグネチャで定義されたキー下で、 それらは as_dict=True を渡すことにより辞書として取得可能です。(キー “default” は as_dict=False の場合には単一の出力が返されます。) そのためモジュールを適用する最も一般的な形式は次のようなものです :
outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True) y1 = outputs["cats"] y2 = outputs["dogs"]
呼び出し元はシグネチャで定義された総ての入力を供給しなければなりませんが、モジュールの総ての出力を使用する必要はありません。TensorFlow は tf.Session.run() でターゲット依存となるモジュールのそれらのパーツだけを実行するでしょう。実際に、モジュール公開者 (= publisher) は (中間層の活性のように) 主要な出力に沿ってより進んだ利用のために様々な出力を提供することを選択可能です。モジュール消費者 (= consumer) は追加の出力を優美に処理するべきです。
新しいモジュールを作成する
一般的なアプローチ
新しいモジュールを定義するためには、公開者は関数 module_fn とともに hub.create_module_spec() を呼び出します。この関数は、呼び出し元から供給される入力のために tf.placeholder() を使用してモジュールの内部構造を表わすグラフを構築します。それからそれは、hub.add_signature(name, inputs, outputs) を 1 回またはそれ以上の回数呼び出してシグネチャを定義します。
例えば :
def module_fn(): inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50]) layer1 = tf.layers.fully_connected(inputs, 200) layer2 = tf.layers.fully_connected(layer1, 100) outputs = dict(default=layer2, hidden_activations=layer1) # Add default signature. hub.add_signature(inputs=inputs, outputs=outputs) ... spec = hub.create_module_spec(module_fn)
hub.create_module_spec() の結果は、パスの代わりに、特定の TensorFlow グラフ内でモジュール・オブジェクトをインスタンス化するために使用できます。そのようなケースでは、チェックポイントはなく、そしてモジュール・インスタンスは変数 initializer を代わりに使用するでしょう。
任意のモジュール・インスタンスはその export(path, session) メソッドを通してディスクにシリアライズできます。モジュールのエクスポートはその定義をセッションのその変数の現在の状態と一緒に渡されたパスにシリアライズします。これは最初にモジュールをエクスポートするとき及び再調整されたモジュールをエクスポートするときに使用可能です。
TensorFlow Estimator との互換性のために、丁度 tf.estimator.LatestExporter がモデル全体を最新のチェックポイントからエクスポートするように、hub.LatestModuleExporter はモジュールを最新のチェックポイントからエクスポートします。
モジュール公開者は可能なときには 一般的なシグネチャ を実装するべきです、これは消費者が簡単にモジュールを取り替えて彼らの問題に最善の一つを見つけることを可能にするためです。
実際のサンプル
一般的なテキスト埋め込みフォーマットからどのようにモジュールを作成するかの実際の例のための私達の テキスト埋め込みモジュール・エクスポーター を見てください。
再調整
インポートされたモジュールの変数をそれの回りのモジュールのそれらと一緒に訓練することは再調整 (= fine-tuning) と呼ばれます。再調整はより良い品質の結果になり得ますが、新しい複雑さを追加します。消費者にはより単純な品質調整の探究の後に初めて再調整を調べることを推奨します。
消費者 (= Consumers) のために
再調整を有効にするには、モジュールをその変数を訓練可能にして TensorFlow の REGULARIZATION_LOSSES をインポートするために hub.Module(…, trainable=True) でインスタンス化します。モジュールが複数のグラフ・バリアントを持つ場合には、訓練のために適切な一つを確実に選択してください。通常は、それはタグ {“train”} を持つ一つです。
事前訓練された重みを台無しにしないように訓練体制を選択してください、例えば、スクラッチからの訓練のためのものよりより低い学習率です。
公開者 (= Publisher) のために
消費者に対して再調整をより簡単にするために、次について留意してください :
- 再調整は正則化を必要とします。貴方のモジュールは REGULARIZATION_LOSSES コレクションでエクスポートされ、これは tf.layers.dense(…, kernel_regularizer=…) etc. の貴方の選択を消費者が tf.losses.get_regularization_losses() から得るものへと配置するものです。L1/L2 正則化損失を定義するこの方法が好ましいです。
- 公開者モデルでは、tf.train.FtrlOptimizer の l1_ と l2_regularization_strength パラメータ、tf.train.ProximalGradientDescentOptimize、そして他の近い方の optimizer を通して L1/L2 regularization を定義することを回避します。これらはモジュールと一緒にエクスポートされず、正則化の強さの設定は消費者に対しては全体的には適切ではないかもしれません。wide (i.e. 疎線形) または wide & deep モデルの L1 正則化のため以外では、個々の正則化損失を代わりに使用するが可能です。
- ドロップアウト、バッチ正規化、または同様の訓練テクニックを使用する場合、ドロップアウト率と他のハイパーパラメータを多くの期待される利用方法に渡り意味を持つ値に設定してください。
以上