GotAI.NET

Форум: Проблемы искусственного интеллекта

 

Регистрация | Вход

 Все темы | Новая тема Стр.1 (6)След. > >>   Поиск:  
 Автор Тема: Нейросеть по просьбам просящих.
гость
31.181.28.*
Нейросеть по просьбам просящих.
Добавлено: 20 май 13 10:58
Начитавшись тут всякой всячины решил дать то что многие хотят видеть. По крайней мере я так предполагаю, ну да ладно.
Ниже код, который вы наверное не воспримите в серьёз, но я попробую пояснить что это значит, а заодно его раскоментирую.
Это основная функция:
Цитата:
void work(unsigned char *, unsigned char *, unsigned char *, _Bool)

[/code]
Как видите она ничего не возвращает, в этом нет необходимости. Что за параметры она принимает:
1 - Указатель на однобайтовую беззнаковую переменную, это вход нейросети. Вся функция это обработчик так сказать "мозгового модуля", надеюсь вы знакомы с тем, что он из себя представляет. Входное значение передаётся через этот указатель и получается для всех элементов входного буфера нужно вызвать эту функцию, так как каждый элемент обрабатывает один модуль.
2 - Указатель на буфер памяти(массив однобайтовых беззнаковых переменных размером в 255 элементов, можно больше, если будете использовать переменные размером более байта(значения в байте от 0 до 255)). Тоесть веса связей нейронов, это выходы. Почему только веса и почему выходы - нейрон это абстрация, это ячейка памяти со значением, более сложная реализация предполагает расчёт значения внутри нейрона по силе сигнала, направлению связи и куче факторов, которые я опустил. Все знают что в перцептроне есть пороговая функция? А кто знает что такое порог в нейроне? Так вот, порог это точность совпадения входящего сигнала с запомненным значением. Проще говоря нейрон это цифра и вход это цифра и если они равны, нейрон выстреливает сигнал по аксону. Это может заинтересовать того человека, что хочет сделать автомат с целеполаганием и конечным числом обрабатываемых ситуаций. Есть 2 пути - сложный с использованием памяти и простой с использованием вычислительных ресурсов.
3 - указатель на элемент буфера выходов(массива однобайтовых беззнаковых переменных). Как я писал, каждый нейрон имеет веса, это веса связей с выходами и только с выходами, почему только с выходами - соединения нейронов между собой реализует то что я назвал запоминанием значения. Это одна из оптимизаций расходования памяти, чтобы небыло в ней лишнего. Каждый модуль обрабатывает только один выход, чтобы получить несколько выходных значений следует соединять модули паралельно(о чём я напишу далее) и передавать указатели на разные элементы массива выходов.
4 - trm - тормозной сигнал (булева переменная длиной в байт), принимает значение 0 и 1. Почему только 0 и 1 - опять же для простоты. От неё зависят веса связей.

Ну параметры я описал, теперь другие параметры, неочевидные.
Нейрон - абстрактное число, что не хранится в памяти а является значением переменной используемой в цикле. Нейрон имеет в буфере памяти вес связи с выходом. Он реализован с одним аксоном(без коллатералей) в пределах модуля. Модули можно соединять последовательно и паралельно.
Поясняю - последовательное соединение означает, что выход предыдущего модуля передаётся на вход следующего, при этом обрабатывается только один выход(это количество памяти), пралельно - это когда несколько модулей имеют один вход, но обрабатывают много выходов(это качество памяти).
Первый параметр вход, принимает одно значение, один вход это вершина одного мозгового модуля, так же как выход - его окончание.
Мозговой модуль обрабатывает 255 состояний входа, тоесть по одному значению входа и одному весу на нейрон.
Выходы вычисляются средним арифметическим веса связи и значения элемента выходного буфера, опять же для простоты, не выходим за байт, не перешагиваем от 255 сразу к 0 при сложении и корректируем значение аккуратно.
В вычислении участвуют только вес связи нейрона который совпал с входным значением.

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

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

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

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

Минусы - нет идеального конечного числа состояний вычисляемых единой формулой, нет плавного перехода от одного выхода к другому, нет подавления входного сигнала в зависимости от его важности(но можно подавить выходы).

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

void net_work(unsigned char *val, unsigned char *mem, unsigned char *out, _Bool trm)
{
unsigned char in;//переменная нейрона

for(in = 0; in < 255; in++)
{
if(in / 255 != 0)//проверка деления на ноль
{
if(*val / (in / 255) == 255)//вычисление степени сходства(аналогично с вычислением процентного сходства)
{
if(trm == 0 && mem[in] < 255)//
mem[in]++;
else if(trm == 1 && mem[in] > 0)
mem[in]--;

*out = (*out + mem[in]) / 2;

break;
}
}
}
}[/code]
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Нейросеть по просьбам просящих.
Добавлено: 20 май 13 13:24
Нейросеть - это векторы, матрицы, двудольные (в простых случаях) графы.
А чё это за язык?
[Ответ][Цитата]
tac
Сообщений: 2601
На: Нейросеть по просьбам просящих.
Добавлено: 20 май 13 15:57
Цитата:
Автор: kondrat

А чё это за язык?


Си, конечно.

Думаю тут еще доделывать и доделывать. пока сырые мысли похоже. Вот только вопрос знакомы ли вы хоть с одной классической нейронной сетью?
[Ответ][Цитата]
rrr3
Сообщений: 11857
На: Нейросеть по просьбам просящих.
Добавлено: 20 май 13 21:41
Цитата:
Автор: гость
...Программная прослойка между ядрами создаст зависимость тормозного сигнала одних ядер от выходов других или иначе говоря создаст ситуацию коррекции весов в ядре(поиск выхода из сложившейся ситуации)....

1. Уважаемый гость! Когда я впервые появился на данном форуме, то тоже заходил как гость. Далее это привело к путанице т.к. гости на форум заходя, а кто есть кто не всегда видно и порой возникают замешательства во взаимопонимании. Если Вас не затруднит, возьмите себе пожалуйста какой нибудь Ник и зарегистрируйтесь.
2. К сожалению я не технарь и в кодах не разбираюсь. Может и в данном случае что-то просто не допонял. Но у меня такой вопрос, как происходит преобразование Вашей сети, за счет чего (если можно на уровне идей, а не кодов)?
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Нейросеть по просьбам просящих.
Добавлено: 20 май 13 22:34
Цитата:
Автор: tac
Си, конечно.

Узнал!
После вчерашнего коньячка он брэйнфаком показался - слишком уж много одинаковых операций.
[Ответ][Цитата]
Victor G. Tsaregorodtsev
Сообщений: 3187
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 5:22
Цитата:
Автор: kondrat
Нейросеть - это векторы, матрицы

Угу. Всегда так делаю в своём нейрософте (т.е. не делал никакой ООПовской абстракции для отдельных нейронов и, боже упаси, отдельных синапсов).
Для мелких халтур копипастом соорудил простенький код на тех же принципах - и, например, этой конкретной весной сделал 3 нейропрограммки студенткам.
И что интересно - не последовало никаких особых вопросов от студенток. Т.е. либо преподы не смотрят сдаваемый код, либо указанная Вами абстракция понятна ширнармассам(условным блондинкам и условным преподам).
Второе, честно говоря, меня расстраивает
[Ответ][Цитата]
гость
31.181.28.*
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 7:13
Цитата:
зарегистрируйтесь
Считай меня анонимным доброжелателем.
Цитата:
как происходит преобразование Вашей сети, за счет чего (если можно на уровне идей, а не кодов)
Что ты понимаеш под преобразованием? Изменение связей? Они не меняются, они могут ибо иметь вес либо отсутствовать если вес равен нулю.
Цитата:
Вот только вопрос знакомы ли вы хоть с одной классической нейронной сетью?
У меня встречный вопрос, знаком ли ты хоть с одной нейросетью биологической?
Я не основывался на том что ты назвал классикой. Это философский вопрос является ли классикой это..
Цитата:
Нейросеть - это векторы, матрицы
Ну да, яж забыл. А чем тебе переменная не матрица значений сжатая в байт? Или матрица обязательно должна быть многомерным массивом, а иначе она уже не матрица.
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 7:48
Цитата:
Автор: Victor G. Tsaregorodtsev
И что интересно - не последовало никаких особых вопросов от студенток. Т.е. либо преподы не смотрят сдаваемый код, либо указанная Вами абстракция понятна ширнармассам(условным блондинкам и условным преподам).
Второе, честно говоря, меня расстраивает

Я не препод и не студент (хотя и вел дипломные проекты). Честно говоря, скучаю по тем временам... Большего позитива и хохота я не получал ни от чего.
А эффект можно объяснить ещё и хорошими комментариями (объёмом на диссер) либо традиционной иллюзией глубины собственного понимания.
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 7:59
Цитата:
Автор: гость
Ну да, яж забыл. А чем тебе переменная не матрица значений сжатая в байт? Или матрица обязательно должна быть многомерным массивом, а иначе она уже не матрица.


Гы-гы-гы. Я знал человека, который придумал идеальный алгоритм сжатия: до нуля.
[Ответ][Цитата]
гость
31.181.99.*
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 9:05
Цитата:
Гы-гы-гы
Да не ну я просто смотрю на матрицу как на одномерный массив и работаю с ней соответсвенно, по моему так проще. А тут я на массив посмотрел и думаю, а его элементы точь в точь значения байта, заменю ка я его. Вот собственно так я и стал использовать переменную а не массив.
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 10:47
Рассматривать никто не запрещает. Программировать - не оптимально. А какая разрядность кода?
Да и математический смысл теряется. Ну, представьте, что вы горшок ухватом называть начнете. К этому мало кто привык.
[Ответ][Цитата]
гость
31.181.99.*
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 10:54
Цитата:
А какая разрядность кода?
Попробуй ещё раз.
[Ответ][Цитата]
гость
31.181.99.*
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 10:58
Цитата:
Ну, представьте, что вы горшок ухватом называть начнете.

Ненене! Раз ты за горшки начал тогда получается что то что ты назвал сервИзом я обозвал крУжками.
Про разрядность, угадай, сколько будет 32*8 - потом смотри на цифры писаные мной и увидиш.
[Ответ][Цитата]
kondrat
Сообщений: 4026
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 11:04
Для моего масштаба личности цифры малы. А этот бред я уже прочитал на трезвую. Как говорил тостующий, - абстрагируемся!
[Ответ][Цитата]
гость
31.181.99.*
На: Нейросеть по просьбам просящих.
Добавлено: 21 май 13 11:06
И ещё.
Примерно то что я обозвал возможностью "распаралеливания модулей" и "ядром". Кончено POCX не лучшая затея, но оно таки работает. :D Хотя и в холостую.
Цитата:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <pthread.h>

struct Space
{
unsigned char trm;
unsigned char value;
unsigned char def_out;
unsigned char weight[UCHAR_MAX];
};

void *Cell_thread(void *arg)
{
struct Space* work_space = arg;
unsigned char i;

for(i = 0; i < UCHAR_MAX; i++)
{
if(i / UCHAR_MAX != 0)
{
if(work_space -> value / (i / UCHAR_MAX) == UCHAR_MAX)
{
if(work_space -> trm == 0)
{
if(work_space -> weight[work_space -> def_out] < UCHAR_MAX)
work_space -> weight[work_space -> def_out]++;
else
work_space -> def_out++;
}
else if(work_space -> trm == 1)
{
if(work_space -> weight[work_space -> def_out] > 0)
work_space -> weight[work_space -> def_out]--;
else
work_space -> def_out--;
}

break;
}
}
}

return NULL;
}

int core_start(unsigned char *in, unsigned char *trm, unsigned char *out)
{
pthread_t thread[UCHAR_MAX];
struct Space work_space[UCHAR_MAX];

unsigned char i, n;
for (i = 0; i < UCHAR_MAX; i++)
{
work_space[i].value = in[i];
work_space[i].trm = trm[i];
if (pthread_create(&thread[i], NULL, &Cell_thread, &work_space[i]) != 0)
return -1;
}

for (i = 0; i < UCHAR_MAX; i++)
{
if (pthread_join(thread[i], NULL) != 0)
return -1;
else
{
for(n = 0; n < UCHAR_MAX; n++)
out[n] = (out[n] + work_space[i].weight[n]) / 2;
}
}

return 0;
}

int main(void)
{
unsigned char input[UCHAR_MAX] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
unsigned char trm[UCHAR_MAX];
unsigned char out[UCHAR_MAX];

int i, n;
for(i = 0; i < UCHAR_MAX; i++)
{
if(core_start(input, trm, out) == -1)
return -1;
}

for(n = 0; n < UCHAR_MAX; n++)
printf("%d\n", out[n]);

return 0;
}
[Ответ][Цитата]
 Стр.1 (6): [1]  2  3  4  5  6След. > >>