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

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

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

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

  1. Инициализация. Процесс обучения начинается с инициализации весов и смещений для каждого нейрона. Эти значения обычно инициализируются небольшими случайными числами.
  2. Прямое распространение. Нейронная сеть берет входные данные и выполняет серию вычислений для получения выходных данных. Каждый вход умножается на соответствующий вес, а затем эти произведения суммируются вместе со смещением. Это значение передается через функцию активации для получения выходных данных каждого нейрона. Этот процесс повторяется на каждом уровне сети до тех пор, пока не будет получен результат.
  3. Расчет убытков. Получив результат, нам нужно посмотреть, насколько он хорош. Это делается путем сравнения выхода сети с истинным выходом с использованием функции потерь. Функция потерь количественно определяет разницу между предсказанными и истинными значениями, давая нам единственное число, которое представляет общую ошибку сети в этих данных. Выбор функции потерь зависит от решаемой задачи. Чем лучше наш выбор функции потерь соответствует проблеме, которую мы пытаемся решить, тем лучше наша нейронная сеть сможет учиться на данных. Например, для задачи регрессии (прогнозирование непрерывного значения) мы можем использовать среднеквадратичную ошибку (MSE), которая вычисляет среднее значение квадратов разностей между прогнозируемыми и фактическими значениями. Для задачи двоичной классификации (предсказание одного из двух классов) мы можем использовать бинарную кросс-энтропию, которая вычисляет логарифмическую потерю между предсказанными вероятностями и фактическими классами. На практике мы обычно рассчитываем потери по партии примеров за раз, а не по всему набору данных сразу. Это связано с тем, что использование пакетов может сделать процесс обучения более эффективным с точки зрения вычислений и может помочь модели лучше обобщать. После того, как мы подсчитали потери для каждой партии, мы можем усреднить эти потери партии, чтобы получить общие потери за эпоху (один полный проход через обучающие данные).
  4. Обратное распространение. Теперь ключевой шаг — обратное распространение. Именно здесь сеть учится, обновляя веса и смещения, чтобы уменьшить ошибку. Основная идея состоит в том, чтобы вычислить градиент (или производную) функции потерь по отношению к каждому весу и смещению в сети. Градиент говорит нам, насколько небольшое изменение каждого веса или смещения повлияет на потери. Термин «обратное распространение» относится к тому, как эти градиенты рассчитываются при обратном проходе через сеть, начиная с выходного слоя и возвращаясь к входному слою. Говоря математическим языком, это применение цепного правила. Это позволяет нам разбить расчет этих градиентов на управляемые части, вычисляя градиент на каждом слое, а затем «перемножая» эти градиенты вместе (так сказать), чтобы найти градиент при каждом весе или смещении. По сути, это помогает понять, насколько каждый вес и смещение повлияли на общую ошибку. Поскольку это ключевой принцип алгоритма обучения, в следующем эпизоде ​​обратное распространение будет рассмотрено более подробно.
  5. Обновление веса и смещения. Затем веса и смещения корректируются в направлении, уменьшающем ошибку. Обычно это делается с помощью метода, называемого градиентным спуском, где каждый параметр (веса и смещения) настраивается путем вычитания из него доли вычисленного градиента. Размер шагов, предпринимаемых в пространстве весов и смещений, определяется гиперпараметром, известным как скорость обучения.
  6. Итеративное обучение: процесс прямого распространения, расчета потерь, обратного распространения и обновления веса повторяется много раз (эпохи) для пакетов данных из обучающего набора. Каждое повторение дает сети возможность уменьшить ошибку и улучшить свои прогнозы.
  7. Проверка и тестирование. После обучения сети важно проверить ее работу на невидимых данных. Это помогает оценить способность сети к обобщению, т. е. насколько хорошо она работает с новыми данными.

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

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

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

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

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

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

Основные преимущества разделения данных на несколько пакетов и обучения в несколько эпох заключаются в следующем:

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

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

Это все для сегодняшнего эпизода. Надеюсь, вам было предписано прочитать ее так же, как мне ее написать. Если вы хотите глубже изучить нейронные сети, загляните в онлайн-книгу Michael Nielson’s Neural Networks and Deep Learning, которую мне очень понравилось читать. Или, если вы предпочитаете смотреть лекцию на YouTube, чтобы получить более глубокое представление, я собираюсь порекомендовать Лекцию Уил ван дер Алста о нейронных сетях.

А пока, пожалуйста, не стесняйтесь начать оживленную дискуссию под этой статьей! Хорошей недели и до скорой встречи!