Как стать автором
Обновить

Комментарии 16

Насколько актуально программирование подобных сетей на таких языках как Java, C# и на им подобных? Или производительность настолько критична, что требуется С/С++?
Зависит от размера нейронной сети. Но сомневаюсь что вам будет нужна такая нейросеть, в которой в данной задаче плюсы дадут реальный прирост. Так что для экспериментов — смело можно писать на чем угодно.
Иногда — да. И тут же хочется icc, AVX2/AVX-512 и подобных вещей, позволяющих выжать ещё немного производительности.

Для начальных же экспериментов часть хватает python'а c нормально собранным numpy (как минимум, с каким-нибудь blas, ускоряет работу в 2-3 раза, что вполне ощутимо).
Я решил создать перцептрон для распознования «AND» или «OR» на своем любимом языке C++

Ну и где class Perceptron или подобная конструкция?
Логистическа регрессия (сигмоида) строит гладкую монотонную нелинейную функцую, имеющую форму буквы «S»:
image
Иллюстрация шикарна
Статья откуда взяты картинки (http://robocraft.ru/blog/algorithm/558.html, не сочтите за рекламу, сам нашел 2 минуты назад в гугле) написана гораздо лучше, а главное там написан список ссылок, как-то невежливо…
Ах вон оно что, то-то я понять не могу что за обрывки мыслей иллюстрированные случайными картинками
Согласен, с zo_oz. Практическая реализация расписана — это хорошо, но вставьте ссылочки на статью с теорией, тем более что картинки не авторские!
И — да, мне понравилась статья, и с удовольствием прочел бы о реализации многослойного перцептрона на примере XOR!
Теория была написана мной с нуля, поэтому она выглядит как обрывки мыслей.
Источник на картинки я вставил.
Класс Perceptron я не стал расписывать, ведь я хотел всего лишь показать как с чистого листа сделать свою маленькую нейронную сеть без каких либо конструкций.
Мне правда очень приятно, что кому то понравилась статья, ведь это мой первый опыт! Большое спасибо!
---(outputs — targets) % sig_der(outputs)

это что деление векторов? Это как?

В теории матриц нет понятия «деления матрицы», матрицы можно только умножать.

Не смотря что тоже люблю C++ переписал на TSQL.

Считает 3 секунды.

 create function sigma(@x float) returns float as begin return (1.0 / (1 + exp(-1.0 * @x))) end;
 create function sig_der(@x float) returns float as begin return @x * (1.0 - @x) end;
GO

declare @neurons int = 2;
declare @epoches int = 100;
declare @koef_edication float = 1.0;
declare @mat_samples table (val1 float, val2 float, val3 float, id int not null identity(1,1) primary key);

INSERT INTO @mat_samples( val1, val2, val3 ) VALUES
(0.0, 0.0, 1.0),
(1.0, 0.0, 1.0),
(0.0, 1.0, 1.0),
(1.0, 1.0, 1.0)

declare @mat_targets table (val float, id int not null identity(1,1) primary key);
INSERT INTO @mat_targets( val ) VALUES (0.0), (0.0), (0.0), (1.0)
 
 declare @w table (val1 float, val2 float, val3 float);		--  w.set_size(3,1);
 INSERT INTO @w (val1, val2, val3) SELECT 1.0 + (rand()/0.9999999) * (-1.0 - 1.0), 1.0 + (rand()/0.9999999) * (-1.0 - 1.0), 1.0 + (rand()/0.9999999) * (-1.0 - 1.0);
 
declare @size_sample int = 3 * (select count(*) from @mat_samples)
while @epoches > 0
 begin
	declare @z table (val float);
	insert into @z (val)				-- Summator
		select s.val1 * w.val1 + s.val2 * w.val2 + s.val3 * w.val3 from @mat_samples s, @w w

	declare @output table (val float, id int not null identity(1,1) primary key);
	insert into @output (val)			--  auto outputs = sig(z);
		select dbo.sigma(val) from @z

	-- Gradient Descend
	update o set o.val = cast(n.val / nullif(dbo.sig_der(o.val), 0.0) as int) from @output o 
		join (select o.val - t.val as val, o.id from @output o join @mat_targets t on o.id = t.id) n on o.id = n.id
    
	declare @rs table (val1 float, val2 float, val3 float);
	insert into @rs 
	  select sum(s.val1*t.val1 / @size_sample), sum(s.val2*t.val2 / @size_sample), sum(s.val3*t.val3 / @size_sample) from @mat_samples s ,  (	
	    select sum(val1) as val1, sum(val2) as val2, sum(val3) as val3 from (
				select val as val1, 0 as val2, 0 as val3 from @output where id = 1
					union all
				select 0, val, 0 from @output where id = 2
					union all 
				select 0, 0, val from @output where id = 3
	    ) k ) t
	update w set w.val1=@koef_edication * (w.val1-r.val1), w.val2=@koef_edication *(w.val2-r.val2), w.val3=@koef_edication *(w.val3-r.val3) from @w w, @rs r
	set @epoches = @epoches - 1
 end

 select round(sum(w.val1*s.val1), 0), round(sum(w.val2*s.val2), 0), round(sum(w.val3*s.val3), 0) from @w w, @mat_samples s

«я не нашел простейших и прозрачных примеров а-ля «Hello world»»
И чтобы исправить это Вы написали статью с кучей графиков и сторонней библиотекой (с которой нужно разбираться). Действительно думаете, что это «Hello World»? IMHO пару кастомных классов — это должно быть пределом для этой статьи.
Нейронная сеть вроде целительства — если есть пациент, который хочет верить, то появится и целитель, который будет исцелять снова и снова. Результат будет, но не у заказчика, а у исполнителя в кармане.
Статья отличная, спасибо!
Жаль только картинки отвалились :(
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории