¿Cómo validan las personas su código de red neuronal?

Estás combinando dos términos aquí.

Verificación: prueba de la corrección de la implementación de su software

Validación: prueba si el modelo hace predicciones correctas

La validación generalmente se aborda en el aprendizaje automático al dividir el conjunto de datos en fragmentos y entrenar en una pieza, y luego evaluar la bondad del ajuste en la otra pieza (o piezas). Esta es una prueba cruda de validación sensata, y a menudo se conoce como ‘validación cruzada’. Consulte la discusión en el capítulo 5 del texto de Goodfellows, ‘Aprendizaje profundo‘ sobre el error de generalización para obtener más información sobre este tipo de caracterización.

Su pregunta, sobre la exactitud del código del software, es de verificación . Los principales marcos de software (tensorflow, theano, caffe, etc.) tienen conjuntos sólidos de pruebas de regresión que proporcionan cierto nivel de confianza en que el software se implementa correctamente. Si está codificando el software usted mismo, desafortunadamente es difícil saber si el bajo rendimiento se debe a su selección de hiperparámetros, problemas en el algoritmo en sí mismo o un error en su implementación.

En general, nada supera los cálculos realizados a mano (por ejemplo, independientemente del software para las unidades base de la implementación). Por ejemplo, dada una entrada particular a una sola neurona, uno puede verificar que la salida del software sea correcta. Se pueden realizar cálculos similares para varias piezas del software en diferentes capas de granularidad. Idealmente, estas verificaciones de cálculo deben codificarse y ejecutarse periódicamente como pruebas unitarias .

Probar el acoplamiento entre estos bloques de construcción es más difícil. Para esto, la mejor solución suele ser volver a crear una red conocida con un perfil de error conocido y probar que la implementación actual está cerca del error conocido. Debido al redondeo de punto flotante y a las diferentes arquitecturas de hardware, versiones de software, etc., no se espera que el error sea idéntico, pero normalmente se puede verificar que no difiere en más de un pequeño porcentaje y detecta muchos errores.

La otra pieza crítica para verificar (ya que son propensos a errores) es el cálculo de derivados para la retropropagación. Esto se detalla bien en el capítulo 11 del texto de Goodfellows. La esencia es calcular derivadas numéricas (usando diferencias finitas) y compararlas con las calculadas por software. Una alternativa muy rápida es calcular los derivados utilizando un software alternativo, como SymPy, Mathematic

Si escribe sus propias capas, hay dos partes principales que deben probarse:

  • Pase adelantado
  • Pase hacia atrás

La prueba de avance de la unidad es lo mismo que probar cualquier otro método. Cubra todos los casos de uso posibles y verifique que el error absoluto no exceda el pequeño margen elegido. Tenga en cuenta que este margen dependerá del tipo, por ejemplo, las pruebas para las operaciones de tensor float32 fallarán si las ejecuta contra operaciones float16 debido a la pérdida de precisión.

Para el pase hacia atrás hay un método llamado verificación de gradiente, para el cual no necesita nada más complejo que las matemáticas de la escuela secundaria. Como su nombre indica, verifica que el gradiente de una capa determinada se calcule correctamente. Si su cálculo de avance es correcto, puede comparar el resultado de su implementación de retroceso con lo siguiente ([math] f (x) [/ math] es el resultado de avance):

[matemáticas] \ frac {f (x + \ Delta) – f (x)} {\ Delta} [/ matemáticas]

Así es, la definición de un derivado. Si su delta es lo suficientemente pequeña, puede tratar esta prueba de la misma manera que la prueba de aprobación directa.

Por lo general, utiliza una biblioteca como Tensor Flow para construir su red neuronal, que proporciona muchas operaciones básicas y tipos de capas.

Por supuesto, también puede implementar su propia capa personalizada. Luego se requieren pruebas como en cualquier otro software.

Escribí mi propio código hace un tiempo antes de que todo el código fuente abierto estuviera disponible. Lo probé creando algunos conjuntos de datos (patrones) con resultados deseados fáciles de entender. Cuando los resultados fueron buenos, agregué algunos ruidos y patrones no entrenados para ver cómo se generalizaba. El primero que probé fue XOR. Además, examine los valores internos (pesos y salidas de neuronas) para asegurarse de que estén dentro de los rangos aceptables.

Normalmente usaría un marco como TensorFlow que se verifica simbólica / formalmente y se verifica empíricamente.