kogad blog

進化計算とかプログラミングとか,勉強したことを書きます.

Julia で機械学習 〜 Flux.jl で XOR を学習させてみる

はじめに

 この記事では, Julia の機械学習フレームワークの Flux.jl を使って,簡単なニューラルネットワークに XOR を学習させてみます.

 Flux.jl の詳細についてはドキュメントを参照してください.また,この記事はドキュメントを参考にしています.

fluxml.ai

コード

 とりあえずこれがコードです.

using Flux
using Flux: @epochs, mse, train!

m = Chain(Dense(2,4, tanh),
          Dense(4,1,σ))

loss(x,y) = mse(m(x), y)
ps = params(m)

xs = [[0,0], [0,1], [1,0], [1,1]]
ys = [0,1,1,0]
data = zip(xs, ys)

η = 0.1
opt = Descent(η)

@epochs 10000 train!(loss, ps, data, opt)

# 結果
for i = 1:4
    println(m(xs[i]))
end

解説

m = Chain(Dense(2,4, tanh),
          Dense(4,1,σ))

 この部分でニューラルネットワークのモデルを定義しています.

Dense() y = Wx + b の入出力を持つ層を意味します.引数は順番に,入力数・出力数・活性化関数です.

  Chain() は引数で渡した層・関数を繋げてくれる関数です. Flux.jl で定義されている層の他に,自作の関数を用いることもできます.

σシグモイド関数です.Flux.jl で定義されています.

  

ps = params(m)

 params()はモデルを引数とし,そのモデルのパラメータをまとめたものを返してくれます.

  

xs = [[0,0], [0,1], [1,0], [1,1]]
ys = [0,1,1,0]
data = zip(xs, ys)

 データセットです.今回はXORの入出力です.

  

η = 0.1
opt = Descent(η)

 ここではパラメータの最適化手法を定義しています.

Descent() は勾配降下法で,η は学習率です.

ちなみに,Flux.jl では勾配降下法以外にも,ADAM等が用意されています.

  

@epochs 10000 train!(loss, ps, data, opt)

 この部分で学習を行います. @epochs マクロで指定したエポック数だけ train!() を実行します.

引数で指定した損失関数・パラメータ・データセット・最適化手法に対し学習を行います.

結果

 結果はこんな感じになりました.

Float32[0.00527357] (tracked)
Float32[0.986211] (tracked)
Float32[0.986653] (tracked)
Float32[0.0163712] (tracked)

  この出力に対応する入力は,上から順に[0, 0], [0, 1], [1, 0], [1, 1] なので,ちゃんと学習できているみたいです.

(tracked) は Flux.jl によるものです.詳しくはドキュメントを.