人工智能自然语言处理领域中,很多都能转换为序列的预测问题,比如
- 分词算法可以转化为预测每个字的标签B(词开始位置)、M(词中间位置)、E(词结束位置)、S(单字作为词)
- 语音识别、机器翻译、文本生成算法可以认为是预测每个位置的词语
- 输入法里面的拼音转汉字等等
而数字通信领域,接收机侧做的工作,本质上也是二进制0、1序列的解码,可以看成是二进制序列的预测问题。
同为序列预测问题,为什么分词用维特比算法,机器翻译用定向搜索(BeamSearch)算法,而通信解码用维特比算法呢?本文会分析两大解码算法:维特比、BeamSearch的复杂度及其适用的场景。

人工智能领域 VS 通信领域
一些符号约定:
- 词典大小: V (vocabulary size),
- 序列长度: L (length)
- 定向宽度: B (Beam Width)
暴力搜索: O(V^L)
最简单的方法,用暴力美学去穷举,遍历所有可能路径后,找到最优值。复杂度为O(V^L)。

暴力穷举所有路径: O(V^L)
维特比算法: O(V*V*L)
做过中文分词研究人,都会熟悉维特比算法。维特比算法,同时也是数字通信中最常用的算法之一。
这么说可能有点抽象,发明维特比算法的维特比本人,是高通公司的创始人之一,传说是全球第二富有的数学家。(对,就是那个3G、4G、5G领域,和华为竞争,靠制定标准闻名世界的、美国公司)

通信中的卷积码
维特比算法的核心,就是每个时刻,始终维护V条路径,这V条路径的最后状态两两不同,与V个状态一一对应。对t-1时刻的V条路径,按后续所有的可能状态展开,生成V*V条候选路径,再选择V条路径(每条路径结尾状态均不同),成为t时刻维护的V条路径。 复杂度为O(V*V*L)。
下图中,横坐标为时间轴,纵坐标为状态(V=4)。注意:
- 黑色路径为丢弃的路径,
- 蓝色路径为t时刻生存下来的路径,
- 青色为t-1时刻生存下来,但t时刻丢弃的路径
- 每个时刻,生存下来的路径终点与状态数一一对应

维特比算法:O(V*V*L)
理论上可以证明,维特比解码算法获得的路径就是最优解。有兴趣的,可以想一想。
定向搜索法(BeamSearch): O(V*B*L)
这是一个近似解法,与维特比算法相同的是,每一个时刻始终维护B条路径;不同的是,从t-1时刻的B条路径,展开B*V条路径后,直接取前B条路径,作为 t时刻维护的B条路径。算法复杂度为O(V*B*L), 其中B为Beam Width,翻译为中文,是定向光束的宽度,远小于V, 通常在10以内。

BeamSearch算法: O(V*B*L),B=3

机器翻译
注意:解码算法、机器学习算法的不同
虽然机器翻译、分词都是机器学习问题,但此处的解码算法(维特比、 BeamSearch)和计算机科学领域的排序算法是同一性质,本质上是从众多路径中找出最优路径,答案是确定的,属于动态规划。
而机器学习领域的算法,是基于数据,用随机梯度下降法,去拟合模型的众多参数,来使目标损失函数最小,比如决策树、随机森林、深度学习等。很多公司中的算法工程师,主要是做这方面的工作的。
当然,机器学习领域算法的实现,底层都是用计算机科学领域的算法实现的,来保证高效。
注释:人工智能领域中深度学习火起来后,有些概念和其他领域都重名了。比如CNN中卷积和信号处理的卷积,从数学公式上不同,但形式上又相差不大。
总结
BeamSearch、维特比算法复杂度的不同,决定了不同的应用场景。
- 对于V很大,比如机器翻译,通常词汇量都上万的,如果用维特比算法,可能要等几个小时才能解码成功,黄花菜都凉了,只能用BeamSearch近似解法
- 而对于V很小的情形,比如接收机中的卷积码解码,中文分词(BMES四中状态, V=4),用维特比即可