Pull to refresh

Comments 91

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

И что же в нем паскалеподобного? Я серьезно.

На мой взгляд, для начинающих — неплохо. Хотя и с оговорками.
У меня другой совет: не надо примеров с распознаванием букв — завязните с предварительной обработкой( тут написано почему). Поскольку нейронная сеть в конце-концов не классифицирует, а аппроксимирует — возьмите пример аппроксимации. Например, по заданным 10 значениям увидеть sin( x ). Пример же простым должен быть.
Спасибо, я рассмотрю такой вариант.
Несколько пугает тенденция — все чаще и чаще на хабре начали появляться статьи, описывающие основы нейросетей для начинающих. Впечатление, что скоро это станет эдаким стартом: не знаешь с чего начать — пиши про нейросети.
ПМСМ и эта статья тоже не достигает заявленных целей — полный чайник врядли вынесет из нее какие-то новые знания, а не полный чайник и так уже знает все это (не исключено, что прочел в одной из многочисленных предыдущих статей по нейросетям на хабре).

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

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

Articles