python

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

66

495 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 69.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

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

ツイッター

@darkimpact0626