Hai, Habr. Nama saya Aleksey Rak, saya adalah pengembang asisten suara Alice di kantor Minsk di Yandex. Saya mendapat posisi ini dengan pergi ke sini di tim yang sama untuk magang tiga bulan tahun lalu. Saya akan memberi tahu Anda tentang dia. Jika Anda ingin mencobanya sendiri, berikut ini
tautan ke magang 2019 .

Bagaimana saya bisa tenang
Saya seorang siswa tahun ke-4 di BSU, pada tahun 2018 saya lulus dari Sekolah Analisis Data, saya tinggal dan tinggal di Minsk.
Pertama, saya, seperti lulusan SHAD lainnya, menerima tautan untuk magang pada tahun 2018. Dalam seminggu setelah mengirim kuesioner, perlu untuk mengalokasikan waktu, 6 jam berturut-turut, untuk menyelesaikan kontes online. Isinya tugas-tugas tentang teori probabilitas, kemampuan untuk kode, untuk datang dengan algoritma. Dimungkinkan untuk menulis kode dalam bahasa yang Anda tahu caranya. Saya menulis beberapa tugas di C ++, beberapa di Python, saya memilih bahasa tergantung pada kemudahan penggunaan untuk tugas tertentu.
Ketika Anda mengirimkan keputusan, putusan segera tiba di sana, setelah itu tugas dapat diselesaikan lagi untuk mendapatkan jawaban yang lebih benar. Butuh beberapa jam untuk menyelesaikan semua tugas. Saya tidak menyelesaikan beberapa masalah pada percobaan pertama.
Beberapa hari kemudian, perekrut menghubungi saya dan meminta wawancara tatap muka pertama di kantor Minsk. Itu dengan Alexei Kolesov - kepala tim model akustik dan biometrik, di mana saya harus bekerja. Wawancara terdiri dari memecahkan masalah pada selembar kertas atau di papan tulis dan menjawab pertanyaan tentang teori probabilitas, algoritma, dan pembelajaran mesin. Saya berpikir bahwa latar belakang pemrograman Olympiad akan memungkinkan saya untuk mengatasi kontes online, bahkan jika saya belum belajar di ShAD, tetapi pada saat wawancara, pengalaman ShAD benar-benar bermanfaat bagi saya.
Beberapa hari kemudian, pertemuan kedua terjadi, di mana saya diminta dua tugas lagi tentang pengetahuan algoritma: pemanasan dan dasar. Dengan setiap tugas itu seperti ini: Saya mengusulkan solusi, menjawab beberapa pertanyaan tentang solusi ini, dan kemudian menulis kode di selembar kertas.
Beberapa hari kemudian saya diberi tahu bahwa saya diterima untuk magang. Dia seharusnya bertahan tiga bulan penuh (sebagai hasilnya, itu terjadi). Mereka tidak berjanji untuk beralih ke posisi permanen, tetapi mengatakan bahwa opsi seperti itu dimungkinkan.
Memulai
Pada hari pertama, setelah menyelesaikan masalah organisasi dan membeli laptop, saya pergi makan siang bersama rekan-rekan saya. Kami berbicara, kemudian saya menyusun repositori tim dan mengambil tugas pertama - menyusun skrip Python sederhana untuk mulai menjalankan program yang sudah selesai dalam beberapa utas dan dengan demikian mempercepat pelaksanaannya. Dalam proses pembuatan skrip, saya berkenalan dengan sistem peninjauan kode - ketika orang lain dalam tim memverifikasi kode Anda. Mengetahui bahwa kolega terdekat Anda akan berurusan dengannya terlebih dahulu, dan di masa depan pengembang lain, Anda mencoba menulis lebih jelas. Dalam pemrograman olimpiade, semuanya agak berbeda: kecepatan program Anda penting, dan kemungkinan besar Anda bahkan tidak perlu melihat apa yang telah Anda tulis. Di sisi lain, ketika saya harus menghadapi situasi sebelum Yandex bahwa saya masih harus membaca kode, saya juga mencoba membuatnya lebih atau kurang jelas.
Selama magang, saya beberapa kali menyelesaikan masalah yang mirip dengan skrip ini, tetapi waktu utama saya dihabiskan untuk proyek yang jauh lebih besar - dekoder baru untuk pengintai Alice.
Agar perangkat Yandex dan aplikasi tempat asisten dapat dipanggil dengan suara, semuanya berfungsi sesuai harapan pengguna, Anda memerlukan pengintai berkualitas tinggi - mekanisme aktivasi suara. Paling sering, frasa aktivasi (yang harus Anda ucapkan untuk meluncurkan Alice) berisi kata "Alice" itu sendiri.
Spotter mencakup persiapan fitur (fitur untuk pembelajaran mesin), jaringan saraf dan decoder.
Dekoder sebelumnya
Versi sebelumnya dari decoder bekerja dengan memproses vektor probabilitas. Ada model akustik - jaringan saraf, yang untuk setiap frame (sebuah fragmen pidato dengan durasi 10-20 milidetik) mengembalikan probabilitas yang sekarang telah diucapkan. Frame bisa tumpang tindih. Decoder berisi sebuah matriks dengan probabilitas untuk 100 frame terakhir yang "didengar" oleh perangkat. Bunyi setiap huruf sesuai dengan vektor probabilitas tertentu. Dalam vektor untuk huruf A, algoritma menemukan elemen dengan probabilitas tertinggi, setelah itu dianggap hanya bagian kanan matriks relatif terhadap elemen ini. Kemudian operasi diulang untuk huruf L, I, C dan A - setiap kali matriks "dipotong" oleh elemen yang ditemukan. Bunyi A di awal dan akhir kata sebenarnya berbeda - yang kedua biasanya disebut Shva, sepertinya A, E dan O pada saat yang sama.
Jika probabilitas akhir ternyata lebih besar dari nilai ambang, maka algoritma menganggap bahwa kata tersebut benar-benar diucapkan dan diaktifkan Alice untuk pengguna.

Skema semacam itu mengarah pada fakta bahwa asisten kadang-kadang secara spontan dihidupkan tidak hanya ketika orang mengatakan "Alice", tetapi juga ketika dia mendengar kata-kata lain, misalnya, "Alexander". Bunyi di bagian pertama kata ini ("Alex") mengikuti dalam urutan yang sama dan pada dasarnya bertepatan dengan bunyi dalam kata "Alice". Perbedaannya hanya pada huruf E dan K, tetapi E dalam suaranya sangat dekat dengan saya, dan algoritma tidak memperhitungkan keberadaan huruf K.

Secara teori, Anda dapat mencari dalam pidato yang disampaikan tidak hanya kata "Alice", tetapi juga kata-kata serupa. Tidak begitu banyak dari mereka: "Alexander", "Alexa", "ditangkap", "tangga", "aristarchus". Jika algoritma percaya bahwa pengguna dengan probabilitas tinggi mengatakan salah satunya, maka akan mungkin untuk melarang aktivasi, terlepas dari hasil dekoder utama.
Namun, aktivasi suara harus bekerja bahkan tanpa internet. Oleh karena itu, dekoder adalah mekanisme lokal. Ini berfungsi berkat jaringan saraf, yang setiap kali berjalan langsung di perangkat pengguna (misalnya, di telepon), tanpa berkomunikasi dengan server Yandex. Dan karena semuanya terjadi secara lokal, kinerja (dari telepon yang sama dibandingkan dengan seluruh pusat data) menyisakan banyak yang diinginkan. Mengenali bukan hanya kata "Alice" berarti secara signifikan menyulitkan kerja jaringan saraf kecil ini dan melampaui batas kinerja. Aktivasi akan mulai bekerja lebih lambat, asisten akan merespons dengan penundaan yang lama.
Decoder yang berbeda secara fundamental diperlukan. Rekan kerja menyarankan agar saya menerapkan gagasan Hidden Markov Model, HMM: pada awal magang saya, sudah dijelaskan dengan baik oleh masyarakat, dan juga menemukan aplikasi di asisten Alexa Amazon.
Dekoder HMM baru
Dekoder HMM membuat grafik 6 simpul: satu untuk setiap bunyi dalam kata "Alice", ditambah satu lagi untuk semua bunyi lainnya - bunyi atau bunyi lain. Probabilitas transisi antar simpul diperkirakan pada sampel ucapan yang direkam dan beranotasi. Untuk setiap suara yang didengar, dipertimbangkan 6 probabilitas: untuk bertepatan dengan masing-masing dari lima huruf dan ke simpul keenam (yaitu, dengan suara apa pun selain yang ditemukan dalam kata "Alice"). Jika pengguna mengatakan "Alexander", decoder akan jatuh ke K: probabilitas bahwa suara yang diucapkan bukan bagian dari frase aktivasi akan terlalu besar, dan asisten tidak akan berfungsi.

Dalam waktu dekat, perubahan ini akan tersedia untuk semua pengguna perpustakaan Alice dan SpeechKit.
Penyelesaian magang dan transisi ke pekerjaan permanen
Dari tiga bulan magang, saya butuh satu setengah untuk menulis dekoder HMM. Pada akhir satu setengah bulan ini, manajer mengatakan kepada saya bahwa peralihan ke posisi permanen dan ke kontrak abadi akan dimungkinkan (walaupun tidak dijamin) jika saya terus bekerja secara produktif. Sekitar waktu yang sama, saya mengambil liburan dua minggu untuk pergi ke kamp pemrograman Olympiad. Setelah kembali, saya memulai tugas baru - melatih pengadu untuk berbagai perangkat: Yandex.Phone, komputer on-board dengan Yandex.Auto dan lainnya.
Setelah beberapa minggu, sekitar sebulan sebelum akhir magang, wawancara pertama saya diadakan mengenai posisi permanen, dan beberapa hari kemudian - yang kedua, yang terakhir. Saya berbicara dengan para pemimpin tim terkait. Pada wawancara pertama, saya ditanya pertanyaan teoritis: tentang pembelajaran mesin, jaringan saraf, regresi logistik, metode optimasi. Selain itu, mereka bertanya tentang regularisasi, yaitu tentang mengurangi tingkat pelatihan ulang dari algoritma yang diberikan dan tentang algoritma mana yang digunakan untuk metode regularisasi. Wawancara kedua adalah praktis: kami berbicara di Skype dengan seorang kolega dari Moskow, dan dalam prosesnya saya mengetik kode dalam editor online sederhana.
Atas inisiatif saya sendiri, saya tidak mendapatkan pekerjaan penuh waktu, tetapi pada ¾ - faktanya adalah bahwa studi saya di BSU belum selesai. Dalam posisi konstan, saya juga terlibat dalam pemilihan otomatis nilai ambang batas dan hyperparameter lainnya. Pada setiap saat, sistem mendapatkan kemungkinan kata kunci "Alice" diucapkan. Pengklasifikasi akhir membandingkan probabilitas ini dengan nilai ambang dan, jika ambang itu diatasi, mengaktifkan Alice. Sebelumnya, ambang dipilih oleh pengembang, tugas saat ini adalah mempelajari cara melakukan ini secara otomatis.
Jadi saya sampai di Yandex, mempertahankan tempat saya di tim Alice.