Go言語 :簡単な AI を作ってみよう~

この記事は約7分で読めます。

今回はGo言語入門~簡単なAI( ニューラルネットワーク )~を作ってみようです。

最初の AI は煽りすぎましたね笑

人工知能って、Pythonで書かれることが殆どなんですが、

実はGoでも書けます!

今回はニューラルネットワークを用いて、AI入門します。仕組みを一から実装するのは、とてもじゃないですが厳しいですよね。これも、パッケージがあります。本当にありがたいですよね。一から全て作る必要がないのは本当に助かります。。笑

今回は複数の記事に分けようと思っています。

では早速いきましょう!

制作物

  • XORを実現する
  • 学習モデルを保存&使う

利用技術

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

先ほど、少し出ていましたが、今回はニューラルネットワークを用います。

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

脳機能に見られるいくつかの特性に類似した数理的モデルである。「マカロックとピッツの形式ニューロン」など研究の源流としては地球生物の神経系の探求であるが、その当初から、それが実際に生物の神経系のシミュレーションであるか否かについては議論があるため人工ニューラルネットワーク(artificial neural network、ANN)などと呼ばれることもある。

wikipedia 参照

元々は、人間の脳にあるニューロンというものを模して作られたネットワーク構造のモデルなんですね。

少し詳しく説明している記事はこちらです。

実践

XORを実現する

xorというのはビット演算子なんですが、簡単にいうと、2つのビットが同じだったら0、違ったら1になるというものです。

  • (1,1)→0
  • (1,0)→1
  • (0,1)→1
  • (0,0)→0

これです。入力された0or1が違う場合,1を出します。

これをニューラルネットワークで実現していきます。

コード

package main

import (
	"fmt"
	"math/rand"

	"github.com/goml/gobrain"
)

func main() {
	// set the random seed to 0
	rand.Seed(0)

	// xorの入力とその入力に対する答え(教師データ)
	patterns := [][][]float64{
		{{0, 0}, {0}},
		{{0, 1}, {1}},
		{{1, 0}, {1}},
		{{1, 1}, {0}},
	}

	// モデル初期化
	ff := &gobrain.FeedForward{}

	//ネットワークを構成
	// 引数は左から順に、入力数,中間層の次元数,答えの数を設定する
	ff.Init(2, 2, 1)

	// 学習させるメソッド
        // 引数は左から順に学習させるパターン,学習回数,学習率,運動量係数,最後のエラーを出力するかどうか
	ff.Train(patterns, 1000, 0.6, 0.4, false)

	// 入力する値
	inputs := []float64{1, 1}

	// 結果
	result := ff.Update(inputs)

	// 表示
	fmt.Println(result)
/*
  全て表示させる場合
     inputs := [][]float64{
       {1,1},
       {1,0},
       {0,1},
       {0,0},
     }
     for _,input := range inputs{
       result := ff.Update(input)
       fmt.Println(input[0],",",input[1],":",result[0])
     }
   */

}

かなり簡単にできませんか?これでニューラルネットワークを使って学習できているのです。

パッケージ

“github.com/goml/gobrain”…ニューラルネットワークを実装している今回の主役、簡単に学習できる。

実行結果

inputs := []float64{1, 1}の値変えて、試してください。

1,1: 0.09740879532462123//=>about 0
1,0: 0.9278099662272838//=>about 1
0,1: 0.9301006350712101//=>about 1
0,0: 0.057503945708445206//=>about 0

近似すれば答え通りになりましたね!

学習モデルを保存&使う

次は、応用で扱うために、学習したモデルを別ファイルに保存して、その保存したものを再度使う処理を書いてみます。

package main

import (
	"fmt"
	"log"
	"math/rand"

	"github.com/axamon/gobrain/persist"
	"github.com/goml/gobrain"
)

func main() {
	rand.Seed(0)

	patterns := [][][]float64{
		{{0, 0}, {0}},
		{{0, 1}, {1}},
		{{1, 0}, {1}},
		{{1, 1}, {0}},
	}

	ff := &gobrain.FeedForward{}

	ff.Init(2, 2, 1)

	ff.Train(patterns, 1000, 0.6, 0.4, false)
	filaneme := "./ff.json"
	err := persist.Save(filaneme, ff)
	if err != nil {
		log.Println("保存に失敗しました: ", err.Error())
	}

	ff2 := &gobrain.FeedForward{}
	err = persist.Load(filaneme, &ff2)
	if err != nil {
		log.Println("取得に失敗しました", err.Error())
	}

	inputs := [][]float64{
		{1, 1},
		{1, 0},
		{0, 1},
		{0, 0},
	}
	for _, input := range inputs {
		result := ff.Update(input)
		fmt.Println(input[0], ",", input[1], ":", result[0])
	}
}

変更点

filaneme := "./ff.json"
	err := persist.Save(filaneme, ff)
	if err != nil {
		log.Println("保存に失敗しました: ", err.Error())
	}

	ff2 := &gobrain.FeedForward{}
	err = persist.Load(filaneme, &ff2)
	if err != nil {
		log.Println("取得に失敗しました", err.Error())
	}

ここです。

persist.Save()でモデルをfilenameに保存しています

persist.Load()でfilenameからモデルを呼び混んでいます。

これだけでモデルを読み書きできるのはこのパッケージの良いところですよね。

実行結果

1 , 1 : 0.09740879532462123
1 , 0 : 0.9278099662272838
0 , 1 : 0.9301006350712101
0 , 0 : 0.057503945708445206

同じ結果になりましたね

 

まとめ

今回は、Go言語を用いて、ニューラルネットワークを用いた簡単なプログラムを作成してみました。次回以降、これを用いて応用していきます。

今回のコードは「過学習」という状態になっています。

これは、学習データに適応させすぎて、他のデータが入ってきた時に、良い結果が得られないということです。

そのため、上手くパラメータを設定する必要があリマス。。。

 

 

追記

Golang : DeepLearningを用いた画像分類
今回はディープラーニングを用いて、画像分類を作成してみます。 Golang を用いて実装しています。手を動かすことで、深層学習の理解が深まりやすくなると思います。一度ライブラリを用いて作ってみて、動いたら、go-deepの自分でコードを読み進めることをオススメします。

ニューラルネットワークを使った画像分類について記事を書いたので、ぜひ試してみてください!

(綾鷹とティーダ(ffx)とラベンダーの画像分類とかしてます)

 

それでは。

タイトルとURLをコピーしました