Keras:単純なデータが機能しない単純なニューラルネットワーク
私は非常に単純なニューラルネットワークを作成しようとしています。1つの隠れ層と2つのニューロンです。いくつかの非常に単純なデータの場合:1つの機能のみ。
import numpy as np
X=np.concatenate([np.linspace(0,10,100),np.linspace(11,20,100),np.linspace(21,30,100)])
y=np.concatenate([np.repeat(0,100),np.repeat(1,100),np.repeat(0,100)])

これがモデルです
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(2, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X, y, epochs=200)
理論的には、このモデルは機能するはずです。しかし、1000エポックの後でも、精度は0.667のままです。
Epoch 999/1000
10/10 [==============================] - 0s 1ms/step - loss: 0.5567 - accuracy: 0.6667
Epoch 1000/1000
10/10 [==============================] - 0s 2ms/step - loss: 0.5566 - accuracy: 0.6667
私は何か間違ったことをしたと思います。いくつかの変更を提案できますか?
極小値がたくさんあり、初期化によって最終モデルが変わる可能性があるようです。nnet
Rのパッケージでテストする場合です。たくさんのシードをテストする必要がありましたが、このモデルを見つけました(とりわけ)。

そして、これは私がkerasで作成したかった構造です:2つのニューロンを持つ1つの隠れ層。活性化関数はシグモイドです。
だから私はkerasが初期化に関して同じ問題を抱えているのだろうかと思っています。nnet
Rのこのパッケージでは、「完璧な」パッケージではないと思いました。そして、私はケラがよりパフォーマンスが高いだろうと思いました。初期化が重要な場合、kerasは異なる初期化をテストしますか?そうでない場合はなぜですか?おそらく、一般的に、より多くのデータ(およびより多くの機能)を使用すると、(多くの初期化をテストせずに)より適切に機能するためですか?
たとえば、kmeansでは、さまざまな初期化がテストされているようです。
回答
この質問は、ニューラルネットワークの入力データの正規化の重要性を示しています。正規化がないと、最適化がいくつかの極小値でスタックする可能性があるため、ニューラルネットワークのトレーニングが難しい場合があります。
データセットの視覚化から始めたいと思います。データセットは1Dであり、標準の正規化で正規化すると、次のようになります。
X_original = np.concatenate([np.linspace(0, 10, 100), np.linspace(
11, 20, 100), np.linspace(21, 30, 100)])
X = (X_original - X_original.mean())/X_original.std()
y = np.concatenate(
[np.repeat(0, 100), np.repeat(1, 100), np.repeat(0, 100)])
plt.figure()
plt.scatter(X, np.zeros(X.shape[0]), c=y)
plt.show()

これは、ロジスティック回帰などの単層ネットワークではこのデータセットを分類できないことを意味します。しかし、2つの層とそれに続く非線形活性化を備えたニューラルネットワークは、データセットを分類できるはずです。
これで、正規化と次のトレーニングスクリプトを使用して、モデルはポイントの分類を簡単に学習できます。
model = Sequential()
model.add(Dense(2, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer=keras.optimizers.Adam(1e-1), metrics=['accuracy'])
model.fit(X, y, epochs=20)
Train on 300 samples
Epoch 1/20
300/300 [==============================] - 1s 2ms/sample - loss: 0.6455 - accuracy: 0.6467
Epoch 2/20
300/300 [==============================] - 0s 79us/sample - loss: 0.6493 - accuracy: 0.6667
Epoch 3/20
300/300 [==============================] - 0s 85us/sample - loss: 0.6397 - accuracy: 0.6667
Epoch 4/20
300/300 [==============================] - 0s 100us/sample - loss: 0.6362 - accuracy: 0.6667
Epoch 5/20
300/300 [==============================] - 0s 115us/sample - loss: 0.6342 - accuracy: 0.6667
Epoch 6/20
300/300 [==============================] - 0s 96us/sample - loss: 0.6317 - accuracy: 0.6667
Epoch 7/20
300/300 [==============================] - 0s 93us/sample - loss: 0.6110 - accuracy: 0.6667
Epoch 8/20
300/300 [==============================] - 0s 110us/sample - loss: 0.5746 - accuracy: 0.6667
Epoch 9/20
300/300 [==============================] - 0s 142us/sample - loss: 0.5103 - accuracy: 0.6900
Epoch 10/20
300/300 [==============================] - 0s 124us/sample - loss: 0.4207 - accuracy: 0.9367
Epoch 11/20
300/300 [==============================] - 0s 124us/sample - loss: 0.3283 - accuracy: 0.9833
Epoch 12/20
300/300 [==============================] - 0s 124us/sample - loss: 0.2553 - accuracy: 0.9800
Epoch 13/20
300/300 [==============================] - 0s 138us/sample - loss: 0.2030 - accuracy: 1.0000
Epoch 14/20
300/300 [==============================] - 0s 124us/sample - loss: 0.1624 - accuracy: 1.0000
Epoch 15/20
300/300 [==============================] - 0s 150us/sample - loss: 0.1375 - accuracy: 1.0000
Epoch 16/20
300/300 [==============================] - 0s 122us/sample - loss: 0.1161 - accuracy: 1.0000
Epoch 17/20
300/300 [==============================] - 0s 115us/sample - loss: 0.1025 - accuracy: 1.0000
Epoch 18/20
300/300 [==============================] - 0s 126us/sample - loss: 0.0893 - accuracy: 1.0000
Epoch 19/20
300/300 [==============================] - 0s 121us/sample - loss: 0.0804 - accuracy: 1.0000
Epoch 20/20
300/300 [==============================] - 0s 132us/sample - loss: 0.0720 - accuracy: 1.0000
モデルは非常に単純であるため、学習率とオプティマイザーの選択は学習の速度に影響します。SGDオプティマイザーと学習率1e-1を使用すると、同じ学習率のAdamオプティマイザーよりもモデルのトレーニングに時間がかかる場合があります。