0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: генеративные состязательные сети, machine learning, нейронные сети, дискриминатор, предобучение дискриминатора, гудфеллоу, функция потерь для генератора, функции потерь дискриминатора, стабилизация обучения, переполнение экспонент, логистический сигмоид, активация выходного слоя, float, -log(σ(x)), -log(1-σ(x)), deep learning</p>
1
<p>Теги: генеративные состязательные сети, machine learning, нейронные сети, дискриминатор, предобучение дискриминатора, гудфеллоу, функция потерь для генератора, функции потерь дискриминатора, стабилизация обучения, переполнение экспонент, логистический сигмоид, активация выходного слоя, float, -log(σ(x)), -log(1-σ(x)), deep learning</p>
2
<p>В<a>первом посте</a>я в общих чертах рассказал о том, что такое генеративные состязательные сети. Идея заставить соревноваться две нейронные сети выглядит очень просто и красиво, однако при реализации для конкретных задач обязательно возникают трудности. В этот раз я расскажу о том, как немножко изменить функции потерь так, чтобы стабилизировать процесс обучения.</p>
2
<p>В<a>первом посте</a>я в общих чертах рассказал о том, что такое генеративные состязательные сети. Идея заставить соревноваться две нейронные сети выглядит очень просто и красиво, однако при реализации для конкретных задач обязательно возникают трудности. В этот раз я расскажу о том, как немножко изменить функции потерь так, чтобы стабилизировать процесс обучения.</p>
3
<h2>Предобучение Дискриминатора</h2>
3
<h2>Предобучение Дискриминатора</h2>
4
<p>Функция потерь для Генератора имеет вид: Однако на первых порах Дискриминатору достаточно просто отличить реальные данные от сгенерированных. Более того, некоторые авторы рекомендуют предобучать Дискриминатор так, чтобы он изначально имел некоторое представление о данных. Это приводит к тому, что значения функции потерь быстро становятся нулевыми, что препятствует градиентному спуску и обучению Генератора.</p>
4
<p>Функция потерь для Генератора имеет вид: Однако на первых порах Дискриминатору достаточно просто отличить реальные данные от сгенерированных. Более того, некоторые авторы рекомендуют предобучать Дискриминатор так, чтобы он изначально имел некоторое представление о данных. Это приводит к тому, что значения функции потерь быстро становятся нулевыми, что препятствует градиентному спуску и обучению Генератора.</p>
5
<p>Поэтому уже сам Гудфеллоу в своей статье рекомендует заменять - функцию с экстремумами в тех же точках, однако "насыщающуюся", только если Дискриминатор начинает безоговорочно верить Генератору (чего на практике, конечно, не должно происходить).</p>
5
<p>Поэтому уже сам Гудфеллоу в своей статье рекомендует заменять - функцию с экстремумами в тех же точках, однако "насыщающуюся", только если Дискриминатор начинает безоговорочно верить Генератору (чего на практике, конечно, не должно происходить).</p>
6
<h2>Переполнение экспонент</h2>
6
<h2>Переполнение экспонент</h2>
7
<p>Пожалуй, ещё более важный трюк, относящийся не только к GAN’ам, связан с переполнением экспонент. Для задач классификации типичной функцией активации выходного слоя является логистический сигмоид: При вычислении этой функции достаточно относительно небольших отрицательных значений<strong>"x"</strong>для того, чтобы вылететь за пределы<strong>float</strong>. В связи с этим логистическую функцию потерь часто переписывают следующим образом. В исходном виде она распадается на сумму двух логарифмов: Где<strong>"x"</strong>- активации последнего слоя сети.</p>
7
<p>Пожалуй, ещё более важный трюк, относящийся не только к GAN’ам, связан с переполнением экспонент. Для задач классификации типичной функцией активации выходного слоя является логистический сигмоид: При вычислении этой функции достаточно относительно небольших отрицательных значений<strong>"x"</strong>для того, чтобы вылететь за пределы<strong>float</strong>. В связи с этим логистическую функцию потерь часто переписывают следующим образом. В исходном виде она распадается на сумму двух логарифмов: Где<strong>"x"</strong>- активации последнего слоя сети.</p>
8
<h2>Рассмотрим их по отдельности:</h2>
8
<h2>Рассмотрим их по отдельности:</h2>
9
<p>то есть, Если для положительных значений<strong>"x"</strong>мы сможем вычислять левую часть этого равенства, а для отрицательных - правую вместо исходного логарифма от сигмоиды, то проблема с переполнением экспоненты отпадёт. Оказывается, не так сложно это записать в одну формулу: После всех проделанных нами преобразований легко проверить, что эта формула и есть<strong>-log(σ(x))</strong>, а для<strong>-log(1-σ(x))</strong>аналогичную формулу вывести вы можете сами, однако ответ я вам сразу скажу: Теперь мы можем легко переписать функцию потерь Дискриминатора: Где<em>xg</em>и<em>xd</em>обозначают соответственно сгенерированные примеры и примеры из обучающей выборки.</p>
9
<p>то есть, Если для положительных значений<strong>"x"</strong>мы сможем вычислять левую часть этого равенства, а для отрицательных - правую вместо исходного логарифма от сигмоиды, то проблема с переполнением экспоненты отпадёт. Оказывается, не так сложно это записать в одну формулу: После всех проделанных нами преобразований легко проверить, что эта формула и есть<strong>-log(σ(x))</strong>, а для<strong>-log(1-σ(x))</strong>аналогичную формулу вывести вы можете сами, однако ответ я вам сразу скажу: Теперь мы можем легко переписать функцию потерь Дискриминатора: Где<em>xg</em>и<em>xd</em>обозначают соответственно сгенерированные примеры и примеры из обучающей выборки.</p>
10
<p>В следующий раз я расскажу вам про то, как кучи земли могут помочь в обучении Генератора.</p>
10
<p>В следующий раз я расскажу вам про то, как кучи земли могут помочь в обучении Генератора.</p>
11
<p><em>Остались вопросы? Напишите в комментариях!</em></p>
11
<p><em>Остались вопросы? Напишите в комментариях!</em></p>
12
12