HTML Diff
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