样本平均近似
样本平均近似(sample average approximation,SAA)用一组随机样本的平均成本代替期望成本,再求解这个确定的优化问题。它先把样本固定下来,所有候选决策比较同一组情景;求得的样本最优值和所选决策的真实期望成本是两个不同对象。
一个能完全算出的抽样问题
设只能从 中选x,随机需求ξ以相同概率取0、2,成本 。真实期望为 三个真实成本依次为2、1、2,最优x=1,最优值一。
假设独立抽到四个样本 。固定这组数据后,样本平均成本为 。在允许的三个决策上,成本依次是1、1、3。若平局选较小x,就选零:样本最优值仍为一,但所选决策的真实成本是二,真实最优性差距是一。样本目标值碰巧接近真实最优值,并不能证明所选方案好。
有解变式抽到 ,则样本平均恰与F相同,最优x=1。两组样本大小相同而答案不同,故一次小样本结果不能作为无误差结论。若把可行集改成连续区间[0,2],第一组样本的最优x会变成1/2;本条的有限候选证明有明确范围。
从逐点平均到优化保证
一般地,令X为含M个决策的非空有限集合,对每个x要求 可测且 。从同一总体独立同分布抽样 ,定义 由强大数定律,每个固定x的样本平均几乎必然趋向F(x)。因为候选只有有限个,有限个概率一事件的交仍有概率一,所以 设 。在任一已经实现的样本上插入样本目标,得到 中间省去的项 。这就把统一估计误差转换为优化误差,并证明真实差距几乎必然趋于零。若只把样本问题解到容差τ,则右侧再加τ。无限决策集不能直接用“有限个事件相交”的论证,须另证统一收敛。[1]
有界损失下的有限样本数
若进一步知道对每个x,成本几乎必然落在同一有界区间 ,且 ,Hoeffding不等式给出固定x的双侧误差概率不超过 。将M个候选的坏事件取并集,无需各候选成本之间独立,就有 因此,对 ,只要 便以至少 的概率保证所选方案的真实成本差距不超过 。这是抽样前的概率保证,不是对每个样本均成立的确定性界;成本无界或样本相关时不能直接套用。[2]
主例可用a=0、b=4、M=3。若要 ,充分样本数为 ,此时真实差距以至少九成五概率不超过二分之一。该分布上界较保守;它利用的是损失范围和候选数,并没有利用三个损失函数的全部结构。
样本最优值的乐观偏差与执行
对固定x,样本均值无偏;但先取最小再平均会产生向下偏差。因为对任意固定x都有 ,取期望并再对x取最小,得到 。这是期望上的不等式,并非每次样本最优值都偏低。评价已经选出的决策时,可使用独立验证样本;给定训练样本和所选决策后,独立验证均值仍以该决策的真实成本为条件期望。置信区间还需相应的方差、范围或尾部条件。
代码使用 Python 3 标准库,输入候选列表和已抽取的样本,输出每个候选的样本成本、所选x、样本最优值,以及本例已知总体下的真实成本。函数复制输入,不修改列表;M个候选、N个样本的计算需 时间,复制与结果表需 空间。这里明确枚举有限集合,求解误差为零,抽样误差仍存在。
import math
def finite_saa(candidates,samples):
choices,observations = tuple(candidates),tuple(samples)
if not choices or not observations:
raise ValueError("nonempty choices and observations required")
if not all(math.isfinite(v) for v in choices+observations):
raise ValueError("finite data required")
table = [(x,sum((x-z)**2 for z in observations)/len(observations)) for x in choices]
chosen,training = min(table,key=lambda row:(row[1],row[0]))
population = ((chosen-0)**2+(chosen-2)**2)/2
return chosen,training,population,table
def sufficient_n(M,width,epsilon,delta):
if M < 1 or width <= 0 or epsilon <= 0 or not 0 < delta < 1:
raise ValueError("positive size, width, accuracy and delta in (0,1) required")
return math.ceil(width**2/(2*epsilon**2)*math.log(2*M/delta))
for observations in [(0,0,0,2),(0,0,2,2)]:
print(observations,finite_saa([0,1,2],observations))
print("sufficient N",sufficient_n(3,4,.25,.05))
assert sufficient_n(3,4,.25,.05) == 613
输出第一组选择零、真实成本二,第二组选择一、真实成本一,充分样本数为613。SAA可使用复杂的确定性求解器处理样本目标;它本身不是每步更换新小批量的随机梯度算法,也不会单靠增加样本消除不恰当的分布假设。
参考文献
- ↑ Kleywegt and Shapiro (1999), The Sample Average Approximation Method for Stochastic Discrete Optimization,§2.1命题2.1,有限可行集的一致收敛。
- ↑ Nowak, Lecture 7: Chernoff’s Bound and Hoeffding’s Inequality,定理1及最后一页有限类并集界。