Programming
Algorithms
Comments 91
+24
«Программа представляет собой один сплошной недостаток – наша нейросеть очень глупа»
— более того, это вообще не нейронная сеть.
0
Я соглашусь, пожалуй. Это что-то промежуточное, между обычным алгоритмом и алгоритмом с опытом. Я хотел на пальцах объяснить смысл функционирования обучаемых программ, в качестве стартовой статьи.
+6
Дак а что тут обосновывать? )
Искусственный нейрон понятие формальное, у него есть мат. модель. Класс из топика в эту модель не вписывается )
+2
Для каждого входа нейрона должен быть свой весовой коэффициент, а судя потому, что написал автор у него веса соответсвуют нейронам.
+2
Тут вы правы. Но я посчитал, что модель будет слишком сложной для начала.
0
Ничего, что в этом суть нейронной сети? Между нейроны передают сигнал другому нейрону, каждый из которых влияет на результат с заданным весом, кто-то сильнее, кто-то почти никак.
+9
Всему свое время.
Вы разбираетесь в теме, вам это ясно.Статья для новичков.
Не хочу сразу усложнять тему и отпугивать читателя — получится очередная громоздкая статья, коих миллион в интернете.
+5
Ничего не знаю о нейросетях, кроме того, что прочёл в вашей статье. Но, как я понял из комментариев выше, вам к статье стоит дописать что-то такое: «Вот у нас получилась заготовка для нейросети. Пока что это ещё ей не является, но в следующей статье мы постараемся сделать из неё полноценную нейросеть
+1
Потому что нейронная сеть начинается когда есть нелинейность элементов (нейронов).
Пока нет нелинейности — это просто набор матриц.
+1
Есть же те же многослойные перцептроны, простые и понятные, в то же время являюищиеся классическими искусственными нейронными сетями, почему вы не использовали такую архитектуру?
Ведь ваше решение с виду не дает преимуществ и настоящей ИНС не является.
+1
В части преимуществ не все так однозначно. Как минимум одно преимущество налицо — простота.
Вообще, все зависит от задачи, выбор типа ИНС для решения конкретной задачи отдельная наука. А в некоторых случаях наивный Байес показывает результаты как минимум не хуже, чем ИНС.
+2
Как я и написал в конце статьи — это вводная для непосвященных.
Перцептроны с ходу — убийство мозга начинающего нейросетевика =)
+3
Не могу согласиться, перцептрон вполне внятно объясняется за полчаса.
Другое дело что процесс получения именно знаний, а не простых рецептов, мало кого привлекает — но заинтересованному человеку это объяснить очень легко.
+6
Это, скорее, классификатор, но не ИНС. Он не сможет классифицировать изображение, которому его не обучали. Например, подсуньте ему горизонтальную линию — только такие он и сможет классифицировать, вертикальные уже нет.
Но вообще все доходчиво, если планируете усложняться и таки дойти до ИНС, то с удовольствием почитаю.
0
Очень понравилось! Хочется продолжения! Про обучения, распознавание, а ещё лучше реализацию алгоритма particle filters.
0
Совет: не пользоваться одиночным переводом строки для текста — или двойной (параграфы) или никакого. Иначе рваный текст получается, который и читать сложнее и смотрится неприятно.
0
Вить, присоединяюсь. Как раз начал разбор данной темы. Будет полезно почитать… =)
+8
У нас к сожалению тоже не было отдельного курса по нейросетям (в отличии от соседней специальности), но все же мне довелось делать по ним курсовик.

У меня сложилась примерно следующая модель, возможно кому-то так будет понятнее:
Введем пару понятий, чтобы проще было объяснить: вход нейрона назовем синапсом, у нейрона их много; выход нейрона назовем аксоном — он в нашей модели один. Названия собственно примерно отражают биологический смысл.

Так вот, представим n-мерное пространство, где n — количество синапсов у нейрона. В рассмотренном выше примере n = 900. Входная информация, таким образом, представляет собой вектор в этом самом пространстве. Ну для простоты можете представить 3-х мерное пространство и 3-х мерные вектора. Правда сеть довольно тупая будет :).

Дык вот, память нейрона после обучения также представляется таким вектором, а вся сеть — эдаким облаком векторов в 900-мерном пространстве.

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

Собственно вся сложность в таком случае в адекватном обучении нейросети. Я делал довольно примитивную самообучающуюся сеть, уж не знаю насколько каноничная реализация получилась. В принципе наверное смогу накатать подобную этой статью.
0
Да, забыл сказать. Значение на «аксоне» и будет значением скалярного произведения.
0
Чтож, спасибо за дополнение!
Планирую рассказать в следующей статье о простейшем перцептроне, о распределении и способах коррекции весов — ваш комментарий натолкнул меня на мысль, с чего начать.
Благодарю )
-4
возможно кому-то так будет понятнее

Понятнее не получилось. Извините.

>>отражают биологический смысл
Прекрасно, но биологов тут не много, я думаю.

>>представим n-мерное пространство,
Это напоминает анекдот:
Профессор: А теперь представьте сферу в 9-ти мерном пространстве…
Студент: ??? Как можно представить сферу в 9-ти мерном пространстве???
Профессор: О, это очень просто: представьте сферу в n-мерном пространстве и положите n равное 9.

>> задача классификации
Что это за задача?
+2
Ну я потому и написал, сначала попробуйте в 2-3-х измерениях. Нарисуйте, сразустанет понятнее. Есть некоторое количество векторов и есть вектор входных данных. Чем меньше угол между ними, тем более «родственны» эти данные, тем больше скалярное произведение. Задача распознавания букв и есть задача классификации входного сигнала — определим к какому классу он относится.
Биологические термины чисто для сокращения. Значения гуглятся элементарно. Мы же все-таки биологическую систему пытаемся эмулировать.
+1
Доходчиво, да не совсем. С обработкой bitmap-картинки вроде понятно — вот есть точки 0 или 1, и им соответствуют вектора. А как обстоит дело с обработкой звука? Как, например, на фоне шума волн распознать крик чайки? Человеческий мозг как-то уверенно это делает, причем соотношение сигнал/шум может меняться в очень широких пределах. Как выбирать эти вектора, и как их систематизировать, чтобы получилась такая же система распознавания?
0
По идее абсолютно без разницы что представляет собой входной сигнал. В битмапе это набор точек, причем, хочу заметить, не обязательно 0 и 1, можно использовать более широкий диапазон. Со звуком это может быть сэмпл фиксированной длительности, тогда уровнями на синапсах (и числами в векторах) будут, например, амплитуды на каждом шаге дискретизации. Распознавание ничем отличаться не будет, все тоже самое. Основная проблема тут, на мой взгляд, именно в адекватном обучении нейросети. Кстати, почти все, что я видел из институтских заданий и реализаций занималось именно обучением на зашумленных образах и распознаванием зашумленных образов.

Кстати, не стоит забывать, что тут рассматривается простейшая однослойная нейросеть. Есть гораздо более сложные вещи, у меня, в свое время, не хватило познаний матана чтобы в них разобраться :).
0
Нет, все равно непонятно. Уровни на каждом шаге дискретизации нельзя подставлять в качестве синапса (входа в нейрон), поскольку к примеру -100 и +100 может означать на выходе АЦП один и тот же сигнал, просто в противофазе. Наверное, в качестве входных синапсов должны быть какие-то свертки сигнала по амплитуде, спектру, времени. Вопрос как раз и был в том, какие именно должны быть эти синапсы, как их выбрать и как получить, чтобы добиться уверенного распознавания полезного звукового сигнала.
0
Тут я к сожалению не подскажу, так как обработкой звука никогда не занимался. Я про то, что задача классификации от этого не меняется. А вот задача адекватного задания входного сигнала и обучения нейросети — остается.

Нейросети ведь сначала показывается некая серия эталонов, в результате чего у нейрона формируется некий обобщенный образ, соответствующий классу, им распознаваемому. А потом уже мы показываем произвольный образ, и какой нейрон наибольшим образом возбудился (максимум на аксоне), к таком классу этот образ и принадлежит.
+1
Присоединюсь к предыдущим ораторам. При отсутствии весовых коэффициентов как таковых, это сложно назвать нейронной сетью.
+2
Немного нескромно, но возможно кому-то покажется интересной моя простая реализация NN, при условии отсутствия аллергии на LISP.
+2
Ну, конечно, на нейросеть это дело похоже очень отдаленно, но простота изложения подкупает. Так что реквестирую продолжение, самому интересно почитать хоть раз «простым» языком. Только дополнительно все-таки реквестирую несколько большую строгость. Перефразируя известную поговорку, определениями математику не испортишь.
+1
Ах да, и все-таки может лучше на более подходящем языке излагать примеры, делфи несколько неуклюж, да и думается мне си-подобные языки большинству привычней. Или даже питон, а то и хаскель лучше подойдут.
0
Абсолютно согласен, как и говорил — Делфи просто под рукой была.
-2
Но как Вы тогда писали на Хабр? Или заблокировано всё, кроме него? Кто мешал скачать какой-нибудь Wing или Code::Blocks?
0
На Хабр писал из браузера.
В тот момент для меня важно было реализовать идею, пока мысль не ушла, а на свежеустановленной системе была только Дэлфи.
Не зря я приготовился к помидорам =)

Обещаю исправиться и следующую статью написать на чем-нибудь Си-подобном.
+1
Чего это вы набросились на Delphi? Сам пишу на нем. И мне нравится.
Впрочем, можете и на Си перейти. Тут важен сам алгоритм.
+3
Может вообще попробовать обойтись без кода? Есть и другие методы показать алгоритм.
+2
Я так понял, код на паскале написан? Думаю это полезно было-бы указать в топике, для таких дундуков как я. Кстати, а почему паскаль?
+3
My bad, не прочитал комментарии. В следующих статьях (надеюсь, они будут) пожалуйста отставьте паскаль в сторону, C++/Python/Ruby большинству будут понятней :)
0
Не надо говорить за большинство. Не оставляйте Паскаль, у него простой и понятный синтаксис, известный многим со школы.
0
Я извиняюсь, но так оставлять или нет? Написано «Не оставляйте», а аргументы вроде за «Оставляйте».
0
Насчет простоты соглашусь, но все же большинство просит перейти на Си-подобный язык.
Так что я пока в смятении…
0
Я думаю, это зависит от того, чего конкретно вы хотите.
Если хотите показать именно пример реализации нейронной сети — то лучше перейти на какой-нибудь более популярный язык.
Если же хотите передать сами знания — то какая разница, на чем примеры написаны? Можно вобще без кода, только картинки с результатами навставлять.
В конце-концов, примеров реализации нейронных сетей на каком-либо языке программирования полно.
0
Несмотря на все просьбы никто непонимания кода не обозначал. Паскаль тем и хорошо что близок к естественным языкам. Легко читается.

PS: если все-таки будете писать на Delphi — нейроны можно удобно сериализовать в файл при помощи TStream.Read/WriteComponent
0
Спасибо, очень интересно. Продолжайте! Только пожалуйста более читабельный язык. Си подошел бы прекрасно.
0
Тут многие писали о том, что это не нейросеть. Меня, опять же, как знающего о нейросетях только из этой статьи, интересует: а как сделать из этого примера нейросеть?

Если я правильно понимаю, то нужно сделать нейроны, которые будут отвечать за определение слов, и в которое будет приходить информация, из нейронов распознавания букв. Так? На каждое слово будет свой нейрон. А потом можно сделать ещё нейроны, которые будут распознавать предложения, беря на входе слова из предыдущих нейронов. Я прав?
Тоесть, будет именно сеть, и она сможет, как было написано выше, иметь у нейронов вес на вход и на выход…

Камнями в меня не кидайте, писал это основываясь лишь на информации из статьи и из комментариев.
0
Нет, вы обобщаете задачу, а не модель сети. Не стоит думать, что нейронная сеть сама все распознает. Обычно схема работает так:
Есть n-мерный СКВ( сферический конь в вакууме ). В этом n-мерном пространстве у нас нет четкого правила определения (или оно слишком сложное), к какому типу коней он пренадлежит. Мы проганяем его через нейронную сеть — получаем образ СКВ в k-мерном пространстве, для которого такое правило очевидно / проще.

Например, мы хотим получить либо да (выход == 1) либо нет (выход == 0). Тогда вместо решения задачи классификации n-мертного вектора нам надо всего лишь решить задачу «выход = x ближе к 0 или к 1?».
+2
Практически ничего не понял из того, что вы написали. Наверное по этой причине статья автора и пользуется такой популярностью — может там и неправильно, но там понятно. =)
UFO landed and left these words here
0
Я ранее не читал о нейронных сетях, но узнал слишком мало, что бы автор сомневался, писать ему цикл статей или нет.
Теперь Вы просто обязаны продолжить :)
0
Присоединюсь к вышесказанному: пишите, Паша, пишите. Теперь читателям будет обидно не увидеть продолжение =)
-5
Присоединюсь к ранее высказавшимся в топике, что расмотренная модель в примере — это нисколько не нейронная сеть. Не хочу показаться ханжой, но использовать Delphi даже в учебных целях, это издевательство. Java или C#, чтобы сразу прививать хороший тон новичкам, ну на крайняк C++ =)
0
Пардон, но и Pascal и Delphi вполне себе хорошие языки, тем более для академической задачи.
+1
Питон вообще-то паскалеподобный синтаксис имеет, если что
+1
На мой взгляд, для начинающих — неплохо. Хотя и с оговорками.
У меня другой совет: не надо примеров с распознаванием букв — завязните с предварительной обработкой( тут написано почему). Поскольку нейронная сеть в конце-концов не классифицирует, а аппроксимирует — возьмите пример аппроксимации. Например, по заданным 10 значениям увидеть sin( x ). Пример же простым должен быть.
+1
Несколько пугает тенденция — все чаще и чаще на хабре начали появляться статьи, описывающие основы нейросетей для начинающих. Впечатление, что скоро это станет эдаким стартом: не знаешь с чего начать — пиши про нейросети.
ПМСМ и эта статья тоже не достигает заявленных целей — полный чайник врядли вынесет из нее какие-то новые знания, а не полный чайник и так уже знает все это (не исключено, что прочел в одной из многочисленных предыдущих статей по нейросетям на хабре).

Нападки на язык программирования выглядят странными — в конце концов паскаль является вполне себе рабочим языком, пожалуй даже еще без явно различимых признаков трупного окоченения. То, что он не является более мэйнстримовым, нисколько не уменьшает его а) тьюринг-полноты и б) читабельности.
0
Хоть это и не сеть (нейроны не связаны между собой) но на пальцах очень хорошо объясняется. Спасибо
+1
Переписал исходник на C# и отправил автору предложение по обновлению статьи и размещению здесь варианта на Шарпе, если вдруг кому-то не терпится стучите поделюсь.
0
Одобряю, даже интересно. Если общественность одобрит — обязательно посмотрю в сторону Си-подобных языков в следующей статье.
+1
Нашел свой курсовик, тема там «Самоорганизующаяся карта Кохонена» (обучение без учителя). Если у автора нет запланированной статьи на эту тему, могу попробовать изложить вкупе с реализацией.
0
Вопрос ко всем заинтересовавшимяс:

На каком языке вы бы хотели увидеть код в следующей статье?
Просьба просто написать название языка, без лишних слов.
Составлю статистику и сделаю выбор из того, чем владею.
0
Псевдокод. Или Ruby/Python. Или же C++, но только если это необходимо (если нужны специальне либы там, формат сигнала особый на входе итп).
0
Я вроде начал понимать как работают нейронные сети. Знал бы мой препод по искуссственному интеллекту — плакал бы от радости. С нетерпением жду продолжения.
0
Минут 15 смотрел на код. Что то до боли знакомое, но непонятное. Только в каментах прочитал что это Делфи озарило. Не писал лет 10 уже на нем, забыл как выглядит О_О
0
теперь нужно также понятно написать, но для неокогнитрона :)
0
Исключительно полезная статья. Надеюсь на продолжение.
Only those users with full accounts are able to leave comments., please.