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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1546閲覧

Pythonの活性化関数について

Ryoya_Akechi

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/19 11:50

編集2020/07/19 12:50

こんにちは。Python初学者のものです。
活性化関数(softmax関数)についての質問になるのですが、以下のような配列arrを用意したとき、axisで指定したうえで、配列の要素の最大値を返すよう実装する実験をしたいと考えています。

arr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,12,13],[73,72,71],[90,93,92],[100,101,102]])

プログラムは以下の通りです。

Python

1import numpy as np 2 3def softmax(x): 4 if x.ndim == 2: 5 x = x.T 6 x = x - np.max(x, axis=0) 7 y = np.exp(x) / np.sum(np.exp(x), axis=0) 8 return y.T 9 10 x = x - np.max(x) 11 return np.exp(x) / np.sum(np.exp(x)) 12 13arr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,12,13],[73,72,71],[90,93,92],[100,101,102]]) 14 15 16sum_arr = np.sum(arr,axis=1) 17sum_arr = sum_arr.reshape(7,1) 18new_arr = arr/sum_arr 19new_arr = softmax(new_arr) 20 21for i in range(40): 22 sum_arr = np.sum(new_arr,axis=1) 23 sum_arr = sum_arr.reshape(7,1) 24 new_arr = new_arr/sum_arr 25 new_arr = softmax(new_arr) 26 27print(new_arr) 28 29max_index = np.argmax(new_arr,axis=1) 30print('max_index=',max_index) 31

例えば上記のようなプログラムで、softmax関数を20回程度適用するだけならば、結果としては、
max_index= [2 2 2 2 0 1 2]
となります。

しかし、例として40回ほど適用すると、値が丸め込まれすぎているのか、
max_index= [0 0 0 0 0 0 0]
と表示されてしまいます。

なぜ、活性化関数を複数回適用するかについてですが、ニューラルネットワーク(CNNなど)の各層で得られた活性値を次の層への受け渡しとできないか考えているためです。

値の大小関係を継承しながら、活性化関数を適用するにはどのような案があるでしょうか?
ご回答よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2020/07/19 12:13

そもそも論なのですが、softmax関数で得られた結果をさらにsoftmax関数の入力とする演算の意図が分かりません。その意図、問題の背景を記載すると的確な回答が得られやすいかと思います。
Ryoya_Akechi

2020/07/19 12:51

大変申し訳ありません。 実は、簡易なニューラルネットワーク(別プログラム)を実験していまして、各層で活性化関数を適用し、次の層への入力としてそれらの値を利用する方法を考えていました。 その際、本質問のような問題が発生したので、とりあえずミニマムなデータを用意し、解決法もしくは代替案をお持ちの方がいらっしゃらないか考えた次第です。 分かりにくくて申し訳ありません。
guest

回答2

0

実は、簡易なニューラルネットワーク(別プログラム)を実験していまして、各層で活性化関数を適用し、次の層への入力としてそれらの値を利用する方法を考えていました。

softmax を出力層以外で使うことはまずないので、連続して softmax を適用するという状況がおかしいと思います。

例として40回ほど適用すると、値が丸め込まれすぎているのか、

ループの中に print(new_arr) を入れて確認するとわかると思いますが、ソフトマックス関数を複数回適用したら、全部の値が 1 / n に収束します。
あるタイミングで全部同じ値になるので、argmax() をとると、全部0になります。(argmax() は最大値が複数ある場合は最初に見つかったインデックスを返すので)

投稿2020/07/19 14:55

編集2020/07/19 14:55
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

CNNには疎いので、なぜ活性化層(関数)を重ねるのか、その効果、意図は理解できていないのですが
とりあえずnew_arr = softmax(new_arr)のあとにnew_arr *= new_arr.shape[0]すると順位は維持できそうです。

投稿2020/07/19 13:00

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問