【NLP基础知识】BERT模型输出向量pooler_output和last_hidden_state解析

BERT模型输出向量pooler_output和last_hidden_state解析

基本介绍

BERT(Bidirectional Encoder Representation from Transformers)是一种预训练语言模型,由google公司在2018年推出,自推出起,在众多自然语言任务中广为使用。其特点是采用了Transformer模型中的Encoder编码器结构,通过对上下文的双向编码实现文本向量化。

BERT的关键特点

双向编码文本:与传统单项语言模型不同,BERT对文本向量编码考虑双向上下文信息。
预训练任务:BERT模型在预训练阶段采用了两种任务来学习,分别是下句预测任务(Next Sentence Prediction)和 掩码语言模型(Masked Language Model,MLM)

BERT模型的输出

通常应用于下游任务的有两类输出:
Pooler_output:指的是最后一层的隐藏状态的第一个token,一般是 [CLS]字符 代表的token向量,通过一个线性层和激活函数得到的输出。

如 I love my dog 若是被划分为了4个词[‘I’, ‘love’, ‘my’, ‘dog’],
pooler_output = V [ c l s ] V_[cls] V[cls]

last_hidden_state:模型所有层的 最后一个隐藏状态的输出 ,包含了整个序列的上下文信息,适用于序列级别的任务。

如 I love my dog 若是被划分为了4个词[‘I’, ‘love’, ‘my’, ‘dog’],
last_hidden_state= [ V [ c l s ] , V I , V l o v e , V m y , V d o g ] [V_[cls], V_I, V_{love}, V_{my}, V_{dog}] [V[cls],VI,Vlove,Vmy,Vdog]

### 使用 BERT 模型实现文本向量化 BERT 是一种基于 Transformer 的双向编码器表示模型,能够捕捉上下文中的语义信息。以下是关于如何利用 BERT 实现文本向量化的详细说明。 #### 1. 关于 `all_encoder_layers` `sequence_output` 在 BERT 中,`all_encoder_layers` 表示每一层 Transformer 编码器的输出集合,而 `sequence_output` 则是最后一层 Transformer 层的输出[^1]。两者的区别在于: - **`all_encoder_layers`**: 这是一个列表,包含了每层 Transformer 输出的结果。如果需要获取中间某一层的信息,则可以通过索引来访问对应的层输出。 - **`sequence_output`**: 它实际上是 `all_encoder_layers[-1]`,代表的是整个网络的最后一层输出。通常情况下,在实际应用中会直接使用这一层作为输入序列的最终表征[^1]。 因此,当只需要最后一个 Transformer 层的特征时可以直接采用 `sequence_output` 而无需额外操作;但如果希望融合多个层次或者分析不同深度下的特性变化则需要用到完整的 `all_encoder_layers` 结构。 #### 2. 如何加载并使用 BERT 模型生成句向量 要使用预训练好的 BERT 来获得句子级别的嵌入表达形式,可以按照如下方式完成: ##### (a) 导入库文件 首先需安装必要的库如 PyTorch 或 TensorFlow 版本的 Transformers 库,并导入所需模块: ```python from transformers import BertTokenizer, BertModel import torch ``` ##### (b) 初始化 Tokenizer 及 Model 对象 创建 tokenizer 将原始字符串转换成 token ID 数组以及初始化 bert model 获取 embedding 数据流图定义: ```python tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased', output_hidden_states=True) ``` 这里设置参数 `output_hidden_states=True` 是为了能够在后续阶段轻松取得所有的 hidden states(即 `all_encoder_layers`),如果不关心这些细节也可以省略该选项仅保留默认配置即可得到最后的一层输出结果也就是所谓的 CLS-Token Embedding[^1]。 ##### (c) 输入准备与前向传播计算过程 对于给定的一个或一批待处理样本先调用 encode_plus 方法对其进行标准化预处理包括截断填充等工作之后再送入到已经构建完毕的神经网络当中去执行预测任务从而拿到相应的 outputs 值其中就包含有我们所需要的 embeddings 部分了具体代码如下所示: ```python text = "Replace me by any text you'd like." marked_text = "[CLS] " + text + " [SEP]" tokenized_text = tokenizer.tokenize(marked_text) indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text) segments_ids = [1] * len(indexed_tokens) tokens_tensor = torch.tensor([indexed_tokens]) segments_tensors = torch.tensor([segments_ids]) with torch.no_grad(): outputs = model(tokens_tensor, segments_tensors) last_hidden_state = outputs.last_hidden_state pooler_output = outputs.pooler_output hidden_states = outputs.hidden_states ``` 在这里需要注意几个关键变量的意义解释如下: - **outputs.last_hidden_state** : 即为 sequence_output ,代表着最后一层 transformer block 处理后的隐藏状态矩阵形状一般为(batch_size,max_length,dimensionality_of_embedding)[^1]. - **outputs.pooler_output** :这是经过一个全连接层变换过的 cls-token 的embedding,默认被用来做分类等问题上的高层抽象表示. - **outputs.hidden_states** :如果设置了 `output_hidden_states=True`,那么此属性将会保存着每一个transformer layer之前的激活值组成的元祖(tuple),长度等于层数加一(因为还包括初始input embeddings). 根据不同的需求可以选择合适的部分来当作最终的sentence vector. #### 3. 文本相似度搜索的应用场景举例 一旦获得了高质量的文本向量后就可以将其应用于多种自然语言理解的任务之中比如但不限于以下几种情况[^2]: - 构建智能问答系统寻找最贴近用户提问意思的回答. - 推荐机制下依据当前阅读材料找出风格主题相近的文章供读者继续浏览学习. - 自动化审核流程里判断提交稿件是否存在抄袭嫌疑等等... 同时针对大规模数据集还可以考虑引入专门设计用于高效查询高维空间最近邻居关系的数据管理系统例如milvus来进行加速优化工作以提高整体效率效果更佳[^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值