スポンサーリンク

【ニューラルネットワーク Python】ニューラルネットワークとは?種類やモデル、仕組みを学習し、Python で入門・実装したいあなたは、サンプルコードなどもこちらをどうぞ【keras 入門】

スポンサーリンク
ニューラルネットワーク モデル python keras 回帰 サンプル コード 重み バイアス 活性化関数 仕組み 種類 ディープラーニング 機械学習 ai 2 Python
スポンサーリンク
スポンサーリンク
スポンサーリンク

ニューラルネットワーク」とは、生物の神経回路網からアイデアを得た、人工的なネットワークモデルの1つです。

「ニューラル」は、「ニューロン」という神経細胞からきています。

ニューラルネットという人工的なネットワークの応用例として有名なのは、「画像の分類」などがあります。

画像を分類するためには、画像の特徴を認識する必要があります。

この「画像認識」などと呼ばれるタスクでは、ディープラーニングが非常に良い成績を収めています。

 

 

ディープラーニングは人工知能(ai)・機械学習の1つです。

ニューラルネットワークをミルフィーユのように多数積み重ねたネットワーク構造をしています。

ネットワークを複雑化することで、複雑なパターンも認識でき、それにより精度が向上したと考えられています。

なので、ニューラルネットワークとディープラーニングの違いは、ネットワーク構造の層の数が違うことです。

層を多層化した結果、データの複雑な規則性を表現する能力が備わったと言えます。

 

 

ニューラルネットワークは、分類問題だけでなく、

回帰問題」にも使うことができます。

「回帰」とは、データを式で表現することを言います。

ニューラルネットワーク回帰」を行うことで、データの規則性を表現した数式を得ることができます。

その数式を「ニューラルネットワークモデル」と呼びます。

ニューラルネットワーク回帰の例としては、例えば、

  • 気温から売上を予測する

といった一般的なペアのデータのモデル化に使えます。

 

  • ニューラルネットワークの仕組みとは?
  • ニューラルネットワークの重み・バイアス・活性化関数ってなに?
  • ニューラルネットワーク回帰をPythonなどで実装してみたい

と思われる方も多いかと思います。

 

そこで本記事では、

  • ニューラルネットワークの仕組み
  • ニューラルネットワーク回帰のアルゴリズム
  • ニューラルネットワーク回帰を Python kerasで実装する方法

などについて、サンプルコードを交えながら、わかりやすくまとめます。

 

特に、線形回帰と比較しながら説明することで、

  • ニューラルネットワーク回帰と線形回帰の違い

を通じて、ニューラルネットワーク回帰のイメージを直感的に理解しやすいかと思います。

加えて、ニューラルネットワークを重ねたディープニューラルネットワークの理解も深まるはずです。

 

スポンサーリンク

【ニューラルネットワーク Python】ニューラルネットワークとは?種類やモデル、仕組みを学習し、Python で入門・実装したいあなたは、サンプルコードなどもこちらをどうぞ【keras 入門】

ニューラルネットワークの仕組みとは

ニューラルネットワークモデルとは

ニューラルネットワークとは、神経細胞ネットワークからヒントを得た、人工ネットワークです。

その人工ネットワークのことを、

ニューラルネットワークモデル」と呼びます。

人間の脳内とニューラルネットワークモデルを比較してみます。

人間の脳内には、神経細胞がたくさん存在しています。

それを模式的に表したのが以下の図になります↓

ニューラルネットワーク 神経細胞 モデル

 

加えて、神経細胞同士は、シナプスという連絡道路でつながっています。

これをオレンジの矢印で書いています。

ニューラルネットワーク 神経細胞 モデル シナプス

 

 

これをもとに考えられたのがニューラルネットワークモデルになります。

ニューラルネットワークモデル ノード ネットワーク 入力層 隠れ層 中間層 出力層

ニューラルネットワークモデルでは、

  • 神経細胞のことを「ノード
  • シナプスのことを「ネットワーク

のように呼ぶことがあります。

ノードは、役割ごとにグループ分けされています。

  • 情報の入力を担当する「入力層
  • 入力層から情報を受け取り処理をして出力する「隠れ層
  • 隠れ層から情報を受け取って結果を出力する「出力層

と呼びます。

(ちなみに、ニューラルネットワークモデルには、他にもいろいろな種類がありますが、ここでは一番基本的なモデルをご紹介しました)

 

次に、ニューラルネットワークモデルで、

情報が入力から出力まで、どのように伝わるのか説明します。

ニューラルネットワークモデルの「重み」とは?

ノードとノードの結びつきの強さのことを「重み」と言います。

以下で詳しく解説しますね。

ニューラルネットワークモデル ノード ネットワーク 注目ノード

ニューラルネットワークの仕組みを知るには、

1つのノードに注目するのが役立ちます。

ここでは、隠れ層の1つに注目してみます(図中黄色の丸になっています)。

ニューラルネットワークモデル ノード ネットワーク 重み 強さ 入力

注目ノードには、

  • 入力層のノード1から、入力1
  • 入力層のノード2から、入力2
  • 入力層のノード3から、入力3

の3つが入ってきています。

脳内のシナプスには、それぞれ結びつきの強さがあります。

それをニューラルネットワークモデルでも表現するために、強さを考えます。

  • 入力層ノード1と注目ノードの結びつきの強さ1
  • 入力層ノード2と注目ノードの結びつきの強さ2
  • 入力層ノード3と注目ノードの結びつきの強さ3

の3つの結びつきの強さがあります。

この結びつきの強さのことを「重み」と言います。

 

では注目ノードへのすべての入力を考えてみます。

入力層1から注目ノードへの入力は、入力情報とその強さの掛け算で表現します。

入力層2と入力層3から注目ノードへの入力も同じです。

注目ノードへの入力の合計は以下の式で表されます。

(注目ノードへの入力の合計)=

(入力1)×(入力1の強さ)

+(入力2)×(入力2の強さ)

+(入力3)×(入力3の強さ)

 

 

 

神経細胞は、入力がある一定値より大きい時に、興奮して出力をします。

入力が小さい時は興奮せず出力しません。

つまり、出力をするか・しないかの判断があり、

その後に出力の程度を決める

という2つのステップがあります。

 

これをニューラルネットワークモデルで表現します。

まずは、出力をするか・しないかの判断の部分の解説をしますね。

ニューラルネットワークモデルの「バイアス」とは

出力をするか・しないかの判断するには、

入力の合計」が、ある値より大きいかどうかが大事になります。

このしきい値のことを「バイアス」と言います。

(厳密にはバイアスはしきい値の符号を変えたものです。下で詳しく説明しています)

ニューラルネットワークモデル ノード ネットワーク バイアス しきい値

入力の合計 > しきい値

となった時に、出力を生成します。

この式を書き換えると、

(入力1)×(入力1の強さ)

+(入力2)×(入力2の強さ)

+(入力3)×(入力3の強さ) ー しきい値

> 0

と書くことができます。

 

加えて、しきい値の前のマイナスをプラスにするために、

バイアス = ーしきい値

として式を書き直します。

 

すると、

(入力1)×(入力1の強さ)

+(入力2)×(入力2の強さ)

+(入力3)×(入力3の強さ) + バイアス

> 0

となります。

これを満たすときに、出力を生成することになります。

 

なぜマイナスを無くしたかったかを説明しますね。

上のネットワークをさらにシンプルにしたモデルを考えてみます。

ニューラルネトワークモデル シンプル

このとき、注目ノードが出力を出すのは、

(入力1)×(入力1の強さ) > しきい値

のとき、すなわち、

(入力1)×(入力1の強さ)ーしきい値 > 0

のときです。バイアスを使うと、

(入力1)×(入力1の強さ)+バイアス > 0

となります。

入力をx、強さをa、バイアスb とすると、

ax + b > 0

という形になります。

y = ax + b

と考えてみると分かりやすいように、

これは1次関数の形をしています。

しきい値をバイアスとして理解することで、

しきい値を1次関数の切片のイメージで理解できることになります。

ちなみに、重みa は傾きの意味になります。

 

この例では、入力を1つだけでしたが、

通常のニューラルネットワークモデルは、入力や重みは多数になります。そのとき、

ax + b 

のa, x, b は、行列やベクトルで表現することができます。

行列やベクトルとして複雑(高次元)になっても、

その意味は(高次元空間での)傾きや切片として理解することができます。

 

 

次に、出力される値を決めるステップを解説します。

ニューラルネットワークモデルにおける「活性化関数」とは

ニューラルネットワークモデル ノード ネットワーク 活性化関数

出力する場合、出力値を決めるための関数が使われます。

この関数のことを「活性化関数」と呼びます。

繰り返しになりますが、

入力をx、強さをa、バイアスb とすると、

ax + b > 0

という形になります。今回は

z = ax + b

と書いてみます。

活性化関数を AF と書いてみます(アクティベーションファンクションの略になります)。

(注目ノードの出力)=AF(z)

と表現することができます。

入力の合計とバイアスを足したものに関数を作用させるわけです。

その結果をノードの出力値とします。

 

活性化関数には様々なものがあります。

  • ステップ関数:Zが正なら1、負なら0を出力
  • 恒等関数:Zをそのまま出力とする
  • シグモイド関数
  • ソフトサイン
  • ソフトプラス
  • ランプ関数(ReLU)

など、他にも様々なものが提案されています。

 

 

というわけで、ニューラルネットワークモデルの仕組みについて解説してきました。

 

ニューラルネットワークモデルの活用例として、

回帰問題への実装をしてみたいと思います。

ニューラルネットワーク回帰のやり方とは

ニューラルネットワーク回帰のやり方の全体像は以下になります。

(1), データの準備

(2), ニューラルネットワーク回帰の実行

(3), 結果の解釈

の3ステップになります。

以下でそれぞれについて解説していきますね。

 

ニューラルネットワーク回帰のためのデータ準備

ニューラルネットワーク回帰は、変数の関係を調べる方法の1つです。

  • ある変数の値から、別の変数の値を予測する

のようなことができるようになります。

 

ニューラルネットワーク回帰分析では、2つ以上の変数を含んだデータが必要です。

例えば、

  • 身長と体重
  • 気温と売り上げ

などの値のペアのデータとなります。

 

今回は、気温と売上の人工データを使って、

ニューラルネットワーク回帰を実装してみたいと思います。

 

ニューラルネットワーク回帰のアルゴリズムとは

  • 具体的にどうやって数式作るの?

ということを説明します。

繰り返しになりますが、ニューラルネットワーク回帰の目的は、

  • データをよりよく再現する数式を作ること

です。

最初からいきなり正解の数式を作ろう!と考えると理解が難しくなります。

そうではなく、

  • 最初は大まかに数式を決め、改良を加えて良い数式を作る

という考え方を知っておくと理解しやすくなるかと思います。

具体的には、以下のイメージです。

(1), 数式を仮定

(2), 数式にデータの片方を入れ、もう一方を計算

(3), 計算して得た値と、本物の値との差を考える

(4), この差が小さくなるように、数式を変化させる

 

より具体的に説明しますね。

(1), 数式を仮定

ニューラルネットワーク回帰では、ペアのデータを使います。

例えば、気温と売り上げ、のようなデータです。

ニューラルネットワークモデルでは、

上で説明したように、

z = a×(気温) + b

(売上)=AF(z)

となります。この2式をまとめると、

(売上)=AF(a×(気温) + b)

と書けます。

AF(活性化関数)にはいろいろな種類があります。

AFが恒等関数の時、

(売上)=a×(気温) + b

となります。

恒等関数は、入力をそのまま出力する関数だからです。

 

仮に数式を

(売上)=3×(気温) + 5

だとします。

y=3x+5

のような式と同じことになります。

 

これは最適な数式ではないかもしれませんが、とりあえずこうしてみます

以下(2),(3),(4)で、数式を改良していくわけです。

(2), 数式にデータの片方を入れ、もう一方を計算

手元のデータに気温が10度の時に売り上げが150万とします。

(気温、売り上げ)=(10、150)

といったデータになります。

上で仮定した数式の気温にこの10を入れてみます。

すると、

(売上)=3×10 + 5 = 35

となります。

(3), 計算して得た値と、本物の値との差を考える

計算した売り上げの値は、35です。

本物の売り上げの値は、150です。

この差を考えると、150−35=115

となります。

(4), この差が小さくなるように、数式を変化させる

ここで数式を以下のように変えてみます。

(変える前)

(売上)=3×(気温) + 5

(変えた後)

(売上)=13×(気温) + 25

としてみます。

そして、変えた式を使い、

上と同じようにデータを入れて計算してみます。

(売上)=13×10 + 25 = 155

差を考えると

150ー155=ー5

となりました。

  • 最初の式での差は115
  • 変えた式での差はー5

誤差が負の数になっています。

これは都合が悪いので、正の数にするために二乗します。

負の数だけ二乗するわけにはいかないので、正の数も二乗します。

すると、

  • 最初の式の差の二乗は、13225
  • 変えた式の差の二乗は、25

となっています。

同じ正の数なので、大きさを比べることができます。

数式の係数(重み)を変えることで、誤差を小さくできています

誤差を小さくすることを言い換えると、

  • データをよりよく表現した

と言い、使った数式を

  • データをよりよく表現した数式

と呼びます。

数式の係数を変化させて、誤差を最小にしているわけです。

多くのデータを扱うので、線形代数の行列計算などを使い解きます。

誤差を小さくする重みを求めるには、「誤差逆伝搬法(バックプロパゲーション)」を用いています。

詳細はまた別の記事で紹介する予定です。

また、この重みを変化させてより良い数式を求めることを、

  • ニューラルネットワークを「学習」させる

とも言います。

 

ここでは、ニューラルネットワーク回帰について、

手を動かして実行できるように、サンプルコードを見ながら解説したいと思います。

 

とはいっても、

  • 線形代数?行列?って何?
  • 数学は苦手なんだよなぁ〜

と思われる方も多いかもしれません。

だいじょうぶです。

Python なら、サクッとニューラルネットワーク回帰を実行できます。

ニューラルネットワーク回帰ができるライブラリがあるので、

細かいアルゴリズムをプログラミングしなくても

ニューラルネットワーク回帰をラクに実行することができます。

以下でニューラルネットワーク回帰の実装を説明しますね。

Python によるニューラルネットワーク回帰のためのライブラリ keras とは?

Python でニューラルネットワーク回帰分析は、

keras(ケラス)

というライブラリパッケージを使うとサクッと実行できます。

keras は、無料で使える高性能ライブラリです。

ニューラルネットワーク回帰だけでなく、

ディープラーニングを実行できます。

使い慣れておいて損はないライブラリとなっています。

以下で keras を使って、

ニューラルネットワーク回帰分析を Python でサンプルコードを示しながら、実装したいと思います。

 

ニューラルネットワーク回帰モデルの作成・実装

実装の流れは以下になります。

(1), keras などの必要なライブラリをインポート

(2), データの準備(今回は人工データを使います)

(3), ニューラルネットワーク回帰分析の実行

(4), 結果の解釈(今回はグラフで可視化します)

 

(1), keras などの必要なライブラリをインポート

ニューラルネットワークモデル回帰 サンプル コード 1 import numpy matplotlib keras

ここで使っているライブラリは

NumPy」は、データを扱いやすくするライブラリです。行列計算などを高速に行うことができます。

matplotlib」「seaborn」は、グラフを表示するためのライブラリです。

keras」が、ニューラルネットワーク回帰を行うためのライブラリです。

今回は、ニューラルネットワークをSequential モデルを作成しますので、

import Sequential

としています。

またネットワークは、密に(Dense)結合したネットワークを作るので、

import Dense

としています。

”密に”というのは、入力層と隠れ層、隠れ層と出力層の結合がすべてある状態のことです。

重みを決めるために最適化の計算が必要ですが、

今回はAdam(アダム)というアルゴリズムを使うことにしました。

import Adam

としています。

 

 

(2), データの準備(人工データん生成)

ニューラルネットワークモデル回帰 サンプル コード 3 データ生成 気温

今回はデータを人口的にランダムに生成します。

気温と売上という2つの変数を生成します。

気温のデータは、500個のデータ(0から30の範囲の実数)を生成しています。

(seed.rand(500)で0から1の間の数値をランダムに500個生成しています。

ニューラルネットワークモデル回帰 サンプル コード 4 データ生成 売上

売上のデータは、気温データを使って、

以下の式で生成されています。

(売上)=2×(気温)+30 + ランダム数

として生成しています。

 

ランダムな数字のイメージがわかないかもしれないので、実際の値を示しておきますね。こんな感じです↓

ニューラルネットワークモデル回帰 サンプル コード 5 データ生成 切片1

「10*seed.rand(500)」は、0から10の間の数値です。

ニューラルネットワークモデル回帰 サンプル コード 6 データ生成 切片2

「+30+10*seed.rand(500)」は、0から−10の間の数値が500個生成されていることがわかります。

これを平均すると、約−5.2となっています↓

ニューラルネットワークモデル回帰 サンプル コード 7 データ生成 切片3

なので、結局、データを生成するために使った数式は、だいたい

(売上)=2×(気温)+ 34.9

ということになります。

 

 

これで、必要だった2つの変数(気温、売上)のデータがそろいました。

可視化して確かめてみるととこんな感じです↓

ニューラルネットワークモデル回帰 サンプル コード 8 データ グラフ 可視化

横軸が気温、縦軸が売上になります。

今回は、数式

(売上)=2×(気温)+ 30 +ランダム数

をもとにして、ランダムな数値を使い、

ばらつきを加えている様子が見てとれるかと思います。

 

 

(3), ニューラルネットワーク回帰分析の実行

ニューラルネットワークモデル回帰 サンプル コード 9 モデル 生成

Python kerasでニューラルネットワーク回帰分析を行うには、

まずネットワークを定義します。

そのために、今回は Sequential モデル使います。

まずモデルの入れ物(空)を作ります(インスタンスの生成)。

model = Sequential ()

としています。

 

次に、空のモデルにネットワークの詳細を定義していきます。

model. add(  )

のように、add メソッドでネットワークを追加していきます。

Dense ( )は、密結合ネットワークを作る

の意味になります。

Dense(1,  activation=”linear”, input_dim=1)

最初の1は、1つのノードを定義するの意味です

activation は活性化関数の指定で、今回は線形関数「linear」を使っています。

imput_dim =1 は入力の次元が 1 であることを示しています。

これでモデルは終了なので、コンパイルします。

model.compile( )

を使います。

loss = “mean_squared_error”

は、誤差の計算方法で、平均二乗誤差を指定しています。

optimizer = Adam

最適化計算にAdamを使っています。

metrics = [“mse”]

は、重みを変える動作の良し悪しをmse (mean squared error )で判断することを指定しています。

num_epoch =  50000

は、重みの調整を50000回行うことを指定しています。

これで設定ができましたので、回帰計算を実行します。

ニューラルネットワークモデル回帰 サンプル コード 10 モデル 回帰1

回帰計算は、

model.fit(  )

として、フィットメソッドを使います。

his = model.fit( ).history

として、回帰計算の履歴は his という変数に代入しています。

fit( kion, uriage, ・・・)

として、売上を気温でフィットすることを指定しています。

回帰計算の回数を

epochs = num_epoch

で指定しています。

1回の計算で全データの中のいくつのデータを使うかを

batch_size = 64

で指定しています。

今回は全データは500で、batch_size は64としています。

毎回の計算で、500データのうち64データを使って計算していることになります。

この計算を50000回繰り返すわけです。

(計算には数分かかるかもしれません)

 

 

(4-1), 結果の解釈(グラフで可視化)

結果を可視化すると、以下のようになります。

ニューラルネットワークモデル回帰 サンプル コード 12 モデル 回帰 結果 可視化1

得られた直線の式を可視化しています。

In[38] 直線を加えるために、点を大量にかくことで実現しています。

np.linspace で0から30までを1000間隔で点を生成して、変数 kion_fit に代入しています。

ここでも次元を仕様に合うように変更しています。

生成したそれぞれの点(1000点)について、

得られた直線の式を使って、売上の値を求めて、uriage_fit に代入しています。。

これでニューラルネットワーク回帰で求めた直線上の点(kion_fit, uriage_fit)の1000点のデータが得られたわけです。

このデータと最初のデータを同じグラフに表示すれば上の図になります。

直線がデータをよく表現しているように見えます。

 

 

 

(4-2), 結果の解釈(最適な数式)

ニューラルネットワーク回帰では、数式をデータに合うように最適化にします。

今回の線形関数(恒等関数)による活性化関数では、

入力と出力の関係は1次関数になります。

傾きと切片の2つの係数(重み)があり、

これらの最適な値を求めることがニューラルネットワーク回帰になります。

求めた傾きと切片を表示してみます

ニューラルネットワークモデル回帰 サンプル コード 14 モデル 回帰 結果 重み

 

切片(intercept)が、33.5

傾き(coefficient)が、2、0

ということがわかりました。

つまり、求めた最適な直線は

売上=2.0 ×(気温) + 33.5

ということがわかりました。

今回のデータは、数式

(売上)=2×(気温)+ 34.9

をもとにして、生成されました。

 

求めた数式と元にした数式はほとんど同じですね。

つまり、ニューラルネットワーク回帰を使って、データに最適な直線を得られたと考えられます。

 

bサイン

 

 

というわけで、本記事では、

  • ニューラルネットワークの仕組み
  • ニューラルネットワーク回帰のアルゴリズム
  • ニューラルネットワーク回帰を Python kerasで実装する方法

などについて、サンプルコードを交えながら、わかりやすくまとめました。

 

ニューラルネットワークを重ねて深くしたものがディープラーニングです。

本記事で自信がついたら、ディープラーニングの勉強してみるのもオススメです。

 

 

 

こちらもございます↓

スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
error: Content is protected !!
タイトルとURLをコピーしました