嵌入在tensorflow中做了什么

ant*_*ell 4 python deep-learning 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
Run Code Online (Sandbox Code Playgroud)

小智 12

好吧,我不打算尝试解释这个特定的代码,但我会尝试回答"什么是嵌入?" 标题的一部分.

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

在tensorflow中,如果你想象一些文本输入字段有"王","女王","女孩","男孩",你有2个嵌入维度.希望backprop能够训练嵌入,将版税的概念放在一个轴上,将性别放在另一个轴上.因此,在这种情况下,4分类值特征被"煮沸"到具有2维的浮点嵌入特征.

它们使用查找表实现,可以从原始列表或字典顺序进行哈希处理.对于一个训练有素的人,你可能会输入"女王",然后你说出[1.0,1.0],输入"男孩"然后你得到[0.0,0.0].

Tensorflow会在错误INTO这个查找表中做出反馈,并希望从随机初始化的字典开始逐渐变得像我们在上面看到的那样.

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