tensorflow gradiente gradiente solucionador y corte

1. gradiente tensorflow resuelto de varias maneras

1.1 tf.gradients

tf.gradients(
    ys,
    xs,
    grad_ys=None,
    name='gradients',
    colocate_gradients_with_ops=False,
    gate_gradients=False,
    aggregation_method=None,
    stop_gradients=None,
    unconnected_gradients=tf.UnconnectedGradients.NONE
)

Gradiente xs ys en los resultados calculados tf.gradients devuelve una longitud len (XS) de la lista lista tensor, por ejemplo

tf.gradients(y, [x1, x2, x3]返回[dy/dx1, dy/dx2, dy/dx3]

Cuando y es independiente de x, es decir, el camino de X a Y ningún gráfico, la búsqueda de la pendiente y de x retorno de la [Ninguno]; parámetro stop_gradientsvariable especificada para resolver para el gradiente de corriente, una parada de gradiente en la solución de estas variables.

a = tf.constant(0.)
b = 2 * a
g = tf.gradients(a + b, [a, b], stop_gradients=[a, b]) #梯度计算不再追溯a,b之前的变量

salida:

In:  sess.run(g) 
out:[1.0, 1.0]

Si el parámetro no está establecido stop_gradients de cálculo de gradiente de retropropagación se remonta a los principios del valor a, la salida es:

In : sess.run(g)
Out: [3.0, 1.0]

1.2 optimizer.compute_gradients

compute_gradients(
    loss,
    var_list=None,
    gate_gradients=GATE_OP,
    aggregation_method=None,
    colocate_gradients_with_ops=False,
    grad_loss=None
)

optimizer.compute_gradientsUn tf.gradientspaquete, el mismo efecto, pero sólo devuelve las variables gradiente tfgradients, compute_gradients gradiente y de retorno derivables; tf.compute_gradients optimizer.minimize primer paso () es, optimizer.compute_gradients devuelve un [(gradiente, variables), ... ] la lista de tuplas , donde el gradiente es un tensor. Intuitivamente, optimizer.compute_gradients sólo una más de las variables de salida tf.gradients.

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 1.0)
self.train_op = optimizer.minimize(self.cost)
sess.run([train_op], feed_dict={x:data, y:labels})

En este proceso, cuando el método de llamar a minimizar, para trabajar los comprende de fondo:
(1) utilizando el gradiente calculado para todos los parámetros tf.optimizer.compute_gradients trainable_variables conjunto
(2) utilizando una actualización optimizer.apply_gradients pendiente correspondiente variable calculada
el código anterior es equivalente a la de código siguiente

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
grads_and_vars = optimizer.compute_gradients(loss)
train_op = optimizer.apply_gradients(grads_and_vars)

1.3 tf.stop_gradient

tf.stop_gradient(
    input,
    name=None
)

variables de entrada tf.stop_gradient Evitar que intervienen en el cálculo de la pendiente, es decir, antes de escudo gráfico de entrada durante el cálculo del gradiente.
Devuelve: gradiente de entrada acerca

2. El gradiente de corte

Si queremos gradiente de corte, el gradiente es necesario calcular su propia cuenta, y luego cortar, y finalmente se aplica al código variable mostrada más abajo, a continuación, presentamos uno de los pasos más importantes en la que

#return a list of trainable variable in you model
params = tf.trainable_variables()

#create an optimizer
opt = tf.train.GradientDescentOptimizer(self.learning_rate)

#compute gradients for params
gradients = tf.gradients(loss, params)

#process gradients
clipped_gradients, norm = tf.clip_by_global_norm(gradients,max_gradient_norm)

train_op = opt.apply_gradients(zip(clipped_gradients, params)))

Introducción 2.1 tf.clip_by_global_norm

tf.clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None)
t_list 表示梯度张量
clip_norm是截取的比率

Después de la aplicación de esta función, t_list [i] se convierte actualización pública:

global_norm = sqrt(sum(l2norm(t)**2 for t in t_list))
t_list[i] = t_list[i] * clip_norm / max(global_norm, clip_norm)

Se divide en dos etapas:
(1) calcula el cuadrado todos los gradientes y global_norm
(2) si el gradiente de la plaza y excede nuestra global_norm especificada clip_norm, a continuación, hacer un zoom en el gradiente, de lo contrario, de acuerdo con los resultados originales

Ejemplo gradiente de 2 Crop

loss = w*x*x
optimizer = tf.train.GradientDescentOptimizer(0.1)
grads_and_vars = optimizer.compute_gradients(loss,[w,x])
grads = tf.gradients(loss,[w,x])
# 修正梯度
for i,(gradient,var) in enumerate(grads_and_vars):
    if gradient is not None:
        grads_and_vars[i] = (tf.clip_by_norm(gradient,5),var)
train_op = optimizer.apply_gradients(grads_and_vars)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(grads_and_vars))
     # 梯度修正前[(9.0, 2.0), (12.0, 3.0)];梯度修正后 ,[(5.0, 2.0), (5.0, 3.0)]
    print(sess.run(grads))  #[9.0, 12.0],
    print(train_op)

3. Referencias

[1]. TensorFlow notas de estudio (3): tf.gradients calculan el recorte derivado y el gradiente de resolver gradiente de explosión / desaparición

Publicado 33 artículos originales · ganado elogios 1 · vistas 2595

Supongo que te gusta

Origin blog.csdn.net/orangerfun/article/details/104642577
Recomendado
Clasificación