Julia で機械学習 〜 Flux.jl で XOR を学習させてみる
はじめに
この記事では, Julia の機械学習用フレームワークの Flux.jl を使って,簡単なニューラルネットワークに XOR を学習させてみます.
Flux.jl の詳細についてはドキュメントを参照してください.また,この記事はドキュメントを参考にしています.
コード
とりあえずこれがコードです.
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()
は の入出力を持つ層を意味します.引数は順番に,入力数・出力数・活性化関数です.
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 によるものです.詳しくはドキュメントを.