【ラビットチャレンジ】深層学習day1レポート

◆Section1:入力層~中間層

【要点のまとめ】
値xを入力し、重みwとバイアスbを加えて総入力uを算出
u = w1x1 + w2x2 + w3x3 …+ b =Wx + b

例:犬、猫、ネズミを分類する場合、体長、体重、ひげの本数などの判断材料がx(入力層)にあたり、結果(確率)がu(出力層にあたる)

<参考>ニューラルネットワークの全体像
<参考>入力層から中間層

【実装演習】
気づき、最初に「numpy」 書くの忘れがち、エラーになりがち



↓出力結果

ーーーー
ネットワークの初期化
*** 重み1 ***
[[0.1 0.3 0.5]
[0.2 0.4 0.6]]

*** 重み2 ***
[[0.1 0.4]
[0.2 0.5]
[0.3 0.6]]

*** 重み3 ***
[[0.1 0.3]
[0.2 0.4]]

*** バイアス1 ***
[0.1 0.2 0.3]

*** バイアス2 ***
[0.1 0.2]

*** バイアス3 ***
[1 2]

順伝播開始

*** 総入力1 ***
[0.6 1.3 2. ]

*** 中間層出力1 ***
[0.6 1.3 2. ]

*** 総入力2 ***
[1.02 2.29]

*** 出力1 ***
[0.6 1.3 2. ]

出力合計: 3.9
ーーーー



【確認テストなど自身の考察】
数式とコード、Pythonで表記
u = Wx+b

u1= np.dot(x, W1) +1

AI入門講座で初めて実装した時より理解は深まった。
難しい数式を簡単に使用できて便利である。

【参考図書・関連情報】



◆Section2:活性化関数

【要点のまとめ】
○シグモイド関数
0 ~ 1の間を緩やかに変化する関数
信号の強弱を伝えられるのでニューラルネットワーク普及に貢献
課題:大きな値では出力の変化が微小なため、勾配消失問題を引き起こす事があった。
<コード>defsigmoid(x):return 1/(1 + np.exp(-x))

○RELU関数
今最も使われている活性化関数で勾配消失問題の回避役立つ

【確認テストなど自身の考察】
○シグモイド関数は学校で習った記憶がないが、機械学習の勉強していると頻出する。
シグモイド関数0は0.5ということは覚えた。

z1 = functions.sigmoid(u)
どういう働きになるかいまいち理解できず…

【参考図書・関連情報】
○シグモイド関数
「シグモイド」という言葉の由来は語末形のς(シグマ)に形が似ているかららしい。

【実装演習】
RELU関数をアウトプットしたものを掲載





◆Section3:出力層

【要点のまとめ】
出力層は結果をアウトプットする役割。
数値や確率、判断(これは猫の画像)など。
そして出力した結果と訓練データの誤差を確認して、
訓練(学習)をすすめていくというわけである。

出力層と中間層で利用される活性化関数が異なる。
○中間層用
ReLU関数
シグモイド(ロジスティック)関数
ステップ関数
○出力層用
ソフトマックス関数
恒等写像
シグモイド(ロジスティック)関数
※シグモイドは両方に入ってるのね


【確認テストなど自身の考察】
なぜ、引き算でなく二乗するか述べよ

そう、全くその通りで二乗することで計算が複雑になるわけであるが、
−という概念を打ち消していると言われれば納得である。

なぜ、1/2にしているのか

2乗を打ち消すため、数学的な慣習として使用

【参考図書・関連情報】
○ソフトマックス関数
複数の出力値の合計が1.0になるように変換して出力する関数
各出力値の範囲は0.0〜1.0(シグモイド関数と同じですね)
名前の由来はソフトな曲線を描き、1つの出力値が最大となるため。

【実装演習】
ソフトマップ関数をアウトプットしたものを掲載



◆Section4:勾配降下法

【要点のまとめ】
深層学習の目的

学習を通して誤差を最小にするネットワークを作成

勾配降下法を利用してパラメータを最適化!

○学習率
大きすぎすると最小値にいつまでもたどりつかず迷子になる
小さすぎると収束するまでに時間がかかってしまう

どうやって最適な学習率を決めるのか?
以下のようなアルゴリズムが活用されている

Momentum
AdaGrad
Adadelta
Adam

○確率的勾配降下法(SGD)
勾配降下法は「全サンプルの平均誤差」を求めるのに対して、
「ランダムに抽出したサンプルの誤差」を求める。

データ大きい場合の計算コストの軽減
オンライン学習ができる

○数値微分のデメリット
順伝播の計算を繰り返し行うため負荷が大きい

誤差逆伝播を利用(次につづく)


【確認テストなど自身の考察】
オンライン学習とは何か?

リアルタイムでモデル更新を行えるが、バッチ学習に比べてパラメータの更新を頻繁に行うため、時間がかかり安定しにくい。

大規模なデータの場合、オンライン学習は向かないのかなとは感じました。

【参考図書・関連情報】
○ミニバッジ学習
バッチ学習とオンライン学習の中間に位置する手法で、
深層学習で多く使用されている。

オンライン学習<安定性・計算速度・メモリ使用量<バッチ学習

【実装演習】

SGDをアウトプット、細かな動きをしていることがわかった
↓参考




◆Section5:誤差逆伝播


【要点のまとめ】
○誤差逆伝播法
算出された誤差を、出力層側から順に微分し、前の層前の層へと伝播。
計算結果(=誤差)から微分を逆算することで、不要な再帰的計算を避けて微分を算出できる手法。

【確認テストなど自身の考察】
誤差逆伝播法では不要な再帰的処理を避ける事が出来る。
既に行った計算結果を保持しているソースコードを抽出せよ。

delta2 = functions.d_mean_squared_error(d, y)


【参考図書・関連情報】
↓理解促進のため他資料で補足
○誤差逆伝播法
教師信号と実際と出力信号との間に生じる誤差情報を使ってネットワーク全体を学習。性能がよく現在でも主流な学習法。
ステップ関数のような、不連続な関数(微分不可能)なため、
シグモイド関数を使用。

シグモイド関数の微分
𝑓′(𝑥)=𝜖(1−𝑓(𝑥))𝑓(𝑥)

【実装演習】
誤差逆伝播をアウトプット


この記事が気に入ったらサポートをしてみませんか?