Beam Search

在seq2seq的模型中,通常都是Encoder+Decoder的形式.

image

在输出y的过程,每次给的是一个概率,比如:

\hat{y}^{<1>} = \begin{bmatrix} 0.6\\0.2\\0.1\\... \end{bmatrix}

这代表着 \hat{y}^{<1>} 为词a的概率是0.6,为词b的概率是0.2.我们可以每个时序都取最大概率的词,让后将他们组合起来,这有些像贪心算法.

但是我们知道贪心算法并不一定是最好的,举个例子:

Jane is visiting Africa in September.
Jane is going to be visiting Afica in September.

在翻译过程中第三个词going出现的概率比visiting的概率大,但是从整体上来看,第一个句子要比第二个句子更好.

Beam Search的做法很简单就是每次对概率排前几名的进行搜索.搜索的多少用超参数B来控制:

image

这样做的目的是让句子整体的概率最大化:

\arg \max _ { y } \prod _ { t = 1 } ^ { T _ { y } } P \left( y ^ { < t > } | x , y ^ { < 1 > } , \ldots , y ^ { < t - 1 > } \right)

为了防止连乘造成数值下溢,取对数:

\arg \max _ { y } \sum _ { y = 1 } ^ { T _ { y } } \log P \left( y ^ { < t > } | x , y ^ { < 1 > } , \ldots , y ^ { < t - 1 > } \right)

式子中的每个概率都是小于1的数,连乘越多最终的结果就越小,所以优化器趋向于选择较小的 T_y ,为了避免这个问题,将式子除以 {T_y} ^ { \alpha } ,其中 \alpha 是个超参数,可以取0~1之间的值.

\arg \max _ { y } \frac { 1 } { {T_y} ^ { \alpha } } \sum _ { y = 1 } ^ { T _ { y } } \log P \left( y ^ { < t > } | x , y ^ { < 1 > } , \ldots , y ^ { < t - 1 > } \right)

posted @ 2018-12-02 22:04:01
评论加载中...
发表评论