在分类模型中初始化BERT嵌入

时间:2019-12-01 17:57:08

标签: python tensorflow

我对TensorFlow还是很陌生,并尝试使用BERT进行多任务分类(我在项目的另一部分中使用GloVe完成了此任务)。我的问题是TensorFlow中占位符的概念。我知道这只是一些变量的占位符,将被填充。看到这是我的分类模型中遇到问题的部分。我将在下面解释确切的问题。

def bert_emb_lookup(input_ids):
    # TODO to be implemented;
    """
    X is the input IDs, but a placeholder
    """
    pass

class BertClassificationModel(object):
    def __init__(self, num_class, args):
        self.embedding_size = args.embedding_size
        self.num_layers = args.num_layers
        self.num_hidden = args.num_hidden

        self.input_ids = tf.placeholder(tf.int32, [None, args.max_document_len])
        self.Y1 = tf.placeholder(tf.int32, [None])
        self.Y2 = tf.placeholder(tf.int32, [None])
        self.dropout = tf.placeholder(tf.float64, [])

        self.input_len = tf.reduce_sum(tf.sign(self.input_ids), 1)

        with tf.name_scope("embedding"):
            self.input_emb = bert_emb_lookup(self.)
...

从GloVe轻松获得嵌入词是很容易的;我首先加载了手套向量,然后仅使用tf.nn.embedding_lookup(embeddings, self.input_ids)来获取嵌入。

因此,在BERT分类模型中,我试图通过定义一个参数为input_ids的函数来做类似的事情,在该函数中,我想将输入ID与关联的vocab(字符串)进行匹配。此后,我将使用一个API(作为服务的BERT)在字符串级/令牌级提供任何给定字符串列表的BERT嵌入。问题在于,由于self.input_ids只是一个占位符,因此它显示为NULL对象。有什么解决方法可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您不能直接将bert-as-service用作张量。因此,您有两种选择:

  1. 使用bert-as-service查找嵌入。您将这些句子作为输入,并获得一小撮嵌入数组作为输出。然后,您将嵌入的numpy数组提供给占位符self.embeddings = tf.placeholder(tf.float32, [None, 768]) 然后,您将在任何使用self.embeddings的地方使用tf.nn.embedding_lookup(embeddings, self.input_ids)

  2. 在这种情况下,另一个选项可能会过大,但可能会给您一些上下文。在这里,您不使用bert-as-service来获取嵌入。而是直接使用bert模型图。您可以使用https://github.com/google-research/bert/blob/master/run_classifier.py中的BertModel来创建一个张量,该张量可以再次用于任何要使用tf.nn.embedding_lookup(embeddings, self.input_ids)的地方。