momomo555
@momomo555

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ニューラルネットワーク ReLu関数でエポック毎の結果がおかしくなってしまう

解決したいこと

ReLu関数でエポック毎の結果がおかしくなってしまう

こちらのサイトの以下の記事でニューラルネットワークのタイタニックデータを使ったフルスクラッチを学習させて頂いてます。
以下の記事では隠れ層の活性化関数にシグモイド関数を使用してますが、ReLu関数に変更して実装したいのですが、エポック毎の精度が全て同じになってしまいます。
初心者なので何をどうすれば解決するかが分からない状態です。

手作り3層ニューラルネットワークをフルスクラッチで実装して、 Kaggle Titanic コンペに Submit してみた
https://qiita.com/nozomale/items/197243963e1e96d42680

発生している問題・エラー

シグモイド関数の代わりに以下のReLu関数を入れ替えて実装したのですが、
def relu(x):
return np.maximum(0, x)

train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264
train acc : 0.615 || test acc : 0.6263736263736264

0

1Answer

私の方でもSigmoid関数からReLU関数に置き換えて実行してみたところ,同様の状況になりました.

機械学習初学者の意見で申し訳ないのですが,ReLU関数の線形さと,負の入力を無視する特性が原因に思われます.
Accuracyを求める際の中間層を観察したところ,中間層の重み${\boldsymbol W}_1$や,中間層からの出力${\boldsymbol x}_1$がほとんど0でした.
この事実から,ReLU関数の最も非線形な箇所である$x=0$近傍,またはそれ未満を扱う必要があると学習され,初期化された重みのほとんどが$0$に変更されていったのではないかと考えられます.

対して,学習の進むSigmoid関数の場合の中間層の重みや出力は平均が$0.1$以上あるので,ある程度のパーセプトロンが活きていると考えられます.

個人的に思うのは,中間層が1層しかない場合はまだReLU関数にする必要はないということです.

ネットワークを深くしたいと考えたときに生じる勾配消失問題を解決するためのアプローチとして,ReLUを用い始めるという時代背景がありますが,今回の場合であれば特に勾配消失が起きるほどネットワークは深くなく,また「線形な中間層を複数通して非線形さを実現する」ようなこともできていないことから,学習が進まなかったものと考えられます.

ちなみに中間層を2層に改造したらReLUでも学習が進みました.
また,中間層1層でも,Swish関数にするとReLU関数の場合よりも良いスコアが出ました.

0Like

Your answer might help someone💌