読者です 読者をやめる 読者になる 読者になる

旅するバイク乗り

旅が大好きなバイク乗りのブログです

広告

【ディープラーニング】Adamを用いた最適化プログラム in C言語

広告

検索してもなかなか出てこなかったのでメモ書き程度に記載

現在ディープラーニングの分野ではPythonがメインで使われているのは承知だが、
少々特殊なことをしているためできればCでAdamを用いた最適化を行いたかった

しかし中々調べても出てこないのでPythonのコードを読み解いてから自分で書いてみた
ミスがあったらごめんなさい

Adamの基本的な考え方については他のページを参考にしていただけるとありがたいです

double adam(double grad,int number,int it,int jt,int fl){
        double alpha=0.001;
        double beta1=0.9;
        double beta2=0.999;
        double eps=pow(10,-8);

        m[number-1][it][jt] += ((double)1.0-beta1)*(grad-m[number-1][it][jt]);
        v[number-1][it][jt] += ((double)1.0-beta2)*(grad*grad-v[number-1][it][jt]);


        double mh,vh;
        double fix1,fix2,lr;

        fix1=(double)1.0-pow(beta1,t);
        fix2=(double)1.0-pow(beta2,t);
        lr=alpha*sqrt(fix2)/fix1;

        mh=m[number-1][it][jt]/((double)1.0-pow(beta1,t));
        vh=v[number-1][it][jt]/((double)1.0-pow(beta2,t));

        switch(number){
                case 1:
                theta=w1[it][jt]-lr*m[number-1][it][jt]/(sqrt(v[number-1][it][jt])+eps);
                break;

                case 2:
                theta=w2[it][jt]-lr*m[number-1][it][jt]/(sqrt(v[number-1][it][jt])+eps);
                break;

                case 3:
                theta=w3[it][jt]-lr*m[number-1][it][jt]/(sqrt(v[number-1][it][jt])+eps);

                case 4:
                theta=w4[it][jt]-lr*m[number-1][it][jt]/(sqrt(v[number-1][it][jt])+eps);
                break;
        }
        if(fl==1)
                t++;

        return theta;
}

この関数の引数としては
・傾き grad
・配列管理用 number,jt,it
を用いました

このプログラムは私の行っている研究に特化したものとして作ったのでこれはベース程度に考えてもらえるとありがたいかもしれません

広告