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

Весь код, написанный в этом блоге, находится у меня на github- https://github.com/HarshMishra2002/movie_review_classification_DL

«Глубокое» в глубоком обучении

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

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

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

Анатомия нейронной сети

Нейронная сеть в основном вращается вокруг этих четырех вещей:

  1. Слои
  2. Входные данные и соответствующие цели
  3. Функция потерь
  4. Оптимизатор

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

Для разных форматов тензора (входных данных) нам нужны разные типы слоев

2D-тензор (выборка, признаки) → Плотные слои

3D-тензор (образцы, временные метки, функции) → слои LSTM

4D тензор (данные изображения) → 2D сверточные слои

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

Теперь у нас достаточно информации, чтобы начать работу над проектом. Мы будем реализовывать все на python и будем использовать библиотеку keras.

Классификация обзоров фильмов

О наборе данных:

Вы будете работать с набором данных IMDB: набор из 50 000 крайне поляризованных обзоров из базы данных фильмов в Интернете. Они разделены на 25 000 отзывов для обучения и 25 000 отзывов для тестирования, каждый набор состоит из 50% отрицательных и 50% положительных отзывов.

давайте сначала импортируем набор данных и библиотеку keras

Аргумент num_words=10000 означает, что вы сохраните только 10 000 наиболее часто встречающихся слов в обучающих данных. Редкие слова будут отброшены.

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

Лучший способ сделать это — горячее кодирование. Это превратит наш список в векторы 0 и 1. Это означало бы, например, превращение последовательности [3, 5] в 10 000-мерный вектор, в котором были бы все 0, кроме индексов 3 и 5, которые были бы 1. Затем вы можете использовать в качестве первого слоя в вашей сети плотный слой, способный обрабатывать векторные данные с плавающей запятой.

векторизация меток будет довольно простой:

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

Плотный слой с активацией relu реализует следующую цепочку тензорных операций: output = relu(dot(W, input) + b). Наличие 16 скрытых единиц означает, что весовая матрица W будет иметь вид (input_dimension, 16): скалярное произведение с W проецирует входные данные на 16-мерное пространство представления (а затем вы добавите вектор смещения b и примените операцию relu). Вы можете интуитивно понять размерность вашего пространства представления как «сколько свободы вы предоставляете сети при изучении внутренних представлений». Наличие большего количества скрытых единиц (многомерное пространство представления) позволяет вашей сети изучать более сложные представления, но делает сеть более затратной в вычислительном отношении и может привести к изучению нежелательных шаблонов.

В отношении такого стека слоев Dense необходимо принять два ключевых архитектурных решения:

Сколько слоев использовать 

Сколько скрытых единиц выбрать для каждого слоя

На данный момент вам придется доверить мне следующий выбор архитектуры:

Два промежуточных слоя по 16 скрытых элементов в каждом 

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

Промежуточные слои будут использовать relu в качестве функции активации, а последний слой будет использовать сигмовидную активацию, чтобы вывести вероятность (показатель от 0 до 1, указывающий, насколько вероятно, что образец имеет цель «1»: насколько вероятно отзыв должен быть положительным)

Relu (выпрямленная линейная единица) — это функция, предназначенная для обнуления отрицательных значений, тогда как сигмоид «раздавливает» произвольные значения в интервале [0, 1], выводя нечто, что можно интерпретировать как вероятность.

Итак, наша сеть будет выглядеть примерно так:

Что такое функции активации и зачем они нужны?

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

вывод = точка (w, ввод) + b

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

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

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

теперь мы будем обучать модель для 20 эпох (20 итераций по всем выборкам в тензорах x_train и y_train) в мини-пакетах по 512 выборок. В то же время мы будем отслеживать потери и точность 10 000 образцов, которые вы выделили. Вы делаете это, передавая данные проверки в качестве аргумента validation_data.

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

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

Мы смотрим на потерю проверки, после 4 эпохи она начинает увеличиваться, а не уменьшаться. Точно так же снижается точность проверки. Итак, после 4-й эпохи мы сталкиваемся с проблемой переобучения.

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

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

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

Надеюсь, вы, ребята, узнали что-то новое и вам понравился этот блог. Если вам это нравится, чем поделиться им с друзьями. Заботиться. Продолжай учиться.

Вы также можете связаться со мной через мою учетную запись Linkedin — https://www.linkedin.com/in/harsh-mishra-4b79031b3/