Муаммара. Як я проходив річне стажування в Яндексі

Літо 2015 року. Сесія успішно здана. Нормальна людина, напевно, скаже: «Ура! Свобода! Цілий день буду грати в футбол і злітаю на море в Туреччину». Але тільки не справжній дослідник з допитливим розумом. Я вирішив, що в будь-якому випадку буду працювати над якимось власним проектом… Але час непродуктивно зі свистом мчало вперед. І тут мені в голову прийшла світла думка: а чому б не піти на стажування Яндекс? Напевно у них є купа цікавих дослідницьких завдань, до того ж це безцінний досвід роботи у великій компанії з безліччю професіоналів у своїх галузях, у яких є чому повчитися. Про те, як потрапити на стажування в Яндекс, чим там можна займатися і що вас чекає потім, я і хочу сьогодні поділитися.

Для початку пару слів про себе. Звати мене Муаммар, 21 рік від роду, на даний момент є студентом п'ятого курсу мехмату МГУ. А ще я випускник ШАДа, ведучий семінарів за Natural Language Processing у ШАДе і молодший розробник в команді мовленнєвих технологій Яндекса. Якийсь супергениальностью не відрізняюся, але люблю і вмію працювати. Мабуть, вистачить себе розхвалювати, поговоримо про стажування. Кому цікаво — ласкаво просимо під кат!

Процес підбору команди
Так от, вирішив я влітку попрацювати в Яндексі. Недовго думаючи, написав Юлі Кривової, яка є куратором студентських програм, сказав, що хочу займатися якимись складними завданнями, при тому не забув згадати, що захоплююся NLP. Як там в «Поле чудес»? Користуючись нагодою, хотів би сказати мамі, що я її дуже люблю передати Юлі велику подяку: вона доклала чимало зусиль для підбору команди, яка в кінці кінців припала мені до смаку. Взагалі, процес пошуку команди в моїй історії заслуговує окремої уваги. До того ж всім завжди цікаво, що ж не питають цих «дуже страшних» співбесідах в Яндексі і як до них готуватися, — а краще всього відразу отримати готовий рецепт, як їх успішно пройти!

Спочатку мною зацікавилася команда машинного перекладу. Стажерської вакансії у них не було, але все одно вони вирішили зі мною поспілкуватися. Все було чудово, за винятком того, що передбачався розмова по душах, а в підсумку все обернулося технічним співбесідою. Морально я до цього не був готовий, в результаті моторошно тупил і вирішував лише з тисячної підказки. Пішов з купою думок про свою нікчемність. Хоча через кілька днів Юля сказала, що в цілому я їм сподобався, так що треба чекати стажерську вакансію.

Через деякий час про мене завітав один з моїх ШАДовских викладачів з інформаційного пошуку — Саша Болховитянов, а їм якраз потрібен був чоловік на позицію молодшого розробника в команду пошуку дублікатів. Через тиждень мене запросили на три поспіль йдуть технічних очних співбесіди: алгоритми, проектування та C++. Алгоритми і структури даних я знав прекрасно, так і в цілому нічого сверхъестесвтенного не питали. У проектуванні на питання типу «а як побудувати розподілену відмовостійку систему» і «а що якщо в цій системі...» допомогла кмітливість. А ось з C++ виникли серйозні проблеми. Хоча я і розумів, як написати програму, що робить будь-яка конкретна рядок коду, тим не менше про те, як все це влаштовано на рівень глибше, у пам'яті, на той момент я не мав особливого представлення. Я комунікабельна людина, тому, щоб хоч якось розбавити фіаско, поговорив з собеседующим по душах. Сумарна враження я справив позитивне, але ось завдання, якими вони пропонували займатися, особисто мене не сильно надихали. І я чітко вирішив: краще за невелику зарплату, зате на цікаві особисто мені завдання піти нехай стажистом в машинний переклад, ніж пошук дублікатів молодшим розробником.

Час минав, а от все інше чомусь так і стояло на місці… але недовго! Точно вже і не пам'ятаю коли, але для краси давайте уявимо, що в три години ранку, до мене на пошту приходить лист від Юлі: команда розробки голосових інтерфейсів шукає собі співробітника! «Так це ж чисте NLP», — промайнуло в голові. Вилучення інформації з тексту, визначення іменованих сутностей, чат-боти — загалом, я прямо-таки загорівся до них потрапити. Спочатку хлопці влаштували скайп-співбесіда з Python, заодно уточнюючи мої знання Bash. Якщо в першому я міркував непогано, то ось що таке Bash — я і знати не знав! Після співбесіди вони дали мені велике домашнє завдання — написати діалогового агента, який за людським запитам, наприклад «Що таке Ейфелева вежа?», знаходив би найбільш відповідні статті з Вікіпедії. Мені досі здається, що я зробив добротно, але, як би там не було, їх керівник сказав, що команду потрібно все ж готовий розробник, а не стажист, з яким треба доглядати і всьому вчити.

Залишилася єдина команда — розпізнавання мови. Якщо чесно, про цій області я не знав нічого, до того ж смутно представляв, де саме там NLP. Мій нинішній керівник Ілля iliia Едренкин запевнив, що мені у них сподобається, до того ж завдання, якими вони займалися, мені видалися вкрай складними. У сухому залишку мене чекали ще два співбесіди: перше — за сучасними алгоритмами, де на додаток до звичайним знанням була потрібна неабияка кмітливість, а друге — за машинного навчання. Пройшов я їх не блискуче, але приличненько. Буквально через день-два прийшов лист від Юлі, що мене готові взяти в команду. Ура, товариші, щастя настало!

Окремо хотілося б відзначити декілька моментів, які, як мені здається, позитивно впливали на проходження співбесід. По-перше, відсутність хвилювання: Яндекс я йшов з таким настроєм, ніби не мене будуть проводити співбесіду, а я збирався там всіх проводити співбесіду, так і результат мені був абсолютно не важливий: візьмуть — чудово, не візьмуть — теж слава Богу. По-друге, навіть якщо де-то я і тупил, тим не менш намагався в цілому зав'язати розмову, поговорити на абстрактні теми, виставити себе в позитивному світлі. По-третє, я ніколи не витрачав на підготовку до співбесіди більше трьох годин, а єдине, що робив під час підготовки, так це освіжав знання в тій або іншій області.

Технічний аспект стажування
Кожному стажисту в Яндексі ставлять невелику, але досить творчу задачку в припущенні, що він вирішить її за 3-6 місяців. Причому слово «вирішить» не варто розуміти буквально. Іноді мова і правда йде про рішення деякої невелике завдання, в яких випадках це може бути поліпшення метрик, буває так, що потрібно придумати якийсь новий метод або підхід до задачі. В моєму випадку потрібно було навчитися визначати ступінь впевненості розпізнавання фраз та окремих слів нашої ASR-системою (ASR — Automatic Speech Recognition). Нагадаю, як відбувається розпізнавання мови. Процес перетворення звуку в текст складається з декількох етапів.

  1. Передобробка. Ми дробимо звуковий запис на фрейми за 25 мс з кроком 10 мс. (Можливо, також намагаємося деякими методами позбавитися від шуму.)
  2. Витяг фичей. З кожного кадру витягуються деякі чисельні фічі.
  3. Перетворення фичей в розподіл за фонемам (насправді в реальному моделі не фонеми, а сеноны — класи контекстно-залежних фонем). Фічі від кількох сусідніх кадрів з'єднуються разом, і на це добро натравливается деяка нейронна мережа (DNN, LSTM, GRU — що душі завгодно). На виході ми отримуємо імовірнісний розподіл по фонемам.
  4. Декодування. Далі з урахуванням мовної моделі, лексикона і нашого уявлення про світі відбувається декодування знайдених розподілів ймовірностей, і ми отримуємо ланцюжок слів.
Вся проблема полягає в кроці 3. Нейронна мережа — дискримінативна модель. Вона говорить, наскільки добре одна фонема відрізняється від іншої в даному фрагменті звуку, але не говорить, наскільки багато/добре та або інша фонема в цьому шматку звуку представлена. Тут можлива така аналогія. Деяких людей ми знаємо настільки добре, що можемо описати їх повністю, — це генеративна модель. А буває так, що ми побачили людину і щось відклалося в нашій пам'яті, описати людину ми не можемо, але зате якщо нам покажуть фотографію довільного людини, то ми можемо сказати, він на фото чи ні, — це дискримінативна модель. Проблема такої моделі полягає в тому, що був у нас, наприклад, деякий кадр і на ньому лунав звук «п» у звичайних умовах та в умовах шуму. Якщо цей звук в принципі — в одному випадку, в іншому — відрізнити від інших звуків, то нейронна мережа цілком може в обох випадках присвоїти їм однакову ймовірність, а ми все ж хочемо якось розрізняти ці два випадки.

Так ось, у силу сказаного вище, ASR-система погано вміє розуміти, наскільки чистою/зашумленою була запис. А нам важливо це розуміти, тому що якщо запис дуже зашумлена, то краще перепитати людини, щоб він ще раз повторив свій запит, ніж розпізнати і видати йому повну нісенітницю. Ступінь впевненості в запису називається конфиденсом (confidence). Визначення впевненості фрази також корисно для того, щоб давати асесорам розмічати лише записи з середнім конфиденсом. З великим конфиденсом запису і так добре розпізнаються, з низьким — просто шум, а от з середнім — найкорисніші, бо це складні приклади для нашої системи. А чим більш складні приклади ми даємо системі розпізнавання мовлення, тим швидше вона навчається (тут як з людиною: якщо йому постійно давати вирішувати «2 + 2», інтеграл він не вважатиме).

Взагалі кажучи, в задачі визначення конфиденса є дві суміжні підзадачі:
  • визначення впевненості кожного слова окремо,
  • визначення впевненості фрази в цілому.
У першому випадку стоїть завдання класифікації: або ми вгадали слово (клас 1), або ми помилилися (клас 0). У другому випадку стоїть завдання регресії. Так, забув сказати, що якість розпізнавання вимірюється метрикою WER (Word Error Rate). Так ось, у другому випадку ми будемо намагатися передбачити 1 — WER, після чого це і назвемо пофразовым конфиденсом. Також варто відзначити, що якщо ми добре вміємо вирішувати першу задачу, то вже непоганий оцінкою для 1 — WER буде середній послівний конфіденс, так що саме на цю задачу я зосередив основні сили.

Всі вже, напевно, подумали, що технічні деталі на цьому закінчилися? Ан немає. Мабуть, це не настільки секретна інформація, тому розповім в загальних рисах, яке кінцеве рішення було завдання. Для пословного конфиденса були використані два типи фичей: акустичні і мовні. Підбір акустичних фичей був спробою боротися з дискриминативностью нейронної мережі. Ми зібрали деякі статистики по всьому навчального корпусу (середня тривалість по фонемам тощо), а далі для кожного слова при розпізнаванні конкретної фрази порівнювали його параметри зі статистично середніми по корпусу. Це пом'якшувало дискриминативность і вносило деяку інформацію про зовнішній світ. В якості мовних фичей були взяті ймовірності n-грам з метою відстеження різних неузгодженостей типу «зелена трава». У кінцевому рахунку це був натравлен градієнтний бустинг, і вуаля — ми маємо послівний конфіденс! Результати вийшли цілком гідними: близько 25-50% (варіація в залежності від моделі) приросту якості по відношенню до бейзлайну (sMBR). Для оцінки пофразового конфиденса були використані всього дві штуки: середній послівний конфіденс і ступінь того, наскільки сильно розрізняються між собою N кращих гіпотез, які видала ASR-система розпізнавання (сенс в тому, що якщо гіпотези сильно розрізняються, то швидше за все фраза була вимовлена нечітко і її WER буде більшим).

Пару слів про самих експериментах. Далеко не завжди вони виходять добре і відразу. Було дві підзадачі: придумати фічі і вибрати алгоритм машинного навчання. Іноді у тебе є купа ідей з фічами, пробуєш — жодна не дає покращення. Пробуєш інші — знову немає поліпшення. У дослідницьких завданнях часто так буває. Потрібні витримка і терпіння. Я собі чітко сказав: ти старайся, а далі будь що буде, і ні в якому разі не можна сумувати. Це тільки здається, що ось фічі, бац-бац — і покращення, а насправді за цим стоїть кропітка праця і купа провалилися експериментів.

Наостанок зазначу, що Ілля Едренкин запропонував називати конфиденсы «числами Муаммара». Ще було досить забавно, що я періодично чув ці слова, коли колеги про щось говорили, але кожен раз думав, що мені це чути. А на одному із зібрань команди мені сказали: «А ти не знаєш, що конфиденсы вже місяць як називаються числами Муаммара?» Ну а далі якось прижилося :).

Мінуси і плюси стажування в Яндексі
З мінусів, мабуть, зазначу дві речі. Перша полягає в тому, що періодично тобі доводиться займатися не своєю роботою. І це відбувається навіть не тому, що всі навколо такі злі і хочуть спихнути на тебе частину своїх обов'язків, а просто тому, що іноді цим нікому зайнятися, а справа важлива. Другий момент полягає в тому, що, досягнувши рівня Яндекса, легко втратити стимул рухатися далі. Потрапивши в якусь команду, де тобі не подобається, ти все одно можеш залишитися, бо «ну це ж Яндекс».

Про плюси. Як ви могли здогадатися, людина я досить віруючий, тому першим плюсом поставлю саме можливість дотримання релігійних практик. В Яндексі людей цінують не за віру і політичні або інші переконання, а за те, як добре вони роблять свою роботу, і влаштовують так, щоб працювати було зручніше. Тому навіть у такому чутливому питанні Яндекс готовий іти назустріч. З п'ятикратною молитвою взагалі немає ніяких проблем: знайшов вільну переговорку — і хоч на голові стій там. Але це ще не все. Багатьом, напевно, відомо, кожен половозрелый чоловік з числа мусульман зобов'язаний відвідувати п'ятничну проповідь. Тому для себе я чітко вирішив: якщо не буде можливості ходити на проповідь, то мені така робота не підійде. Хоча графік і гнучкий, волею випадку виявилося, що саме в п'ятницю, саме під час п'ятничної проповіді у нас було щотижневе збори команди. Я відразу сказав: Ілля, вибач, але конкретно в цей час я не зможу бути присутнім. На мій превеликий подив, заради стажиста, не пропрацював і одного тижня в команді, близько десяти осіб (деякі годяться мені в батьки і мають багаторічний стаж) погодилися перенести зустріч на зручний для мене час. Сказати, що таке ставлення з боку членів команди радує і має, — нічого не сказати.

Другий плюс: Яндекс надає море можливостей для розвитку в професійному плані: можна відвідувати різноманітні наукові семінари, доповіді вчених і багато іншого. Я ось навіть примудрився злітати на ШАДовскую конференцію — але це швидше виняток, ніж правило! Причому придбання нових знань в області Computer Science є частиною твоєї роботи. Яндекс хоче, щоб його співробітники ставали розумнішими! Більше того, у мене є хобі — викладання: ну от подобається чомусь вчити людей. Взагалі не питання, говорить Яндекс, викладання в ШАДе — будь ласка, виступи на наукових семінарах — з радістю! В продовження наукової теми хочеться відзначити, що в нашій команді кожній людині виділяється досить багато, за моїми мірками, обчислювальної потужності, тому якщо ти хочеш позайматися своїми власними дослідженнями поза робочого часу, то прапор тобі в руки, ніхто не буде тобі.

І третій плюс: комфортну роботу забезпечує прекрасний московський офіс. Не відзначити це складно, але розпинатися я тут зовсім не буду — тема досить відома.

чи Є життя після стажування?
Деякі можуть подумати, що лише на стажуванні все так весело і радісно, а як тільки ти стаєш розробником, починаються суворі будні. Це не так… у всякому випадку не завжди так! Наприклад, чимала частина моєї роботи полягає в читанні наукових статей з області розпізнавання мовлення, їх модифікації та втіленні в життя. До речі, це ще одна причина, по якій я раджу розбірливо підходити до підбору команди: мені це страшенно подобається, а комусь іншому може здатися жахливо нудним. Вибирайте область собі за смаком, щоб працювати з посмішкою, а не кислою міною на обличчі! Підсумовуючи, повторюся: стажування в Яндексі стояча заняття на літо. Цілком можливо, що потім вона виллється в цікаву постійну роботу.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.