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

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

ただいまの
回答率

87.79%

機械学習において層数について教えて欲しいです

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 326

score 39

機械学習初心者です。
ニューラルネットワークで層数をと精度がどの様な関係にあるのか
活性化関数を使わずに実験を行なっていました。
実験とはMNISTの画像分類をしています。
そうすると、
2層から4層までは精度は上昇していましたが、
5層目から急に精度が落ちてしまい
5層目以降では飽和してしまいました。
なお、検証は10層まで行いました。

5層目から急に精度が落ちた原因の考察がわからず悩んでいます。

何かアドバイスまたは参考になるサイトや文献がありましたら
教えていただけると助かります。

よろしくお願い致します。

ソースは下記です。

from __future__ import print_function
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
from keras.utils import np_utils
from make_tensorboard import make_tensorboard


np.random.seed(1671)  # for reproducibility

# network and training
NB_EPOCH = 20
BATCH_SIZE = 128
VERBOSE = 1
NB_CLASSES = 10   # number of outputs = number of digits
OPTIMIZER = SGD()  # optimizer, explained later in this chapter
N_HIDDEN = 128
VALIDATION_SPLIT = 0.2  # how much TRAIN is reserved for VALIDATION
DROPOUT = 0.3

# data: shuffled and split between train and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# X_train is 60000 rows of 28x28 values --> reshaped in 60000 x 784
RESHAPED = 784
#
X_train = X_train.reshape(60000, RESHAPED)
X_test = X_test.reshape(10000, RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

# normalize
X_train /= 255
X_test /= 255
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
Y_train = np_utils.to_categorical(y_train, NB_CLASSES)
Y_test = np_utils.to_categorical(y_test, NB_CLASSES)

# M_HIDDEN hidden layers
# 10 outputs
# final stage is softmax

model = Sequential()
model.add(Dense(N_HIDDEN, input_shape=(RESHAPED,)))

model.add(Dense(N_HIDDEN))
model.add(Dense(N_HIDDEN))#この行のみを増やして実験


model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))
model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=OPTIMIZER,
              metrics=['accuracy'])

callbacks = [make_tensorboard(set_dir_name='keras_MINST_V3')]

model.fit(X_train, Y_train,
          batch_size=BATCH_SIZE, epochs=NB_EPOCH,
          callbacks=callbacks,
          verbose=VERBOSE, validation_split=VALIDATION_SPLIT)

score = model.evaluate(X_test, Y_test, verbose=VERBOSE)
print("\nTest score:", score[0])
print('Test accuracy:', score[1])
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

5層目から急に精度が落ちた原因の考察がわからず悩んでいます。

層を増やすほど、調整しなければならないパラメータが増えて学習は難しくなります。

層数を増やすことによるデメリット

  • 学習するパラメータ数が多くなり、調整するためにより大量のデータが必要になる
  • 過学習が起こりやすくなり、汎化性能が落ちる
  • 勾配消失問題が起こって学習が進まなくなる
  • 計算量が増える
    etc...

なので、層を増やすほど精度が上がるというわけではありません。質問のように全結合層を重ねただけのモデルでは3層ぐらいが限界でしょう。

タスクの難しさ (MNIST は簡単) やデータ量に応じて、適した層の数というのは変わり、どのくらいがよいかは実験しなければわかりません。
今回、4層のときが一番良かったのであれば、それが適した層数だったということです。

ショートカット構造を導入した ResNet を使うと層数をもう少し増やしても学習はうまくいくかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/25 23:04

    早速のご返答ありがとうございます。
    頂いた回答を元に
    もう少し教えていただけますか。
    >学習するパラメータ数が多くなり、調整するためにより大量のデータが必要になる
    >計算数が増える
    総数を増やすことで計算量が増えることは安易に理解できます。
    それが精度低下にどの様な関係をもたらすのか知りたいです。

    >過学習が起こりやすくなり、汎化性能が落ちる
    過学習が起こっている判断はどのデータをどの様にみたらわかりますか。

    >勾配消失問題が起こって学習が進まなくなる
    これは活性化関数の勾配曲線の認識でよろしいですか。

    お手数おかけします。
    よろしくお願い致します。

    キャンセル

  • 2021/01/25 23:23 編集

    > それが精度低下にどの様な関係をもたらすのか知りたいです。

    「層数を増やすことのデメリット」として上げたので、精度低下とは関係ないです。
    計算量が増えて、学習時間が長くなるというのもデメリットではあるので挙げました。

    > 過学習が起こっている判断はどのデータをどの様にみたらわかりますか。

    訓練データに対する精度は上がっているのに、学習に使っていないテストデータ対する精度が頭打ちもしくは悪くなっていたら過学習です。

    > これは活性化関数の勾配曲線の認識でよろしいですか。

    逆伝搬時のデルタの計算は出力層から乗算していくだけなので、順伝搬時に途中の層で0もしくは小さい値が出力されていたら、勾配の値が逆伝搬途中で消失します。

    以下の記事の「勾配消失問題」の説明がわかりやすいと思います。
    たぶん、今回の質問のように精度が悪くなった一番の要因はこれじゃないかと
    https://nnadl-ja.github.io/nnadl_site_ja/chap5.html

    キャンセル

  • 2021/01/26 11:25

    記事の参照及びわかりやすい解説ありがとうございました。
    これらの情報を基にまた勉強します!

    キャンセル

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る