Juliaで深層学習 Vol.1

はじめに

この記事では2回に渡って、下記の内容を解説します。

  • Google Colab上でJuliaを実行できるように設定し、またGPUを使えるようにする
  • Juliaの機械学習ライブラリFlux.jlに関する解説
  • Flux.jlを用いて深層学習モデルを構築し、Pythonと比較を行う

Juliaとは

  • Juliaは、MITよって開発され2012年にオープンソース化された、高性能な動的プログラミング言語
  • 汎用言語で、あらゆるアプリケーションの作成に使用できるが、その機能の多くは数値解析や計算科学に適している
  • 2,500万回以上ダウンロードされており、Juliaコミュニテでは5,000を超えるパッケージが登録されている
  • Pythonのように簡潔に書くことができ、実行速度はPythonやRよりも1桁速いと言われている

JuliaをGoogle Colabで実行する

今回、実行環境にはGoogle Colabを使用します。

Julia on Google Colab.ipynb

Google ColabではデフォルトでJuliaを実行できるようにはなっていないので、次のようにjsonを記載した.ipynbファイルを作成します。

このjsonにはJuliaのバージョンやGPUの設定などが書かれています。あらかじめ作成したものを Julia on Google Colab.ipynb に公開していますので、ダウンロードしてください。

Julia on Google Colab.ipynbを開いたら、一番上のセルを実行してください。

Julia on Google Colab.ipynb

実行が完了したら、上のメニューの「ランタイム」->「ランタイムのタイプを変更」を選択してください。

Juliaのバージョンが記されたダイアログ

そうすると、Juliaのバージョンが記されたダイアログが出てくるので、「保存」を押してください。

これで、ランタイムがリセットされ、Juliaの実行環境が整いました。
試しに、versioninfo() のセルを実行してみましょう。下記のように出力されれば問題ないです。

Juliaのバージョンやosの情報が表示される

Flux.jlとは

Juliaの実行環境が整いましたので、Flux.jlについて解説したいと思います。

  • Flux.jlはJuliaの深層学習ライブラリであり、PythonでいうところのTensorFlowやPyTorch的な位置づけ
  • 深層学習のためのデータの読み込み、モデル構築、損失関数、オプティマイザーなどが提供されている
  • CUDAとCUDNNがインストールされいる環境であれば、GPUを使った学習も可能

以降で、Flux.jlに関する簡単な使い方を解説します。コードは Julia on Google Colab.ipynbにも記載してありますので、それを実行しながら見ていただければと思います。

パッケージの追加と呼び出し

import Pkg; Pkg.add(“Flux”)でFlux.jlを追加できます。

Flux.jlの追加

パッケージの呼び出しは using Flux でできます。

Flux.jlの呼び出し

データ読み込み

DataLoaderを使うことで、反復処理のためのミニバッチを作成することができます。
下のコードでは、10の要素からなる100個のXtrainと100個の正解ラベルYtrainをDataLoaderに渡し、サイズ2のミニバッチを作成しています。

ミニバッチを作成

レイヤー・モデルの定義

レイヤーは次のように、functionで定義することができます。

線形レイヤーを定義

また、Flux.jlに実装されているDenseを使って下記のようにすることもできます。

Denseレイヤーを定義

Chainを用いれば、レイヤーを積み重ねてモデルを定義することができます。

レイヤーを積み重ねてモデルを作る

損失関数

損失関数は、モデルが予測した予測値と正解データの2つを引き数に取ります。
aggオプションで、バッチで実行される集計のタイプを指定することができます。

平均二乗誤差を算出

もちろん、下記のように自分で損失関数を定義することもできます。

Flux.mseと同じ結果が出力される

オプティマイザー

ADAMオプティマイザーを使う時は、下記のように宣言します。

オプティマイザーの定義

Flux.train!(トレーニングループ)渡すこともでき、ループ内のモデルのすべてのパラメーターを更新します。

おわりに

今回は、Juliaの実行環境の設定方法とFlux.jlについて解説しました。
次回は、いよいよFlux.jlを用いて手書き数字の画像を分類するMNISTをやってみたいと思います。

(K.K)

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