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

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

新規登録して質問してみよう
ただいま回答率
85.50%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

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

Q&A

解決済

4回答

526閲覧

どうやってNNが深くなるのは可能になったの?

IS.SEKI

総合スコア28

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

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

1グッド

1クリップ

投稿2018/04/07 12:49

編集2018/07/23 01:28

ある程度DNNを勉強したら、再び原点に戻ってしまいました。

深層ネットにBPすれば、入力端への誤差feedbackは信用できなくなるか、発散したり、0になったりするという話を昔から覚えております。

というのは微分定義の成立はあくまで滑らかな連続関数を条件とします。
画像のような非滑らか、非連続関数に基本は向いていませんね。
それにもかかわらず多層間微分結果を継承的に計算していくと、当然最終的にとんでもない結果になりかねません。

##じゃー、今、DNNは100層以上の実例もあって、どうやってBP問題を克服されたのでしょうか。

① weightに対する 正則化? 
norm1正則化とnorm2正則化はみなweight値を小さくする働きで、BP問題自身と数学的なつながりを感じません。

② drop out ? これは①の究極・強引的なやりかたとして見なしても良いと思います。
なので微分誤差伝播問題の解決に貢献できるのは原理的に見えません。

③ ReLU ? sigmoidより微分誤差伝播を抑制する効果があっても決定的な手になるのは信じがたいですね。 ----sigmoidのほうは超滑らか(無限微分可能)なのに。

④ 計算機の性能のアップやGPUなどの高速デバイスの利用も数学原理を変えるわけはありません。

##どうやってBP問題を克服されたのでしょうか。
解説やヒントを頂ければ、幸いと思います。

leilei👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

基本的にはReLUです。勾配消失のしようがない。もちろんちょうど0の点で微分できなくなる訳ですが、そもそも計算機でやる時点で離散値で計算してるんですから、工学的にはどうでも良いんです。
あと、画像で性能が出るようになったのはやはり畳み込みの力でしょうし、「非連続関数関数に基本は向いていない」のをカバーできるくらいたくさんのデータを突っ込んだりして汎化性能を確保できるようになったことも大切ですから、計算機の性能アップも意外と馬鹿にはできません。

追記

ちょっと古いですが、こんな解説があってわかりやすかったです。
https://www.jstage.jst.go.jp/article/jrsj/33/2/33_33_92/_pdf

事前学習(今は廃れた手法だが・・・)と畳み込みで結合が疎になるのが効いている、ということらしいです。

投稿2018/04/07 13:06

編集2018/04/07 13:32
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

【DNNの勾配(∝誤差)問題をはっきりにします】    間違ったところをご指摘下さい。

DNNのl層目においてcost Cがl層目のweightに関する勾配:
##∂C/∂w[l,j,k] = a[l-1,k]*δ[l,j]
a[l-1,k] : 前層(l-1)のunit kからの出力
δ[l,j] : 本層(l)のunit jの誤差

∴ 勾配∝誤差

勾配(∝誤差)の不安定性についてactivation関数の導関数によく注目されていますが、実は
DNNのweightにも同様に関係します。
例えば、i-層に対応するコスト関数の勾配(∝誤差)は以下のよう成分が含まれています。
---------scalar版(各層に一つunitしかない場合):
##w[i]w[i+1]...*w[N]*σ(z[i])σ(z[i+1])...*σ(z[L])
w: DNNのweight, scalar; σ: activation関数の導関数, scalar; L:総層数
なので
case 1: 各σ<1であれば、それらをたくさん掛け算すれば0に近くなるので、各wの値がよっぽど大きくなければ、式全体の値が0に近くなります ⇒ 『勾配(∝誤差)消失』問題発生。

ところが、
case 2: σ>=1 の場合も、w同士がほとんど1以下の場合、
その積がもっと1より小さいので、 ⇒ 『勾配(∝誤差)消失』問題発生。

case 3: σ>=1の場合、 w同士がほとんど1以上の場合(例えば w=10)、
すると、10層があれば W[1]w[2]...w[10] = 1010*10.... = 10^10 order ⇒『勾配(∝誤差)爆発』問題発生。

ましてや100層であれば、前端の勾配値が10^100 order になり、天文数値ですよね ⇒『宇宙爆発』

ReLUの導関数値は1であっても、そしてNNのweightに正則化をかけても、weightの値は皆1以下でなければ、
沢山の積算によって莫大な数値になるのは『必然的な』出来事で、ReLUとはそれほど関係ありません。

なので、NNの層数が多いほどfeedbackしてきた前端への勾配(∝誤差)値は0か天文数値かのような極端な値になりがちです。
これは掛け算の性質によります。
つまり、ReLUにしても, sigmoidにしても、NNの層数が多くなると、前端へfeedbackされてきた勾配(∝誤差)値0と天文数値の間で大きく振れることは
オリジナルタイプのDNNに限り、原理的に避けられません。
ReLUでなくて、ResNet 等は "本当のソリューション"かもしれません。

【ただ、偶然にも、沢山のWの値と沢山のσの値うまく組み合わせ、その積は極端的な値にならなかった場合もありましょう。】

投稿2018/04/13 03:35

編集2018/04/14 00:46
oookabe

総合スコア126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IS.SEKI

2018/04/13 15:19

丁寧なご指導ありがとうございます。
leilei

2018/04/14 04:47

勉強になりました。 掛け算の連続が経穴かな。。。 本当? そうしたら、ResNetは現在普及されています?
guest

0

①は昔からある手法で議論とされている信用割当問題や勾配消失/勾配爆発問題とは関係ないと思います。

②も①のように正則化として機能しているようですね。ResNetではBatchNormalizationをかわりに使っているようです。
ただもしかしたらですが、出力層の誤差を入力側へ伝搬するときにその誤差の責任を全部のノードが担ってしまう問題である信用割当問題に対し、dropoutのように一部のnodeを働かせないようにすることで割当を明確化できるようにしているのかもしれません

③は勾配消失問題の解決に役立っています。NNの誤差逆伝搬法は入力側へ伝搬すればするほど、出力側の勾配が蓄積されます。sigmoid関数をS(x)とすれば、誤差逆伝搬では勾配値の計算にS'(x) = S(x)(1-S(X))が使われ明らかにこれは1より小さい数値です。これが蓄積されるということは1より小さい数値が何度も掛けられるということなのでこれが勾配消失につながります。
Reluであればx>0においてその微分値は1なので勾配消失につながりません

④は本議題とは関係ないですね。NNでは多くの行列計算を行いますが、その計算速度がGPUのほうがCPUより速いというだけです。(だけ、とはいってもそれが重要なのですが)


ちなみにですが、ResNetも重要な概念の一つですので関連するpageを紹介しておきます
http://terada-h.hatenablog.com/entry/2016/12/13/192940
こちらも読んでみてください。


さらに追記するとAuto Encoderも勾配消失問題の対応策として有効だったようですね
https://deepage.net/deep_learning/2016/10/09/deeplearning_autoencoder.html
ただ100億という膨大な層につかえるかはよくわかりません。

投稿2018/04/07 13:31

編集2018/04/07 13:45
shogiOtakku

総合スコア123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IS.SEKI

2018/04/11 04:35

shogiOtakku様 いろいろとても勉強になっております。 sigmoid の勾配抑制性質:S'(x) = S(x)(1-S(X))で良く表しますね。 ただ、sigmoidのこの性質はむしろ勾配の暴走(発散・爆発)に抑制的な働きもあるのではと思います。 即ち、逆にReLUのほうは勾配の暴走を助長するかもしれませんね。どうして分類問題においてほぼ『ReLU』一辺倒になっているのでしょうか。
IS.SEKI

2018/04/11 04:40 編集

ResNetは非常に素晴らしいアイディアですが、どうしてTensorFlowのようなデファクトスタンダード とまで言われるフレームワークがそれを実装しないでしょうか。
oookabe

2018/04/11 11:32 編集

> 逆にReLUのほうは勾配の暴走を助長するかもしれませんね。 ReLUにしろ、sigmoideにせよ、宿命的に入力層に近い隠れ層に関する目標関数の勾配が不安的だと思います。 > どうして分類問題においてほぼ『ReLU』一辺倒になっているのでしょうか。 上記問題に関して『ReLU』は大した救いではないと思いますが、どうして現在『ReLU』を多用されているかどうかに関して、S'(x) = S(x)(1-S(X))が明らかに勾配を減衰する作用があるからだ、と個人想像ですけれども。 いずれ、『深層勾配問題』がこれで解決されたわけではありません。------初心者の断言
IS.SEKI

2018/04/11 14:18

mkgrei様 いつもお世話になっております。 リンク良い勉強になりました。
IS.SEKI

2018/04/11 14:26 編集

shogiOtakku様 リンク有難うございます。 ただ、残念な事に下記リンクの内容に間違いと思われるところが多かったのです。 http://terada-h.hatenablog.com/entry/2016/12/13/192940 特に、DNNにおいて勾配の発散と消失原因に関する解釈は実に "出 鱈 目" です。 ネットに勾配の発散と消失原因に関する解釈がいっぱいあるのに、その作者の怠慢さは珍しいほどです。(笑)
shogiOtakku

2018/04/11 14:28

> 即ち、逆にReLUのほうは勾配の暴走を助長するかもしれませんね。 ③の説明の続きと思って読んでいただければと思いますが、ReLUのx>0での微分値は1になります。その1を何度も掛けても1になります。なので勾配爆発を助長するものにはならないと思います(私はそのように理解しています。) --- > ResNetは非常に素晴らしいアイディアですが、どうしてTensorFlowのようなデファクトスタンダード とまで言われるフレームワークがそれを実装しないでしょうか。 Tensorflowを開発している人ではないので想像の域でしか答えられませんが、あらゆるネットワークをサポートするのはOSSのメンテナンスを困難にさせるからではないでしょうか。 普段chainerしか使わないのであまりtensorflowに詳しくないですが、DeepLearningではResNet以外にも有名なネットワークがたくさんあるにも関わらずそれを実装されていないことが多いです。(GAN, VAEとやSeq2Seqとか。exampleとして実装はされているでしょう。) またResNetに似た仕組みでUNetというのもあります。 これら全部をサポートするのは大変なので、これらの共通で使われる関数を実装するまでにしておいて、あとは使う側がその関数を使って様々なネットワークを作ればいい。 ...というスタンスなんだと思います。
mkgrei

2018/04/11 14:38

tensorflowもchainerもニューラルネットワークを実装するためのライブラリであって、具体的なネットワーク構造をそのまま提供するライブラリではありません。 model zooなどで検索するといろいろ引っかかるかと。 Reluの場合暴走し得るのは勾配ではなく出力です。
shogiOtakku

2018/04/11 14:52

mkgreiさん コメントありがとうございます。リンクの内容読みました。ReLuが注目されていなかった背景も記述されており、大変勉強になりました。 > tensorflowもchainerもニューラルネットワークを実装するためのライブラリであって、具体的なネットワーク構造をそのまま提供するライブラリではありません なるほど、確かにTensorflowのトップページにある説明に機械学習のライブラリであるとは書かれてないですね。 === TensorFlow™ is an open source software library for high performance numerical computation. Its flexible architecture allows easy deployment of computation across a variety of platforms (CPUs, GPUs, TPUs), and from desktops to clusters of servers to mobile and edge devices. Originally developed by researchers and engineers from the Google Brain team within Google’s AI organization, it comes with strong support for machine learning and deep learning and the flexible numerical computation core is used across many other scientific domains. === (https://www.tensorflow.org/ : About Tensorflowから引用)
shogiOtakku

2018/04/11 14:55

IS.SEKIさん > ただ、残念な事に下記リンクの内容に間違いと思われるところが多かったのです。 失礼しました。そういう解釈もあるかと思って読んでしました。(汗) ResNetに関しては数多くの解説記事があるので検索すればすぐに良い記事にも巡り合えます。 よければ他のResNetの記事も読んでいただければと思います。
guest

0

ベストアンサー

100層もどうやって学習させるか、というのが疑問なら、層を深くしても勾配が消えないような仕組みを入れたことが一番大きいと思います。

https://www.slideshare.net/mobile/KotaNagasato/resnet-82940994

100層も伝搬したらうまく計算できないので、ショートカットを入れています。

もちろんその分増加した計算量を実行するGPUも必要ですが。

他に段階的に層を一部固定しながら増やしていく方法もあったはずです。

投稿2018/04/07 13:15

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IS.SEKI

2018/04/11 04:41

ResNetは非常に素晴らしいアイディアですが、どうしてTensorFlowのようなデファクトスタンダード とまで言われるフレームワークがそれを実装しないでしょうか。
mkgrei

2018/04/11 09:48

tensorflowを使えばResNetを実装できますよ。
oookabe

2018/04/11 11:22

> tensorflowを使えばResNetを実装できますよ。 これはさすが、通常自分でやらないでしょう。 > kerasにはすぐに利用できるモデルまで実装されています。 助かります。
mkgrei

2018/04/11 11:39

ニューラルネットワークの適切な層の数、ノードの数は問題ごとにチューニングされるべきパラメータなので、Tensorflowを使ってResNetを実装することは不自然なことではありません。 ResNetはブロック生成を関数化してしまえば実装はそれほど難しくありません。 唯一問題があるとすればResNetは大変訓練コストの高いネットワークとして知られているためGPUをフルに週間単位で回す覚悟が必要なことでしょう。
IS.SEKI

2018/04/11 14:31

なるほど、、、 今日も大変勉強になりました! 心よりお礼を申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問