繁体   English   中英

在Tensorflow中实现嵌入辍学

[英]Implement Embedding Dropout in Tensorflow

我正在阅读有关“ 正则化和优化LSTM语言模型 ”的论文,他们谈到了Embedding Dropout ,其中说:“由于缺失发生在用于完全向前和向后传递的嵌入矩阵上,这意味着特定事件的所有出现该字词将在该遍中消失,这相当于对一键嵌入和嵌入查找之间的连接执行变体删除。” 但是,我似乎无法在张量流实验中找到解决此问题的好方法。 对于每个新批次,我目前都在序列中嵌入以下代码:

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之后应该采取的方法,但是我仍然不相信这是正确的...

建议的解决方案

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获得的任何东西都无法从我提出的解决方案得到的东西?

我不确定的第二件事:

  1. 我的embedding_matrix初始化程序应该是什么? 默认设置为无?
  2. tf.nn.dropout似乎可以按比例1 / keep_prob处理缩放,这在本文中是必需的,对吗?

您可以使用像这样的嵌入辍学。

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

如果您使用的是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的信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM