Wie ich Alice half, nicht auf andere Namen zu antworten. Yandex Praktikum

Hallo Habr. Mein Name ist Aleksey Rak, ich bin der Entwickler der Sprachassistentin Alice im Minsker Büro von Yandex. Ich habe diese Position bekommen, indem ich letztes Jahr für ein dreimonatiges Praktikum hier im selben Team war. Ich werde dir von ihr erzählen. Wenn Sie es selbst ausprobieren möchten, finden Sie hier einen Link zum Praktikum 2019 .



Wie habe ich mich eingelebt?


Ich bin ein Student im 4. Jahr an der BSU. 2018 habe ich die School of Data Analysis abgeschlossen. Ich lebe und lebe in Minsk.

Erstens erhielt ich wie andere SHAD-Absolventen 2018 einen Link zu einem Praktikum. Innerhalb einer Woche nach dem Absenden des Fragebogens musste 6 Stunden hintereinander Zeit eingeplant werden, um den Online-Wettbewerb abzuschließen. Es enthielt Aufgaben zur Wahrscheinlichkeitstheorie, zur Fähigkeit zu codieren und Algorithmen zu entwickeln. 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 die Sprache je nach Benutzerfreundlichkeit für eine bestimmte Aufgabe ausgewählt.

Wenn Sie eine Entscheidung einreichen, wird sofort ein Urteil gefällt. Danach kann die Aufgabe erneut gelöst werden, um eine korrektere Antwort zu erhalten. Ich habe ein paar Stunden gebraucht, um alle Aufgaben zu erledigen. Einige der Probleme habe ich beim ersten Versuch nicht gelöst.

Einige Tage später kontaktierten mich Personalvermittler und forderten ein erstes persönliches Interview im Büro in Minsk. Es war mit Alexei Kolesov - dem Leiter des Teams für akustische Modelle und Biometrie, wo ich arbeiten musste. Das Interview bestand darin, Probleme auf einem Blatt Papier oder an einer Tafel zu lösen und Fragen zur Wahrscheinlichkeitstheorie, zu Algorithmen und zum maschinellen Lernen zu beantworten. Ich denke, dass der Hintergrund der Olympiade-Programmierung es mir ermöglichen würde, mit dem Online-Wettbewerb fertig zu werden, selbst wenn ich nicht am ShAD studiert hätte, aber beim Interview war die ShAD-Erfahrung wirklich nützlich für mich.

Einige Tage später fand das zweite Treffen statt, bei dem mir zwei weitere Aufgaben zur Kenntnis der Algorithmen gestellt wurden: Aufwärmen und Grundkenntnisse. Bei jeder Aufgabe war es so: Ich schlug eine Lösung vor, beantwortete mehrere Fragen zu dieser Lösung und schrieb dann den Code auf ein Blatt Papier.

Einige Tage später wurde mir mitgeteilt, dass ich für ein Praktikum zugelassen wurde. Sie sollte drei volle Monate dauern (infolgedessen passierte es). Sie versprachen nicht, in eine feste Position zu wechseln, sagten jedoch, dass eine solche Option möglich sei.

Erste Schritte


Am ersten Tag, nachdem ich die organisatorischen Probleme gelöst und einen Laptop besorgt hatte, ging ich mit meinen Kollegen zum Mittagessen. Wir haben uns unterhalten, dann habe ich ein Team-Repository zusammengestellt und die erste Aufgabe übernommen - ein einfaches Python-Skript zu kompilieren, um ein bereits abgeschlossenes Programm in mehreren Threads auszuführen und dadurch seine Ausführung zu beschleunigen. Während der Erstellung des Skripts habe ich mich mit dem Codeüberprüfungssystem vertraut gemacht - wenn andere Mitarbeiter des Teams Ihren Code überprüfen. Wenn Sie wissen, dass Ihre engsten Kollegen sich zuerst mit ihm und in Zukunft mit anderen Entwicklern befassen, versuchen Sie, klarer zu schreiben. Bei der Olympiadenprogrammierung ist alles etwas anders: Die Geschwindigkeit, mit der Sie programmieren, ist wichtig, und höchstwahrscheinlich müssen Sie sich nicht einmal ansehen, was Sie geschrieben haben. Andererseits habe ich versucht, es mehr oder weniger klar zu machen, als ich vor Yandex vor einer Situation stand, in der ich den Code noch lesen muss.

Während des Praktikums habe ich mehrmals ähnliche Probleme wie dieses Skript gelöst, aber meine Hauptzeit war mit einem viel größeren Projekt beschäftigt - einem neuen Decoder für Spotter Alice.

Damit auf Geräten und Anwendungen in Yandex, auf denen der Assistent per Spracheingabe angerufen werden kann, alles wie vom Benutzer erwartet funktioniert, benötigen Sie einen hochwertigen Spotter - einen Sprachaktivierungsmechanismus. Meistens enthält die Aktivierungsphrase (die Sie aussprechen müssen, um Alice zu starten) das Wort "Alice" selbst.

Spotter umfasst die Vorbereitung von Funktionen (Funktionen für maschinelles Lernen), eines neuronalen Netzwerks und eines Decoders.

Vorheriger Decoder


Die vorherige Version des Decoders arbeitete mit der Verarbeitung von Wahrscheinlichkeitsvektoren. Es gibt ein akustisches Modell - ein neuronales Netzwerk, das für jedes Bild (ein Sprachfragment mit einer Dauer von 10 bis 20 Millisekunden) die Wahrscheinlichkeit zurückgibt, dass es jetzt ausgesprochen wurde. Frames können sich überlappen. Der Decoder enthielt eine Matrix mit Wahrscheinlichkeiten für die letzten 100 Bilder, die vom Gerät "gehört" wurden. Der Ton jedes Buchstabens entspricht einem bestimmten Wahrscheinlichkeitsvektor. Im Vektor für den Buchstaben A fand der Algorithmus das Element mit der höchsten Wahrscheinlichkeit, wonach nur der rechte Teil der Matrix relativ zu diesem Element berücksichtigt wurde. 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. Die Klänge von A am Anfang und am Ende des Wortes sind tatsächlich unterschiedlich - der zweite von ihnen wird normalerweise Shva genannt, es sieht aus wie A, E und O gleichzeitig.

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



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



Theoretisch können Sie in der gehaltenen Rede nicht nur das Wort "Alice", sondern auch ähnliche Wörter suchen. Es gibt nicht so viele von ihnen: "Alexander", "Alexa", "verhaftet", "Treppe", "Aristarchus". Wenn der Algorithmus glaubte, dass der Benutzer mit einer hohen Wahrscheinlichkeit einen von ihnen sagte, wäre es möglich, die Aktivierung unabhängig vom Ergebnis des Hauptdecoders zu verbieten.

Die Sprachaktivierung sollte jedoch auch ohne Internet funktionieren. Daher ist der Decoder ein lokaler Mechanismus. Es funktioniert dank eines neuronalen Netzwerks, das jedes Mal direkt auf dem Gerät des Benutzers (z. B. auf dem Telefon) ausgeführt wird, ohne mit Yandex-Servern zu kommunizieren. Und da alles lokal abläuft, lässt die Leistung (des gleichen Telefons im Vergleich zum gesamten Rechenzentrum) zu wünschen übrig. Das Erkennen nicht nur des Wortes „Alice“ würde bedeuten, die Arbeit dieses kleinen neuronalen Netzwerks erheblich zu komplizieren und die Leistungsgrenzen zu überschreiten. Die Aktivierung würde langsamer beginnen, der Assistent würde mit einer langen Verzögerung reagieren.

Ein grundlegend anderer Decoder wurde benötigt. Die Kollegen schlugen vor, dass ich die Idee des Hidden Markov-Modells HMM umsetze: Zu Beginn meines Praktikums wurde es bereits von der Community gut beschrieben und fand auch Anwendung im Alexa-Assistenten von Amazon.

Neuer HMM-Decoder


Der HMM-Decoder erstellt ein Diagramm mit 6 Eckpunkten: einen für jeden Ton im Wort "Alice" und einen weiteren für alle anderen Töne - eine andere Sprache oder ein anderes Geräusch. Die Wahrscheinlichkeiten von Übergängen zwischen Eckpunkten werden anhand einer Stichprobe aufgezeichneter und kommentierter Sprache geschätzt. Für jeden gehörten Ton werden 6 Wahrscheinlichkeiten berücksichtigt: Übereinstimmung mit jedem der fünf Buchstaben und mit dem sechsten Scheitelpunkt (dh mit jedem anderen Ton als dem im Wort "Alice" gefundenen). Wenn der Benutzer „Alexander“ sagt, fällt der Decoder in K: Die Wahrscheinlichkeit, dass der gesprochene Ton nicht Teil der Aktivierungsphrase ist, ist zu groß und der Assistent funktioniert nicht.



In naher Zukunft werden diese Änderungen allen Benutzern der Alice- und SpeechKit-Bibliothek zur Verfügung stehen.

Abschluss des Praktikums und Übergang in eine Festanstellung


Von den drei Monaten des Praktikums habe ich anderthalb gebraucht, um einen HMM-Decoder zu schreiben. Am Ende dieser anderthalb Monate teilte mir der Manager mit, dass der Übergang zu einer unbefristeten Stelle und zu einem unbefristeten Vertrag möglich (wenn auch nicht garantiert) wäre, wenn ich weiterhin so produktiv arbeiten würde. Etwa zur gleichen Zeit machte ich zwei Wochen Urlaub, um zum Programmierlager der Olympiade zu gehen. Nach meiner Rückkehr startete ich eine neue Aufgabe - das Trainieren von Spottern für verschiedene Geräte: Yandex.Phone, Bordcomputer mit Yandex.Auto und anderen.

Nach ein paar Wochen, ungefähr einen Monat vor dem Ende des Praktikums, fand mein erstes Interview über eine unbefristete Stelle statt, und einige Tage später - das zweite, letzte. Ich habe mit den Leitern verwandter Teams gesprochen. Beim ersten Interview wurden mir theoretische Fragen gestellt: zu maschinellem Lernen, neuronalen Netzen, logistischer Regression und Optimierungsmethoden. Darüber hinaus fragten sie nach der Regularisierung, dh nach der Reduzierung des Umschulungsgrades eines bestimmten Algorithmus und nach den Algorithmen, auf die die Regularisierungsmethoden angewendet werden. Das zweite Interview war praktisch: Wir haben mit einem Kollegen aus Moskau über Skype gesprochen, und dabei habe ich den Code in einem einfachen Online-Editor eingegeben.

Aus eigener Initiative habe ich keinen Vollzeitjob bekommen, aber auf ¾ - Tatsache ist, dass mein Studium an der BSU noch nicht abgeschlossen ist. In einer konstanten Position beschäftige ich mich auch mit der automatischen Auswahl von Schwellenwerten und anderen Hyperparametern. Zu jedem Zeitpunkt gewinnt das System die Wahrscheinlichkeit, dass das Schlüsselwort "Alice" gesprochen wurde. Der endgültige Klassifikator 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 durchgeführt wird.

Also kam ich zu Yandex und behielt meinen Platz in Alices Team.

Source: https://habr.com/ru/post/de438768/


All Articles