1. Steepest Descent
核心:
是f在x处下降最快的方向。
问题:如何选择步长
方法1:在
方向做一次line search(用比如牛顿法),选择在这条线上能到达的最小的f对应的x作为下一步的起始点。
其中
是第k次迭代的步长。每次迭代都需要一个子优化过程,所以很慢!
方法2:恒定步长(太小的话收敛太慢,太大会jitter、diverge),或者动态调整,比如逐步减小步长、RProp、Quick Prop、 RMSprop。
def steepest_descent(func, x):
ret = [copy.copy(x)]
delta_x = np.zeros_like(x) + 1.0
partial_grad_func = elementwise_grad(func)
while np.linalg.norm(delta_x) > 1e-8 and len(ret) < 2001:
partial_grad = - partial_grad_func(x)
scaling_factor = 1.0
delta_scaling_factor = 1.0
def F(eta):
return np.dot(partial_grad_func(x+eta*partial_grad),partial_grad)
def grad_F(eta):
return grad(F)(eta)
i = 0
while abs(delta_scaling_factor) > 1e-8 and i < 1000:
delta_scaling_factor =