
隨機梯度遞減
∣
99
# 選出能讓誤差函數值最小化的相應值
next_theta = min(next_thetas, key=target_fn)
next_value = target_fn(next_theta)
# 如果結果收斂到一定程度,就停止下來
if abs(value - next_value) < tolerance:
return theta
else:
theta, value = next_theta, next_value
我們把這個程序稱為
minimize_batch
(最小化處理程序),因為每次沿著梯度跨越一步,
都會針對整組資料進行檢查(因為目標函數
target_fn
每次都會送回整組資料的誤差)。
在下一節的內容中,我們則會看到另一種做法,每次都只需要檢查一個資料點。
有時候,我們想求取的是函數的
最大值
;如果是這樣的情況,我們其實也只需要求取
函數負值的最小值(相應梯度也取負值)即可。
def negate(f):
""" 針對函數每個輸入值 x,全都送回相應的負函數值 -f(x)"""
return lambda *args, **kwargs: -f(*args, **kwargs)
def negate_all(f):
""" 如果 f 送回一串數字列表,也是一樣 """
return lambda *args, **kwargs: [-y for y in f(*args, **kwargs)]
def maximize_batch(target_fn, ...