LoginSignup
1
0

純粋なC言語でディープラーニングがしたい!!1

Last updated at Posted at 2024-02-16

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言語は戻り値、一つの値しか返せないのがストレス。

この中身はマウント取ってるだけなので開かないことを推奨 ここまで理解してる人高校生以下の年齢ではそうそう居なそう。 そもAI作れる人って大体大学生だよね。 高校生AIエンジニアはネット見ても数人しか私は知らない。絶滅危惧種です。 ちな私は小学生の時Kerasで強化学習使って歩行AI作ってましt((((
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0