Обосновать не могу, в устройстве видео-карт NVidia не разбираюсь. Но так пишут в группах по глубокому обучению, неоднократно приходилось видеть. Например вот, пишет Крыжевский:
«Note: A Fermi-generation GPU (GTX 4xx, GTX 5xx, or Tesla equivalent) is required to run this code. Older GPUs won't work. Newer (Kepler) GPUs also will work, but as the GTX 680 is a terrible, terrible GPU for non-gaming purposes, I would not recommend that you use it. (It will be slow).»
Думаю, в главном мы друг друга поняли, не вижу смысла долго спорить дальше. )
Рекуррентные сети являются deep-моделями де-факто, не не считаются такими из-за устоявшейся терминологии. Да, это как в медицине — как привыкли, так и пишут. То, что последовательность линейных слоев сводится к одному линейному слою — поверьте, я это понимаю. ) Кстати, у SVM внутри нету никаких иерархий нелинейных преобразований — это по сути линейная модель, ее способность работать с нелинейными данными происходит из-за того, что она оперирует в пространстве большой размерности, неявно заданном нелинейным ядерным преобразованием.
Можно одно и то же называть по-разному, суть дела это не меняет. Для меня более привычна система обозначений, когда Train используется для обучения, Test — для периодического контроля в время обучения (то есть, на самом деле тоже неявно используется для обучения!) а Validation — это именно для финальной оценки, не Test. Если вам привычнее называть это по-другому (так тоже обозначают) — это тоже ок.
Кросс-валидация — это прием обучения, когда выборка делится на k равных частей, взятых произвольным образом. Затем на k-1 частях производится обучение, на одной оставшейся — тестирование. И так k раз, конечный результат усредняется. Но как я уже писал, это вещь бывает коварная из-за своего «произвольного» стиля отборка данных в k частей. Валидация должна быть правильная, т.е. максимально приближенная к реальной жизненной ситуации, с которой столкнется система распознавания.
Действительно, у глубоких нейронных сетей (deep neural networks) скрытых слоев нейронов обычно больше, чем один — например, 4 или 6. Хинтон в своей пионерской статье 2006-го года по DNN пишет, что в неокортексе человека 6 слоев нейронов, если я не ошибаюсь, и это его дополнительно мотивировало. Но много нейронов — это тоже очень важный аспект, характеризующий глубокие нейронные сети. Я видел на хорошей конференции работу, где под «глубокой нейронной сетью» понималась SVM с миллионом свободных параметров, где вообще никаких слоев нету.
Моя личная точка зрения, я здесь абсолютно не претендую на истину в последней инстанции — все же именно большое количество настраиваемых параметров более выпукло характеризует эту научную область, поскольку нейронные сети большим количеством слоев активно встречаются в природе с 1990-х годов, и используются сейчас — просто они по-другому называются. Я имею ввиду рекуррентные нейронные сети (Recurrent Multilayer Perceptron, RMLP, сеть NARX и сеть Эльмана), которые обучаются методом обратного распространения ошибки во времени (Backpropagation Through Time, BPTT). Посмотрите MATLAB — там эти модели сидят давно и плотно в Neural Networks Toolbox, это известные вещи, не экзотика какая-нибудь. Техника такого обучения состоит в том, что рекуррентная нейронная сеть «разворачивается назад во времени» — представляется как многослослойный персептрон с большом количеством слоев, каждый слой соответствует какому-то прошлому такту. По сути получается многослойный персептрон с большим количеством слоев, у Данила Прохорова из Тойоты количество слоев было h=20, который потом обучают. Чем не глубокая сеть?
Спасибо за комментарий. Вы совершенно правы, но противоречий с моим текстом я не вижу.
Существует два определения backpropagation, в узком и широком смысле. В узком смысле backpropagation это техника для вычисления производных путем пропускания некоторой величины после прямого прохода. Эти производные дальше используются совместно с градиентными оптимизационными алгоритмами 1-го или 2-го порядка для коррекции весов нейросети. В широком, изначальном смысле Вербоса-Румельхарта-Хинтона, backpropagation — это техника получения производных 1-го порядка + простейший оптимизационный алгоритм, градиентный спуск, «два-в-одном». Когда говорят, «обучаю нейронные сети методом backpropagation» — как правило, имеют ввиду эту связку, а не способ получения самих производных по весовым коэффициентам. А под «новыми алгоритмами» я имел ввиду «более новые, чем backpropagation в широком смысле». Сами по себе методы оптимизации BFGS, Conjugate Gradients имеют, конечно, отдельную длинную историю.
Спасибо! Да, это правда — все что здесь написано, работает для разных моделей из арсенала средств машинного обучения: машин опорных векторов, логистической регреcсии, линейных моделей типа Адалина, а также статистических моделей, которые с нейросетями обычно редко ассоциируют: ARMAX, ARMA, AROMA, ARIMA + все это же с приставкой N- (=«нелинейный»). Просто нейросети — очень распространенная парадигма, поэтому я использовал ее как базовый пример для своей заметки.
Библиотеки Theano и MATLAB (через gpuArray) используют технологию NVidia CUDA, видеокарты AMD для них, увы, не подходят вообще. Может быть, уже есть хороший софт для обучения нейронных сетей на основе AMD, но я о таком пока не слышал. Смотрите совместимость с CUDA на сайте NVidia, выбирайте новые карточки — поколения 7x или, в крайнем случае, топовые карточки поколения 5x.
Симуляторов есть великое множество и выбор — это во многом вопрос вкуса. Лично мне очень нравится Netlab by Ian Nabney, на нем сделаны примеры для упомянутой в списке литературы «классической» книжки Кристофера Бишопа. Пакет Netlab — бесплатный. С одной стороны, в этом пакете реализованы мощные оптимизационные алгоритмы, а с другой стороны — метод реализации самих нейронных простой, основан на матрицах. Встроенный в MATLAB пакет Neural Network Toolbox тоже хороший, но более запутанный. Что касается GPU — на мой взгляд, самый сильный пакет это Theano, используйте его. Этот пакет позволяет одни и те же алгоритмы запускать как на CPU, так и на GPU, очень удобно. Еще с GPU умеет работать MATLAB новых версий — просто объявите вашу матрицу как тип gpuArray — и она автоматически будет считаться на видеокарте.
Еще ремарка насчет GPU, если собираетесь им заняться: не советую покупать карты Nvidia серии 6, типа 650GTX и т.д. Несмотря на хорошие параметры (количество процессоров и память), они плохо подходят для вычислительных задач, прироста в мощности может вообще не произойти.
«Note: A Fermi-generation GPU (GTX 4xx, GTX 5xx, or Tesla equivalent) is required to run this code. Older GPUs won't work. Newer (Kepler) GPUs also will work, but as the GTX 680 is a terrible, terrible GPU for non-gaming purposes, I would not recommend that you use it. (It will be slow).»
Взято отсюда: code.google.com/p/cuda-convnet/wiki/Compiling
Сейчас только что попробовал на машинке с GTX650 vs Core 2 Quad (да, процессор уже не новый, Core i7-4* его в пару раз побыстрее будет):
>> A=rand(1000,1000);, B=rand(1000,1000);
>> tic, C=A*B;, toc
Elapsed time is 0.101666 seconds.
>> A_gpu = gpuArray(A);,B_gpu=gpuArray(B);
>> tic, C_gpu=A_gpu*B_gpu;, toc
Elapsed time is 0.001841 seconds.
Перемножение получилось в 10 раз быстрее.
>> tic, D = inv(A);, toc
Elapsed time is 0.142409 seconds.
>> tic, D_gpu = inv(A_gpu);, toc
Elapsed time is 0.229812 seconds.
А взятие обратной матрицы — почти в 2 раза медленнее.
Рекуррентные сети являются deep-моделями де-факто, не не считаются такими из-за устоявшейся терминологии. Да, это как в медицине — как привыкли, так и пишут. То, что последовательность линейных слоев сводится к одному линейному слою — поверьте, я это понимаю. ) Кстати, у SVM внутри нету никаких иерархий нелинейных преобразований — это по сути линейная модель, ее способность работать с нелинейными данными происходит из-за того, что она оперирует в пространстве большой размерности, неявно заданном нелинейным ядерным преобразованием.
Кросс-валидация — это прием обучения, когда выборка делится на k равных частей, взятых произвольным образом. Затем на k-1 частях производится обучение, на одной оставшейся — тестирование. И так k раз, конечный результат усредняется. Но как я уже писал, это вещь бывает коварная из-за своего «произвольного» стиля отборка данных в k частей. Валидация должна быть правильная, т.е. максимально приближенная к реальной жизненной ситуации, с которой столкнется система распознавания.
Действительно, у глубоких нейронных сетей (deep neural networks) скрытых слоев нейронов обычно больше, чем один — например, 4 или 6. Хинтон в своей пионерской статье 2006-го года по DNN пишет, что в неокортексе человека 6 слоев нейронов, если я не ошибаюсь, и это его дополнительно мотивировало. Но много нейронов — это тоже очень важный аспект, характеризующий глубокие нейронные сети. Я видел на хорошей конференции работу, где под «глубокой нейронной сетью» понималась SVM с миллионом свободных параметров, где вообще никаких слоев нету.
Моя личная точка зрения, я здесь абсолютно не претендую на истину в последней инстанции — все же именно большое количество настраиваемых параметров более выпукло характеризует эту научную область, поскольку нейронные сети большим количеством слоев активно встречаются в природе с 1990-х годов, и используются сейчас — просто они по-другому называются. Я имею ввиду рекуррентные нейронные сети (Recurrent Multilayer Perceptron, RMLP, сеть NARX и сеть Эльмана), которые обучаются методом обратного распространения ошибки во времени (Backpropagation Through Time, BPTT). Посмотрите MATLAB — там эти модели сидят давно и плотно в Neural Networks Toolbox, это известные вещи, не экзотика какая-нибудь. Техника такого обучения состоит в том, что рекуррентная нейронная сеть «разворачивается назад во времени» — представляется как многослослойный персептрон с большом количеством слоев, каждый слой соответствует какому-то прошлому такту. По сути получается многослойный персептрон с большим количеством слоев, у Данила Прохорова из Тойоты количество слоев было h=20, который потом обучают. Чем не глубокая сеть?
Существует два определения backpropagation, в узком и широком смысле. В узком смысле backpropagation это техника для вычисления производных путем пропускания некоторой величины после прямого прохода. Эти производные дальше используются совместно с градиентными оптимизационными алгоритмами 1-го или 2-го порядка для коррекции весов нейросети. В широком, изначальном смысле Вербоса-Румельхарта-Хинтона, backpropagation — это техника получения производных 1-го порядка + простейший оптимизационный алгоритм, градиентный спуск, «два-в-одном». Когда говорят, «обучаю нейронные сети методом backpropagation» — как правило, имеют ввиду эту связку, а не способ получения самих производных по весовым коэффициентам. А под «новыми алгоритмами» я имел ввиду «более новые, чем backpropagation в широком смысле». Сами по себе методы оптимизации BFGS, Conjugate Gradients имеют, конечно, отдельную длинную историю.
Еще ремарка насчет GPU, если собираетесь им заняться: не советую покупать карты Nvidia серии 6, типа 650GTX и т.д. Несмотря на хорошие параметры (количество процессоров и память), они плохо подходят для вычислительных задач, прироста в мощности может вообще не произойти.