TensorFlow : Tutorials : Data representation : TensorFlow で大規模線形モデル (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 07/15/2018
作成日時 : 04/05/2017
* TensorFlow 1.9 でドキュメント構成が変わりましたので調整しました。
* 本ページは、TensorFlow の本家サイトの Tutorials – Data representation – Large-scale Linear Models with TensorFlow を翻訳した上で適宜、補足説明したものです:
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
tf.learn API は TensorFlow の線形モデルで作業するための (とりわけ) リッチなツール・セットを提供します。このドキュメントはこれらのツールの概要を提供します。以下を説明します :
- 線形モデルとは何か。
- 何故線形モデルを使用することを望むのか。
- tf.learn は TensorFlow で線形モデルを構築することをどのように簡単にするのか。
- 線形モデルを深層学習と両者の優位点を得るために結合するために tf.learn をどのように使用できるか。
この概要を読んで tf.learn 線形モデル・ツールが貴方に有用であるかを決定しましょう。そしてそれを試すために 線形モデル・チュートリアル を行ないます。この概要はチュートリアルからコード・サンプルを使用しますが、そのチュートリアルはコードをより詳細に通り抜けます。
この概要を理解するためには基本的な機械学習コンセプトと tf.learn にある程度精通していることは助けになるでしょう。
線形モデルとは何か?
線形モデルは予測を行なうために特徴の単一の重み付けられた総和を用います。例えば、人口のための年齢、教育の年数、そして週労働時間のデータを持つならば、それらの数の各々について重みを学習が可能で、それらの重み付けられた総和はある人の給与を見積もります。線形モデルを分類のために使うこともできます。
ある線形モデルでは重み付けられた総和をより便利な形式に変換します。例えば、出力を 0 と 1 の間に収めるためにロジスティック回帰は重み付けられた総和をロジスティック関数に差し込みます。しかし依然として各入力特徴のためには一つの重みだけを持ちます。
何故線形モデルを使用することを望むのか?
最近の研究が多くの層を持つより複雑なニューラルネットワークのパワーを誇示している時に何故そのように単純なモデルを使用することを望むのでしょうか?
線形モデルは :
- 深層ニューラルネットと比較して、迅速にトレーニングします。
- 非常に巨大な特徴セット上でも上手く動作できます。
- 学習率 etc. のような多くの些細なものを必要としないアルゴリズムでトレーニング可能。
- ニューラルネットよりもより簡単に解釈できてデバッグできる。各特徴に割り当てられた重みを検査して予測に大きなインパクトを持つものを見つけ出すことができます。
- 機械学習について学習のための良い開始点を提供します。
- 産業界で広く使われています。
tf.learn は線形モデルの構築をどのように手助けするか?
線形モデルは、特別な API の助けなしに TensorFlow でスクラッチから構築できます。けれども tf.learn は効果的な大規模な (large-scale) 線形モデルを構築することを簡単にする何某かのツールを提供します。
特徴カラムと変換
線形モデルを設計する作業の多くは生データを適切な入力特徴に変換することから成ります。tf.leran はこれらの変換を可能にするために FeatureColumn 抽象を使用します。FeatureColumn はデータの単一の特徴を表します。
FeatureColumn は ‘height’ のような量を表すかもしれません、あるいはそれは ‘eye_color’ のようなカテゴリを表すかもしれません、ここで値は {‘blue’, ‘brown’, ‘green’} のような離散的な可能性のセットから抽出されます。
‘height’ のような連続的な特徴と ‘eye_color’ のようなカテゴリカル特徴の両者のケースで、データの単一の値はモデルへの入力となる前に数字のシークエンスに変換されるかもしれません。FeatureColumn 抽象は、この事実にもかかわらず特徴を単一の意味のあるユニットとして操作可能にします。変換を指定できてそしてモデルに供給するテンソルにおいて特定のインデックスを扱うことなしに含める特徴を選択できます。
スパース・カラム (疎なカラム, Sparse columns)
線形モデルのカテゴリカル特徴は典型的にはスパース・ベクトルに変換されます、そこでは各可能な値は相当するインデックスまたは id を持ちます。例えば、3つの可能な目の色だけがあるとすれば ‘eye_color’ を長さ3のベクトルとして表すことができます : ‘brown’ は [1, 0, 0] になり、’blue’ は [0, 1, 0] になり、そして ‘green’ は [0, 0, 1] となるでしょう。これらのベクトルは “スパース (疎)” と呼ばれます、何故ならば可能な値のセットが (全ての英単語のように) 非常に大きいときこれらは非常に長く、多くはゼロだからです。
tf.learn 線形モデルを使用するためにスパース・カラムを使用する必要がない一方で、線形モデルの強みの一つは巨大なスパース・ベクトルを扱う能力です。スパース特徴は tf.learn 線形モデル・ツールのための主要なユースケースです。
スパース・カラムをエンコードする
FeatureColumn はカテゴリカル値のベクトルへの変換を自動的に処理します、次のようなコードで :
eye_color = tf.contrib.layers.sparse_column_with_keys( column_name="eye_color", keys=["blue", "brown", "green"])
ここで eye_color はソースデータのカラムの名前です。
全ての可能な値が分からないカテゴリカル特徴のために FeatureColumns を生成することもできます。このケースのためには sparse_column_with_hash_bucket() を使用します、これはインデックスを特徴値に割り当てるために hash 関数を使用します。
education = tf.contrib.layers.sparse_column_with_hash_bucket(\ "education", hash_bucket_size=1000)
特徴クロス (Feature Crosses)
線形モデルは独立的な重みを別々の特徴に割り当てませんので、特徴値の特定の組み合わせの相対的な重要度を学習できません。特徴 ‘favorite_sport’ と特徴 ‘home_city’ を持ちそしてある人が赤色を着るのが好きかどうかを予測しようとする場合、その線形モデルは St. Louis からの野球ファンが特別に赤色を着るのが好きかを学習することはできないでしょう。
新しい特徴 ‘favorite_sport_x_home_city’ を作成することでこの制限を回避できます。与えられた人のためのこの特徴の値は2つのソース特徴の値の単なる結合です :例えば、’baseball_x_stlouis’ です。この類の組み合わせ特徴は特徴クロスと呼ばれます。
crossed_column() メソッドは特徴クロスをセットアップすることを容易にします :
sport = tf.contrib.layers.sparse_column_with_hash_bucket(\ "sport", hash_bucket_size=1000) city = tf.contrib.layers.sparse_column_with_hash_bucket(\ "city", hash_bucket_size=1000) sport_x_city = tf.contrib.layers.crossed_column( [sport, city], hash_bucket_size=int(1e4))
連続的なカラム (Continuous columns)
連続的な特徴も次のように指定できます :
age = tf.contrib.layers.real_valued_column("age")
単一の実数として、連続的な特徴はしばしばモデルに直接的な入力となりますが、tf.learn はこの類のカラムに対しても有用な変換を提案します。
バケット化 (Bucketization)
バケット化は連続的なカラムをカテゴリカル・カラムに変換します。この変換は特徴クロスで連続的な特徴を使用することを可能しますし、また特定の値範囲が特定の重要度を持つケースを学習できます。
バケット化は可能な値の範囲をバケットと呼ばれる部分範囲 (subrange) に分割します :
age_buckets = tf.contrib.layers.bucketized_column( age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])
値が収まるバケットはその値のためのカテゴリカル・ラベルとなります。
入力関数 (Input function)
FeatureColumns は、データをどのように表して変換するかを示す、モデルの入力データのための仕様を提供します。しかしそれらはデータ自身は提供しません。入力関数を通してデータを提供します。
入力関数はテンソルの辞書を返さなければなりません。各キーは FeatureColumn の名前に相当します。各キーの値は全てのデータインスタンスに対するその特徴値を含むテンソルです。入力関数のより包括的な全体像については Building Input Functions with tf.contrib.learn を、そして入力関数のサンプル実装のためには linear models tutorial code の input_fn を参照してください。
この入力関数は fit() と evaluate() 呼び出しに渡されて次のセクションで説明されるように、トレーニングとテスティングを初期化します。
線形 estimators
tf.learn の estimator クラスは回帰と分類モデルのための統一されたトレーニングと評価 harness (馬具) を提供します。それらはトレーニングと評価ループの詳細を世話してユーザにモデル入力とアーキテクチャにフォーカスすることを可能にします。
線形 estimator を構築するためには、tf.contrib.learn.LinearClassifier estimator か tf.contrib.learn.LinearRegressor estimator を使用できます、それぞれ分類と回帰のためのものです。
全ての tf.learn estimator と同様に、これらの estimator を実行するためには単に :
- estimator クラスをインスタンス化します。2つの線形 estimator クラスのためには、FeatureColumns のリストをコンストラクタに渡します。
- それをトレーニングするためには estimator の fit() メソッドを呼び出します。
- どのようにそれを行なうかを見るためには estimator の evaluate() メソッドを呼び出します。
例えば :
e = tf.contrib.learn.LinearClassifier(feature_columns=[ native_country, education, occupation, workclass, marital_status, race, age_buckets, education_x_occupation, age_buckets_x_race_x_occupation], model_dir=YOUR_MODEL_DIRECTORY) e.fit(input_fn=input_fn_train, steps=200) # Evaluate for one step (one pass through the test data). results = e.evaluate(input_fn=input_fn_test, steps=1) # Print the stats for the evaluation. for key in sorted(results): print "%s: %s" % (key, results[key])
Wide and deep learning
tf.learn API はまた線形モデルと深層ニューラルネットワークを一緒にトレーニングすることを可能にする estimator クラスもまた提供します。この新規なアプローチはキー特徴を “記憶” する線形モデルの能力とニューラルネットの一般化する能力を結合します。この “wide and deep” モデルの類を作成するためには tf.contrib.learn.DNNLinearCombinedClassifier を使用します :
e = tf.contrib.learn.DNNLinearCombinedClassifier( model_dir=YOUR_MODEL_DIR, linear_feature_columns=wide_columns, dnn_feature_columns=deep_columns, dnn_hidden_units=[100, 50])
更なる情報のためには、Wide and Deep Learning チュートリアル を参照してください。
以上