Новые архитектуры нейросетей

Содержание:

Leaky ReLU and the Keras API

Nevertheless, it may be that you want to test whether traditional ReLU is to blame when you find that your Keras model does not converge.

In that case, we’ll have to know how to implement Leaky ReLU with Keras, and that’s what we’re going to do next

Let’s see what the Keras API tells us about Leaky ReLU:

It is defined as follows:

Contrary to our definition above (where \(\alpha = 0.01\), Keras by default defines alpha as 0.3). This does not matter, and perhaps introduces more freedom: it allows you to experiment with some \(\alpha\) to find which works best for you.

What it does? Simple – take a look at the definition from the API docs: ,  .

Alpha is the slope of the curve for all \(x < 0\).

One important thing before we move to implementation!

With traditional ReLU, you directly apply it to a layer, say a layer or a layer, like this:

You don’t do this with Leaky ReLU. Instead, you have to apply it as an additional layer, and import it as such:

Note my use of the He uniform initializer contrary to Xavier, which is wise theoretically when using ReLU or ReLU-like activation functions.

Литература

  • Simon S. Haykin. . — Prentice Hall, 1999. — ISBN 978-0-13-273350-2.
  • Cybenko G.V. // Mathematics of Control, Signals, and Systems / Jan H. van Schuppen. — Springer International, 2006. — С. 303.
  • Jan Snyman. . — Springer Science & Business Media, 2005. — ISBN 978-0-387-24348-1.
  • Xavier Glorot, Yoshua Bengio. // International Conference on Artificial Intelligence and Statistics (AISTATS’10). — Society for Artificial Intelligence and Statistics, 2010.
  • Vinod Nair, Geoffrey E. Hinton. // 27th International Conference on International Conference on Machine Learning. — USA: Omnipress, 2010. — С. 807–814. — (ICML’10). — ISBN 9781605589077.
  • Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. Proceeding ICCV’15 Proceedings of the 2015 IEEE International Conference on Computer Vision (ICCV). — Washington: IEEE Computer Society, 2015. — С. 1026-1034. — ISBN 978-1-4673-8391-2.
  • Bing Xu, Naiyan Wang, Tianqi Chen, Mu Li. Empirical Evaluation of Rectified Activations in Convolutional Network // Computer Vision and Pattern Recognition. — 2015.
  • Günter Klambauer, Thomas Unterthiner, Andreas Mayr, Sepp Hochreiter. Self-Normalizing Neural Networks // Advances in Neural Information Processing Systems. — 2017. — Июнь (т. 30, вып. 2017). — . — arXiv:1706.02515.
  • Stefan Elfwing, Eiji Uchibe, Kenji Doya. Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning // Neural Networks. — 2018.
  • Luke B. Godfrey, Michael S. Gashler. A continuum among logarithmic, linear, and exponential functions, and its potential to improve generalization in neural networks // 7th International Joint Conference on Knowledge Discovery, Knowledge Engineering and Knowledge Management: KDIR. — 2016. — Февраль (т. 1602). — . — arXiv:1602.01321.
  • Michael S. Gashler, Stephen C. Ashmore. Training Deep Fourier Neural Networks To Fit Time-Series Data // International Conference on Intelligent Computing. — Springrt, Cham, 2014. — С. 48-55.
  • Ian J. Goodfellow, David Warde-Farley, Mehdi Mirza, Aaron Courville, Yoshua Bengio. Maxout Networks // JMLR Workshop and Conference Proceedings. — 2013. — Т. 28, вып. 3. — С. 1319–1327. — . — arXiv:1302.4389.

Примечания

  1. , с. 500–544.
  2. .
  3. Биполярная – принимающая значение -1 до начала координат и 1 после, в отличие от двоичной ступенчатой функции, которая принимает до начала координат значения 0.)
  4. Функция подъёма принимает значение 0 до начала координат и линейна после.
  5. , с. 303.
  6. .
  7. , с. 3432–3441.
  8. Sussillo, David & Abbott, L. F. (2014-12-19), Random Walk Initialization for Training Very Deep Feedforward Networks,

  9. James Bergstra, Guillaume Desjardins, Pascal Lamblin, Yoshua Bengio.  (недоступная ссылка). Département d’Informatique et de Recherche Opérationnelle, Université de Montréal (2009). Дата обращения 30 сентября 2018.
  10. .
  11. ↑ Carlile, Brad; Delamarter, Guy; Kinney, Paul; Marti, Akiko & Whitney, Brian (2017-11-09), Improving Deep Learning by Inverse Square Root Linear Units (ISRLUs),

  12. По аналогии с диодом – пропускает ток (не меняя его) в одну сторону, и не пропускает в другую.
  13. , с. 807–814.
  14. .
  15. .
  16. .
  17. Clevert, Djork-Arné; Unterthiner, Thomas & Hochreiter, Sepp (2015-11-23), Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs),

  18. .
  19. Jin, Xiaojie; Xu, Chunyan; Feng, Jiashi; Wei, Yunchao; Xiong, Junjun & Yan, Shuicheng (2015-12-22), Deep Learning with S-shaped Rectified Linear Activation Units,

  20. Forest Agostinelli; Matthew Hoffman; Peter Sadowski & Pierre Baldi (21 Dec 2014), Learning Activation Functions to Improve Deep Neural Networks,

  21. Xavier Glorot, Antoine Bordes, Yoshua Bengio. . International Conference on Artificial Intelligence and Statistics (2011).
  22. .
  23. , с. 481–486.
  24. .
  25. , с. 1319–1327.

Принцип работы CNN

Свертка — фактически главное, что необходимо понять о сверточных нейронных сетях. Этот замысловатый математический термин нужен для движущегося окна или фильтра по исследуемому изображению. Перемещающееся окно применяется к определенному участку узлов, как показано ниже. Где примененный фильтр — ( 0.5 * значение в узле):

На диаграмме показаны только два выходных значения, каждое из которых отображает входной квадрат размера 2×2. Вес отображения для каждого входного квадрата, как ранее упоминалось, равен 0.5 для всех четырех входов (inputs). Поэтому выход может быть посчитан так:

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

Первое положение связей движущегося фильтра показано синей линией, второе — зеленой. Веса для каждых таких соединений равны 0.5.

Вот несколько вещей в сверточном шаге, которые ускоряют процесс тренировки, сокращая количество параметров, весов:

  • Редкие связи — не каждый узел в первом (входном) слое соединен с каждым узлом во втором слое. Этим отличается архитектура CNN от полностью связанной нейронной сети, где каждый узел соединен со всем другими в следующем слое.
  • Постоянные параметры фильтра. Другими словами, при движении фильтра по изображению одинаковые веса применяются для каждого 2 х 2 набора узлов. Каждый фильтр может быть обучен для выполнения специфичных трансформаций входного пространства. Следовательно, каждый фильтр имеет определенный набор весов, которые применяются для каждой операции свертки. Этот процесс уменьшает количество параметров. Нельзя говорить, что любой вес постоянен внутри отдельного фильтра. В примере выше веса были , но ничего не мешало им быть и . Выбор конкретных значений зависит от обучения каждого фильтра.

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

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

Процесс, использующийся в сверточном блоке, называется признаковым отображением (feature mapping). Название основано на идее, что каждый сверточный фильтр может быть обучен для поиска различных признаков в изображении, которые затем могут быть использованы в классификации. Перед разговором о следующем свойстве CNN, называемом объединением (pooling), рассмотрим идею признакового отображения и каналов.

Почему производная / дифференциация используется?

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

Сигмоидная или логистическая функция активации

Сигмовидная функция определяется следующим образом:

Функция активации сигмоида переводит входные данные в диапазоне к диапазону в (0; 1)

Softmax является популярным выбором для активации выходного слоя.

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

Примеры кода[править]

Scalaправить

Пример кода с библиотекой DeepLearning.scala

   // Загрузка датасета
   val cifar10 = Cifar10.load().blockingAwait
   // Определение слоёв
   def myNeuralNetwork(input: INDArray):  INDArrayLayer = {
       val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))
       val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))
       val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)
       val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)
       softmaxValue
   }
   // Определение функции потерь
   def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = { 
       val probabilities = myNeuralNetwork(input)
       -(hyperparameters.log(probabilities) * expectOutput).mean   
   }
   class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {
       import scalaz.std.anyVal._
       import scalaz.syntax.all._
       @volatile
       private var isShuttingDown: Boolean = false
       private val lossBuffer = scala.collection.mutable.Buffer.empty
       def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = "loss by time")
       def interrupt(): Unit = isShuttingDown = true
       def startTrain(): Unit = {
           @monadic
           def trainTask: Future = {
               isShuttingDown = false
               var epoch = 0
           
               while (epoch < numberOfEpoches && !isShuttingDown) {
                   val cifar10 = Cifar10.load().blockingAwait
                   val iterator = cifar10.epoch(batchSize).zipWithIndex
                   while (iterator.hasNext && !isShuttingDown) {
                       val (Cifar10.Batch(labels, batch), i) = iterator.next()
                       val loss = lossFunction(batch, labels).train.each
                       lossBuffer += loss
                       hyperparameters.logger.info(s"epoch=epoch iteration=i batchSize=batchSize loss=loss")
                   }
                   epoch += 1
               }
               hyperparameters.logger.info("Done")
           }
           trainTask.onComplete { tryUnit: scala.util.Try => tryUnit.get }
       }
   }

Сигмовидная функция

Представьте, что большинство проблем в природе не являются линейными, а комбинации сигмовидной функции не являются линейными. Бинго!


Сигмовидная функция и производная

Затем мы можем отсортировать слои. Давайте подумаем о недвоичных функциях Он также является производным, потому что он отличается от функции шага. Это означает, что обучение может произойти. Если мы рассмотрим график x между -2 и +2, значения y быстро изменятся. Маленькие изменения в x будут большими в y. Это означает, что его можно использовать как хороший классификатор. Другое преимущество этой функции заключается в том, что она выдает значение в диапазоне (0,1), когда встречается с (- бесконечный, + бесконечный), как в линейной функции. Таким образом, значение активации не исчезает, это хорошая новость!

Если мы внимательно посмотрим на график к концам функции, значения y очень мало реагируют на изменения в x. Давайте подумаем, что это за проблема! Values ​​Значения производной в этих областях очень малы и сходятся к 0. Это называетсяисчезающий градиенти обучение минимально. если 0, то не учусь! Когда происходит медленное обучение, алгоритм оптимизации, который минимизирует ошибку, может быть привязан к локальным минимальным значениям и не может получить максимальную производительность от модели искусственной нейронной сети. Так что давайте продолжим наш поиск альтернативной функции активации!

Преимущества

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

ELU

Экспоненциальная линейная единица приводит к более высоким результатам классификации, чем традиционные ReLU. Он следует тому же правилу для x> = 0, что и ReLU, и экспоненциально возрастает при x <0.

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

Maxout Activation

Функция активации Maxout определяется следующим образом

Активация Maxout является обобщением функций ReLU и неплотных функций ReLU.Это обучаемая функция активации,

  • Это кусочно-линейная функция, которая возвращает максимум входов, разработанная для использования вместе с методом регуляризации отсева.
  • И ReLU, и неплотный ReLU являются частными случаями Maxout. Следовательно, нейрон Maxout обладает всеми преимуществами блока ReLU (линейный режим работы, без насыщения) и не имеет своих недостатков (умирающий ReLU).
  • Однако он удваивает общее количество параметров для каждого нейрона и, следовательно, необходимо обучить большее общее количество параметров.

Лучшие практики

  • использованиеРЕЛУвактивация скрытого слоя,но будьте осторожны со скоростью обучения и следите за долей мертвых единиц.
  • ЕслиРЕЛУдает проблемы. Попробуйте Leaky ReLU, PReLU, Maxout. Не используйте сигмовидную кишку
  • Нормализуйте данные для достижения более высокой точности проверки и стандартизируйте, если вам нужны результаты быстрее
  • сигмоида такжетангенс гиперболическийФункции активации не могут использоваться в сетях со многими слоями из-за исчезающей проблемы градиента.

Результат

Сеть достигает следующего уровня ошибок первого и пятого уровней: 37,5% и 17,0%, соответственно. Лучшая производительность, достигнутая в ходе конкурса ILSVRC-2010, составляла 47,1% и 28,2% при использовании подхода, в котором усредняются предсказания, полученные шестью моделями с разреженным кодированием, обученных на различных векторах свойств.  С тех пор достигнуты результаты: 45,7% и 25,7% при использовании подхода, в котором усредняются предсказания двух классификаторов, обучаемых на векторах Фишера. Результаты ILSVRC-2010 приведены в таблице 1.

Слева: восемь тестовых изображений ILSVRC-2010 и пять ярлыков, которые наиболее вероятны по мнению модели. Правильная метка записывается под каждым изображением, а вероятность показана красной полосой, если она находится в верхней пятерке. Справа: пять тестовых изображений ILSVRC-2010 в первом столбце. В остальных столбцах показаны шесть обучающих изображений.

Model performance

Now, we can take a look at how our model performs. Additionally, since we also retrained the Keras CNN with traditional ReLU as part of creating the model defined above, we can even compare traditional ReLU with Leaky ReLU for the MNIST dataset!

LeakyReLU model performance

Generally speaking, I’m quite satisfied with how the model performed during training. The curves for loss and accuracy are actually pretty normal – large improvements at first, slower improvements at last. Perhaps, the model already starts overfitting slightly, as validation loss is stable after the 10th epoch and perhaps already increasing very lightly. However, that’s not (too) relevant for now.

As we can observe from our evaluation metrics, test accuracy was 99.19% – that’s really good!

Comparing LeakyReLU and normal / traditional ReLU

Comparing our Leaky ReLU model with traditional ReLU produced these results:

With those evaluation metrics for testing:

I’d say they perform equally well. Although the traditional ReLU model seems to perform slightly better than Leaky ReLU during training and testing, it’s impossible to say whether this occurs by design or by chance (e.g., due to pseudo-random weight initialization).

Многоканальная версия сверточной нейронной сети

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

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

Вот где ключевые различия между терминами становятся нужными: тогда как в случае с 1 каналом термины «фильтр» и «ядро» взаимозаменяемы, в общем случае они разные.

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

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

Затем каждая из обработанных в канале версий суммируется вместе для формирования одного канала. Ядра каждого фильтра генерируют одну версию каждого канала, а фильтр в целом создает один общий выходной канал:

Наконец, каждый выходной файл имеет свое смещение. Смещение добавляется к выходному каналу для создания конечного выходного канала:

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

Swish (самоограниченная) функция


Swish Функция и Производная

Самое важное отличие от ReLU в отрицательном регионе.У Leaky было то же значение в ReLU, в чем разница?Все остальные функции активации являются монотонными

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

F (X) = 2x * сигмовидной (бета * х)

Если мы думаем, чтобета = 0это простая версия Swish, которая является обучаемым параметром, тогда сигмовидная часть всегда равна 1/2, а f (x) линейна. С другой стороны, если бета имеет очень большое значение, сигмоид становится почти двузначной функцией (0 для х0). Таким образом, f (x) сходится к функции ReLU Поэтому стандартная функция Swish выбрана как бета = 1.Таким образом, обеспечивается мягкая интерполяция (связывание наборов значений переменных с функцией в заданном диапазоне и требуемой точностью). Превосходно! Решение проблемы исчезновения градиентов найдено.

Отображение признаков и мультиканальность

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

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

Если входной объект мультиканальный, то в случае цветного RGB изображения (один канал для каждого цвета) выход будет четырехмерным. К счастью, любая библиотека глубокого обучения, включая PyTorch, легко справляется с отображением. Наконец, не стоит забывать, что операция свертки проходит через активационную функцию в каждом узле.

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

Примечания

  1. Y. LeCun, B. Boser, J. S. Denker, D. Henderson, R. E. Howard, W. Hubbard and L. D. Jackel: Backpropagation Applied to Handwritten Zip Code Recognition, Neural Computation, 1(4):541-551, Winter 1989.
  2. (2000) «Digital selection and analogue amplification coexist in a cortex-inspired silicon circuit». 405: 947–951.
  3. Graham, Benjamin (2014-12-18), «Fractional Max-Pooling»,

  4. Springenberg, Jost Tobias; Dosovitskiy, Alexey; Brox, Thomas & Riedmiller, Martin (2014-12-21), «Striving for Simplicity: The All Convolutional Net»,

  5. Jain, V. and Seung, S. H. (2008). Natural image denoising with convolutional networks. In NIPS’2008.
  6. Lee, H., Grosse, R., Ranganath, R., and Ng, A. Y. (2009a). Convolutional deep belief networks for scalable unsupervised learning of hierarchical representations. In ICML’2009.
  7. Zeiler, M., Krishnan, D., Taylor, G., and Fergus, R. (2010). Deconvolutional networks. In CVPR’2010.
Добавить комментарий

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