image

Одна из важнейших задач в машинном обучении — детектирование объектов (Object Detection). Недавно был опубликован ряд алгоритмов машинного обучения основанных на глубоком обучении (Deep Learning) для детектирования объектов. Эти алгоритмы занимают одно из центральных мест в практических приложениях компьютерного зрения, в частности, очень популярные сейчас самоуправляемые автомобили (Self-Driving Cars). Но все эти методы являются методами обучения с учителем, т.е. им необходим размеченный набор данных (Dataset) огромного размера. Естественно возникает желание иметь модель способную обучаться на «сырых» (неразмеченных) данных. Я попытался проанализировать существующие методы и также указать возможные пути их развития. Всех желающих милости прошу под кат, будет интересно.

Текущее состояние вопроса


Естественно, что формулировка этой задачи существует уже достаточно давно (чуть ли не с первых дней существования машинного обучения) и есть достаточное количество работ на эту тему. Вот например одна из моих любимых Spatially Invariant Unsupervised Object Detection with Convolutional Neural Networks. Если коротко, то авторы тренируют вариационный автоэнкодер (VAE), но у меня этот подход вызывает ряд вопросов.

Немного философии


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

Получается что объекты — удобное представление данных. Какими свойствами это представление должно обладать? Представление должно содержать насколько это возможно полную информацию о изображении. Т.е. имея объектное описание, мы хотим уметь восстанавливать исходное изображение с необходимой степенью точности.

Как же это выразить математически? Представим что изображение это реализация случайной величины X, а представление будет реализация случайной величины Y. В силу сказанного выше мы хотим чтобы Y содержала как можно больше информации о X. Естественным образом, для этого использовать понятие взаимной информации (Mutual Information).

Модели машинного обучения для максимума информации


Детектирование объектов можно рассматривать как генеративную модель, которой на вход подается изображение $x$, а на выходе получаем объектное представление изображения $y$.

Давайте теперь вспомним формулу для вычисления взаимной информации:

$I(x,y)=\int p(x,y) log \frac{p(x,y)}{p(x)p(y)}dxdy$


где $p(x,y)$ совместная плотность распределение, а $p(x), p(y)$ маргинальные.

Здесь я не буду углубляться почему эта формула выглядит именно так, но мы будем верить что внутренне она очень логична. Кстати исходя из описанных соображений не обязательно выбирать именно взаимную информацию, это может быть любая другая «информация», но к этому мы еще вернемся ближе к концу.

Особенно внимательные (или те кто читал книги по теории информации) уже заметили что взаимная информация есть не что иное как дивергенция Кульбака-Леблера между совместным распределением и произведением маргинальных. Здесь возникает небольшое осложнение — любой читавший хотя бы пару книжек по машинному обучению знает, что если у нас есть только сэмплы из двух распределений (т.е. мы не знаем функций распределений), то не то что оптимизировать, а даже оценить дивергенцию Кульбака-Лейблера задача весьма нетривиальная. Более того наши горячо любимые GAN и родились именно по этой причине.

К счастью нам на помощь приходит замечательная идея использовать нижнюю вариационную границу описанная в On Variational Bounds of Mutual Information. Взаимную информацию можно представить в виде:

$I(x,y)=\int p(x)dx \int p(y|x) log[q(x|y)]dxdy + \int p(y)dy \int p(x|y)log(\frac{p(x|y)}{q(x|y)}dxdy$


Или

$I(x,y)=\int p(x)dx \int p(y|x) log[q(x|y)]dxdy + KL[p(x|y)||q(x|y)]$


где $p(y|x)$ — распределение представления при заданном изображении, праметризуемая нашей нейро-сеткой и из этого распределения мы умеем семплировать, но оценивать плотность или вероятность того или иного семпла нам уметь не обязательно (что в общем то типично для многих генеративных моделей). $q(x|y)$ — некоторая функция плотности, параметризуемая второй нейро-сеткой (в самом общем случае нам понадобится 2 нейросетки, хотя в некоторых случаях они могут быть представлены 1-ой), тут уже нам обязательно уметь считать вероятности получающихся семплов.

Величина $LVB(x,y)=\int p(x)dx \int p(y|x) log[q(x|y)]dxdy$ называется нижней вариацинной границей (Lower Variational Bound).

Теперь мы можем решить приближение к нашей задаче, а именно увеличивать не саму взаимную информацию, а ее нижную вариационную границу. Если распределение $q(x|y)$ выбрано правильно, то в максимальная точка вариационной границы и взаимной информации будут совпадать, но в практическом случае (когда распределение $q(x|y)$ не может в точности представить $p(x|y)$, но состоит из достаточно большого семейства функций) будут очень близко, что нас тоже устраивает.

Если кто-то не знает как это работает советую очень внимательно разобраться с EM-алгоритмом. Здесь абсолютно аналогичный случай.

Что же здесь получается? На самом деле деле мы получили функционал для обучения автоэнкодера. Если Y это результат на выходе нейронной сети при некоторой картинке на входе, то это значит что $p(y|x) = \delta(enc(x))$, где $enc(x)$ функция трансформации нейросети. А обратное распределение аппроксимировать гауссовским, т.е $log[q(x|y)] = (x - dec(y))^2 - 2*log(sigma)$, получим:

$LVB(x,y)=\int p(x)(x-dec(enc(x)))^2dx + C$


А это классический функционал для автоэнкодера.

Автоэнкодера недостаточно


Думаю что многие уже хотят натренировать автоэнкодер и надеятся что в его скрытом слое будут нейроны которые реагируют на конкретные объекты. Вообще есть подтверждение что-то похожее и получается Building High-level Features Using Large Scale Unsupervised Learning. Но все же это абсолютно непрактично. И особо внимательные уже заметили что авторы этой статьи использовали регуляризацию — добавили слагаемое которое обеспечивает разреженность в скрытом слое, и черным по белому написали, что ничего подобного не происходит без этого слагаемого.

Достаточно ли принципа максимизации взаимной информации чтобы выучить «удобное» представление? Очевидно что нет, потому что мы можем Y выбрать равным X (т.е использовать само изображение как его представление) или любое биективное преобразование, взаимная информация обращается в бесконечность в этом случае. Больше этого значения быть не может, а как мы знаем это очень плохое представление.

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

Общая идея позаимствована у парней из Фейсбука.
Энкодер будет выглядеть так:
image
где $A$ — некоторый вектор описывающий объект, $x,y$ — координаты объекта, $sx,sy$ — масштаб объекта, $z$ — положение объекта в глубину, $p$ — вероятность того что объект присутствует.

Т.е нейросеть на вход получает картинку заранее определенного размера на которой мы хотим найти объекты и выдает массив описаний. Если мы хотим однопроходную сеть, то к сожалению этот массив придется сделать фиксированного размера. Если же хотим находить все объекты, то придется использовать реккуретные сети.

Декодер будет таким:
image

Где Object Generator — неросеть которая на вход получает вектор описания объекта и выдает $O$ — изображение (некоего стандартного размера) объекта и маску непрозрачных пикселей (opacity mask).
Compositor — получает на вход изображение всех объектов, маску, положение, масштаб, глубину и формирует выходное изображение, которое должно быть похоже на изначальное.

В чем отличие «нашего» подхода от VAE?


Кажется что мы хотим использовать автоэнкодер с той же архитектурой, что и авторы статьи Spatially Invariant Unsupervised Object Detection with Convolutional Neural Networks, так возникает вопрос в чем же разница. И там и там автоэнкодер, только во втором варианте он вариационный.

С теоретической точки зрения разница очень большая. VAE — генеративная модель и ее задача сделать 2 распределения (исходных картинок и генерируемых) максимально похожим. Вообще говоря, VAE не дает никаких гарантий что изображение сгенерированное из «описание» объекта сгенерированного из оригинального изображения хоть немного будет похоже на оригинал. Кстати об этом говорят и авторы самого VAE Auto-Encoding Variational Bayes. Так почему же это все таки работает? Я думаю что выбранная архитектура нейросетей и «описания» способствует увеличению взаимной информации изображения и «описания», но никаких математических подтверждений этой гипотезы у меня не получилось найти. Вопрос к читателям, может кто-то сможет объяснить результаты авторов — их восстановленное изображение очень похоже на оригинал, почему?

К тому же использование VAE заставляет авторов задавать распределение «описаний», а метод максимизации взаимной информации не делает никаких предположений на этот счет. Что дает нам дополнительную свободу, например, мы можем на уже обученной модели попытаться кластеризовать вектора $A$ описаний, и посмотреть — может быть такая система выучит классы объектов? Необходимо заметить, что подобная кластеризация при использовании VAE не имеет никакого смысла, например, авторы статьи используют гауссовское распределение для этих векторов.

Эксперименты


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

Поле для экспериментов здесь очень широкое. У меня в планах начать с обучения классического автоэнкодера (детерминированного отображения изображений на описания и гауссовского обратного распределения) и посмотреть что он выучивает. В первых экспериментах будет достаточным использовать композитор описанный парнями из Фейсбука, но в дальнейшем думаю будет очень интересно поиграться с различными композиторами, и возможно сделать их тоже обучаемыми. Сравнить различные регуляризаторы: без него, Sparse и т.д. Сравнить использование однопроходных (feedforward) и рекурентных моделей. Потом использовать более продвинутые модели распределений для обратного распределения, например, такую Density estimation using Real NVP. Посмотреть насколько лучше или хуже становится с более гибкими моделями. Посмотреть, что будет происходить если отображение изображений на описания сделать не детерминированным (генерировать из некоторого условного распределения). Ну и наконец, попытаться применить различные методы кластеризации к векторам описаний $A$ и понять, может ли такая система выучить классы объектов.

Ну а самое главное, очень хочется сравнить качество модели основанной на максимизации взаимной информации и модели с VAE.

Комментарии (13)


  1. TiesP
    22.08.2019 06:44

    Интересные идеи.
    Непонятен момент с вариантом, когда кол-во объектов неизвестно заранее.

    нейросеть на вход получает картинку заранее определенного размера на которой мы хотим найти объекты и выдает массив описаний

    Предположим, каждый выход описывает один объект (вектор А). Значит, кол-во выходов задаёт максимальное кол-во объектов, которое может найти сеть? (и при этом некоторые будут нулевые)
    Если же хотим находить все объекты, то придется использовать реккуретные сети

    Можете пояснить — как здесь могут использоваться рекуррентные сети? (Что будет входом для рекуррентной сети?)


    1. Yurec666 Автор
      22.08.2019 07:11

      Предположим, каждый выход описывает один объект (вектор А). Значит, кол-во выходов задаёт максимальное кол-во объектов, которое может найти сеть? (и при этом некоторые будут нулевые)

      Совершенно верно.

      Можете пояснить — как здесь могут использоваться рекуррентные сети? (Что будет входом для рекуррентной сети?)

      Это идея описана здесь Attend, Infer, Repeat: Fast Scene Understanding with Generative Models
      Если коротко, подаете на вход картинку и состояние (hidden state — изначально инициализированное нулями), на выходе будет описание и новое состояние. И так до тех пор пока сеть не скажет что это не объект.


      1. TiesP
        22.08.2019 07:34

        Если коротко, подаете на вход картинку и состояние (hidden state — изначально инициализированное нулями), на выходе будет описание и новое состояние. И так до тех пор пока сеть не скажет что это не объект

        Класс!!!
        так можно было что ли?


        1. Yurec666 Автор
          22.08.2019 08:59

          А почему нет?


  1. zhasulan
    22.08.2019 06:59

    Скажите пожалуйста, есть результаты на каких ни будь датасетах? Имеется ли paper в arxiv или где ни будь?


    1. Yurec666 Автор
      22.08.2019 07:06

      В статье я привел пример реальной работы из Фейсбука: Spatially Invariant Unsupervised Object Detection with Convolutional Neural Networks. Их исследование базируется на VAE.
      И к тому же они предоставляют исходники на github.

      Идеи про использование infomax для этой задачи у меня уже достаточно давно крутятся в голове, но к сожалению на сегодняшний день не было написано ни одной строчки кода. Мои предыдущие эксперименты были с GAN и просто физически не остается времени. Но в ближайшее время планирую начать неспеша ставить эти эксперименты.


  1. evtomax
    22.08.2019 15:25

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


  1. DesertFlow
    22.08.2019 17:15

    Я бы ещё добавил, что разбиение на объекты нужно не только чтобы восстановить сцену из объектного описания. Для чего это нужно, для экономии памяти? Объекты и связи между ними должны также помогать прогнозировать будущее меньшими ресурсами. Мозг ведь как работает? Постоянно пытается прогнозировать будущее. Если реальность не соответствует ожиданиям, мозг через систему поощрения удивляется, запоминает этот момент и корректирует связи, чтобы внутренняя модель была ближе к реальности.

    Объектное представление мира позволяет сделать это меньшими ресурсами. Воспринимая бегущего хищника как единое целое (объект), намного проще предсказать будущее, исходя из его скорости как целого объекта, чем предсказывать движение каждой его волосинки на шерсти.

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

    Но как применить такой критерий к обучению нейросети, не очень понятно. Критерия выживаемости ведь нет… Пытаться восстановить сцену из объектного описания, как предлагается в статье, а основные объекты выделять за счёт ограниченного бутылочного горлышка (размерности латентного слоя в автоэнкодере, например) — это хороший подход. Но он ближе к статистическому, чем к человеческому. То есть, таким способом будут выявлены объекты и зависимости, которые проще всего выявить и сохранить в бутылочном горлышке — самые крупные и часто встречаемые случаи. Например, сегментация тупо по текстурам. А человек все же делает это исходя из точности прогноза будущего, причем сортировка важности объектов делается по привязке к выживанию. Можно ли что-то делать с этими объектами и могут ли они как-то повлиять на нас. С другой стороны, неизвестно насколько это важно. Может, на физическом уровне там действительно бутылочное горлышко и все (точнее я минимизация энергии в ее роли).


    1. Yurec666 Автор
      22.08.2019 19:18

      точнее я минимизация энергии в ее роли

      Физики уже давно знают что любая физическая система стремится к состоянию равновесия (динамическому или статическому), а любое состояние равновесия — это минимум потенциальной энергии (в динамическом случае — ее мат.ожидания). Так что мы все минимизация какой-то энергии.

      Я бы ещё добавил, что разбиение на объекты нужно не только чтобы восстановить сцену из объектного описания. Для чего это нужно, для экономии памяти? Объекты и связи между ними должны также помогать прогнозировать будущее меньшими ресурсами.

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


  1. Yurec666 Автор
    22.08.2019 19:16

    точнее я минимизация энергии в ее роли

    Физики уже давно знают что любая физическая система стремится к состоянию равновесия (динамическому или статическому), а любое состояние равновесия — это минимум потенциальной энергии (в динамическом случае — ее мат.ожидания). Так что мы все минимизация какой-то энергии.

    Я бы ещё добавил, что разбиение на объекты нужно не только чтобы восстановить сцену из объектного описания. Для чего это нужно, для экономии памяти? Объекты и связи между ними должны также помогать прогнозировать будущее меньшими ресурсами.

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


  1. Yurec666 Автор
    22.08.2019 19:19

    Если кому-то интересно, я могу немного более подробно рассмотреть вопрос «зачем на нужны описания» в следующих статьях.


    1. Gryphon88
      23.08.2019 13:18

      Пожалуйста.


  1. AnZh18
    23.08.2019 17:46

    Спасибо за интересную статью! Мы недавно опубликовали работу о salient region discovery с подходом, который, кажется, довольно близок к описанному в «Spatially Invariant Unsupervised Object Detection with Convolutional Neural Networks», но я как-то умудрился упустить эту статью из вида.