【问题标题】:What does embedding do in tensorflow嵌入在张量流中有什么作用
【发布时间】:2019-12-13 04:08:39
【问题描述】:

我在这里阅读了一个使用带有 tensorflow 的 RNN 的示例:ptb_word_lm.py

我不知道embeddingembedding_lookup 在这里做什么。它如何为张量添加另一个维度?从 (20, 25) 到 (20, 25, 200)。在这种情况下,(20,25) 是 20 的批量大小,有 25 个时间步长。我不明白您如何/为什么可以将单元格的hidden_size 添加为输入数据的维度?通常,输入数据将是大小为[batch_size, num_features] 的矩阵,模型将映射num_features ---> hidden_dims 与大小为[num_features, hidden_dims] 的矩阵,从而产生大小为[batch-size, hidden-dims] 的输出。那么hidden_dims怎么可能是输入张量的一个维度呢?

input_data, targets = reader.ptb_producer(train_data, 20, 25)
cell = tf.nn.rnn_cell.BasicLSTMCell(200, forget_bias=1.0, state_is_tuple=True)
initial_state = cell.zero_state(20, tf.float32)
embedding = tf.get_variable("embedding", [10000, 200], dtype=tf.float32)
inputs = tf.nn.embedding_lookup(embedding, input_data)

input_data_train # <tf.Tensor 'PTBProducer/Slice:0' shape=(20, 25) dtype=int32>
inputs # <tf.Tensor 'embedding_lookup:0' shape=(20, 25, 200) dtype=float32>

outputs = []
state = initial_state
for time_step in range(25):
    if time_step > 0: 
        tf.get_variable_scope().reuse_variables()

    cell_output, state = cell(inputs[:, time_step, :], state)
    outputs.append(cell_output)

output = tf.reshape(tf.concat(1, outputs), [-1, 200])

outputs # list of 20: <tf.Tensor 'BasicLSTMCell/mul_2:0' shape=(20, 200) dtype=float32>
output # <tf.Tensor 'Reshape_2:0' shape=(500, 200) dtype=float32>

softmax_w = tf.get_variable("softmax_w", [config.hidden_size, config.vocab_size], dtype=tf.float32)
softmax_b = tf.get_variable("softmax_b", [config.hidden_size, config.vocab_size], dtype=tf.float32)
logits = tf.matmul(output, softmax_w) + softmax_b

loss = tf.nn.seq2seq.sequence_loss_by_example([logits], [tf.reshape(targets, [-1])],[tf.ones([20*25], dtype=tf.float32)])
cost = tf.reduce_sum(loss) / batch_size

【问题讨论】:

    标签: python tensorflow deep-learning


    【解决方案1】:

    好的,我不会尝试解释这个特定的代码,但我会尝试回答“什么是嵌入?”标题的一部分。

    基本上它是将原始输入数据映射到一组实值维度,并组织原始输入数据在这些维度中的“位置”以改进任务。

    在 tensorflow 中,如果您想象某个文本输入字段有“king”、“queen”、“girl”、“boy”,并且您有 2 个嵌入维度。希望反向传播能够训练嵌入,将版税概念放在一个轴上,将性别放在另一个轴上。因此,在这种情况下,什么是 4 分类值特征被“归结”为具有 2 维的浮点嵌入特征。

    它们是使用查找表实现的,可以从原始哈希表或字典排序中进行哈希处理。对于一个训练有素的人,您可以输入“Queen”,然后说 [1.0,1.0],输入“Boy”,然后输出 [0.0,0.0]。

    Tensorflow 确实将错误反向传播到这个查找表中,希望从随机初始化的字典开始的内容会逐渐变得像我们在上面看到的那样。

    希望这会有所帮助。如果没有,请看:http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

    【讨论】:

      【解决方案2】:

      最简单的,

      input_data:单词ID序列的批次(形状为(20,25))

      inputs:词嵌入序列的批次(形状为(20,25,200))

      你可能会问,input_data 是如何变成 inputs 的?这就是学习词嵌入的作用。最容易想象的方法是,

      1. input_data 解包为一组形状(20*25,)
      2. 现在为展开的input_data 中的每个元素分配一个大小为200 的向量,这将为您提供一个形状为(20*25,200) 的矩阵。
      3. 现在,将矩阵重塑为 (20,25,200)

      这是因为嵌入学习不是一个时间序列过程。您使用前馈网络学习词嵌入。下一个重要的问题是,你如何学习词嵌入。

      1. 初始化一个大小为 (vocabulary_size, 200) 的巨大 Tensorflow 变量(即代码中的 embedding
      2. 优化embedding,使给定的单词应该能够从其上下文中预测任何单词。 (例如,在“dog barked at the mailman”中,如果“at”是目标词“dog”,则“barked”、“the”和“mailman”是上下文词)
      3. 此过程为每个单词提供一个向量(在此示例中为 200long),从而保留语义(即“狗”的向量接近“猫”,但远离“笔”)。

      这里是我刚才解释的概述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2017-09-03
        • 2019-10-17
        • 1970-01-01
        相关资源
        最近更新 更多