如何理解 BertModel 中回报的 hidden_states?(huggingface-transformers)
Posted
技术标签:
【中文标题】如何理解 BertModel 中回报的 hidden_states?(huggingface-transformers)【英文标题】:How to understand hidden_states of the returns in BertModel?(huggingface-transformers) 【发布时间】:2020-08-03 00:34:35 【问题描述】:返回 last_hidden_state (torch.FloatTensor 的形状 (batch_size, sequence_length, hidden_size)):隐藏状态的序列 模型最后一层的输出。
pooler_output (torch.FloatTensor: 形状 (batch_size, hidden_size)): 序列的第一个标记的最后一层隐藏状态 (分类标记)由线性层和 Tanh 进一步处理 激活函数。线性层权重是从 下一句预测(分类)目标在 预训练。
这个输出通常不能很好地概括语义内容 输入,你通常会更好地对序列进行平均或池化 整个输入序列的隐藏状态。
hidden_states (tuple(torch.FloatTensor),可选,当返回 config.output_hidden_states=True):torch.FloatTensor 的元组(一个用于 嵌入的输出 + 每层的输出一个) 形状(batch_size、sequence_length、hidden_size)。
每层输出的模型隐藏状态加上 初始嵌入输出。
attentions(tuple(torch.FloatTensor),可选,当返回 config.output_attentions=True):torch.FloatTensor 的元组(一个用于 每层)的形状(batch_size,num_heads,sequence_length, 序列长度)。
attention softmax 之后的 Attentions 权重,用于计算 自注意力头中的加权平均值。
这是来自https://huggingface.co/transformers/model_doc/bert.html#bertmodel。虽然文档中的描述很清楚,但是我还是不明白退货的hidden_states。有一个元组,一个用于嵌入的输出,另一个用于每一层的输出。 请告诉我如何区分它们,或者它们的含义是什么?非常感谢!![wink~
【问题讨论】:
您可能会发现这个 Jupyter Notebook 教程很有用:github.com/BramVanroy/bert-for-inference/blob/master/… 【参考方案1】:我在这个元组的长度中找到了答案。长度为 (1+num_layers)。并且最后一层的输出与嵌入输出不同,因为层输出加上初始嵌入。 :D
【讨论】:
我有同样的问题 - 从文档中不清楚嵌入是元组中的第一项还是最后一项。这个帖子证实了你的答案:github.com/huggingface/transformers/issues/1827【参考方案2】:hidden_states (tuple(torch.FloatTensor), 可选, config.output_hidden_states=True 时返回): 形状为 (batch_size,序列长度,隐藏大小)。
每层输出的模型隐藏状态加上初始嵌入输出。
对于给定的token,其输入表示是通过对相应的token embedding、segment embedding和位置embedding求和来构造的。这个输入表示称为初始嵌入输出,可以在 hidden_states 元组的index 0
找到。
该图解释了如何计算嵌入。
元组中剩余的 12 个元素包含相应隐藏层的输出。例如:最后一个隐藏层可以在index 12
找到,它是元组中的第 13th 项。初始嵌入输出和隐藏状态的维度都是[batch_size, sequence_length, hidden_size]
。将 hidden_states 自下而上的索引与 BERT 论文中的这张图片进行比较会很有用。
【讨论】:
https://medium.com/@_init_/why-bert-has-3-embedding-layers-and-their-implementation-details-9c261108e28a 是了解如何计算初始嵌入的好资源。以上是关于如何理解 BertModel 中回报的 hidden_states?(huggingface-transformers)的主要内容,如果未能解决你的问题,请参考以下文章
Python:BERT 错误 - 初始化 BertModel 时未使用模型检查点的某些权重
HidD_SetFeature() 效果很好,HidD_GetFeature() 因 ERROR_CRC (23) 而失败。啥可能导致这种情况?