在Tensor中实施嵌入丢弃

2024-05-17 08:08:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在读这篇关于“Regularizing and Optimizing LSTM Language Models”的文章,他们讨论了Embedding Dropout,它说“当用于完全向前和向后传递的嵌入矩阵上发生丢失时,这意味着特定单词的所有出现都将在该过程中消失,相当于在一个热嵌入和嵌入查找之间的连接上执行变分丢失。”然而,我似乎无法在tensorflow实验中找到一个很好的方法来实现这一点。对于每一个新批处理,我当前使用以下代码嵌入我的序列:

embedding_sequence = tf.contrib.layers.embed_sequence(features['input_sequence'], vocab_size=n_tokens, embed_dim=word_embedding_size)

现在我可以很容易地将dropout应用于embedding_sequence,但是我读到的文章中说,在整个向前/向后传递过程中应该删除相同的单词。有什么建议可以让我继续使用embed_sequence?这里是我认为我的方法应该是什么后,打破embed_sequence但我仍然不相信它是正确的。。。在

建议解决方案

^{pr2}$

有没有更合适的方法来处理这个问题?我从embed_sequence中得到了什么我不能从我提出的解决方案中得到的东西吗?在

次要的事情我不确定:

  1. 我的嵌入矩阵初始化器应该是什么?默认设置为无?在
  2. tf.nn.dropout似乎可以处理1/keep-prob的缩放比例,这在本文中是必需的,对吗?在

Tags: and方法size过程tf文章矩阵embed
2条回答

如果您使用的是kerasapi,则可以使用tf.keras.layers.Dropout(0.2,noise_shape=[batch_size1,4,1]) 在嵌入层的顶部。在

玩玩它:

    embedding_dim1=3
    vocab_size=4
    batch_size1=1
    max_timestamp=4
    model1 = tf.keras.Sequential([
      tf.keras.layers.Embedding(vocab_size1, embedding_dim1,
                                batch_input_shape=[batch_size1, None]),
      tf.keras.layers.Dropout(0.2,noise_shape=[batch_size1,max_timestamp,1])
      #tf.keras.layers.Dropout(0.2) this is not what you want
      #tf.keras.layers.Dropout(0.2,noise_shape=[batch_size1,None,1]) not good. can't take dynamic shape
    ])

    model1(tf.constant([[1,2,3,0]]))

阅读https://www.tensorflow.org/api_docs/python/tf/nn/dropout中的噪声形状参数

你可以像这样嵌入辍学者。。在

with tf.variable_scope('embedding'):
   self.embedding_matrix = tf.get_variable( "embedding", shape=[self.vocab_size, self.embd_size], dtype=tf.float32, initializer=self.initializer)

with tf.name_scope("embedding_dropout"):
   self.embedding_matrix = tf.nn.dropout(self.embedding_matrix, keep_prob=self.embedding_dropout, noise_shape=[self.vocab_size,1])

with tf.name_scope('input'):
   self.input_batch = tf.placeholder(tf.int64, shape=(None, None))
   self.inputs = tf.nn.embedding_lookup(self.embedding_matrix, self.input_batch)

这将随机地将嵌入矩阵的行设置为零,如您所提到的论文中引用的https://arxiv.org/pdf/1512.05287.pdf中所述。在

资料来源:

https://github.com/tensorflow/tensorflow/issues/14746

类似Pythorch实现:

https://github.com/salesforce/awd-lstm-lm/blob/master/embed_regularize.py

相关问题 更多 >