URLs
ソースコード(2/16日時点で一応動く程度)
Github / リポジトリ
まえがき
どうもpythonの遅さにうんざりしてきたApfelです。
今回はC言語のAI開発ライブラリを作り始めたので、
現在実装済み(2/16)の機能の数式レベルの解説をしようと思います。
C言語のコード解説とかは次回の予定です。
この記事では、数学メイン?です。
微積&行列演算ができること前提です。ご了承ください。
AIを作ったことがある人向けと思ってます。
微積&行列演算についてはそのうち解説書こうと思います。
本題
実装済みの機能一覧
全結合層
一般的にはDenseとかLinear(torch)とかで表されるやつですね。
これは行列演算一括でできるので順伝播は一番楽でした。
損失関数
MAELoss
平均絶対値誤差と呼ばれる物です。
予測した数値から正解の数値を引き、絶対値を求めると間違えた量がわかりますよねってやつです。
一応数式
$X$ = 予測値
$Y$ = 正解
$L$ = 誤差、損失とも呼ぶ。
$L = |X - Y|$
という形です。
最適化関数
SGDという名の純粋な勾配効果法
SGDとは確率的勾配降下法の略なのですが、この関数は現在ただの勾配効果法です...
まあ、勾配効果法とはなんぞやって話をしましょうか。
数学のお時間です。
$W_{t-1}$ = 現在のパラメーター
$W_{t-0}$ = 次の瞬間のパラメーター
$x$ = 入力
$L$ = 損失
$lr$ = 学習率
として定義します。
勾配効果法は
$W_{t-0} = W_{t-1} -lr\frac{\partial L}{\partial Wt_{-1}}$
という形であり、$W$を変化させて近似させる数式です。
問題は二つあります。まず一つ目、コイツは偏微分なので、$lim_{n → +0}$を使うのですが、0に正の方向から極限まで近づけた数値です。何が言いたいかというと、「どこまで細かくするか」という問題です。本当は変数型の最小まで行くのが正解でしょうが、なんか気に食わなかったので$lr$を$lim_{n → +0}$として扱いました。
基本$10^{-4}$とかを使いますので、十分に小さいかなと思いましたが、書いてる時に「これヤバくね」って思ったので修正しときます。
二つ目は重要で、「多層化すると計算量が莫大になる」という問題です。
もし一層目のパラメータを変化させたら、それ以降の層の全ての演算を行い、損失を微分しなければなりません。これでは非常に非効率的です。
この問題は連鎖率、多変数関数の合成関数の微分の方法を使えば解決できます。
この解決法こそがバックプロパゲーション・逆誤差伝播法なのです。
バックプロパゲーション・逆誤差伝播法
これは、勾配効果法の偏微分を、連鎖率に従った微分と置き換えることでできます。
連鎖率はとても説明しなくてはならない事が多いので、ここでは解説しません。
そのうち解説します。多分...
あとがき
C言語って早いので好きです。
AI開発はpythonがメジャーですけど、pythonって...ほら、遅いじゃ無いですか。
その遅さにうんざりしている方はC言語に移行してみるのも面白いかもしれません。
でもC言語は戻り値、一つの値しか返せないのがストレス。