Предположим, у меня есть следующая переменная
embeddings = tf.Variable (tf.random_uniform (dtype = tf.float32, shape = [self.vocab_size, self.embedding_dim], minval = -0.001, maxval = 0.001))
sent_1 = construct_sentence (word_ids_1)
отправлено_2 = конструкция_предложение (идентификаторы_слова_2)
Где construct_sentence
- это метод получения представления предложения на основе заполнителей word_ids_1
и word_ids_2
Предположим, у меня есть потеря:
потеря = construct_loss (отправлено_1, отправлено_2, метка)
Теперь, когда я пытаюсь получить градиенты, используя:
gradient_wrt_w = tf.gradients (потеря, вложения)
Вместо того, чтобы получать только градиенты по отношению к конкретным переменным, участвующим в construct_sentence
и construct_loss
, я получаю градиенты каждого вложения в переменную embeddings
(градиенты равны 0 для тех вложений, которые не участвуют в представлениях потерь и предложений).
Как получить градиенты по интересующим меня переменным?
Более того, я получаю повторения некоторых переменных (с одним и тем же значением) из-за задействованных частных производных. Поскольку вложения - это 2D-переменная, я не могу выполнить простой поиск, подобный этому:
tf.gradients (потеря, tf.nn.embedding_lookup (вложения, word_ids))
Это приводит к огромному снижению производительности, поскольку я работаю с большим количеством встраиваний слов и хочу использовать производную только по некоторым вложениям слов за раз.
Более того, я получаю много повторяющихся градиентов (из-за частных производных), и я пытался использовать tf.AggregationMethod, но это не сработало.
embeddings
с помощьюTrainable=False
в конструкторе? См .: tensorflow.org/api_docs/python/tf/Variable#initializer - person mikkola   schedule 05.02.2018