> For the complete documentation index, see [llms.txt](https://baozoulin.gitbook.io/neural-networks-and-deep-learning/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://baozoulin.gitbook.io/neural-networks-and-deep-learning/di-wu-men-ke-xu-lie-mo-xing-sequence-models/di-wu-men-kexulie-mo-578b28-sequence-models/di-san-zhou-xu-lie-mo-xing-he-zhu-yi-li-ji-zhi-ff08-sequence-models-and-attention-mechanism/35-ji-shu-sou-suode-wu-cha-fen-xi-ff08-error-analysis-in-beam-search.md).

# 3.5 集束搜索的误差分析（Error analysis in beam search）

束搜索算法是一种**近似搜索算法**（**an approximate search algorithm**），也被称作**启发式搜索算法**（**a heuristic search algorithm**），它不总是输出可能性最大的句子，它仅记录着**B**为前3或者10或是100种可能

人工标记为$$y^\*$$。束搜索算法翻译结果标记为$$\hat y$$，是一个十分糟糕的翻译，改变了句子的原意：

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/748283d682db5be4855e61b90e96c427.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/748283d682db5be4855e61b90e96c427.png)

模型有两个主要部分，一个是神经网络模型，或说是序列到序列模型（**sequence to sequence model**），称作是**RNN**模型，另一部分是束搜索算法，以某个集束宽度**B**运行

**RNN**(**循环神经网络**)实际上是个编码器和解码器（**the encoder and the decoder**），它会计算$$P(y|x)$$。如对于句子：**Jane visits Africa in September**，将**Jane visits Africa**填入这里（上图编号1），忽略字母的大小写，后面也是一样，计算得到$$P(y^\*|x)$$，$$P(\hat y|x)$$ 同样如此，然后比较一下这两个值哪个更大

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/1bc0b442db9d5a1aa19dfe9a477a3c3e.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/1bc0b442db9d5a1aa19dfe9a477a3c3e.png)

* 若$$P(y^*|x)$$ 大于$$P(\hat y|x)$$，可束搜索算法却选择了$$\hat y$$ ， 因此能够得出束搜索算法实际上不能给出使$$P(y|x)$$最大化的$$y$$值，因为束搜索算法的任务就是寻找一个$$y$$的值来使这项更大，但是它却选择了$$\hat y$$，而$$y^*$$实际上能得到更大的值。因此这种情况下束搜索算法出错
* 若$$P(y^*|x)$$小于或等于$$P(\hat y|x)$$，$$y^*$$ 是比 $$\hat y$$更好的翻译结果，不过根据RNN模型的结果，$$P(y^*)$$ 是小于$$P(\hat y)$$的，即相比于$$\hat y$$，$$y^*$$成为输出的可能更小。因此在这种情况下是**RNN**模型出了问题

以上都忽略了长度归一化（**length normalizations**）的细节，如果用了某种长度归一化，那么要比较长度归一化后的最优化目标函数值

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/2689876529562b7d9a79bf868e7cbad7.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/2689876529562b7d9a79bf868e7cbad7.png)

误差分析过程：

1. 先遍历开发集，找出算法产生的错误
2. 假如$$P(y^*|x)$$的值为2 x 10$$^{-10}$$，而$$P(\hat y|x)$$的值为 1 x10$$^{-10}$$，得知束搜索算法实际上选择了比$$y^*$$可能性更低的$$\hat y$$，则束搜索算法出错，缩写为**B**
3. 接着继续遍历第二个错误，若对于第二个例子是**RNN**模型出现了问题，用缩写**R**来代表**RNN**
4. 接着遍历更多的例子，有时是束搜索算法出现了问题，有时是模型出现了问题，等等
5. 执行误差分析，得出束搜索算法和**RNN**模型出错的比例是多少。对开发集中每一个错误例子，即算法输出了比人工翻译更差的结果的情况，尝试确定是搜索算法出了问题，还是生成目标函数(束搜索算法使之最大化)的**RNN**模型出了问题。找到这两个部分中哪个是产生更多错误的原因
6. 只有当发现是束搜索算法造成了大部分错误时，才值得花费努力**增大集束宽度B**；如果发现是**RNN**模型出了更多错，那么可以进行更深层次的分析，来决定是需要**增加正则化**还是**获取更多的训练数据**，抑或是尝试一个**不同的网络结构**
