尝试使用 Tensorflow 理解用于 NLP 教程的 CNN

Posted

技术标签:

【中文标题】尝试使用 Tensorflow 理解用于 NLP 教程的 CNN【英文标题】:Trying to understand CNNs for NLP tutorial using Tensorflow 【发布时间】:2017-05-30 15:01:04 【问题描述】:

我关注 this tutorial 是为了了解 NLP 中的 CNN。尽管我面前有代码,但仍有一些我不明白的事情。我希望有人可以在这里澄清一些事情。


第一个相当小的事情是TextCNN 对象的sequence_length参数。在 github 上的示例中,这只是 56,我认为这是训练数据中所有句子的最大长度。这意味着self.input_x 是一个 56 维向量,它将仅包含每个单词的句子字典中的索引。

此列表进入tf.nn.embedding_lookup(W, self.intput_x),它将返回一个矩阵,该矩阵由self.input_x 给出的这些单词的单词嵌入组成。根据this answer,此操作类似于使用 numpy 进行索引:

matrix = np.random.random([1024, 64]) 
ids = np.array([0, 5, 17, 33])
print matrix[ids]

但这里的问题是self.input_x 大部分时间看起来像[1 3 44 25 64 0 0 0 0 0 0 0 .. 0 0]。如果我假设 tf.nn.embedding_lookup 忽略值 0,我是否正确?


我不明白的另一件事是tf.nn.embedding_lookup 是如何在这里工作的:

# Embedding layer
with tf.device('/cpu:0'), tf.name_scope("embedding"):
    W = tf.Variable(
        tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
            name="W")
    self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
    self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)

我假设,self.embedded_chars 是一个矩阵,它是 CNN 的 实际 输入,其中每一行代表 一个 词的词嵌入。但是tf.nn.embedding_lookup 怎么知道self.input_x 给出的那些索引呢?


我在这里不明白的最后一件事是

W 是我们在训练期间学习的嵌入矩阵。我们使用随机均匀分布对其进行初始化。 tf.nn.embedding_lookup 创建实际的嵌入操作。嵌入操作的结果是一个形状为[None, sequence_length, embedding_size]的3维张量。

这是否意味着我们实际上在这里学习词嵌入?教程开头说:

我们不会将预训练的 word2vec 向量用于我们的词嵌入。相反,我们从头开始学习嵌入。

但我没有看到实际发生这种情况的代码行。 code of the embedding layer 看起来不像是在训练或学习任何东西 - 那么它发生在哪里?

【问题讨论】:

【参考方案1】:

回答问题 1(如果我假设 tf.nn.embedding_lookup 忽略值 0,我是否正确?):

输入向量中的0是词汇表中第0个符号的索引,也就是PAD符号。我认为执行查找时它不会被忽略。将返回嵌入矩阵的第 0 行。

回答问题 2(但是 tf.nn.embedding_lookup 怎么知道 self.input_x 给出的那些索引?):

嵌入矩阵的大小为 [V * E],其中是词汇的大小,E 是嵌入向量的维度。矩阵的第 0 行是词汇表第 0 个元素的嵌入向量,矩阵的第 1 行是词汇表第一个元素的嵌入向量。 从输入向量 x 中,我们得到词汇表中单词的索引,用于对嵌入矩阵进行索引。

回答问题 3(这是否意味着我们实际上是在这里学习词嵌入?)。

是的,我们实际上是在学习嵌入矩阵。 在嵌入层中,W = tf.Variable( tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W") 行中的 W 是嵌入矩阵,默认情况下,在 tensorflow 中,trainable=TRUE 为变量。因此,W 也将是一个学习参数。要使用预训练模型,请设置trainable = False

代码详细解释可以关注博客:https://agarnitin86.github.io/blog/2016/12/23/text-classification-cnn

【讨论】:

以上是关于尝试使用 Tensorflow 理解用于 NLP 教程的 CNN的主要内容,如果未能解决你的问题,请参考以下文章

NLP(十八)利用ALBERT提升模型预测速度的一次尝试

社区说 | 对比学习前沿进展及 TensorFlow 实现

论文泛读186QA 数据集爆炸:用于问答和阅读理解的 NLP 资源分类

论文泛读186QA 数据集爆炸:用于问答和阅读理解的 NLP 资源分类

RNN 的 TensorFlow 示例

无法理解 tensorflow 文档中使用的 GAN 模型的损失函数