Julia FluxでMLPを実装して非線形関数を近似する方法
スタート
必要なパッケージをインポートし、近似したい非線形関数を定義しよう。
学習セットの生成
関数の定義域である$[-5, 5]$から無作為に1024点を選んだ。これらの点はFloat64
型だが、ディープラーニングでは一般的にFloat32
型を扱うので、変換した。もちろん、モデルにFloat64
やInt64
のデータを入力として用いても、自動的にデータ型を変換し実行するが。
また、各列が1つのデータを意味するため(わかりにくければ、行列の乗算を考えてみて)、1024ベクトルを1x1024マトリクスに変換した。
上で定義した関数$f$でラベルを作り、Flux.DataLoader
で訓練可能にした。
モデルの定義
Chain()
によってMLPを作り、関数のグラフを描いてみると、$f$と全く異なることが確認できる。
損失関数とオプティマイザの定義
損失関数はMSEとして、オプティマイザはADAMとした。
トレーニング
これで、@epochs
マクロで訓練することができる。5000エポックを繰り返した後、ロスが非常に小さくなったことが確認できる。
MLPのグラフは次のようになる。
コード全文
環境
- OS: Windows10
- Version: Julia 1.7.1, Flux 0.12.8