尝试使用 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的主要内容,如果未能解决你的问题,请参考以下文章
论文泛读186QA 数据集爆炸:用于问答和阅读理解的 NLP 资源分类