Заметки об исследовании глубокой нейронной сети

TensorFlow глубокое обучение алгоритм Нейронные сети
Заметки об исследовании глубокой нейронной сети

Секция 1

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

Связь между искусственным интеллектом, машинным обучением и глубоким обучением?

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

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

История глубокого обучения

Некоторые из следующих изображений взяты из «Практической платформы глубокого обучения TensorFlow Google».

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

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

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

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

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

В настоящее время два инструмента с открытым исходным кодом, о которых я слышал больше, — это Caffe и TensorFlow, а затем я пошел посмотреть количество внимания на Github.Первое — 20,1 тыс., Второе — 69,3 тыс. TensorFlow должен быть самым популярным глубоким рамки обучения в настоящее время. В этой статье, включая следующие статьи, будет записан процесс обучения TensorFlow. Следующее содержимое представляет собой введение в основные концепции TensorFlow. Во введении я стараюсь не добавлять код, потому что текущее обновление TensorFlow относительно быстрое и Я обнаружил, что многие методы записи больше не поддерживаются в новой версии.

Изучите TensorFlow

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

PS: TensorFlow обозначается аббревиатурой tf ниже.

Вычислительная модель tf — вычислительный график

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

import tensorflow as tf
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
result = a + b

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

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

модель данных tf — тензоры

Тензоры — это форма, в которой tf управляет данными и представляет их, и их можно просто понимать как многомерные массивы. Тензор нулевого порядка представляет собой скаляр, то есть число, тензор первого порядка представляет собой одномерный массив, а тензор n-го порядка представляет собой n-мерный массив. tf.add(a, b, name='add') Эта строка кода не получит результат во время выполнения, а будет ссылкой на результат, который представляет собой тензорную структуру, включающую три атрибута name, shape, dtype, name. просто имя узла; shape — размерность тензора, который одномерный, с длиной 2, этот атрибут важнее; dtype — тип данных, каждый тензор имеет уникальный тип данных, между разными тензорами Расчет должен обеспечить унификацию типа.

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

Модель запуска tf — сеанс

Сессия tf используется для выполнения определенных операций, а сессия используется для управления всеми ресурсами в запущенном процессе.После завершения расчета это поможет переработать ресурсы.Через с tf.Session() as sess : этот метод будет автоматически закрыт в конце с использованием ресурсов Recycle.

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

алгоритм прямого распространения

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

Для алгоритма прямого распространения требуется три части информации:

  • Первая часть принимает вектор признаков от объекта в качестве входных данных.
  • Вторая часть - это структура связи нейронной сети, отношения связи между входом и выходом разных нейронов.
  • Третья часть — это параметры в каждом нейроне.

Параметры в нейросети сохраняются и обновляются через переменные (tf.Variable) в tf.

import tensorflow as tf
# w1 是第一层,通过随机数生成一个 (2,3) 的矩阵
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
# w2 是第二层,通过随机石生成一个 (3,1) 的矩阵
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
# x 是输入层,为一个 (1,2) 的矩阵
x = tf.placeholder(tf.float32, shape=(1, 2), name='input')
# 通过 tensorflow 提供的矩阵相乘算法计算
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
with tf.Session() as sess:
    # 这里初始化所有变量
    sess.run(tf.global_variables_initializer())
    # 通过 输入值 x 与 第一层的参数进行矩阵相乘,再与 第二层的参数进行矩阵相乘,实现神经网络的向前传播算法。
    print sess.run(y, feed_dict={x: [[0.7, 0.9]]})

вывод:

[[ 3.95757794]]

Раздел 2

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

Делинеаризация функции активации

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

Ниже перечислены три часто используемые функции активации.

  • Функция ReLU
  • сигмовидная функция
  • тан функция

Эти различные нелинейные функции активации также доступны в tf.

tf.nn.relu(tf.matmul(x, w1) + biases1)

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

функция потерь

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

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

H(p,q)=-\sum_{x}p(x)log q(x)

Результаты, полученные путем прямого распространения нейронной сети в распределение вероятностей, используют регрессию Softmax, которую можно использовать в качестве алгоритма для оптимизации результатов классификации. Если предположить, что выходные значения нейронной сети равны y1,y2,...yn, то результат процесса регрессии Softmax:

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

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

tf.nn.softmax_cross_entropy_with_logits

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

Алгоритм обратного распространения

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

Алгоритм градиентного спуска является наиболее часто используемым методом оптимизации нейронной сети.Предполагая, что θ используется для представления параметров нейронной сети, а J (θ) является значением данного параметра, алгоритм градиентного спуска будет итеративно обновлять θ, чтобы итерация двигалась в сторону минимального обновления направления потерь. Градиент вычисляется путем взятия частной производной, и градиент равен:

\frac{∂}{∂θ}J(θ)

Затем определите скорость обучения η. Формула обновления параметра выглядит следующим образом:

θ_{n+1}=θ_n-η\frac{∂}{∂θ_n}J(θ_n)

Процесс оптимизации делится на два этапа:

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

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

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

每一轮优化的学习率 = 初始学习率 * 衰减系数 ^ (学习步数 / 衰减速度)

проблема переобучения

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

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

J(θ)+λR(w)

где R(w) описывает сложность модели, а λ представляет собой долю потери сложности модели в общих потерях. Вот две функции регуляризации:

Регуляризация L1: это сделает параметры разреженными, а формула неуправляемой.

R(w) = \|~w~\Vert_1 = \sum_i\|w_i\|

Регуляризация L2: параметры не станут разреженными, и формула может быть получена

R(w) = \|~w~\Vert_2^2 = \sum_i\|w_i^2\|

В реальном использовании регуляризация L1 и регуляризация L2 будут использоваться одновременно:

R(w) = \sum_iα|w_i|+(1-α)w_i^2

модель скользящего среднего

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

影子变量值 = 衰减率 * 影子变量值 + (1 - 衰减率) * 待更新变量

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

min\left\{decay,\frac{1+num\_updates}{10+num\_updates}\right\}

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