芜湖市公司网站建设哪家好,互联网行业使用收益法进行评估时,wordpress开发一个app后台,专门做效果图的网站一、说明 句子#xff08;短语或段落#xff09;级别嵌入通常用作许多 NLP 分类问题的输入#xff0c;例如#xff0c;在垃圾邮件检测和问答 #xff08;QA#xff09; 系统中。在我上一篇文章发现不同级别的BERT嵌入的趋势中#xff0c;我讨论了如何生成一个向量表示短语或段落级别嵌入通常用作许多 NLP 分类问题的输入例如在垃圾邮件检测和问答 QA 系统中。在我上一篇文章发现不同级别的BERT嵌入的趋势中我讨论了如何生成一个向量表示该表示包含有关上下文嵌入值相对于同一令牌的静态嵌入的变化的信息然后您可以将其用作生成句子级嵌入的组件。本文扩展了此主题探讨了您需要从句子中的哪些标记中派生此类趋势向量以便能够为整个句子生成有效的嵌入。 二、直觉 与此相关的第一个问题是您需要从句子中的多少个标记中派生嵌入才能为整个句子生成有效的嵌入如果你还记得上一篇文章中的讨论我们得到了一个向量——派生为句子中最重要的单词——其中包括有关整个句子上下文的信息。但是为了更好地了解句子上下文最好为与该最重要的单词在语法上最相关的单词提供这样的向量。我们为什么需要这个 生活中一个简单的类比可以帮助回答这个问题如果你坐在塔内的餐厅里欣赏周围的美景你考虑的景色将不包括塔本身。要拍摄塔楼景观的照片您首先需要离开塔楼。 好的我们如何确定与句子中最重要的单词在语法上最相关的单词也就是说您需要根据前面的类比决定拍摄塔的最佳位置答案是借助注意力权重您也可以从BERT模型获得。
三、实现 在遵循本文其余部分讨论的代码之前您需要参考上一篇文章中提供的示例我们将使用该示例中定义的模型和派生向量表示。您需要做的唯一更正如下 创建模型时请确保使模型不仅返回隐藏状态还返回注意力权重
model BertModel.from_pretrained(‘bert-base-uncased’,output_hidden_states True, # so that the model returns all hidden-states.output_attentions True) 其他所有内容包括例句都可以不加修改地使用。实际上我们只使用第一个例句“我想要一个苹果。 下面我们将确定语法上最接近最重要单词的单词在这个特定示例中为 Want。为此我们检查所有 12 层中的注意力权重。首先我们创建一个空数组我们不计算特殊符号不包括第一个和最后一个符号
a np.empty([0, len(np.sum(outputs[0].attentions[0][0][11].numpy(), axis0)[1:-1])])
接下来我们填写注意力权重矩阵
for i in range(12):a np.vstack([a,np.sum(outputs[0].attentions[0][0][i].numpy(), axis0)[1:-1]])
我们对标点符号不感兴趣。因此我们将删除矩阵中的最后一列
a np.delete(a, -1, axis1)
所以我们的矩阵现在看起来如下12x4即 12 层和 4 个单词
print(a)
[[0.99275106 1.00205731 0.76726311 0.72082734][0.7479955 1.16846883 0.63782167 1.39036024][1.23037624 0.40373796 0.57493907 0.25739866][1.319888 1.21090519 1.37013197 0.7479018 ][0.48407069 1.15729702 0.54152751 0.57587731][0.47308242 0.61861634 0.46330488 0.47692096][1.23776317 1.2546916 0.92190945 1.2607218 ][1.19664812 0.51989007 0.48901123 0.65525496][0.5389185 0.98384732 0.8789593 0.98946768][0.75819892 0.80689037 0.5612824 1.10385513][0.14660755 1.10911655 0.84521955 1.00496972][0.77081972 0.79827666 0.45695013 0.36948431]] 现在让我们确定 Want 的哪些层索引为 1 的第二列最受关注
print(np.argmax(a,axis1))
b a[np.argmax(a,axis1) 1]
array([1, 3, 0, 2, 1, 1, 3, 0, 3, 3, 1, 1]) 接下来我们可以确定在 Want 处于领先地位的层中哪个令牌在 Want 之后引起更多关注。为此我们首先删除“想要”列然后探索其余三个
c np.delete(b, 1, axis1)
d np.argmax(c, axis 1)
print(d)
counts np.bincount(d)
print(np.argmax(counts))
[0 2 2 2 0]
2 上面显示我们有苹果这个词在这里删除Want之后Apple的索引是2作为与单词Want在语法上最相关的一个。这是意料之中的因为这些词分别表示直接宾语和及物动词。
_l12_1 hidden_states[0][12][0][4][:10].numpy()
_l0_1 hidden_states[0][0][0][4][:10].numpy()
_l0_12_1 np.log(_l12_1/_l0_1)
_l0_12_1 np.where(np.isnan(_l0_12_1), 0, _l0_12_1) 现在让我们比较一下从单词Apple和Want的嵌入派生的向量。
print(_l0_12_1)
array([ 3.753544 , 1.4458075 , -0.56288993, -0.44559467, 0.9137548 ,0.33285233, 0. , 0. , 0. , 0. ],dtypefloat32)print(l0_12_1) # this vector has been defined in the previous post
array([ 0. , 0. , 0. , 0. , -0.79848075,0.6715901 , 0.30298436, -1.6455574 , 0.1162319 , 0. ],dtypefloat32) 如您所见上述两个向量中的一对匹配元素中的一个值在大多数情况下为零而另一个值为非零 — 即向量看起来互补记住塔视图类比从塔上可以看到相邻的景点但为了看到塔本身——也许是主要景点——你需要离开它所以 您可以安全地按元素对这些向量求和以将可用信息组合到单个向量中。
s _l0_12_1 l0_12_1
print(s)
array([ 3.753544 , 1.4458075 , -0.56288993, -0.44559467, 0.11527407,1.0044425 , 0.30298436, -1.6455574 , 0.1162319 , 0. ],dtypefloat32) 上面的向量接下来可以用作句子级分类的输入。
四、结论 本文提供了从静态嵌入转向上下文嵌入时如何根据令牌级 BERT 嵌入的趋势生成句子级嵌入的直观信息以及代码。然后可以将此句子级嵌入用作BERT生成的用于句子分类的CLS令牌嵌入的替代方法这意味着您可以尝试这两种方法看看哪一个最适合您的特定问题。