Могли бы вы пояснить вот этот переход?
«Но во-первых заметим что выражение под логарифмом не зависит от 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;
}
Я вас поправляю: 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 — изначально инициализированное нулями), на выходе будет описание и новое состояние. И так до тех пор пока сеть не скажет что это не объект.
Идеи про использование 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 — хайповая статья, вышедшая на прошлой неделе.
Не видел, обязательно гляну. Спасибо:)
В любом случае спасибо за дополнения и критику — это всегда полезно.
Все очень просто: под логарифмом стоит p(x), который не зависит от z. Но вводя латентную переменную z мы можем написать p(x) = q(z)*q(z|x) / q(x|z). Очевидно, что хотя z и есть в выражении, но выражение от z не зависит.
В общем то это стандартная нотация. К ней необходимо немного привыкнуть, тогда читается без проблем.
Я никак не могу понять как человек с 1 годом опыта в индустрии может иметь приставку Сеньор?
Проходить собеседования это отдельный навык. К сожалению он ничего общего с умением делать работу не имеет. Автор и говорит проходите собеседования регулярно — во- первых не потеряете этот навык, а во-вторых будете знать свою цену на рынке труда. А то зарыться головой в песок конечно удобно, но уж очень много от этого теряется. Н
Автор, поздравляю с успешным начинанием. А на комментарии не обращайте внимания — они просто завидуют.
И кстати, сколько вы уже программируете? Я насчитал как минимум 3 года — вы уже самый настоящий программист!!!
Именно неопределенное поведение, т.е может как модифицировать объект, а может и access violation получить. Тут уж как повезет.
Например, такой код
компилируется (и msvc и GCC компиляторами) и печатает 3 а не 5.
А вот такой:
просто крешится с access violation.
К сожалению это не совсем так, есть ведь const_cast. Разработчики стандарта давно говорят что это очень плохой механизм, но убрать его нельзя потому что половину кода придеться редезайнить
Просто резануло глаза. Применяется очень часто.
Физики уже давно знают что любая физическая система стремится к состоянию равновесия (динамическому или статическому), а любое состояние равновесия — это минимум потенциальной энергии (в динамическом случае — ее мат.ожидания). Так что мы все минимизация какой-то энергии.
Все верно. Только вы сами написали «прогнозировать будущее меньшими ресурсами», а это тоже самое что «экономии памяти». Все равно все сходится на «экономии». Потому что для прогнозирования будущего нам не надо никакого описания — имея достаточно гибкие модели и большой датасет это можно делать на пиксельном уровне. Достаточно построить и обучить модель совместной плотности всех переменных (пикселей изображения или пикселей всех изображений во временном ряду если мы говорим о будущем). Вот только проблема — такую модель построить очень сложно (если вообще возможно), да и датасетов у нас таких нет. Вот для этого и необходимо описание — мы надеемся что распределение описаний будет иметь намного более простую структуру. Т.е мы хотим выиграть в двух моментах: 1) использовать более простые модели, что сразу снижает вычислительную сложность и требования к размеру датасета, 2) уменьшить диспресию монте-карло оценок градиента, что автоматически приводит к более высокому качеству предсказаний и более быстрому обучению.
Физики уже давно знают что любая физическая система стремится к состоянию равновесия (динамическому или статическому), а любое состояние равновесия — это минимум потенциальной энергии (в динамическом случае — ее мат.ожидания). Так что мы все минимизация какой-то энергии.
Все верно. Только вы сами написали «прогнозировать будущее меньшими ресурсами», а это тоже самое что «экономии памяти». Все равно все сходится на «экономии». Потому что для прогнозирования будущего нам не надо никакого описания — имея достаточно гибкие модели и большой датасет это можно делать на пиксельном уровне. Достаточно построить и обучить модель совместной плотности всех переменных (пикселей изображения или пикселей всех изображений во временном ряду если мы говорим о будущем). Вот только проблема — такую модель построить очень сложно (если вообще возможно), да и датасетов у нас таких нет. Вот для этого и необходимо описание — мы надеемся что распределение описаний будет иметь намного более простую структуру. Т.е мы хотим выиграть в двух моментах: 1) использовать более простые модели, что сразу снижает вычислительную сложность и требования к размеру датасета, 2) уменьшить диспресию монте-карло оценок градиента, что автоматически приводит к более высокому качеству предсказаний и более быстрому обучению.
А почему нет?
Совершенно верно.
Это идея описана здесь Attend, Infer, Repeat: Fast Scene Understanding with Generative Models
Если коротко, подаете на вход картинку и состояние (hidden state — изначально инициализированное нулями), на выходе будет описание и новое состояние. И так до тех пор пока сеть не скажет что это не объект.
И к тому же они предоставляют исходники на github.
Идеи про использование infomax для этой задачи у меня уже достаточно давно крутятся в голове, но к сожалению на сегодняшний день не было написано ни одной строчки кода. Мои предыдущие эксперименты были с GAN и просто физически не остается времени. Но в ближайшее время планирую начать неспеша ставить эти эксперименты.
Действительно это так. Но мое личное ощущение, что большинство авторов пытаются что-то улучшить не ответив на самый главный вопрос: «а вообще имеет ли смысл то что мы пытаемся обучать?».
Поэтому я привел именно эти статьи как пример. В них авторы ставят интересные вопросы — а что находится «под капотом»?
Они прелагают закрыть глаза на детали процедуры обучения и рассмотреть векторные поля которым следовали бы генератор и дискриминатор если бы мы использовали Simultaneous Gradient Descent.
Ведь в конце концов именно эти векторные поля определяют «характер» обучения. Они же приводят доказательство устойчивости при определенных условиях.
Если честно, некоторые предположения меня не очень устраивают — например «в точке равновесия дискриминатор должен выдавать постоянное значение».
А что если он выдает «почти» постоянное значение. Как сильно это влияет и т.д.
И собственно наличие точки равновесия остается большим вопросом. Я не говорю что ее нет, но ответ тут не очевиден и требует изучения.
Доказать наличие точки равновесия получается только для линейных дискриминатора и генератора.
Это отличная работа. И авторы тоже ставят вопросы сходимости и устойчивости точек равновесия.
Опять же это хорошо согласуется со взглядом на двумерные поля.
Можно показать что в большинстве (кроме Wassertein GAN) увеличение learning rate дискриминатора сдвигает действительные части собственных чисел матрицы Якоби влево.
Т.е делает сходимость к точке равновесия быстрее. Изначально планировал поговорить в статье об этом, просто не хотелось делать статью слишком большой.
Я не пытался сделать обзор самых лучших способов регуляризации Wassertein GAN.
Прочитав впервые статью о Wasserstein GAN. У меня возник вопрос зачем вообще 1-Липшицевость (ну кроме того чтобы наш objective был метрикой Васерштейна).
И естественно без этой регуляризации обучить не получается. Почему? Ответ дают двумерные траектории — в этом случае они окружности, соответственно напрашивается вывод: этот тип GAN без регуляризации вообще работать не будет.
В этой статье я не пытаюсь улучшить что-то или сделать обзор самых последних достижений.
Хотел лишь донести свой взгляд на вопрос (абсолютно не факт что он правильный).
Единственное что новое (по-крайней мере нигде не встречал ранее) — это попытка посмотреть не на градиент функционалов по параметрам сети, а на по-точечное поведение подинтегральной функции (вариационная производная).
Мне кажется что эта позиция проливает свет на некоторые вопросы в обучении GAN.
Например, не получается обучить GAN, что менять: функционал, структуру нейросети, алгоритм обучения и тд?
Здесь мы сразу видим ответ: Функционалы дают «хорошие» векторные поля, поэтому зачастую проблемы с параметризацией сети и алгоритмом обучения (например мы переобучаем дискриминатор на каждой итерации).
Также эта позиция показывает почему работают различние техники регуляризации GAN.
Не видел, обязательно гляну. Спасибо:)
В любом случае спасибо за дополнения и критику — это всегда полезно.