Posted at

TensorFlowで使う主なAPIを整理する(初心者向け)

More than 1 year has passed since last update.


はじめに

Machine Learning Crash Courseの内容を整理するで登場したTensorFlowのAPIを整理します。

機械学習の初心者向け講座で使われているAPIなので、TensorFlowの中でも抽象度の高いAPIばかりです。

機械学習マスターだ!という人がより繊細なチューニングがしたい場合、より下位のAPIが必要になるでしょう。


Estimator

tf.estimatorに定義されている分析器のAPI。どのような分析(線形回帰, ロジスティック回帰 など)を行うかを決める。

ざっくり二種類に分類できる。


  • Regressor: 回帰モデルを作成したいとき(連続した値を予測したいとき)に使う。


    • LinearRegressor: 線形モデル

    • DNNRegressor: Neural Network



  • Classifier: 分類モデルを作成したいとき(クラス分けしたいとき)に使う。


    • LinearClassifier: 線形モデル

    • DNNClassifier: Neural Network




Optimizer

tf.trainに定義されているAPI。学習時に使うアルゴリズムを選択する。

講座に出てきたのは以下の4種類(だったはず)。

他にもいっぱいアルゴリズムがあるようなので、勉強が必要かなぁ。


  • GradientDescentOptimizer


    • 講座の最初に出てきた基本的なアルゴリズム。損失関数の勾配が下がる方向へweightを調整する。

    • 線形モデルで解ける問題のときに相性が良いらしい。



  • FtrlOptimizer


    • "For the Regularized Leader" というアルゴリズム。先に到着したデータを正としてweightを調整する。

    • オンライン学習(学習中にも新しいデータが到着する)と相性が良いらしい。



  • AdagradOptimizer


    • "Adaptive Gradient"(適応的な勾配)の略じゃないかと予想してる。(知ってる人いたら教えてください。)

    • 学習ステップが進むごとに学習率を変動させて、効率よく学習できるようにしたアルゴリズム。

    • 損失関数が凸型になる問題(線形モデルで解ける問題)には良くフィットするらしい。

    • 損失関数が凸型にならない問題では、常に最適とは言えないらしい。

    • 他のアルゴリズムに比べて学習率を高めに設定すると良い。(途中で学習率を調整していくため)



  • AdamOptimizer


    • 損失関数が非凸型な問題の場合、Adagradアルゴリズムより良くなることがあるらしい。

    • 調整できるパラメータがいくつかあるけど、受けた講座では学習率以外はノータッチ。




feature columns

tf.feature_columnに定義されているAPI。featureの値の種類によって使い分ける。


  • numeric_column


    • 連続した数値で表現されるfeatureの場合に使う。



  • bucketized_column


    • 連続した数値で表現されているfeatureをいくつかのクラスに分類したいときに使う。

    • 例: 「年齢」をfeatureとして使うときに、「~20」「21~25」...「60~」というようなクラスに分けて扱う。



  • crossed_column


    • ベクトルで表されるfeature同士をかけ合わせてfeature crossを作りたいときに使う。

    • 例: クラス分けした「年齢」と「出身地」をかけ合わせて新たなfeatureを作り出す。


      • 「年齢」 = [0, 0, 1, 0, ..., 0]

      • 「出身地」 = 0, 1, 0, 0, ..., 0

      • crossed_column = [[0, 0, ..., 0], [0, 0, ..., 0], [0, 1, ..., 0], ... ]





  • categorical_column


    • すべての値がどれかのカテゴリに分類できるfeatureの場合に使う。

    • 大量のカテゴリを定義しやすいように、categorical_columnを作成するAPIがいくつか用意されている。


      • categorical_column_with_vocabulary_file: 全てのカテゴリを行区切りで書き下したファイルを使ってカテゴリを定義する。

      • categorical_column_with_vocabulary_list: 全てのカテゴリを書き下したリストを使ってカテゴリを定義する。

      • categorical_column_with_hash_bucket

      • categorical_column_with_identity



    • "よく分からない"カテゴリのデータの扱いは二通りある。


      • デフォルトの値に置き換えてしまう。

      • out-of-vocabularyというカテゴリに分類してしまう。out-of-vocabularyカテゴリを複数用意することもできる。(複数使いたくなるシーンってどんなとき…?)





  • embedding_column


    • 入力するfeatureが膨大で、featureの次元を落としたいときに使う。

    • ニューラルネットのニューロン数を落として計算コストを下げるのに有用。ニューラルネット以外で使えるのかどうかは分からない。




あとがき

講座に出てきた中から重要そうな(よく使いそうな?)APIを整理してみました。

tensorflow触りたてなので、他にも「これはよく使うよー!」とかあれば教えてください。