有一次和朋友约图书馆见面,结果他走错路了(他常常走错路),他解释说下车的时候正好一个建筑挡着没看到右边,以当时的情况判断,只能往左边走,这是视角问题。难道所有第一次坐公交来的人都会走错?看似运气问题,实际是策略问题,如果下车不急着走,多张望一下,或者走出一段再回头看一眼……如果这是寻径机器人,谁又能说这不是算法问题呢?
所有决策都有类似问题,比如有人买股票亏多赢少,可能认为是运气性格或者是人性的弱点,但如果是参加股票建模竞赛,使用同样的数据,别人的模型总能跑赢你的模型,那肯定是策略问题。对人来说,可能怎样的人生都是一种体验,但对于模型来说,确实有好坏之分。
Beam Search译为集束搜索,它是自然语言处理中的一种常用方法,原理非常简单。比如:训练一个写作模型,根据前N个字预测第N+1个字。训练时相对比较容易,提供开头“白日”,根据“白日”预测下一个字是“依”,再根据“白日依”预测下一个字为“山”……在训练阶段,如果预测错误,通过正确值与预测值的差异调整模型,无论“白日”预测出的是什么,训练再下一个字时,仍可使用正确数据“白日依”作为条件。
在测试(或者实用)阶段,并不知道每一步的正确答案是什么。如果字库中有10000个字,已知前两个字是“白日”,预测的第三个字有10000种可能性,根据不同的第三个字再预测第四个字,就是10000x10000种可能性,以此类推,可能性越来越多,无法遍历所有的可能性。如果只选择可能性最高的一个字,若这个字错了,一步错步步错。
Beam Search有效地解决了这个问题,在预测第三个字时,选出可能性最高的前k个字,假设k=3继续预测下一个字,生成的可能性最大的前三个字是“白日依”,“白日梦”,“白日焰”,根据它们再生成第四个字,这样就生成了3x10000个可选项,从这些可选项里选择概率最高的前三个是“白日梦游”,“白日依山”,“白日梦我”,以此类推。这样即节约了算力,又不会一条道走到黑。