ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.11.2023
Просмотров: 133
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Взрывающиеся градиенты
Противоположная проблема, когда градиенты резко увеличиваются, может быть не менее неприятной. Чтобы проиллюстрировать это немного лучше, мы рисуем 100 гауссовских случайных матриц и умножаем их на некоторую исходную матрицу. Для выбранного масштаба (выбор дисперсии σ2 = 1) матричное произведение взрывается. Когда это происходит из-за инициализации глубокой сети, у нас нет шансов заставить оптимизатор градиентного спуска сойтись.
M = np.random.normal(size=(4, 4))
print('a single matrix', M)
for i in range(100):
M = np.dot(M, np.random.normal(size=(4, 4)))
print('after multiplying 100 matrices', M)
a single matrix [[ 2.2122064 1.1630787 0.7740038 0.4838046 ]
[ 1.0434405 0.29956347 1.1839255 0.15302546]
[ 1.8917114 -1.1688148 -1.2347414 1.5580711 ]
[-1.771029 -0.5459446 -0.45138445 -2.3556297 ]]
after multiplying 100 matrices
[[ 3.4459714e+23 -7.8040680e+23 5.9973287e+23 4.5229990e+23]
[ 2.5275089e+23 -5.7240326e+23 4.3988473e+23 3.3174740e+23]
[ 1.3731286e+24 -3.1097155e+24 2.3897773e+24 1.8022959e+24]
[-4.4951040e+23 1.0180033e+24 -7.8232281e+23 -5.9000354e+23]]
Нарушение симметрии
Еще одна проблема при проектировании нейронных сетей - это симметрия, присущая их параметризации.
Предположим, что у нас есть простой MLP с одним скрытым слоем и двумя модулями. В этом случае мы могли бы переставить веса W(1) первого слоя и аналогичным образом переставить веса выходного слоя, чтобы получить ту же функцию. Нет ничего особенного в том, чтобы различать первый скрытый блок от второго скрытого блока. Другими словами, у нас есть симметрия перестановок среди скрытых единиц каждого слоя. Это больше, чем просто теоретическая неприятность. Рассмотрим вышеупомянутый MLP с одним скрытым слоем и двумя скрытыми блоками. Для иллюстрации предположим, что выходной слой преобразует два скрытых блока только в один выходной блок. Представьте, что произойдет, если мы инициализируем все параметры скрытого слоя как W (1) = c для некоторой константы c. В этом случае во время прямого распространения любой скрытый блок принимает те же входные данные и параметры, производя ту же активацию, которая подается на выходной блок. Во время обратного распространения ошибки дифференцирование выходного блока по параметрам W (1) дает градиент, все элементы которого принимают одно и то же значение. Таким образом, после итерации на основе градиента (например, стохастический градиентный спуск мини-пакета) все элементы W (1) по-прежнему принимают одинаковое значение. Такие итерации никогда не нарушат симметрию сами по себе, и мы, возможно, никогда не сможем понять выразительную силу сети. Скрытый слой будет вести себя так, как если бы он состоял только из одного элемента. Обратите внимание, что, хотя стохастический градиентный спуск мини-пакета не нарушит эту симметрию, регуляризация выпадения будет!
-
Инициализация параметров
Одним из способов решения - или, по крайней мере, смягчения - проблем, поднятых выше, является тщательная инициализация. Дополнительная осторожность во время оптимизации и подходящая регуляризация могут еще больше повысить стабильность.
Инициализация по умолчанию
В предыдущих разделах, например, в разделе 3.3, мы использовали нормальное распределение для инициализации значений наших весов. Если мы не укажем метод инициализации, фреймворк будет использовать метод случайной инициализации по умолчанию, который часто хорошо работает на практике для задач среднего размера.
Ксавье инициализация
Давайте посмотрим на распределение масштаба вывода (например, скрытой переменной) oi для некоторого полностью подключенного слоя без нелинейностей. С девятью входными данными xj и их соответствующими весами wij для этого слоя выход определяется как
oi = Σnin j= 1 wijxj. (5.8.3)
Все веса wij выводятся независимо от одного и того же распределения. Кроме того, предположим, что это распределение имеет нулевое среднее значение и дисперсию σ2. Обратите внимание, что это не означает, что распределение должно быть гауссовым, просто должны существовать среднее значение и дисперсия. А пока предположим, что входы в слой xj также имеют нулевое среднее значение и дисперсию γ2 и что они не зависят от wij и друг от друга. В этом случае мы можем вычислить среднее значение и дисперсию oi следующим образом:
E [oi] = ∑ninj = 1 E [wijxj] =Σninj = 1 E [wij] E [xj] = 0,
Var [oi] = E [o2i] - (E [oi]) 2 =Σninj = 1Е [w2ijx2j] - 0
= Σninj = 1Е [w2ij] E [x2j] = ninσ2γ2, (5.8.4)
Один из способов сохранить фиксированную дисперсию - установить ninσ2 = 1. Теперь рассмотрим обратное распространение. Здесь мы сталкиваемся с аналогичной проблемой, хотя градиенты распространяются от слоев ближе к выходу. Используя те же рассуждения, что и для прямого распространения, мы видим, что дисперсия градиентов может увеличиваться, если только noutσ2 = 1, где nout - количество выходов этого слоя. Это ставит нас перед дилеммой: мы не можем одновременно удовлетворить оба условия. Вместо этого мы просто пытаемся удовлетворить:
½ (nin + nout) σ2 = 1 или эквивалентно σ = √2/nin + nout, (5.8.5)
Это рассуждение, лежащее в основе теперь стандартной и практически полезной инициализации Xavier, названной в честь первого автора его создателей (Glorot & Bengio, 2010). Как правило, инициализация Ксавье выбирает веса из гауссовского распределения с нулевым средним и дисперсией σ2 = 2/ nin + nout. Мы можем также адаптировать интуицию Ксавье для выбора дисперсии при выборке весов из равномерного распределения. Отметим, что равномерное распределение U (−a, a) имеет дисперсию a2/3. Подключение a2/3 в наше условие на σ2 предлагает инициализацию в соответствии с
U(-√6/(nin + nout),√6/(nin + nout)), (5.8.6)
Хотя предположение об отсутствии нелинейностей в приведенных выше математических рассуждениях может быть легко нарушено в нейронных сетях, на практике оказывается, что метод инициализации Xavier хорошо работает.
Beyond
Приведенные выше рассуждения едва ли касаются поверхности современных подходов к инициализации параметров. Фреймворк глубокого обучения часто реализует более десятка различных эвристик. Более того, инициализация параметров продолжает оставаться горячей областью фундаментальных исследований в области глубокого обучения.
Среди них эвристика, специализированная для связанных (общих) параметров, сверхвысокого разрешения, моделей последовательностей и других ситуаций. Например, Xiao et al. продемонстрировали возможность обучения 10000-слойных нейронных сетей без хитрости с использованием тщательно продуманного метода инициализации (Xiao et al., 2018).
Если эта тема вас интересует, мы предлагаем глубоко погрузиться в предложения этого модуля, прочитать статьи, в которых предлагается и проанализировать каждую эвристику, а затем изучить последние публикации по этой теме.
Возможно, вы наткнетесь или даже придумаете умную идею и внесете свой вклад в реализацию фреймворков глубокого обучения.
Резюме
-
Исчезающие и растущие градиенты - распространенные проблемы в глубоких сетях. Требуется большая осторожность при инициализации параметров, чтобы гарантировать, что градиенты и параметры остаются хорошо управляемыми. -
Эвристика инициализации необходима, чтобы гарантировать, что начальные градиенты не будут ни слишком большими, ни слишком маленькими. -
Функции активации ReLU смягчают проблему исчезающего градиента. Это может ускорить конвергенцию. -
Случайная инициализация - ключ к нарушению симметрии перед оптимизацией. -
Инициализация Xavier предполагает, что для каждого слоя на дисперсию любого выхода не влияет количество входов, а на дисперсию любого градиента не влияет количество выходов.
Упражнения
-
Можете ли вы разработать другие случаи, когда нейронная сеть могла бы демонстрировать симметрию, требующую нарушения помимо симметрии перестановки в слоях MLP? -
Можем ли мы инициализировать все весовые параметры в линейной регрессии или в регрессии softmax для такого же значения? -
Найдите аналитические оценки собственных значений произведения двух матриц. Что это говорит вам об обеспечении хорошей обработки градиентов? -
Если мы знаем, что некоторые термины расходятся, можем ли мы исправить это постфактум? Для вдохновения посмотрите статью о послойном адаптивном масштабировании скорости (You et al., 2017).
Обсуждение (см. https://discuss.d2l.ai/t/103)
-
Изменение среды и распределения
В предыдущих разделах мы работали с рядом практических приложений машинного обучения, подгоняя модели к различным наборам данных. И все же мы никогда не останавливались, чтобы задуматься о том, откуда в первую очередь берутся данные, или о том, что мы планируем в конечном итоге делать с результатами наших моделей. Слишком часто разработчики машинного обучения, владеющие данными, спешат разработать модели, не останавливаясь на рассмотрении этих фундаментальных проблем.
Многие неудачные развертывания машинного обучения можно проследить до этого шаблона. Иногда кажется, что модели превосходно работают, если судить по точности набора тестов, но катастрофически терпят неудачу при развертывании, когда распределение данных внезапно меняется. Что еще более коварно, иногда само развертывание модели может быть катализатором, нарушающим распределение данных. Скажем, например, мы обучили модель предсказывать, кто выплатит ссуду, а кто не приведет к дефолту по кредиту, обнаружив, что выбор обуви кандидатом был связан с риском дефолта (оксфорды указывают на погашение кредита, а кроссовки на дефолт). В дальнейшем мы должны быть склонны предоставлять ссуды всем заявителям, носящим оксфорды, и отказывать всем заявителям, кто носит кроссовки.
В этом случае наш необдуманный переход от распознавания образов к принятию решений и наша неспособность критически рассмотреть окружающую среду могут иметь катастрофические последствия. Во-первых, как только мы начинаем принимать решения на основе обуви
, покупатели улавливают и изменяют свое поведение. Вскоре все кандидаты будут носить оксфорды без какого-либо улучшения кредитоспособности. Найдите минутку, чтобы переварить это, потому что подобные проблемы встречаются во многих приложениях машинного обучения: вводя наши решения, основанные на модели, в среду, мы можем сломать модель.
Хотя мы не можем полностью рассмотреть эти темы в одном разделе, мы стремимся выявить некоторые общие проблемы и стимулировать критическое мышление, необходимое для раннего обнаружения таких ситуаций, уменьшения ущерба и ответственного использования машинного обучения. Некоторые решения просты (запросите «правильные» данные), некоторые технически сложны (реализовать систему обучения с подкреплением), а другие требуют, чтобы мы вообще вышли за рамки статистического прогнозирования и взялись за сложные философские вопросы, касающиеся этического применение алгоритмов.
-
Типы сдвига распределения
Для начала мы придерживаемся настройки пассивного прогнозирования, учитывая различные способы изменения распределения данных и того, что можно сделать для восстановления производительности модели. В одной классической установке мы предполагаем, что наши обучающие данные были взяты из некоторого распределения pS (x, y), но наши тестовые данные будут состоять из немаркированных примеров, взятых из некоторого другого распределения pT (x, y). Мы уже должны противостоять отрезвляющей реальности. При отсутствии каких-либо предположений о том, как pS и pT связаны друг с другом, изучение надежного классификатора невозможно.
Рассмотрим задачу бинарной классификации, в которой мы хотим различать собак и кошек.
Если распределение может изменяться произвольным образом, то наша установка допускает патологический случай, в котором распределение по входам остается постоянным: pS (x) = pT (x), но все метки меняются местами: pS (y | x) = 1 - pT (y | x). Другими словами, если Бог может внезапно решить, что в будущем все «кошки» теперь являются собаками, а то, что мы раньше называли «собаками», теперь стали кошками - без каких-либо изменений в распределении входных данных p (x), тогда мы не сможем различить эта настройка из той, в которой раздача вообще не менялась.
К счастью, при некоторых ограниченных предположениях о том, как наши данные могут измениться в будущем, принципиальные алгоритмы могут обнаруживать сдвиг и иногда даже адаптироваться на лету, повышая точность исходного классификатора.