私はニューラルネットワークを学習しており、UCI機械学習リポジトリから虹彩データセットを分類するためにKerasで簡単なものを構築しました。 8つの隠れノードを持つ1つの隠れ層ネットワークを使用しました。 Adamオプティマイザーは0.0005の学習率で使用され、200エポックで実行されます。 Softmaxは、カテゴリカルクロスエントロピーとして損失を伴う出力で使用されます。次の学習曲線が得られます。
ご覧のとおり、精度の学習曲線には平坦な領域がたくさんあり、その理由がわかりません。エラーは絶えず減少しているように見えますが、精度は同じように増加していないようです。精度学習曲線の平坦な領域は何を意味しますか?エラーが減少しているように見えても、これらの領域で精度が向上しないのはなぜですか?
これはトレーニングでは正常ですか、それとも私がここで何か間違ったことをしている可能性が高いですか?
dataframe = pd.read_csv("iris.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:4].astype(float)
y = dataset[:,4]
scalar = StandardScaler()
X = scalar.fit_transform(X)
label_encoder = LabelEncoder()
y = label_encoder.fit_transform(y)
encoder = OneHotEncoder()
y = encoder.fit_transform(y.reshape(-1,1)).toarray()
# create model
model = Sequential()
model.add(Dense(8, input_dim=4, activation='relu'))
model.add(Dense(3, activation='softmax'))
# Compile model
adam = optimizers.Adam(lr=0.0005, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='categorical_crossentropy',
optimizer=adam,
metrics=['accuracy'])
# Fit the model
log = model.fit(X, y, epochs=200, batch_size=5, validation_split=0.2)
fig = plt.figure()
fig.suptitle("Adam, lr=0.0006, one hidden layer")
ax = fig.add_subplot(1,2,1)
ax.set_title('Cost')
ax.plot(log.history['loss'], label='Training')
ax.plot(log.history['val_loss'], label='Validation')
ax.legend()
ax = fig.add_subplot(1,2,2)
ax.set_title('Accuracy')
ax.plot(log.history['acc'], label='Training')
ax.plot(log.history['val_acc'], label='Validation')
ax.legend()
fig.show()
lossとaccuracyの両方の実際の意味(およびメカニズム)の少しの理解-)ここで大いに役立つでしょう(私はいくつかの部分を再利用しますが、私の この回答 も参照してください)...
簡単にするために、議論を二項分類の場合に限定しますが、この考え方は一般的に適用可能です。これが(ロジスティック)損失の方程式です:
y[i]
_は真のラベル(0または1)ですp[i]
_は予測([0,1]の実数)であり、通常は確率として解釈されますoutput[i]
_(式には示されていません)は、_p[i]
_の丸めであり、これらも0または1に変換します。 ;精度の計算に入るのはこの量であり、暗黙的にしきい値(通常、バイナリ分類の場合は_0.5
_)が含まれるため、_p[i] > 0.5
_の場合は_output[i] = 1
_、それ以外の場合は_p[i] <= 0.5
_、_output[i] = 0
_。ここで、真のラベル_y[k] = 1
_があると仮定します。このラベルの場合、トレーニングの早い段階で、_p[k] = 0.1
_の予測がかなり不十分になります。次に、上記の損失方程式に数値を代入します。
loss[k] = -log(0.1) = 2.3
です。p[k] < 0.5
_なので、_output[k] = 0
_になります。したがって、精度への寄与は0(間違った分類)になります。次のトレーニングステップで、実際に良くなり、_p[k] = 0.22
_;が得られたとします。今私たちは持っています:
loss[k] = -log(0.22) = 1.51
p[k] < 0.5
_であるため、精度への寄与がゼロの間違った分類(_output[k] = 0
_)があります。うまくいけば、あなたはアイデアを得始めますが、もう1つのスナップショットを見てみましょう。ここでは、たとえば_p[k] = 0.49
_;その後:
loss[k] = -log(0.49) = 0.71
output[k] = 0
_、つまり、精度への寄与がゼロの誤った分類ご覧のとおり、この特定のサンプルでは分類器が実際に改善されました。つまり、2.3から1.5、0.71の損失になりましたが、この改善はまだ精度に現れておらず、正しい分類:精度の観点から、これらの推定値がしきい値の0.5を下回っている限り、_p[k]
_のより良い推定値を取得することは重要ではありません。
_p[k]
_がしきい値の0.5を超えた瞬間、損失はこれまでと同じようにスムーズに減少し続けますが、このサンプルの精度の寄与が0から_1/n
_にジャンプします。 n
はサンプルの総数です。
同様に、_p[k]
_が0.5を超えると、正しい分類が与えられ(そして現在は精度に積極的に貢献し)、さらに改善されている(つまり、_1.0
_に近づく)ことを自分で確認できます。それでも損失は減少し続けますが、精度にそれ以上の影響はありません。
同様の議論は、真のラベル_y[m] = 0
_および対応する_p[m]
_の推定値が0.5のしきい値を超えて開始する場合にも当てはまります。 _p[m]
_の初期推定値が0.5未満であっても(したがって、正しい分類を提供し、すでに精度に積極的に貢献しています)、_0.0
_への収束により、精度をさらに向上させることなく損失が減少します。
ピースをまとめると、損失がスムーズに減少し、精度がより「段階的に」増加することは互換性がないだけでなく、実際に完全に理にかなっていることを確信できることを願っています。
より一般的なレベルでは、数理最適化の厳密な観点から、「精度」と呼ばれるものはありません。損失だけがあります。精度は、businessの観点からのみ議論に加わります(また、異なるビジネスロジックでは、デフォルトの0.5とは異なるしきい値が必要になる場合もあります)。私自身からの引用 リンクされた回答 :
損失と精度は別物です。大まかに言えば、精度はビジネスの観点から実際に関心があるものであり、損失は学習アルゴリズム(オプティマイザー)の目的関数です。 mathematicalの観点から最小化しようとしています。さらに大まかに言えば、損失は、ビジネス目標(精度)の数学的領域への「変換」と考えることができます。これは、分類問題で必要な変換です(回帰問題では、通常、損失とビジネス目標は同じ、または少なくとも原則として同じにすることができます(例:RMSE)..