pythonで学ぶ深層学習

初めまして

はじめまして。これが初投稿です。 これから学んだ物を備忘録として残していければな・・・なんて笑

てことで今回はpythonでの深層学習を学んだので載せていこうと思います。 一応Tensorflowまで扱ったので何とかモノになるはず・・・汗

環境設定はanacondaで整えました。真似したい方はこちらを参考にしてください。

ニューラルネットワークの構造について知りたい方はこちらなどを参照してみてください。
★今回はパーセプトロンと呼ばれるニューラルネットワークの1番小さい単位を取り上げます。

最小モデルの構造

下のような図で表される、小さめの構造のニューラルネットワークの動きを
今回はnumpyを使って確かめてみようと思います。
入力層ユニット数は3,出力層ユニット数は2とします
bはバイアス

f:id:Qitkun-000:20181020001944p:plain

最小モデルの定義

#numpyをimportする
import numpy

#重みを定義する
w = numpy.array([
    [0, 0.3, -0.8],
    [1, -1.2, 0.5]
])

#前の層(入力層)からの出力値xを定義する
x = numpy.array([
    [5],
    [2],
    [7]
])

#バイアスを定義する
b = numpy.array([
    [1.2],
    [3.4]
])

#目標値dを定義する
d = numpy.array([
    [1],
    [0]
])

最小モデルを計算して誤差Lossを求める

#前の層からの出力値xに重みwをかけてyを求める
y = w.dot(x)

#yにバイアスbを足してuとする
u = y + b

#2乗誤差Lossを計算する
Loss = numpy.sum((u - d) ** 2)
print("Loss:", Loss)

f:id:Qitkun-000:20181019230213p:plain Lossが 113.29 と出ていたら大丈夫・・・

計算の考え方については上のニューラルネットワークの構造のリンクを見ておいてください🙇‍♂️

学習させよう♪

学習の流れ

①入力層にデータを入力する​

②重み、バイアス、活性化関数などで計算しながら値が伝わる​

③出力層から値が出力される​

④出力層から出た値(出力値)と目標値から、ある関数を使って誤差を求める​

⑤誤差を小さくするように重みやバイアスの値を更新する​

⑥以上の操作を繰り返すことにより、出力値を目標値に近づける

学習の基本的な概念

学習とは
 →誤差が減るように重みをちょっとだけ増やす、もしくは減らすこと。

・じゃあどうやって、減らすか増やすかを判断するの?
 勾配降下法という手法で学習を進めよう!

f:id:Qitkun-000:20181020234828j:plain

横軸に重み、縦軸に誤差をとる。
重みを調整することで縦軸の誤差を減らしたい( ・∇・)


1.重みが Wm の場合、「傾き」は正。よって、重みから傾きを引けば左に移動し誤差は減少する。
2.重みが Wn の場合、「傾き」は負。よって、重みから傾きを引けば右に移動し、誤差は減少する。
結局どちらの場合でも、重みから「傾き」を引けば誤差は変動する。また、学習率を用いて学習のスピードを調整し、地道に学習させていく。よって計算は以下のようになる。


w' = w - α*「傾き」 (α:学習率) ※傾き(重みに対する誤差の微分勾配と呼ぶ)


・学習のゴール
 →誤差を最小にすること。

1回学習させる

上で定義した最小モデルを1回学習させて見ましょう!

#勾配を定義
gradient = 2 * (u - d) * x.T

#学習率を定義
learning_rate = 0.01

#新しく重みを定義
new_w = w - learning_rate * gradient

y = new_w.dot(x)
u = y + b
new_Loss = numpy.sum((u - d) ** 2)
print("new_Loss:", new_Loss)

f:id:Qitkun-000:20181019230412p:plain new_Loss が35.527…...となっていればOK!
1回目の時よりもLossの値が減っている=学習している

複数回学習させる

今度は100回学習させて見ましょう♪

learning_rate = 0.0001

#100回学習させる
for i in range(100):
    y = w.dot(x)
    u = y + b
    Loss = numpy.sum((u - d) ** 2)

 #10回に1度表示
    if i % 10 == 0:
        print(i,"回目:",Loss)
    gradient = 2 * (u - d) * x.T
    w = w - learning_rate * gradient

f:id:Qitkun-000:20181019231517p:plain

しっかりLossが下がっているのが確認できますね。(上の一回分はこの学習に含めていない...)


今回はnumpyを用いて実際に学習の方法と実装について取り上げました。次回は実際にTensorflowを使って学習させようと思います♪