python

しょっちゅう忘れることを書いておく。

33

331 views

勾配法

機械学習で良く用いられる勾配法を、y=x^2をloss関数として、最小値を見つけるサンプルプログラムを以下に記す。
微分に関してはとりあえず学校の教科書に合わせた記述にしている。

# coding:UTF-8

def loss(x):
    #仮の損失関数
    y = x**2
    return y


def gradient(x):
   # 微分を求める
    d = 0.001
    g = (loss(x+d) - loss(x)) / d
    return g


def main():
    step = 100
    lr = 0.1  # 学習率
    x = -3.0
    for i in range(step):
        # 微分する
        g = gradient(x)
        # xから微分の傾き分を減らす
        x = x - lr * g
        print(x, g)


if __name__ == '__main__':
    main()

Xから微分の値を引くのが意味不明に思えるが、微分を行ったときに傾きが+であればxは減らす、-であればxを増やすと考えればよい。
傾きが急であれば急であるほど、大きくxを増やしたり減らしたりする。
反対に傾きが0に近づくほど、xは変化しなくなる。
lrに関しては、微分した結果が例えば10と出た場合、一気に10引くのではなく、少しだけ引くというイメージ。
複数の鞍点があるときに、大きな数字を引いてしまうと、ジャンプしてしまうのを避けることが目的と思われる。

Page 31 of 56.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

マッスル

自己紹介

本サイトの作成者。
趣味:プログラム/水耕栽培/仮想通貨/激辛好き
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626