Изменения

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

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

246 байт добавлено, 15:50, 28 октября 2020
м
Выделение формул и исправление опечаток
'''Сети глубокого доверия''' {{- --}} это вероятностные генеративные модели, которые состоят из нескольких слоев стохастических скрытых переменных. Скрытые переменные обычно имеют двоичные значения и часто называются скрытыми узлами или детекторами признаков. Два верхних слоя имеют ненаправленные, симметричные связи между ними и образуют ассоциативную память. Нижние слои действуют сверху вниз, направленные соединения от слоя выше. Состояния узлов в нижнем слое представляют вектор данных.
Два наиболее значимых свойства сетей глубокого доверия:
# Существует эффективная послойная процедура для обучения нисходящих генеративных весов, которая определяютопределяет, как переменные в одном слое зависят от переменных в слое выше.
# После обучения скрытых переменных в каждом слое могут быть выведены значения за один проход снизу вверх, который начинается с наблюдаемого вектора данных в нижнем слое и использует генеративные веса в обратном направлении.
Сети глубокого доверия обучаются по одному слою за раз, обрабатывая значения скрытых переменных в одном слое в тот момент, когда они выводятся из данных для обучения следующего слоя. Это эффективное, жадное обучение может сопровождаться или сочетаться с другими процедурами обучения, которые точно настраивают все веса для улучшения генеративных или дискриминационных характеристик всей сети.
== Как развивались сети глубокого доверия ==
В нейронных сетях первого поколения использовались персептроны, которые идентифицировали конкретный объект или что-либо еще, принимая во внимание «вес» или предварительные свойства. Однако Перцептроны перцептроны могут быть эффективны только на базовом уровне и бесполезны для передовых технологий. Для решения этих проблем во втором поколении нейронных сетей была введена концепция обратного распространения, при которой полученный вывод сравнивается с желаемым выводом, а значение ошибки было снижено до нуля. [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) жадным алгоритмом], чтобы сформировать так называемые Глубокие сети доверия, которые моделируют совместное распределение между наблюдаемым вектором <math>x </math> и скрытыми слоями <math>h ^ {k }</math> следующим образом:[[Файл:Rbmimage1.png <center><tex>P(x, h^1, \ldots, h^l)=\left( \prod\limits_{k = 0}^{l - 2}P(h^k|h^{k + 1}) \right) P(h^{l - 1}| 340px]]h^l)</tex></center>, где $x=h^0$, Где [[Файл:Rbmimage2.png $P(h^{k}| 120px]] h^{k + 1})$ {{---}} условное распределение для видимых узлов, обусловленных скрытыми узлами RBM на уровне <math>k</math>, и [[Файл:Rbmimage3.png $P(h^{l - 1}| 90px]] h^l)$ {{---}} это видимое-скрытое совместное распределение в RBM верхнего уровня. Это показано на рисунке 1.
== Ограниченная машина больцмана Больцмана (RBM) ==
[[Файл:Bolcman.jpg |400px| thumb | right |Рис 2. Визуализация RBM]]
Если вы знаете, что такое факторный анализ,то RBM можно рассматривать как двоичную версию факторного анализа. Таким образом, вместо множества факторов, определяющих вывод, мы можем иметь двоичную переменную в форме 0 или 1.
Например: если вы читаете книгу, а затем судите эту книгу по двухзначной шкале двух: это либо вам нравится книга, либо вам не нравится книга. В таких сценариях мы можем использовать RBM, которые помогут нам определить причину, по которой мы делаем такой выбор.
RBM используют вероятностный подход для нейронных сетей, и поэтому их также называют стохастическими нейронными сетями.
# Один скрытый слой
# Один узел смещения
В приведенном выше примере видимые узлы {{- --}} это не что иное, как то, нравится ли вам книга или нет. Скрытые узлы помогают найти то, что заставило вас одобрить эту книгу. Узлы смещения добавлены, чтобы включить различные виды свойств, разных книг.Простая визуализация Ограниченной машины Больцмана Рис показана на рисунке 2.
Зеленым отмечены видимые узлы, а красным скрытые
# Фаза предварительного обучения
# Фаза тонкой настройки
Фаза предварительного обучения {{- --}} это не что иное, как несколько уровней RBN, в то время как фаза тонкой настройки {{- --}} это нейронная сеть с прямой связью. Визуализация обеих фаз показана на рис.рисунке 3 ниже
[[Файл:Vis2f.png |600px|thumb| center| Рис. 3 Визуализация фаз RBM]]
== Реализация ==
Мы начнем с определения класса DBN, который будет хранить уровни MLP вместе со связанными с ними RBM. Поскольку мы используем RBM для инициализации MLP, код будет отражать эту идею, насколько это возможно. Далее будут приведены RBM, используемый используемые для инициализации сети, и MLP, используемый для классификации.
class DBN(object):
def __init__(self, numpy_rng, theano_rng=None, n_ins=784, hidden_layers_sizes=[500, 500], n_outs=10):
self.y = T.ivector('y')
<code>self.sigmoid_layers</code> будет хранить графики прямой связи, которые вместе образуют MLP, в то время как <code>self.rbm_layers</code> будет хранить RBM, используемые для предварительной подготовки каждого уровня MLP.
Следующим шагом мы строим сигмоидные слои <code>n_layers</code> (мы используем класс <code>HiddenLayer</code>, введенный в Multilayer Perceptron, с единственной модификацией, в которой мы заменили нелинейность от <tex>tanh</tex> на логистическую функцию [[Файл:Vital1.png]] $s(x) = \frac{1}{1 + e^{-x}}$ и <code>n_layers</code> RBM, где <code>n_layers</code> {{--- }} это глубина нашей модели. Мы связываем сигмовидные сигмоидные слои так, что они образуют MLP, и строим каждый RBM таким образом, чтобы они разделяли весовую матрицу и скрытое смещение с соответствующим сигмовидным сигмоидным слоем.
for i in range(self.n_layers):
if i == 0:
self.finetune_cost = self.logLayer.negative_log_likelihood(self.y)
self.errors = self.logLayer.errors(self.y)
Класс также предоставляет метод, который генерирует обучающие функции для каждого каждой из rbmRBM. Они возвращаются в виде списка, где элемент <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
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>. При желании, если вы укажете <texmath>k</texmath> (количество шагов Гиббса, которые нужно выполнить на CD или PCD), это также станет аргументом функции.
Точно так же класс <code>DBN</code> включает метод для построения функций, необходимых для тонкой настройки (<code>train_model</code>, <code>validate_model</code> и <code>test_model</code>).
В конце концов
Несколько несколько строк кода ниже создают глубокую сеть доверия:
numpy_rng = numpy.random.RandomState(123)
print('... building the model')
7
правок

Навигация