Допустим, у меня есть стрелка сверху вниз, и я хочу предсказать угол, под которым эта стрелка. Это будет от до градусов или от до . Проблема в том, что эта цель круговая, и градусов - это одно и то же, что является инвариантностью, которую я хотел бы включить в свою цель, что должно значительно помочь в обобщении (это мое предположение). Проблема в том, что я не вижу четкого способа решения этой проблемы, есть ли какие-либо документы, которые пытаются решить эту проблему (или подобные)? У меня есть некоторые идеи с их потенциальными недостатками:
Используйте сигмовидную или коричневую активацию, масштабируйте ее до ( диапазона и включите свойство округления в функцию потерь. Я думаю, что это будет довольно сложно, потому что, если он находится на границе (худший прогноз), лишь небольшой шум подтолкнет весы к тому или иному пути. Кроме того, значения ближе к границе и будет труднее достичь, поскольку абсолютное значение предварительной активации должно быть близко к бесконечности.
Вернитесь к двум значениям, значениям и и рассчитайте потери на основе угла, который составляют эти два значения. Я думаю, что у этого есть больший потенциал, но норма этого вектора не ограничена, что может привести к нестабильности чисел и может привести к взлетам или к нулю во время тренировки. Это может быть потенциально решено с помощью некоторого странного регуляризатора, чтобы предотвратить слишком большое отклонение этой нормы от 1.
Другими вариантами было бы что-то делать с функциями синуса и косинуса, но я чувствую, что тот факт, что несколько предварительных активаций отображаются на один и тот же вывод, также усложнит оптимизацию и обобщения.
источник
Ответы:
Второй способ, прогнозирование и y = s i n ( α ) , вполне приемлемо.х = с о s ( α ) Y= s i n ( α )
Да, норма предсказанного вектора не гарантируется равной 1 . Но это вряд ли взорвется, особенно если вы используете функции активации сигмоида (которые ограничены по своей природе) и / или хорошо упорядочиваете свою модель. Почему ваша модель должна прогнозировать большое значение, если все обучающие образцы были в [ - 1 , 1 ] ?( х , у) 1 [ - 1 , 1 ]
Другая сторона - вектор слишком близко к ( 0 , 0 ) . Это может иногда случаться, и действительно могло привести к предсказанию неправильных углов. Но это может рассматриваться как преимущество вашей модели - вы можете рассматривать норму ( x , y ) как показатель достоверности вашей модели. Действительно, норма, близкая к 0, означает, что ваша модель не уверена в правильном направлении.( х , у) ( 0 , 0 ) ( х , у)
Вот небольшой пример в Python, который показывает, что лучше прогнозировать sin и cos, чем непосредственно прогнозировать угол:
Вы можете продолжить и составить график прогнозов, чтобы увидеть, что прогнозы модели синус-косинус почти верны, хотя, возможно, потребуется дополнительная калибровка:
arctan2
источник
Работа с декартовыми координатами работает хорошо, как указано выше. Тем не менее, на мой взгляд, преобразование полярных данных в декартово создает зависимости между координатами X и Y, которые изначально не присутствовали в данных. Например, модель выбора пути робота является более интуитивной в полярных координатах, чем декартова. Зависимость вектора скорости робота в полярных координатах между углом и величиной может даже не существовать или отличаться от зависимости в декартовых координатах.
Обходной путь, который я нашел для продолжения работы с полярными координатами, - это создание пользовательской функции ошибок для вычисления разности углов с помощью функции angdiff () в MATLAB и разности величин, как обычно.
Эта функция возвращает '0' для разницы между -pi и pi. Вот ссылка на страницу поддержки функций на веб-сайте Mathworks.
https://www.mathworks.com/help/robotics/ref/angdiff.html
Если вы используете активацию Sigmoid и ваши углы нормализованы между [0,1], вы должны вернуть их в диапазон [-pi, pi] перед использованием функции angdiff (), а затем нормализовать ошибку обратно до [0,1 ] диапазон для процесса обратного распространения.
Кроме того, эквивалентная функция в Python будет:
Это возвращает результаты, аналогичные функции MATLAB, а также работает с массивами:
Надеюсь, это поможет.
источник