2018年2月14日水曜日

Deep Learningと回帰は相性悪い

ふとDeep Learningの回帰は非常に性能が低い事に気付きました。 少し考えてみると、そもそもDeep Learningは(単純な)回帰にはあまり向いてない事がわかります。

これは結構簡単に確認できます。 例えば mnist_mlp.py を10クラス分類で解くのではなく、0.0〜9.0の数値として捉えて回帰予測するタスクに変換してみます。これは以下のように書き換えればOK。
# y_train = keras.utils.to_categorical(y_train, num_classes)
# y_test = keras.utils.to_categorical(y_test, num_classes)
y_train = y_train * 1.0
y_test = y_test * 1.0

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
# model.add(Dense(num_classes, activation='softmax'))
model.add(Dense(1))

# model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])
model.compile(loss='mse', optimizer=RMSprop(), metrics=['accuracy'])

この精度がどうなるかというと、10%も出ない事が確認できると思います。

なぜこうなるか。 逆伝搬の際に微分できない出力を与えた事により、学習器は微分できないものを頑張って学習しようとします。 しかしどう頑張っても微分できないので、10クラス中1クラスだけのフィッティングで諦める事になるため、概ね10%の精度になるという仕組みです。 このような仕組みを考えていくとDeep Learningの回帰って微妙ですよね。

もちろんこの辺を考慮した設計をすれば良い感じに回帰できるので、あくまで単純な回帰は微妙という事です。 こういった部分もまるっと学習してくれる技術が出ると面白いんですけどね。

0 件のコメント: