Digamos que tenho uma imagem de cima para baixo de uma seta e quero prever o ângulo que essa seta faz. Isso seria entre e 360 graus, ou entre 0 e 2 π . O problema é que esse alvo é circular, 0 e 360 graus são exatamente os mesmos, o que é uma invariância que eu gostaria de incorporar ao meu alvo, o que deve ajudar a generalizar significativamente (essa é minha suposição). O problema é que não vejo uma maneira clara de resolver isso. Existem documentos que tentam resolver esse problema (ou similares)? Eu tenho algumas idéias com suas possíveis desvantagens:
Use uma ativação sigmóide ou tanh, dimensione-a para a faixa ( e incorpore a propriedade circular na função de perda. Eu acho que isso falhará bastante, porque se estiver na fronteira (pior previsão), apenas um pouquinho de ruído empurrará os pesos para seguir um caminho ou outro. Além disso, os valores mais próximos da borda de 0 e 2 π serão mais difíceis de alcançar porque o valor absoluto de pré-ativação precisará estar próximo do infinito.
Regredir para dois valores, um e y de valores e calcular a perda com base no ângulo estes dois valores fazem. Eu acho que esse tem mais potencial, mas a norma desse vetor é ilimitada, o que pode levar à instabilidade numérica e a explosões ou a 0 durante o treinamento. Isso pode ser resolvido usando um regularizador estranho para impedir que essa norma fique muito longe de 1.
Outras opções estariam fazendo algo com funções seno e cosseno, mas sinto que o fato de várias pré-ativações serem mapeadas para a mesma saída também tornará a otimização e generalizações muito difíceis.
fonte
Respostas:
A segunda maneira, prever e y = s i n ( α ) é totalmente aceitável.x = c o s ( α ) y= s i n ( α )
Sim, não é garantido que a norma do vetor previsto esteja próxima de 1 . Mas não é provável que ocorra uma explosão, especialmente se você usar funções de ativação sigmóide (que são limitadas pela natureza) e / ou regularizar bem seu modelo. Por que seu modelo prevê um valor alto, se todas as amostras de treinamento estão em [ - 1 , 1 ] ?( x , y) 1 1 [ - 1 , 1 ]
Outro lado é o vetor muito próximo de ( 0 , 0 ) . Isso às vezes pode acontecer e pode realmente resultar na previsão de ângulos errados. Mas isso pode ser visto como um benefício do seu modelo - você pode considerar a norma de ( x , y ) como uma medida de confiança do seu modelo. De fato, uma norma próxima a 0 significa que seu modelo não tem certeza de onde está a direção certa.( x , y) ( 0 , 0 ) ( x , y)
Aqui está um pequeno exemplo em Python, que mostra que é melhor prever o pecado e cos, que prever o ângulo diretamente:
Você pode continuar e plotar as previsões, para ver que as previsões do modelo seno-cosseno estão quase corretas, embora possam precisar de mais calibração:
arctan2
fonte
Trabalhar com coordenadas cartesianas funciona bem como mencionado acima. No entanto, na minha opinião, converter dados polares em cartesiano cria dependências entre as coordenadas X e Y que não estavam originalmente presentes nos dados. Por exemplo, o modelo de decisão de caminho de um robô é mais intuitivo em coordenadas polares do que cartesiano. A dependência do vetor de velocidade do robô nas coordenadas polares entre o ângulo e a magnitude pode até não existir ou ser diferente da dependência das coordenadas cartesianas.
Uma solução alternativa que descobri para continuar trabalhando com coordenadas polares é criar uma função de erro personalizada para calcular a diferença de ângulo usando a função angdiff () no MATLAB e a diferença de magnitude, como de costume.
Esta função retorna '0' para a diferença entre -pi e pi. Aqui está um link para a página de suporte de funções no site Mathworks.
https://www.mathworks.com/help/robotics/ref/angdiff.html
Se você estiver usando a ativação do Sigmoid e seus dados de ângulos forem normalizados entre [0,1], você deve retorná-los ao intervalo [-pi, pi] antes de usar a função angdiff () e normalizar o erro de volta para [0,1 ] para o processo de retropropagação.
Além disso, a função equivalente no Python seria:
Isso retorna resultados semelhantes à função MATLAB e também funciona com matrizes:
Espero que ajude.
fonte