Da half ich Alice nicht auf andere Namen zu antworten. Praktikum in Yandex

    Hi, Habr. Mein Name ist Alexey Rak, ich bin der Entwickler von Voice Assistant Alice im Minsk-Büro von Yandex. Diese Stelle erhielt ich, nachdem ich im letzten Jahr in derselben Mannschaft ein dreimonatiges Praktikum absolviert hatte. Über sie werde ich dir erzählen. Wenn Sie es selbst ausprobieren möchten - hier ein Link zum Praktikum 2019 .



    Wie ich es arrangiert habe


    Ich studiere im 4. Jahr der BSU, absolvierte 2018 die School of Data Analysis, lebte und lebte in Minsk.

    Zunächst erhielt ich wie andere ShAD-Absolventen einen Link zum Praktikum 2018. In der Woche nach dem Versand des Fragebogens musste für den Online-Wettbewerb eine Zeit von 6 Stunden in Folge vergeben werden. Es enthielt Aufgaben zur Wahrscheinlichkeitstheorie, zur Codierbarkeit, zum Erfassen von Algorithmen. Es war möglich, den Code in der Sprache zu schreiben, in der Sie wissen, wie. Ich habe mehrere Aufgaben in C ++ geschrieben, mehrere in Python. Ich habe je nach Benutzerfreundlichkeit für eine bestimmte Aufgabe eine Sprache gewählt.

    Wenn Sie eine Lösung senden, wird sofort ein Urteil gefällt, wonach das Problem erneut gelöst werden kann, um eine korrektere Antwort zu erhalten. Ich habe ein paar Stunden gebraucht, um alle Aufgaben zu erledigen, ich habe den Teil der Aufgaben nicht beim ersten Versuch gelöst.

    Einige Tage später kontaktierten mich die Personalvermittler und riefen mich zum ersten Vollzeitinterview im Büro in Minsk an. Mit Alexei Kolesov - dem Leiter des Teams für Akustikmodelle und Biometrie - musste ich arbeiten. Das Interview bestand darin, Probleme auf einem Blatt Papier oder an einer Tafel zu lösen und Fragen zu Wahrscheinlichkeitstheorie, Algorithmen und maschinellem Lernen zu beantworten. Ich denke, dass der Hintergrund der Olympiade-Programmierung es mir erlauben würde, mit dem Online-Wettbewerb fertig zu werden, auch wenn ich nicht an der SAD studiert hätte, aber beim Interview hatte ich die Erfahrung der SAD wirklich nützlich.

    Ein paar Tage später fand das zweite Treffen statt, bei dem mir zwei weitere Aufgaben bezüglich des Wissens der Algorithmen übertragen wurden: Aufwärmen und grundlegend. Jede Aufgabe lautete wie folgt: Ich schlug eine Lösung vor, beantwortete einige Fragen zu dieser Lösung und schrieb den Code dann auf ein Blatt Papier.

    Einige Tage später wurde mir mitgeteilt, dass ich für ein Praktikum angenommen wurde. Es sollte drei volle Monate dauern (wie sich herausstellte). Der Übergang zu einer unbefristeten Stelle wurde nicht versprochen, aber sie sagten, dass eine solche Option möglich sei.

    Erste Schritte


    Am ersten Tag, nachdem ich die organisatorischen Fragen geklärt und einen Laptop gekauft hatte, ging ich mit meinen Kollegen zu Mittag. Wir unterhielten uns, dann stellte ich ein Team-Repository zusammen und übernahm die erste Aufgabe - das Erstellen eines einfachen Python-Skripts, um ein fertiges Programm in mehreren Threads auszuführen und damit die Ausführung zu beschleunigen. Bei der Erstellung des Skripts lernte ich das Code-Review-System kennen - wenn andere Leute im Team Ihren Code verifizieren. Wenn Sie wissen, dass Ihre nächsten Kollegen und andere Entwickler in der Zukunft zuerst damit umgehen werden, versuchen Sie, klarer zu schreiben. Bei der Olympiade-Programmierung ist alles etwas anders: Die Geschwindigkeit, mit der Sie programmieren, ist wichtig und es ist wahrscheinlich, dass Sie nicht mehr durchsehen müssen, was Sie geschrieben haben. Andererseits, als ich mich mit Yandex der Situation stellen musste, dass der Code noch gelesen werden muss,

    Während meines Praktikums löste ich mehrere Aufgaben, die diesem Skript ähnelten, aber meine Hauptzeit war mit einem viel größeren Projekt besetzt - einem neuen Decoder für Alices Spotter.

    Für Geräte und Anwendungen in Yandex, bei denen der Assistent mit einer Stimme abgerufen werden kann, funktioniert alles wie vom Benutzer erwartet. Wir benötigen einen Qualitäts-Spotter - einen Sprachaktivierungsmechanismus. Meistens enthält die Aktivierungsphrase (die Sie aussprechen müssen, um Alice zu starten) das Wort Alice.

    Spotter umfasst die Vorbereitung von Funktionen (Zeichen für maschinelles Lernen), ein neuronales Netzwerk und einen Decoder.

    Vorheriger Decoder


    Die vorherige Version des Decoders funktionierte mit der Verarbeitung des Wahrscheinlichkeitsvektors. Es gibt ein akustisches Modell - ein neuronales Netzwerk, das für jeden Frame (ein Sprachfragment mit einer Dauer von 10–20 Millisekunden) die Wahrscheinlichkeit liefert, dass es jetzt gesprochen wurde. Rahmen können sich überlappen. Der Decoder enthielt eine Matrix mit Wahrscheinlichkeiten für die letzten 100 Frames, die vom Gerät "gehört" wurden. Der Ton jedes Buchstabens entspricht einem bestimmten Vektor von Wahrscheinlichkeiten. Der Algorithmus hat das Element mit der höchsten Wahrscheinlichkeit im Vektor für den Buchstaben A gefunden, wonach er nur den rechten Teil der Matrix in Bezug auf dieses Element betrachtet. Dann wurde die Operation für die Buchstaben L, I, C und A wiederholt - jedes Mal, wenn die Matrix durch das gefundene Element "abgeschnitten" wurde. Töne A am Anfang und Ende des Wortes sind tatsächlich unterschiedlich - der zweite heißt Shva, er ist A, E und O gleichzeitig ähnlich.

    Wenn die endgültige Wahrscheinlichkeit größer als der Schwellenwert war, war der Algorithmus der Ansicht, dass das Wort tatsächlich gesprochen wurde, und aktiviert Alice für den Benutzer.



    Ein solches Schema führte dazu, dass der Assistent manchmal nicht nur spontan aktiv wurde, wenn die Leute „Alice“ sagten, sondern auch, wenn er andere Wörter hörte, zum Beispiel „Alexander“. Die Sounds im ersten Teil dieses Wortes („Alex“) folgen in der gleichen Reihenfolge und stimmen meistens mit den Sounds im Wort „Alice“ überein. Der Unterschied besteht nur in den Buchstaben E und K, aber E ist in seinem Klang sehr nahe an UND, und der Algorithmus hat das Vorhandensein des Buchstabens K nicht berücksichtigt.



    Theoretisch kann man nicht nur nach dem Wort „Alice“, sondern auch nach ähnlichen Wörtern suchen. Es gibt nicht so viele von ihnen: „Alexander“, „Alex“, „Festgenommen“, „Leiter“, „Aristarkh“. Wenn der Algorithmus der Ansicht ist, dass der Benutzer höchstwahrscheinlich einen von ihnen sagen würde, wäre es möglich, die Aktivierung unabhängig von dem Ergebnis des Betriebs des Hauptdecoders zu unterbinden.

    Die Sprachaktivierung muss jedoch auch ohne Internet funktionieren. Daher ist der Decoder ein lokaler Mechanismus. Es funktioniert dank des neuronalen Netzwerks, das jedes Mal direkt auf dem Gerät des Benutzers (z. B. auf dem Telefon) ausgeführt wird, ohne dass eine Verbindung zu Yandex-Servern hergestellt wird. Und da alles lokal geschieht, lässt die Leistung (des gleichen Telefons im Vergleich zum gesamten Rechenzentrum) sehr zu wünschen übrig. Nicht nur das Wort „Alice“ zu erkennen, würde die Arbeit dieses kleinen neuronalen Netzwerks erheblich erschweren und die Leistungsgrenzen überschreiten. Die Aktivierung würde langsamer werden, der Assistent würde mit einer langen Verzögerung reagieren.

    Wir brauchten einen völlig anderen Decoder. Kollegen schlugen vor, dass ich die Idee des Hidden Markov Models, HMM, umsetze: Zu Beginn meines Praktikums war dies bereits von der Community beschrieben und fand auch im Alexa-Assistenten von Amazon Anwendung.

    Neuer HMM-Decoder


    Der HMM-Decoder erstellt einen Graphen mit 6 Scheitelpunkten: einen für jeden Sound im Wort „Alice“ und einen weiteren für alle anderen Sounds - eine weitere Sprache oder ein anderes Rauschen. Die Wahrscheinlichkeiten von Übergängen zwischen Knoten werden anhand einer Stichprobe aufgezeichneter und proannotierter Sprache geschätzt. Für jeden gehörten Ton gibt es 6 Wahrscheinlichkeiten: Ein Zufall mit jedem der fünf Buchstaben und mit dem sechsten Peak (dh mit jedem Ton außer dem im Wort „Alice“ gefundenen). Wenn der Benutzer „Alexander“ sagt, fällt der Decoder bei K aus: Die Wahrscheinlichkeit, dass der gesprochene Ton nicht Teil der Aktivierungsphrase ist, ist zu groß und der Helfer funktioniert nicht.



    Diese Änderungen stehen in naher Zukunft allen Benutzern von Alice und der SpeechKit-Bibliothek zur Verfügung.

    Abschluss des Praktikums und Übergang zur Festanstellung


    Von den dreimonatigen Praktika verbrachte ich anderthalb einen HMM-Decoder. Am Ende der eineinhalb Monate sagte mir der Manager, dass der Übergang zu einer unbefristeten Stelle und ein unbefristeter Vertrag möglich wäre (wenn auch nicht garantiert), wenn ich weiterhin so produktiv arbeite. Ungefähr zur gleichen Zeit nahm ich zwei Wochen Urlaub, um zu den Programmgebühren für die Olympiade zu gehen. Als ich zurückkam, begann ich eine neue Aufgabe - die Ausbildung von Spottern für verschiedene Geräte: Yandex.Telephone, Bordcomputer mit Yandex.Auto und andere.

    Ein paar Wochen später, etwa einen Monat vor dem Ende des Praktikums, hatte ich mein erstes Vorstellungsgespräch wegen einer Festanstellung und ein paar Tage später das zweite, letzte. Ich habe mit den Verantwortlichen verwandter Teams gesprochen. Im ersten Interview wurden mir theoretische Fragen gestellt: über maschinelles Lernen, neuronale Netzwerke, logistische Regression und Optimierungsmethoden. Außerdem fragten sie nach der Regularisierung, dh nach der Verringerung des Umschulungsgrades eines bestimmten Algorithmus und nach den Algorithmen, auf die die Regularisierungsmethoden angewendet werden. Das zweite Interview war praktisch: Wir haben mit Skype über einen Kollegen aus Moskau kommuniziert und dabei den Code in einem einfachen Online-Editor gewählt.

    Ich habe aus eigener Initiative keine Vollzeitstelle bekommen, aber ... - Tatsache ist, dass mein Studium an der BSU noch nicht abgeschlossen ist. An der dauerhaften Position wähle ich unter anderem die automatische Auswahl von Schwellenwerten und anderen Hyperparametern. Zu jedem Zeitpunkt erhält das System die Wahrscheinlichkeit, dass das Schlüsselwort „Alice“ gesprochen wurde. Der endgültige Klassifizierer vergleicht diese Wahrscheinlichkeit mit einem Schwellenwert und aktiviert Alice, wenn der Schwellenwert überschritten wird. Zuvor wurde der Schwellenwert von den Entwicklern ausgewählt. Die aktuelle Aufgabe besteht darin, zu lernen, wie dies automatisch geschieht.

    Also kam ich zu Yandex und rettete meinen Platz im Alice-Team.

    Jetzt auch beliebt: