Katakanlah saya memiliki gambar panah panah dari atas ke bawah, dan saya ingin memprediksi sudut yang dihasilkan panah ini. Ini akan berada di antara dan derajat, atau antara dan . Masalahnya adalah bahwa target ini melingkar, dan derajat persis sama yang merupakan invarian yang ingin saya sertakan dalam target saya, yang seharusnya membantu generalisasi secara signifikan (ini asumsi saya). Masalahnya adalah bahwa saya tidak melihat cara yang bersih untuk menyelesaikan ini, apakah ada makalah yang mencoba untuk mengatasi masalah ini (atau yang serupa)? Saya punya beberapa ide dengan potensi kerugiannya:360 0 2 π 0 360
Gunakan aktivasi sigmoid atau tanh, skalakan ke rentang ( dan sertakan properti sirkular dalam fungsi kehilangan. Saya pikir ini akan gagal cukup keras, karena jika di perbatasan (prediksi terburuk) hanya sedikit suara akan mendorong bobot untuk pergi satu atau lain cara. Juga, nilai-nilai yang lebih dekat ke perbatasan 0 dan 2 \ pi akan lebih sulit untuk dijangkau karena nilai pra-aktivasi absolut akan perlu mendekati tak terhingga.0 2 π
Regress ke dua nilai, nilai dan dan hitung kerugian berdasarkan sudut yang dibuat oleh kedua nilai ini. Saya pikir yang satu ini memiliki lebih banyak potensi tetapi norma dari vektor ini tidak terbatas, yang dapat menyebabkan ketidakstabilan angka dan dapat menyebabkan meledak atau menjadi 0 selama pelatihan. Ini dapat berpotensi diselesaikan dengan menggunakan beberapa regularizer aneh untuk mencegah norma ini terlalu jauh dari 1.
Pilihan lain akan melakukan sesuatu dengan fungsi sinus dan cosinus tetapi saya merasa seperti kenyataan bahwa beberapa pra-aktivasi memetakan ke output yang sama juga akan membuat optimasi dan generalisasi menjadi sangat sulit.
sumber
Jawaban:
Cara kedua, memprediksi dan benar-benar oke.y = s i n ( α )x=cos(α) y=sin(α)
Ya, norma dari vektor yang diprediksi tidak dijamin mendekati . Tetapi tidak mungkin meledak, terutama jika Anda menggunakan fungsi aktivasi sigmoid (yang dibatasi oleh sifatnya) dan / atau mengatur model Anda dengan baik. Mengapa model Anda memprediksi nilai yang besar, jika semua sampel pelatihan dalam ?1 [ - 1 , 1 ](x,y) 1 [−1,1]
Sisi lain adalah vektor terlalu dekat dengan . Ini kadang-kadang bisa terjadi, dan memang bisa mengakibatkan memprediksi sudut yang salah. Tapi itu mungkin dilihat sebagai manfaat dari model Anda - Anda dapat mempertimbangkan norma sebagai ukuran kepercayaan model Anda. Memang, mendekati norma 0 berarti bahwa model Anda tidak yakin di mana arah yang benar.( 0 , 0 ) ( x , y )(x,y) (0,0) (x,y)
Berikut adalah contoh kecil dalam Python yang menunjukkan bahwa lebih baik untuk memprediksi dosa dan cos, untuk memprediksi sudut secara langsung:
Anda dapat melanjutkan dan memplot prediksi, untuk melihat bahwa prediksi model sinus-kosinus hampir benar, meskipun mungkin perlu beberapa kalibrasi lebih lanjut:
Perbarui . Seorang insinyur navigasi memperhatikan bahwa model seperti itu akan paling akurat ketika sudutnya mendekati . Memang, dekat 0 ° dan 180 ° sudut hampir linier dalam , dan dekat 90 ° dan 270 ° hampir linear dalam . Dengan demikian, dapat bermanfaat untuk menambahkan dua output lagi , seperti dan , untuk membuat model hampir linier di dekat 45 ° dan 135 ° masing-masing. Namun dalam hal ini, mengembalikan sudut asli tidak begitu jelas.πN2 α cos(α) sin(α) z=sin(α+π4) w=cos(α+π4)
Solusi terbaik mungkin untuk mengekstrak koordinat dari kedua representasi (dalam yang kedua, kita perlu memutar untuk mendapatkan ), rata-rata, dan hanya kemudian menghitung .(x,y) (z,w) (x,y)
arctan2
sumber
Bekerja dengan koordinat Cartesian berfungsi dengan baik seperti yang disebutkan di atas. Namun, menurut saya, mengonversi data polar ke Cartesian menciptakan ketergantungan antara koordinat X dan Y yang awalnya tidak ada dalam data. Misalnya, model keputusan jalur robot lebih intuitif dalam koordinat kutub daripada Cartesian. Ketergantungan vektor kecepatan robot dalam koordinat kutub antara sudut dan besarnya bahkan mungkin tidak ada atau berbeda dari ketergantungan pada koordinat Cartesian.
Solusi yang saya temukan untuk terus bekerja dengan koordinat polar adalah membuat fungsi kesalahan khusus untuk menghitung perbedaan sudut menggunakan fungsi angdiff () di MATLAB dan perbedaan besarnya seperti biasa.
Fungsi ini mengembalikan '0' untuk perbedaan antara -pi dan pi. Berikut ini tautan ke halaman dukungan fungsi di situs web Mathworks.
https://www.mathworks.com/help/robotics/ref/angdiff.html
Jika Anda menggunakan aktivasi Sigmoid dan data sudut Anda dinormalisasi antara [0,1] Anda harus mengembalikannya ke rentang [-pi, pi] sebelum menggunakan fungsi angdiff () dan kemudian menormalkan kesalahan kembali ke [0,1] ] kisaran untuk proses backpropagation.
Selain itu, fungsi yang setara dalam Python adalah:
Ini mengembalikan hasil yang sama seperti fungsi MATLAB dan bekerja dengan array juga:
Semoga itu bisa membantu.
sumber