如何将BERT嵌入转换为张量以馈入LSTM?

时间:2019-07-12 05:46:06

标签: keras deep-learning nlp lstm word-embedding

我正在尝试在暹罗LSTM网络(https://github.com/eliorc/Medium/blob/master/MaLSTM.ipynb)中用BERT的句子嵌入替换Word2Vec词的嵌入。但是,我的BERT嵌入是(1,768)形状的矩阵,而不是可馈送到keras层的张量。我想知道是否可以进行转换。

我找到了一种用通用句子嵌入(http://hunterheidenreich.com/blog/google-universal-sentence-encoder-in-keras/)替换单词嵌入的方法,我试图修改LSTM的代码以使用来自以下服务(https://github.com/hanxiao/bert-as-service#what-is-it)的BERT句子嵌入。 / p>

# Model variables for LSTM 
n_hidden = 50
gradient_clipping_norm = 1.25
batch_size = 64
n_epoch = 25

def BERTEmbedding(x): 
   #x is an input tensor
    encoded= bc.encode(tf.squeeze(tf.cast(x, tf.string)))
    return encoded

def exponent_neg_manhattan_distance(left, right):
    ''' Helper function for the similarity estimate of the LSTMs outputs'''
    return K.exp(-K.sum(K.abs(left-right), axis=1, keepdims=True))

left_input_text = Input(shape=(1,), dtype=tf.string)
right_input_text = Input(shape=(1,), dtype=tf.string)

encoded_left = Lambda(BERTEmbedding, output_shape=(768, ))(left_input_text)
encoded_right = Lambda(BERTEmbedding, output_shape=(768, ))(right_input_text)

# Since this is a siamese network, both sides share the same LSTM
shared_lstm = LSTM(n_hidden)

left_output = shared_lstm(encoded_left)
right_output = shared_lstm(encoded_right)

我收到以下错误消息TypeError:“ Tensor(“ lambda_3 / Squeeze:0”,dtype = string)“必须为,但收到了类'tensorflow.python.framework.ops.Tensor'

1 个答案:

答案 0 :(得分:1)

LSTM接受三维输入[ Batch_size, sequence_length, feature_dim ]

您可以从bert获得两种类型的嵌入:

  1. 每个序列的令牌表示
  2. “ CLS”令牌表示形式[其中,“ CLS”表示“分类”

enter image description here

enter image description here

  • 如果采用令牌“ CLS”表示,则为[1,768],但如果 您将所有序列输出作为[ len of sequence, 768 ]

    现在,如果您批量训练模型,它将变为

    [ Batch_size,len_of_sentence, 768]是LSTM编码器所采用的。

  • 另一种方法,您可以添加一个额外的暗淡[batch_size, 768, 1] 并将其输入LSTM。

    在序列长度中添加额外的暗淡没有意义,因为LSTM 根据序列的长度展开。