首页 > 解决方案 > 在分类模型中初始化 BERT 嵌入

问题描述

我对 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 与其关联的词汇(字符串)进行匹配。此后,我将使用一个 API(BERT 即服务)在字符串级别/令牌级别为任何给定字符串列表提供 BERT 嵌入。问题是因为self.input_ids它只是一个占位符,它显示它是一个 NULL 对象。有什么解决方法可以帮助我解决这个问题吗?

谢谢!

标签: pythontensorflow

解决方案


您不能直接将 bert-as-service 用作张量。所以你有两个选择:

  1. 使用 bert-as-service 来查找嵌入。您将句子作为输入并获得一个 numpy 嵌入数组作为输出。然后,您将嵌入的 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)


推荐阅读