我想重新实现一个涉及概率优化的方法。我得到的笔记中包括了关于那个参数的梯度计算,并且笔记中提到“在[0,1]
区间内,导数有一个静止点,我们使用最速上升法”。
我搜索了关于实现它的提示,发现了这个和维基百科上的爬山法条目。(但两者都没有给出非常具体的建议。)
我认为将它与二分查找结合起来是个好主意,计划以以下方式实现(伪代码):
steepest_ascent(param, min_itvl, max_itvl): if (max_itvl - min_itvl < 0.01): return param d = gradient(param) if (d == 0): return param if (d > 0): return steepest_ascent((param + max_itvl) / 2, param, max_itvl) if (d < 0): return steepest_ascent((min_itvl + param) / 2, min_itvl, param)
整个过程是一个迭代程序的一部分,因此调用方式如下(因为是概率,所以区间是[0,1]
):
param_new = steepest_ascent(param_old, 0, 1)
这里有什么明显可以改进的地方吗?
回答:
你实现的是二分法,这与梯度上升法不同。(我猜你的函数是凹函数?)要进行梯度上升法,重复更新param = param + alpha * gradient(param)
,其中alpha是一个适当选择的正值(太小会导致计算时间过长,太大会导致永远无法收敛),直到满足某种收敛标准为止。