用Bert模型计算句子的vector
Posted raintungli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Bert模型计算句子的vector相关的知识,希望对你有一定的参考价值。
1. Bert模型
Bert模型是2018年google开源出来的NLP的模型,具体实现请参考:https://github.com/google-research/bert
2. Bert模型计算句子的vector
2.1 通过模型获取句子的encoder层
model = modeling.BertModel(
config=bert_config,
is_training=False,
input_ids=input_ids,
input_mask=input_mask,
token_type_ids=input_type_ids,
use_one_hot_embeddings=use_one_hot_embeddings)
model.get_all_encoder_layers()
2.2 拼接层级
all_layers = [model.get_all_encoder_layers()[layer_index] for (i, layer_index) in enumerate(layer_indexes)]
encoder_layer = tf.concat(all_layers, -1)
这时候生成的是以句子最大长度的x ,768*n层 纬度的矢量,比如最大句子长度128,层数是-1,-2,-4,-9(4层)
Tensor("concat:0", shape=(?, 128, 3072), dtype=float32)
2.3 计算句子的vector
因为bert模型返回的是句子长度128维的矢量,但我们每个句子都有自己的长度,所以我们需要找到真实长度所对应的矢量,在传递给模型的参数的时候有一个mask,代表128维的句子长度里的有效字的位置用1来标示
点乘mask 找到有效的纬度的矢量
r = X * tf.expand_dims(mask, axis=-1)
简单的平均算法求句子的vector,将有效纬度的矢量相加,在每一层上求均值
tf.reduce_sum(t, axis=1) / (
tf.reduce_sum(mask, axis=1, keepdims=True) + 1e-10)
最后输出的是以层为纬度(3072)的句子的vector
Tensor("concat:0", shape=(?, 3072), dtype=float32)
这样就能简单的计算获取到了一个句子的vector
以上是关于用Bert模型计算句子的vector的主要内容,如果未能解决你的问题,请参考以下文章