Руководитель службы компьютерного зрения «Яндекса» — о том, как создать стартап на основе нейросетей

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


По прогнозу исследовательской фирмы Markets and Markets, объем мирового рынка искусственного интеллекта к 2020 году составит более $5 млрд. Медиа, реклама, ретейл, финансовая сфера и здравоохранение — основные сферы применения ИИ. Руководитель службы компьютерного зрения «Яндекса» Александр Крайнов на фестивале Kaspersky Geek Picnic рассказал, в чем опасность переобучения машин, заменит ли нейросеть человека и почему создать стартап в сфере ИИ легче, чем кажется (просто зайдите в интернет). Inc. публикует полную расшифровку выступления Крайнова.


Что такое машинное обучение

Еще одна сфера применения нейронных сетей — голосовые помощники (Siri, Amazon Alexa, Google Assistant). У модуля помощника, в который прилетает ваша фраза «Хай», есть фиксированный набор сценариев, но ему нужно выбрать из них подходящий ответ. Для этого нейронная сеть учится понимать, что фраза означает, скажем, приветствие, и решает, как реагировать. Но в помощниках не так уж много от искусственного интеллекта — правила ответа, заготовленный набор фраз написаны руками… Все помощники учатся понимать контекст и заполнять форму, задавая дополнительные вопросы. Если спросить, какая будет погода, — они будут уточнять, где и когда именно.

Бум того, что сейчас называется ИИ, пришел из компьютерного зрения (компьютерное зрение — это распознавание чего угодно на изображениях). Из компьютерного зрения в 2012 году неожиданно выстрелили нейронные сети. Их потом стали применять где угодно, и поэтому какое-то время то, что называется ИИ, было неразрывно связано с компьютерным зрением, а сейчас это уже не так.

Машинное обучение — способ научить машину составить автоматически формулу, которая помогает решить какую-то задачу — предсказание погоды, пробок, как выбрать лучший банк, а банку не ошибиться с выбором клиента при выдаче кредита. Для решения любой из этих задач, если мы решаем эти задачи с помощью компьютера, существует какая-то формула, по которой мы принимаем решение. Машинное обучение — способ эту формулу получить. Формулы бывают сложные и затейливые, бывают и простые.

Допустим, нам нужно решить простую задачу: быстро выбрать банк, в который мы положим деньги. Если мы решаем, что нас интересуют две вещи — рейтинг надежности банка и процент, который нам заплатят, — то проще всего воспользоваться полиномом: сосчитать сумму этих двух факторов.

Полином будет хуже работать, если добавить больше факторов (удобство, близость к дому), а лучше всего будет работать дерево решений, где на каждом шаге есть вариант с ответом «да» и «нет». Банк входит в топ-10? Да/Нет. Банк дает дополнительные гарантии? Да/Нет. Такое дерево решений — отлично работающий способ для большинства задач. Лучше всего дерево решений работает, когда у нас есть уже готовые признаки (факторы), по которым нам нужно принимать решение.

Пример — прогноз погоды. Нам известны характеристики: ветер, температура и десятки тысяч возможных признаков. Очень удобно для машинного обучения, что есть обучающая выборка — вся история наблюдений. У нас была такая-то температура, давление и прочее, а погода получилась такая. Засунув эти данные в машину, мы ее можем обучить.

Нейронные сети хорошо работают, когда нет никаких факторов и нужно их выделить автоматически.



Машинное обучение работает, когда есть две вещи: на чем учиться (данные) и цель. Цель — значит, мы можем померить, в нужную сторону ли идет обучение. С погодой все просто: например, разница температуры — предсказанной и фактической. Разница уменьшается, значит, развитие в нужную сторону. Навигатор автомобильный предсказывает время движения до точки — чем точнее, тем лучше мы учли факторы, мы молодцы.


Есть задачи, для которых так не получается. Например, задача выбрать спутника жизни. Проблема в том, что не очень понятно, как измерить, получилось нормально или нет, — и, главное, непонятно, где набрать достаточное количество данных для обучения. Мы же выбираем для конкретного себя, у нас конкретный мы только один и количество попыток невелико. Явно не сотни тысяч. Здесь обучиться намного сложнее.

В какой-то момент времени люди потеряли стеснение, и все, что раньше называлось машинным обучением, теперь называют термином искусственный интеллект. В какой-то степени они имеют на это право.

Есть задача — научиться распознавать на изображении кубик. Попробуем придумать формулу, с помощью которой мы будем это делать. Давайте опишем, что такое кубик. Самый простой случай, если у нас это проекция на плоскости и кубик вырождается в квадрат: стороны равны, углы прямые — это кубик. Если это изометрическая поверхность, уже сложнее, но, наверное, мы можем описать правила, по которым мы можем понять, что на картинке кубик. Если он на фоне чего-то, чем-то загорожен — становится еще сложнее. Но, тем не менее, мы можем составить такой набор правил, отловить первого попавшегося ребенка и попробовать объяснить ему, что такое кубик, объясняя ему наши знания об изометрических поверхностях, — что такое грани, почему они должны быть равны, что такое прямой угол. Скорее всего, у нас ничего не получится, мы так не делаем.

Ребенка мы учим существенно проще — на примере. Мы показываем ему картинку кубика и говорим, что это кубик. Через какое-то время у ребенка создается в голове некое представление, образ, что такое кубик. Он находит подходящий предмет или картинку в книге и закрепляет полученные знания: он обходит по кругу всех в семье и спрашивает: «Это кубик?». Все ему подтверждают, он собирает кворум, общее мнение и убеждается, что это кубик. Так с любым предметом. Мы никогда сразу ребенку не объясняем никакие формулы и принципы, он сам учится обнаруживать закономерности в объекте и сам учится понимать, почему эти образы значат кубик, эти — шарик, а эти — собака.



Нейронные сети состоят из какого-то количества слоев. В каждом слое есть нейроны, связанные друг с другом.

Как обучаются нейронные сети

Каждый нейрон в простом случае — это очень незатейливая формула, которая получает какие-то цифры на вход, совершает над ними математическую операцию (тип операции зависит от типа слоя нейронной сети) и передает результирующее число следующему слою. Например — на входе картинка. Картинка — это пиксели, у каждого пикселя есть какие-то значения. Если мы упростим и представим, что картинка черно-белая, то это значение яркости для каждого пикселя. Нейрон смотрит на пиксель (а лучше — на какую-то окрестность пикселей) и применяет какую-то операцию над этими пикселями. Операция называется свертка, но фактически он из группы пикселей создает какое-то одно число по какой-то математической формуле. И передает это число нейрону следующего слоя. Нейрон следующего слоя собирает все результаты от нейрона предыдущего, совершает тоже какую-то математическую операцию и передает дальше. В последний слой прилетают результаты этой работы от предпоследнего слоя, и последний слой делает свой вердикт, что было на изображении. Если у нас была так называемая бинарная классификация — это «тип A» или «тип B», — то последний слой понимает по картинке, она была A или B.

Мы создали такую нейронную сеть, собрали обучающую выборку (примеры, о которых мы знаем, что там — A или B), закинули в нейронную сеть и посмотрели, с какой точностью она распознает. Понятно, что точность — 50%, то есть случайная, — вообще ничего не распознает. Дальше мы начинаем править параметры сети — менять формулы, крутить, пока не увидим, что точность распознавания изменилась. Стала не 50%, а 51%. Я говорю «мы», но на самом деле сеть сама обучается и подбирает параметры. Процесс обучения — это не что иное, как подбор параметров формулы. На простой перебор в лоб уходит вечность, но ученые, математики находят способы, чтобы нейронная сеть обучалась быстрее.

Мы считаем, что сеть обучилась, когда ошибка перестала падать. У нас есть какое-то множество размеченных данных, мы смотрим, правильно ли нейронная сеть отвечает на вопрос — это картинка A или B. После того как в результате обучения ошибка перестала падать, мы считаем, что обучение закончилось.

Если посмотреть внутрь нейронной сети, что происходит с изображением внутри? Когда мы посмотрим на обученную нейронную сеть, мы увидим, что у нас нейроны первого слоя реагируют на какие-то градиенты, на какие-то примитивы в изображении, которые в общем еще ничего не отображают. Если пойти чуть дальше, то мы увидим, что там уже появляются какие-то осмысленные паттерны, какие-то понятные нам текстуры, еще дальше мы начинаем видеть узнаваемые образы — могут быть фрагменты цветов, глаза, клювы птиц. В результате на последнем слое нейронная сеть получает уже четкие понятные образы. У нас есть нейроны, которые реагируют на то, если на картинке была собака.


Нейронная сеть учится так же, как ребенок. Если убрать применение математики и вычислительных мощностей, все остальное то же самое. Мы просто показываем примеры картинки и говорим, это собака или кошка. Нейронная сеть сама учится отличать, собака это или кошка. Мы нигде, ни в каком месте не пытаемся выделить какие-то признаки, по которым собака отличается от кошки. Вообще, совсем никак.


Поэтому, если когда-нибудь вам станет интересно, как же нейронная сеть отличает одно от другого… Почему она там видит какие-то углы, шарики, колеса, еще что-то, то, скорее всего, вы ошибетесь в предположениях, — и я в каждом конкретном случае тоже не знаю. Как-то нейронная сеть это почему-то научилась делать.

Нейронные сети известны очень давно, в 60-х годах появился термин. Дальше их сложность росла, развивалась, и с недавнего времени, когда случился бум нейронных сетей, сейчас попробую объяснить, что произошло. Вот в 1998 году были нейронные сети, нейронная сеть 2012 года, когда Крижевский, Хинтон и Сатскевер показали невероятные результаты по распознаванию изображений, вот с этого момента случился бум нейронных сетей — того, что сейчас называется искусственным интеллектом.

Нейронные сети растут, количество связей растет, все это становится очень сложным. Благодаря чему все это стало возможным? Не только благодаря тому, что люди подумали и решили: «Если мы сделаем больше слоев, то у нас все сразу получится!». Вообще мысль сделать больше слоев всем была очевидна давно. Проблема в том, чтоб все это хозяйство научить, — требуется больше вычислительных мощностей, намного больше. Когда вам нужно подобрать два параметра, они подбираются легко. Когда десятки миллионов, как в нейронное сети, — очень сложно. Но мало того, в машинном обучении есть такая страшная штука, которая называется переобучение.

Проблемы обучения нейросетей

Переобучение — враг машинного обучения, которое происходит тогда, когда у нас данных для обучения мало, а параметров много. Например, я решу сделать систему, которая  отличает мужчин от женщин по каким-то цифровым характеристикам, и тут у меня есть гениальная идея: по номеру телефона, подумаю я, можно отличить мужчин от женщин. Я попрошу небольшую аудиторию назвать 4 последние цифры номера телефона, составлю формулу, которая, скорее всего, с высокой точностью и полнотой будет по телефону отличать, это чей телефон — мужчины или женщины. Я победил? Ничего подобного. Как только мы берем любого человека не из выбранной аудитории, все разваливается и система перестает работать. Это значит, что я переобучился на эти конкретные данные. Если бы я учился на миллионах телефонных номеров, то я бы обнаружил, что никакого сигнала там нет и по номеру телефона ничего определить нельзя.


В машинном обучении, если у вас есть очень мощная система с огромным количеством параметров, для того чтобы она тупо не запомнила, например, картинки… Не выучила конкретные картинки, а вообще научилась как-то обобщать и работать, нужно очень много различных данных. Вы представляете себе, сколько было подписанных и аннотированных картинок, оцифрованных в 60-х годах, когда начались нейронные сети? Их вообще ни одной не было. Сейчас происходит взрывообразный рост медиаданных в интернете — аннотированных, подписанных, как-то собираемых, — и это умение собирать данные послужило важной причиной развития того, что сейчас называется искусственным интеллектом.


Дальше люди навалились на речь. С речью тоже все хорошо. Очень просто набрать обучающую выборку — дай людям текст, пускай они его начинают, у тебя есть буквы и есть звук, который соответствует этим буквам. Дальше задача очень хорошая и подходящая для нейронной сети. Когда мы даем нейронной сети звук, мы не даем ей никаких факторов. И дальше нейронной сети говорим, давай ты сама попробуешь, как на этом звуке научиться понимать речь. Также как ребенку мы не пытаемся объяснять, что фонемы с такой-то частотой, следующие за такой-то фонемой, — это, скорее всего, вот такая-то буква.

Нейронная сеть распознает звук следующим образом: звук делится на короткие фрагменты, для каждого фрагмента делается предсказание фонемы с помощью нейронной сети, дальше применяется фонетическая транскрипция (все эти фонемы превращаются в символы) и после этого применяется какая-то языковая модель. То есть мы знаем, с какой вероятность после какой буквы будет идти другая буква. Все, наверное, сталкивались с ситуацией, что на незнакомом языке нам невозможно понять, что говорит человек, особенно если это шум или песня на незнакомом языке. Это потому, что мы не можем применить нашу языковую модель. Если мы понимаем, что нам ждать, какое слово должно было прозвучать, мы распознаем слово и обратным образом понимаем, какой звук в каждый момент времени звучал.



Два тренда последних лет

1. Обучение с подкреплением.

Это способ обучения, когда компьютер собирает данные сам. Мы не даем данные для обучения, как-то слегка для начала обучили, а дальше запускаем наш искусственный интеллект в жизнь и говорим ему: давай, учись дальше сам, собирай данные. Проблема в том, что абы куда запустить нельзя, но можно запустить, например, в игры.


Игра го — самая сложная из игр с полной информацией: там огромное количество ходов и комбинаций (в каждый момент времени есть около 250 вариантов хода, а общее количество вариантов партий больше чем атомов во вселенной). По вариативности го намного сложнее шахмат. Шахматы ближе к крестикам-ноликам, чем го. Просчитать там ничего невозможно, но можно предположить. Так как это игра восточная, она обросла всякой восточной мудростью, красивой философией. И всем казалось, что компьютер здесь человека никогда не победит — у него нет интуиции. Но в компании Deep Mind (не так давно купил Google) сделали так: для начала они учили машину на партиях, в которые играли люди (их очень много записано).


Они учили нейронную сеть предсказывать следующий ход. Не просчитывать, а предполагать, что в этой ситуации обычно ходят сюда. Машина научилась предсказывать следующий ход. Но одного такого предсказания еще недостаточно. Стали учить вторую сеть, которая стала предсказывать по позициям, кто выиграет. В нее загрузили огромное количество позиций в разных ситуациях игры, и машина научилась с какой-то достоверностью определять, кто выиграет. Дальше у нас есть две составляющие: одна сеть делает предположение следующего хода, а вторая — кто после этого выиграет. Добавив сюда щепоточку старого метода Монтекарло, когда мы случайным перебором выбираем какое-то количество вариантов, получили штуку, которая играет очень здорово.

При чем тут обучение с подкреплением? Мы собрали какое-то количество данных на партиях, сыгранных людьми, а дальше два компьютера играют сами с собой — это, конечно, не два компьютера, это вообще не компьютеры, а сервера в облаке, — и нейронные сети играют сами с собой, набирая огромную базу сыгранных партий, большую, чем есть в широком доступе. Особенно если мы говорим о партиях сильных игроков, а нейронная сеть к тому времени стала сильным игроком. Дальше произошло неизбежное: нейронная сеть обыграла человека.

2. Generative adversarial networks (создающие конкурирующие сети)

Ученые говорят, что это самое значимое, что случилось с нейронными сетями за последние два года. Нам нужно научить нейронную сеть делать фотореалистичное изображение чего-то: из текста или из рисунка. Мы берем некоторое количество реальных фотографий, выберем один пример, создадим какую-то фотографию, возьмем этот пример, а дальше у нас есть блок, который должен угадать, где пример настоящий, а где — нет. Вот здесь тот, кто создает, и тот, кто угадывает, — нейронные сети.

Первый раз нейронная сеть, которая угадывает (ей, конечно, проще), влегкую отвечает, настоящее или ненастоящее. И каждый раз, после того как она сказала «да, это ненастоящее», мы в ту нейронную сеть, которая генератор, возвращаем результат и говорим: «Ты так больше не делай. Тебя легко раскусили». И она создает и генерирует еще раз, еще раз, перебирает такие параметры, до тех пор пока та сеть, которая отвечает, не ошиблась. В итоге сеть ошиблась и не смогла отличить сгенерированное от настоящего. Тогда мы возвращаем ей этот сигнал и говорим «Это было ненастоящее! В следующий раз так не путайся». Запустили этот процесс, и он идет очень долгое время: учатся одновременно две конкурирующие нейронные сети. Одна учится создавать, а другая — отличать.


В результате этого сейчас есть очень интересные работы. Например, есть научная работа этого года: по спутниковым снимкам делают карты и, наоборот, по картам делают спутниковые снимки. Или как по картинке делать искусственное изображение. Нейронная сеть по картинке учится делать реалистичное изображение. Все работы в публичном доступе, можно почитать. Скоро можно ожидать ожидать гору стартапов —  по рисунку делающих фотореалистичное изображение.


Часто сравнивают этот искусственный интеллект с каким-то будущим, со скайнетом, который прибежит и нас заборет. Давайте попробуем сравнить интеллект искусственный и интеллект естественный. Помериться, кто сильнее. Мы или эта железка бездушная? Есть две цифры: 200 млн и 800 трлн. У меня плохо с такой математикой, с разрешающей способностью, я не могу в голове удержать эти две цифры одновременно. Что это за цифры? Это цифры количества параметров в нейронной сети искусственной и человеческой. 800 трлн — это человек, 200 млн — это большая современная развитая нейронная сеть. Это что-то типа лягушки, некое земноводное по сравнению с человеком. Машине до человека еще очень, очень далеко. Осознать эти два размера можно так: если искусственная сеть — баскетбольный мяч, то человек — это планета Земля. Масштабы несопоставимые.


Практическое использование нейронных сетей

Когда изображение проходит по нейронной сети, в конце мы классифицируем изображение. Мы можем не классифицировать, взять выход из нейросети — какие-то числа — и записать их в вектор. Вектор — это некое число или набор чисел, которое позволяет поместить какую-то сущность, например, изображение в многомерное пространство — размерность его соответствует размерности вектора. Мы где-то для этого изображения можем найти его место в пространстве. Как это получается: возьмем 100 тысяч разных классов изображений — различные виды животных, всякие объекты, которые нас окружают, люди, — и учим нейронную сеть их распознавать. Где-то внутри нейронная сеть выработала в себе такие признаки, которые позволяют отличить одно от другого. А дальше мы можем записать все эти признаки в виде векторов. У двух похожих изображений получатся очень близкие, почти одинаковые векторы. Так же как и для ребенка, если ему показать два разных на самом деле кубика, они для начала у него будут складываться в одно понятия кубик, так же и для нейронной сети два разных кубика будут представлять собой один и тот же вектор. Близость, которая получается между изображениями, становится семантической, а не визуальной. Из этого можно сделать поиск похожих изображений. Мы по изображению самолета будем находить самолет — в другом ракурсе, цвете. На этом можно построить поиск похожих изображений. В вектор можно сворачивать и текст. Это используется, например, в автоматическом переводе.

Как работает ИИ в голосовых помощниках

Есть множество голосовых помощников — Apple, Amazon, Google. Как работает этот, что называется, искусственный интеллект в этом голосовом помощнике? Есть следующая цепочка: прилетает на вход фраза в некий модуль, который должен определить, о чем идет речь. У него фиксированный набор сценариев, он должен понять, о каком именно сценарии идет речь. Прилетел вопрос: «Как дела?». Этот модуль должен понять, что сценарий — приветствие.

Делается это так: есть большое количество руками набитых фраз — различных типов приветствий, — а дальше есть небольшое количество шаманства, нейронная сеть, которая учится для незнакомых фраз понимать, что это тоже скорее приветствие. Дальше есть диалоговый модуль, в котором вообще нет места никаким нейронным сетям, который понимает, что если на вход было приветствие, нужно что-то ответить из заготовленного набора. Типо, сказать, что все в порядке. Дальше есть модуль, который называется генератор естественного языка, который формирует ответ. На самом деле там очень много таких руками написанных правил. Особенно это касается более сложных сценариев. Когда у нас есть какой-то диалог и нам нужно держать контекст.


Например, диалог про погоду. Нам нужно найти погоду в Москве на завтра. Пользователь спрашивает, а какая будет погода? Мы пока не очень понимаем, когда и где. Но если «будет», мы можем понимать, что завтра, но все равно не знаем где. Нам нужно задать дополнительный вопрос «Где именно?» и заполнить форму. Машине нужно обязательно заполнить форму. Есть два обязательных поля: где и когда. И она с нами ведет диалог, чтобы заполнить форму, которая нужна для получения ответа. Весь искусственный интеллект там заключен в том, чтоб из нашей речи выделить «где» и выделить «когда».


Сложнее становится, когда нужно вести диалог на свободную тему, — нужно на чем-то учиться. Попробуем учиться на диалогах в интернете — и тут начинается куча проблем. Во-первых, выясняется, что искусственная сеть, которая обучалась на диалогах в интернете, не осознает себя. Она выбирает наиболее реалистичный ответ, но на вопрос сколько тебе лет, ответ — 14 или ответ — 15 одинаково реалистичны. Это не единственная проблема. Плохо то, что обученный на разговорах из интернета искусственный интеллект напоминает подростка-фашиста.

Как было сказано ранее, для обучения нужен большой набор данных, но в интернете непонятно на чем учиться: диалоги в форумах кошмарные, диалоги в фильмах и книжках — не про то, диалоги в каких-то мессенджерах… У нас в «Яндексе» их нет, а даже те, у кого есть свои мессенджеры — на этих диалогах тоже трудно учиться, потому что непонятно когда поменялся контекст диалога. И главное, что непонятно — как решить, у тебя получается хорошо или плохо? По какому параметру автоматически понимать, разговор идет хорошо или плохо? Допустим, выпустим бот в жизнь, пускай он там со всеми общается, а мы будем как-то по результатам понимать. А как понимать? Если человек на третьей фразе ушел, это что значит? Он обиделся и ушел или он все понял и получил хороший ответ? Непонятно. Сложно выбрать хороший критерий для обучения.

Как создаются стартапы на основе нейросетей

Если читать газеты, может случится такое ощущение, что сидят в каких-то лабораториях какие-то ученые, в закрытых фирмах, или какие-то засекреченные специалисты, каждый из которых пилит каждый свой ИИ. Во-первых, никто из серьезных ученых и разработчиков не делает ИИ. Вообще. Все решают какую-то очень конкретную задачу методами математического обучения. И то, что иногда получается для решения этой конкретной задачи, начинает напоминать ИИ.

Второе: все работают вместе во всем мире. Это очень плотное информационное пространство, все знают, кто что делает, все делятся своими результатами.

Пример: Выходит научная статья — «Алгоритм переноса стиля». Когда мы берем фотографию и картины художников и делаем фотографию в стиле картин художников. Выходит такая статья с подробным описанием, с формулами, как это делается. Научная статья, которая публикуется в интернете, она в свободном доступе, все те, кто в теме, ее читают. Каждая статья не в сферическом вакууме выходит, а опирается на 25 предыдущих подобных статей на ту же тему. Но одна проблема этого алгоритма — работает медленно. Выходит следующая, которая рассказывает, как то же самое, сделать быстро. Со схемами, формулами, сравнением с предыдущей работой, ссылками на исходный код — можно взять, скачать, все у себя воспроизвести. И буквально через полгода после выхода этой статьи выходит Prisma! Про которую говорят, что они изобрели и придумали. Они не изобрели, они не придумали. Значит ли это, что они плохие? Нет. Они молодцы, так делают все. Сейчас такого хорошего «жира» в научных статьях много. Идей — навалом. Поди, возьми и сделай продукт — но сделать продукт умеют единицы. Что сделали в Prisma? Взяли алгоритм, описанный в статье, завернули его в красивый пользовательский продукт и вовремя правильным образом выпустили на рынок. Одновременно было 5 разных проектов, но про них никто не знает. Взлетела только Prisma.

Если вы читаете где-то в прессе, что компания такая-то придумала, компания такая-то изобрела… Нет! Неправильно так читать. Компания такая-то сделала, первой выпустила на рынок. Конечно, чтобы дотащить научную статью до продакшна, требуется масса инженерной работы, масса красивых штук, которые позволяют сделать так, чтоб это вообще заработало, потому что из коробки ни одна научная статья не работает, требуется мозг применить.

Мы живем в прекрасное время с безграничными возможностями — сейчас то время, когда три студента могут прочитать научную статью, сделать свой стартап и заработать много денег.

Аудиозапись выступления Крайнова можно послушать здесь.


Источник: incrussia.ru

Комментарии: