8 сезон · выпуск 11 · 1 декабря 2022 · 45 мин
От определения цены на молоко до распознавания лиц. Как дата-сайентисты меняют повседневную жизнь
Слушать · 44:55
В этом эпизоде мы снова говорим о данных и о том, что с ними можно сделать. Раньше машина не всегда могла отличить коня от человека, а теперь мы доверяем ей в определении оптимальной цены в магазинах, поимке кибер-преступников и даже этических вопросах. Как индустрия прошла этот путь — разбираемся с Валерием Бабушкиным, экспертом по Data Science в компании BlockChain.
Реклама. Курсы от Яндекс Практикума по программированию с нуля: https://clck.ru/32nsqX
Ссылки:
Телеграм-канал Валеры: https://t.me/cryptovalerii
Сайт Алексея Чернобровова: https://chernobrovov.ru/
Лекции от сообщества Open Data Science: https://www.youtube.com/@OpenDataScienceCon
Подписаться на «Запуск++» в Телеграме: https://t.me/+N_AopnXC0dBkMGQy
Подписаться на Либо/Либо+ в Телеграме, куда включены эпизоды «Запуск++»: https://t.me/+LXZx5JRqO4o0MjJi
Партнер этого подкаста — Яндекс Практикум. https://practicum.yandex.ru/
Над выпуском работали
- Редакторка
- Маша Агличева
- Продюсерка
- Настя Медведева
- Звукорежиссер
- Юра Шустицкий
- Дизайнер обложки
- Петр Сутупов
Транскрипт
Самат Галимов, Валерий Бабушкин · расшифровано автоматически, ошибки возможны
-
Всем привет! Меня зовут Самат Галимов, и это подкаст «Запуск завтра». Как технический директор я пытаюсь разобраться, как устроены сложные и интересные штуки. Я зову профессионалов, с которым можно поговорить простым человеческим языком. Когда вы видите в соцсетях картинки, нарисованные нейросетью по обычным фотографиям, тут никаких вопросов нет. Очевидно, что это машинное обучение. Но на самом деле алгоритмы участвуют в нашей жизни куда чаще и больше, чем мы себе это представляем. Например, когда вы идёте в магазин, то большинство цен определяются машиной. Или когда мы вызываем такси, то откуда к вам приедет таксист тоже определяется алгоритмом. В общем, сегодня мы разберемся, где еще, в каких еще неожиданных местах алгоритмы влияют на нашу жизнь. Поможет нам гость, который внедрял анализ больших данных и машинное обучение в крупнейших корпорациях планеты. Это подкаст студии Либо-Либо, и мы его сделали вместе с сервисом онлайн-образования Яндекс Практикум. У Практикума много курсов по разработке английскому языку, анализу данных, но важная часть это то, что Практикум помогает войти в IT, то есть начать с нуля. У Практикума есть курсы для начинающих, где вам сначала помогут разобраться, какие профессии вообще в IT существуют, и выбрать ту, которая вам нравится. В процессе обучения дадут не только теоретические знания, но и практику. Ну и, наконец, после выпуска даже помогут найти первую работу в IT. У большинства курсов есть бесплатная часть, так что можно попробовать начать учиться на эту профессию и решить, готовы ли вы платить за обучение. Ссылка на курсы практикума в описании к этому эпизоду.
-
Меня зовут Валерий Бабушкин, я работаю вице-президентом по Data Science в компании Blockchain.com.
-
Хочу начать вообще с примеров из реальной жизни, с которыми мы сталкиваемся каждый день и которые решаются благодаря Data Science. Вот я, например, пошел за кофе. В этом есть какой-то Data Science?
-
Например, когда ты идешь, наверняка у тебя есть смартфон. Не дай бог, у тебя есть какие-то умные часы. а то и какое-то умное кольцо, которое на основе каких-то данных выдает тебе какую-то информацию. Может быть твой пульс, насыщение кислородом, количество шагов сделанное, температуру и так далее. То есть в принципе это частично обработка сигналов, но вся эта обработка сигналов уже давно завязана на машинное обучение, и из всей этой кучи информации какие-то модели пытаются какую-то полезную информацию вытащить и сообщить. Ты пришёл в кафе, ты берёшь кофе за какую-то цену, правильно? Довольно частая задача, которая много где возникает, и обычно она приносит много денег. Но очевидно, что это зависит от оборота. То есть, если весь оборот кофейни 100 тысяч рублей, вряд ли стоит нанимать специалиста за 400 тысяч рублей, чтобы он принёс дополнительно 10 тысяч рублей. Ну то есть, логично. Но в целом, цена, безусловно, зависит, зачастую в хороших местах, от модели, а не просто к набу.
-
Ну условный перекресток, если я зайду в перекресток, то с большой вероятностью цена там посчитана машиной?
-
Да, да, там не с большой она посчитана машиной, потому что это тот проект, который мы делали, собственно. Ну подожди, дальше это можно продавать бесконечно долго, это кофе как-то привозили, правильно, то есть задача логистики, оптимизация логистической нагрузки. Это в принципе из мира еще классических оптимизационных задач, задача коммивояжёра, но точно так же она решается и разными ML методами, то есть там применяется много интересных вещей. ...как ценообразование, правда? Их тоже нужно как-то просчитывать, высчитывать. Третий пример. Программа лояльности. Ты приходишь в кофейню, а тебе дают карточку бумажную или пластиковую, или картонную. 5% в скидку или купи 9 — 10-й стакан бесплатно. Потом они, может, захотят тебя отслеживать и понимать, на какие акции ты реагируешь или нет. Вот тебе тоже, пожалуйста, аналитика. Мы рассмотрели довольно простой пример на довольно ограниченном ассортименте, но смотри, как много уже можно чего здесь с тобой сделать.
-
Слушай, у меня следующий вопрос, который возникает. Сейчас это делали с помощью Data Science, а вот до появления Data Science как это работало?
-
Многие методы. которые мы используем сейчас, будем продолжать с Data Science, они имели по 100-200. Мы всегда анализировали данные. Увеличился их объем, увеличилась наша возможность их анализировать. Это делать в автоматическом режиме и использовать для этого алгоритмы, для которых у нас раньше не хватало либо данных, либо мощностей, либо какие-то вещи в принципе не так давно и появились.
-
Можешь назвать пару примеров вещей, которые были невозможны до полномасштабной обработки данных, вот того, что называется Data Science?
-
Практически все задачи, связанные с компьютерным зрением, с текстом и с речью, были либо невозможны, либо решались на гораздо худшем уровне. То есть, словно говоря, с помощью компьютерного зрения, В 90-х можно было распознать, какие цифры указаны на письме, потому что там 10 цифр, и они пишутся довольно стандартно, особенно если на конверте, там же даже прописи указаны. Но очевидно, что это не то же самое, как распознать, что это тот человек или другой, правда ведь? То есть задача рекознавания людей была практически невозможной, или их детекция. Я помню, как я смотрел выступление какого-то довольно известного учёного в области компьютерных наук, и он сказал следующее. За последние 30 лет мы ускорились в 30 тысяч раз за счёт железа, и в 300 тысяч раз за счёт более оптимальных алгоритмов. Но есть алгоритмы, которые просто улучшают, ускоряют уже ранее решенные задачи. А есть алгоритмы, которые позволяют решать то, что раньше было нерешаемо. Тут стоит разделять. Поэтому мы, безусловно, многое смогли решать только потому, что у нас есть теперь возможность такие объемы обрабатывать. В то же время, какие-то вещи мы раньше никак не могли решать, даже если бы у нас мощностей стало столько же, сколько и сейчас. Вот не было бы у нас каких-то архитектур для работы с текстом, речью и картинками. ничего бы и не помогло.
-
Когда был переломный момент?
-
Можно смотреть по индустрии. Например, в такой индустрии, как компьютерное зрение, переломный момент произошел, пожалуй, в 2012 году. Есть такое соревнование ImageNet, в котором есть огромный набор данных, это миллионы картинок, там, по-моему, тысяча классов, то есть каждая картинка может принадлежать к одному из тысячи классов. Поезд, человек, лошадь, сено и так далее. Соответственно, ученые соревновались, различные алгоритмы для обработки зрения, обработки изображения использовали, чтобы посмотреть, какой же алгоритм работает лучше на задачах классификации. В какой-то момент вышли на плато, и они там бились на уровне примерно 73-75% точности. И в 2012 году ребята, по-моему, из лаборатории Джеффри Хинтона, Алекс Крижевский, они применили свёрточную (convolutional) нейронную сеть AlexNet, которая просто побила все результаты на 15%. А чтобы понимал, там ребятки бились за 0,1%, а уже 0,2%. То есть, чтобы сравнить, представь, вот Олимпийский игр, Усейн Болт пробежал 100 метров за 9.57, и все «Невероятно! Это самый быстрый человек на Земле! 9.57! Он побил предыдущий рекорд, который был 9.7! Ну то есть, это фантастика!» И тут кто-то просто берёт и пробегает за 4 секунды. Ну т.е. это просто несравнимый уровень. И сейчас ImageNet уже в хвосты гриву побит нейронными сетями 95%, 97%. Я не слежу, честно говоря, какое там конечное качество. Постоянно уже ставят рекорды, там уже всё, в принципе. Достигнут уровень, который выше уровня человеческой производительности в этой задаче.
-
О, т.е. человек в этой задаче, он уже проигрывает машине.
-
Ну, на самом деле, не то чтобы это очень удивительно, потому что если... Я не знаю, сколько раз разбираешь в собаках, я не очень, а там есть, например, порода собак. То есть вот это, да, я... Нормальный
-
человек этого точно не сделает.
-
Я не удивлён, что машина в этом меня перебьёт. Но в целом, то есть это был какой-то гигантский прорыв, гигантский прорыв в области работы с изображениями.
-
Можешь привести ещё пару примеров, может быть, из других областей?
-
А вот то, что ты сейчас в это время видишь, ты видишь, наверное, всякие генеративные штуки, когда текст превращается в картинку, делают какие-то художества, обложка Космополита сгенерирована. Этот прорыв частично связан с прорывом тоже в архитектуре нейронных сетей. Здесь, наверное, смыкаются две вещи. В 2017 году Ян Гудфеллоу, который работал в Google на тот момент, выпустил статью про генеративные соревновательные сети, где, если кратко попробовать описать, одна сеть пытается нейронной обмануть другую, пытается сгенерировать какие-то картинки, а вторая пытается определить, реальные ли картинки или сгенерированные. Ей показывает первая сеть. И за счёт этого первая сеть учится генерировать всякий хлам, который очень похож на что-то настоящее, но это не настоящее, это фейк. А дальше начали это усложнять и как бы сгенерировать именно то, что мы хотим. А если задуматься, то можно взять что-то, какое-то низкое качество, низкое разрешение и сгенерировать из этого более высокое разрешение. То есть стали это применять задачу по-разному. А в 2017 или 2018 году появилась новая архитектура для работы с текстом. Это архитектура трансформеров. Проблема работы с текстом заключается в том, что в тексте очень много контекста, очень много зависимостей. Соответственно, нужно постоянно смотреть на то, что было сказано до, то, что было написано после.
-
Отсылки такие, да. Эти, те, о чём мы говорили.
-
Замок или замок, как понять. В тексте никак, пока ты не увидишь контекста. Но появилась эта архитектура, которая тоже произвела революцию. Сначала эта архитектура применялась только в тексте. Может быть, вспомнишь, были довольно шумные публикации от OpenAI GPT, GPT-2, GPT-3. Да-да-да. То есть, вот это всё на архитектуре. BERT от Google, ELMo. А потом в какой-то момент сказали, чуваки, а мы можем, в принципе, архитектуру трансформеров применять и к компьютерному зрению. И оказалось, что довольно неплохо это применяется. Вот сошлись несколько вещей, генеративные сети, новые архитектуры, ну и, понятно, компьютерные мощности с 2012 года тоже скакнули невероятно вперёд. И вот это всё сошлось в точки, в которые можно вбить пингвины дерутся на Луне, и тебе выдастся какая-то картинка.
-
Фотографистичная картинка.
-
Да, как пингвины дерутся на Луне. Со звуком из генерации речи прорывы произошли очевидные, т.е. если ты когда-то пользовался программами по генерации речи в начале 2000-х годов, которые просто страшно механическим голосом по буквам что-то пытались делать, или по отдельным триплетам, или биграммам, это было ужасно.
-
Да-да-да.
-
Если посмотреть на голосовых помощников, будь то Google, Алиса от Яндекса или Алекса от Амазона, то это, конечно, совершенно другой уровень. Они и понимают нас очень хорошо, и генерация речи, и распознавание речи тоже произошёл, очевидно, сильный прорыв, но он опять же тоже связан со различными архитектурами нейронных сетей, но очевидно, что это применение, которое ещё 20 лет назад казалось уже чем-то почти невозможным. Но в целом, если попробовать так разбить, нейронные сети довольно хорошо работают с не структурированными данными, такими как текст, речь и изображение. А структурированные табличные данные, тут откровенно говоря, поменялось не так, чтобы очень много. То, что мы используем, да, есть какие-то модификации, улучшения, но это всё было и 20 лет назад, и 30 лет назад, просто это пошло в широкое распространение. Происходит какая-то революция, потом происходит не качественное, но количественное улучшение. Как это было видно по тому же компьютерному зрению и ImageNet, как это было с трансформерами, и сейчас они просто их допиливают, улучшают, дорабатывают и так далее. То есть появляется какая-то технология довольно прорывная. А дальше, на мой взгляд, это скорее уже количественное, но некачественное изменение, когда начинают оптимизировать.
-
Окей, я сейчас хочу разобраться в том, как вообще работает процесс Data Science на примере одной задачи. Можешь назвать какую-нибудь классическую задачу, с которой ты сталкивался на практике в своей работе, например, в X5?
-
В X5 классическая задача— ценообразование.
-
Вот давай ее как раз и обсудим. В каком виде вообще она для тебя была сформулирована?
-
Что сделать? Заработать денег на ценообразование. Как выставлять цену так, чтобы и людям было хорошо, и экспертам было хорошо? Люди, к сожалению, не могут держать в голове множество факторов. Люди, конечно, могут какую-то классическую модель бизнеса посчитать, но какая классическая модель? Если я купил яйца за 100 рублей, наверное, за 90 мне их продавать не очень выгодно. Дальше, за сколько мне их выгодно продавать? Ну, дальше можно посчитать, какова себестоимость продажи и прочее. Например, если я купил за 100 рублей И еще у меня есть люди, которые все это обслуживают, магазины и так далее. И чтобы я вышел, мне нужно продать за 120 рублей, а я хочу что-то заработать, я, может, захочу продать за 123 рубля, потому что у меня норма прибыли должна быть 2%. Дальше жизнь усложняет историю, потому что продукты могут испортиться, если их вовремя не купят. Их могут украсть, их могут разбить. Соответственно, нужно и это закладывать. Окей. А что если я какие-то продукты буду продавать дешевле, даже ниже себестоимости? Мне нужно, чтобы вы приходили за ним, потому что дальше приходят и покупают еще какую-то ерунду. А на эту ерунду я как раз накину денег побольше. Ну а дальше, дальше можно сказать, а вот если у нас магазин расположен на площади трёх вокзалов в Москве, то там наверное можно одну цену поставить, люди спешат, им некогда или они бегут на поезд какую-нибудь колбаску купить с хлебом или конфеток, поэтому мы накинем побольше. А если у нас спальный район, они там могут выбирать, мы накинем поменьше. И вот это уже всё с помощью людей контролировать становится очень тяжело.
-
Слишком много параметров.
-
Если бы у нас была волшебная машина, в которую мы загоняем весь известный нам набор данных о конкретной точке. Допустим, день недели, сколько было куплено на прошлой неделе, прогноз погоды на следующей неделе, какие были цены, цены у конкурентов, что-то еще, что-то еще, что-то еще, что-то еще. И говорит машина скажи нам пожалуйста какие у нас будут продажи. Машина говорит, затем мы меняем цену, а при такой цене мы можем менять эту цену и смотреть где же наступит тот максимум. Ну дальше мы считаем максимум по чему? Максимум по марже, максимум по обороту. То есть понятно, да? Это может работать. Соответственно, нам нужна такая модель мира, которая у нас сможет эти закономерности найти и построить. Ну, мы все в школе учились, возможно, помним классическое линейной регрессии, y равно
-
kx плюс b. Это просто прямая, я так понимаю, да, на плоскости?
-
Прямая, которая имеет, а, какой-то наклон, и, б, имеет какое-то смещение. Собственно, b отвечает за смещение, а k отвечает за наклон. Ну и что, если бы у нас было всего две точки, цена и спрос, ну то есть, что значит две точки? Двумерное пространство. То мы могли бы это графически изобразить в двухмерном пространстве, правда ведь? И потом сказать, ага, вот у нас есть 30 точек, мы через эти 30 точек проводим как-то прямую, но все эти точки же могут не лежать на одной прямой. То есть мы либо можем провести кривую, которая все эти точки пересекает, либо как-то так провести прямую, чтобы минимизировать расстояние от прямой до точек. Ну а теперь всё очень просто. Мы из двумерного пространства переходим в двухсотмерное, например, где у нас вместо зависимости цена-спрос, цена-погода, покупки на предыдущей неделе.
-
То есть все параметры этой модели— это ещё одно измерение этого пространства.
-
И точно так же мы функцию аппроксимируем, и дальше находим ту точку на этой кривой, которая нас устраивает. Вот, собственно, все. Задача решена.
-
А можешь описать по шагам, в чем задача дата-сайентиста в такой ситуации? Ему сначала нужно собрать данные, или данные у него уже есть. Откуда он берет эту модель? Как это работает? В общем, хочется прямо деталей.
-
Данных никогда нет, поэтому все постоянно замучают, ну точнее все говорят, что данные есть. В нормальном виде данных никогда нет, данные поступают с задержкой, поэтому первое что, это собирается как раз информация. Какие данные у нас есть, какие данные нам нужно притащить, что мы будем проверять. В целом модели уже все давно придуманы. Как ни странно, то есть задачи дат-сиентиста нет необходимости часто придумывать модель. Нужно понимать, какие модели применять и какое признаковое пространство подбирать. Что такое признаковое пространство, это как раз все те наборы данных, которые мы обсудили. То есть это может быть двумерное пространство, десятимерное пространство, двухсотмерное пространство.
-
То есть тебе нужно определить те параметры, которые важны, на которые ты будешь опираться.
-
Безусловно, при этом очевидно, что это инженерная задача, когда мы не можем бесконечное количество данных хранить, обрабатывать, использовать для обучения. Чем больше данных мы пытаемся собрать, тем больше вероятность, что где-то наступит проблема, какие-то данные не придут, что-то поломается и так далее. Плюс есть такая еще вещь в машинном обучении, как переобучение. Это когда модель находит какие-то закономерности, которых реально не существует. Она же ленивая, она же пытается найти максимально простые закономерности. Ну простейший пример. Люди пришли в банк брать кредит, и три человека, которые пришли в желтых штанах, кредит взяли и вернули. Но очевидно, что такой признак, как наличие желтых штанов, говорит о том, что они со стопроцентной вероятностью кредит вернут. Они же все три взяли и все три вернули.
-
Окей. Значит, первое – это выделить те параметры, на которые мы реально будем опираться. Что дальше?
-
Тут суть в том, что это итеративный процесс. Мы выделили параметры. Дальше, а чего мы вообще пытаемся закономерить, между чем и чем построить? Ну, допустим, здесь мы поняли, между какими-то параметрами, которые включают в себя цену, и таким параметром, как спрос. Но спрос на что? И в каком диапазоне? Спрос на один день вперед, на неделю вперед, на каждый день, агрегированный на неделю, агрегированный на месяц, на уровне магазина, на уровне десяти магазинов, на уровне распределительного центра. Ну, то есть, мы можем же бесконечно... То есть, вообще, между чем и чем мы ищем зависимость? А вообще, мы же делаем для того, чтобы денег заработать, то есть, что нам нужно, второе, что мы можем, и третье, что мы можем быстро. А это уже итеративный процесс, какие признаки помогают, какую нам зависимую переменную, с какой точностью и уверенностью прогнозировать, на какой срок, а как это делать надежно, а как это делать в автоматическом режиме, а как бы это все еще перевести в деньги, потому что, откровенно говоря, если я смогу спрогнозировать зависимость спроса от цены, Как мне бы это ещё перевести в деньги? Что это принесло? Правда ведь? Как это протестировать? Это постоянно бесконечный тупик зависимости цикла, потому что ты выбрал признаки, ты выбрал переменную, ты строишь какую-то модель, ты как-то эту модель пытаешься оценивать. Вопрос ещё, как эту модель оценивать, правильно? А дальше, окей, ты эту модель построил, а как тебе её интегрировать так, чтобы люди пользовались её результатом? Директор магазина может в какой-то момент сам решить, сколько ему заказать товара или нет.
-
Ага, то есть тебе нужно ещё это построить в производственную цепочку.
-
А директоров магазинов у тебя 20 тысяч, потому что у тебя 20 тысяч магазинов. А еще у тебя есть распределительного центра, а еще у тебя есть компании, которые хотят побольше продать тебе товары. А еще есть такой момент, что если я, например, куплю товар на X миллиардов рублей, условно говоря, мне может быть выгоднее купить больше товара и сгнить его, потому что у меня скидка от объема перекроет потери.
-
Обалдеть. Вообще, когда у тебя 20 тысяч чего-нибудь, это, мне кажется, не проблема, только если это золотые слитки. Во всех остальных случаях это большая проблема.
-
То есть здесь же очень много чего, и тут видишь, тут очень много инженеров задач, очень много задач, связанных с бизнесом, и немножечко-немножечко задач, связанных с машинным обучением.
-
То есть ты выстроил в X5 процесс, в котором цена определяется не людьми, а алгоритмами на основании данных. Когда я готовился к эпизоду, я увидел, что ты работал в Фейсбуке. С какими задачами ты там сталкивался?
-
Я работал в WhatsApp в Integrity, отвечал за команду User Data Privacy. И основная задача была биться со всякими злодеями, которые пытаются данные пользователей различными способами украсть. Ну то есть есть простой способ. Например, у меня есть WhatsApp. Я добавляю 10 тысяч случайных номеров. Например, 11111, 11112, 11113.
-
Просто перебираешь все номера.
-
Да, делаю нумерэйшн, перебираю. Кто-то из этих номеров оказывается пользователем WhatsApp. Значит, первое, что я знаю, этот номер пользователя WhatsApp.
-
Так, уже полезная информация. Значит номер как минимум реальный.
-
Да, второй. Я могу увидеть его картинку профильную.
-
Опа. А по ней уже можно что-то пробить.
-
А по ней можно что-то понять. Пол, возраст, расу. Дальше иногда там люди пишут имя свое.
-
В WhatsApp можно указать имя и фамилию, оно при добавлении в контакты.
-
Да. Еще там есть статус. online / offline. Ну а дальше, например, мне нужно разослать спам-компанию по каким-нибудь мужским штукам или женским штукам. Всё, соответственно, я уже могу действовать по этому. Ну и понятно, что если чувак просто добавляет, удаляет 10000 номеров в своей адресной книге, то не сложно его на этом поймать. А, проблема еще в WhatsApp в том, что это же end-to-end encrypted messenger, то есть контент сообщений неизвестен.
-
Фейсбук его не видит.
-
Ну, во-первых, Фейсбук даже это не хранит, а во-вторых, даже если бы хранил, он все равно это не видит. Ну и соответственно, хорошо, а что делать, когда у тебя есть 10000 сим-карт, каждый из которых добавляет и удаляет 500 номеров в день? Ну то есть 10 тысяч на 500 умножаешь, получаешь уже 5 миллионов. Есть всякие неофициальные клиенты ватсапа, их десятки, ну их там даже уже по две сотни миллионов. Ну то есть ватсап вообще довольно распространен, это довольно большая штука, у которой по-моему в день активных пользователей 2,5 миллиарда человек. Эти клиенты неофициальные бывают по разным причинам. Кто-то делает для того, чтобы получить какой-то дофункционал, а кто-то что-то там меняет, потому что в каких-то странах ватсап, трафик ватсапа дороже. оплачивается, это операторы специально бьют по людям. А какие-то клиенты конкретно опасные, неофициальный клиент, ну то есть там какой-то чей-то софт, он может легко взломать, получить доступ к телефону человека. Тоже этих чуваков выслеживать. Ну и отдельные задачи связанные со всякими scam integrity, civic integrity, то есть когда идут какие-нибудь выборы в Бразилии и идут спам-компании, а потом Власти Бразилии пытаются судить WhatsApp за то, что через WhatsApp это всё идёт. Тоже нужно как на это реагировать. То есть это всё связано с безопасностью.
-
Я работал в небольшом дейтинге и представляю, насколько сложно бороться со спамом, особенно если ты не хранишь переписку, не видишь переписку пользователей. Можешь немножечко рассказать, на какие конкретные подзадачи ты разделялся? В случае ценообразования ты немножко про это рассказал, а вот в случае борьбы со спамом, со скамом, как это работает?
-
Ну, начнем с того, что проблема в том, что в WhatsApp отсылаются в день больше 100 миллиардов сообщений. Это много. С этим тяжело работать. То есть, можно посчитать, какое количество в секунду, пусть у нас сколько, 85 тысяч секунд в сутках, получается 1,2 миллиона сообщений в секунду. Это много. Соответственно, тут несколько вещей. Во-первых, нужно уметь реагировать в реалтайме. Это тяжелая инженерная задача. Нужно уметь все эти сигналы быстро записывать. А сигналы могут быть простые. Понятно, что если чувак отослал 200 сообщений в секунду, ну я утрировал, то это очень подозрительно. Тебе не нужно знать контент сообщений, чтобы понять, что 200 сообщений в секунду отослано.
-
Нормальный человек не отошлёт.
-
Это какой-то странный чувак. Особенно если он это отсылает людям, которых у него нет. То есть, например, я могу добавить твой номер в адресную книгу, но у тебя моего номера может в адресной книге не быть. Соответственно, если я отсылаю таким людям, у которых я в адресной книге не нахожусь, 10 сообщений, это еще более подозрительно.
-
Ну это спамер 100%, его надо банить.
-
Ну, я унтрированно, то есть мы уже понимаем какие-то сигналы, правда ведь? А дальше вопрос, а сколько должно быть сообщений в секунду? 200? А почему не 199? Ну то есть, если мы сделаем 200, спамеры не дураки, они очень умные. Это же среда очень быстро адаптирующаяся, они будут слать 199.
-
А, тут задача оптимизации, мы уже оптимизируем не цену, а вот threshold (порог), после которого надо идти.
-
Да, соответственно, нам нужно найти такие отсечки в многомерном пространстве опять же, потому что у нас же не только кроме сообщений в секунду, кроме сообщений в секунду.
-
Как давно он пользуется WhatsApp?
-
Как давно он пользуется WhatsApp?
-
У скольки людей он есть в записной книжке?
-
Да-да-да, официальный это или неофициальный клиент, и далее-далее-далее.
-
Окей, сейчас ты работаешь в блокчейне.
-
Всё верно.
-
Зачем там датсайенс?
-
Ну что такое блокчейн? Блокчейн в принципе, если упрощённо рассмотреть, банк, но не только. То есть блокчейн это банк, который люди могут принести крипту, положить под годовые проценты довольно большие. Дальше они могут эту крипту, соответственно, покупать, продавать, переводить. Плюс у блокчейна есть биржа, и у блокчейна есть еще свой трейдинг, и блокчейн дает кредиты, но пока институционалам, то есть не физическим лицам. То есть есть все классические истории. Первое, как только есть платежная система, должен быть какой-то антифрод, потому что если будет фрод выше какого-то предела, то платежная система отключит вас от себя, и это неприятно. Очень неприятно не получать денег, хочется получать. Второй момент, как только у нас есть биржа, у нас есть какая-то задача ликвидности. Ликвидность позволяет нам проводить какие-то операции, если она присутствует, а если ликвидности нет, то мы не можем проводить операции. Но очевидно, что нам не нужно ликвидности больше, чем у нас будет операция, иначе у нас деньги просто будут лежать бессмысленным грузом. Хочется понимать хотя бы примерно, какой объем ликвидности нам нужен на торговую сессию.
-
Ооо, и цена ошибки здесь довольно высокая, потому что если не хватит, то вообще капец.
-
Ну, скажем так, тут всегда лучше перепрогнозировать вопрос в том, сколько, на 100% или на 10.
-
Это экономия очень большая.
-
Это примерно так же, как с заказом количества продуктов в магазин, то есть лучше всегда, чтобы что-то испортилось, чем клиенту идут...
-
К конкуренту и не вернуться.
-
К конкуренту, и потом вы думаете, чего я туда пойду, там курицы нет. Соответственно, вторая задача, связанная с ликвидностью. Но как только мы переходим на уровень, если мы будем выдавать кредиты физическим лицам, здесь уже пойдет классическая задача кредитного скоринга. И все то же самое, зачем аналитика, Data Science и Machine Learning в банках?
-
Какие еще задачи решает Data Science, о которых обычный человек не подозревает, не знает?
-
Такси это сложная задача. Это двухсторонний маркетплейс. С одной стороны водители, с другой стороны клиенты. Плюс в этом маркетплейсе нужна цена, время, погодные условия, ситуация.
-
Валера, на самом деле мне становится непонятно, потому что двусторонний маркетплейс. Делаешь программу, в которой есть таблицы с пользователями и таблицы с таксистами, и соединяешь их друг с другом. Где тут data science?
-
Во-первых, у каждой из этих сторон есть противоположная функция. Водитель хочет не ездить и получать много
-
денег,
-
А тот, кого водят, хочет ездить и не платить.
-
А, и тебе нужно найти оптимальную точку пересечения.
-
Согласен с этим?
-
Ну да.
-
Дальше, если, например, идёт дождь, спрос может резко повыситься. Спрос может резко повыситься, но у тебя предложение может резко не повыситься. То есть тебе нужно спрос отрегулировать таким образом, чтобы он у тебя не превышал предложение. С одной стороны, ты пытаешься повысить предложение, с другой стороны, ты пытаешься отрегулировать спрос. Как ты повышаешь предложение, ты даешь водителям больше денег. Как ты понижаешь предложение, ты делаешь более дорогую цену. Дальше. Чтобы такси пользовались, машина должна находиться в каком-то месте, правильно? Тебе нужно машину раскидывать по городу. Конечно, потому что если ты выйдешь и будешь ждать машину 30 минут... Тебе это будет не очень прикольно.
-
Это не случайно то, что у нас постоянно рядом есть машина.
-
Это не случайно. А дальше, а водитель уже тоже, ему же хочется заработать больше денег. Чтобы заработать больше денег, ему нужно максимизировать заказ. Максимизировать заказ он тогда, когда он приехал куда-то и тут же взял новый заказ. Правильно?
-
Так... И тебе нужно... А, время ожидания сделать не слишком большим, но... А дальше
-
у тебя есть разные классы такси, бизнес, эконом или премиум. Правда ведь?
-
Но иногда мне на самом деле дают бесплатные машины, просто для того, чтобы... Потому
-
что ему выгоднее поехать и повезти тебя, чем поехать пустым.
-
Слушай, Валерий, сейчас глупые вопросы. Что, серьезно? Машины специально пустыми гоняют в определенные районы, чтобы быстрее можно было... Их как раз
-
стараются не гонять пустыми.
-
но заказы дешевле делать те, чтобы машина там оказалась.
-
Да, или там могут просубсидировать, т.е. чувак туда не поедет, а нам нужно, чтобы он там был, потому что на его обратной поездке.
-
Оу, шит, это реально сложная задача.
-
Так. Т.е. это очень сложная задача, понимаешь, сколько здесь переменных. А при чём проблема? Как только у тебя много моделей здесь появляется, модели же тоже друг на друга начинают влиять, правда? Нужно оценивать не влияние моделей друг на друга. Ну то есть классическое, я как-то был на собеседовании на трейдере, мы очень клево пообщались, представь задачу. Ты делаешь модель, которая прогнозирует цену на что-то. И соответственно, когда надо покупать, когда надо продаешь. Но очевидно, что как только ты начинаешь пользоваться этой моделью, она перестает быть адекватной, потому что модель не учитывает того, что ты будешь влиять на рынок, используя эту модель. Ты строишь вторую модель, которая говорит, как рынок будет реагировать после того, как ты первую модель возьмешь и начнёшь что-то делать. Понимаешь?
-
Очень-очень круто. Все наверняка видели, как компьютер рисует картинки по описанию. А есть знаменитый сайт This person does not exist, где фотографии людей, которых не существует. Как это всё работает? Как это устроено?
-
А это вот, собственно, те генеративные сети. Есть две нейронные сети. Генератор и дискриминатор.
-
Очень нравится мне название, хорошо.
-
Задача дискриминатора, получив на вход фотографию, сказать, настоящая она или нет. Задача генератора просто генерировать такую картинку, на которой дискриминатор ошибётся.
-
То есть это конкуренция такая, двух машин, двух алгоритмов.
-
Генеративные соревнующиеся сети, ГАНы. Соответственно то, что Ян Гудфеллоу открыл миру. И да, вот это результат. This person doesn't exist. Сетка научилась на этой задаче генерировать людей.
-
Валер, я правильно понимаю, что берутся два алгоритма, которые могут потихонечку развиваться в процессе своей жизни, и дальше ты их сажаешь типа в кабинку, и они дерутся друг с другом, и каждый становится постепенно сильнее. В этом идея?
-
Условно да. Значит, есть одна сеть, она на вход получает просто какой-то шум, какой-то шумный сигнал. И постепенно она должна этот шумный сигнал так переработать, чтобы из него она сгенерировала картинку, которую вторая сеть примет за настоящую картинку человека. А так как вторая сеть-дискриминатор, она учится на реальных картинках и фиктивных, и когда каждый раз она говорит, что реальная-реальная, она получает вознаграждение, и что фиктивная-это фиктивная тоже, но ее штрафуют, когда она ошибается, то она пытается отличать. Понятно, что вначале она отличает плохо, но вначале и генератор плохо генерирует. Со временем каждый из них развивается.
-
Ты сказал, мы ее определенным образом штрафуем, и видимо вот это штрафование— это и есть информация о том, как выглядит человек. В смысле, то, как мы в нее подаем.
-
Ей пофигу, как выглядит человек, и мы ее штрафуем, потому что вторая сеть получает реальные картинки, как выглядит человек. А та сеть должна учиться обманывать эту сеть, и обманывает она только тогда, когда ей удается обмануть, а так как та знает, какой глядит человек, она тоже постепенно учивает, какой глядит человек.
-
Вау. То есть мы одного робота заставляем наказывать другого робота, когда тут рисует человека плохо?
-
Ну, примерно так. То есть даже мы не то чтобы его штрафуем, мы просто ему посылаем сигнал, что учись в том направлении.
-
Очень круто. Сколько разных фотографий людей должна увидеть вот этот дискриминатор? Сколько у него должно быть хороших фотографий людей для того, чтобы получился какой-то разумный результат у генератора?
-
Во-первых, нужно понимать, что я не специалист по ГАНу, но в принципе в свое время я принимал участие в соревнованиях, где нужно было генерировать котиков. Котики, конечно, приятнее людей. И в принципе реальных котиков там было тысячи, не десятки тысяч, скажем так. То есть это не очень большая выборка данных.
-
Другая задача, про которую все сейчас слышали, а некоторые даже сталкивались, это распознавание лиц. Чем она отличается? В чем там общее какое-то есть?
-
Смотри. Каждый раз, когда мы с чем-то сталкиваемся, нам всегда это нужно перевести в цифру. Правильно? Потому что машины не умеют сравнивать между собой лица, а цифры сравнивать между собой умеют. Соответственно, наша задача, если ее упростить, заключается в следующем. Пусть мы научимся переводить лицо в вектор чисел.
-
Так, просто набор чисел.
-
Набор чисел. Вектор чисел, набор чисел мы между собой с вектора сравнивать умеем. Мы это помним ещё по геометрии. То есть в принципе любой школьник может сравнить два вектора. Понятно, что если они абсолютно идентичны, то это один вектор. Они могут сильно различаться, они могут быть перпендикулярны друг к другу. Между ними может быть какое-то расстояние и так далее, так далее, так далее. Мы хотим научиться картинку переводить такой вектор, чтобы если мы снова лицо переведем в этот вектор, а лицо, понятно, может быть с другого ракурса, с пархмелья, другой свет. Мы хотим, чтобы этот вектор был максимально похож на изначальный вектор. Правильно?
-
Идея понятна, окей. Значит, разные фотки одного и того же человека должны быть похожи.
-
В векторном пространстве.
-
В векторном пространстве, да.
-
Второй момент. Фотки разных людей должны быть далеко друг от друга в векторном пространстве. Дальше. Третий момент. Людей много. И мы должны иметь достаточно места в этом векторном пространстве, чтобы мы могли разместить достаточное количество людей. И при этом у нас не было слишком много ложноположительных или ложноотрицательных результатов. То есть, когда мы говорим, о, это Петя, а на самом деле это Вася. Или такого человека нет, а на самом деле он такой есть. Ну а дальше есть различные способы это делать. Нужно научиться переводить такой вектор, чтобы решать эти две задачи. И поэтому, когда сеть обучается переводить картинку в вектор, она как раз учится решать такие задачи. То есть обычно ей дают несколько фотографий одних и тех же людей. Соответственно, представь, у тебя есть база данных, не пусть 100 тысяч человек, пусть у каждого человека есть 3-5 фотографий, и ты сеть учишь так, чтобы все фотографии одного человека были очень близко, и при этом фотографии разных людей были очень далеко.
-
А вот как ты её учишь? Вот этот процесс научения, он как устроен?
-
Это то же самое. Ты говоришь, что она сначала выдала тебе какой-то вектор. Для этой картинки, для этой и для этой. И ты высчитываешь дистанцию, которая должна быть похожей, которая должна быть одинаковой. Ты говоришь, сеть, пожалуйста, попробуй выучиться так, чтобы в следующий раз это было друг от друга дальше, а это друг от друга ближе. Есть второй момент. Второй момент, что ты дальше можешь работать с так называемыми hard negative samples. То есть, когда сеть, допустим, если она ошиблась, это же получается очень ценный материал, потому что там, где она в какой-то момент перестала ошибаться, это уже нам не так важно. То есть нет смысла, условно говоря, в тридцатый раз ей говорить сеть, научись эти картинки близко, а эти далеко, если она это уже делает. В какой-то момент возникает смысл сконцентрироваться на том, чтобы она придавала больше значения там, где она плохо работает.
-
Мне здесь не очень понятно, насколько этот процесс требует человеческого вмешательства, насколько там нужно тюнить, подтюнивать каждый раз, или достаточно вот эти общие принципы в каком-то виде запрограммировать, задать, а дальше это уже просто вопрос типа, сколько ты данных туда засунешь.
-
Ну это скорее вопрос инженерных практик, то есть у каждого человека, которым он недавно занимается, уже существуют свои пайплайны, и он их сходу забудет и получает какой-то результат. Ну а дальше всегда есть какие-то особенности. Какие данные, в каком они формате, откуда их доставать, на какой инфраструктуре это всё деплоить. То есть в целом, даже из коробки зачастую классические задачи решаются неплохо. Вопрос в том, хотим ли мы дальше это улучшать. Иногда хотим. И да, тут можно работать с архитектурой, как-то её допиливать.
-
Какое количество архитектуры вообще готовых есть?
-
Ну, сотни. Есть сотни готовых архитектур, есть такой зоопарк моделей. Причём они мало того, что готовы к архитектуре, там предобученные веса на каких-то задачах. То есть обычно можно даже эти веса брать, потому что суть в том, что даже если какая-то была другая задача, во время решения этой задачи сеть всё равно выучила какие-то полезные трансформации, фильтры и взаимосвязи. И потом можно уже на своём наборе данных учить не с нуля, а просто доучивать под твою конкретную историю.
-
а эти модели, то что называешь, типа готовой архитектуры, что они себе представляют?
-
По факту это достаточно простая вещь, это просто набор циферок, которые должны в определенном порядке произвести определенные математические операции, сложение, умножение, вычитание, взятие максимума-минимума и так далее. То есть когда мы говорим, что искусственный интеллект нас захватит, нас в принципе захватит перемножение матрицы.
-
Я слышал, что Google Translate сейчас работает полностью на машину обучения.
-
То же самое. Представь, мы научились переводить текст в вектор. Представил, да?
-
Погоди, текст, в смысле, какой-то длины фиксированный, я так понимаю, блок какой-то?
-
Ну, любой, любой текст в вектор научился переводить. Пусть мы можем разбить очень длинный текст на несколько векторов.
-
Хорошо, так принято.
-
Можем же, правильно?
-
Да, окей. Научились кодировать текст в вектор.
-
Теперь, вот если совсем-совсем-совсем упрощенно, представь, что у нас есть две пары, французский и английский. И вот у нас есть вектор текста на английском и вектор текста на французском. И представь теперь, что эти вектора соответствуют переводу. Ну, может же такое быть, правильно?
-
А, если перевод хороший, то вектора должны быть близкие, если перевод плохой, то далекие.
-
Если совсем упрощенно, понимаешь, мы свели практически задачу к предыдущей. Очень упрощенно это описал.
-
Валера, а есть какие-то задачи, в которых этот подход ломается? Которых невозможно описать с помощью векторов?
-
Есть, но, в принципе, почему произошел прорыв в работе с языком и с текстом? зрением, потому что эмбеддинги (embeddings), то есть мы научились превращать многомерное пространство, «вкладывать» в другое пространство, векторное, и использовать это, находить похожие и совершать всякие операции. Ну то есть в целом изначально никто не понимал, как перевести слово вектор. До 2011 года это было непонятно. А потом выпустил студент, который после этого стал работать в DeepMind, работу Word2Vec, где он показал, как можно слова переводить в вектора. А затем научились вектора переводить и предложения, и тексты, и так далее, и так далее, и так далее.
-
А в чем там суть этой работы, этого подхода?
-
Если мы рассмотрим самую классическую Word2Vec, то суть примерно в следующем. Что у нас слово очень сильно зависит от своего контекста. И, соответственно, если у нас слова, которые очень друг на друга похожи, могут описываться одним контекстом. Что это означает? Это означает, что если мы заменяем одно слово на похожее на него, у нас все еще нормально, правильно?
-
В смысле, смысл предложения типа мало меняется.
-
Этот студент умный, поэтому он отличник. Этот студент смышленый, поэтому он отличник.
-
Так, да, согласен.
-
Но очень редко будет встречаться «этот студент дурак, поэтому он отличник».
-
Он отличник, согласен. А-а-а, тут ключевое слово, ты сказал, очень редко будет встречаться такое слово в наших данных входных.
-
Да, да. Соответственно, мы можем построить, я даже не знаю, как мне это описать по понятию, но в целом мы можем попытаться описать слово на основе его контекста и превратить это в такой вектор, чтобы у нас слова, которые имеют похожий контекст, были в векторном пространстве тоже близко. Ну и там, кстати, очень много всяких приколов получилось. Там, например, получалось, что если из вектора слова «король» вычесть вектор слова «мужчина», то получается вектор слова «королева».
-
Прикольно. Очень круто. Погоди, это же была вот эта священная грааль, типа «давайте научимся переводить смыслы в математические конструкции». Вот, типа, научились.
-
Да, это был невероятный прорыв. В чем была проблема раньше? Раньше, как слова кодировали. Вот, допустим, у нас есть 200 тысяч слов. Мы возьмем вектор длиной 200 тысяч. Пусть у нас везде будут нули, кроме этого слова. То есть, если это слово «я», то у нас будет единичка на месте слова «я» в словаре, а все остальные будут нули. Работает, работает. Что плохо?
-
Опираться над ними нихера не сделаешь нормально.
-
Да, плохо то, что похожие слова в этом векторном пространстве совсем не похожи. Word2Vec сделать похожие.
-
Какие есть специальности внутри Data Science?
-
То же самое. Есть люди, которые занимаются компьютерным зрением, есть люди, которые занимаются NLP-текстом, есть люди, которые занимаются классическим ML, есть люди, которые занимаются трейдингом, есть люди, которые занимаются генеративными сетями. Они с определенной легкостью могут переходить между областями, но в целом я бы такое разделение ввел.
-
Я еще часто вижу в вакансиях такие слова ML-инженер, Data-инженер, Data-аналитик. Чем они отличаются?
-
Ну, очевидно, что менеджер – это человек, который работает с машинным обучением, и это человек, который эти модели делает и дальше деплоит их, как-то обвязывает и связывает с чем-то. Дата инженер – это человек, который работает с хранилищем данных, Data Lake, DWH, строит ETL-пайплайны, которые данные переводят, переносят из одного места в другое и гарантируют качество, скорость доставки и так далее. А дата аналитик это лучший друг, product manager или product owner, человек, который отвечает на вопросы и понимает, что и почему произошло. Ну тут уже дальше разделение.
-
Совсем разные профессии, получается.
-
Да, это абсолютно разные профессии.
-
Очень круто. Чем отличается анализ данных от data science?
-
Дата-сайенс, вообще мне слово не очень нравится, потому что есть компьютер-сайенс, правильно? Что такое компьютер-сайенс? Это набор каких-то дисциплин, связанных между собой. Что такое дата-сайенс? Это тоже набор каких-то дисциплин.
-
А каких можно назвать?
-
Разных. Туда входит и статистика, и машинное обучение, и программирование, и классические алгоритмы. То есть туда куча чего входит. Но когда ты сказал, что программист должен был менять принтер, это как раз в связи с тем, что никто не понимал, что от него ждать, и это были не программисты, а компьютерщики. Это были не программисты, но вспомни. Смотрите, компьютерщиков.
-
Очень нравится.
-
Соответственно, Data Science – это что-то очень широкое. Можно прийти в 10 разных компаний, посмотреть их вакансии по Data Science, и окажется, что от этих людей, от каждого, в каждой компании будут ожидать совершенно разных вещей. Data Science – это очень широкая понятия. Когда как Data Analytics, всё понятно. Чувак, который как-то умеет программировать для решения каких-то базовых своих потребностей, но первое, главная его сила – это анализ, знание того, как анализировать, критическое мышление и способность срыться в данных.
-
Круто. Насколько я понял, нейросети в каком-то смысле воспроизводят то, на чем они обучились. Есть некоторые вещи, которые мы не хотели бы, чтобы продолжались. Мы хотим какие-то параметры исключить из модели. Можно ли это сделать?
-
Ну, очевидно, что модели учатся на том, что мы им даем. А даем мы им отражение нашего мира. Как видишь, когда мы сказали им генерировать людей, они генерировали людей. А если бы мы им всех людей, которые в датасете существуют, подложили, были бы белыми, то они бы научились генерировать только белых людей, очевидно. Поэтому, конечно, такая проблема существует.
-
Можно ли учиться технически, в модели что-то тюнить, или надо ее заново переобучать уже с новыми данными?
-
Да, можно тюнить. Я вообще сейчас читаю статью, довольно длинную, на 50 страниц, что в модель можно влить backdoor, и модель будет выдавать то, что тебе нужно, а никто это проверить не сможет.
-
Вот мне вот про это очень интересно, потому что в компьютерных программах ты в крайнем случае можешь посмотреть исходный код.
-
А здесь не можешь. А здесь даже если у тебя есть все веса и весь, ну, практический план обучения, ты не сможешь проверить, есть там backdoor или нет.
-
Вот мой следующий вопрос как раз про это. Правда ли, что нейросеть— это черный ящик? Можем ли мы хоть как-то понять, почему нейросеть принимает то или иное решение?
-
Есть различные методы, которые позволяют отследить, а что повлияло на решение. Сейчас с этим ситуация гораздо лучше, чем была 5 лет назад. Поэтому понять, почему, можем. Backdoor найти пока не можем.
-
Валера, мы вообще можем редактировать нерассить? Можно, например, взять и сказать, типа, не учитывать, например, пол кандидата при приеме на работу? Ты уже не выкинул в момент обучения. Можно что-то с этим сделать? Постфактум.
-
Не, ну можно просто, когда ты на обучение подаешь этот вектор, допустим, там был вектор 0 или 1, а ты подаешь 7, 0, 5. Или ты 7 всегда меняешь на одинаковый пол. Но тут на самом деле не совсем корректно, потому что, а вдруг у нас какая-то комбинация факторов, что если у одного человека пол на один его возьмут на работу, а другому на один его не возьмут. То есть тут несколько моментов. Первый момент. Если уж мы учим модели, не можем пол выкинуть, то мы можем просто это заменить на какую-то константу, тогда это везде у всех одинаково и это не учитывается. Раз, раз. Второй момент. Модель же ленивая. Пол выкинешь, а там фотка есть, она будет смотреть на длину волос. И окажется, что длина волос коррелирует с полом. от bias (смещения)— вещь такая нетривиальная.
-
Обычно я еще спрашиваю у всех гостей, где про это можно узнать побольше— про ML, про нейросети, может быть, про этику в ML. Просто ознакомиться. Типа хочу узнать про ML побольше. С чего начать?
-
Посмотреть какие-то лекции на YouTube мои, Алексея Чернобровова, сообщество Open Data Science.
-
Отлично. Ссылки на YouTube и на ODS мы положим в описании к этому эпизоду.
-
Канал можно мой почитать, да. Время Валера.
-
И на твой канал тоже. Спасибо тебе большое, что пришел и выделил время. Это подкаст Студии Либо-Либо, и мы его сделали вместе с сервисом онлайн-образования Яндекс Практику. Над подкастом работали редакторка Маша Агличева, продюсерка Настя Медведева, звукорежиссер Юрий Шустицкий. За джингл спасибо Алексею Зеленскому. Редактор субтитров Т.Горелова Корректор А.Егорова