Hvordan begrense absolut verdien av hver dimensjon av en glissen gradient fra å bli for stor?

stemmer
0

Tenk koden under:

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)

Utgangen er:

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)

Jeg vet at det er to måter å begrense gradienter fra å være for stor. tf.clip_by_valuefor å begrense hver dimensjoner, og tf.clip_by_global_normfor å begrense henhold globale gradienter normer.

Imidlertid tf.clip_by_valuevil kaste en sparsom gradient inn i en tett ett, noe som i betydelig grad øke minnebruk og reduserer beregningseffektivitet, akkurat som advarsel indikerer, mens tf.clip_by_global_normikke. Selv om jeg kan forstå hvorfor dette er utformet, hvordan kan jeg begrense absolut verdien av hver dimensjon av en glissen gradient fra å være for stor uten effektivitet nedgang?

Ikke fortell meg bare bruke tf.clip_by_global_norm, jeg vet at dette er ok for de fleste tilfeller, men er ikke det jeg vil.

Publisert på 02/09/2018 klokken 05:04
kilden bruker
På andre språk...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more