Как стать автором
Обновить
7
0

Инжинер

Отправить сообщение
Могли бы вы пояснить вот этот переход?
«Но во-первых заметим что выражение под логарифмом не зависит от z, значит можно взять математическое ожидание от логарифма по z от любого распределения и это не изменит значения функции и под знаком логарифма умножить и поделить на это же распределение».
И само q(z), и произведение q(z)*q(x|z), оба зависят от z, поэтому как вы их поставили под интеграл по dz — неясно.

Все очень просто: под логарифмом стоит p(x), который не зависит от z. Но вводя латентную переменную z мы можем написать p(x) = q(z)*q(z|x) / q(x|z). Очевидно, что хотя z и есть в выражении, но выражение от z не зависит.

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

В общем то это стандартная нотация. К ней необходимо немного привыкнуть, тогда читается без проблем.
сумма которую называет компания обычно на 30% ниже той, которую они готовы платить, поэтому все же неплохо иметь представление «сколько ты стоишь» и в случае если работу менять не горит можно смело называть + 15-20% выше — иногда работодатели соглашаются))))
Вы только забываете что люди делающие научный прогресс каждый день кушают, а сколько труда потрачено чтобы вырастить теже помидоры они тоже не догадываются)))))
У вас появился шанс стать специалистом намного лучше чем вы были. Без собеседований этого шанса просто не было бы.
Шел январь 2017 года. На тот момент у меня было чуть больше года трудового стажа и работал я в Сан-Франциско в компании TrueAccord как Sr. Data Scientist

Я никак не могу понять как человек с 1 годом опыта в индустрии может иметь приставку Сеньор?

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

Имею опыт общения с программистами проработавшими в гос компаниях 10+ лет. Не хочу обобщать на всех, но то что я видел — у них развиты скилы характерные для госкомпаний — умение ничего не делать, а вот с программистскими навыками там все очень печально. Так что плюсую автора на все 100 — если вы хотите стать хорошим специалистом востребованным на рынке труда (и это не деньги) не ходите туда

Автор, поздравляю с успешным начинанием. А на комментарии не обращайте внимания — они просто завидуют.
И кстати, сколько вы уже программируете? Я насчитал как минимум 3 года — вы уже самый настоящий программист!!!

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

Именно неопределенное поведение, т.е может как модифицировать объект, а может и access violation получить. Тут уж как повезет.

Например, такой код
struct A
{
	int a;

	A() { a = 5; }
};

const A a;

int main()
{
	const_cast<A&>(a).a = 3;
	std::cout << a.a;
	return 0;
}

компилируется (и msvc и GCC компиляторами) и печатает 3 а не 5.

А вот такой:
const int c = 5;

int main()
{
	const_cast<int&>(c) = 3;
	std::cout << c << std::endl;
	return 0;
}

просто крешится с access violation.
Я вас поправляю: const верхнего уровня (т.е. примененный непосредственно к объекту, а не к пути доступа) является гарантией того, что объект не может меняться
.
К сожалению это не совсем так, есть ведь const_cast. Разработчики стандарта давно говорят что это очень плохой механизм, но убрать его нельзя потому что половину кода придеться редезайнить
Автор, учите матчасть.

void foo(int *p)
{
  // Needs to do more copying of data
}

void foo(const int *p)
{
  // Doesn't need defensive copies
}

int main()
{
  const int x = 42;
  // const-ness affects which overload gets called
  foo(&x);
  return 0;
}

С одной стороны, я не думаю, что на практике это часто применяется в С++-коде.

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

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

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

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

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

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

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

А почему нет?

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

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

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

Это идея описана здесь Attend, Infer, Repeat: Fast Scene Understanding with Generative Models
Если коротко, подаете на вход картинку и состояние (hidden state — изначально инициализированное нулями), на выходе будет описание и новое состояние. И так до тех пор пока сеть не скажет что это не объект.
В статье я привел пример реальной работы из Фейсбука: Spatially Invariant Unsupervised Object Detection with Convolutional Neural Networks. Их исследование базируется на VAE.
И к тому же они предоставляют исходники на github.

Идеи про использование infomax для этой задачи у меня уже достаточно давно крутятся в голове, но к сожалению на сегодняшний день не было написано ни одной строчки кода. Мои предыдущие эксперименты были с GAN и просто физически не остается времени. Но в ближайшее время планирую начать неспеша ставить эти эксперименты.
По меркам нашей отрасли, середина 2017 года — это давно. :) С тех пор вышло немало новых работ. К сожалению, «серебряную пулю» пока не нашли.

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

TTUR — доклад на ICLR 2018, но тоже вышел давненько. Примечателен теоремой с условиями сходимости GAN.

Это отличная работа. И авторы тоже ставят вопросы сходимости и устойчивости точек равновесия.
Опять же это хорошо согласуется со взглядом на двумерные поля.
Можно показать что в большинстве (кроме Wassertein GAN) увеличение learning rate дискриминатора сдвигает действительные части собственных чисел матрицы Якоби влево.
Т.е делает сходимость к точке равновесия быстрее. Изначально планировал поговорить в статье об этом, просто не хотелось делать статью слишком большой.

WGAN-GP — это Wasserstein GAN с т.н. gradient penalty...

Я не пытался сделать обзор самых лучших способов регуляризации Wassertein GAN.
Прочитав впервые статью о Wasserstein GAN. У меня возник вопрос зачем вообще 1-Липшицевость (ну кроме того чтобы наш objective был метрикой Васерштейна).
И естественно без этой регуляризации обучить не получается. Почему? Ответ дают двумерные траектории — в этом случае они окружности, соответственно напрашивается вывод: этот тип GAN без регуляризации вообще работать не будет.

В этой статье я не пытаюсь улучшить что-то или сделать обзор самых последних достижений.
Хотел лишь донести свой взгляд на вопрос (абсолютно не факт что он правильный).
Единственное что новое (по-крайней мере нигде не встречал ранее) — это попытка посмотреть не на градиент функционалов по параметрам сети, а на по-точечное поведение подинтегральной функции (вариационная производная).
Мне кажется что эта позиция проливает свет на некоторые вопросы в обучении GAN.
Например, не получается обучить GAN, что менять: функционал, структуру нейросети, алгоритм обучения и тд?
Здесь мы сразу видим ответ: Функционалы дают «хорошие» векторные поля, поэтому зачастую проблемы с параметризацией сети и алгоритмом обучения (например мы переобучаем дискриминатор на каждой итерации).
Также эта позиция показывает почему работают различние техники регуляризации GAN.

The relativistic discriminator: a key element missing from standard GAN — хайповая статья, вышедшая на прошлой неделе.

Не видел, обязательно гляну. Спасибо:)

В любом случае спасибо за дополнения и критику — это всегда полезно.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность