質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

TensorFlow の softmax_cross_entropy_with_logits() と活性化関数について

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 896

urotanke

score 2

こんにちは。

tensorflow を試しているのですが、

https://www.tensorflow.org/get_started/mnist/beginners
こちらのチュートリアルで、
y = tf.nn.softmax(tf.matmul(x, W) + b)
という、ソフトマックス関数を使ったコードを活性化関数?として定義しています。

そして損失関数として
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
を定義しています。

しかし読み進めると、この損失関数がうまく動かないことがあるため、代わりに
tf.nn.softmax_cross_entropy_with_logits()
関数を使用すべしという記述が現れます。

そこで用意されている完成版のサンプルコード
https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/examples/tutorials/mnist/mnist_softmax.py
を確認してみると、確かに

y = tf.matmul(x, W) + b
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

となっています。

しかしここで疑問なのは、上記サンプルコードでは y の定義から softmax() が消えてしまっている点です。
softmax_cross_entropy_with_logits の方で同時にsoftmax関数も実行しているということは分かるのですが、
活性化関数であるyからsoftmax()を除去してしまってもよいのでしょうか?
理屈がよく分かりません。

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

の行で、softmax() 有りの y の場合と softmax 無しの y の場合で、結果が変わってしまったりしないのでしょうか。

ご教示いただけると嬉しいです。
宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

とても鋭い質問ですね。
あまり気にしたことがありませんでした。
softmaxは全体の和を1にしてくれます。
これが確率としてうまく解釈でき、かつ損失関数の伝播としてよい働きをします。

一方で、分類することを考えると、結局softmaxを通すかどうかにかかわらず、それぞれのクラスに対する予測の大小関係に影響を与えません。

ゆえに、目的には沿うように感じますが、他にもっとよい解釈があるのかもしれません。

追記
オススメされている形式は数値的安定性があるようです。
http://www.nowozin.net/sebastian/blog/streaming-log-sum-exp-computation.html

人間にはsoftmax云々が理解しやすいけど、計算機だと数字が大きかったりする場合に数値計算の観点からの不安定性からオススメされていないようですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

softmax() 有りの y の場合と softmax 無しの y の場合で、結果が変わってしまったりしないのでしょうか

変わりません。

確かにsoftmax有りのyとsoftmax無しのy(便宜上y'とします)で、yの各値は変わりますが、yベクトルの中に含まれるy_iの値の大小関係はyとy'で一致します。つまり、y_i > y_j なら y'_i > y'_j の関係が成立しています。softmax関数はベクトルの各成分に定数倍するだけなので、大小関係に関して不変です。

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

の行では、tf.argmax(y, 1)を計算しています。ここでは、yベクトルに含まれる値のうち最大値のインデックスを計算しています。最大値がy_iであれば、インデックスはiです。

ところで、上で述べた通りyとy'で値の大小関係は変わらないということでしたね。なので、最大値のインデックスはyとy'で同じものが得られるはずですね。したがって、最終的に得られるcorrect_predictionも同じ値が得られるはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る