Aquí podría ser tu PUBLICIDAD


Cómo restringir el valor absoluto de cada dimension de un gradiente de escasa sea demasiado grande?

votos
0

Considere el siguiente código:

import tensorflow as tf

inputs=tf.placeholder(tf.int32, [None])
labels=tf.placeholder(tf.int32, [None])

with tf.variable_scope('embedding'):
    embedding=tf.get_variable('embedding', shape=[2000000, 300], dtype=tf.float32)

layer1=tf.nn.embedding_lookup(embedding, inputs)
logits=tf.layers.dense(layer1, 2000000)

loss=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)
cost=tf.reduce_sum(loss)

optimizer=tf.train.GradientDescentOptimizer(0.01)
grads, vars=zip(*optimizer.compute_gradients(cost))
for g in grads:
    print(0, g)

grads1=[tf.clip_by_value(g, -100, 100) for g in grads]
for g in grads1:
    print(1, g)

grads2, _=tf.clip_by_global_norm(grads, 10)
for g in grads2:
    print(2, g)

La salida es:

0 IndexedSlices(indices=Tensor(gradients/embedding_lookup_grad/Reshape_1:0, shape=(?,), dtype=int32), values=Tensor(gradients/embedding_lookup_grad/Reshape:0, shape=(?, 300), dtype=float32), dense_shape=Tensor(gradients/embedding_lookup_grad/ToInt32:0, shape=(2,), dtype=int32))
0 Tensor(gradients/dense/MatMul_grad/tuple/control_dependency_1:0, shape=(300, 2000000), dtype=float32)
0 Tensor(gradients/dense/BiasAdd_grad/tuple/control_dependency_1:0, shape=(2000000,), dtype=float32)
C:\Python\Python36\lib\site-packages\tensorflow\python\ops\gradients_impl.py:97: UserWarning: Converting sparse IndexedSlices to a dense Tensor with 600000000 elements. This may consume a large amount of memory.
  num_elements)
1 Tensor(clip_by_value:0, shape=(?, 300), dtype=float32)
1 Tensor(clip_by_value_1:0, shape=(300, 2000000), dtype=float32)
1 Tensor(clip_by_value_2:0, shape=(2000000,), dtype=float32)
2 IndexedSlices(indices=Tensor(gradients/embedding_lookup_grad/Reshape_1:0, shape=(?,), dtype=int32), values=Tensor(clip_by_global_norm/clip_by_global_norm/_0:0, shape=(?, 300), dtype=float32), dense_shape=Tensor(gradients/embedding_lookup_grad/ToInt32:0, shape=(2,), dtype=int32))
2 Tensor(clip_by_global_norm/clip_by_global_norm/_1:0, shape=(300, 2000000), dtype=float32)
2 Tensor(clip_by_global_norm/clip_by_global_norm/_2:0, shape=(2000000,), dtype=float32)

Sé que hay dos maneras de restringir gradientes de ser demasiado grande. tf.clip_by_valueDimensiones para restringir cada uno, y tf.clip_by_global_normpara restringir según normas gradientes globales.

Sin embargo, tf.clip_by_valueproyectará un gradiente escasa en uno denso, lo que aumenta de manera significativa el uso de memoria y disminuye la eficiencia de cálculo, al igual que el aviso indica, mientras que tf.clip_by_global_normno lo hará. Aunque puedo entender por qué esto está diseñado, ¿cómo puedo restringir el valor absoluto de cada dimension de un gradiente escasa de ser demasiado grande sin disminuir la eficiencia?

Por favor, no me dicen que sólo tiene que utilizar tf.clip_by_global_norm, sé que esto es aceptable para la mayoría de los casos, pero no es lo que quiero.

Publicado el 02/09/2018 a las 05:04
fuente por usuario Swkjd
En otros idiomas...        العربية       


Aquí podría ser tu PUBLICIDAD