「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>深層学習(deep learning)]]
--[[パーセプトロン]]
--ニューラルネットワーク
---[[ニューラルネットワーク(推論)]]
---[[ニューラルネットワーク(学習)]]

*目次 [#x49ef019]
#contents

*概要 [#rfb3c4eb]

**モデル [#s6da2326]
-脳機能に見られるいくつかの特性に類似した数理的モデル(確率モデルの一種)

-シナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、~
学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般。

-実際に生物の神経系のシミュレーションであるか否かについては~
議論があるため人工ニューラルネットワークなどと呼ばれることもある。

**学習 [#ta24af9c]

***ニューラルネットワークは、 [#j8a912c6]

-ネットワークにループする結合を持たず、

--単一方向へのみ信号が伝播する。
 第0層        第1層          第2層~
 入力層 → 中間層(隠れ層) → 出力層

--機械学習の、
---学習フェーズでは、信号は逆方向に伝播する。
---推論フェーズでは、信号は順方向に伝播する。

-≒ 多層[[パーセプトロン]]

--[[パーセプトロン]]では、[[活性化関数>#m155734b]]にStep関数(段階関数)を使用していたが、~
ニューラルネットワークでは、これ以外の[[活性化関数>#m155734b]](Sigmoid関数、ReLU関数)を使用する。

--線形の座標変換(アフィン変換)をしたモノに対して~
目盛の振り直しを行い新しい非線形の座標系を作る。~
「重み」によって「新しい非線形の座標系」が変わる。

--参考
---ニューラルネットワークと深層学習~
 CHAPTER 4 ニューラルネットワークが任意の関数を表現できることの視覚的証明~
 https://nnadl-ja.github.io/nnadl_site_ja/chap4.html

*** 「重み」のパラメタの決定 [#a107ff3e]
- 「重み」のパラメタ(w1, w2, θ(-b))の決定は人手によって行われる。~
という問題を、データから自動で「重み」のパラメタを学習することで解決する。

-ニューラルネットワークとは[[微分>DS:数学的基礎 - 微分・偏微分]]可能な変換が幾つも連なってできた~
一つの大きな合成関数で、この[[微分>DS:数学的基礎 - 微分・偏微分]]は逆伝播の[[連鎖律>DS:数学的基礎 - 微分・偏微分#yf458e25]]で計算できる。

-従って、ネットワーク構造が複雑であっても、合成関数を構成する個々の変換が[[微分>DS:数学的基礎 - 微分・偏微分]]可能であれば、~
[[勾配法>ニューラルネットワーク(学習)#v7a3cd9d]]によって[[目的関数(損失関数)>ニューラルネットワーク(学習)#l7995afd]]を最適化することで(収束するかどうかは別にして)求めることが出来る。

**構造 [#yc7e37b6]

***第0層(入力層 [#b6e78f8d]
そのままの値を出力(出力に重みを掛けられる。

***第1層(中間層(隠れ層 [#i02c345d]
-入出力変換後、重みを掛けて多分岐。
-以下のような関数を使用できる。
--任意の実数を非線形に変換出来る関数
--[[誤差逆伝播法>深層学習の誤差逆伝播法]]を用いるため[[微分>DS:数学的基礎 - 微分・偏微分]]できる関数

***第2層(出力層 [#r4c3a636]
-0、1の間の値に変換(全部の和が1となるように正規化する場合もある
-これには[[Sigmoid関数またはSoftmax関数>ニューラルネットワーク(推論)#p221ffd8]]が必要。

***誤差の計算と重みの更新 [#ncec156b]
出力と教師信号の誤差の計算をし、~
2→1→0層と層の重みを更新していく([[誤差逆伝播法>深層学習の誤差逆伝播法]])

*数学的に [#c3d14236]

**関数 [#e0977af7]
関数はニューラルネットワーク全体で1つの関数、個々の合成関数。
-(x) → (z) → (w) → (p)
-◯ → ◯ の「→」の部分が関数と重み(重みは入力に掛ける値)
 (x) ─ f1(x1, x2, x3, ...) → (z) ─ f2(z1, z2, z3, ...) → (w) ─ f3(w1, w2, w3, ...) → (p)

**特徴 [#lb6dc6f4]
-複雑性(表現力)、計算可能性

-深くする(p=fn(...f3(f2(f1(x)))...)と~
少ないパラメタで複雑(≒ 高次)な関数を作れる。

--1次関数だと複雑にならない。
--2次関数だとパラメタが多過ぎ。
--非線形なΦ([[活性関数>#m155734b]])に1次関数(w1x1+w2x2+w3x3+...+b)を入力
 z1 = Φ1(w11x1 + w12x2 + w13x3 + ... + b1)
 z2 = Φ1(w21x1 + w22x2 + w23x3 + ... + b2)
 ...
 zn = Φ1(wn1x1 + wn2x2 + wn3x3 + ... + bn)

**計算 [#r8277172]

***入力層~中間層の [#v87d7f9e]
上記を行列計算に出来る。

-[[オンライン>ニューラルネットワーク(学習)#h15bc15d]]
 (t1,t2,t3,t4) = (x1,x2,x3,x4)┌w11,w12,w13,w14┐ + (b1,b2,b3,b4)
                              │w21,w22,w23,w24│
                              │w31,w32,w33,w34│
                              │w41,w42,w43,w44│
                              │w51,w52,w53,w54│
                              └w61,w62,w63,w64┘
 (z1,z2,z3,z4) = Φ((t1,t2,t3,t4))

-[[バッチ(サイズ3>ニューラルネットワーク(学習)#h15bc15d]]
 ┌t11,t12,t13,t14┐   ┌x11,x12,x13,x14┐┌w11,w12,w13,w14┐   ┌b1,b2,b3,b4┐
 │t21,t22,t23,t24│ = │x21,x22,x23,x24││w21,w22,w23,w24│ + │b1,b2,b3,b4│
 └t31,t32,t33,t34┘   └x31,x32,x33,x34┘│w31,w32,w33,w34│   └b1,b2,b3,b4┘
                                          │w41,w42,w43,w44│
                                          │w51,w52,w53,w54│
                                          └w61,w62,w63,w64┘

 ┌z11,z12,z13,z14┐      ┌t11,t12,t13,t14┐
 │z21,z22,z23,z24│ = Φ(│t21,t22,t23,t24│)
 └z31,z32,z33,z34┘      └t31,t32,t33,t34┘

***出力層と誤差計算 [#wf84c90c]

-出力層~
[[分類問題の場合、Softmax関数>ニューラルネットワーク(推論)#b77bdfd7]]~
以下は、2値分類の例

--オンライン
 softmax((p1,p2)) = (f1,f2)

--バッチ
         ┌p11,p12┐    ┌f11,f12┐
 softmax(│p21,p22│) = │f21,f22│
         └p31,p32┘    └f31,f32┘

-誤差計算~
[[分類問題の場合、交差エントロピー誤差>ニューラルネットワーク(学習)#l7995afd]]~
以下は、2値分類の例

--オンライン
 cross_entropy_error((f1,f2)) = (l1,l2)

--バッチ
                     ┌f11,f12┐    ┌l11,l12┐
 cross_entropy_error(│f21,f22│) = │l21,l22│
                     └f31,f32┘    └l31,l32┘

*活性化関数 [#m155734b]
-各層の出力する前に、出力結果をどの程度活性(発火)させるかを決める関数。

-ニューラルネットワークでは、非線形な関数を使用する必要がある。
--線形関数を用いてはならないのは、多層化の意味が無くなるため。
--例 : 線形な h(x) = cx を多層化しても h(h(h(x))) = cccx となり1層で表現可能。

-[[Step関数>#af597062]]、[[Sigmoid関数>#u0ac8472]]、[[tanh関数>#x6c1dfdf]]、[[ReLU関数>#x80775f2]]がある。

-また、[[出力層の活性化関数>#zdf50e01]]には、[[Sigmoid関数>#ec8f2917]]には、[[Softmax関数>#l7dbdd2e]]がある。

-しかし、最近は、[[勾配消失問題>#id252e38]]を防ぐ[[ReLU関数の利用が主流>#n19e1e4d]]になっている。

**[[Step関数>#af597062]]と[[Sigmoid関数>#u0ac8472]] [#k013dfd1]

***共通点 [#r05f83c6]
-[[微分>DS:数学的基礎 - 微分・偏微分]]可能な非線形な関数
-0 <= 出力信号 <= 1 に収める。
-入力信号が重要な時に1(に近い)、重要でない時0(に近い)値を返す。

***相違点 [#i93fc337]
-[[Step関数>#af597062]]:0, 1の信号
--単純パーセプトロンの活性化関数はStep関数。
--ある閾値を超えたら「1」、それ以外は「0」を返す関数。

-[[Sigmoid関数>#u0ac8472]]:連続的な実数の信号
--[[出力層の活性化関数>#ec8f2917]]として使われていたが転用。
--[[微分>DS:数学的基礎 - 微分・偏微分]]可能で[[誤差逆伝播法(バックプロパゲーション)>深層学習の誤差逆伝播法]]が可能だが、[[勾配消失問題が起こる。>#id252e38]]

**Step関数 [#af597062]
 f(x) = 1 (x ≧ 0)
 f(x) = 0 (x < 0)

***実装 [#jeb6ec06]
なんとなくAPI仕様を知らないと難しい感じ。

-パターン1
 """This is a test program."""
 
 import numpy as np
 
 def step_function(x_1):
     """This is a test program."""
     y_1 = x_1 > 0
     return y_1.astype(np.int)

-パターン2
 """This is a test program."""
 
 import numpy as np
 
 def step_function(x_1):
     """This is a test program."""
     return np.array(x_1 > 0, dtype=np.int)

※ 0、1を真偽のキャストで返しているのがトリッキーだよ。

***グラフ [#m668ff44]
-5.0 ~ 5.0までの0.1刻みのプロットをStep関数にかけてグラフ化する。

 """This is a test program."""
 
 import numpy as np
 import matplotlib.pylab as plt
 
 def step_function(x_1):
     """This is a test program."""
     # 上記のいずれかの実装を選択。
 
 X = np.arange(-5.0, 5.0, 0.1)
 Y = step_function(X)
 plt.plot(X, Y)
 plt.ylim(-0.1, 1.1)  # 図で描画するy軸の範囲を指定
 plt.show()

#ref(step_graf.png,left,nowrap,step関数グラフ,60%)

**Sigmoid関数 [#u0ac8472]
もともと[[出力層の活性化関数>#ec8f2917]]から転用されたものなので詳細はそちらを参照。

-式
 f(x) = 1 / (1 + e^-x)
 
               1
 h(x) = ────────
         1 + exp(-x)

-特徴

--exp(-x)とは、eの-x乗を意味し、eは[[ネイピア数>DS:数学的基礎 - 微分・偏微分#adabdb73]](2.7182)の実数を表す。

--[[微分>DS:数学的基礎 - 微分・偏微分]]値は、以下の式で表され、最大勾配はX=0の時でf(0)=0.5なので0.5(1-0.5)=0.25
  f'(x) = f(x)(1-f(x))

--最大勾配は0.25で[[勾配消失問題>#id252e38]]を引き起こし易い(昔の勾配消失の主因)。

***実装 [#ta9e2a1c]
ポイントは、Pythonのブロードキャストによって配列も計算できる点。

 """This is a test program."""
 
 import numpy as np
 
 def sigmoid(x_1):
      """This is a test program."""
     return 1 / (1 + np.exp(-x_1))   

***グラフ [#z4a69601]
-5.0 ~ 5.0までの0.1刻みのプロットをSigmoid関数にかけてグラフ化する。

 """This is a test program."""
 
 import numpy as np
 import matplotlib.pylab as plt
 
 def sigmoid(x_1):
     """This is a test program."""
     return 1 / (1 + np.exp(-x_1))
 
 X = np.arange(-5.0, 5.0, 0.1)
 Y = sigmoid(X)
 plt.plot(X, Y)
 plt.ylim(-0.1, 1.1)
 plt.show()

#ref(sigmoid_graf.png,left,nowrap,sigmoid関数グラフ,60%)

***温度パラメタ [#dc2ee3c2]
-上記は標準Sigmoid関数で、温度パラメタ = 1の場合。
-一般的なSigmoid関数は以下の温度パラメタの逆数aを使って表現される。
-正確には、温度パラメタは Tnで、a = 1/Tn、Tn = 1/a となる。

-式
 f(x) = 1 / (1 + e^(-x * a))
 
               1
 h(x) = ────────
         1 + exp(-x * a)

-実装
 """This is a test program."""
 
 import numpy as np
 
 def sigmoid(x, a):
      """This is a test program."""
     return 1 / (1 + np.exp(-x * a)) 

-形状の変化
#ref(温度パラメタ.png,left,nowrap,温度パラメタ,60%)

**tanh関数 [#x6c1dfdf]
-tanh(Hyperbolic tangent function)関数、双曲線正接関数

-式
 f(x) = (e^x - e^-x) / (e^x + e^-x)

-特徴

--あらゆる入力値を-1.0~1.0の範囲の数値に変換して出力する関数である。

--[[Sigmoid関数>#u0ac8472]]より勾配消失に強い。

---[[微分>DS:数学的基礎 - 微分・偏微分]]値は、以下の式で表され、最大勾配はX=0の時でf(0)=0なので (1.0 - 0.0^2) = 1.0
 f(x)' = 1 - f(x)^2

---最大勾配は[[Sigmoid関数>#u0ac8472]]が0.25、tanh関数が1.0なので、[[勾配消失問題>#id252e38]]を引き起こし難く、学習をより高速化させる。

---ただ、それでも[[勾配消失問題>#id252e38]]は発生する(非常に深いネットワークでは[[勾配消失問題>#id252e38]]は防ぎ難い)

***実装 [#cdef2624]
 def tanh(x):
     y = np.tanh(x)
     return y

***グラフ [#z6d84270]
 x = np.arange(-10.0, 10.0, 0.1)
 y = tanh(x)
 plt.plot(x, y)
 plt.ylim(-1.2, 1.2)
 plt.show()

#ref(tanh_graf.png,left,nowrap,tanh関数グラフ,60%)

**ReLU関数 [#x80775f2]
-ReLU(Rectified Linear Unit)関数、正規化線形関数

-式
 f(x) = x (x ≧ 0) → 傾き 1
 f(x) = 0 (x < 0)  → 傾き 0
 
            ┌
            │0 ( a <= 0 )
 y = h(a) = <
            │a ( a > 0 )
            └

-特徴~
勾配消失問題を防ぐ関数として主流。
--入力 x が0を超えていれば x をそのまま出力する。(傾き 1)
--入力 x が0以下なら0を出力する。(傾き 0)

***主流 [#n19e1e4d]
-最近の主流。

-その理由は、

--[[Sigmoid関数>#u0ac8472]]の利用は
---...ロジスティック回帰などの名残
---...[[勾配消失問題>#id252e38]]を引き起こす問題がある。

--ReLU関数

---...は[[勾配消失問題>#id252e38]]を緩和できる。~
・[[微分>DS:数学的基礎 - 微分・偏微分]]結果が 0 or 1 なので、~
・ただし、0(の時は)では学習が上手くいかない。

---...は非常にシンプルで学習時間が短縮される。

***実装 [#ia060830]
np.maximumとか知らんわwと思ってググると、大きい方を返すと。~
(つまり、xが、0以下のときは0が返り、0以上になるとxの値が返る。)

 """This is a test program."""
 
 import numpy as np
 
 def relu(x_1):
     """This is a test program."""
     return np.maximum(0, x)  

***グラフ [#u3fb9dae]
-5.0 ~ 5.0までの0.1刻みのプロットをReLU関数にかけてグラフ化する。

 """This is a test program."""
 
 import numpy as np
 import matplotlib.pylab as plt
 
 def relu(x_1):
     """This is a test program."""
     return np.maximum(0, x_1)
 
 X = np.arange(-5.0, 5.0, 0.1)
 Y = relu(X)
 plt.plot(X, Y)
 plt.ylim(-0.1, 5.1)
 plt.show()

#ref(relu _graf.png,left,nowrap,ReLU関数グラフ,60%)

**ReLU派生系 [#v32e29fb]

***Leaky ReLU関数 [#g0fbb6fb]
-式
 f(x) = x (x ≧ 0)
 f(x) = αx (x < 0)(※αは0.01)

-特徴
--x < 0において、僅かな傾きをもっている。
--[[微分>DS:数学的基礎 - 微分・偏微分]]値が0になることはなくなり、ReLUよりも[[勾配消失問題>#id252e38]]を引き起こし難い。

-実装~
np.where は三項演算子のベクトル版
 def leaky_relu(x, alpha=0.01):
     y = np.where(x > 0, x , alpha * x)
     return y

-グラフ~
 x = np.arange(-5.0, 5.0, 0.1)
 y = leaky_relu(x, alpha=0.1)
 plt.plot(x, y)
 plt.ylim(-1.0, 5.5)
 plt.show()

#ref(leaky_relu_graf.png,left,nowrap,Leaky ReLU関数グラフ,60%)

***Parametric ReLU [#x4ff8ba6]
LeakyReLU のく 0 部分の直線の傾きを「学習によって最適化」

***Randomized ReLU [#he721188]
LeakyReLU のく 0 部分の直線の傾きを「ランダムに試す」

**その他の活性化関数 [#h0b6ca65]

***Absolute value rectification [#zfbc2470]
主に物体認識に使用されている。

 def abs_relu(x):
     return np.abs(x) 

***Maxout関数 [#u8daadfb]
-ReLUをさらに一般化した関数
--ReLUの2つの定義域をK個に拡張し、領域毎に異なる関数を用意。
--区分線形凸関数を学習する(=活性化関数自体を学習する。
--kが十分大きければどんな凸関数も任意の精度で近似できる。

-[[Dropout>深層学習のテクニック#hf3c7a28]]と組み合わせることで高い精度が得られる。

***GELU関数 [#pc64efce]
GELU(Gaussian Error Linear Units)は、OpenAI GPTやBERTで使われている。
GELU(Gaussian Error Linear Units)は、GPTやBERTで使われている。

**出力層の活性化関数 [#zdf50e01]

***[[恒等関数>ニューラルネットワーク(推論)#u6563984]] [#u172f066]

***[[Sigmoid関数>ニューラルネットワーク(推論)#qc025e6f]] [#ec8f2917]

***[[Softmax関数>ニューラルネットワーク(推論)#b77bdfd7]] [#l7dbdd2e]

*推論と学習 [#jae09dd6]
**[[ニューラルネットワーク(推論)]] [#raaefcbb]
**[[ニューラルネットワーク(学習)]] [#u323c180]
***[[深層学習の誤差逆伝播法]] [#c4daa80e]
***[[深層学習のテクニック]] [#j9845af7]

*ニューラルネットワークの問題点 [#s191b3fd]

**出力の分布 [#hdea3b9f]
***[[重みの初期値>深層学習のテクニック#o35805ae]] [#e535a31d]
***[[バッチ正規化>深層学習のテクニック#t3c6ab88]] [#mac7d9f2]

**[[過学習>機械学習(machine learning)#l377f5cd]]を起こし易い [#c342ee03]

***概要 [#ff142863]
-従来手法よりも過学習を起こし易い。
-データサンプルは、パラメータの10倍あると良い。
-少ないデータ量でもできるだけ性能を落とさずに済むような工夫が新たに必要。

***[[解決>深層学習のテクニック#f5d40509]] [#cb59f056]

***実装 [#l1e59d85]
-[[DNNの場合、>データマイニング(DM)- Python - DL#c8642902]]
-[[CNNの場合、>データマイニング(DM)- Python - CNN#yb34decb]]

**学習率の調整が難しい [#za4d873f]

***概要 [#o020c2dd]
学習率とは、

-一回の学習でどれだけ学習るか?~
=どれだけパラメタ更新するか?で、

-学習率が従来の機械学習の手法よりも大きく影響する。

-学習率が

--学習率が適切な場合、~
スムーズに学習が進行する。

--小さ過ぎると
---収束後は安定するものの、
---収束までに時間がかかり過ぎる。

--大き過ぎると
---素早く学習官僚するものの、
---発散(≒ 極小値周辺を行ったり来たり)する。
---著しく大きい場合、学習するほど誤差が増える。

***解決 [#tde6b511]
-調整

--一般的に、10^-1(0.1)~10^-6(0.000001)の間で調整。

--もしくは、学習率が自動調整されるような工夫がある。

**勾配消失問題が起こる [#id252e38]
[[誤差逆伝播法>深層学習の誤差逆伝播法]]の計算において入力層に近い手前の層まで学習が行き渡らなくなる現象

***理由 [#nba07422]
-[[誤差逆伝播法>深層学習の誤差逆伝播法]]では奥にある出力層から、手前にある入力層へ順番に伝わる。

-[[活性化関数>#m155734b]]に[[Sigmoid関数>#u0ac8472]]を使用する場合、
[[微分>DS:数学的基礎 - 微分・偏微分]]値が最大でも+0.25

-勾配の値は層を遡るほど[[連鎖律>DS:数学的基礎 - 微分・偏微分#yf458e25]]で1未満の値のかけ算する回数が増え小さくなる。

-このため、
--手前の層ほど学習の際に用いる勾配の値が小さくなり、
--手前の層ほど十分なパラメタの更新ができなくなる。

***解決 [#rc251dad]
-一時的に、[[事前学習>深層学習のテクニック#ebe9edcc]]と[[ファイン・チューニング>深層学習のテクニック#ea94272b]]の方法で解決した。

-その後、

--[[活性化関数>#m155734b]]を[[Sigmoid関数>#u0ac8472]]から[[ReLU関数>#n19e1e4d]]に変更、

--[[ドロップアウト(Dropout)>#cb59f056]]

--[[バッチ正規化(Batch Normalization)>#cb59f056]]

--[[ResNetのSkip Connectionで残差学習>畳み込みニューラルネットワーク(CNN)#z4eca8cf]]

--ハードウェア性能の向上([[CPU、GPU、TPU>深層学習(deep learning)#f674295b]])

>により([[事前学習>深層学習のテクニック#ebe9edcc]]と[[ファイン・チューニング>深層学習のテクニック#ea94272b]]を用いず、)全体の学習ができるようになった。

*ニューラルネットワークの色々 [#p7254b04]

**一般的なフツーのニューラルネットワーク [#i29bfc40]

***順伝播型ニューラルネットワーク(FNN) [#mcd402f7]
(Feedforward Neural Network: FNN)

-[[DNN>#ge448516]]や[[CNN>#fb7864bd]]などは、FNNになる。
-多分、[[RNN>#sa1d8d21]]の登場で出来た区分

***ディープニューラルネットワーク(DNN) [#ge448516]
(Deep Neural Network: DNN)

DNNの説明は[[本項>ニューラルネットワーク]]で行われています。

-ニューラルネットワーク内の層が多層(ディープ)化されている仕組み

-DNNを用いた近似は、非線形関数である活性化関数を何層にも~
組み合わせることで多種・多様な強い表現力を獲得することが可能

-線形の座標変換(アフィン変換)をしたモノに対して目盛の振り直しを行い、新しい非線形の座標系を作る。~
"重み"によって"新しい非線形の座標系"を変えることで、現象を高次元の関数で近似することが出来る。

***[[畳み込みニューラルネットワーク(CNN)]] [#fb7864bd]

**[[再帰型ニューラルネットワーク(RNN)]] [#sa1d8d21]
***[[長短期記憶ニューラルネットワーク(LSTM)]] [#o836d6ff]
***[[RNN Encoder-Decoder(Sequence-to-Sequence)]] [#r88c8251]

**[[生成モデル>機械学習の理論#p3f4e303]]系の[[ニューラルネットワーク]] [#ff89dd92]
***[[自己符号化器(AE:オートエンコーダ)]] [#l7546f0f]
***[[敵対的生成ネットワーク(GAN)]] [#b6b45e6b]

**制限ボルツマン・マシン(RBM) [#s93fc300]

***特徴 [#b22f8346]
-Restricted Boltzmann Machine

-ボルツマン・マシンは変数の組合せが~
どのような頻度で出現するかを確率分布で表現する。

-深層信念ネットワーク(2006, ジェフリー・ヒントン)
--AEに「制限付きボルツマンマシン」と言う手法を用いる。
--積層AEと同様に[[事前学習>#n519f0fb]]を用いた手法

***RBMでできること [#z6579cd2]
-音声認識ソフトウェアの性能の向上

**3D DNN [#lb526a13]

***アプローチ [#h628165c]
-2Dベースのアプローチを結集する2D based approach
--Complex YOLO
--YOLO 3D

-点群NNを適応するPoint cloud based approach
--PointNet
--PointNet++
--VoteNet

-画像から得た結果と点群NNをフュージョンするアプローチ
--Frustrum PointNets

-点群NNで点群を前処理(エンコード)した後に~
2Dベースのアプローチを適応するPointCloud+2Dアプローチ
--VoxelNet
--Pointpillars

***[[点群データ>画像処理とコンピュータビジョン#g606d9ca]] [#d0499245]
-順不同なデータ構造
-非自明な隣接関係(畳み込み
-回転・並進の取り扱いが難しい

***3D DNNでできること [#n7e966ed]
-[[物体検出>画像処理とコンピュータビジョン(AI)#j5d31a6f]]
--VoxelNet
--VoteNet

-[[領域検出>画像処理とコンピュータビジョン(AI)#o768dc51]]~
...

-[[特定物体検出>画像処理とコンピュータビジョン(AI)#d53f797d]]~
...

-把持位置検出~
PointNetGPD

**深層Qネットワーク(DQN) [#d10f2743]
(Deep Q-Network: DQN)


***特徴 [#t838a0a8]
-[[強化学習>機械学習(machine learning)#nbbca2a2]]に[[深層学習>深層学習(deep learning)]]を適用し成功した一つの例
--[[深層強化学習>機械学習(machine learning)#s6c0e580]]のアルゴリズム
--[[強化学習>機械学習(machine learning)#nbbca2a2]]の構造中に[[ニューラルネットワーク]]を埋め込む。
--連続値の行動とそれに伴う高い報酬(Q)が得られるように学習する。

-Q学習と呼ばれるアルゴリズムに基づいており、
--行動価値関数 Q (s,a) (状態sで行動αを選び、その後方策に従った場合の期待累積報酬r) を真の価値関数に近づけるように更新していく。
--価値関数をDNNにより近似する手 法はDQNが登場するよりも古くから提案されていたが、学習が不安定と言う課題に取り組んだ点がDQNの貢献。

-DQNが解決に取り組んだ学習の不安定化要因は大きく3つ

--入力データが時系列データであり、入力データ間に独立性がない。
---DQNでは「Experience Replay」を適用した。 
---エージェントが経験した状態 行動 報酬遷移 先は一旦メモリに保存される。 
---損失の計算を行う際には、メモリに保存した値からランダムサン プリングを行う。

--価値関数が小さく更新されただけでも方策が大きく変わってしまう。
---DQNでは「Target Q-Network」を適用した。 
---学習の目標値の計算に用いる価値関数を一定期間の学習の間、固定する。
---一定期間の学習の間、価値関数ネットワークのパラメタを固定し、一定周期でこれを更新する。

--与えられたタスクによって報酬のスケールが大きく異なる。
---DQNでは「報酬のクリッピング」を適用した。 
---報酬の値を [-1, 1] の範囲に制限することで学習を安定させる。
---報酬の大小を区別できなくなるデメリットはあるものの学習が安定するメリットのは大きい。

***DQNでできること [#y5450203]
[[深層強化学習の事例>機械学習(machine learning)#s6c0e580]]を参照。

*参考 [#w2783425]
-機械学習・深層学習についてのレポート~
https://www.osscons.jp/joho108j0-537/#_537

**Wikipedia [#r61af4f5]
-ニューラルネットワーク~
https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF

-畳み込みニューラルネットワーク~
https://ja.wikipedia.org/wiki/%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF

-敵対的生成ネットワーク~
https://ja.wikipedia.org/wiki/%E6%95%B5%E5%AF%BE%E7%9A%84%E7%94%9F%E6%88%90%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF

**YouTube [#na0a1f80]

***[[深層学習、DNN>深層学習(deep learning)#y1f8375e]] [#l4c209c6]

***[[RNN、CNN、>深層学習(deep learning)#y1f8375e]] [#n232e28e]

***, etc. [#m260a2f3]

**Blog [#ie06e871]

***Neural networks and deep learning [#jfc150a0]
-ニューラルネットワークと深層学習~
https://nnadl-ja.github.io/nnadl_site_ja/
--ニューラルネットワークを用いた手書き文字認識~
https://nnadl-ja.github.io/nnadl_site_ja/chap1.html
--逆伝播の仕組み~
https://nnadl-ja.github.io/nnadl_site_ja/chap2.html
--ニューラルネットワークの学習の改善~
https://nnadl-ja.github.io/nnadl_site_ja/chap3.html
--ニューラルネットワークが任意の関数を表現できることの視覚的証明~
https://nnadl-ja.github.io/nnadl_site_ja/chap4.html

***mizu-mi blog [#mdf23d5d]
-ニューラルネットワークの表現力を確かめる~
https://mzmlab.hatenablog.com/entry/neural-regress
-ニューラルネットワークと最小二乗法の違いについて考えてみた~
https://mzmlab.hatenablog.com/entry/neural-regress-sinc


**ゼロから作るDeep Learning [#w79e9c10]
Pythonで学ぶディープラーニングの理論と実装~
https://www.oreilly.co.jp/books/9784873117584/

***サンプル [#g7cdf646]
https://github.com/oreilly-japan/deep-learning-from-scratch
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch01
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch02
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch03
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch04
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch05
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch06
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch07
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch08
-https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/notebooks

***その他、参考 [#p227f4c9]
-『ゼロから作るDeep Learning』の学習ノート:記事一覧 - からっぽのしょこ~
https://www.anarchive-beta.com/entry/2020/06/01/192900
--[[1章 Python入門>https://www.anarchive-beta.com/entry/2020/06/01/192900#1%E7%AB%A0-Python%E5%85%A5%E9%96%80]]
--[[2章 パーセプトロン>https://www.anarchive-beta.com/entry/2020/06/01/192900#2%E7%AB%A0-%E3%83%91%E3%83%BC%E3%82%BB%E3%83%97%E3%83%88%E3%83%AD%E3%83%B3]]
--[[3章 ニューラルネットワーク>https://www.anarchive-beta.com/entry/2020/06/01/192900#3%E7%AB%A0-%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF]]
--[[4章 ニューラルネットワークの学習>https://www.anarchive-beta.com/entry/2020/06/01/192900#4%E7%AB%A0-%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E5%AD%A6%E7%BF%92]]
--[[5章 誤差伝播法>https://www.anarchive-beta.com/entry/2020/06/01/192900#5%E7%AB%A0-%E8%AA%A4%E5%B7%AE%E4%BC%9D%E6%92%AD%E6%B3%95]]
--[[6章 学習に関するテクニック>https://www.anarchive-beta.com/entry/2020/06/01/192900#6%E7%AB%A0-%E5%AD%A6%E7%BF%92%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF]]
--[[7章 畳み込みニューラルネットワーク>https://www.anarchive-beta.com/entry/2020/06/01/192900#7%E7%AB%A0-%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF]]
--[[8章 ディープラーニング>https://www.anarchive-beta.com/entry/2020/06/01/192900#8%E7%AB%A0-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0]]

-Qiita
--ゼロから作るDeep Learning~
https://qiita.com/okayu303/
---誤差逆伝播法の概要~
https://qiita.com/okayu303/items/b67ea27ae221fb5386d1
---Affineレイヤ~
https://qiita.com/okayu303/items/8931a9076d7b867109d4
---Softmax-with-Lossレイヤ~
https://qiita.com/okayu303/items/b67ea27ae221fb5386d1

--【学習メモ】ゼロから作るDeep Learning~
https://qiita.com/yakof11/items/
---~4章:https://qiita.com/yakof11/items/ffe4297d73ac4d7febd6
---5章:https://qiita.com/yakof11/items/5d37042f689760515072
---6章:https://qiita.com/yakof11/items/7c27ae617651e76f03ca
---7章:https://qiita.com/yakof11/items/2e187f7d9f253b500295

--深層学習 / ゼロから作るDeep Learning
---3章:https://qiita.com/jun40vn/items/2104738dc3aa36e41023
---4章:https://qiita.com/jun40vn/items/be171ff7626d370072d1
---5章:https://qiita.com/jun40vn/items/bd3f0ec0444a551e0c52
---6章:https://qiita.com/jun40vn/items/5593e4f5cc3dc69f2f01
---7章:https://qiita.com/jun40vn/items/be48afbdd9da19f1e43e

--ゼロから作るDeep Learningで素人がつまずいたことメモ: まとめ~
https://qiita.com/segavvy/items/4e8c36cac9c6f3543ffd
---1章:https://qiita.com/segavvy/items/1945aa1a0f91a1473555
---2章:https://qiita.com/segavvy/items/d8e9e70437e35083a459
---3章:https://qiita.com/segavvy/items/6d79d0c3b4367869f4ea
---4章:https://qiita.com/segavvy/items/bdad9fcda2f0da918e7c
---5章:https://qiita.com/segavvy/items/8707e4e65aa7fa357d8a
---6章:https://qiita.com/segavvy/items/ca4ac4c9ee1a126bff41
---7章:https://qiita.com/segavvy/items/8541c6ae1868d9b2b805
---8章:https://qiita.com/segavvy/items/3eb6ea0ea2af68c96fcf

--「ゼロから作るDeep Learning」自習メモ~
---(1)ディレクトリー、フォルダの配置とか~
https://qiita.com/slow_learner/items/8272450c2b876fdc690c
---(2)2章 パーセプトロン、半加算器、全加算器~
https://qiita.com/slow_learner/items/7caefc9ff17b4f543b15
---(3)3.6.1 MNISTデータセットのダウンロード~
https://qiita.com/slow_learner/items/9447c5717d52d3e60930
---(4)3.6.2 ニューラルネットワークの推論処理~
https://qiita.com/slow_learner/items/d914454ecee154e98cd2
---(5)4章 ニューラルネットワークの学習~
https://qiita.com/slow_learner/items/4e799af75779e35abca9
---(6の2)Kaggleの猫と犬のデータセット~
https://qiita.com/slow_learner/items/95603dcbe8784036fadb
---(6の3)9未満か9以上か~
https://qiita.com/slow_learner/items/3b7d3b8f4c7821a2b617
---(7)なんで2分の1、なんでlog?~
https://qiita.com/slow_learner/items/efbe24999562c3630c93
---(8)6章のグラフをmatplotlibで描いてみた~
https://qiita.com/slow_learner/items/d770bc712c96f0ec3b69
---(9) MultiLayerNetクラス~
https://qiita.com/slow_learner/items/16b4cad06782abeb98d5
---(10)MultiLayerNetクラス~
https://qiita.com/slow_learner/items/cfca161fb2fb05216a74
---(10の2)重みの初期値~
https://qiita.com/slow_learner/items/d2e2e2094080d67e3e01
---(11)CNN~
https://qiita.com/slow_learner/items/d4c36e3701e16c5a9e77
---(12)ディープラーニング~
https://qiita.com/slow_learner/items/ed10b1964c33e76235f3
---(13)Google Colaboratoryを使ってみる~
https://qiita.com/slow_learner/items/ccf0a35bcb1a0d628669
---(14)Google Colaboratoryで4章のプログラムを動かして見る~
https://qiita.com/slow_learner/items/c422bd3d06c86bf0beec
---(15)TensorFlowの初心者向けチュートリアル~
https://qiita.com/slow_learner/items/f9ba7f84053684da750a
---(16)SimpleConvNetをKerasで構築してみた~
https://qiita.com/slow_learner/items/28a8025c9b881491e3be
---(17)DeepConvNetをKerasで構築してみた~
https://qiita.com/slow_learner/items/675fbedc932e850db4e8
---(18)ワン!ニャン!Grad-CAM!~
https://qiita.com/slow_learner/items/a62421e5110cf925e503
---(読めない用語集)~
https://qiita.com/slow_learner/items/03eb3367119e98b5a22c

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS