我正在阅读关于“Regularizing and Optimizing LSTM Language Models”的论文,他们谈到Embedding Dropout
说“由于在用于完整前向和后向传递的嵌入矩阵上发生了丢失,这意味着所有出现的特定单词都将在该过程中消失,相当于在单热嵌入和嵌入查找之间的连接上执行变分丢失。但是,我似乎无法在张量流实验中找到一个很好的方法。对于每个新批次,我目前使用以下代码嵌入我的序列:
embedding_sequence = tf.contrib.layers.embed_sequence(features['input_sequence'], vocab_size=n_tokens, embed_dim=word_embedding_size)
现在我可以轻松地将退出应用到embedding_sequence
,但是我对该论文的阅读说明应该从整个前进/后退通道中删除相同的单词。关于简单方法的任何建议仍然允许我使用embed_sequence
?这是我认为我的方法应该在分解后embed_sequence,但我仍然不相信它是正确的......
建议的解决方案
embedding_matrix = tf.get_variable("embeddings", shape=[vocab_size, embed_dim], dtype = tf.float32, initializer = None, trainable=True)
embedding_matrix_dropout = tf.nn.dropout(embedding_matrix, keep_prob=keep_prob)
embedding_sequence = tf.nn.embedding_lookup(embedding_matrix_dropout, features['input_sequence'])
有没有更合适的方法来处理这个问题?我可以从embed_sequence
得到一些我不会从我提出的解决方案中得到的东西吗?
我不确定的次要事情:
答案 0 :(得分:0)
您可以使用这样的嵌入式丢包..
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
类似的pytorch实现:
https://github.com/salesforce/awd-lstm-lm/blob/master/embed_regularize.py
答案 1 :(得分:0)
如果您使用的是keras api,则可以使用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中了解有关noise_shape arg的信息