Что такое эпохи в нейронных сетях
Перейти к содержимому

Что такое эпохи в нейронных сетях

  • автор:

 

Что такое batch? Эпоха, батч, итерация – в чем различия? Руководство

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

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

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

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

Что такое batch (батч), эпоха и итерация?

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

Что такое эпоха?

  • размеру и форме тела;
  • форме мордочки;
  • характерной окраске;
  • форме хвоста.
  • форме лап;
  • форме ушей;
  • форме глаз;
  • форме усов на мордочке.

Что такое итерация?

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

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

Итерация — это «прохождение», этап, пакет, из которых состоит одна эпоха. То есть, в нашем случае, наша эпоха состоит из 4 итераций. В одной итерации мы обучаем нейронную сеть различать кошек и собак по одному признаку.

Что такое батч?

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

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

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

Заключение

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

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Машинное обучение и Data Science. Нейросети (Часть 02): архитектура нейронных сетей с прямой связью

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

Введение

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

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

А значит, нужно динамичное решение. Динамический код, параметры которого можно менять и оптимизировать без ущерба для программы. Если для построения нейросетей вы используете библиотеку питон keras, работы по настройке и сборке даже самых сложных архитектур будет меньше. Именно этого я хочу добиться средствами MQL5.

В статье «Линейная регрессия (часть 3)», которую я обязательно рекомендую прочитать, я представил матрично-векторную форму, которая позволяет получить гибкие модели с неограниченным количеством входных данных.

Матрицы в помощь

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

Изображение нейронной сети

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

Умножение матрицы в нейронной сети

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

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

Архитектура нейронной сети

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

  • Когда предыдущий (входной) слой имеет меньше узлов, чем следующий (выходной слой)
  • Когда предыдущий (входной) слой имеет больше узлов, чем следующий
  • Когда имеется равное количество узлов во входном и выходном слое

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

Генерация случайных весов и значений смещения

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

Что такое эпоха?

Эпоха — это полный проход всех данных в нейронной сети. В случае feed-forward — это полный прямой проход всех входных данных, в back propagation — полный прямой и обратный проход. Простыми словами, это когда нейросеть увидела все данные.

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

Обратите внимание на входные параметры: HActivationFx — функция активации в скрытых слоях, OActivationFx — функция активации в выходном слое, NodesHL[] — количество узлов в скрытом слое. Если в массиве, скажем, 3 элемента, это означает, что у вас будет 3 скрытых слоя, и количество узлов в этих слоях будет определяться элементами, присутствующими внутри массива. Посмотрим на код ниже.

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

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

Теперь вызовем полную функцию многослойного перцептрона (MLP) и посмотрим результат. Затем я объясню, что для этого было сделано.

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

Работа однослойной нейронной сети

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

Первый вход в сеть на входном слое — матрица 1xn означает, что в ней одна строка и неизвестное количество столбцов (n). Инициализируем эту логику перед циклом for в строке

чтобы получить общее количество весовых коэффициентов, необходимых для завершения процесса умножения. Умножаем количество узлов входного/предыдущего слоя на количество в выходном/следующем слое. В данном случае имеем 2 входа и 4 узла в первом скрытом слое, поэтому нам нужно 2×4 = 8 значений весов. Самая важная фишка всего этого показана далее:

Чтобы лучше понять, посмотрим, что делает матричное умножение:

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

Это еще более важно для матрицы, потому что

  • В первом слое входная матрица это матрица весов 1×2 = 2×4, а выходная матрица = 1×4.
  • Во втором слое входная матрица это матрица весов 1×4 = 4×6, а выходная матрица1×6
  • Соответственно, в третий слой входит 1×6 матрица весов 6×1, а ан выходе матрица 1×1

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

На основе вышеперечисленных операций

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

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

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

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

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

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

Используем количество эпох по умолчанию, равное 1.

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

Тестирование или использование модели на новых данных

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

Вот эта функция отвечает за обучение нейронной сети.

Функция setmodelParams() генерирует случайные значения весовых коэффициентов и смещения. После обучения модели получаем значения весов и смещения, сохраняем их в binary-файл.

Чтобы посмотреть, как все работает в MLP, будем использовать набор данных из реального примера отсюда.

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

nasdaq dataset

Импортируем набор данных

Вывод того кода будет таким:

Теперь весь файл CSV хранится внутри XMatrix[]. Ура!

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

Просто, не так ли? Однако нужно исправить несколько строк кода. В train_feedforwardMLP добавлены итерации всего набора данных в одну итерацию эпохи.

Проверим логи при запуске программы в режиме отладки.

Режим отладки занимает много места на диске. Поэтому при любом другом использовании (не в режиме отладки) установите значение false. После одного запуска программы у меня логи были размером в 21Мб.

Краткий обзор двух итераций:

Все настроено и работает хорошо, как и ожидалось. Теперь сохраним параметры модели в файл binary.

Сохранение параметров модели в файле

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

Пример того, как получить доступ к параметрам модели в других программах:

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

Использование модели

Это была легкая часть. Функция прямого прохода MLP изменилась — мы добавили новые входные веса и смещения, это поможет запустить модель, например, для работы на последних ценовых данных или чем-то еще.

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

Все это работает.

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

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

Модель, которую мы только что написали, является базовой и может не давать желаемых результатов без должной оптимизации (уверен на 100%). Надеюсь, вы проявите творческий подход и поработаете над этим.

Заключительные мысли

Важно понимать теорию и все, что находится за закрытыми дверями различных техник машинного обучения. У нас нет пакетов data science в MQL5, но есть как минимум фреймворки Python. Однако, бывают случаи, когда работу нужно организовать в MetaTrader. Не имея четкого понимания теории, стоящей за такого рода вещами, человеку будет трудно разобраться и извлечь максимальную пользу из машинного обучения. По мере продвижения важность теории и изученных ранее в этой серии вещей возрастает.

Нейронные сети для начинающих. Часть 1

image

Привет всем читателям Habrahabr, в этой статье я хочу поделиться с Вами моим опытом в изучении нейронных сетей и, как следствие, их реализации, с помощью языка программирования Java, на платформе Android. Мое знакомство с нейронными сетями произошло, когда вышло приложение Prisma. Оно обрабатывает любую фотографию, с помощью нейронных сетей, и воспроизводит ее с нуля, используя выбранный стиль. Заинтересовавшись этим, я бросился искать статьи и «туториалы», в первую очередь, на Хабре. И к моему великому удивлению, я не нашел ни одну статью, которая четко и поэтапно расписывала алгоритм работы нейронных сетей. Информация была разрознена и в ней отсутствовали ключевые моменты. Также, большинство авторов бросается показывать код на том или ином языке программирования, не прибегая к детальным объяснениям.

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

Первым и самым важным моим открытием был плейлист американского программиста Джеффа Хитона, в котором он подробно и наглядно разбирает принципы работы нейронных сетей и их классификации. После просмотра этого плейлиста, я решил создать свою нейронную сеть, начав с самого простого примера. Вам наверняка известно, что когда ты только начинаешь учить новый язык, первой твоей программой будет Hello World. Это своего рода традиция. В мире машинного обучения тоже есть свой Hello world и это нейросеть решающая проблему исключающего или(XOR). Таблица исключающего или выглядит следующим образом:

a b c
0 0 0
0 1 1
1 0 1
1 1 0

Соответственно, нейронная сеть берет на вход два числа и должна на выходе дать другое число — ответ. Теперь о самих нейронных сетях.

Что такое нейронная сеть?

image

Нейронная сеть — это последовательность нейронов, соединенных между собой синапсами. Структура нейронной сети пришла в мир программирования прямиком из биологии. Благодаря такой структуре, машина обретает способность анализировать и даже запоминать различную информацию. Нейронные сети также способны не только анализировать входящую информацию, но и воспроизводить ее из своей памяти. Заинтересовавшимся обязательно к просмотру 2 видео из TED Talks: Видео 1, Видео 2). Другими словами, нейросеть это машинная интерпретация мозга человека, в котором находятся миллионы нейронов передающих информацию в виде электрических импульсов.

Какие бывают нейронные сети?

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

Для чего нужны нейронные сети?

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

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

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

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

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

Что такое нейрон?

image

Нейрон — это вычислительная единица, которая получает информацию, производит над ней простые вычисления и передает ее дальше. Они делятся на три основных типа: входной (синий), скрытый (красный) и выходной (зеленый). Также есть нейрон смещения и контекстный нейрон о которых мы поговорим в следующей статье. В том случае, когда нейросеть состоит из большого количества нейронов, вводят термин слоя. Соответственно, есть входной слой, который получает информацию, n скрытых слоев (обычно их не больше 3), которые ее обрабатывают и выходной слой, который выводит результат. У каждого из нейронов есть 2 основных параметра: входные данные (input data) и выходные данные (output data). В случае входного нейрона: input=output. В остальных, в поле input попадает суммарная информация всех нейронов с предыдущего слоя, после чего, она нормализуется, с помощью функции активации (пока что просто представим ее f(x)) и попадает в поле output.

Важно помнить, что нейроны оперируют числами в диапазоне [0,1] или [-1,1]. А как же, вы спросите, тогда обрабатывать числа, которые выходят из данного диапазона? На данном этапе, самый простой ответ — это разделить 1 на это число. Этот процесс называется нормализацией, и он очень часто используется в нейронных сетях. Подробнее об этом чуть позже.

Что такое синапс?

Синапс это связь между двумя нейронами. У синапсов есть 1 параметр — вес. Благодаря ему, входная информация изменяется, когда передается от одного нейрона к другому. Допустим, есть 3 нейрона, которые передают информацию следующему. Тогда у нас есть 3 веса, соответствующие каждому из этих нейронов. У того нейрона, у которого вес будет больше, та информация и будет доминирующей в следующем нейроне (пример — смешение цветов). На самом деле, совокупность весов нейронной сети или матрица весов — это своеобразный мозг всей системы. Именно благодаря этим весам, входная информация обрабатывается и превращается в результат.

Важно помнить, что во время инициализации нейронной сети, веса расставляются в случайном порядке.

Как работает нейронная сеть?

В данном примере изображена часть нейронной сети, где буквами I обозначены входные нейроны, буквой H — скрытый нейрон, а буквой w — веса. Из формулы видно, что входная информация — это сумма всех входных данных, умноженных на соответствующие им веса. Тогда дадим на вход 1 и 0. Пусть w1=0.4 и w2 = 0.7 Входные данные нейрона Н1 будут следующими: 1*0.4+0*0.7=0.4. Теперь когда у нас есть входные данные, мы можем получить выходные данные, подставив входное значение в функцию активации (подробнее о ней далее). Теперь, когда у нас есть выходные данные, мы передаем их дальше. И так, мы повторяем для всех слоев, пока не дойдем до выходного нейрона. Запустив такую сеть в первый раз мы увидим, что ответ далек от правильно, потому что сеть не натренирована. Чтобы улучшить результаты мы будем ее тренировать. Но прежде чем узнать как это делать, давайте введем несколько терминов и свойств нейронной сети.

Функция активации

Функция активации — это способ нормализации входных данных (мы уже говорили об этом ранее). То есть, если на входе у вас будет большое число, пропустив его через функцию активации, вы получите выход в нужном вам диапазоне. Функций активации достаточно много поэтому мы рассмотрим самые основные: Линейная, Сигмоид (Логистическая) и Гиперболический тангенс. Главные их отличия — это диапазон значений.

Линейная функция

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

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

Гиперболический тангенс

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

Тренировочный сет

Тренировочный сет — это последовательность данных, которыми оперирует нейронная сеть. В нашем случае исключающего или (xor) у нас всего 4 разных исхода то есть у нас будет 4 тренировочных сета: 0xor0=0, 0xor1=1, 1xor0=1,1xor1=0.

Итерация

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

Эпоха

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

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

Ошибка

Ошибка — это процентная величина, отражающая расхождение между ожидаемым и полученным ответами. Ошибка формируется каждую эпоху и должна идти на спад. Если этого не происходит, значит, вы что-то делаете не так. Ошибку можно вычислить разными путями, но мы рассмотрим лишь три основных способа: Mean Squared Error (далее MSE), Root MSE и Arctan. Здесь нет какого-либо ограничения на использование, как в функции активации, и вы вольны выбрать любой метод, который будет приносить вам наилучший результат. Стоит лишь учитывать, что каждый метод считает ошибки по разному. У Arctan, ошибка, почти всегда, будет больше, так как он работает по принципу: чем больше разница, тем больше ошибка. У Root MSE будет наименьшая ошибка, поэтому, чаще всего, используют MSE, которая сохраняет баланс в вычислении ошибки.

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

Задача

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

Данные: I1=1, I2=0, w1=0.45, w2=0.78 ,w3=-0.12 ,w4=0.13 ,w5=1.5 ,w6=-2.3.

H1input = 1*0.45+0*-0.12=0.45
H1output = sigmoid(0.45)=0.61

H2input = 1*0.78+0*0.13=0.78
H2output = sigmoid(0.78)=0.69

O1input = 0.61*1.5+0.69*-2.3=-0.672
O1output = sigmoid(-0.672)=0.33

O1ideal = 1 (0xor1=1)

Результат — 0.33, ошибка — 45%.

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

 

Нейросеть: в чём разница между Batch и Epoch

Стохастический градиентный спуск — это алгоритм обучения, который имеет ряд гиперпараметров.
Два гиперпараметра, которые часто путают новичков, — это размер пакета и количество эпох. Они оба являются целочисленными значениями и, кажется, отражают одно и то же.
Подчеркнём разницу между партиями и эпохами в стохастическом градиентном спуске.
В чем разница между Партией и Эпохой в Нейронной сети?

Стохастический Градиентный спуск

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

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

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

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

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

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

Прежде чем мы погрузимся в серии и эпохи, давайте посмотрим, что мы подразумеваем под образцом.

Узнайте больше о градиентном спуске здесь:

Градиентный Спуск Для Машинного Обучения

Что такое Образец?

Образец — это одна строка данных.

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

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

Теперь, когда мы знаем, что такое образец, давайте определим партию.
Что такое Партия?

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

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

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

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

Пакетный Градиентный Спуск. Размер пакета = Размер обучающего набора
Стохастический Градиентный Спуск. Размер партии = 1
Мини-Пакетный градиентный спуск. 1 <Размер пакета < Размер обучающего набора

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

Что делать, если набор данных не делится равномерно по размеру пакета?

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

Кроме того, вы можете удалить некоторые образцы из набора данных или изменить размер пакета таким образом, чтобы количество образцов в наборе данных делилось равномерно на размер пакета.

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

Краткое введение в Градиентный спуск Мини-пакетов и Как настроить размер пакета

Для получения дополнительной информации о влиянии размера пакета на процесс обучения см. Сообщение:

Как контролировать скорость и стабильность обучения нейронных сетей Размер пакета

Пакет включает в себя обновление модели с использованием образцов; далее давайте рассмотрим эпоху.
Что такое Эпоха?

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

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

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

Число эпох традиционно велико, часто сотни или тысячи, что позволяет алгоритму обучения работать до тех пор, пока ошибка модели не будет достаточно сведена к минимуму. Вы можете увидеть примеры количества эпох в литературе и в учебных пособиях, установленных на 10, 100, 500, 1000 и более.

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

Для получения дополнительной информации о диагностике с помощью кривых обучения в сетях LSTM см. Сообщение:

Мягкое введение в кривые обучения для диагностики производительности модели

В случае, если это все еще неясно, давайте рассмотрим различия между партиями и эпохами.
В чем разница между Партией и Эпохой?

Размер партии — это количество образцов, обработанных до обновления модели.

Количество эпох — это количество полных проходов через обучающий набор данных.

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

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

Они оба являются целочисленными значениями и оба являются гипер-параметрами для алгоритма обучения, например, параметрами процесса обучения, а не параметрами внутренней модели, найденными в процессе обучения.

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

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

Наконец, давайте конкретизируем это на небольшом примере.

Предположим, у вас есть набор данных с 200 образцами (строками данных), и вы выбираете размер пакета от 5 до 1000 эпох.

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

Это также означает, что одна эпоха будет включать 40 пакетов или 40 обновлений модели.

С 1000 эпохами модель будет подвергнута воздействию или пройдет через весь набор данных 1000 раз. Это в общей сложности 40 000 партий за весь учебный процесс.
Дальнейшее Чтение

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

Градиентный Спуск Для Машинного Обучения
Как контролировать скорость и стабильность обучения нейронных сетей Размер пакета
Краткое введение в Градиентный спуск Мини-пакетов и Как настроить размер пакета
Мягкое введение в кривые обучения для диагностики производительности модели
Стохастический градиентный спуск в Википедии
Обратное распространение в Википедии

В этом посте мы показали разницу между партиями и эпохами в стохастическом градиентном спуске.

В частности, вы узнали:

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

У вас есть какие-нибудь вопросы?

Вот самые популярные комментарии:

Меняется ли наполнение пакетов от эпохи к эпохе?

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

Если вы создаете модель прогнозирования временных рядов (скажем, что-то со слоем lstm), будут ли пакетные наблюдения обучающего набора храниться в “кусках” (то есть группы времени не будут разбиты, и, следовательно, основной шаблон нарушен)? Это имеет значение, верно?

Вы можете оценить это, перетасовав образцы, а не перетасовав образцы, поданные в LSTM во время обучения или вывода.

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

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

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

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

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

в современных подходах к обучению deeeep я почти всегда сталкиваюсь с тем, что люди сохраняют свои модели после некоторого количества эпох (или некоторого периода времени), визуализируя какие-то показатели производительности для оценки следующих значений гиперпараметров, после чего они проводят свои эксперименты для следующих эпох. Таким образом, мы можем назвать эту процедуру «мини-эпохальным стохастическим глубоким обучением». Спасибо.
Ответить

Еще раз спасибо за отличный пост в блоге. Для данных временных рядов в LSTM имеет ли смысл когда-либо иметь размер пакета больше одного?
Я искал и искал, и я не мог найти ни одного примера, где размер пакета больше одного, но я также не нашел никого, кто сказал бы, что это не имеет смысла.

Да, если вы хотите, чтобы модель обучалась в нескольких под-последовательностях.

У меня есть несколько сообщений, которые демонстрируют это по расписанию.

спасибо вам за ваше объяснение действительно очень большое спасибо еще раз

Это очень ясно. Спасибо.
Я также вижу «steps_per_epoch» в некоторых случаях, что это значит? Это то же самое, что и партии?

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

Мы любим примеры! Большое вам спасибо!

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

Терминология samples/epoch/batch не соответствует word2vec. Вместо этого у вас просто есть обучающий набор данных текста, из которого вы изучаете статистику.
Ответить

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

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

После каждой эпохи точность либо улучшается, либо иногда нет. Например, эпоха 1 достигла точности 94, а эпоха 2 достигла точности 95. После окончания эпохи 1 мы получаем новые веса (т. е. обновленные после последней партии эпохи 1). Означает ли это, что новые веса, используемые в эпоху 2, начинают улучшать его с 94% до 95%? Если да, то является ли это причиной того, что какая-то эпоха получает более низкую точность по сравнению с предыдущей эпохой из-за обобщения весов для всего набора данных? Вот почему мы получаем хорошую точность после прохождения стольких эпох благодаря лучшему обобщению?

Как правило, больше тренировок означает лучшую точность, но не всегда.

Иногда может быть хорошей идеей прекратить тренировки пораньше

Действительно, в последнем примере общее количество мини-пакетов составляет 40 000, но это верно только в том случае, если пакеты выбраны без перетасовки обучающих данных или выбраны с перетасовкой данных, но без повторения. В противном случае, если в течение одной эпохи мини-пакеты создаются путем выбора обучающих данных с повторением, у нас могут быть некоторые точки, которые появляются более одного раза в одну эпоху (они появляются в разных мини-пакетах в одну эпоху), а другие — только один раз. Таким образом, общее количество мини-партий в этом случае может превысить 40 000.

Обычно данные перемешиваются перед каждой эпохой.

Обычно мы не выбираем образцы с заменой, так как это приведет к смещению обучения.

Если у меня есть 1000 обучающих выборок и мой размер пакета =400, то мне нужно удалить 200 выборок
исходя из моих тренировочных данных, мои тренировочные данные всегда должны быть кратны размеру пакета

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

Лучше выбрать размер партии, который делит образцы равномерно, если это возможно, например, 100, 200 или 500 в вашем случае.

спасибо за вашу замечательную статью, и у меня есть вопрос
если у меня есть следующие настройки и я использую функцию fit_generator
эпохи =100
данные=1000 изображений
партия = 10
шаг_пер_почты = 20
я знаю, что должен установить значение step_per_epochs = (1000/10)= 100, но если я установлю его равным 20

Означают ли эти настройки, что модель будет обучаться с использованием только части обучающих данных (в каждую эпоху будут использоваться одни и те же 200 изображений (пакет*step_per_epochs)), а не все 1000 изображений?
или он будет использовать первые 200 изображений в наборе данных в первую эпоху, затем следующие 200 изображений во вторую эпоху и так далее (разделит 1000 изображений на каждые 5 эпох), и модель будет обучена 20 раз с использованием всего обучающего набора данных в 100 эпохах
Спасибо

Да, будет использоваться только 200 изображений за эпоху.

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

Если бы я создавал свои собственные пользовательские пакеты, скажем, в методе model.fit_generator().

Создаем ли мы новые случайно отобранные партии для каждой эпохи или мы просто создаем партии в __init__ и используем их без каких-либо изменений на протяжении всего обучения?

Каков рекомендуемый способ?

P.S. Если я произвольно отбираю партии в каждую эпоху, я вижу всплески в val_acc, но не уверен, что это из-за этого!

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

Если нет, вы будете перемещать веса повсюду или вперед/назад при каждом обновлении, а не обобщать хорошо.

Спасибо вам за ваш ответ.

Я также только что подтвердил, что Keras разделит предоставленный X в мини-пакетах только один раз, прежде чем войти в цикл эпохи.

Сегодня мне в голову пришел один вопрос.

Что происходит при обучении нейронной сети в мини-пакетах, когда метки классов несбалансированы. Должны ли мы расслаивать партии?

Потому что кажется, что мой NN предсказывает только доминирующий класс, что бы я ни делал!

Отличный вопрос. У нас бывают плохие времена!

Иногда эксперты советовали чередовать классы в каждой партии. Иногда расслаиваются. Это может зависеть от проблемы/модели.

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

Я обязательно взгляну на эту книгу.

Кстати, я на самом деле занимаюсь рейтинговым бизнесом. Так что у меня очень мало 1-го и 2-го ранга, но много 3-го и выше, где-то как (10%, 10%, 80%) соответственно.

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

У меня есть вопрос – Если я правильно понял, веса и смещения обновляются после выполнения пакета, поэтому любые изменения после запуска пакета применяются к следующему пакету? И так продолжается и дальше.

Сейчас я нахожусь в середине изучения практического машинного обучения, и часть 2 в главе 11 я не могу понять значение пакетной обработки. Сначала я думаю, что нейронная сеть должна обучаться по образцу один за другим. Но они сказали “партия”, и я не могу понять на земле.
Но ваша статья дает мне хорошее представление о партии.
Я полностью понимаю вас только по одному вопросу.
Как я могу использовать метод градиента с пакетной обработкой?
Я имею в виду, что в одном примере это понятно.
Но с пакетной обработкой я не понимаю, как оценить ошибку.
Спасибо.

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

Я надеялся, что вы сможете помочь мне с моими довольно длинными запутанными вопросами (извините). Я очень новичок в глубоком обучении.

Безусловно, спасибо за то, что сделали это – это облегчает жизнь без забивания головы и времени для некоторых на изучение нескольких источников

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

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

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

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

Спасибо, что поделились.

Это блестяще и прямолинейно. Спасибо за мини-курс

Я рад, что это помогло.

Еще раз спасибо за отличный пост в блоге. Для данных временных рядов в LSTM имеет ли смысл когда-либо иметь размер пакета больше одного?
Я искал и искал, и я не мог найти ни одного примера, где размер пакета больше одного, но я также не нашел никого, кто сказал бы, что это не имеет смысла.

Да, если вы хотите, чтобы модель обучалась в нескольких под-последовательностях.

У меня есть несколько сообщений, которые демонстрируют это по расписанию.

спасибо вам за ваше объяснение действительно очень большое спасибо еще раз

Я рад, что это помогло.

Я читал много блогов, написанных вами о таких вещах. Это мне очень помогает, спасибо!

Спасибо, отличное объяснение. До сих пор ваш блог является лучшим источником для изучения ML, который я нашел (для начинающих, таких как я).

Я также вижу «steps_per_epoch» в некоторых случаях, что это значит? Это то же самое, что и партии?

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

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *