Предлагаю обсуждение терминологии вести в этой подветке.
Нейронные сети пользуются терминологией напрямую из биологии.
Кратко:
Аксон (Axon) — окончание нейрона, которое передает сигнал другим нейронам или "исполнительным механизмам". Предлагаю так называть идентификаторы, относящиеся к выходным сигналам.
Синапс (Synapse) — место и способ контакта входного дендрита и источника сигнала, от св-в синапса зависит коэф. передачи входного сигнала дендриту. Предлагаю этим термином именовать коэф. при входном контакте нейрона.
Передаточная ф-ия, ф-ия активации — функция преобразования суммы входных сигналов в выходной сигнал. (Наиболее популярна т.н. сигма-функция, близкая по характеристику к природной ф-ии). Предлагаю идентификаторы: ActivationFunc или Sigmoid.
Остальные термины наверняка самопонятные:
Neuron, Layer, Network.
Здесь и ниже предлагаю оставлять свои пожелания к библиотекам/фреймворку. В свободной форме.
Начну с себя:
1. Хотелось бы получить удобный в использовании набор библиотек, содержащие как базовые вещи, позволяющие строить свои типы нейронных сетей, так и большое кол-во реализованных популярных прикладных видов сетей с гибкой параметризацией. Желательно, чтобы в библиотеке были реализованы и открыты для использования всевозможные алгоритмы и параметризируемые ф-ии из около-нейронного направления.
2. Желательно иметь максимальную гибкость и возможность трассировки/рассмотрения любых процессов в сети в периоды обучения (или просто в исследовательских целях).
3. Желательно иметь наиболее эффективную реализицию для работающего "релизного" варианта сети, т.е. работа уже обученной сети должна быть наиболее эффективна (как с т.з. потребляемой памяти, так и с т.з. быстродействия). Возможно, что представлять нейронные будут разные объекты для этапа обучения и для этапа реализации. Надо будет озаботиться задачей кодирования состояния сети, задачей загрузки и выгрузки.
4. Предусмотреть в архитекутре возможность подавать разнородные источники данных: изображения, звуки и т.д. В библиотеке определить не только интерфейсы, но и реализации входных адаптеров для разных источников данных.
5. Наверняка потребуется как минимум 2 способа представления данных — double и float. Вопрос может быть слегка преждевременный, но надо помнить, что для многих задач float-а вполне достаточно, а всевозможные модные инструкции потоковой обработки работают именно с float, что может дать выигрыш в эффективности во многие разы по сравнению с double. (Первоначально предлагаю выбрать double для первого приближения, а там видно будет , но в уме держим)
6. Продумать способы реализации визуализации. (Подсмотреть в готовых пакетах, например). Реализовать GUI-библиотеку необходимых элементов и "обвеску" вокруг них.
Отталкиваясь от текущих вариантов требований и терминологии, попытаюсь начать разработку фреймворка:
Предлагаю состав библиотек:
Neuro.Core — базовые понятия и алгоритмы, так же предлагаю включить реализации для наиболее популярных типов сетей.
Neuro.Diagnostic — ср-ва диагностики и наблюдения.
Neuro.Design — если потребуется разработать дизайнеры для VS, предлагаю их сваливать сюда
Neuro.Windows.Forms — библиотека элементов визуализации
Neuro.Windows.Forms.Design — соответственно дизайнеры для визуальных эелемнтов
Прикладные варианты реализации сетей именовать в стиле:
Nero.NameOfNetworkType, соответственно если нужны дизайнеры, то для имени сборки под них приписать .Design в конце.
Начинать будем с Neuro.Core, наверно
Из моих представлений к требованиям и недолгих рассуждений пока накатал следующее:
Вообще-то, тоже не фонтан для тех же изображений, ибо каждый раз перегонять double-значение через вируальную ф-ию для примитивной (но самой частовыполняющейся!!!) операции умножения на коэф?
Может быть стоит поручить хранить синапсы не нейрону, а адаптеру данных? Типа такого:
/// Set of synapsespublic interface ISynapses
{
/// Count of denritesint 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 signalsdouble CalculateSignals();
}
Итак, пусть это будет коллекция синапсов с прямым доступом, которая инкапсулирует в себе процедуру получения взвешенных сумм из своих текущих данных (тем более, что данные могут быть произвольного типа, необязательно double). Суть в том, что такая коллекция должна быть своя для каждого нейрона, т.е. сам источник данных пусть представляет из себя фабрику таких коллекций:
public interface ISynapsesFactory
{
/// Count of output signalsint Count { get; }
/// Factory method
/// <returns>Created synapses for internal signals</returns>
ISynapses CreateSynapses();
}
В принципе, мне нравится и первый вариант, он будет порой более удобным для реализации, но никто не мешает сделать простейший адаптер первого во второй:
/// ISignalSource to ISynapsesFactory adapterpublic class SignalSourceAdapter : ISynapsesFactory
{
private ISignalSource _source;
public SignalSourceAdapter(ISignalSource source) {
if (source == null)
throw new ArgumentNullException("source");
_source = source;
}
/// Useful variantpublic 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 signalspublic int Count {
get { return _source.Count; }
}
/// Realization of ISynapses logicprivate 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 denritespublic int Count {
get { return _synapses.Length; }
}
public double this[int index] {
get { return _synapses[index]; }
set { _synapses[index] = value; }
}
/// Source Neuronpublic 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-а будет больше шансов оптимизировать вычисления.
Думаю, интерфейс сети не будет сильно отличаться от интерфейса слоя. Разве что добавятся методы сохранения/восстановления сети.
Есть так же уже базовый довольно-таки функциональный класс Layer, готовлю так же тип нейрона и класс слоёв для простой сети прямого распространения и станартного алгоритма обучения BackPropagation. Выложу в начале недели.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Разработка архитектуры, основных интерфейсов и типов дан
Здравствуйте, vdimas, Вы писали:
V>Ветка создана для обсуждения требований к библиотеке и парралельной разработки первого приближения архитектуры.
V>Ниже это поста будут тематические подразделы для обсуждения.
Меня интересует, каким образом планиуете прикручивать к библиотеке алогоритмы обучения?И как их собственно реализовывать так,чтобы они были работоспособны на любых функциях активации и любых типах сетей? (не очень представляю,честно).Просто если написать один базовый алгоритм и брать его как единственный для всех сеток и типа универсальный, то :
а)такого не найти
б)"библиотека" перестает быть самой собой, то есть вещью мощной и многограннойона просто теряет смысл..
в)рано или поздно придеться добавляет другие
По-моему,это большая проблема,как для данной задачи, так и вообще для реализации нейронок.
Что собираетесь с этим делать?
(если нужна помощь,то всегда на связи по 311484555(Marya))
Re[2]: Нейронные сети: сбор требований, разработка архитекту
S>Меня интересует, каким образом планиуете прикручивать к библиотеке алогоритмы обучения?И как их собственно реализовывать так,чтобы они были работоспособны на любых функциях активации и любых типах сетей?
Процесс обучения сети во многом творческий, может получится так, что конкретную сеть обучить невозможно для конкретного набора входных сигналов, например из-за недостаточно мощной структуры или неверно подобранной ф-ии активацтт. Я себе вижу задачу в предоставлении удобного инструмента для экспериментов и исследований.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Нейронные сети: сбор требований, разработка архитекту
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Simplicity, Вы писали:
S>>Меня интересует, каким образом планиуете прикручивать к библиотеке алогоритмы обучения?И как их собственно реализовывать так,чтобы они были работоспособны на любых функциях активации и любых типах сетей?
V>Процесс обучения сети во многом творческий, может получится так, что конкретную сеть обучить невозможно для конкретного набора входных сигналов, например из-за недостаточно мощной структуры или неверно подобранной ф-ии активацтт. Я себе вижу задачу в предоставлении удобного инструмента для экспериментов и исследований.
Да ладно... Сеть, конечно может не сходиться, но обучаться-то она должна =)) А иначе, собстно зачем сеть.
Просто, может быть придется давать механизмам обучения полный доступ к сети, в слое и к каждому нейрону =))
V>>Процесс обучения сети во многом творческий, может получится так, что конкретную сеть обучить невозможно для конкретного набора входных сигналов, например из-за недостаточно мощной структуры или неверно подобранной ф-ии активацтт. Я себе вижу задачу в предоставлении удобного инструмента для экспериментов и исследований.
ISM>Да ладно... Сеть, конечно может не сходиться, но обучаться-то она должна =)) А иначе, собстно зачем сеть. ISM>Просто, может быть придется давать механизмам обучения полный доступ к сети, в слое и к каждому нейрону =))
А зачем полный? Доступа по-чтению достаточно, чтобы понять, что происходит.
Я себе так вижу некий компонент для обучения:
— компонент инкапсулирует некий алгоритм обучения
— компонент имеет открытые св-ва, которые управляют параметрами сети (например, для полносвязной сети, обучаемой по методу BP, нам нужны параметры: кол-во нейронов в первом слое, в последнем, кол-во скрытых слоев и кол-во нейронов по каждому из них, ф-ия активации).
— компонент умеет сохранять настроенные весовые коэф и прочие параметры, требуемые для парной "run-time" реализации. Т.е. для конкретного применения предполагается 2 проекта: один обучающий, использующий компонент, в котором много чего есть для целей обучения, второй целевой, который содержит результаты обучающего проекта как данные, и "run-time" реализацию первого типа компонента (т.е. реализация без всех наворотов, связанных с обучением, т.е. "голые" нейроны и их веса).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Разработка архитектуры, основных интерфейсов и типов дан
Я думаю, что должен пристуствовать механизм указывающий, будет ли каждый нейрон слоя иметь одинаковую функцию активации или у всех она будет своя. Это нужно для полиномиальных сетей.
Re[5]: Нейронные сети: сбор требований, разработка архитекту
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Igor S Mandrigin, Вы писали:
V>>>Процесс обучения сети во многом творческий, может получится так, что конкретную сеть обучить невозможно для конкретного набора входных сигналов, например из-за недостаточно мощной структуры или неверно подобранной ф-ии активацтт. Я себе вижу задачу в предоставлении удобного инструмента для экспериментов и исследований.
ISM>>Да ладно... Сеть, конечно может не сходиться, но обучаться-то она должна =)) А иначе, собстно зачем сеть. ISM>>Просто, может быть придется давать механизмам обучения полный доступ к сети, в слое и к каждому нейрону =))
V>А зачем полный? Доступа по-чтению достаточно, чтобы понять, что происходит.
V>Я себе так вижу некий компонент для обучения: V>- компонент инкапсулирует некий алгоритм обучения V>- компонент имеет открытые св-ва, которые управляют параметрами сети (например, для полносвязной сети, обучаемой по методу BP, нам нужны параметры: кол-во нейронов в первом слое, в последнем, кол-во скрытых слоев и кол-во нейронов по каждому из них, ф-ия активации). V>- компонент умеет сохранять настроенные весовые коэф и прочие параметры, требуемые для парной "run-time" реализации. Т.е. для конкретного применения предполагается 2 проекта: один обучающий, использующий компонент, в котором много чего есть для целей обучения, второй целевой, который содержит результаты обучающего проекта как данные, и "run-time" реализацию первого типа компонента (т.е. реализация без всех наворотов, связанных с обучением, т.е. "голые" нейроны и их веса).
Полностью с вами согласен и поддерживаю. Это два разных этапа, но нужно еще учесть возможность дообучения сети на вновь появившихся данных, которые уже прошли свой порог упреждения и являются фактическими.
Здравствуйте, vdimas, Вы писали:
V>Предлагаю обсуждение терминологии вести в этой подветке.
V> V>Нейронные сети пользуются терминологией напрямую из биологии.
V>Кратко:
V>Аксон (Axon) — окончание нейрона, которое передает сигнал другим нейронам или "исполнительным механизмам". Предлагаю так называть идентификаторы, относящиеся к выходным сигналам.
V>Дендрит (Denrite, Dendrite) — входной рецептор нейрона.
V>Синапс (Synapse) — место и способ контакта входного дендрита и источника сигнала, от св-в синапса зависит коэф. передачи входного сигнала дендриту. Предлагаю этим термином именовать коэф. при входном контакте нейрона.
V>Передаточная ф-ия, ф-ия активации — функция преобразования суммы входных сигналов в выходной сигнал. (Наиболее популярна т.н. сигма-функция, близкая по характеристику к природной ф-ии). Предлагаю идентификаторы: ActivationFunc или Sigmoid.
V>Остальные термины наверняка самопонятные: V>Neuron, Layer, Network.
А как мы будем называть ошиюку данного нейрона и общую ошибку сети, корректирующий вес член?
Мои предложения:
GlobalError — сетевая ошибка
LocalError — ошибка данного нейрона
Re[2]: Разработка архитектуры, основных интерфейсов и типов
C>Я думаю, что должен пристуствовать механизм указывающий, будет ли каждый нейрон слоя иметь одинаковую функцию активации или у всех она будет своя. Это нужно для полиномиальных сетей.
Это упоминалось в сборе требований, согласен. Это можно сделать простым наследованием. В текущей версии есть довольно-таки функциональные generic-реализации классов слоев, позволяющие специфицировать тип нейрона для реализации слоя.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Нейронные сети: сбор требований, разработка архитекту
C>Полностью с вами согласен и поддерживаю. Это два разных этапа, но нужно еще учесть возможность дообучения сети на вновь появившихся данных, которые уже прошли свой порог упреждения и являются фактическими.
Разумеется, для прложений, где требуется динамическое "доучивание", должен использоваться компонент, который позволяет доучивание.
C>А как мы будем называть ошиюку данного нейрона и общую ошибку сети, корректирующий вес член? C>Мои предложения: C>GlobalError — сетевая ошибка C>LocalError — ошибка данного нейрона
Тогда еще надо:
— момент
— скорость обучения (скорость спуска)
— средневзвешенная ошибка
— макс.ошибка
— эпоха
— смещение начальной точки
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Code, Вы писали:
C>>А как мы будем называть ошиюку данного нейрона и общую ошибку сети, корректирующий вес член? C>>Мои предложения: C>>GlobalError — сетевая ошибка C>>LocalError — ошибка данного нейрона
V>Тогда еще надо: V>- момент V>- скорость обучения (скорость спуска) V>- средневзвешенная ошибка V>- макс.ошибка V>- эпоха V>- смещение начальной точки
Момент — что имеется ввиду под этим понятием? По повобу ошибок я сделаю отдельный пост, здесь очень тонкий вопрос, мы его еще обсудим.
Давайте обозначим эпоху переменной — Age. Их колличество может быть выбрано как автоматическим образом, так и задано извне. Смещение начальной точки — в сути этого слогаемого надо еще разобраться, понять как его правильно инициализируют и что оно дает для расчетом (я инитил его случайным образом и просто включял и выключал из расчетов — именения были неразлечимые).
Нейронные сети: сбор требований, разработка архитектуры
Формула ошибки сети и сама ошибка не должна ассоциироваться только с среднеквадратическим отклонением, а с лучшей метрикой выходного сигнала. Например, если мы подаем на вход ценовой ряд, то в качестве ошибки сети можно ставлять минимальный уровен прироста нашего еквити, с учетом открытой позиции. Если мы просто аппроксимируем функцию, то конечно лучше прибегнуть к стандартному среднеквадратическому отклонению. Т.е. практическая реализация накладывает достаточно большие и веские условия на математику сети. Я предлагаю разбить решаемые сетью задачи на default, математика, экономики, выделение признаков, а уже в каждом классе задач определить в интерфейсах нужный класс функций оибок сети. Что касается внутренней ошибки веса нейрона, то она полностью определяется выбранным алгоритмом реалищации сети — обратное распространение, сеть Коханена, сеть Хапфилда — и функцией активации.