Всем привет, меня зовут Александр Гончар. Я занимаюсь исследованиями и внедрением машинного обучения для анализа биосигналов в Mawi Solutions, исследованиями на пересечении quantitative finance и машинного обучения в University of Verona и консультирую компании несложно догадаться относительно чего. Также веду популярный блог на Medium, выступаю на конференциях и митапах в Украине, Италии и других странах.
В этой статье речь пойдет о том, как искусственный интеллект не просто решает задачи на уровне людей или лучше, а как научить его понимать окружающий мир так же, как его понимают люди, а не какими-то абстрактными «векторами». Самое сложное в этом челлендже — заставить алгоритм делать это без подсказок от человека вообще. Детали — под катом.
Все есть вектор
Большая часть приложений машинного обучения, которые мы знаем, разработаны с помощью алгоритмов, которые обучаются с учителем. Это значит, что они учатся с помощью пар данных: входных (изображения, звуки, тексты) и выходных (что на этих самых звуках, текстах и картинках изображено). В последнее время успешнее всего с такими задачами справляются нейронные сети — за счет того, что они могут преобразовывать входы в выходы с помощью длинных цепочек операций (по факту просто умножений матриц с нелинейными преобразованиями), где цепочка символизирует иерархию составляющих входного объекта. Я думаю, что даже те, кто не знакомы с машинным обучением, видели такую вот картинку:
То есть после «ковыряния» в уже обученных нейронках (в данном случае convolutional neural nets), которые показывают хорошую точность, мы смогли понять, что они уже выучивают признаки, очень похожие на те, что выучивает зрительная система в нашем мозгу:
По факту, на каждом слое у нас есть разные представления картинок — и все они математически описываются какими-то векторами (или другими структурами, но чаще всего это все же векторы). Если по каким-то причинам у нас вместо пары вход-выход есть только вход (так называемые неразмеченные данные), то мы все равно можем обучить нейросеть находить эти представления — с помощью автоэкодеров или генеративных состязательных сетей. Более того, принято считать, что генеративные модели лучше подходят для описания данных per se. Все-таки не зря Ричард Фейнман как-то сказал: «То, что я не могу создать, я не могу понять». Пока что нам достаточно того, что любые объекты с помощью нейронных сетей можно упаковать в вектора, по которым в принципе можно определять соответствующие им свойства. Но это не всегда было так.
Все есть формула
Давайте сделаем шаг назад (а точнее лет 50) и посмотрим, как математики раньше описывали входные данные. Можно даже вернуться на пару сотен назад и вспомнить то, как Ньютон и компания создавали основы классической механики. Что такое известная формула S = V * T ? По сути, это описание процесса движения, которое было основано на наблюдении каких-то данных. Чем не машинное обучение? Разве что без выборки с координатами объектов в разные моменты времени в .csv, конечно.
В нашем всеми любимом computer vision тоже долгое время рулили математические модели. Например, чтобы границы объектов на изображении можно описать математической моделью свертки с вполне конкретными параметрами ядра свертки:
Про финансовый мир я вообще молчу. Он полон моделей, которые описывают процессы, например, движения цен, от самых примитивных, как геометрического броуновского движения, где есть только два параметра (дрифт и волатильность) до более сложных, как jump diffusion, где у нас помимо дрифта и волатильности еще есть вероятность прыжка цены, размер и стандартное отклонение последнего. На графике ниже понятно, что вторая модель чуть более реалистична (хоть и была придумана в 1972, а сейчас все еще намного более сложно):
Слева — примеры реализации геометрического броуновского движения, справа — jump diffusion process
В конце концов, математики тоже описывают мир векторами. Окей, для точности скажем, что они описывают его формулами, но формула — это всего лишь каркас, обобщенная модель процесса (точно так же, как и архитектура сетки — это только каркас «мозга»). Главное — это параметры в формуле, которые мы для простоты «склеим» в вектор и скажем, что именно ими мы описываем какой-то конкретный объект. Вот только почему-то тут каждый элемент вектора прозрачен, понятен и позволяет делать выводы как о математической модели, так и о самом процессе, который он моделирует. А если мы хотим заняться «машинным обучением» по таким векторам? Да вообще без проблем — обучить линейную, экспоненциальную или любую нелинейную модель по примерам с вот такими вот векторами — одно удовольствие, ведь это дает в итоге абсолютно понятную коробочку, поведение которой можно объяснить даже человеку, очень далекому от математики. Плюс не забываем Фейнмана: из одних только параметров можно создать абсолютно новый объект с желаемыми свойствами.
«Развязанные векторы»
Но главное преимущество машинного обучения в том, что никаких формул придумывать не нужно! Как же тогда совместить гибкость нейронных сетей и «понятность» и доступность математических моделей? Если за основу «понятности» взять свойство каждого отдельного элемента вектора описывать одно единственное свойство входного объекта, то такой входной вектор называется disentangled representation. Entangled вектора, в свою очередь, имеют элементы, которые «связаны» — меняя один элемент, мы меняем сразу несколько свойств объекта. Проще всего этот концепт иллюстрируется на такой картинке:
Котик теперь преобразовывается не просто в вектор, которым можно распознать его породу (конечно же, непонятно как, но зато с точностью 99%), а еще и понять основные свойства. А теперь представьте, что ваша любимая нейронка (даже не важно, supervised или unsupervised) умеет выучивать такое — каждый элемент вектора отвечает за свое единственное уникальное свойство. Что это нам дает?
- Интерпретируемость модели — можно четко понять, что есть что на объекте.
- Уменьшение количества размеченных данных — чтобы распознать породы котов, разметить нужно будет буквально парочку с каждой.
- Ультимативные генеративные свойства — можно манипулировать свойствами, как мы хотим (покрасить котика в белый цвет).
- Перенос свойств на другие объекты и процессы — обучились на видео с играми котов — поймем и движения тигрят, скорее всего.
- Получение новых знаний — а что, если можно найти какие-то новые свойства, о которых мы раньше и не думали?
И что, кто-то такое уже делает?
На самом деле, этой сложной задачей занимаются уже не одно десятилетие, и только последние пару лет получается сделать что-то более-менее годное. Типичные датасеты, которые используются для тестирования таких алгоритмов должны содержать в себе разные свойства, Например, это может быть датасет с движениями физического объекта в разные стороны, с изменением своей формы и цвета. Тогда мы должны выучить модель, которая закодирует эти свойства, и мы сможем менять только одно из них, манипулируя соответствующим элементом в векторе. Это также могут быть лица, которые можно делать более похожими на мужчину или женщину, более или менее улыбающимися или крутить их в разные стороны. Или объекты мебели. Или кадры компьютерных игр. Вариантов очень много. Я, например, работаю с данными элекрокардиограмм и финансовыми временным рядами.
Алгоритмов тоже немало. Есть хаки, использующие такой себе meta-supervised подход, который использует информацию о свойствах при обучении, например InfoGAN, IB-GANили из последних успешных — TL-GAN. Работает очень неплохо, смотрите сами:
Но что, если мы априори ничего не знаем о свойствах и есть просто большой датасет? В последнее время погоду в этом направлении делают вариационные автоэнкодеры от DeepMind. Только посмотрите, как они выучивают свойства в сравнении с другими алгоритмами:
Повороты лиц. Image Source
В reinforcement learning. Image Source
А теперь главный вопрос. Если раньше математикам приходилось по крупицам составлять сложнейшие математические модели, чтобы учесть все свойства объектов или процессов, а вот такие вот алгоритмы уже скоро будут выучивать их сами по себе, нужно ли будет математическое моделирование как таковое вообще? Детальнее об этой теме я расскажу на конференции Data Science UA, которая пройдет 16 марта.
Что дальше
Это все, конечно, круто, но стоит ли этим заниматься конкретно вам? Машинное обучение только начинает внедряться в бизнесы, и клиент пока что чаще всего платит за точности на отложенной выборке / в продакшне и за сэкономленные время или деньги в результате автоматизации процессов. Ну или за хайп и полученные продажи / инвестиции :) Но как только машинное обучение станет обыденностью — кто-то должен поддерживать эти решения.
Переобучать сетки под новые данные (а как вы сейчас будете адаптировать ваши «умные» вектора под видео с разных камер и разного качества? Собирать терабайты данных и тратить месяцы?). Уменьшать количество данных, нужных для обучения (а это время и деньги). Фиксить ошибки (париться с векторами). Интерпретировать результаты (снова париться с векторами). Делать отчеты (расскажете клиенту в МинОбороны «ну... это... ResNet сам все танки врагов в векторах выучил!»). А ведь еще можно изобретать новые лекарства, материалы и открывать новые знания. Создавать предметы искусства или фейковые видео. Отвечать за жизни людей (в медицинских или военных проектах) или большие суммы денег (банки, фонды). Выбор за нами.