singlepost

Исскуственные нейронные сети << На главную или назад  

Здравствуйте,

интересует следующий вопрос, кто занимается разработкой нейросетей (особенно интересно, кто в реальных проектах), какими средствами пользуетесь при проектировании, какой литературой?

еще очень интересно, на каком из языков программирования (в частности интересует разница в программировании ИНС на Haskell, Lisp, C++) получается более эффективное программирование нейросетей в отношении – затрачиваемое время проектирования / производительность?

62 ответов в теме “Исскуственные нейронные сети”

  1. 36
    Марина Сокол ответил:

    Скорее всего у тебя уже такая книга есть, но вдруг нет:
    Саймон Хайкин. Нейронные сети
    У меня написан редактор для создания и обучения рекурентных НС на java(пишется быстро). По скорости — вполне сносно для небольших сетей. Если у кого есть пример большой сети с кучей слоев (желательно с рекуррентностью), которая точно обучается – то заделитесьее архитектурой и входными выходными данными, интересно опробовать на своей программе. Не попадались мне еще такие. В основном маленькие сети используют.

  2. 35
    Андрей Горбоконь ответил:

    Дмитрий,
    вы сначала написали неполное название книги :)
    У меня эта книга в бумажном варианте есть..
    Всеравно спасибо за активность, может кому-нибудь понадобиться

  3. 34
    Константин Смотритель ответил:

    Хм… Ээээ…. С работами Мак Каллока знаком? =) Там ещё Винер участвовал, когда они кошек резали… ?

  4. 33
    Константин Смотритель ответил:

    Аська, кстати, у меня в инфе есть. Будешь стучаться – напмни, кто и откуда =)

  5. 32
    Дмитрий Лысанов ответил:

    вот обещанная книга:
    //ifolder.ru/7702293

  6. 31
    Андрей Горбоконь ответил:

    Константин,
    А можно вывесить примерчик с вентильными нейросетями?
    На С++ или Haskell..
    Просто смысл фразы 'распределения вероятностей "как в реальных нейроcетях" ' что-то не очень понятен..

  7. 30
    Константин Смотритель ответил:

    Я для нейросетей использовал С++… В одном из проектов возникла идея использовния распределения вероятностей "как в реальных нейроcетях" – по времени, что позволило использовать для вычисления XOR и обсчитывать 32 синапса за такт обращения к памяти (вентильные сети, как я их назвал). Производительность, однако, ИМХО определяется прежде всего возможностями сильного загрубления результата относительно действительных чисел (прочем, для большинства задач важна сложность сети, а не быстроействиездесь вентильным сетям, похоже, нет равных). На других языках такое возможно только в native-библиотеках… То есть нигде, кроме как на С/С++, битовые операции эффекивно не реализовать (или я не знаю как).

    Однако, эксперименты оказали, что у Intel черезвычайо мощный математический сопроцессор – при одинаковой точности выигрыш (ну, или уравнивание результатов – не помню уже) идёт только за счёт использоания XOR и меньшего использовани кеша процессора. Полагаю, что если нейронная библиотека МАТЛАБили Статистики (Statistica Neureal Networks, вроде) реализована на нативном коде (включая процедуры обучения), то относительно этих библиотек особого бысродействия на обычных (не вентильных) нейросетях только за счёт С++ не добиться.

    Что касется удобства – так тут какой язык привычней, хотя на Haskell потециально проще написать программу моделирования нейросетей (из-за отсутствия побочных эфектов, для чего в Ява/C#/С++/Lisp нужны годы опыта; Lisp – не чистый язык, а OCaml же (тоже не идеально чистый) много медленее Haskel – кажетя, он через виртуальную машину работает).

    Если нужна скорость – следует обратить взоры на GPU (см. вершинные и пиксельые шейдеры – ничего не напоминает? Там реализована обычная свёртка =) – доступ через DirectX или XNA (C#) или OpenGL… язык тут тоже е имеет значения – всё равно на языке шейдеров придётся кодить =( Или использовать специализированные микропроцессоры – из наилучших (и дешёвых, плата порядка17 т.р., процессор 50$ стоили) NM6403…или 04 – не припомню уже =) Кстати, nVidia с год назад нащупали эту ниш и предлагают "ускорители" на базе своих GPU – но, факт, что ЛЮБАЯ видеокарта с поддержкой шейдеро может ускорять свёртку, если у программиста руки на месте =)

  8. 29
    Константин Смотритель ответил:

    Да, голос за Haskell – ИМХО перспективный и уже юзабельный (см. АлёнаС++ 3D игра haskell)

  9. 28
    Алексей Бобьяков ответил:

    Не по теме, Дмитрий Шилоносов, сравни определение Monkey Patching, Smalltalk class extension, C# extension method и найди десять отличий:
    //en.wikipedia.org/wiki/Monkey_patching
    //www2.instantiations.com/VAST/Docs/sg/stug121….
    //msdn.microsoft.com/en-us/library/bb383977.aspx

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

  10. 27
    Андрей Горбоконь ответил:

    Прекращаем.. дальше посты только по программированию и проектированию ИНС

  11. 26
    Дмитрий Шилоносов ответил:

    >>return (x.a==2);
    вот тут вы явно указываете метод, да?
    а у моём примере название этого метода можно хоть с клавиатуры ввести.
    чувствуете разницу?
    да и коллекция у вас всё ещё гомогенная.

    ну всё. тут мне стало скучно. давайте прекратим.

  12. 25
    Андрей Горбоконь ответил:

    Я наверное не так понял сначала

    #include <vector>
    #include <algorithm>
    using namespace std;

    class A
    {
    private:
    public:
    int a;
    A()
    {
    a = 0;
    }
    A(int n)
    {
    a = n;
    }
    };

    bool predicate(const A&x)
    {
    return (x.a==2);
    }

    int main()
    {
    vector<A> v;
    v.push_back(A());
    v.push_back(A(0));
    v.push_back(A(2));
    find_if(v.begin(),v.end(),predicate);

    return 0;
    }

    Если это то, что требовалось,
    то собственно ничего не изменилось в реализации самого поиска:

    find_if(v.begin(),v.end(),predicate);

    А предикат конечно да:

    bool predicate(const A&x)
    {
    return (x.a==1);
    }

  13. 24
    Андрей Горбоконь ответил:

    Ну полный вариант так:

    #include <vector>
    #include <algorithm>
    using namespace std;

    bool predicate(int n)
    {
    return (n!=0);
    }

    int main()
    {
    vector<int> v = vector<int>(1024, 0);
    v.push_back(1);
    vector<int>::const_iterator i = find_if(v.begin(),v.end(),predicate);
    return 0;
    }

    Ну естественно сам момент поиска:
    vector<int>::const_iterator i = find_if(v.begin(),v.end(),predicate);

    Более трудоемко? Я б не сказал..

  14. 23
    Дмитрий Шилоносов ответил:

    Андрей (aka md6) Горбоконь:
    Вот счас не понял, а где указывается название метода экземпляра класса в коллекции, по значению которого происходит поиск?
    Тут у вас простой поиск по коллекции целочисленных элементов, в то время как я просил поиск для гетерогенной коллекции :)

    >Более трудоемко? Я б не сказал..
    уверен, трудоёмкость – это субъективный показатель.

    И вообще, дискуссия сводится к писькомеринью и яйцевзвешиванию.
    Предлагаю прекратить :)

  15. 22
    Дмитрий Шилоносов ответил:

    Алексей Claymore Бобьяков:
    >>Monkey Patching
    Неа, не угадали. Это известно как Class Extension.
    А про Monkey Patching вы говорите так, как будто это какое-то зло :)

    >Хотя D не готов к массовому применению (ошибки в компиляторе там, >увы, не так уж редки), он вполне может оказаться пригодным для >конкретного проекта.

    Несомненно. С этим утверждением я согласен :)

  16. 21
    Дмитрий Шилоносов ответил:

    Андрей (aka md6) Горбоконь:
    Вы зачем в этот рейтинг смотрите?
    (Visual) Basic10.857%
    COBOL0.358% :) )) это вообще не показатель.

    Я не утверждаю что существуют задачи, технически не реализуемые на каком-либо языке. Я говорю о том, что на одном из языков задача имеет гораздо более изящное и лёгкое решение, чем на другом.
    Большую роли при этом, несомненно играет стандартная библиотека.
    К примеру поиск в массиве элемента по _заданному полю_ и его значению на Смолток выглядит так:

    searchElementBy: aSymbol withValue: anObject
    collection select:[:each | (each perform: aSymbol) = anObject]

    Уверен, что такая задача на С++ имеет гораздо более трудоёмкое решение :D . Кстати, интересно посмотреть на её решение ;)

  17. 20
    Дмитрий Лысанов ответил:

    как дамой приду, выложу

  18. 19
    Андрей Горбоконь ответил:

    //www.tiobe.com/index.php/content/paperinfo/tpc...
    Общепризнанный рейтинг популярности языков программирования
    D – 1.357%
    Smalltalk – 0.113%
    Но из рассмотрения думаю можно убрать :)

    >Послушайте, у вас же нет опыта работы со Smalltalk? Как же вы так безаппеляционно заявляете?

    Вы же меня аппелируюте, значит не безаппеляционно :)
    Думаю по этому вопросу действительно мне спорить не стоит из-за отсутствие опыта работы с SmallTalk =D, но факт остается фактом, что представленные задачи не являются неразрешимыми на С++

    Первая решается template'ами, а вторая – созданием класс-адаптера над примитивом int :)

  19. 18
    Алексей Бобьяков ответил:

    Дмитрий Шилоносов:
    > Класс Integer в смолтоке может запросто заиметь себе не только такой метод, но и кучу любых других :)

    Это известно как Monkey Patching, не такая уж хорошая штука, кстати. Что-то подобное можно сделать на Haskell, сохраняя при этом строгую типизацию.

    > Тогда этот язык можно исключить из рассмотрения, согласны? :)

    Хотя D не готов к массовому применению (ошибки в компиляторе там, увы, не так уж редки), он вполне может оказаться пригодным для конкретного проекта.

  20. 17
    Дмитрий Шилоносов ответил:

    >в С++ все используют для этого template – те же самые (если не шире) >возможности + контроль во время компиляции, согласитесь же :) что >выявление ошибок во время компиляции удобнее чем во время >выполнения ))
    Послушайте, у вас же нет опыта работы со Smalltalk? Как же вы так безаппеляционно заявляете?
    На чём основано ваше мнение? На том, что вы работали на C++? :)
    Тут я с вами не соглашусь на основании своего опыта :)

    Ниразу не шире. если у примитива int нет метода, который печатает строку с самим собой, то и не будет. Класс Integer в смолтоке может запросто заиметь себе не только такой метод, но и кучу любых других :)

    >D – абсолютно практический язык программирования, >производственным я бы его не назвал, потому что конечно проектов >чисто коммерческих не нем написано достаточно мало.
    Тогда этот язык можно исключить из рассмотрения, согласны? :)

  21. 16
    Андрей Горбоконь ответил:

    >Если вы гонитесь за скоростью – ваш выбор микроконтроллеры, программируемые микроконтроллеры и местные с-подобные языки.

    я за удобность не в ущерб производительности и за производительность не в ущерб удобности, к примеру виртуальная машина – в действительности – кроссплатформенность в ущерб производительности, когда в то же время С++ также кроссплатформенный

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

    в С++ все используют для этого template – те же самые (если не шире) возможности + контроль во время компиляции, согласитесь же :) что выявление ошибок во время компиляции удобнее чем во время выполнения ))

    >За ссылку спасибо, посмотрю. А этот язык, D, он является промышленным языком как Smalltalk или C++, или он чисто академический?

    D – абсолютно практический язык программирования, производственным я бы его не назвал, потому что конечно проектов чисто коммерческих не нем написано достаточно мало.

  22. 15
    Дмитрий Шилоносов ответил:

    >Тем не менее smalltalk компилируется в байт-код для виртуальной >машины,
    >что естественно плохо сказывается на производительности >программы, особенно для программ с большим количеством >вычислений, таких как нейросети. Согласны?

    Согласен :) Однако //talklikeaduck.denhaven2.com/articles/2006/09/...
    Смолток не является языком для создания высокопроизводительных приложений, в отличии от C++. Это язык для создания высокоэффективного кода :) Простого, понятного, удобного.
    Если вы гонитесь за скоростью – ваш выбор микроконтроллеры, программируемые микроконтроллеры и местные с-подобные языки.

    >Это каким образом структуры могут помешать? :)

    А вы попробуйте вместо числа передать null :)

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

    Это тонкий вопрос. Я два года работал на VisualWorks Smalltalk. У меня не разу небыло проблемы, когда динамическая типизация доставляла мне проблемы. На мой взгляд гибкость, получаемая в следствии отсутствия статической типизации превосходит все возможные негативные последствия.
    Например:
    В Смолтоке вы можете создать один метод, занмающийся некоторыми арифметическими операциями, например умножением :) В силу отсутствия статической типизации вам не важны классы параметров этого метода, тоесть не имеет значения экземпляры каких классов будут аргументами этого метода – целочисленные, с плавающей запятой или какого-то третьего, пользовательского класса. Согласитесь это удобно :)

    >Пожалуй смолтолку не тягаться с С++ по размеру сообщества, это >так, тоже к слову =)

    Давайте будем учитывать, что на С++ пишут как высококласные специалисты, так и полные дегенераты :) Входной порог в сообщество Smalltalk на мой взгляд выше :)

    За ссылку спасибо, посмотрю. А этот язык, D, он является промышленным языком как Smalltalk или C++, или он чисто академический?

  23. 14
    Андрей Горбоконь ответил:

    Ну, естественно, когда я просил аргументацию, я имел ввиду почему смолток является идеалом для программирования нейросетей (сабж)

    >Тем не менее, язык не является интерпретируемым

    Тем не менее smalltalk компилируется в байт-код для виртуальной машины,
    что естественно плохо сказывается на производительности программы, особенно для программ с большим количеством вычислений, таких как нейросети. Согласны?

    > Смолток является чисто объектным языком. Никакие несуразицы типа структур не могут вам помешать

    Это каким образом структуры могут помешать? :)

    >Смолток – язык динамической типизации. Вы можете посылать любые сообщения любому объекту. Если объект не понимает такого сообщения – он ответит исключением.

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

    >Пожалуй это основное. В качестве рюшечек можно рассматривать большое сообщество, свободное распространение Squeak, и ORM GLORP

    Пожалуй смолтолку не тягаться с С++ по размеру сообщества, это так, тоже к слову =)

    D конечно молод еще, но при этом чем он мне нравится, он сочетает в себе простоту Java и быстродействие и возможности С++
    абсолютно ничем не уступает SmallTalk, разве что популярностью.
    //dprogramming.ru/d/

  24. 13
    Дмитрий Шилоносов ответил:

    Холивар!!!!!

    >>А вот почему SmallTalk идеал – аргументируйте, пожайлуста..
    >>чем смолток лучше чем C++ или D?

    Я совершенно уверен, что существуют узкоспециализированные языки, предназначенные для применения в узких областях. Например JavaSсript, Ruby или QuakeC :)
    С другой стороны, существуют языки общего назначения. Например C#, VB или Delphi.

    Это так, вступление/тезисы.

    Теперь про Smalltalk.
    ВНИМАНИЕ! Всё сказанное дальше является моим субъективным мнением.
    Итак. Смоллток является не столько языком, сколько идеалогией, объединяющей в себе несколько понятий: виртуальную машину, систему хранения исходного кода, среду разработки и сам язык.
    В настоящее время существует несколько Смоллток систем: Squeak, Dolphin Smalltalk и VisualWorks Smalltalk. Я не буду останавливаться подробно на особенностях данных систем. Это вы можете найти сами. В гугле ещё никого не банили :)

    Смолток представляет собой систему, в которой отсутствует понятия Run-time и Design-time. Тем не менее, язык не является интерпретируемым.
    Смолток является чисто объектным языком. Никакие несуразицы типа структур не могут вам помешать :D
    Смолток – язык динамической типизации. Вы можете посылать любые сообщения любому объекту. Если объект не понимает такого сообщения – он ответит исключением.
    Смолток – система с открытым исходным кодом. Вы можете посмотреть практически любой метод системы, и если он вам не нравится – изменить :)

    Пожалуй это основное. В качестве рюшечек можно рассматривать большое сообщество, свободное распространение Squeak, и ORM GLORP :)

    Сравнивать с языком D не могу, ибо не использовал.
    Теперь вы. Использовали ли вы язык смолток, и если да – сравните его с C++ или D :)

  25. 12
    Андрей Горбоконь ответил:

    Выкладывайте, посмотрим

  26. 11
    Андрей Горбоконь ответил:

    Пишу я и так на том, что знаю :)
    Но я считаю, что разнообразие существующих языков и парадигм дает возможность программисту выбирать оптимальный вариант под конкретные задачи – поэтому нужно двигаться вперед..
    А вот почему SmallTalk идеал – аргументируйте, пожайлуста..
    чем смолток лучше чем C++ или D?

  27. 10
    Дмитрий Лысанов ответил:

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

  28. 9
    Дмитрий Шилоносов ответил:

    пишите на том, что лучше знаете.
    идеал, конечно, Smalltalk :)

  29. 8
    Андрей Горбоконь ответил:

    За матлаб – спасибо, посмотрю – DLL это интересно
    Так получается он компилируется? или как?

    По поводу производительности Джавы только бенчмарк на основе нейросетей нас рассудит :)
    Есть желание написать XOR или что-нибудь посложнеена Java,
    а я на С++? И запустим на 10000-100000 итераций AdaLiNe или RLS

  30. 7
    Ванько Родригез ответил:

    >> Так получается он компилируется? или как?
    Да, в обычный виндовый бинарник.

    >> Есть желание написать XOR или что-нибудь посложнее на Java
    Неа, нет желания :)

  31. 6
    Ванько Родригез ответил:

    Андрей, у джавы все в порядке с вычислениями, так что не загнется.

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

  32. 5
    Андрей Горбоконь ответил:

    #2 и #4
    По поводу Явы и Скриптовых языков для Unix большие сомнения по поводу их производительности в вычислениях – напишите плиз какого размера вы разрабатывали ИНС. Я почти уверен, что на более-менее большой нейросети в несколько слоев Java загнется на N-тысячной итерации :(

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

    И еще один вопрос для всех – какого уровня сети вы разрабатывали и для каких целей?

    Естественно вопрос инструментария остается на повестке :)

  33. 4
    Ванько Родригез ответил:

    Попробуй Matlab :)

    Я писал на джаве.

  34. 3
    Aндpeй Бaлaшoв ответил:

    Любой скриптовый язык для Unix-shell:)))

  35. 2
    Дмитрий Паренский ответил:

    Использую Java, без каких либо дополнительных библиотек.

  36. 1
    Вадим Проценко ответил:

    Я на дельфи писал. Тоже для НС никаких готовых библиотек не использовал.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.