AI(人工知能)技術は、プログラミングでコードを書いて実装することで実現することができます。
最近では、AIのプログラミングといえばPythonが大きなシェアを持ち、頻繁に使用されています。
本記事ではPythonとは何か、どうやってニューラルネットワークをPythonを使ってプログラミングするのかといった疑問を解決していきます。
Pythonとは
Pythonとは、1991年にオランダ人のグイド・ヴァンロッサム氏が開発したプログラミング言語です。
Pythonは、
- ソースコードの構造がシンプル
- メンテナンスしやすい
- 学習コストが低い
などから、初心者にも学びやすいプログラミングとなっています。
他にも、Pythonはインタープリンタ型言語という種類になり、コードを書いたらコンパイルすることなくすぐに実行できることや、インデントの強制等があることも特徴です。
Python3にバージョンアップされてからは、日本語対応もしっかりし、国内でもシェアが上がってきています。
同時に海外における人気も高く、有名なWebサービスやSNSサービスなどでも使用されており、人気のプログラミングとなっています。
Pythonは今、AIや機械学習分野で使用されることも多くなり、とても注目されています。
本記事で使用したPythonの開発環境は、Anacondaというソフトウェアです。
Anacondaは、Pythonで使いたいプログラムやライブラリが、すでに設定してあるディストリビューションになります。
これを使うことで、環境構築の時間を短縮したり、ツールを簡単にインストールできたりします。
初心者の方をはじめ、多くの方に使いやすいソフトウェアとなっています。
Pythonについてやインストール手順などもう少し詳しく知りたい方は以下をご覧ください。
参考記事:Pythonをインストールする方法とは?Pythonの始め方
では次に、ニューラルネットワークついて見ていきましょう。
ニューラルネットワークとは
次に、これからPythonで実装するニューラルネットワークとは何か確認しておきましょう。
ニューラルネットワークとは、人間の脳の働きをコンピューター上で模倣したものです。
脳では神経細胞(ニューロン)に電気信号が伝達され、脳内の情報が処理されます。
これを数理モデル化したものがニューラルネットワークになります。
構造としては、入力が行われる「入力層」、出力が行われる「出力層」、その間に「隠れ層(中間層)」というものがあります。
それぞれのつながりを「重み」というパラメーターで調整します。
本記事では、このニューラルネットワークについて、Pythonを使ってプログラミングを実装する方法を解説します。
ニューラルネットワークの実装
では、実際にニューラルネットワークの簡単なモデルを、Pythonを使って実装していきましょう。
単純パーセプトロンの実装
それではまず、図のような入力層と出力層の2層からなるニューラルネットワークの原点となる単純パーセプトロンを、Pythonを使って実装していきます。
入力xは、1・3の行列、重みwを3・2の行列とするので、出力yは、1・2の行列となる例です。
実際のコードは、
import numpy as np
x = np.array([1, 2, 3])
w = np.array([[1, 4], [2, 5], [3, 6]])
y = np.dot(x, w)
print(y)
となります。
上のPythonのコードについて、解説していきましょう。
まず、プログラム内において線形代数を扱う際に用いられるライブラリNumPyを読み込みます。
NumPyは、オープンソースで公開されており、誰でも無料で使用できます。
ニューラルネットワークでは、ベクトルや行列など多次元配列の計算をすることが多くなりますが、NumPyを使うと非常に高速な処理を行うことができます。
そして、入力xと重みwを定義します。
今回は、特に意味のない数値をいれてあります。
ニューラルネットワークの単純パーセプトロンにおいて、出力は入力と重みの積で求められます。
ベクトルの内積や行列の積を計算することができる、np.dot関数を使って出力を求めます。
このコードの実行結果(y)は、 [14 32] となり正しい出力値がでました。
多層パーセプトロンの実装
次に、ニューラルネットワークの基本形となる多層パーセプトロンの実装を行ってみましょう。
入力xは、1・3の行列、重みwを3・2、重みvを2・3の行列とし、今回はバイアスb1、b2も入れ、出力yは1・3の行列となる例です。
実際にコードを書いてみましょう。
import numpy as np
def TwoLayer_Network():
network={}
network['W'] = np.array([[1,2],[3,4],[5,6]])
network['V'] = np.array([[1,2,3],[4,5,6]])
network['b1']=np.array([1,2])
network['b2']=np.array([1,2,3])
return network
def forward(network,input_data):
W,V = network['W'],network['V'] b1,b2 = network['b1'],network['b2']
Layer1 = np.dot(input_data,W) + b1
Layer1 = sigmoid_function(Layer1)
Layer2 = np.dot(Layer1,V) + b2
output_data = identity_function(Layer2)
return output_data
def sigmoid_function(x):
return 1 / (1 + np.exp(-x))
def identity_function(y):
return y
network =TwoLayer_Network()
input_data = np.array([1.0,0.5,1.0])
output_data = forward(network,input_data)
print(output_data)
上の二つと同様に、NumPyを読み込みます。
まず、重みとバイアスの初期設定を行います。
重みもバイアスも今回は意味のない数値に設定してあります。
次に、順伝番となる式をnp.dot関数を使用して定義します。
そして、活性化関数と恒等関数の定義を行います。
活性化関数はシグモイド関数を使用します。
シグモイド関数とは、あらゆる入力値を0.0~1.0の範囲の数値に変換して出力する関数です。
ニューラルネットワークではよく用いられてきた活性化関数の1つです。
式は、
で表されます。
恒等関数とは入力値をそのまま出力する関数であり、ニューラルネットワークでは出力層で使われます。
最後に、入力値を入力し、出力値を出力し表示します。
最終結果は、 [ 5.999772 8.99956243 11.99935285] となりました。
ここまでニューラルネットワークにおける簡単なパーセプトロンを中心に実装してみました。
データセット
これらを元に、データセットを準備し、訓練用データ(traindata)とテストデータ(testdata)に分けて実際に学習し分類などを行うことができます。
それにより、Pythonでより複雑なモデル(model)にも学習をさせることが可能になります。
有名なデータセットには、アイリス花データセットやMNISTのデータセットがあります。
アイリス花データセットは、アイリスの花3種類を各々50ずつ計150のデータです。
変数として、がく片の長さと幅、花びら長さと幅をcmで計測した4つの変量が入っています。
これらの変数を用いて、分類するという回帰問題を実装できます。
また、MNISTのデータセットは、手書き数字の画像データセットです。
主に画像認識を目的としたデータセットで分類問題として引用されます。
最後に
今回は、ニューラルネットワークをPythonを使ってプログラミングする方法を紹介しました。
単純パーセプトロンと、順伝番を含んだ多層パーセプトロンまでの実際のPythonのコードと実行結果を見てきました。
具体的にどのように学習を始めたらいいか悩む方は、Python講習セミナーという講座でプログラミングのプロから教わるのがおすすめです。
独学ではよくわからないまま学習が進んでしまうので、しっかりプロに教えてもらうときちんとした知識がつくでしょう。
プログラミングは、実際に手を動かしてコードを書くことが習得への道になります。
またプログラミングを書くことで、よりその学習の手法の理解が進むこともあります。
みなさんもPythonのコードを写すところからでもよいので、挑戦してみてはいかがでしょうか。