Изменения

Перейти к: навигация, поиск

Сети глубокого доверия

1797 байт добавлено, 16:15, 22 апреля 2020
Реализация
Сети глубокого доверия обучаются по одному слою за раз, обрабатывая значения скрытых переменных в одном слое в тот момент, когда они выводятся из данных для обучения следующего слоя. Это эффективное, жадное обучение может сопровождаться или сочетаться с другими процедурами обучения, которые точно настраивают все веса для улучшения генеративных или дискриминационных характеристик всей сети.
Дискриминирующая тонкая настройка может быть выполнена путем добавления последнего слоя переменных, которые представляют желаемые выходные данные и производные [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8 ошибок обратного распространения]. Когда сети со многими скрытыми слоями применяются к высокоструктурированным входным данным, таким как изображения, обратное распространение работает намного лучше, если детекторы признаков в скрытых слоях инициализируются путем обучения глубокой сети доверия, которая моделирует структуру во входных данных.
== Как развивались сети глубокого доверия ==
В нейронных сетях первого поколения использовались персептроны, которые идентифицировали конкретный объект или что-либо еще, принимая во внимание «вес» или предварительные свойства. Однако Перцептроны могут быть эффективны только на базовом уровне и бесполезны для передовых технологий. Для решения этих проблем во втором поколении нейронных сетей была введена концепция обратного распространения, при которой полученный вывод сравнивается с желаемым выводом, а значение ошибки было снижено до нуля. [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM) Метод опорных векторов ] позволил создать больше контрольных примеров, ссылаясь на ранее введенные контрольные примеры. Затем последовали циклические графы, называемые сетями доверия, которые помогли в решении проблем, связанных с выводом и проблемами обучения. За этим последовали сети глубокого доверия, которые помогли создать непредвзятые значения для хранения в конечных узлах.
== Композиция простых обучающих модулей ==
[[Файл:Rbmimage4.png |400px|thumb| right| Рис. 1 Распределение RBM]]
Глубокая сеть доверия может рассматриваться как набор простых обучающих модулей, каждый из которых представляет собой [https://ru.wikipedia.org/wiki/%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%91%D0%BE%D0%BB%D1%8C%D1%86%D0%BC%D0%B0%D0%BD%D0%B0 ограниченную машину Больцмана(RBM)], которая содержит слой видимых узлов, представляющий данные, и слой скрытых узлов, который обучаются представлению особенностей, которые захватывают более высокие порядки корреляции в данных. Ограниченные машины Больцмана могут быть сложены и обучены [https://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%A0%D0%B0%D0%B4%D0%BE-%D0%AD%D0%B4%D0%BC%D0%BE%D0%BD%D0%B4%D1%81%D0%B0_(%D0%B6%D0%B0%D0%B4%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC) жадным алгоритмом], чтобы сформировать так называемые Глубокие сети доверия, которые моделируют совместное распределение между наблюдаемым вектором x и скрытыми слоями h ^ k следующим образом
[[Файл:Rbmimage1.png| 340px]], Где [[Файл:Rbmimage2.png | 120px]] условное распределение для видимых узлов, обусловленных скрытыми узлами RBM на уровне k, и [[Файл:Rbmimage3.png | 90px]] это видимое-скрытое совместное распределение в RBM верхнего уровня. Это показано на рисунке 1.
== Ограниченная машина больцмана (RBM) ==
[[Файл:Bolcman.jpg |400px| thumb | right |Рис 2. Визуализация RBM]]
Если вы знаете, что такое факторный анализ,то RBM можно рассматривать как двоичную версию факторного анализа. Таким образом, вместо множества факторов, определяющих вывод, мы можем иметь двоичную переменную в форме 0 или 1.
# Один узел смещения
В приведенном выше примере видимые узлы - это не что иное, как то, нравится ли вам книга или нет. Скрытые узлы помогают найти то, что заставило вас одобрить эту книгу. Узлы смещения добавлены, чтобы включить различные виды свойств, разных книг.
Простая визуализация Ограниченной машины Больцмана <ref>[[Файл:BolcmanРис 2.jpg]]</ref>[[Файл:Bolcman.jpg |400px| thumb | right |Рис 1. Визуализация RBM]]
Зеленым отмечены видимые узлы, а красным скрытые
# Фаза предварительного обучения
# Фаза тонкой настройки
Фаза предварительного обучения - это не что иное, как несколько уровней RBN, в то время как фаза тонкой настройки - это нейронная сеть с прямой связью. Визуализация обеих фаз на рис. 3 ниже[[Файл:Vis2f.png |600px|thumb| center| Рис. 3 Визуализация фаз RBM]]
Как работают Глубокие сети доверия?
# the labels are presented as 1D vector of [int] labels
self.y = T.ivector('y')
<texcode>self.sigmoid_layers</texcode> будет хранить графики прямой связи, которые вместе образуют MLP, в то время как <code>self.rbm_layers </code> будет хранить RBM, используемые для предварительной подготовки каждого уровня MLP.Следующим шагом мы строим сигмоидные слои <code>n_layers </code> (мы используем класс <code>HiddenLayer</code>, введенный в Multilayer Perceptron, с единственной модификацией, в которой мы заменили нелинейность от <tex>tanh </tex> на логистическую функцию [[Файл:Vital1.png]] и <code>n_layers </code> RBM, где <code>n_layers </code> - это глубина нашей модели. Мы связываем сигмовидные слои так, что они образуют MLP, и строим каждый RBM таким образом, чтобы они разделяли весовую матрицу и скрытое смещение с соответствующим сигмовидным слоем.
for i in range(self.n_layers):
if i == 0:
self.rbm_layers.append(rbm_layer)
Осталось только сложить один последний уровень логистической регрессии, чтобы сформировать MLP. Мы будем использовать класс <code>LogisticRegression</code>:
self.logLayer = LogisticRegression(input=self.sigmoid_layers[-1].output,
n_in=hidden_layers_sizes[-1],
self.finetune_cost = self.logLayer.negative_log_likelihood(self.y)
self.errors = self.logLayer.errors(self.y)
Класс также предоставляет метод, который генерирует обучающие функции для каждого из rbm. Они возвращаются в виде списка, где элемент <tex>i </tex> является функцией, которая реализует один этап обучения для RBM на уровне <tex>i</tex>
def pretraining_functions(self, train_set_x, batch_size, k):
index = T.lscalar('index') # index to a minibatch
Чтобы иметь возможность изменять скорость обучения во время обучения, мы связываем с ней переменную <code>Theano</code>, которая имеет значение по умолчанию.
learning_rate = T.scalar('lr') # learning rate to use
# begining of a batch, given `index`
return pretrain_fns
Теперь любая функция <code>pretrain_fns [i] </code> принимает в качестве аргумента индекс и, опционально, <code>lr </code> - скорость обучения. Обратите внимание, что имена параметров - это имена, данные переменным <code>Theano </code> (например, <code>lr</code>) при их создании, а не имена переменных python (например, <code>learning_rate</code>). Имейте это в виду при работе с <code>Theano</code>. При желании, если вы укажете <tex>k </tex> (количество шагов Гиббса, которые нужно выполнить на CD или PCD), это также станет аргументом функции.
Точно так же класс <code>DBN </code> включает метод для построения функций, необходимых для тонкой настройки (<code>train_model</code>, <code>validate_model </code> и <code>test_model</code>).
def build_finetune_functions(self, datasets, batch_size, learning_rate):
(train_set_x, train_set_y) = datasets[0]
return [test_score_i(i) for i in range(n_test_batches)]
return train_fn, valid_score, test_score
Обратите внимание, что возвращенные <code>valid_score </code> и <code>test_score </code> являются не функциями <code>Theano</code>, а скорее функциями Python. Они зацикливаются на всем наборе проверки и на всем наборе тестов, чтобы создать список потерь, полученных на этих наборах
В конце концов
Эта сеть состоит из двух этапов: (1) этап предварительного обучения и (2) этап точной настройки.
На этапе предварительного обучения мы перебираем все слои сети. Для каждого уровня мы используем скомпилированную функцию anano, которая определяет вход в RBM <tex>i</tex>-го уровня и выполняет один шаг CD-k в этом RBM. Эта функция применяется к обучающему набору для фиксированного числа эпох, заданных <code>pretraining_epochs</code>.
print('... getting the pretraining functions')
pretraining_fns = dbn.pretraining_functions(train_set_x=train_set_x,
end_time = timeit.default_timer()
 
==Источники информации==
#[http://deeplearning.net/tutorial/DBN.html Статья Deeplearning о применении DBN]
#[https://en.wikipedia.org/wiki/Deep_belief_network wikipedia dbn] {{---}} Статья про DBN в Wikipedia
#[https://www.cs.toronto.edu/~hinton/nipstutorial/nipstut3.pdf 2007 NIPS Tutorial on: Deep Belief Nets]
#[https://pathmind.com/wiki/restricted-boltzmann-machine A Beginner's Guide to Restricted Boltzmann Machines]
 
[[Категория: Машинное обучение]]
[[Категория: Сети глубокого доверия]]
27
правок

Навигация