Учебное пособие по искусственным нейронным сетям (ИНС) с использованием TensorFlow.

⚡ Умное резюме

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

  • 🔘 Четыре объекта: Каждая искусственная нейронная сеть состоит из слоев, признаков и меток, функции потерь и оптимизатора.
  • ☑️ Роли слоев: Входные данные поступают в скрытые слои, а размер выходного слоя соответствует количеству классов для задач классификации.
  • ✅ Вариант активации: Функция активации ReLU возвращает ноль для отрицательных значений, позволяя сети изучать нелинейные закономерности, которые линейная модель упускает.
  • 🧪 Переобучение системы управления: Меньшие по размеру сети, штрафы за веса в L1 или L2 и коэффициенты отсечения от 0.2 до 0.5 восстанавливают обобщающую способность.
  • 🇧🇷 Шесть этапов сборки: Импортируйте набор данных MNIST, масштабируйте его, создайте столбцы признаков, определите DNNClassifier, обучите модель, а затем добавьте регуляризацию.
  • 📈 Измеренный результат: Скрытые слои размером 300 и 100 единиц достигают точности 0.9637143; регуляризованный вариант снижается до 0.95057142.

Искусственная нейронная сеть (ИНС)

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

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

Схема ниже tracЭто один полный проход через такую ​​сеть, от исходных данных до оптимизатора, который корректирует веса.

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

Искусственная нейронная сеть (ИНС) состоит из четырех основных объектов:

  • Количество слоёв: Обучение происходит внутри слоев. Всего три слоя: 1) входной, 2) скрытый и 3) выходной.
  • Характеристика и метка: Входные данные для сети (признаки) и выходные данные из сети (метки).
  • Функция потерь: Метрика, используемая для оценки эффективности этапа обучения.
  • Оптимизатор: Улучшите процесс обучения, обновляя знания в сети.

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

Если вы посмотрите на рисунок выше, вы поймете основной механизм.

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

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

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

Эти четыре объекта напрямую соответствуют компонентам, которые вы настраиваете при проектировании сети.

Нейронная сеть Archiтекстура

Архитектура искусственной нейронной сети состоит из следующих компонентов:

  • Слои
  • Функция активации
  • Функция потери
  • Оптимизатор

Слои

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

Типичная нейронная сеть принимает на вход вектор и скаляр, содержащий метки. Простейшая схема — это бинарная классификация всего с двумя классами: 0 и 1.

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

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

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

  1. Первый узел — это входные значения.
  2. Нейрон разлагается на входную часть и функцию активации. Левая часть получает весь входной сигнал от предыдущего слоя. Правая часть представляет собой сумму входных сигналов, поступающих в функцию активации.
  3. Выходное значение вычисляется на основе скрытых слоев и используется для прогнозирования. Для классификации оно равно количеству классов. Для регрессии прогнозируется только одно значение.

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

Функция активации узла определяет выходной сигнал при заданном наборе входных данных. Функция активации необходима для того, чтобы сеть могла обучаться нелинейным закономерностям. Распространенной функцией активации является ReLU (Rectified Linear Unit). Эта функция возвращает ноль для всех отрицательных значений.

Другие функции активации:

  • Кусочно-линейный
  • сигмоид
  • Тань
  • Дырявый ReLU

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

График функции активации ReLU R(z) = max(0, z), плоский в нулевой точке для отрицательных входных сигналов и линейный для положительных входных сигналов.

Критическое решение, которое необходимо принять при построении нейронной сети:

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

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

Функция потери

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

Для бинарной классификации обычно используется функция потерь бинарной кросс-энтропии. линейная регрессияДля этого используется среднеквадратная ошибка.

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

Оптимизатор

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

Обычные оптимизаторы:

  • Momentum оптимизации
  • Ускоренный градиент Нестерова
  • АдаГрад
  • Оптимизация Адама

ArchiОдна лишь архитектура не гарантирует работоспособность модели.

Ограничения нейронной сети

Ниже перечислены ограничения нейронной сети:

переобучения

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

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

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

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

Техника Что это ограничивает Типичные настройки в этом руководстве
Размер сети Количество слоев и скрытых элементов Два скрытых слоя, 300 и 100 единиц.
Регуляризация весов L1/L2 Величина весовых коэффициентов Значения l1_regularization_strength и l2_regularization_strength равны 0.01.
отсев Доля отключенных устройств на каждом этапе обучения отсев 0.3

Размер сети

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

Регулировка веса

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

  • L1 (Лассо): Стоимость пропорциональна абсолютному значению весовых коэффициентов.
  • L2 (Гребень): Стоимость пропорциональна квадрату значения весовых коэффициентов.

отсев

Dropout — это необычная, но полезная техника. В нейронной сети с Dropout некоторые нейроны случайным образом отключаются на этапе обучения, так что их исходящий сигнал становится равным нулю. Представьте, что у вас есть массив весов [0.1, 1.7, 0.7, -0.9]. Если нейронная сеть использует Dropout, она станет [0.1, 0, 0, -0.9] со случайным распределением нулей. Параметр, управляющий Dropout, — это коэффициент Dropout. Коэффициент определяет, сколько нейронов отключается. Часто встречается значение от 0.2 до 0.5.

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

Пример нейронной сети в TensorFlow

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

  • Два скрытых слоя
  • Первый слой состоит из четырех полностью связанных нейронов.
  • Второй слой состоит из двух полностью связанных нейронов.
  • Функция активации — это ReLU.
  • Добавьте регуляризацию L2 со скоростью обучения 0.003.

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

Анимация работы браузерной нейронной сети при изменении её весов в течение эпох обучения.

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

  • При использовании случайных весов, то есть без оптимизации, выходные потери составляют 0.453. На рисунке ниже сеть представлена ​​разными цветами.
  • Как правило, оранжевый цвет представляет отрицательные значения, а синий цвет — положительные значения.
  • Данные представлены одинаково: синие точки обозначают положительные значения, а оранжевые — отрицательные.

Тестовая среда Browser Playground на первой итерации со случайными весами: вес -0.43 и значение функции потерь на тестовом наборе данных 0.453.

Внутри второго скрытого слоя линии окрашены в соответствии со знаком весов. Оранжевые линии несут отрицательные веса, а синие — положительные.

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

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

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

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

Приведённый ниже пошаговый пример реализует ту же идею в коде на реальном наборе данных.

Как обучить нейронную сеть с помощью TensorFlow

Вот пошаговый процесс обучения нейронной сети с помощью TensorFlow Искусственная нейронная сеть (ИНС) с использованием оценщика DNNClassifier из API.

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

  1. Импортировать данные
  2. Преобразуйте данные
  3. Постройте тензор
  4. Построить модель
  5. Обучите и оцените модель
  6. Улучшить модель

Примечание к версии: Код в этом пошаговом руководстве ориентирован на API Estimator из TensorFlow 1.x. Финальная версия пакета tf-estimator поставлялась с TensorFlow 2.15, а tf.estimator был удален в TensorFlow 2.16. Чтобы выполнить эти шаги в текущей версии, либо закрепите TensorFlow 2.15, либо перестройте ту же двухслойную сеть с tf.keras.layers.Dense и model.fit().

Шаг 1) Импортируйте данные

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

Набор данных MNIST — это наиболее часто используемый набор данных для тестирования новых методов или алгоритмов. Он представляет собой коллекцию изображений размером 28×28 пикселей, каждое из которых отображает рукописную цифру от 0 до 9. Комитет глубоких сверточных нейронных сетей, обученных с использованием эластичных искажений, снизил ошибку тестирования до 0.27 процента.

import numpy as np
import tensorflow as tf
np.random.seed(1337)

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

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)

Примечание к API: Сайт mldata.org больше не работает, а функция fetch_mldata была удалена в scikit-learn 0.22. В текущей установке замените приведенный выше вызов на fetch_openml('mnist_784', version=1), который загружает те же 70 000 цифр и предоставляет идентичные данные и целевые атрибуты.

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

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )

Шаг 2) Преобразуйте данные

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

(X-min_x)/(max_x - min_x)

В библиотеке scikit-learn уже есть функция для этого: MinMaxScaler()

## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))

Шаг 3) Постройте тензор

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

feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]

Шаг 4) Постройте модель

Архитектура нейронной сети содержит 2 скрытых слоя: первый слой состоит из 300 нейронов, а второй — из 100. Эти значения получены на основе опыта, а не по формуле. Вы можете настроить их и посмотреть, как они повлияют на точность сети.

Для построения модели используется оценщик DNNClassifier. Необходимо установить количество классов равным 10, поскольку в обучающем наборе десять классов. Синтаксис объекта оценщика вам уже знаком. Аргументы feature_columns, n_classes и model_dir точно такие же, как и в предыдущем уроке. Новый аргумент hidden_units управляет как количеством слоев, так и количеством узлов, которые каждый слой соединяет с нейронной сетью. В приведенном ниже коде два скрытых слоя: первый соединяет 300 узлов, а второй — 100.

Чтобы построить оценщик, используйте tf.estimator.DNNClassifier со следующими параметрами:

  • feature_columns: Определите столбцы, которые будут использоваться в сети.
  • hidden_units: Определите количество скрытых нейронов.
  • n_классов: Укажите количество классов для прогнозирования.
  • model_dir: Определите путь Тензорборд
estimator = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100], 
    n_classes=10, 
    model_dir = '/train/DNN')

Шаг 5) Обучите и оцените модель

Для обучения и оценки модели можно использовать функцию ввода NumPy.

# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=50,
    shuffle=False,
    num_epochs=None)
estimator.train(input_fn = train_input,steps=1000) 
eval_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test, 
    shuffle=False,
    batch_size=X_test_scaled.shape[0],
    num_epochs=1)
estimator.evaluate(eval_input,steps=None) 

Выход:

{'accuracy': 0.9637143,
 'average_loss': 0.12014342,
 'loss': 1682.0079,
 'global_step': 1000}

Текущая архитектура обеспечивает точность на оценочном наборе данных примерно в 96 процентов.

Шаг 6) Улучшите модель

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

Здесь в качестве оценщика используется оптимизатор Proximal AdaGrad с коэффициентом отсеивания 0.3 и уровнем значимости L1 и L2, установленным на 0.01. В нейронной сети TensorFlow доступ к оптимизатору осуществляется через объект train, за которым следует имя оптимизатора. TensorFlow предоставляет встроенный API для оптимизатора Proximal AdaGrad.

Для добавления регуляризации к глубокой нейронной сети можно использовать tf.train.ProximalAdagradOptimizer со следующими параметрами:

  • Скорость обучения: Learning_rate
  • L1-регуляризация: l1_regularization_strength
  • L2-регуляризация: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100],
    dropout=0.3, 
    n_classes = 10,
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.01,
      l1_regularization_strength=0.01, 
      l2_regularization_strength=0.01
    ),
    model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000) 
estimator_imp.evaluate(eval_input,steps=None) 

Выход:

{'accuracy': 0.95057142,
 'average_loss': 0.17318928,
 'loss': 2424.6499,
 'global_step': 2000}

Выбранные значения для уменьшения переобучения не улучшили точность модели. Ваша первая модель показала точность 96%, в то время как модель с L2-регуляризатором имеет точность 95%. Вы можете попробовать разные значения и посмотреть, как они повлияют на точность.

Часто задаваемые вопросы (FAQ)

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

Не так, как написано. tf.estimator был удален в TensorFlow 2.16, а tf.estimator.inputs.numpy_input_fn больше не существует. Либо закрепите TensorFlow 2.15, либо перестройте сеть с использованием слоев tf.keras.layers.Dense по 300 и 100 юнитов и обучите ее с помощью model.fit().

Библиотеки для поиска нейронной архитектуры и автоматической настройки параллельно анализируют количество слоев, ширину, скорость обучения и отсеивание (dropout), а затем ранжируют кандидатов по результатам валидации. Они заменяют ручные пробные попытки измерениями, хотя инженер по-прежнему устанавливает вычислительный бюджет и целевую метрику.

Да. Второй пилот GitHub Функция автозаполнения позволяет заполнить шаблонный код, например, схемы входных потоков, стеки слоев и циклы оценки, коротким комментарием. Рассматривайте ее вывод как черновик: она может предлагать удаленные API, такие как fetch_mldata, поэтому перед запуском проверяйте каждый вызов на соответствие текущей документации.

Сайт mldata.org был закрыт. scikit учиться Функция fetch_mldata была удалена в версии 0.22. Вместо неё используйте fetch_openml('mnist_784', version=1). Она загружает те же 70 000 рукописных цифр и возвращает данные и целевые атрибуты, поэтому остальная часть этого руководства остаётся без изменений.

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

Базовая модель не сильно переобучалась, поэтому отсеивание (dropout) в размере 0.3 плюс штрафы L1 и L2 в размере 0.01 в основном убрали полезную пропускную способность. Точность упала с 0.9637143 до 0.95057142. Регуляризация помогает только тогда, когда разрыв между результатами обучения и тестирования велик.

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

Подведем итог этой публикации следующим образом: