- 让我们来看看问答管线的内部情况。 - Let's have a look inside the question answering pipeline.
问答管线可以提取答案 The question answering pipeline can extracts answers
对问题, 从给定的上下文或文本段落中， to questions from a given context or passage of text,
就像 transformers 仓库的 README 文档的这部分。 like this part of the transformers repo README.
它也适用于很长的上下文， It also works for very long contexts,
即使答案很靠后，就像这个例子一样。 even if the answer is at the very end, like in this example.
在本视频中，我们将了解原因。 In this video, we will see why.
问答管线遵循相同的步骤 The question answering pipeline follows the same steps
与其他 pipeline 一样： as the other pipelines:
问题和上下文被标记为一个句子对， the question and context are tokenized as a sentence pair,
提供给模型，然后应用一些后处理。 fed to the model then some post-processing is applied.
分词化和模型步骤应该很熟悉。 The tokenization and model steps should be familiar.
我们使用适合问答的 auto 类 We use the auto class suitable for question answering
而不是序列分类， instead of sequence classification,
但与文本分类的一个关键区别 but one key difference with text classification
是我们的模型输出两个张量, 名为 start logits is that our model outputs two tensors named start logits
和 end logits 。 and end logits.
这是为什么？ Why is that?
嗯，这就是模型找到答案的方式 Well, this is the way the model finds the answer
对这个问题。 to the question.
首先，让我们看一下模型输入。 First, let's have a look at the model inputs.
它的数字相关联于分词化 Its numbers associated with the tokenization
问题, 对应于上下文 of the question followed by the context
使用通常的 CLS 和 SEP 特殊 token 。 with the usual CLS and SEP special tokens.
答案是那些 token 的一部分。 The answer is a part of those tokens.
所以我们要求模型预测哪个 token 开始 So we ask the model to predict which token starts
答案并结束答案。 the answer and which ends the answer.
对于我们的两个 logit 输出， For our two logit outputs,
理论上的标签是粉色和紫色的向量。 the theoretical labels are the pink and purple vectors.
要将这些 logits 转换为概率， To convert those logits into probabilities,
我们需要应用 SoftMax， we will need to apply a SoftMax,
就像在文本分类管线中一样。 like in the text classification pipeline.
我们只是掩蔽不属于上下文的 token We just mask the tokens that are not part of the context
在此之前，不掩蔽初始 CLS token before doing that, leaving the initial CLS token unmasked
因为我们用它来预测一个不可能的答案。 as we use it to predict an impossible answer.
这就是它在代码方面的样子。 This is what it looks in terms of code.
我们使用一个大的负数作为掩码， We use a large negative number for the masking,
因为它的指数将为零。 since its exponential will then be zero.
现在，每个概率, 对于开始的 Now, the probability for each start
和对于结束的可能答案的位置， and end position corresponding to a possible answer,
我们给的分数就是 we give a score that is the
开始概率和结束概率之乘积 product of the start probabilities and end probabilities
在那些位置。 at those positions.
当然，开始索引大于结束索引 Of course, a start index greater than an end index
对应一个不可能的答案。 corresponds to an impossible answer.
这是找到最佳分数的代码 Here is the code to find the best score
对一个可能的答案。 for a possible answer.
一旦我们有了这些 token 的开始和结束位置， Once we have the start and end positions of the tokens,
我们使用分词器提供的偏移量映射 we use the offset mappings provided by our tokenizer
找到初始上下文中的字符范围， to find the span of characters in the initial context,
并得到我们的答案。 and get our answer.
现在，当上下文很长时，它可能会被截断 Now, when the context is long, it might get truncated
由分词器。 by the tokenizer.
这可能会导致部分答案，或者更糟的是， This might result in part of the answer, or worse,
整个答案，被截断了。 the whole answer, being truncated.
所以我们不丢弃截断的 token So we don't discard the truncated tokens
但与他们一起构建新功能。 but build new features with them.
这些功能中的每一个都包含问题， Each of those features contains the question,
然后是上下文中的一大块文本。 then a chunk of text in the context.
如果我们采用不相交的文本块， If we take disjoint chunks of texts,
我们最终可能会得到拆分的答案 we might end up with the answer being split
于两个特征之间。 between two features.
因此，我们取而代之的是重叠的文本块， So instead, we take overlapping chunks of texts,
确保至少一个块将完全包含 to make sure at least one of the chunks will fully contain
问题的答案。 the answer to the question.
分词器自动为我们完成所有这些 The tokenizers do all of this for us automatically
使用 return overflowing tokens 选项。 with the return overflowing tokens option.
步幅参数控制 The stride argument controls
重叠 token 的数量。 the number of overlapping tokens.
这是我们非常长的上下文如何被截断的 Here is how our very long context gets truncated
在两个有一些重叠的特征中。 in two features with some overlap.
通过应用我们之前看到的相同的后处理 By applying the same post-processing we saw before
对于每个特征，我们得到一个分数的答案 for each feature, we get the answer with a score
对于他们每个， for each of them,
我们选择得分最高的答案 and we take the answer with the best score
作为最终解决方案。 as a final solution.