
8.3
勾配を利用する
■
113
同様に勾配を求めます。
def estimate_gradient(f: Callable[[Vector], float],
v: Vector,
h: float = 0.0001):
return [partial_difference_quotient(f, v, i, h)
for i in range(len(v))]
「差分商を用いた推定」の欠点は、計算量が多いところです。
v
の長さを
n
とした
場合、
estimate_gradient
は、異なる入力に対して
f
を
2
n
回評価する必要があ
ります。勾配を何度も求めるのであれば、多くの余計な作業を行っています。す
べての作業において、勾配関数を明示的に計算しなければなりません。
8.3
勾配を利用する
sum_of_squares
関数が最も小さくなるのは、入力
v
が
0
のベクトルである場合と
いうのは簡単にわかります。しかし、ここでは、それを知らないこととして、
3
次元ベ
クトルについて勾配を使って最小値を求めてみましょう。開始点をランダムに選択し、
勾配が増える方向とは逆に少しずつ移動し、勾配が非常に小さくなるまで続けます。
import random
from scratch.linear_algebra import distance, add, scalar_multiply
def gradient_step(v: Vector, gradient: Vector, step_size: float) -> ...