Flux.jl入門資料メモ


# イントロ
[Flux.jl](https://fluxml.ai/)は[Julia言語](https://julialang.org/)の深層学習フレームワークである。モデル構築、自動微分、データハンドリング、モデル更新の枠組みが提供されている。公式リファレンスはちゃんと書かれているが、量が多いのでabsolute beginnerな人間には最初のほうに眺めるべきものがよくわからない(読む順番がわからないというか)。

理解を深めていく段階とかじゃなくて、めっちゃ簡単なものをコピペじゃなくて自分で書けるようになりたいという段階で役に立つものが列挙されているととても助かるのではないかと思う。というわけで、最近Fluxを勉強し始めている自分が眺めている文献をメモ付きで列挙していくことにする。

<font color="Red">Fluxの素人によるメモなので、あんまり役に立たないものも含まれているかもしれない。あと書きかけである。随時更新するかもしんない</font>


# どういうものを眺めたらいいのか
Fluxで機械学習をやってみたいのだとする。つまり、適当なモデルを損失関数と自動微分そして勾配法を使って学習させてみたいのだとする。差し当たって必要なのは、簡単な問題において以下のような作業を自分で書けるようになることだと思う。

* データの準備
* モデルの定義
* 損失関数の定義
* 勾配の計算
* 勾配を使ってモデルを更新
* 学習結果のチェック
    * 学習後、あるいは学習中。任意の段階で。
    * validationデータでのリスクの計算とか

そのためには、

* __雰囲気をみる__ （各関数の意味の正確な理解はさておき）とりあえず大体どんな感じの関数を使って一連の流れを実現するのかを把握し
* __各ステップの基本を抑えつつ簡単なモデルを学習させてみる__ その後で、各段階で使う関数の基本的な理解を得ながら、簡単なモデルの学習（線形回帰・ロジスティック回帰あたり？）を実際に書いてみる。*平易なものから始める。深層学習っぽくなくてもよい*
* __リッチにしていく__ ちょっとずつ深層学習のフレームワークを使った計算っぽくしていく

というようなことをしたらいいかもしれない。それができればあとは随時公式ドキュメントや各種実装例を読みつつ、より複雑なものが作っていけるのではないか（と、いま私は期待している）。で、上の各ステップにおすすめなのは

* __雰囲気を見る__
    * [60分イントロ](https://fluxml.ai/tutorials/2020/09/15/deep-learning-flux.html)
        * 公式が提供している60分チュートリアル。とりあえず最初にこれを眺めると雰囲気わかるような
        * Julia経験者はArraysを飛ばして読んでよさそう
    * [公式リファレンスのBuilding ModelsのBasics](https://fluxml.ai/Flux.jl/stable/models/basics/)
        * 上のチュートリアルに類似してる。もうちょい基本的なところからやってるかもしれない
        * 例えば、`Dense`とかのモデルがどういうものの抽象化なのか雰囲気がわかるので一度読んでおくといいと思う
        
* __各ステップの基本を抑えつつ簡単なモデルを学習させてみる__
    * [公式リファレンスBuilding Models/Basics](https://fluxml.ai/Flux.jl/stable/models/basics/)
        * モデル作りの基本
    * [公式リファレンスTraining Models/Training](https://fluxml.ai/Flux.jl/stable/training/training/#Training)
        * 学習パートの基本。たとえば、バッチ学習を生で書いていて`train!`関数にデータを渡すときになんで`[(X, y)]`なんて形で渡すのだ？というのは[ここを読めばわかる](https://fluxml.ai/Flux.jl/stable/training/training/#:~:text=For%20each%20d%20in%20data%2C%20first%20the%20gradient%20of%20the%20loss%20is%20computed%20like%20this%3A)
            * 勾配計算〜パラメータ更新
            * 損失関数の定義について
            * 学習対象のパラメータのわたしかた
            * データのわたし方について
                * `@epochs`とかあるんだけどちょっとわかりにくい
                *  どうせJuliaのコードなんだし、ループくらいは自分で書いてもいいような気がする

    * [公式リファレンスTraining Models/Training/](https://fluxml.ai/Flux.jl/stable/training/training/#Datasets)
* __リッチにしていく__
    * [DataLoaderのチュートリアル](https://fluxml.ai/tutorials/2021/01/21/data-loader.html)
        * データローダーを使ったデータの読み込み
        * 配列で用意したデータをそのまま損失関数に与えてもよいが、ミニバッチとか作りたいときはDataLoader使ったほうが楽
    * [公式リファレンスLoss Functions](https://fluxml.ai/Flux.jl/stable/models/losses/)
        * Fluxで最初から実装されている損失関数の仕様確認

# 資料リンク集
以下に上で紹介したリンクも含めて色々おいておく。

## Flux速習系
* [60分イントロ](https://fluxml.ai/tutorials/2020/09/15/deep-learning-flux.html)
    * 公式が提供している60分チュートリアル。とりあえず最初にこれを眺めると雰囲気わかるような
    * Julia経験者はArraysを飛ばして読んでよさそう
    * 自動微分の仕組み（Fluxが提供しているtrainingの背後でどういうことをしているのか教えたいのでは）
    * 自動微分を利用した学習の雛形
    * CIFAR10に対する畳込みニューラルネットワークの学習例
* [公式リファレンス Building Models/Overview](https://fluxml.ai/Flux.jl/stable/models/overview/)
    * 公式リファレンス内のFluxのoverview
    * Building Modelsの中に入ってるけど、学習まで含めた一連の流れと思ってもよい気がする

## モデルの作り方
* [公式リファレンスのBuilding ModelsのBasics](https://fluxml.ai/Flux.jl/stable/models/basics/)
    * Building Modelsのうち、とりあえずBasicsを眺めると雰囲気がわかる

## データハンドリング
* [One-Hot Encoding with OneHotArrays.jl](https://fluxml.ai/Flux.jl/stable/data/onehot/)
    * 分類問題でデータをonehot encodingしたり、多次元の出力を分類ラベルに変換する関数の説明
* [Using Flux DataLoader](https://fluxml.ai/tutorials/2021/01/21/data-loader.html)
    * ミニバッチを使った学習とかで便利なDataLoaderの使い方説明
* [DataLoaderリファレンス](https://fluxml.ai/Flux.jl/stable/data/mlutils/#DataLoader)
    * DataLoaderのリファレンス

## 各種実装の例
* [model-zoo](https://github.com/FluxML/model-zoo)
    * tutorialからリンクが貼られてるやつ。いくつかの実装例がある
* [Mealhead.jl](https://github.com/FluxML/Metalhead.jl)
    * 画像処理系のモデルが色々実装されている。例えば、[Alexnetはこんな感じ](https://github.com/FluxML/Metalhead.jl/blob/master/src/convnets/alexnet.jl)
* [疑似データでの線形回帰の例1](https://gist.github.com/takashi-takahashi/a7f8af359b9c2c1ffc89bb8f5d63bafa)
* [疑似データでの線形回帰の例2](https://gist.github.com/takashi-takahashi/4f210cc7dd95d902156840b5961dbd69)
* [疑似データでの線形回帰の例3](https://qiita.com/cometscome_phys/items/f58174c0dad7ecb811ed)
* [疑似データでのロジスティック回帰の例](https://gist.github.com/takashi-takahashi/535c52ad7d0dd093cae4350802b57b33)
* [バッチ正則化の例]()
* [自前レイヤーの例](https://qiita.com/cometscome_phys/items/7452bda576a4bf26c1d1)