Digamos que tengo una imagen de arriba hacia abajo de una flecha, y quiero predecir el ángulo que forma esta flecha. Esto sería entre y grados, o entre y . El problema es que este objetivo es circular, y grados son exactamente lo mismo, lo que es una invariancia que me gustaría incorporar en mi objetivo, lo que debería ayudar a la generalización de manera significativa (esta es mi suposición). El problema es que no veo una forma limpia de resolver esto, ¿hay algún documento que intente abordar este problema (o similares)? Tengo algunas ideas con sus posibles desventajas:0 360
Use una activación sigmoide o tanh, escale al rango ( e incorpore la propiedad circular en la función de pérdida. Creo que esto fallará bastante, porque si está en la frontera (peor predicción), solo un poco de ruido empujará a los pesos a ir de una manera u otra. Además, los valores más cercanos al borde de y serán más difíciles de alcanzar porque el valor absoluto de preactivación deberá estar cerca del infinito.0 2 π
Regrese a dos valores, un valor e , y calcule la pérdida en función del ángulo que forman estos dos valores. Creo que este tiene más potencial, pero la norma de este vector es ilimitada, lo que podría conducir a una inestabilidad numérica y podría llevar a explosiones o ir a 0 durante el entrenamiento. Potencialmente, esto podría resolverse utilizando algún regularizador extraño para evitar que esta norma se aleje demasiado de 1.y
Otras opciones serían hacer algo con las funciones seno y coseno, pero creo que el hecho de que las preactivaciones múltiples se asignen a la misma salida también dificultará la optimización y las generalizaciones.
fuente
Respuestas:
La segunda forma, predecir e y = s i n ( α ) está totalmente bien.x = c o s ( α ) y=sin(α)
Sí, no se garantiza que la norma del vector predicho esté cerca de 1 . Pero no es probable que explote, especialmente si usa funciones de activación sigmoideas (que están limitadas por su naturaleza) y / o regulariza bien su modelo. ¿Por qué debería su modelo predecir un valor grande, si todas las muestras de entrenamiento se encontraban en [ - 1 , 1 ] ?(x,y) 1 [−1,1]
Otro lado es el vector demasiado cerca de ( 0 , 0 ) . Esto puede suceder a veces y, de hecho, podría predecir ángulos incorrectos. Pero puede verse como un beneficio de su modelo: puede considerar la norma de ( x , y ) como una medida de confianza de su modelo. De hecho, una norma cercana a 0 significa que su modelo no está seguro de dónde está la dirección correcta.( x , y) ( 0 , 0 ) ( x , y)
Aquí hay un pequeño ejemplo en Python que muestra que es mejor predecir pecado y cos, que predecir el ángulo directamente:
Puede continuar y trazar las predicciones, para ver que las predicciones del modelo seno-coseno son casi correctas, aunque puede necesitar alguna calibración adicional:
arctan2
fuente
Trabajar con coordenadas cartesianas funciona bien como se mencionó anteriormente. Sin embargo, en mi opinión, la conversión de datos polares a cartesiano crea dependencias entre las coordenadas X e Y que originalmente no estaban presentes en los datos. Por ejemplo, el modelo de decisión de trayectoria de un robot es más intuitivo en coordenadas polares que el cartesiano. La dependencia del vector de velocidad del robot en coordenadas polares entre el ángulo y la magnitud podría incluso no existir o ser diferente de la dependencia en coordenadas cartesianas.
Una solución alternativa que he encontrado para seguir trabajando con coordenadas polares es crear una función de error personalizada para calcular la diferencia de ángulo usando la función angdiff () en MATLAB y la diferencia de magnitud como de costumbre.
Esta función devuelve '0' para la diferencia entre -pi y pi. Aquí hay un enlace a la página de soporte de funciones en el sitio web de Mathworks.
https://www.mathworks.com/help/robotics/ref/angdiff.html
Si está utilizando la activación Sigmoid y sus datos de ángulos se normalizan entre [0,1], debe devolverlos al rango [-pi, pi] antes de usar la función angdiff () y luego normalizar el error nuevamente a [0,1 ] rango para el proceso de retropropagación.
Además, la función equivalente en Python sería:
Esto devuelve resultados similares a los de la función MATLAB y también funciona con matrices:
Espero que ayude.
fuente