2016-11-10 21 views
3

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

В то время как float является обычно 32bit и double 64bit в C++, они не имеют большой разницы в скорости в скорости, но использование поплавков может сэкономить некоторую память.

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

В то время как входы и выходы для данных обучения/тестирования определенно может быть поплавков , потому что они не требуют двойной точности, так как цвета в изображении могут быть только в диапазоне 0-255 и когда нормализуется масштаб 0.0-1.0, стоимость единицы будет быть 1/255 = 0,0039 ~

1. насчет скрытых нейронов выходной точности, было бы безопасно, чтобы сделать их плавать тоже?

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

enter image description here

2. насчет веса соединения, они могут быть поплавки?

В то время как входы и выходы нейрона находятся в диапазоне 0-1.0 из-за сигмоида, весам разрешено быть больше.


Stochastic gradient descentbackpropagation страдает на vanishing gradient problem из-за производной активации функции, я решил не ставить на это как вопрос о том, что точность должна градиент переменной быть, ощущение того, что поплавок просто не будет достаточно точным, особенно когда сеть глубокая.

ответ

3
  1. насчет скрытых нейронов точность выхода, было бы безопасно, чтобы сделать их плавать тоже?

Использование float32 везде, как правило, безопасный выбор для большинства нейросетевых приложений. В настоящее время графические процессоры поддерживают только float32, поэтому многие практикующие придерживаются float32 во всем мире. Для многих приложений может быть достаточно даже 16-bit floating point values. Некоторые экстремальные примеры показывают, что высокоточные сети могут быть обучены всего лишь в 2 бита на вес (https://arxiv.org/abs/1610.00324).

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

, поскольку цвета в изображении может быть только в диапазоне 0-255,

Вы делаете это неправильно. Вы вынуждаете сеть изучать масштаб ваших входных данных, когда это уже известно (если вы не используете процедуру инициализации пользовательского веса). Лучшие результаты обычно достигаются, когда входные данные нормализуются к диапазону (-1, 1) или (0, 1), и весы инициализируются, чтобы иметь средний выход слоя в том же масштабе. Это популярный метод инициализации: http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization

Если входы находятся в диапазоне [0, 255], то при среднем входе ~ 100, а весом ~ 1, потенциал активации (аргумент функции активации) будет ~ 100 × N, где N - количество входов слоя, вероятно, далеко в «плоской» части сигмоида. Таким образом, либо вы инициализируете свои веса как ~ 1/(100 × N), либо масштабируете свои данные и используете любой популярный метод инициализации. В противном случае сети придется потратить много времени на обучение, чтобы довести весы до такого масштаба.

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

Это гораздо меньше, чем арифметическая точность машины, но масштаб выходов для каждого из слоев. На практике:

  • ввода предобработки данных (нормализовать (-1, 1) диапазон)
  • если у вас есть более чем 2 слоя, то не используйте сигмоида, использовать выпрямленное линейные блоки вместо
  • ИНИЦИАЛИЗИРУЙТЕ веса тщательно
  • использование пакетной нормализации

This video должно быть полезно, чтобы изучить эти понятия, если вы не знакомы с ними.

+0

Спасибо! Это действительно повысило мою уверенность в использовании поплавков. Я прочитал статью о точности данных в 16 бит, но, продолжая идти дальше в google, большинство ответов на вопросы немного смутили меня. Статья: https: //arxiv.org/pdf/1502.02551.pdf Один из них: http://scicomp.stackexchange.com/questions/21402/are-there-tasks-in-machine-learning-which- require-double-precision-floating-poin О нормализации ввода, Обновлен основной пост, Спасибо! О GPUPU, поддержка новых GPU, двойной от NVIDIA CUDA быть один: https://developer.nvidia.com/cuda-faq Он единственный, кого я имею работу с –

+0

Кроме того, если вы используете CPU, векторный процессор SSE/AVX/NEON обычно может обрабатывать в два раза больше значений «float32». – MSalters

2

От least amount of bits needed for single neuron:

следующие документы изучали этот вопрос (по убыванию хронологического порядка):

Пример из Deep Learning с ограниченной точности вычислений:

enter image description here

Смежные вопросы