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

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

ただいまの
回答率

90.62%

  • 機械学習

    648questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • TensorFlow

    639questions

  • 深層学習

    139questions

DNNの各層のノード数と層数を決めるための指針のような物はない?

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 522

IS.SEKI

score 15

最近DNNに関して時間ある限り懸命に勉強してきたつもりですが、
まだ、基本設計でさえ分かっていないような虚しさを感じます。

例えば、最初は何に基づいて、DNNの各層のノード数と層数を決めるのでしょうか。
tuning必要があると分かりますが、層数と各層上のノード数はそれぞれ莫大で、
全組み合わせで試すのは不可能ですね。
基本的な構成はないでしょうか。
そしてその基本的な構成は訓練用のサンプルとは関係あるでしょう。

このような実用的な話があまり議論されていないような感じです。

情報有れば是非ご提供いただきたいです

(単刀直入、明瞭明快なものが理想です)

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

単純なものだと、過去に性能が良いと言われているネットワーク構造を使うことですね。

例えば、AlexNetなど。


ノードを増やすと、教師データの学習度合いがよくなっていきます。
ここですでに精度が出ないなどとなるとお話にならないので、過学習覚悟でノードを増やします。

深くしていくのであれば、途中で初期の入力を合流させたり。

とりあえず教師データをそれなりに学習できるようにしてから、過学習を抑えるようにします。
Dropout層を入れたり、ボトルネックとなるような層を入れたりします。

ここまでやればデータの学習しやすさなどについて感覚がつかめるかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/19 11:02

    > ノードを増やすと、教師データの学習度合いがよくなっていきます。
    『ノードを増やす』とは「各層の面積を増やす」事を指されていますか、
    それとも層数を増やすというのでしょうか。

    キャンセル

  • 2018/04/19 11:04

    各層のノード数を増やすことです。

    層数は容易には増やせません。
    学習の雰囲気が大きく変わります。

    キャンセル

  • 2018/04/19 19:45 編集

    先ずは過学習ができるかどうかですね。【金言】
    これは基本だ、とよく理解できます。
    きちんと学習さえできなければ、話がなりませんから。
    それから『汎化性』を調整していくわけ( 好きなように)。

    そして、層数を変えたら、もう、、、想像できますね。

    キャンセル

  • 2018/04/19 19:58

    > そして、層数を変えたら、もう、、、想像できますね。

    話の流れから結論が読みきれませんでしたが、層数をいたずらに増やすと学習ができなくなっていきますね。

    キャンセル

  • 2018/04/19 22:45 編集

    皆さん有難うございます。
    考え方は分かりましたが、自分の認識では層のノード数(neuron)は
    入力画像によって決められるもんで、自在に増やしたり減らしたりするのができるのでしょうか。
    そして、もし各層のノード数を強引に元の入力画像のサイズより大きくすれば、所謂『wide』DNNになるのでしょうか。
    (以前DNNがdeepのほう有利か、wideのほうが有利かという論争があったような記憶ありますが)

    キャンセル

  • 2018/04/19 23:53

    ノード数というものと、伝搬していくデータそのものを勘違いしていませんか。(特に畳み込みの場合)
    畳み込み層のカーネルの枚数は好きなだけ増やせますし、入力画像によりません。(入力画像のサイズよりも大きくなりません)
    分類問題であれば一度FlattenしてからDense層を通すので、そのときにノードの数を好きなものにできます。(経験上Flattenした直後の次元よりもDense層のノード数を大きくすることは珍しいと思います。MaxPoolingしまくって、1x1x128とかになっていなければ…)

    1000クラスの分類でも4056x4056x4056で十分学習できますし、それを1024x128x1024にすることで無理やり圧縮をかけることもできます。

    Deepの方が圧倒的に学習させることが難しく、複雑な関係性を持って過学習するし学習コストも高いです。
    Wideの方は一度過学習し始めると、あからさまにテストスコアが下がる傾向にあります。

    Wideにするとノードを減らすことで次元削減の要領でテストスコアを上げることが容易です。
    Deepだと、思考停止して学習をうまくさせるためには、入力データを再合流させれば良いのですが、精度の向上は僅かであり、はっきりと過学習しかしておらず、層数を増やした後に減らすご利益を見出すことが難しいです。
    ResNetなどを見ると、層の数を増やしたまま、BatchNormalizationなどのテクニックを使って過学習を抑制します。(リソースと経験が必要です)

    いずれのケースも、想像することは不可能なので、実際にやってみて感覚をつかむしかないと思います。

    キャンセル

  • 2018/04/20 12:37

    mkgreiさん
    貴重な経験談ありがとうございます。
    見識の高さに感服!

    キャンセル

  • 2018/04/20 15:58 編集

    > Wideにするとノードを減らすことで

    すみません。自分のイメージとして、
    wideとはDNNの各層にneuron/ノードを「増やす」ということですが、 違うんでしょうか。

    それとも、層数の少ない複数のCNNを並列に構成し、各CNNの最終出力をまとめて直列化(flatten)して、全連結層(dense層)に繋ぐというやりかたでしょうか。

    どうぞ宜しくお願い致します。

    キャンセル

  • 2018/04/20 18:35

    わかりにくい表現になってしまい申し訳ありません。

    wideにして過学習したモデルに対して、今度はノードを減らすことで…
    という意味です。

    キャンセル

  • 2018/04/21 20:04 編集

    本当にありがとうございます。

    キャンセル

+1

実装経験が、業務システムのデータを使ったclassificationやregressionだけと少し偏った経験ですが、(1)ノードを増やすほど高次な関数を表現できる、(2)層を深くすると複数の線を重ねないと実現できないような複雑なもの(例えば排他論理和・円の内側と外側)を表現できる、と理解しています。

そのため、識別モデルの実装の際は、
1)とりあえず、特徴量の次元削減して2次元にプロット
2)心の目で結果を眺め、高次の関数になりそうであれば、その次元数(極大値・極小値の数)を数える。
3)同様に飛び地になりそうな部分の数を数える。
4)項番2)の10倍~20倍をノード数に、項番3)に+1~2したものを階層数にして学習
5)結果を見ながらチューニング(基本、多めにしているつもりなので減らす方向)
という手順で行っています。

画像の場合は、上記のような話に行く前の畳み込み層などの前処理部分をどうするかを考える必要があります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/20 10:52

    R.Shigemori様
    ご教授有難うございます。
    非常に勉強になりました。

    キャンセル

  • 2018/04/20 11:05 編集

    大変大切な話だと思いますが、下記2点についてもう少しご説明頂ければ幸いです。

    > 2) その次元数(極大値・極小値の数)を数える
    (↑どうして関数の「次元数」と「極値数」と同列にされたかという)

    > 1) 特徴量の次元削減して2次元にプロット

    これは自分にとって至難な技ですね。
    数十次元の特徴量vectorを (x,y)座標平面へ射影するという話でしょうか。
    何か良い方法あれば、是非お願い致します。

    キャンセル

  • 2018/04/21 06:46

    > どうして関数の「次元数」と「極値数」と同列にされたか

    数学的にいうと、全ての関数は高次の多項式(a1*x^n+a2*x^(n-1)+…an*x^0)で近似できることがわかっています。これを1次関数の形で近似させようとすると、ノード数を増やすとうまくいきます。
    ここからは理論的にでもなんでもないのですが、より高次である(極値が多い)であれば、それに従ってノード数を増やしたほうがうまく、正負が逆転する状況をうまく表現できるのではないかと考えた次第です。実際には、ノード数2でも3次の多項式くらいであれば近似できますし、確率密度関数のような数式的には複雑なものでもそれほどのノードは必要ありませんでした。
    ただ、ノードが多すぎると過学習になることはあっても未学習にはならないだろうとの判断のもと、次数とノード数を基準に考えています。

    > 数十次元の特徴量vectorを (x,y)座標平面へ射影するという話でしょうか
    その通りです。
    この段階では、モデルの形状のあたりを付けるという目的なので深く考えることはしません。問題の前提が業務システムが保有するデータを使ったClassificationなので、何となくそれらしくなったのかもしれません。このあたりはいろいろと手を動かすことが答えの近道かと思います。

    キャンセル

  • 2018/04/21 19:59

    なるほど、、、大変勉強になりました!
    本当に有難うございます。

    キャンセル

  • 2018/04/21 20:13 編集

    NOTE:
    ちょっと『次元数』という言葉に惑わされました。
    前文中の『次元数』➡『次数』に修正すべき。
    次数(order) ≠次元数 (dimension)
    要は、
    回帰しようとする関数の”次数”が高いほど、極値点も多くなり、形状が複雑です。
    形状の複雑な関数を精確にfittingするために、NNの係数・ノード数を増やさないと学習能力が足りない。

    キャンセル

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

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

関連した質問

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

  • 機械学習

    648questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • TensorFlow

    639questions

  • 深層学習

    139questions