Машинное обучение и нейронные сети - страница 50

 

Требования к глубокому обучению (DL 02)




Требования к глубокому обучению (DL 02)

Чтобы преуспеть в курсе глубокого обучения, вам нужен опыт в области компьютерных наук и математики. В частности, вы должны были пройти курсы по структурам данных, линейной алгебре и многомерному исчислению. Давайте рассмотрим важность каждого из этих предварительных условий более подробно.

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

В этом курсе в моих видео в основном используется псевдокод или математические вычисления. Однако задания потребуют программирования как на Python, так и на Julia. Python широко используется для библиотек глубокого обучения, таких как TensorFlow и PyTorch, поэтому вы попрактикуетесь с этими инструментами. Джулия, с другой стороны, отлично подходит для преодоления разрыва между математикой и вычислениями, облегчая понимание внутренней работы нейронных сетей.

С математической точки зрения мы будем использовать концепции линейной алгебры и исчисления многих переменных. Однако конкретные концепции, на которых мы сосредоточимся, — это лишь малая часть того, что обычно преподается на этих курсах. Если вы прошли только один из этих курсов, вы сможете относительно быстро освоить необходимые концепции из другого.

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

Многомерное исчисление имеет решающее значение для понимания градиентов — ключевой концепции, используемой на протяжении всего курса. Вам должно быть удобно оценивать градиенты и брать частные производные, используя правила, изученные в базовом исчислении, такие как правило произведения и правило частного.

Если вы не уверены в своих знаниях в области линейной алгебры или многомерного исчисления, я предоставлю плейлист видео Гранта Сандерсона, чтобы помочь вам освежить в памяти эти темы. Выделенные видео в списке воспроизведения охватывают определенные понятия, которые мы будем использовать в курсе.

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

 

Что может вычислить один нейрон? (ДЛ 03)



Что может вычислить один нейрон? (ДЛ 03)

Нейронные сети состоят из множества узлов с огромным количеством соединений. Чтобы лучше их понять, давайте сосредоточимся на отдельном нейроне и изучим его возможности, типы моделей, которые он может представлять, и способы обучения этих моделей.

Узел в нейронной сети получает входные данные и выполняет простые вычисления для создания числового вывода. Это вычисление включает два этапа: сначала входные данные умножаются на соответствующие веса и суммируются; затем сумма взвешенных входных данных проходит через функцию активации для получения выходных данных.

Математически результат получается путем применения функции активации (обозначенной как f) к сумме взвешенных входных данных. Следовательно, выходные данные являются результатом применения функции активации к сумме каждого веса, умноженного на соответствующий входной сигнал, плюс член смещения.

Смещение позволяет сумме быть отличной от нуля, даже если все входные данные равны нулю. Мы можем думать о смещении как о другом весе и представить его дополнительной стрелкой, входящей в узел. Каждый нейрон выполняет взвешенную сумму своих входных данных, но разные нейроны могут иметь разные функции активации.

Для модели с одним нейроном две функции активации, заслуживающие внимания, представляют собой линейную и ступенчатую функции. Линейная функция активации позволяет нейрону выполнять регрессию, а ступенчатая функция позволяет выполнять классификацию.

В случае нейрона с одним входом взвешенная сумма входов вычисляется путем умножения входа на вес и добавления смещения. Выбранная линейная функция активации, y = x, позволяет нам выразить любую линейную функцию x1, используя параметры веса (w1) и смещения (b). Таким образом, этот нейрон может вычислять любую линейную функцию с одномерным входом (x1) и одномерным выходом (y).

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

В случае нейрона с двумя входами в качестве активации используется ступенчатая функция. Взвешенная сумма входов по-прежнему рассчитывается, и активация переходит от нуля к единице, когда сумма становится положительной. Активация может быть описана с использованием кусочной функции, а граница решения между входными данными, приводящими к 0 или 1 выходному сигналу, находится там, где взвешенная сумма входных данных равна нулю. Эта установка подходит для задач классификации, где входные данные помечены как 0 или 1 в зависимости от выходных данных нейрона.

Чтобы выполнить регрессию или классификацию с использованием отдельных нейронов, нам нужен набор данных, состоящий из пар ввода-вывода. Выбранная функция активации зависит от того, является ли выход двоичным (0 или 1) или непрерывным. Размерность входных примеров определяет количество входных данных и весов в модели с одним нейроном.

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

Цель обучения — обновить параметры (веса и смещения) таким образом, чтобы минимизировать потери и повысить точность модели. Градиентный спуск — это распространенный метод оптимизации, используемый для обновления параметров и уменьшения потерь.

В следующем видео мы углубимся в концепцию градиентного спуска и то, как он облегчает обновление параметров для повышения производительности модели.

 

Как тренировать свой нейрон (DL 04)



Как тренировать свой нейрон (DL 04)

В нашем предыдущем видео мы исследовали вычисление одного нейрона. Мы узнали, что нейрон вычисляет, беря взвешенную сумму входных данных, добавляя смещение и применяя функцию активации. Использование ступенчатой функции для активации дает нам бинарный классификатор, а линейная функция дает нам регрессор.

Мы также обсудили измерение потерь модели в ее наборе данных с использованием суммы квадратов ошибок и обучение модели с использованием градиента функции потерь. Функция потерь зависит от параметров модели, а именно весов и смещения. Среднеквадратическая ошибка обычно используется в качестве функции потерь в вычислениях.

Чтобы понять, как функция потерь зависит от параметров и как мы можем изменить их, чтобы уменьшить потери, мы рассчитали потери на небольшом наборе данных регрессии. Суммируя квадраты разностей между правильным и предсказанным выходами, мы получили значение потерь.

Затем мы сосредоточились на поиске градиента функции потерь. Мы получили частные производные потерь по каждому параметру. Эти частные производные образуют градиент, который помогает нам уменьшить потери. Обновляя параметры в направлении, противоположном градиенту, мы можем минимизировать потери и улучшить представление нашей модели набора данных.

Мы визуализировали функцию потерь как поверхность в пространстве параметров и обсудили, как градиент указывает направление наибольшего увеличения потерь. Делая небольшие шаги в направлении, противоположном градиенту, мы можем итеративно уменьшать потери и улучшать нашу модель.

Для задач классификации мы столкнулись с проблемой при взятии производной активации ступенчатой функции. Чтобы преодолеть это, мы заменили ступенчатую функцию гладкой аппроксимацией, называемой сигмовидной функцией. Мы объяснили поведение сигмовидной функции и ее способность давать вероятностные результаты от 0 до 1.

Мы применили сигмовидную функцию к примеру классификации и продемонстрировали, как рассчитать потери и градиент, используя новую активацию. Процесс обновления параметров и улучшения модели остается таким же, как и при регрессии.

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

В целом, понимание вычисления одного нейрона, функции потерь и градиента обеспечивает основу для обучения нейронных сетей и повышения их производительности.

 

Конвейер анализа данных (DL 05)



Конвейер анализа данных (DL 05)

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

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

Разные проблемы требуют разных этапов конвейера. Хотя стандартизированные или смоделированные наборы данных могут позволить нам пропустить определенные этапы, реальные приложения глубокого обучения требуют от нас рассмотрения практических аспектов анализа данных.

Давайте обсудим некоторые важные аспекты пайплайнов анализа данных более подробно. Первый этап – сбор данных. Хотя в некоторых случаях можно использовать уже существующие наборы данных, если мы хотим решить новую проблему с помощью глубокого обучения, мы должны определить, какие данные подходят для обучения нашей модели. При сборе данных нам необходимо убедиться, что у нас их достаточно, учитывая, что недавние успехи глубокого обучения основывались на больших наборах данных. Однако бывает и так, что данных слишком много, особенно когда вычислительные ресурсы ограничены. В некоторых случаях может быть полезно работать с ограниченным объемом данных, особенно во время исследования и обнаружения проблем. Крайне важно убедиться, что набор данных, который мы используем для обучения, представляет проблему, которую мы стремимся решить. Это включает в себя рассмотрение таких факторов, как представление всех желаемых классов в задаче классификации, и не упускание из виду важных выбросов, которые должна распознавать модель.

Еще одной проблемой является выявление систематических ошибок в наборах данных. Смещения могут возникать по-разному, например, чрезмерное представление изображений, сделанных в солнечные дни, что приводит к трудностям для классификатора изображений в облачных условиях. Предубеждения также могут влиять на прогнозы, связанные со здоровьем или образованием, связывая отдельные факторы с более широкими социальными структурами. При сборе данных важно помнить о возможных погрешностях. Однако устранение и исправление предубеждений — сложная проблема, требующая постоянных исследований в области глубокого обучения.

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

Затем мы должны преобразовать данные в числовой формат, подходящий для обучения нашей нейронной сети или модели машинного обучения. Нейронные сети ожидают ввода числовых данных в виде векторов или матриц. Процесс числового кодирования различается по сложности в зависимости от проблемы. Например, обработка данных изображения является относительно простой благодаря представлению на основе пикселей, которое уже используется компьютерами. Однако для обработки текстовых данных, закодированных в формате ASCII, требуются альтернативные представления. Преобразование представления данных или даже размерности становится все более важным по мере усложнения задач.

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

После того, как мы обработали данные и обучили нашу нейронную сеть, мы можем перейти к этапу оценки и настройки. Здесь мы оцениваем производительность нашей модели и вносим улучшения. Оценка включает использование тестового набора, который мы отложили ранее. Применяя обученную нейронную сеть к этим невидимым данным, мы можем измерить, насколько хорошо она обобщает новые примеры. Обычно мы используем такие показатели, как точность, достоверность, полнота и оценка F1, чтобы оценить производительность нашей модели. Эти показатели дают представление о том, насколько эффективно нейронная сеть делает прогнозы.

На основе результатов оценки мы можем определить области, в которых модель может работать неэффективно или иметь ограничения. Эта информация поможет нам внести необходимые коррективы и улучшения. Мы можем повторять архитектуру модели, гиперпараметры или даже собирать дополнительные данные, если это необходимо. Цель состоит в том, чтобы улучшить производительность модели и обеспечить достижение желаемой точности и надежности.

В процессе настройки мы экспериментируем с различными конфигурациями и настройками, чтобы оптимизировать производительность модели. Это включает в себя настройку гиперпараметров, таких как скорость обучения, размер партии и методы регуляризации. Путем систематических исследований и экспериментов мы стремимся найти наилучшее сочетание настроек, которое максимизирует эффективность нейронной сети.

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

Как специалисты по глубокому обучению, наша ответственность выходит за рамки разработки точных моделей. Мы должны критически анализировать и интерпретировать результаты, принимая во внимание любые возможные отклонения или ограничения. Регулярный пересмотр и переоценка производительности модели необходимы для поддержания ее эффективности с течением времени.

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

 

Проверка вне выборки (DL 06)



Проверка вне выборки (DL 06)

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

Процесс выбора модели начинается с определения доступных вариантов решения данной проблемы. Это приводит нас к понятию пространства гипотез модели, которое определяет типы функций, которые может представлять модель. Пространство гипотез ограничено такими факторами, как выбранное представление входных данных и требуемый тип выходных данных.

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

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

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

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

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

Ключевая идея машинного обучения заключается в экспериментальной проверке наших моделей путем разделения обучающих и тестовых данных. Это позволяет нам оценивать их производительность на невидимых примерах и принимать обоснованные решения о выборе модели и настройке гиперпараметров.

 

Нейронные сети с прямой связью (DL 07)



Нейронные сети с прямой связью (DL 07)

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

Например, нейрон 8 в сети получает входные данные от нейронов 5, 6 и 7. Взвешенная сумма входных данных, выполненных нейроном 8, представляет собой сумму активаций этих нейронов, умноженных на соответствующие веса, плюс смещение. Затем к взвешенной сумме применяется функция активации. Выход нейрона 8 используется в качестве входа для узлов 11 и 12. В нейронной сети могут использоваться различные функции активации, такие как гиперболический тангенс и линейная единица выпрямления (ReLU).

Чтобы выполнить вычисления с использованием нейронной сети для создания прогнозов, мы начинаем с установки активаций узлов входного слоя на основе входных данных. Узлы входного слоя просто хранят значения входного вектора. Размер входного и выходного слоев зависит от размерности данных и желаемого прогноза. Скрытые нейроны в сети, организованные в слои, выполняют вычисления между входами и выходами. Вычислив активации для каждого слоя, мы можем передать входные данные следующему слою, ссылаясь на предыдущие активации. Эти активации также необходимы для градиентного спуска во время обновления веса. Наличие скрытых слоев в нейронной сети обеспечивает возможность использования нелинейных функций активации. Линейные активации не дают никаких преимуществ в многоуровневых сетях. Нелинейные функции активации, такие как сигмовидная функция, позволяют представлять различные функции.

Нейроны, представляющие логические операции, такие как И, ИЛИ и НЕ, могут быть построены с использованием классификаторов ступенчатых функций. Аппроксимируя эти логические операции с помощью сигмовидных активаций, нейронная сеть может представлять любую булеву функцию. Для обучения нейронной сети мы используем градиентный спуск для обновления весов и смещений. Параметры сети включают все веса и смещения во всей сети. Функция потерь в сети с несколькими выходными нейронами может представлять собой среднеквадратичную ошибку, суммированную по всем выходным нейронам. Цель состоит в том, чтобы уменьшить потери путем итеративного обновления параметров.

Градиентный спуск выполняется путем вычисления градиентов потерь по отношению к параметрам с выполнением шагов в направлении, противоположном градиентам, для минимизации потерь. Этот процесс известен как обратное распространение, и он позволяет сети учиться и улучшать свои прогнозы. В следующем видео мы углубимся в детали алгоритма обратного распространения, который используется для выполнения обновлений градиентного спуска в нейронной сети. Обратное распространение позволяет эффективно вычислять градиенты потерь по отношению к параметрам сети.

Процесс начинается с вычисления градиента функции потерь по отношению к выходным активациям. Этот градиент представляет собой чувствительность потерь к изменениям выходных активаций. Его можно получить, применив цепное правило, так как потери зависят от выходных активаций через функцию активации и квадрат разницы с целевыми значениями. Как только градиент потерь по отношению к выходным активациям вычислен, он распространяется обратно по сети. На каждом уровне градиенты умножаются на производную функции активации по взвешенной сумме входных данных. Эта производная отражает чувствительность активации к изменениям взвешенной суммы.

Распространяя градиенты назад, мы можем вычислить градиенты потерь по отношению к активациям предыдущего слоя. Эти градиенты показывают, насколько каждая активация в предыдущем слое способствует потере. Используя градиенты потерь по отношению к активациям, мы можем затем вычислить градиенты потерь по отношению к весам и смещениям в каждом слое. Эти градиенты получаются путем умножения активации предыдущего слоя на соответствующий градиент функции активации. Наконец, с градиентами потерь по параметрам мы можем обновить веса и смещения, используя алгоритм градиентного спуска. Делая шаги в направлении, противоположном градиентам, мы постепенно оптимизируем параметры сети, чтобы минимизировать потери.

Этот итеративный процесс прямого распространения, обратного распространения и обновления параметров повторяется в течение определенного количества эпох или до тех пор, пока потери не сойдутся к удовлетворительному значению. Благодаря этому процессу обучения нейронная сеть учится делать более точные прогнозы, корректируя свои веса и смещения на основе предоставленных данных обучения.

Нейронные сети используют несколько уровней и нелинейные функции активации для выполнения сложных вычислений и прогнозирования. Используя алгоритм обратного распространения ошибки и градиентный спуск, нейронные сети могут учиться на данных и оптимизировать свои параметры, чтобы улучшить свои прогностические возможности.

 

Обратное распространение нейронной сети (DL 08)



Обратное распространение нейронной сети (DL 08)

В этом видео мы выведем алгоритм обратного распространения ошибки, который используется для обучения нейронной сети на этапе стохастического градиентного спуска. Алгоритм состоит из трех основных шагов.

Во-первых, мы выполняем проход с прямой связью, чтобы делать прогнозы для точки данных. Эти прогнозы определяют потери, которые представляют собой ошибку между прогнозируемыми выходными данными и фактическими выходными данными. Затем мы выполняем обратный проход для вычисления частных производных потерь. Мы вычисляем величину, называемую «дельта», для каждого нейрона в выходном и скрытом слоях. Дельта представляет собой частную производную потерь по взвешенной сумме входов на этом нейроне. Применяя цепное правило, мы можем вычислить дельту для каждого нейрона, учитывая его влияние на потери.

Для вычисления дельты для нейронов выходного слоя мы используем производную функции активации и разность между мишенью и активацией. Этот расчет учитывает взаимосвязь между потерями и взвешенной суммой входов. Для нейронов скрытого слоя мы рассматриваем их влияние на нейроны следующего слоя и рекурсивно вычисляем дельту, суммируя вклады от узлов следующего слоя, умноженные на веса и производную активации. Как только мы вычислили дельты для всех нейронов, мы можем использовать их для вычисления частных производных весов и смещений.

Частная производная для каждого веса является произведением соответствующей дельты и активации нейрона предыдущего слоя. Точно так же частная производная для каждого смещения равна соответствующей дельте.

Чтобы выполнить градиентный спуск, мы усредняем частные производные по подмножеству точек данных, называемому пакетом. Этот подход известен как стохастический градиентный спуск. Обновляя веса и смещения с помощью средних частных производных, умноженных на скорость обучения, мы перемещаем параметры в направлении, которое минимизирует потери.

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

Алгоритм обратного распространения объединяет прямые и обратные проходы для вычисления дельт и частных производных, которые затем используются для обновлений стохастического градиентного спуска. Итеративно обновляя параметры, нейронная сеть учится минимизировать потери и улучшать свои прогнозы.

 

Лучшая активация и потеря для классификации: Softmax и категориальная кроссэнтропия (DL 09)



Лучшая активация и потеря для классификации: Softmax и категориальная кроссэнтропия (DL 09)

При выполнении мультиклассовой классификации с использованием нейронной сети с сигмовидными нейронами возникают определенные ограничения. Раньше, имея дело только с двумя классами, один нейрон мог выводить либо 0, либо 1. Однако, когда используется несколько меток, например, при классификации рукописных цифр от 0 до 9, требуется другое представление.

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

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

Аналогичная проблема, известная как проблема исчезающего градиента, также возникает при использовании сигмовидных активаций для скрытых нейронов. Однако в этом видео мы сосредоточимся на альтернативной комбинации активаций выхода и функции потерь для решения этих проблем. Вместо сигмовидных активаций мы вводим активации softmax для выходного слоя. Активации Softmax вычисляются для всего слоя, увеличивая различия между входными данными и нормализуя активации до единицы. Это приводит к выходным данным, которые более интерпретируются как прогнозы и могут рассматриваться как уверенность сети в каждой возможной метке.

Чтобы эффективно использовать активации softmax, мы сочетаем их с категориальной функцией кросс-энтропийных потерь. Перекрестная потеря энтропии вычисляет отрицательный логарифм активации для целевого нейрона, который упрощается до логарифма активации при использовании однократных векторов. Эта комбинация обеспечивает эффективные обновления градиентного спуска. Чтобы вычислить дельты для выходного слоя, мы выводим частные производные потерь по активациям. Для целевого нейрона производная равна -1, деленной на активацию. Для остальных нейронов производные равны нулю. Из-за взаимозависимости активаций softmax, хотя только целевой нейрон имеет ненулевую производную, ненулевые дельты получаются для всех входных данных.

Используя эти формулы, мы можем вычислить дельты как для целевого нейрона, так и для других нейронов в выходном слое. Дельту для целевого нейрона вычислить просто, так как это активация минус единица. Дельты для других нейронов упрощаются до самой отрицательной активации.

С помощью этой комбинации активаций softmax и категориальной кросс-энтропийной потери мы достигаем значимых результатов для задач классификации и получаем градиенты, которые эффективно подталкивают результаты к правильным прогнозам. Использование активаций softmax и категориальной кросс-энтропийной потери дает нам мощную основу для многоклассовой классификации. Давайте углубимся в то, как эти компоненты работают вместе, чтобы обеспечить эффективное обучение нейронных сетей.

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

Путем обратного распространения дельт по сети можно также вычислить градиенты весов в скрытых слоях. Это позволяет нам соответствующим образом обновлять веса в скрытых слоях, дополнительно повышая производительность сети. Важно отметить, что при использовании активаций softmax и категориальной потери кросс-энтропии нам необходимо убедиться, что softmax применяется только к выходному слою. Для скрытых слоев рекомендуется использовать функции активации, такие как ReLU (Rectified Linear Unit) или tanh. Активации Softmax позволяют нам получать выходные данные, которые можно интерпретировать как вероятности или оценки достоверности для каждого класса. Значения в выходном векторе в сумме равны 1, что позволяет нам оценить уверенность сети в своих прогнозах. Более высокое значение указывает на более высокую достоверность для определенного класса.

Категориальная кросс-энтропийная потеря дополняет активацию softmax, эффективно измеряя несоответствие между предсказанными вероятностями и истинными метками. Это побуждает сеть минимизировать разницу между прогнозируемыми вероятностями и целевым вектором с горячим кодированием, тем самым подталкивая сеть к более точным прогнозам.

Комбинируя активацию softmax и категориальную потерю кросс-энтропии, мы получаем несколько преимуществ. Мы получаем осмысленные и интерпретируемые результаты, что позволяет нам понять прогнозы сети и уровни достоверности для различных классов. Градиенты, полученные из категориальной кросс-энтропийной потери, направляют обновления весов таким образом, что это приводит к более эффективному обучению и повышению точности. Стоит отметить, что существуют другие доступные функции активации и функции потерь, каждая из которых подходит для разных типов проблем. Тем не менее, активация softmax с категориальной кросс-энтропийной потерей оказалась успешной комбинацией для задач классификации нескольких классов, предлагая как интерпретируемость, так и эффективную динамику обучения.

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

 

Ускорение нейронных сетей с помощью векторизации (DL 10)



Ускорение нейронных сетей с помощью векторизации (DL 10)

Чтобы понять внутреннюю работу нейронной сети, полезно углубиться в уровень отдельного нейрона и рассмотреть связи между нейронами. Во время прямого прохода, который вычисляет активации, и обратного прохода, который вычисляет дельты, мышление в терминах узлов и ребер может помочь построить интуицию. Однако на самом деле глубокое обучение не работает таким образом. Чтобы построить крупномасштабные нейронные сети, которые можно эффективно обучать, нам нужно перейти на более высокий уровень абстракции и мыслить с точки зрения векторов, матриц и тензоров.

Первым шагом к этому более высокому уровню абстракции является представление активаций слоя в виде вектора. Если наша нейронная сеть организована в слои, мы можем собрать активации слоя в вектор. Например, вектор A^l хранит все активации для слоя l с количеством записей, равным количеству узлов в этом слое. Точно так же мы можем собирать дельты для слоя в вектор во время обратного распространения. Мы также можем использовать векторы для представления смещений или входных данных слоя.

Чтобы выразить вычисления в этой векторизованной нотации, давайте сначала рассмотрим, как узел вычисляет свою взвешенную сумму входных данных. Вход X ^ 5, который входит в функцию активации для узла 5, рассчитывается как взвешенная сумма активаций предыдущего слоя плюс смещение. Собирая активации предыдущего слоя в вектор A ^ K и имея вектор весов, поступающий в узел 5, взвешенную сумму входов можно представить как скалярное произведение между этими двумя векторами. Другой способ записать скалярное произведение — транспонировать первый вектор и выполнить матричное умножение между вектором-строкой и вектором-столбцом. Таким образом, мы можем выразить ввод в узел 5 как вектор веса, поступающий в узел 5 (транспонированный), умноженный на вектор активации для предыдущего слоя, плюс смещение узла 5.

Эта векторизованная запись может пойти дальше и позволить нам вычислить весь вектор входных данных для слоя l сразу. Комбинируя вектор-строку весов для узла 5 с векторами-строками весов для других нейронов в этом слое, мы получаем матрицу, содержащую все веса от слоя K до слоя l. Эта весовая матрица имеет столько строк, сколько узлов в слое l (каждая строка представляет вектор весов в один из нейронов слоя l), и столько столбцов, сколько узлов в предыдущем слое K (каждый столбец представляет вектор веса, выходящие из одного из узлов слоя K). Умножение этой весовой матрицы на вектор активации для слоя K приводит к вектору, в котором каждый элемент представляет собой взвешенную сумму входных данных для одного из узлов слоя l. Чтобы получить входные данные функции активации, мы добавляем смещения к этому вектору, которые были собраны в вектор.

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

Двигаясь вперед, мы можем распространить этот векторизованный подход и на обратный проход. Вместо того, чтобы рассматривать один нейрон за раз, мы можем вычислить дельту для узла в слое K как взвешенную сумму всех дельт в следующем слое, умноженную на производную функции активации этого узла. Опять же, мы можем выразить эту взвешенную сумму как скалярный продукт. Умножая вектор-строку весов, выходящих из узла 3, на вектор дельт для слоя l, а затем умножая на производную активации, мы можем вычислить дельта-вектор для слоя K. Используя матрицу весов, которая собирает все веса для слоя l нейронов и умножая его на вектор дельт для слоя l, можно получить матрицу, размеры которой совпадают с матрицей весов.

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

Когда мы представляем вычисления нашей нейронной сети с помощью матриц, мы можем выполнять прямой проход, обратный проход и обновление веса высокоэффективным и распараллеленным способом. Напомним основные шаги:

  1. Прямой проход: мы можем вычислить активации каждого слоя для всего пакета данных, выполнив умножение матрицы на вектор и поэлементное применение функции активации. Организовав активации в матрицу, где каждый столбец представляет активации для разных точек данных, мы можем эффективно рассчитать активации для всей партии.

  2. Обратный проход: Точно так же мы можем вычислить дельты (градиенты ошибок) для каждого слоя векторизованным способом. Представляя дельты в виде матрицы, где каждый столбец соответствует дельтам для определенной точки данных, мы можем выполнять умножение матрицы на вектор и поэлементное умножение с производными активации, чтобы эффективно вычислить дельты для всей партии.

  3. Обновления весов. Чтобы обновить веса и смещения, мы можем использовать матричные операции для вычисления скалярного произведения между матрицей дельт и транспонированием матрицы весов. Эта операция дает матрицу обновлений веса, где каждая запись представляет собой обновление для определенного веса. Разделив точечные продукты на размер пакета, мы получаем среднее обновление, а затем можем обновить веса, вычитая скорость обучения, умноженную на среднее обновление. Обновления смещения вычисляются путем взятия среднего значения дельта-векторов по столбцам и вычитания скорости обучения, умноженной на среднее значение, из смещения.

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

Стоит отметить, что, хотя в тексте представлен общий обзор векторизации и использования матричных операций, фактические детали реализации могут различаться в зависимости от используемого языка программирования или инфраструктуры. Различные языки и платформы могут иметь свои собственные оптимизированные функции и библиотеки для матричных операций, что еще больше повышает производительность.

Помимо преимуществ в производительности, использование матричных операций в глубоком обучении имеет и другие преимущества:

  1. Простота и читабельность кода. Благодаря использованию матричных операций код для вычислений нейронной сети становится более кратким и понятным. Вместо написания явных циклов для отдельных точек данных мы можем выразить вычисления в более компактной и интуитивно понятной форме, используя матричные операции.

  2. Программная совместимость. Многие популярные платформы и библиотеки глубокого обучения, такие как TensorFlow и PyTorch, обеспечивают эффективную реализацию матричных операций. Эти платформы часто используют оптимизированные библиотеки линейной алгебры, такие как BLAS (базовые подпрограммы линейной алгебры) или cuBLAS (базовые подпрограммы линейной алгебры CUDA), для ускорения матричных вычислений на ЦП или ГП. Используя эти фреймворки, мы можем извлечь выгоду из их оптимизированных реализаций и обеспечить совместимость с другими компонентами конвейера глубокого обучения.

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

  4. Интеграция с аппаратным ускорением. Специализированное оборудование, такое как графические процессоры или тензорные процессоры (TPU), предназначено для ускорения матричных вычислений. Эти аппаратные ускорители превосходно выполняют крупномасштабные параллельные матричные операции, что делает их идеальными для рабочих нагрузок глубокого обучения. Используя матричные операции, мы можем легко интегрироваться с этими аппаратными ускорителями и в полной мере использовать их возможности, что приводит к значительному ускорению обучения и времени вывода.

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

 

Исчезающие (или взрывающиеся) градиенты (DL 11)



Исчезающие (или взрывающиеся) градиенты (DL 11)

По мере того, как мы углубляемся в масштабирование нейронных сетей для решения более крупных задач, становится необходимым добавлять больше слоев. Однако более глубокие сети могут столкнуться с проблемами во время обучения, вызванными исчезновением или взрывом градиентов. Рассмотрим глубокую нейронную сеть с сигмовидными активациями для скрытых слоев. Визуализация такой сети с многочисленными узлами и слоями становится непрактичной. Вместо этого мы можем представить его в виде блок-схемы, где каждый столбец представляет слой, а функции активации указаны внутри каждого блока.

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

Выражая вычисления математически, мы умножаем матрицы весов на входные матрицы, добавляем смещения и применяем функции активации. Выражения продолжаются через скрытые слои, в конечном итоге достигая выходного слоя, где применяется активация softmax. Выходные активации и цели используются для расчета потерь.

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

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

Глубокое обучение столкнулось с трудностями при обучении глубоких нейронных сетей из-за проблемы исчезающего градиента. Однако около десяти лет назад были разработаны подходы для решения этой проблемы. Один из методов состоит в том, чтобы изменить инициализацию матрицы весов, генерируя большие начальные случайные веса, чтобы противодействовать уменьшающимся дельтам, вызванным сигмовидными производными.

Самый значительный прорыв произошел с принятием линейных выпрямителей (ReLU) в качестве функций активации. В отличие от сигмовидных производных, производные ReLU не имеют тенденции к значительному уменьшению дельты. Это свойство сделало активации ReLU более популярными, поскольку они облегчили обучение глубоких нейронных сетей.

Однако использование активаций ReLU создает риск взрыва градиентов, когда дельты могут увеличиваться по мере распространения назад. Чтобы смягчить это, рекомендуется выбирать меньшие начальные веса по сравнению с сигмовидными активациями.

Нейроны ReLU предпочтительны для скрытых слоев из-за простоты их обучения и вычислительной эффективности. Инициализация весов зависит от используемой функции активации, и сообщество глубокого обучения добилось существенного прогресса в определении подходящих методов инициализации весов для различных типов активации. Современные библиотеки глубокого обучения часто автоматически обрабатывают инициализацию веса на основе указанных активаций.

Причина обращения: