2017年07月20日

簡単なニューラルネットワークの学習を回帰直線でやってみました

storage.mantan-web.jp_images_2017_05_21_20170521dog00m200017000c_001_size8.jpg

deeplearning1.jpg

この本を学習しています。

ディープラーニングは深い層を持ったニューラルネットワークです。

ですから、ニューラルネットワークの学習が分かればディープラーニングも分かるわけです。

そこで簡単な回帰分析による回帰直線を求めるのにニューラルネットワークの学習を使ってやってみます。

まず分析するデータです。

表1.jpg

平成22年度に文科省が調査した女子の平均身長です。

明らかに年齢と身長の間に相関関係があることが分かります。

それではExcelを使ってグラフを描いてみます。

図1.jpg
求めたいか回帰直線のグラフも描いてあります。

Excelの分析ツール(回帰分析)によるこのデータの結果は次の通りです。

表2.jpg

さて、Excel VBAでプログラムを書いて1万回ほどニューラルネットワークの学習をやらせて、求める回帰直線の傾きと切片を求めてみました。

初期値はどういう決め方がいいのかまだよく分かっていないのでとりあえず1番目の点と最後の点を結んだ直線の傾きと切片としました。

本当は(各点のx座標の平均、各点のy座標の平均)は求める回帰直線上にあるということを知っているのですが、その知識は使わないことにします。

損失関数は残差の2乗の総和としました。

ハイパーパラメータ(偏微分の学習率)ですが、傾きは0.001(0.01だと発散してしまったのでこの値に)、切片は0.01にしました。

以下が1万回コンピュータに学習させた結果のグラフです。

図2.jpg

図3.jpg

2つのグラフを見てもらうと分かるように確かに学習していますねえ。

最終的に1万回(時間を測れば良かったのですが数分で終了したと思います)で次のようになりました。

傾き 0.7767 ⇒ 0.72077
切片 145.268 ⇒ 146.048

とてもいい結果が出ていると思うのですが、どうでしょうか。

傾きも切片も正解と比べて99.9%一致しています。

ほんと面白いですねえ。

(お断り)
今回だけではありませんが、数学の知識がないとここまで出来ないと思います。
難しいことはやっていませんが、かと言って誰でも出来るかというと難しいと思います。


posted by tsurutsuru at 23:40| Comment(0) | 日常茶飯事

ディープラーニング本の拾い読み記(4)

storage.mantan-web.jp_images_2017_05_21_20170521dog00m200017000c_001_size8.jpg

アマゾンでベストセラーになっている下記の本の拾い読み記を書いています。ほとんどが自分の備忘録のために書いていますので、読まれる方には分かりづらいかと思います。

deeplearning1.jpg

さて、ここまで拾い読みして理解できたのは、画像認識のディープラーニングでは、CNN(convolutional neural network)がとても重要な役割をはたしているようだということです。

CNNは日本語では、畳み込みニューナルネットワークと訳しているようです。

画像認識のコンペティションでは、ディープラーニングによる手法のほとんどすべてがCNNをベースとしているそうです。

物体認識や物体検出などもCNNをベースにした手法が多いそうです。物体検出は自動車の自動運転に求められる技術です。

CNNの基本は、畳み込み層とプーリング層です。

畳み込み層のイメージは次の通りです。

tatamikomi1.jpg

フィルターが重みです。

さて、ここでニューラルネットワークの学習の手順を思い出してください。

---------------------------------------------------------------
さて、ここでニューラルネットワークの学習の手順を確認しておきます。

(前提)ニューラルネットワークは、適応可能な重みとバイアスがあり、その重みとバイアスを訓練データに適応するように調整することを学習と呼ぶ。ニューラルネットワークの学習は次の4つの手順で行う。

〔ステップ1(ミニバッチ)〕
訓練データの中からランダムに一部のデータを選び出す。その選ばれたデータをミニバッチと言い、ここでは、そのミニバッチの損失関数の値を減らすことを目的とする。

〔ステップ2(勾配の算出)〕
ミニバッチの損失関数を減らすために、各重みパラメータの勾配を求める。勾配は、損失関数の値を最も減らす方向を示す。

〔ステップ3(パラメータの更新)〕
重みパラメータを勾配方向に最小量だけ更新する。

〔ステップ4(繰り返す)〕
ステップ1、ステップ2、ステップ3を繰り返す。
---------------------------------------------------------------

ですから、CNNの畳み込み層に出てくるフィルターとバイアスの最適値を求めることになります。

さて、ステップ2の勾配は微分を利用するのでした。

微分は数値微分よりも誤差逆伝播法を使う方が比較的簡単に計算できると学習本にあります。

誤差逆伝播法のイメージは次の通りです。

gyakydenpa1.jpg

細かいことに引っかかっていると内容が分からなくなります。

こういう時は高いところから全体を俯瞰するのが一番です。

本質なものを忘れないようにして細かい部分を学習していきましょう。

今回はここまでです。




posted by tsurutsuru at 14:48| Comment(0) | 日常茶飯事

ディープラーニングを学ぼうとしている若い方々へ・・・皆さんはいい時代に生まれましたねえ!

storage.mantan-web.jp_images_2017_05_21_20170521dog00m200017000c_001_size8.jpg

ディープラーニングを学ぼうとしている若い方々へ一言。

皆さんはいい時代に生まれましたねえ。

ディープラーニングが脚光を浴び始めたのは2012年です。それからまだ5年しか経過していません。

要するにディープラーニングはまだ黎明期なのです。

こういう時期にディープラーニングを徹底的に学習して自分のものにすれば、これはもう一生もんの宝物です。

現在日本の企業はディープラーニング技術者をこぞって大量に採用しようとしています。

明らからにこの方面の人材は不足しています。

いまディープラーニングを徹底的に学習して自分のものにしておけば就職の時に有利に働くでしょう。

皆さんはいい時代に生まれましたねえ。羨ましいですよ。ほんと。

deeplearning1.jpg

こういう本を繰り返し読んでぜひディープラーニングを自分のものとして下さい。

では。
posted by tsurutsuru at 11:57| Comment(0) | 日常茶飯事

Matplotlibというライブラリを使ってPython3で簡単にグラフを描画することが出来ますね

storage.mantan-web.jp_images_2017_05_21_20170521dog00m200017000c_001_size8.jpg

Matplotlibというライブラリを使ってPython3で簡単にグラフを描画することが出来ます。

graph21.jpg

なるほど、これなら数学の学習もPythonで出来るわけだ。

このグラフを描画するプログラムは以下の通りです。

ファイル名:simple_graph.py
1 # coding: utf-8
2 import numpy as np
3 import matplotlib.pyplot as plt
4
5 # データの作成
6 x = np.arange(0, 6, 0.1) # 0から6まで0.1刻みで生成
7 y = np.sin(x)
8
9 # グラフの描画
10 plt.plot(x, y)
11 plt.show()

こんなことも出来ます。

graph3.jpg

ファイル名:img_show.py
1  # coding: utf-8
2  import matplotlib.pyplot as plt
3  from matplotlib.image import imread
4
5  img = imread('../dataset/lena.png') # 画像の読み込み
6  plt.imshow(img)
7 
8  plt.show()

まだよく分かっていないのですが、pyqt5というのを利用してグラフや画像を表示しているようです。

こりゃあ、面白い。GUIプログラムの学習にもなりますねえ。

では、また。



posted by tsurutsuru at 01:44| Comment(0) | 日常茶飯事