¿Cuál es la forma correcta de verificar si mi fórmula de gradiente es correcta o no?

Calcular gradientes es una tarea tediosa y propensa a errores, como una alternativa que quizás desee leer sobre la diferenciación automática. Elegir un entorno informático que admita AD es una ventaja.

Si calculó sus propios gradientes y desea verificarlo con un método de diferencia finita, ¿qué tan cerca debe estar para tener confianza? Desde el punto práctico, la precisión de 6 dígitos está bien, aunque puede salirse con 4 dígitos si usa el descenso de gradiente estocástico (minibatch).

El siguiente código demuestra una diferencia central de una función de costo y fue creado para Mocha.jl, la implementación de Julia del proyecto de red neuronal Berkeley Caffee escrito en Julia, un novedoso lenguaje basado en Unicode. Como alternativa, también recomiendo el verificador de derivadas IPOPT del proyecto COINOR, o un refuerzo de confianza aproximado: vea si L-BFGS devuelve un error o converge.

(Editar: me di cuenta de que no todos los navegadores representan correctamente los caracteres Unicode del fragmento de código proporcionado; reemplazando los subíndices y superíndices con un rectángulo).

  @Doc """
 COMPROBACIÓN DE GRADIENTES calcular y comparar gradiente analítico con finito
 método de diferencia implementar gradiente analítico es un error
 proceso propenso, mientras que el método de diferencia finita viene con O = 2 * | θ |
 complejidad, tiene una base de código muy simple, por lo tanto, fácil de inspeccionar.
 Este algoritmo evalúa la función F tanto en F (θ⁻) como en F (θ⁺) que
 están a dos ε de distancia, que calcula la pendiente de la línea.  Esta
 la pendiente se compara con la longitud de 'dígitos' con gradiente analítico.  En 
 En caso de FALLA, se imprime la posición numérica, se indica PASS
 con '√' x - Función de tipo diferenciable f, g !, fg!  representando el
 función, gradiente, gradiente de función respectivamente
  θ - vector de parámetros del modelo
  ε - distancia desde cualquier punto dado donde se evalúa 'f', principalmente
      1e-6 funciona, puede haber intentado diferentes valores
  dígitos - representa el grado de corrección, ~ 6 y mayor
      considerado muy bueno, 4 está bien, menos de 4: trabajar en ello
 "" "->
 función GradientCheck (x :: CostFunction, θ :: Vector {Float64}; ε = 1e-6, digit = 8)
     J = xf;  ¡sol!  = xg !;  # alias J función de costo y g gradiente
     ∇ᵋ = similar (θ);  llenar! (∇ᵋ, 0);
     ∇ = similar (θ);  llenar! (∇, 0);
     C = J (θ);  g! (θ, ∇);
     ## define la derivada de dos lados
	 θ⁺ = similar (θ);  θ⁻ = similar (θ);
	 # iterar a través de la función de costo y calcular la pendiente
	 para i = 1: longitud (θ)
	     Base.copy! (Θ⁺, θ);  θ⁺ [i] = θ⁺ [i] + ε;
		 Base.copy! (Θ⁻, θ);  θ⁻ [i] = θ⁻ [i] - ε;
		 ∇ᵋ [i] = (J (θ⁺) - J (θ⁻)) / 2ε
	 fin
	 # hacer una comparación real con la precisión numérica de `dígito`
	 # ∇⁺ = redondo (∇⁺, 4);  ∇ = redondo (∇, 4)
	 para i = 1: longitud (∇)
	     if round (∇ [i], digit)! = round (∇ᵋ [i], digit)
			 @printf ("% 3i", i);  # imprime la posición si falla 
		 más
			 @printf ("√");  # o un signo de verificación si el éxito
		 fin
	 fin
	 println ()
 fin
 #_________________________________________________________________
 # #
 # Copyright (c)  
 # Contacto: [correo electrónico protegido] 
 # 2015 Toronto, en Canadá
 #________________________________________________________________
 # Se concede permiso de forma gratuita bajo licencia BSD

La derivada es el límite de esa fórmula, ya que c tiende a cero. Mientras use una c suficientemente pequeña, obtendrá una buena aproximación. Cuán pequeño debe ser c dependerá de cuán curvada esté la función. Para una línea recta, cualquier c funcionará. Cuanto más rápido cambia la función el gradiente, más pequeña debe ser c. Para una función que es bastante recta en un punto, pero fuertemente curvada en otro, un valor particular de c funcionará en el primer punto pero no en el segundo.

More Interesting

¿Quiénes son algunos de los principales profesores que enseñan Machine Learning en Europa?

¿Puedo incluir el aprendizaje automático en mi currículum después de aprender scikit-learn?

¿Podría el aprendizaje profundo vencer a los métodos tradicionales en 3D Vision?

Ahora mismo estoy aprendiendo desarrollo web, pero no creo que me sea muy útil. ¿Debo aprender el aprendizaje automático o el desarrollo de software?

¿Cómo y cuándo comenzaste con Kaggle?

¿Por qué la red bayesiana no ha tenido tanto éxito como la red neuronal profunda?

Cómo comenzar a implementar un sistema de recomendación para juegos

Cómo estudiar el aprendizaje automático mientras se construye una cartera

Procesamiento del lenguaje natural: ¿Cuáles son algunas ideas de problemas / proyectos sobre la clasificación jerárquica de textos?

¿Cómo se aplica el aprendizaje automático en genética o biología molecular?

¿Cómo se puede aplicar RL (método de gradiente de política) al problema de selección de subconjunto, donde cada prueba consiste en seleccionar un subconjunto de elementos de un conjunto más grande?

¿Qué es la selección de variables en bloques cuando se hace un análisis de regresión?

¿Puede el aprendizaje automático desarrollar el gusto?

¿Cómo se realiza el aprendizaje automático supervisado cuando sus datos no caben en una sola máquina? ¿Los clasificadores de libros de texto como los clasificadores SVM o Naive Bayes siguen siendo tan importantes o incluso factibles a medida que aumenta el tamaño de sus datos o los algoritmos diferentes se vuelven más populares?

¿Cómo se pueden usar los modelos ocultos de Markov para reconocer la escritura cursiva?