Нейронные сети: сбор требований, разработка архитектуры
От: vdimas Россия  
Дата: 17.11.06 15:10
Оценка:
Ветка создана для обсуждения требований к библиотеке и парралельной разработки первого приближения архитектуры.

Ниже это поста будут тематические подразделы для обсуждения.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Терминология, семантика имен в интерфейсах
От: vdimas Россия  
Дата: 17.11.06 15:44
Оценка:
Предлагаю обсуждение терминологии вести в этой подветке.




Нейронные сети пользуются терминологией напрямую из биологии.

Кратко:

Аксон (Axon) — окончание нейрона, которое передает сигнал другим нейронам или "исполнительным механизмам". Предлагаю так называть идентификаторы, относящиеся к выходным сигналам.

Дендрит (Denrite, Dendrite) — входной рецептор нейрона.

Синапс (Synapse) — место и способ контакта входного дендрита и источника сигнала, от св-в синапса зависит коэф. передачи входного сигнала дендриту. Предлагаю этим термином именовать коэф. при входном контакте нейрона.

Передаточная ф-ия, ф-ия активации — функция преобразования суммы входных сигналов в выходной сигнал. (Наиболее популярна т.н. сигма-функция, близкая по характеристику к природной ф-ии). Предлагаю идентификаторы: ActivationFunc или Sigmoid.

Остальные термины наверняка самопонятные:
Neuron, Layer, Network.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Сбор требований к библиотеке
От: vdimas Россия  
Дата: 17.11.06 15:44
Оценка:
Здесь и ниже предлагаю оставлять свои пожелания к библиотекам/фреймворку. В свободной форме.

Начну с себя:

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

2. Желательно иметь максимальную гибкость и возможность трассировки/рассмотрения любых процессов в сети в периоды обучения (или просто в исследовательских целях).

3. Желательно иметь наиболее эффективную реализицию для работающего "релизного" варианта сети, т.е. работа уже обученной сети должна быть наиболее эффективна (как с т.з. потребляемой памяти, так и с т.з. быстродействия). Возможно, что представлять нейронные будут разные объекты для этапа обучения и для этапа реализации. Надо будет озаботиться задачей кодирования состояния сети, задачей загрузки и выгрузки.

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

5. Наверняка потребуется как минимум 2 способа представления данных — double и float. Вопрос может быть слегка преждевременный, но надо помнить, что для многих задач float-а вполне достаточно, а всевозможные модные инструкции потоковой обработки работают именно с float, что может дать выигрыш в эффективности во многие разы по сравнению с double. (Первоначально предлагаю выбрать double для первого приближения, а там видно будет , но в уме держим)

6. Продумать способы реализации визуализации. (Подсмотреть в готовых пакетах, например). Реализовать GUI-библиотеку необходимых элементов и "обвеску" вокруг них.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Сбор требований к библиотеке
От: Igor S Mandrigin Россия
Дата: 17.11.06 15:56
Оценка:
1. Хочется, чтобы функцию нейрона можно было задавать самому, но при этом приветствуются некоторые предварительно заданные функции.

2. Возможность подключения/отключения визуализации работы сети
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Разработка архитектуры, основных интерфейсов и типов данных
От: vdimas Россия  
Дата: 17.11.06 19:08
Оценка:
Отталкиваясь от текущих вариантов требований и терминологии, попытаюсь начать разработку фреймворка:


Предлагаю состав библиотек:
Neuro.Core — базовые понятия и алгоритмы, так же предлагаю включить реализации для наиболее популярных типов сетей.
Neuro.Diagnostic — ср-ва диагностики и наблюдения.
Neuro.Design — если потребуется разработать дизайнеры для VS, предлагаю их сваливать сюда
Neuro.Windows.Forms — библиотека элементов визуализации
Neuro.Windows.Forms.Design — соответственно дизайнеры для визуальных эелемнтов

Прикладные варианты реализации сетей именовать в стиле:
Nero.NameOfNetworkType, соответственно если нужны дизайнеры, то для имени сборки под них приписать .Design в конце.



Начинать будем с Neuro.Core, наверно

Из моих представлений к требованиям и недолгих рассуждений пока накатал следующее:

1. Источники данных, коэф. при входных сигналах. 4-е требование отсюда
Автор: vdimas
Дата: 17.11.06

Наверняка первое, что приходит в голову, это что-то типа:
interface ISignalPin {
    double Signal {get; }
}


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

Может так:
interface ISignalSource {
    double Signal[int index] { get; }
    int Count { get; }
}

Вообще-то, тоже не фонтан для тех же изображений, ибо каждый раз перегонять double-значение через вируальную ф-ию для примитивной (но самой частовыполняющейся!!!) операции умножения на коэф?

Может быть стоит поручить хранить синапсы не нейрону, а адаптеру данных? Типа такого:
    /// Set of synapses
    public interface ISynapses
    {
        /// Count of denrites
        int Count { get; }

        /// Get current value of synapse
        /// <param name="index">index of denrite</param>
        double this[int index] { get; set; }

        /// Get synapse sum of input signals
        double CalculateSignals();
    }

Итак, пусть это будет коллекция синапсов с прямым доступом, которая инкапсулирует в себе процедуру получения взвешенных сумм из своих текущих данных (тем более, что данные могут быть произвольного типа, необязательно double). Суть в том, что такая коллекция должна быть своя для каждого нейрона, т.е. сам источник данных пусть представляет из себя фабрику таких коллекций:
    public interface ISynapsesFactory
    {
        /// Count of output signals
        int Count { get; }

        /// Factory method
        /// <returns>Created synapses for internal signals</returns>
        ISynapses CreateSynapses();
    }


В принципе, мне нравится и первый вариант, он будет порой более удобным для реализации, но никто не мешает сделать простейший адаптер первого во второй:
    /// ISignalSource to ISynapsesFactory adapter
    public class SignalSourceAdapter : ISynapsesFactory
    {
        private ISignalSource _source;

        public SignalSourceAdapter(ISignalSource source) {
            if (source == null)
                throw new ArgumentNullException("source");

            _source = source;
        }
        
        /// Useful variant
        public static ISynapses SynapsesFrom(ISignalSource source) {
            if(source == null)
                throw new ArgumentNullException("source");

            return new SignalSourceSynapses(source);
        }

        /// Factory method
        /// <returns>Created synapses for internal signals</returns>
        public ISynapses CreateSynapses() {
            return new SignalSourceSynapses(_source);
        }

        /// Count of output signals
        public int Count {
            get { return _source.Count; }
        }

        /// Realization of ISynapses logic
        private class SignalSourceSynapses : ISynapses
        {
            private readonly ISignalSource _source;
            private double[] _synapses;

            public SignalSourceSynapses(ISignalSource source) {
                _source = source;
                _synapses = new double[source.Count];
            }

            /// Get synapse summ of input signals
            /// <returns></returns>
            public double CalculateSignals() {
                double sum = 0;

                for (int i = 0; i < _synapses.Length; i++)
                    sum += _source[i]*_synapses[i];

                return sum;
            }

            /// Count of denrites
            public int Count {
                get { return _synapses.Length; }
            }

            public double this[int index] {
                get { return _synapses[index]; }
                set { _synapses[index] = value; }
            }

            /// Source Neuron
            public ISignalSource SignalSource {
                get { return _source; }
            }
        }
    }


Итак, базовый нейрон:
    public abstract class Neuron
    {
        protected double _axon;

        public double Axon {
            get { return _axon; }
        }

        public abstract ISynapses Synapses { get; }
    }

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

Так же очень не хочется делать полностью абстрактный интерфейс для нейронов, именно из соображения эффективности доступа к полу _axon, в указанном варианте у JIT-а будет больше шансов оптимизировать вычисления.

Далее, интерфейс слоя нейронов:
    /// Calculation Layer interface
    public interface ILayer : ISynapsesFactory
    {
        void Initialize();

        void Propagate();

        ISignalSource Output { get; }
        
        void SetSignalSource(ISynapsesFactory source);
    }


Думаю, интерфейс сети не будет сильно отличаться от интерфейса слоя. Разве что добавятся методы сохранения/восстановления сети.

Есть так же уже базовый довольно-таки функциональный класс Layer, готовлю так же тип нейрона и класс слоёв для простой сети прямого распространения и станартного алгоритма обучения BackPropagation. Выложу в начале недели.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Разработка архитектуры, основных интерфейсов и типов дан
От: Igor S Mandrigin Россия
Дата: 18.11.06 11:10
Оценка:
Здравствуйте, vdimas, Вы писали:

[skipped]


А как будет реализована диагностика? Ведь там возможно необходимо будет получить доступ к коеффициентам слоя, функции итд... =))
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Нейронные сети: сбор требований, разработка архитектуры
От: Simplicity  
Дата: 18.11.06 21:00
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Ветка создана для обсуждения требований к библиотеке и парралельной разработки первого приближения архитектуры.


V>Ниже это поста будут тематические подразделы для обсуждения.



Меня интересует, каким образом планиуете прикручивать к библиотеке алогоритмы обучения?И как их собственно реализовывать так,чтобы они были работоспособны на любых функциях активации и любых типах сетей? (не очень представляю,честно).Просто если написать один базовый алгоритм и брать его как единственный для всех сеток и типа универсальный, то :
а)такого не найти
б)"библиотека" перестает быть самой собой, то есть вещью мощной и многограннойона просто теряет смысл..
в)рано или поздно придеться добавляет другие

По-моему,это большая проблема,как для данной задачи, так и вообще для реализации нейронок.
Что собираетесь с этим делать?
(если нужна помощь,то всегда на связи по 311484555(Marya))
Re[2]: Нейронные сети: сбор требований, разработка архитекту
От: vdimas Россия  
Дата: 19.11.06 11:39
Оценка:
Здравствуйте, Simplicity, Вы писали:



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


Процесс обучения сети во многом творческий, может получится так, что конкретную сеть обучить невозможно для конкретного набора входных сигналов, например из-за недостаточно мощной структуры или неверно подобранной ф-ии активацтт. Я себе вижу задачу в предоставлении удобного инструмента для экспериментов и исследований.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Нейронные сети: сбор требований, разработка архитекту
От: Igor S Mandrigin Россия
Дата: 19.11.06 12:00
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Simplicity, Вы писали:




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


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


Да ладно... Сеть, конечно может не сходиться, но обучаться-то она должна =)) А иначе, собстно зачем сеть.
Просто, может быть придется давать механизмам обучения полный доступ к сети, в слое и к каждому нейрону =))
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Терминология, семантика имен в интерфейсах
От: vdimas Россия  
Дата: 19.11.06 23:39
Оценка:
Здравствуйте, vdimas, Вы писали:

Наткнулся на сжатую и наглядную вводню инфу: http://www.basegroup.ru/neural/math.htm
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Нейронные сети: сбор требований, разработка архитекту
От: vdimas Россия  
Дата: 19.11.06 23:52
Оценка:
Здравствуйте, Igor S Mandrigin, Вы писали:


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


ISM>Да ладно... Сеть, конечно может не сходиться, но обучаться-то она должна =)) А иначе, собстно зачем сеть.

ISM>Просто, может быть придется давать механизмам обучения полный доступ к сети, в слое и к каждому нейрону =))

А зачем полный? Доступа по-чтению достаточно, чтобы понять, что происходит.

Я себе так вижу некий компонент для обучения:
— компонент инкапсулирует некий алгоритм обучения
— компонент имеет открытые св-ва, которые управляют параметрами сети (например, для полносвязной сети, обучаемой по методу BP, нам нужны параметры: кол-во нейронов в первом слое, в последнем, кол-во скрытых слоев и кол-во нейронов по каждому из них, ф-ия активации).
— компонент умеет сохранять настроенные весовые коэф и прочие параметры, требуемые для парной "run-time" реализации. Т.е. для конкретного применения предполагается 2 проекта: один обучающий, использующий компонент, в котором много чего есть для целей обучения, второй целевой, который содержит результаты обучающего проекта как данные, и "run-time" реализацию первого типа компонента (т.е. реализация без всех наворотов, связанных с обучением, т.е. "голые" нейроны и их веса).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Разработка архитектуры, основных интерфейсов и типов дан
От: Code  
Дата: 20.11.06 07:27
Оценка:
Я думаю, что должен пристуствовать механизм указывающий, будет ли каждый нейрон слоя иметь одинаковую функцию активации или у всех она будет своя. Это нужно для полиномиальных сетей.
Re[5]: Нейронные сети: сбор требований, разработка архитекту
От: Code  
Дата: 20.11.06 07:33
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Igor S Mandrigin, Вы писали:



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


ISM>>Да ладно... Сеть, конечно может не сходиться, но обучаться-то она должна =)) А иначе, собстно зачем сеть.

ISM>>Просто, может быть придется давать механизмам обучения полный доступ к сети, в слое и к каждому нейрону =))

V>А зачем полный? Доступа по-чтению достаточно, чтобы понять, что происходит.


V>Я себе так вижу некий компонент для обучения:

V>- компонент инкапсулирует некий алгоритм обучения
V>- компонент имеет открытые св-ва, которые управляют параметрами сети (например, для полносвязной сети, обучаемой по методу BP, нам нужны параметры: кол-во нейронов в первом слое, в последнем, кол-во скрытых слоев и кол-во нейронов по каждому из них, ф-ия активации).
V>- компонент умеет сохранять настроенные весовые коэф и прочие параметры, требуемые для парной "run-time" реализации. Т.е. для конкретного применения предполагается 2 проекта: один обучающий, использующий компонент, в котором много чего есть для целей обучения, второй целевой, который содержит результаты обучающего проекта как данные, и "run-time" реализацию первого типа компонента (т.е. реализация без всех наворотов, связанных с обучением, т.е. "голые" нейроны и их веса).

Полностью с вами согласен и поддерживаю. Это два разных этапа, но нужно еще учесть возможность дообучения сети на вновь появившихся данных, которые уже прошли свой порог упреждения и являются фактическими.
Re: Терминология, семантика имен в интерфейсах
От: Code  
Дата: 20.11.06 07:57
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Предлагаю обсуждение терминологии вести в этой подветке.



V>

V>Нейронные сети пользуются терминологией напрямую из биологии.

V>Кратко:


V>Аксон (Axon) — окончание нейрона, которое передает сигнал другим нейронам или "исполнительным механизмам". Предлагаю так называть идентификаторы, относящиеся к выходным сигналам.


V>Дендрит (Denrite, Dendrite) — входной рецептор нейрона.


V>Синапс (Synapse) — место и способ контакта входного дендрита и источника сигнала, от св-в синапса зависит коэф. передачи входного сигнала дендриту. Предлагаю этим термином именовать коэф. при входном контакте нейрона.


V>Передаточная ф-ия, ф-ия активации — функция преобразования суммы входных сигналов в выходной сигнал. (Наиболее популярна т.н. сигма-функция, близкая по характеристику к природной ф-ии). Предлагаю идентификаторы: ActivationFunc или Sigmoid.


V>Остальные термины наверняка самопонятные:

V>Neuron, Layer, Network.

А как мы будем называть ошиюку данного нейрона и общую ошибку сети, корректирующий вес член?
Мои предложения:
GlobalError — сетевая ошибка
LocalError — ошибка данного нейрона
Re[2]: Разработка архитектуры, основных интерфейсов и типов
От: vdimas Россия  
Дата: 20.11.06 13:11
Оценка:
Здравствуйте, Code, Вы писали:


C>Я думаю, что должен пристуствовать механизм указывающий, будет ли каждый нейрон слоя иметь одинаковую функцию активации или у всех она будет своя. Это нужно для полиномиальных сетей.


Это упоминалось в сборе требований, согласен. Это можно сделать простым наследованием. В текущей версии есть довольно-таки функциональные generic-реализации классов слоев, позволяющие специфицировать тип нейрона для реализации слоя.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Нейронные сети: сбор требований, разработка архитекту
От: vdimas Россия  
Дата: 20.11.06 13:11
Оценка:
Здравствуйте, Code, Вы писали:


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


Разумеется, для прложений, где требуется динамическое "доучивание", должен использоваться компонент, который позволяет доучивание.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Терминология, семантика имен в интерфейсах
От: vdimas Россия  
Дата: 20.11.06 15:59
Оценка:
Здравствуйте, Code, Вы писали:



C>А как мы будем называть ошиюку данного нейрона и общую ошибку сети, корректирующий вес член?

C>Мои предложения:
C>GlobalError — сетевая ошибка
C>LocalError — ошибка данного нейрона

Тогда еще надо:
— момент
— скорость обучения (скорость спуска)
— средневзвешенная ошибка
— макс.ошибка
— эпоха
— смещение начальной точки
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Терминология, семантика имен в интерфейсах
От: Code  
Дата: 21.11.06 07:44
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Code, Вы писали:




C>>А как мы будем называть ошиюку данного нейрона и общую ошибку сети, корректирующий вес член?

C>>Мои предложения:
C>>GlobalError — сетевая ошибка
C>>LocalError — ошибка данного нейрона

V>Тогда еще надо:

V>- момент
V>- скорость обучения (скорость спуска)
V>- средневзвешенная ошибка
V>- макс.ошибка
V>- эпоха
V>- смещение начальной точки

Момент — что имеется ввиду под этим понятием? По повобу ошибок я сделаю отдельный пост, здесь очень тонкий вопрос, мы его еще обсудим.
Давайте обозначим эпоху переменной — Age. Их колличество может быть выбрано как автоматическим образом, так и задано извне. Смещение начальной точки — в сути этого слогаемого надо еще разобраться, понять как его правильно инициализируют и что оно дает для расчетом (я инитил его случайным образом и просто включял и выключал из расчетов — именения были неразлечимые).
Нейронные сети: сбор требований, разработка архитектуры
От: Аноним  
Дата: 21.11.06 08:25
Оценка:
Здравствуйте!
Предлагаю Вам воспользоваться уже готовой библиотекой для работы с нейронными сетями. Я уже около года ею пользуюсь. Мне нравится. Точнее это объектно-ориентированная база знаний. Она распространяется бесплатно. Есть исходники за исключением ядра.
Домашняя страница этой ООБЗ находится здесь: http://www.shuklin.com/ai/ht/ru/cerebrum/
На конкурсе была заявка: http://contest2005.gotdotnet.ru/Request/Tools/UtilitiesLib/163171.aspx
Есть форум, который работает на основе этой базы знаний: http://www.shdsoftware.com/go/00000000002gc9j5ce408335u0.aspx
Он был создан для тестирования ООБЗ Церебрум и прекрасно работает.
С ув. Сергей.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Ошибки сети
От: Code  
Дата: 21.11.06 09:10
Оценка: +1
Формула ошибки сети и сама ошибка не должна ассоциироваться только с среднеквадратическим отклонением, а с лучшей метрикой выходного сигнала. Например, если мы подаем на вход ценовой ряд, то в качестве ошибки сети можно ставлять минимальный уровен прироста нашего еквити, с учетом открытой позиции. Если мы просто аппроксимируем функцию, то конечно лучше прибегнуть к стандартному среднеквадратическому отклонению. Т.е. практическая реализация накладывает достаточно большие и веские условия на математику сети. Я предлагаю разбить решаемые сетью задачи на default, математика, экономики, выделение признаков, а уже в каждом классе задач определить в интерфейсах нужный класс функций оибок сети. Что касается внутренней ошибки веса нейрона, то она полностью определяется выбранным алгоритмом реалищации сети — обратное распространение, сеть Коханена, сеть Хапфилда — и функцией активации.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.