Здравствуйте, Khimik, Вы писали: K>В интернете приводятся примеры в основном на Питоне, я надеюсь Delphi тоже вполне подходит для такой задачи. Если Питон – более высокоуровневый язык и это достаточно важно, может мне сначала нужно выучить Питон.
1) Верно ли я понимаю, что ты знаешь что такое матрица, тензор (многомерная матрица, преобразование координат нам не потребуется), линейный оператор, нелинейный оператор?
Если да, то на каком-то уровне приближения, и если ограничится сетями для обработки изображения, более или мене любую сеть можно представить в виде последовательности линейных и нелинейных операторов действующих из пространства трёхмерных тензоров одного размера, в пространство 3-х-тензоров другого размера.
Размерности тензоров -- ширина изображения х высота изображения х число каналов.
Нелинейные операторы (слои активации) это какие-то функции, которые вносят в систему нелинейность. Например отображают XxYxN в такие же XxYxN, но по правилу, что если на входе отрицательное значение, то на выходе ноль, а если на входе неотрицательное, то оно сохраняется.
Ключевым тут является то, что для обучения нужно, что бы градиенты (частные производные функции потерь по входным параметрам слоя) можно было вычислить и передать на предыдущий слой. Поэтом есть много вариантов слоёв активации.
Линейные же слои, тоже имеют хитрость. Иногда бывают слои с X1xY1xN1xX2xY2xN2 независимых коэффициентов (тут X1xY1xN1 -- входной тензор слоя, а X2xY2xN2 -- выходной)
Обычно они называются полносвязными (Dense), но сети из таких слоёв имеют много проблем.
а) нельзя менять размер входных/выходных тензоров
б) очень плохо обучаются и глубокую сеть (много слоёв) из таких штук не обучишь.
Поэтому придумали много разных хитрых ограничений на эти операторы. Иногда их делают разряженными, например блочно-диагональными, иногда делают доп. условие, что какие-то коэффициенты совпадают и т. д. Это даёт разные слои (cnn, например)
Хорошей особенностью CNN является то, что там один и тот же набор коэффициентов (ядро) применяется к разным местам (x, y) входного тензора. То есть можно менять размеры входного тензора, используя одно и то же ядро.
Ещё есть нелинейные слои, которые берут и отображают 2Xx2YxN в XxYxN, путем выбора из квадратика 2x2 обычный подход -- выбор максимального значения.
В общем, если посмотреть на это всё с такой точки зрения, то получается, что имеем на входе картинку буквы, например, 28x28x3 (RGB), после первого слоя линейного и слоя активации имеем "картинку", например 26x26x32 — тут 27 -- размер картинки, так как нам для применения ядра пришлось отступить от края на 1 пиксель, в 32 -- число каналов. Смысл этих каналов, примерно соответствует признакам признакового классификатора.
Теперь можно поставить слой пуллинга, который отобразит наш 26х26х32 на 13х13х32, так как из каждого квадратика 2х2 оставит только самое большое значение.
Потом ещё раз можно поставить линейный слой, который уже 64 признака вычислит, например, пуллинг и активацию. И т. д.
В конце можно поставить полносвязанный слой который отображает на 1х1х10 (10 -- число разных цифр, а величина канала -- степень похожести входной картинки на цифру)
Вот мы и получили совсем простую сеть для классификации. Но, что бы её учить, нужно ещё придумать функцию потерь -- функцию, которая покажет, насколько тот или иной ответ сети близок к правильному (к ground truth). Для задач классификации хорошо подходит кросс-энтропия.
Правда перед кросс-энтропией, стоит поставить ещё один слой активации soft-max, называется, который приводит все значения к диапазону 0..1, так что самый большой становится близок к 1, а остальные ближе к 0 смещаются. Иногда эту формулу вставляют в саму функцию вычисления потерь, иногда как отдельный слой ставят.
Ну и нужно где-то добыть dataset с картинками цифр, которые мы будем классифицировать. Ну и нам надо знать какая картинка какую цифру изображает.
Можно разделить dataset на три части -- обучающую тестовую и контрольную. Обучающую и тестовую использовать в процессе
Теперь, когда у нас есть сеть (архитектура), функция потерь и dataset, надо понять, как это учить.
Общая идея такая, что обучающий dataset мы будем случайно делить на пакеты, например по 128 изображений (можно больше), и градиентным спуском пытаться подобрать коэффициенты в сети так, что бы уменьшить суммарные потери на всё пакете, потом на другом пакете, на третьем, и так до исчерпания dataset, или ещё до какого-то момента. Обычно эта процедура называется "эпоха", и после каждой эпохи хорошо бы прямым прогоном сети проверить результаты на тестовой выборке. Так как иногда стохастический градиентный спуск заходит в локальные глубокие экстремумы и для обучающей выборки потери уменьшаются, а для тестовой -- нет. Тогда стоит что-то поменять, например алгоритм обучения (например на метод сопряжённых градиентов или ещё как)
После того, как мы достигнем какого-то результата обучения, например потери перестанут уменьшаться. Или, в задачах классификации, ещё интересно на точность смотреть, например, тоже перестанет увеличиваться, можно ещё по контрольной выборке проверить, что сеть реально обучилась более или менее любым картинкам, для которых наш dataset представителен, а не только обучающей и тестовой выборке.
2) Вот там выше я очень кратко описал то, что нужно для одной классической задачи для нейросетей.
Смотри, этот пирог очень большой и состоит и многих "коржей"
2.1) Слои, архитектуры сетей
2.2) функции потерь (loss)
2.3) dataset — сбор, подготовка, подготовка синтетических datasets, что бы обучить на них, а потом доучить на реальных данных
2.4) Алгоритмы обучения
2.5) Аугментация (не знаю, как по-русски augmentation, это когда по реальным данным делают синтетические, например, если мы распознаём буквы в RGB, можно перевести картинку в цветовое пространство HSV и там "повращать" H и "пошевелить" S)
2.6) Манипуляции с самим сетями. Ну там обучить какие-то слои на одном dataset с какой-то функцией потерь, а потом другие слои на другом и с другой.
Или что-то вроде того
На самом деле писать алгоритм обучения или функцию потерь не особо интересно, писать свои слои интереснее, но это требует предварительного въезда в тему и т. д.
Собирать datasets тоже интересная и сложная задача, но с нуля тоже трудно сделать
Поэтому я тебе советую прочитать "укус питона", заботать numpy, поставить анаконду или юпитер(это если ты на винде, но на линуксе с этим всем проще)
Поставить keras поверх tensorflow и взять оттуда в качестве dataset MNIST (рукописные цифры) а в качестве примера AlexNet и посмотреть как оно работает, учится и всё такое, посмотреть/поотлаживать реализации слоёв и т. д.
А потом уже пробовать приписывать туда что-то своё и смотреть как оно влияет.
После этого можно взять какую-то реальную задачу и попробовать сделать тоже самое (фишкой MNIST является то, что на нём обычно учится всё жизнеспособное, в отличии от реальных задач и datasets)
Потом можешь попробовать понять, как работает tf (это символные вычисления. Когда ты собираешь сеть, tf запоминает граф вычислений, а потом обучалка сети по этому графу решает задачу обратного распространения градиентов)
Потом научиться писать свои лоссы и оптимизационные алгоритмы, потом свои слои и т. д...
Но, если пайтон тебе прямо вот не нравится и всё, хотя по нему много инфы как раз по задаче прототипирования нейросетей, и есть удобные фремворки, можно взять С++ и фремворки для С++ tf, например, есть и под С.
Про Дельфи не знаю, но мне кажется, что на дельфи тут стоит забить. Главное понять как в пайтоне работает numpy
Остальное и так поймёшь, по ходу пьесы
Да, для кераса пайтон (их есть два сильно разных, 2-й и 3-й) нужен 3-й, 3.5 что ли сейчас просят, но лучше в требованиях посмотри.
Ну и в целом удачи!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Khimik, Вы писали:
K>Интерес у меня скорее теоретически-философский – понять, какой принцип лежит в основе работы нейросетей, как они “думают”. Ну и какие у них принципиальные преимущества перед обычным кодом с алгоритмами.
Нейросети применяются для замены алгоритмам, которые трудно формализовать (и соответственно реализовать). Ничего они не думают, это просто чёрный ящик, который настроили до нужной точности результатов.
Здравствуйте, Khimik, Вы писали:
K>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу. K>Я хотел бы написать на Delphi простую нейросеть, например распознающую буквы. Прошу подсказать хорошие книги и обучающие видеокурсы.
K>То, что я пока нагуглил, мне как-то не очень нравится. Вот, например, эта статья:
K>https://zennolab.com/discussion/threads/nejronnye-seti-raspoznovanie-cifr-prostym-jazykom.35859/
K>Здесь задача уж очень примитивная – распознать один из 10 растров в 3*5 пикселей, которые обозначают цифру. Это проще реализовать банальным перебором и сравнением, я вообще не вижу тут алгоритмической задачи. Мне хочется написать нейросеть, которая сможет распознавать искажённые, наклонённые, сплющенные и т.д. буквы.
K>В интернете приводятся примеры в основном на Питоне, я надеюсь Delphi тоже вполне подходит для такой задачи. Если Питон – более высокоуровневый язык и это достаточно важно, может мне сначала нужно выучить Питон.
K>Интерес у меня скорее теоретически-философский – понять, какой принцип лежит в основе работы нейросетей, как они “думают”. Ну и какие у них принципиальные преимущества перед обычным кодом с алгоритмами. K>Кроме НС для распознавания букв, интересно было бы написать НС, например, для игры в преферанс, только боюсь это очень сложная задача. K>Ещё добавлю, что когда я изучал Delphi, я не мог въехать в принципы ООП по книгам; до меня всё дошло только тогда, когда я сходил на курсы к живому человеку. Поэтому для освоения НС мне, возможно, необходимы хорошие видео. Мне кажется, лучшим вариантом было бы видео, где знающий человек долго объясняет профанам суть концепции, и до тех понемногу начинает доходить.
почитайте вот это с тех времён нейросети не продвинулись, если не сможете скачать, то напишитие в личку.
что касается философии, то нейросети имеют очень ограниченную область применения, в первую очередь потому, что программисты возлагают большие надежды на их способность к самообучению, но при этом упускают из виду то, что эффективный характер обучения объекта подразумевает взаимодействие с этим объектом, а при взаимодействии объект ведёт себя совершенно иначе, чем при просто наблюдении. и вот тут-то нейросети наталкиваются на философский закон: нельзя познать систему до конца, если ты сам являешься её частью.
Мой совет: почитайте математику лежащую в основе нейросетей — она интересная, но прежде чем программировать приложения задумайтесь на сколько ваша нейросеть будет чувствительна к обучающему набору? может оператор или эвристические алгоритмы/шаблоны справятся лучше? К примеру: Abbyy по состоянию на 2006 год нейросети точно не использовала, да и сейчас скорее всего не использует.
Здравствуйте, Khimik, Вы писали:
E>>Пуллинг -- это ещё один нелинейный слой, который берёт наш "квадратик" 4х4х10 и заменяет его квадратиком 1х1х10, выбирая каждый раз максимальной значение из 16-и.
K>Я чувствую какую-то путаницу в обозначениях. Здесь 4*4 — это размер растра, а третья цифра (10) — количество вариантов значений в каждом растре?
Да, обычно это называют "число каналов"
На самом деле, если понять как работает такая сетка, типа первая свёртка переводит картинки в 128 признаков, вторая по 128 признакам опознаёт цифру.
Пуллинг отвечает за "ерзанье" цифры по рамке.
Теперь можно попробовать эту штуку модернизировать.
Первый ход -- поставить пуллинг до второго слоя. Пусть пуллятся признаки, а не вероятности классов! Тогда считать надо будет меньше, а каждый признак будет вычисляться устойчивее, так что сетка станет устойчива и к каким-то ещё другим "шевелениям" картинок.
Второй ход, вместо свёртки 13x13x3 -> 1х1х128 (около 65К чисел) сделать несколько свёрток подряд, но более маленьких. Ну, например, сначала свернуть ядром 13x1x3->1x1x32 а потом ядром 1x13x32 -> 1x1x128. Получим тоже какой-то линейный оператор, но он будет должен делать больше обобщений, так как он более ограничен в выборе коэффициентов.
Потом можно ещё и 13x1x.. разбить на несколько этапов. Ну, например, 3х1х... -> 1x1x... потом ещё раз и ещё раз.
Потом можно ещё пуллинги вставить между свёртками, что бы быстрее агрегировать информацию.
Можешь пробовать учить разные такие сетки и смотреть насколько размытым картинкам они будут учиться. Например, можно картинку немного двигать, качать влево-вправо, сжимать по горизонтали/вертикали...
Потом можно просто взять MNIST
Примерно понятно?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, The Passenger, Вы писали:
E>>С синтетикой будут проблемы...
TP>можно чуть подробнее?
Ну, обычно, при обучении сетей, находятся систематические какие-то данные, для которых реальных данных не хватает. Ну, там, ураганы в год особо активного Солнца, например. Соответственно, обычно в таких случаях выручает аугментация и просто синтетические данные для предобучения.
А в погоде и с тем и с другим не совсем ясно что делать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу.
Я хотел бы написать на Delphi простую нейросеть, например распознающую буквы. Прошу подсказать хорошие книги и обучающие видеокурсы.
То, что я пока нагуглил, мне как-то не очень нравится. Вот, например, эта статья:
Здесь задача уж очень примитивная – распознать один из 10 растров в 3*5 пикселей, которые обозначают цифру. Это проще реализовать банальным перебором и сравнением, я вообще не вижу тут алгоритмической задачи. Мне хочется написать нейросеть, которая сможет распознавать искажённые, наклонённые, сплющенные и т.д. буквы.
В интернете приводятся примеры в основном на Питоне, я надеюсь Delphi тоже вполне подходит для такой задачи. Если Питон – более высокоуровневый язык и это достаточно важно, может мне сначала нужно выучить Питон.
Интерес у меня скорее теоретически-философский – понять, какой принцип лежит в основе работы нейросетей, как они “думают”. Ну и какие у них принципиальные преимущества перед обычным кодом с алгоритмами.
Кроме НС для распознавания букв, интересно было бы написать НС, например, для игры в преферанс, только боюсь это очень сложная задача.
Ещё добавлю, что когда я изучал Delphi, я не мог въехать в принципы ООП по книгам; до меня всё дошло только тогда, когда я сходил на курсы к живому человеку. Поэтому для освоения НС мне, возможно, необходимы хорошие видео. Мне кажется, лучшим вариантом было бы видео, где знающий человек долго объясняет профанам суть концепции, и до тех понемногу начинает доходить.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу.
По мне так сеть — это больше как большая вероятностная база данных ( поэтому даже стали появляться даже топики о том что сча сети пихают везде и даже там где достаточно SQL )
с той лишь разницей что к базе есть конкретный запрос и получишь конкретный ответ
а на запрос к сети ( подача данных на вход )ты получаешь чтото типа хайли лайкли.
тренировка сети — это чтото типа набивание такой базы.
т.е. сети не думают от слова вообще ... вот комбинации сетей думаю смогут больше ( точнее могут — например игровые системы такие как alphago имеют сети для расознавания картинки и для логики
свои подсети )
Здравствуйте, De-Bill, Вы писали:
S>>Ну нейросеть это же просто суперпозиция функторов. Если у тебя нейросетевики такие офигенно умные и все знают, то зачем они вообще пользуются нейрорсетью? Пускай выпишут уравнения в явном виде и решают их.
DB>У sharpcoder большая часть задач — обработка изображений. Решать такие задачи "уравнениями в явном виде" со схожей точностью невозможно.
Все верно.
Я на самом деле 18 лет назад очень много занимался обработкой изображений. Кафедра «Компьютерные методы физики Физфак МГу».
Как это было. Строишь кривые, сам выдумываешь модель, потом вручную подбираешь параметры модели чтобы она выдавала приемлемый результат. Результат хреновый. Зовешь парней с Кафедры математики, они делают новую модель, ты ее перекладываешь в код и вообще ничего не работает. Долго вместе тюнингуете, что-то начинает получаться. Но качество все равно хреновое.
Так мы делали распознавание образов, распознавание текста, в т.ч. на ржавых трубах, анализ КТ сердца.
Нейросеть по сути это же структура, которая «сама» может построить модель и ее параметры, путем перебора. Для огромного количества задач это самый эффективный подход.
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, anton_t, Вы писали:
_>>А питон лучше подучить, если в этой области развиваться хочешь.
S>А язык R подойдет вместо питона?
Если хочешь стать Data Scientist, то возможно, если хочешь пощупать нейронные сети как программист — тогда питон.
S>Вообще теория нейросетей была развита в 60-х. С появлением нормальных компов у ученых возник к ним интерес в конце 90-х начале 2000-х. После этого интерес как то угас — прорыва никакого не получилось.
Теория с 60х годов развилась очень сильно. И все эти годы нейросети вполне использовались для ограниченного круга задач.
S>Зато сейчас нейросети стали пользоваться спросом у "программистов". Тут же думать особо не надо — фигачь данные в черный ящик и результат какой то будет, если че подкрутим параметры и покажем на митинге как круто сеть работает на тестовых данных .
Нейросети стали пользоваться спросом, потому что произошёл технологический и научный прорыв, и нейросети стали применимыми для очень широкого круга задач.
Поздно заметил данную дискуссию (только после переноса её в новый раздел форума), но всё же попробую высказать свой вариант объяснения, так сказать максимально обобщённый — вроде не видел ещё такого в данной темке.
Рассмотрим задачу распознавания (не обязательно нейронными сетями, а вообще), используя как раз твой пример с изображениями цифр. В общем случае эта задача означает, что нам надо написать некий алгоритм у которого на входе есть вектор значений X, состоящий из N элементов (для картинки в градациях серого N=W*H), а на выходе вектор Y, состоящий из М элементов (для твоей задачки M=10 — по количеству распознаваемых объектов). Т.е. по сути нам надо задать M функций вида y_i=f_i(X, P), где P — это вектор параметров из К элементов (К определяется видом алгоритма и может быть вообще равно нулю). При этом имеется набор входных значений X_0 (образцы цифр в твоём случае), для которых известны правильные значения Y_0 (указание цифры на образце). Под такую формулировку можно подвести все подобные алгоритмы, а не только нейронные сети. Например помнится я решал почти (только там задавалось не изображение, а путь пера) твою тестовую задачку с помощью алгоритма DTW и получалось получше нейронные сетей.
Теперь посмотрим как в это укладываются нейронные сети. Собственно нейронные сети задают некий большой класс таких вот функций f_i(X, P), с одним довольно простым, но очень полезным свойством. А именно, если мы берём в качестве нашего алгоритма набор функций f_i(X, P), являющийся нейронной сетью, то мы автоматически получаем готовый (причём даже не в математическом смысле, а прямо в физическом — можно банально скачать готовый код) алгоритм для вычисления вектора P по набору данных X_0, Y_0. Выполнение этого готового алгоритма и называют собственно обучением нейронной сети.
Вроде бы это всё звучит крайне банально, но если ты взглянешь на все остальные алгоритмы в данной области, то увидишь, что в лучшем случае там надо подбирать руками множество неочевидных параметров, а в худшем случае подбирать вообще код. Так что возможность просто скачать, запустить и получить в итоге готовый алгоритм выглядит прорывом в данной области, причём именно с точки зрения прикладного бизнеса. Потому как вполне реально что какой-то ручной алгоритм выдаст результаты намного лучше нейронной сети, но пока его будут делать, нейронная сеть будет уже несколько лет продаваться и приносит прибыль...
Здравствуйте, Khimik, Вы писали:
K> Нет, на входе всё те же 16*16 пикселей, просто картинка может быть чуть сдвинута.
То есть исходная 16х16 с полями? Или часть картинки утрачивается при сдвиге?
E>>Ну, например, можно твою сеть заменить на CNN 16х16х3 -> 1х1х256, а потом 1х1х256 -> 1х1х10 E>>Это будет аналог твоей сети, а потом сделать пуллинг со всего окна до 1x1x10
K>Что такое CNN? Что такое пуллинг?
Попробуй перестать представлять НС как набор кружков со связями и перейти к представлению, как набору последовательно применяемых операторов, отображающих трёхмерные массивы в трёхмерные массивы.
Идя CNN в том, что есть некое "окошко", например 13х13, которое скользит по исходной картинке, и вычисляет с ОДНИМИ И ТЕМИ ЖЕ коэффициентами свёртки, например 128 разных свёрток. В результате (если не дополнять исходную картинку 16х16 нулями), получим "картинку" 4х4 в каждом "пикселе" которой лежит 128 чисел. Теперь можем сделать ещё одну свёртку, которая из 128 числе делает 10 (то есть матрица 128х10), получаем 10 вероятностей, что в соответствующем тому или иному "пикселю" квадрате есть та или иная цифра.
Пуллинг -- это ещё один нелинейный слой, который берёт наш "квадратик" 4х4х10 и заменяет его квадратиком 1х1х10, выбирая каждый раз максимальной значение из 16-и.
Ещё хорошо бы на выходе поставить soft-max (лучше глянь в вики формулу), но его хорошо и на выходе твоей сетки поставить, кстати. Он просто более удобным для сети способом нормирует вектор из 10 вероятностей.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Khimik, Вы писали:
S>>почитайте вот это с тех времён нейросети не продвинулись, если не сможете скачать, то напишитие в личку.
K> Ох, наверно так устану от чтения... K> Мне ведь надо просто понять саму идею, "философию", а дальше я сам напишу на дельфи свою НС и буду её развивать. У меня вообще такой подход к программированию: например, моя графическая программа рисует трехмерные цилиндры и сферы, и мне было проще разобраться с низкоуровневым программированием, написать алгоритмы расчёта цвета каждой точки, чем осваивать разные DirectX/Opengl. Результат получился вполне хорош
Идея проста: поиск линейной интерполяции произвольной функции n-переменных. вот вы ленитесь читать приведённую ссылку, а там как раз написано, что любую функцию можно представить в виде суперпозиции линейных функций и функции двух переменных, и следовательно нейросетью можно представить любую функцию.
S>>что касается философии, то нейросети имеют очень ограниченную область применения, в первую очередь потому, что программисты возлагают большие надежды на их способность к самообучению, но при этом упускают из виду то, что эффективный характер обучения объекта подразумевает взаимодействие с этим объектом, а при взаимодействии объект ведёт себя совершенно иначе, чем при просто наблюдении. и вот тут-то нейросети наталкиваются на философский закон: нельзя познать систему до конца, если ты сам являешься её частью.
K>Ну не знаю, я слышал что сейчас большинство профессионального массового софта — это нейросети. Получается что их тренировать всё-таки намного легче, чем писать алгоритмы. Вот в этой теме
писали, что нейросеть для игры в шахматы быстро забила старые программы.
K>Можете пояснить другими словами насчёт взаимодействия и познания? Пока не понятно.
смотрите: вот есть сложная n-мерная функция X, нейросети для части n-мерных точек дают значения этой функции X, и нейросеть способна построить приближение этой функции, т.е. на выходе будет функция Y, которая для любой точки n-мерного пространства сможет вычислить значение, которые будут примерно равно значению функции X в этой точке.
Чем больше значений вы скормите нейросети, тем точнее Y будет приближаться к X.
И вот вы уже подобрались к задаче с помощью нейросети написать робота, который торгует на бирже, но не тут-то было, в вашем n-мерном пространстве, которое вы для себя изначально приняли, возникают новые переменные — ваши длинные и короткие ставки, которые также влияют на систему, которую вы пытаетесь "изучить". Причём не обязательно чтобы ваши ставки были большими, даже маленькие ставки как информационный прецедент могут влиять на цену. Очевидно, что если игнорировать собственные ставки, то нейросеть будет хуже, чем если их не игнорировать, если учитывать собственные ставки, то речь уже пойдёт не о функциях, а об уравнениях в n-мерном пространстве, как например x^2+y^2=1, и тут очевидно для одного x можно подобрать 2 разных y, например x = корень(1/2), y может быть равен корень(1/2) или -корень(1/2). в n-мерном пространстве при очень больших n эта ситуация настолько усугубляется, что любые попытки создать что-то вменяемое для больших n натыкается на экспоненциальный рост сложности или и вовсе на логические ошибки.
Вот более жизненный пример — задача распознавания печатного текста:
учишь учишь сеть на таймс-нью-роман, а потом даёшь ему текст на ариале и сеть начинает ложать, потом обучаешь на ариале, потом на другом шрифте и т.д.,
в итоге оказывается более эффективным у источника уточнять, что за шрифт, потом оказывается не плохо иметь базу данных слов, чтобы додумывть плохо распознанное, причём эта база данных из слов уже никакого отношения к нейросети не имеет, вообщем для имитации любого маломальски интелектуального процессе необходимо динамически изменять размерность обрабатываемых сигналов, а это, увы, неподсилу нейросетям.
Здравствуйте, Nikе, Вы писали:
N>Ага, монте-карло N>Не, прорыв произошёл, когда суперкомпы в каждый дом проникли, а все алгоритмы ещё в СССР были придуманы.
Ну ладно уж, все. CNN Ле Кун в 1988 предложил, это ещё в какой-то степени при СССР было, но не в нём, таки.
LSTM -- 1997
AlexNet (первый удачный пример DL) -- 2012
Какой-нибудь Mask-RCNN или pixel-link -- 2018
Всё ещё только начинается
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, steep8, Вы писали:
S>Здравствуйте, The Passenger, Вы писали:
TP>>вот именно поэтому сети и работают с бигдатами — без данных, сеть — просто набор мусора
TP>>и да — я полагаю функциональность сетей можно повторить и без сетей ... просто с сетяме проще ... иногда намного
S>Вот безусловно систему уравнений мы можем выписать и без сетей. но тогда придется отвечать на неудобные вопросы — для чего здесь x и почему он в степени и т.п. S>Т.е. защищать свою построенную модель. S>А тут все просто это же нейросеть, она все сама, я тут не причем, добавил слой, обучил , показал бигбоссу как оно круто работает на тестовых данных и вперед в S>продакшен. А как оно, а почему на эти вопросы можно не отвечать.
Попробуй напиши систему уравнений, чтобы отличить кошку от собаки на фотографии.
Здравствуйте, BrainSlug, Вы писали:
BS>для совсем чайников, красивые картинки и даже переведенные субтитры
Вроде я немного понял. Кажется работа (не обучение) нейронной сети – это банальное многократное перемножение матриц.
Вот пример из этого видео:
Это нейросеть из четырёх слоёв, которая видит картинку размером 28*28 пикселей (784) и на выходе даёт набор из 10 сигналов, каждый из которых соответствует цифре от 0 до 1 (если сигнал есть – значит цифра распозналась).
Первый слой имеет 784 элемента (нейрона), второй и третий – 16 нейронов, четвёртый – 10 нейронов.
Веса, определяющие переход от первого слоя ко второму, задаются набором из 784*16=12544 “синапсов”. Веса от второго к третьему слою – 16*16=256 “синапсов”. Веса от третьего к последнему слою – 16*10=160 “синапсов”. Суммарно имеем 12960 весов. Обучение нейронной сети заключается в хитрой оптимизации этих 12960 значений до тех пор, пока нейросеть не научится хорошо распознавать цифры. Пока всё правильно?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу. K>Я хотел бы написать на Delphi простую нейросеть, например распознающую буквы. Прошу подсказать хорошие книги и обучающие видеокурсы.
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Здравствуйте, Khimik, Вы писали:
K>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу.
В философском смысле сегодняшний бум нейросетей — это классический переход количества в качество. Вычислительные нейросети были придуманы давно, еще в 60-х, но были скорее демонстрационной игрушкой, а для практических применений было проще что-то явным образом запрограммировать. И только где-то в 80-90-х впервые появились достаточно дешевые вычислительные ресурсы, достаточные для того, чтобы чего-то практически полезное натренировать. Например, в OCR-программе Cuneiform в начале 90-х разработчики использовали нейросетку для тренировки в распознавании различных областей на бумаге (текст, таблицы, графика, свободные места). По-видимому, также поступили и в Finereader, но их исходники закрыты. Где-то к 2010-м годам появились и достаточные инструменты и ресурсы, чтобы нейросетками стали заниматься все кому не лень. Ну и теория, конечно развивалась.
Здравствуйте, anonymouse2, Вы писали:
A>Здравствуйте, Khimik, Вы писали:
K>>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу. K>>Я хотел бы написать на Delphi простую нейросеть, например распознающую буквы. Прошу подсказать хорошие книги и обучающие видеокурсы.
A>Можно начать например со статьи на вики: A>https://ru.wikipedia.org/wiki/Перцептрон
не уважаю я википедиков, но вот это тоже прочитайте, прежде чем программировать что-либо
S>в успехах alphago не разбирался, но сразу скажу навык игры в шахматы мало помогает в реальной жизни. на каком-нибудь хакатоне роботов alphago получила бы по щам. S>и прогноз погоды она бы не смогла нормальный составить.
вот как раз для прогноза погоды, при наличии достаточного количества данных, нейронные сети — самое оно
Здравствуйте, Khimik, Вы писали:
TP>>вот как раз для прогноза погоды, при наличии достаточного количества данных, нейронные сети — самое оно
K>Вот как такое получается? Прогноз же делать — это не в шахматы играть, нужна умная теория и т.д. Получается что нейронные сети уже более разумны, чем человек?
нет просто если при какихто обстоятельтсвах — давление, температура, облачность, время года, время дня и т.д. — шел дождь в 90% случаев.
то тогда вероятность дождя — 90% ... вот и все, никакой магии
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, The Passenger, Вы писали:
TP>>нет просто если при какихто обстоятельтсвах — давление, температура, облачность, время года, время дня и т.д. — шел дождь в 90% случаев. TP>>то тогда вероятность дождя — 90% ... вот и все, никакой магии
K>Ну вот я и говорю — что мешает обычному программисту перевести эти 90% в математическую модель на компьютере? А нет, человеческий умишко на это слабоват...
Именно в конкретном случае спорное утверждение.
Т.е. если у нас есть малое количество входных параметров, и в качестве выходы просто вероятность одного из двух событий, то мне сложно представить нейроную сеть которая бы работала успешно, но которую нельзя было бы повторить другой моделью "обычным" программистом — например теже самыми деревьями и т.п.
Здравствуйте, Vladek, Вы писали:
V>Здравствуйте, Khimik, Вы писали:
K>>Интерес у меня скорее теоретически-философский – понять, какой принцип лежит в основе работы нейросетей, как они “думают”. Ну и какие у них принципиальные преимущества перед обычным кодом с алгоритмами.
V>Нейросети применяются для замены алгоритмам, которые трудно формализовать (и соответственно реализовать). Ничего они не думают, это просто чёрный ящик, который настроили до нужной точности результатов.
Ничего не черный. Вполне себе прозрачный. Смотрел как оаботают наши нейросетевики, как анализируют процесс обучения, структуру и пр. В общем там все по слоям можно увидеть, что каждый слой делает. Можно из обученных сеток склеивать новые. Можно рисовать тепловые карты и смотреть на основе какой информации нейросеть «принимает решение» и тп.
Здравствуйте, Erop, Вы писали:
N>>Ага, монте-карло N>>Не, прорыв произошёл, когда суперкомпы в каждый дом проникли, а все алгоритмы ещё в СССР были придуманы.
E>Ну ладно уж, все. CNN Ле Кун в 1988 предложил, это ещё в какой-то степени при СССР было, но не в нём, таки. E>LSTM -- 1997 E>AlexNet (первый удачный пример DL) -- 2012 E>Какой-нибудь Mask-RCNN или pixel-link -- 2018
E>Всё ещё только начинается
Это всё мизерные рюшечки, тот же CNN лично я вывел сам в юности зная про нейронки в объёме перцептрона 60х, как и DL был довольно таки очевиден — каким-то алгоритмическим мегапрорывом его сложно считать. Появились мощные компы — появилась возможность играть с обучением сложных нейронок.
Пофиг на эмпирически подобранные функции, покажи новые способы поиска оптимумов.
Здравствуйте, The Passenger, Вы писали:
TP>вот как раз для прогноза погоды, при наличии достаточного количества данных, нейронные сети — самое оно
Для прогноза погоды давным давно придумали модели без всяких нейросетей. Если есть модель, на основе которой строятся системы уравнений, то нейросеть там только мешаться будет.
Здравствуйте, The Passenger, Вы писали:
TP>вот именно поэтому сети и работают с бигдатами — без данных, сеть — просто набор мусора
TP>и да — я полагаю функциональность сетей можно повторить и без сетей ... просто с сетяме проще ... иногда намного
Вот безусловно систему уравнений мы можем выписать и без сетей. но тогда придется отвечать на неудобные вопросы — для чего здесь x и почему он в степени и т.п.
Т.е. защищать свою построенную модель.
А тут все просто это же нейросеть, она все сама, я тут не причем, добавил слой, обучил , показал бигбоссу как оно круто работает на тестовых данных и вперед в
продакшен. А как оно, а почему на эти вопросы можно не отвечать.
S>Ну нейросеть это же просто суперпозиция функторов. Если у тебя нейросетевики такие офигенно умные и все знают, то зачем они вообще пользуются нейрорсетью? Пускай выпишут уравнения в явном виде и решают их.
У sharpcoder большая часть задач — обработка изображений. Решать такие задачи "уравнениями в явном виде" со схожей точностью невозможно.
Нейронные сети давно уже решают задачи которые алгоритмически хз как решать. Например яндекс и гугл переводчиики за последние пару лет довольно сильно подняли качество перевода — за счет использования нейронных сетей. От яндекса даже была статься на хабре на этот счет.
Из того, что можно пощупать — https://https://pjreddie.com/darknet/yolo/ — сеть, распознающая образы на видео, там и видео с демонстрацией есть и ссылка на git для пощупать ; вот выступление автора на TED — .
Есть неплохой курс "для кодеров" — http://course.fast.ai/start.html .
А питон лучше подучить, если в этой области развиваться хочешь.
S>Я конечно в изображениях полный профан, но вот сдается мне что как то и без нейросетей вполне себе изображения обрабатывали.
Плохо обрабатывали. С большим трудом и маленькой точностью.
S>Кстати, что такое обработка изображений?
Классификация, локализация, семантическая сегментация, поиск объектов, улучшение качества и ещё куча всяких задач.
S>распознавание это одно, улучшений качество другое, трансформация третье, там куча разделов в этой самой обработке и в S>больших книжках эта самая обработка как раз делается в явном виде без всяких нейросетей.
В "больших книжках" она не делается. В больших книжках рассказывают про подходы и алгоритмы для решения этих задач. И алгоритмы эти не на основе нейронных сетей работают в большинстве своём с очень хреновым качеством. На основе же нейросетей эти задачи сейчас решаются относительно легко и с хорошей точность.
DB>>Теория с 60х годов развилась очень сильно. И все эти годы нейросети вполне использовались для ограниченного круга задач. S>Ну да, в основном для защиты диссертации — 1001 метод обучения нейросети.
Нет.
S>Так давайте карты на стол, что там прорывного произошло кроме интерполяции точечек на графике?
Много чего.
S>А если я монте-карло начну точечки интерполировать это будет точнее или также или хуже? и почему?
Давай, научи. Посмотрим на результаты. К счастью, есть целая куча открытых данных и проверить результаты твоего "обучения монте-карло" очень легко. Думаю, ты просто не совсем понимаешь, о чём говоришь.
S>Давайте вот отложим хайп в сторону и посмотрим, что там изменилось с 2000-х годов? Компьютеры стали мощнее и мы можем черный ящик делать огроменных размеров? это не аргумент.
С 2000х годов изменилось очень много чего, как в технической составляющей (мощные GPU, TPU), так и в научной (в том числе подходы к обучению глубоких нейронных сетей).
_>Попробуй напиши систему уравнений, чтобы отличить кошку от собаки на фотографии.
Дело даже не в том, что такую систему уравнений сложно написать. Даже если модель и система уравнений существует, она может запросто оказаться такой, для решения которой нужны очень мощные компьютеры и для поиска решения всё равно будет требоваться куча времени. А нейронная сеть сделает вычисления гарантировано очень быстро.
Здравствуйте, De-Bill, Вы писали:
DB>В "больших книжках" она не делается. В больших книжках рассказывают про подходы и алгоритмы для решения этих задач. И алгоритмы эти не на основе нейронных сетей работают в большинстве своём с очень хреновым качеством. На основе же нейросетей эти задачи сейчас решаются относительно легко и с хорошей точность.
И конечно у тебя припасено несколько ссылочек на статьи, которые проводят сравнительный анализ алгоритмов обработки изображений с нейросетями?
S>И конечно у тебя припасено несколько ссылочек на статьи, которые проводят сравнительный анализ алгоритмов обработки изображений с нейросетями?
Зачем сравнивать алгоритмы? Сравнивают результаты. Но в настоящее время сравнивать результаты "классических алгоритмов обработки изображений" с результатми нейросетей уже смысла не имеет никакого. Сравнивают результаты нейронных сетей с разными архитектурами. Места для классических алгоритмов осталось не много. Но если тебе интересно, то можешь начать с MNIST (раздел сопоставление систем) . Это самый простой, можно сказать игрушечный, пример. Далее можешь порыться в архивах PASCAL VOC и ILSVRC. Наверное, года так до 2010 там были участники с решением не на нейронных сетях, потом по очевидным причинам их не стало.
Здравствуйте, steep8, Вы писали:
S>Для прогноза погоды давным давно придумали модели без всяких нейросетей. Если есть модель, на основе которой строятся системы уравнений, то нейросеть там только мешаться будет.
Проблема в том, что они не работают... А когда вдруг работают, делают это очень медленно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Michael7, Вы писали:
M>Здравствуйте, Khimik, Вы писали:
K>>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу.
M>В философском смысле сегодняшний бум нейросетей — это классический переход количества в качество. Вычислительные нейросети были придуманы давно, еще в 60-х, но были скорее демонстрационной игрушкой, а для практических применений было проще что-то явным образом запрограммировать. И только где-то в 80-90-х впервые появились достаточно дешевые вычислительные ресурсы, достаточные для того, чтобы чего-то практически полезное натренировать. Например, в OCR-программе Cuneiform в начале 90-х разработчики использовали нейросетку для тренировки в распознавании различных областей на бумаге (текст, таблицы, графика, свободные места). По-видимому, также поступили и в Finereader, но их исходники закрыты. Где-то к 2010-м годам появились и достаточные инструменты и ресурсы, чтобы нейросетками стали заниматься все кому не лень. Ну и теория, конечно развивалась.
M>Где-то так я это вижу.
в Finereader по состоянию на 2006 год не было нейросетей, и сейчас скорее всего нет. нейросети очень чуствительны к обучающему набору.
Здравствуйте, Salih, Вы писали:
S>в Finereader по состоянию на 2006 год не было нейросетей, и сейчас скорее всего нет.
Когда в 2008-2009 году только открыли исходники Cuneiform, там рылись в них, обсуждали, и в движке Tiger были замечены довольно явные следы (наборы коэффициентов и деревья), что это похоже было на продукт нейросетки. Если в Finereader их не было, это лишний раз доказывает, что для достижения результата они в принципе не обязательны.
S> нейросети очень чуствительны к обучающему набору.
Это да, вообще грамотно их обучить — это отдельная задача, но некоторым сейчас кажется, что нейросеть — это такой вид современной программистской халявы, типа создал сетку, нахапал данных и как в мясорубку пихаешь, а оно там само ништяки на выходе дает.
S>почитайте вот это с тех времён нейросети не продвинулись, если не сможете скачать, то напишитие в личку.
Ох, наверно так устану от чтения...
Мне ведь надо просто понять саму идею, "философию", а дальше я сам напишу на дельфи свою НС и буду её развивать. У меня вообще такой подход к программированию: например, моя графическая программа рисует трехмерные цилиндры и сферы, и мне было проще разобраться с низкоуровневым программированием, написать алгоритмы расчёта цвета каждой точки, чем осваивать разные DirectX/Opengl. Результат получился вполне хорош
.
S>что касается философии, то нейросети имеют очень ограниченную область применения, в первую очередь потому, что программисты возлагают большие надежды на их способность к самообучению, но при этом упускают из виду то, что эффективный характер обучения объекта подразумевает взаимодействие с этим объектом, а при взаимодействии объект ведёт себя совершенно иначе, чем при просто наблюдении. и вот тут-то нейросети наталкиваются на философский закон: нельзя познать систему до конца, если ты сам являешься её частью.
Ну не знаю, я слышал что сейчас большинство профессионального массового софта — это нейросети. Получается что их тренировать всё-таки намного легче, чем писать алгоритмы. Вот в этой теме
Здравствуйте, Khimik, Вы писали:
K> Ох, наверно так устану от чтения... K> Мне ведь надо просто понять саму идею, "философию", а дальше я сам напишу на дельфи свою НС и буду её развивать.
Философия у нее простая — это интерполяция. Берешь набор точек, по ним строишь интерполяционную функцию, ..., PROFIT.
Здравствуйте, andrey.desman, Вы писали:
AD>Философия у нее простая — это интерполяция. Берешь набор точек, по ним строишь интерполяционную функцию, ..., PROFIT.
А т.к. количество таких функций бесконечно большое, то и результаты получаются различные , типа игра в угадайку.
А потом раз в критичный момент и окажется, что функция была не та .
Здравствуйте, steep8, Вы писали:
S>Здравствуйте, andrey.desman, Вы писали:
AD>>Философия у нее простая — это интерполяция. Берешь набор точек, по ним строишь интерполяционную функцию, ..., PROFIT.
S>А т.к. количество таких функций бесконечно большое, то и результаты получаются различные , типа игра в угадайку. S>А потом раз в критичный момент и окажется, что функция была не та .
золотые слова!
Здравствуйте, The Passenger, Вы писали:
TP>Здравствуйте, Khimik, Вы писали:
K>>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу.
TP>По мне так сеть — это больше как большая вероятностная база данных ( поэтому даже стали появляться даже топики о том что сча сети пихают везде и даже там где достаточно SQL ) TP>с той лишь разницей что к базе есть конкретный запрос и получишь конкретный ответ TP>а на запрос к сети ( подача данных на вход )ты получаешь чтото типа хайли лайкли.
TP>тренировка сети — это чтото типа набивание такой базы.
TP>т.е. сети не думают от слова вообще ... вот комбинации сетей думаю смогут больше ( точнее могут — например игровые системы такие как alphago имеют сети для расознавания картинки и для логики TP>свои подсети )
TP>
в успехах alphago не разбирался, но сразу скажу навык игры в шахматы мало помогает в реальной жизни. на каком-нибудь хакатоне роботов alphago получила бы по щам.
и прогноз погоды она бы не смогла нормальный составить.
Здравствуйте, Khimik, Вы писали:
K>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу. K>Я хотел бы написать на Delphi простую нейросеть, например распознающую буквы. Прошу подсказать хорошие книги и обучающие видеокурсы.
Насколько я понимаю, надо читать Andrew Ng. Вроде он на курсере курс ведёт или где-то там.
K>https://zennolab.com/discussion/threads/nejronnye-seti-raspoznovanie-cifr-prostym-jazykom.35859/
K>Здесь задача уж очень примитивная – распознать один из 10 растров в 3*5 пикселей, которые обозначают цифру. Это проще реализовать банальным перебором и сравнением, я вообще не вижу тут алгоритмической задачи. Мне хочется написать нейросеть, которая сможет распознавать искажённые, наклонённые, сплющенные и т.д. буквы.
Надо понимать, что нейросети известны уже давно, я лет 15 назад читал книгу по нейросетям. Но пользу они начали приносить недавно после изобретения некоторых прорывных алгоритмов обучения.
K>В интернете приводятся примеры в основном на Питоне, я надеюсь Delphi тоже вполне подходит для такой задачи. Если Питон – более высокоуровневый язык и это достаточно важно, может мне сначала нужно выучить Питон.
Насколько я понимаю, для пайтона есть очень качественные реализации нейросетей, в том числе поэтому его и используют. Если хочешь реализовать сам движок нейросетей, можно, наверное, и на дельфе, но это уже другая задача, в общем-то чисто техническая. Нейросеть для чайников обычно подразумевает готовый движок, а ты уже учишься его пользовать. Вряд ли ты напишешь что-то сопоставимое по скорости с существующими лидирующими библиотеками.
K>Ещё добавлю, что когда я изучал Delphi, я не мог въехать в принципы ООП по книгам; до меня всё дошло только тогда, когда я сходил на курсы к живому человеку. Поэтому для освоения НС мне, возможно, необходимы хорошие видео. Мне кажется, лучшим вариантом было бы видео, где знающий человек долго объясняет профанам суть концепции, и до тех понемногу начинает доходить.
Не хочу пока на английском, надеюсь что найдётся альтернатива на русском. От английского я слишком устаю.
Хотелось бы всё-таки найти хорошее видео на русском.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
S>>в успехах alphago не разбирался, но сразу скажу навык игры в шахматы мало помогает в реальной жизни. на каком-нибудь хакатоне роботов alphago получила бы по щам. S>>и прогноз погоды она бы не смогла нормальный составить.
TP>вот как раз для прогноза погоды, при наличии достаточного количества данных, нейронные сети — самое оно
Вот как такое получается? Прогноз же делать — это не в шахматы играть, нужна умная теория и т.д. Получается что нейронные сети уже более разумны, чем человек?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Я хотел бы написать на Delphi простую нейросеть, например распознающую буквы. Прошу подсказать хорошие книги и обучающие видеокурсы. K>В интернете приводятся примеры в основном на Питоне, я надеюсь Delphi тоже вполне подходит для такой задачи. Если Питон – более высокоуровневый язык и это достаточно важно, может мне сначала нужно выучить Питон.
Проблем не в языке, а в существующей базе примеров — после того как, или даже паралельном с тем, как вы будет осваивать базу — хорошо играться с примерами различных подходов, алгоритмов и т.п. — например a3c и прочее, прчоее. Они как правило на Питоне в первую очередь.
Но я уверен что враппер к тому же Tensorflow есть и для дельфи — берите его и вперед.
K>Интерес у меня скорее теоретически-философский – понять, какой принцип лежит в основе работы нейросетей, как они “думают”. Ну и какие у них принципиальные преимущества перед обычным кодом с алгоритмами. K>Кроме НС для распознавания букв, интересно было бы написать НС, например, для игры в преферанс, только боюсь это очень сложная задача.
Сложность этой задаче сугубо в реализации агента в котором будет все симулироваться — обычно это делают для https://github.com/openai/gym
Далее, мне кажется вполне одна из реализация asynchronous advantage actor-critic algorithm (a3c) справиться достаточным образом.
K>Ещё добавлю, что когда я изучал Delphi, я не мог въехать в принципы ООП по книгам; до меня всё дошло только тогда, когда я сходил на курсы к живому человеку. Поэтому для освоения НС мне, возможно, необходимы хорошие видео. Мне кажется, лучшим вариантом было бы видео, где знающий человек долго объясняет профанам суть концепции, и до тех понемногу начинает доходить.
Если вы хотите фундаментально — то вот — https://ru.coursera.org/learn/vvedenie-mashinnoe-obuchenie
Дальше уже конкретика по тому что вам интересно в первую очередь.
Но повторюсь — в целом паралельном мучать примеры и делать реализации очень полезно.
Для этого все же лучше освоить Python
Здравствуйте, The Passenger, Вы писали:
TP>нет просто если при какихто обстоятельтсвах — давление, температура, облачность, время года, время дня и т.д. — шел дождь в 90% случаев. TP>то тогда вероятность дождя — 90% ... вот и все, никакой магии
Ну вот я и говорю — что мешает обычному программисту перевести эти 90% в математическую модель на компьютере? А нет, человеческий умишко на это слабоват...
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Young, Вы писали:
Y>Именно в конкретном случае спорное утверждение. Y>Т.е. если у нас есть малое количество входных параметров, и в качестве выходы просто вероятность одного из двух событий, то мне сложно представить нейроную сеть которая бы работала успешно, но которую нельзя было бы повторить другой моделью "обычным" программистом — например теже самыми деревьями и т.п.
вот именно поэтому сети и работают с бигдатами — без данных, сеть — просто набор мусора
и да — я полагаю функциональность сетей можно повторить и без сетей ... просто с сетяме проще ... иногда намного
Здравствуйте, Khimik, Вы писали:
K>Ну вот я и говорю — что мешает обычному программисту перевести эти 90% в математическую модель на компьютере? А нет, человеческий умишко на это слабоват...
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, vsb, Вы писали:
vsb>>Я бы начал отсда: https://www.coursera.org/learn/machine-learning
K>Не хочу пока на английском, надеюсь что найдётся альтернатива на русском. От английского я слишком устаю. K>Хотелось бы всё-таки найти хорошее видео на русском.
Здравствуйте, Salih, Вы писали:
S>почитайте вот это с тех времён нейросети не продвинулись, если не сможете скачать, то напишитие в личку.
Продвинулись очень сильно...
S>Мой совет: почитайте математику лежащую в основе нейросетей — она интересная, но прежде чем программировать приложения задумайтесь на сколько ваша нейросеть будет чувствительна к обучающему набору? может оператор или эвристические алгоритмы/шаблоны справятся лучше? К примеру: Abbyy по состоянию на 2006 год нейросети точно не использовала, да и сейчас скорее всего не использует.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Salih, Вы писали: S>в итоге оказывается более эффективным у источника уточнять, что за шрифт, потом оказывается не плохо иметь базу данных слов, чтобы додумывть плохо распознанное, причём эта база данных из слов уже никакого отношения к нейросети не имеет, вообщем для имитации любого маломальски интелектуального процессе необходимо динамически изменять размерность обрабатываемых сигналов, а это, увы, неподсилу нейросетям.
Во-первых, рекурентные сети придумали очень давно.
Во-вторых, после того, как придумали LSTM, их ещё и учить научились
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, The Passenger, Вы писали:
TP>вот как раз для прогноза погоды, при наличии достаточного количества данных, нейронные сети — самое оно
С синтетикой будут проблемы...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
S>Ничего не черный. Вполне себе прозрачный. Смотрел как оаботают наши нейросетевики, как анализируют процесс обучения, структуру и пр. В общем там все по слоям можно увидеть, что каждый слой делает.
Нейронные сети не ограничиваются свёрточными, а задачи, которые с помощью них решают, не ограничиваются обработкой изображений. Как, например, понять, что делает fully connected neural network из нескольких уровней, которая по 20 показателям прибора в скважине рассчитывает 21й?
Здравствуйте, Khimik, Вы писали:
K>Да, придётся всё-таки для начала почитать книжку...
Если ты про питон, то не надо особо парится. В рамках того, что тебе надо будет, тебе только numpy будет не понятно. Его и заботай.
А если ты про DL, то книжек пока толковых нет, или мало. Так что лучше качай, запускай и пробуй шевелить.
Остальное по моему конспекту просто смотри, и всё поймёшь.
Потом и книжку лучше поймёшь, кстати.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, The Passenger, Вы писали:
TP>>вот как раз для прогноза погоды, при наличии достаточного количества данных, нейронные сети — самое оно
E>С синтетикой будут проблемы...
Здравствуйте, vsb, Вы писали:
vsb>Надо понимать, что нейросети известны уже давно, я лет 15 назад читал книгу по нейросетям. Но пользу они начали приносить недавно после изобретения некоторых прорывных алгоритмов обучения.
Ага, монте-карло
Не, прорыв произошёл, когда суперкомпы в каждый дом проникли, а все алгоритмы ещё в СССР были придуманы.
Здравствуйте, De-Bill, Вы писали:
DB>Нейронные сети не ограничиваются свёрточными, а задачи, которые с помощью них решают, не ограничиваются обработкой изображений. Как, например, понять, что делает fully connected neural network из нескольких уровней, которая по 20 показателям прибора в скважине рассчитывает 21й?
1) сколько нейронов на уровнях? Вход, как я понял, 20, выход -- 1, а между?
2) как и с какой функцией потерь учили?
3) активация RELU?
С большой вероятностью кусочно-линейно аппроксимирует...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
E>1) сколько нейронов на уровнях? Вход, как я понял, 20, выход -- 1, а между?
4-5 слоёв по 40-20 нейронов (т.е. параметров не так уж и много).
E>2) как и с какой функцией потерь учили?
mse. А вот как — это и есть большой вопрос. SGD и вариации дают хорошую точность, но не достаточную. Как визуализировать и понять, что нейросеть делает, чего ей не хватает, да и вообще возможно ли получить с помощью неё требуемую точность и как? Получается хороший такой чёрный ящик, понять что и как он делает нереально, можно только поиграть метапараметрами. И в конечном счёте, когда она начала работать с достаточной точностью, как обосновать, что её можно пускать в производство? Только на основании того, что 100.000 раз она выдала правильное решение, а значит и на 100.001 будет тоже правильное?
E>3) активация RELU?
да
E>С большой вероятностью кусочно-линейно аппроксимирует...
С большой вероятностью, что нет. 20 мерное пространство — это серьёзно. Расстояния между известными ближайшими точками в среднем огромные, а нейросеть довольно маленькая.
Здравствуйте, sharpcoder, Вы писали:
S>Ничего не черный. Вполне себе прозрачный. Смотрел как оаботают наши нейросетевики, как анализируют процесс обучения, структуру и пр. В общем там все по слоям можно увидеть, что каждый слой делает. Можно из обученных сеток склеивать новые. Можно рисовать тепловые карты и смотреть на основе какой информации нейросеть «принимает решение» и тп.
Ну нейросеть это же просто суперпозиция функторов. Если у тебя нейросетевики такие офигенно умные и все знают, то зачем они вообще пользуются нейрорсетью? Пускай выпишут уравнения в явном виде и решают их. Наверняка если увидеть уравнения в явном виде, то и решение будет более быстрым и точным. Ну а поскольку они модель не знают и уравнения в явном виде записать не могут, то и работают они с сетью как с черным ящиком. Рисуют всякие тепловые карты .
DB> И в конечном счёте, когда она начала работать с достаточной точностью, как обосновать, что её можно пускать в производство? Только на основании того, что 100.000 раз она выдала правильное решение, а значит и на 100.001 будет тоже правильное?
Это и есть основная проблема с нейросетями. У нас нет модели, а давайте зафигачим нечто наукообразное. Под капотом там обычная "функция", которой мы пытаемся интерполировать "точечки" на "графики". Поскольку таких функций через точки можно провести бесконечно количество, то конечно наша "нейросеть" найдет какую то "функцию".
Почему надо ипользовать именно эту, а не другую "функцию" ? на это вопрос ответа нет, как правило о нем "нейросетевики" даже не задумываются. Это помимо того что надо подготовить правильные входные данные, понять как признаки у данных значимые. В итоге вполне может получится, что все люди которые ели огурцы умерли, на основе этого делаются выводы космического масштаба.
Вообще теория нейросетей была развита в 60-х. С появлением нормальных компов у ученых возник к ним интерес в конце 90-х начале 2000-х. После этого интерес как то угас — прорыва никакого не получилось. Зато сейчас нейросети стали пользоваться спросом у "программистов". Тут же думать особо не надо — фигачь данные в черный ящик и результат какой то будет, если че подкрутим параметры и покажем на митинге как круто сеть работает на тестовых данных .
Здравствуйте, De-Bill, Вы писали:
DB>У sharpcoder большая часть задач — обработка изображений. Решать такие задачи "уравнениями в явном виде" со схожей точностью невозможно.
Я конечно в изображениях полный профан, но вот сдается мне что как то и без нейросетей вполне себе изображения обрабатывали.
Кстати, что такое обработка изображений? распознавание это одно, улучшений качество другое, трансформация третье, там куча разделов в этой самой обработке и в
больших книжках эта самая обработка как раз делается в явном виде без всяких нейросетей.
Здравствуйте, De-Bill, Вы писали:
DB>Теория с 60х годов развилась очень сильно. И все эти годы нейросети вполне использовались для ограниченного круга задач.
Ну да, в основном для защиты диссертации — 1001 метод обучения нейросети.
DB>Нейросети стали пользоваться спросом, потому что произошёл технологический и научный прорыв, и нейросети стали применимыми для очень широкого круга задач.
Так давайте карты на стол, что там прорывного произошло кроме интерполяции точечек на графике? А если я монте-карло начну точечки интерполировать это будет точнее или также или хуже? и почему?
Давайте вот отложим хайп в сторону и посмотрим, что там изменилось с 2000-х годов? Компьютеры стали мощнее и мы можем черный ящик делать огроменных размеров? это не аргумент.
Здравствуйте, Nikе, Вы писали:
N>Это всё мизерные рюшечки, тот же CNN лично я вывел сам в юности зная про нейронки в объёме перцептрона 60х, как и DL был довольно таки очевиден — каким-то алгоритмическим мегапрорывом его сложно считать. Появились мощные компы — появилась возможность играть с обучением сложных нейронок. N>Пофиг на эмпирически подобранные функции, покажи новые способы поиска оптимумов.
Если ты игрался с нейронками, то должен понимать, что глубокий многослойный полносвязный перцептрон обучить невозможно. Градиенты затухают по экспоненте...
Так что прорыв именно в том, что придумали такие глубокие архитектуры, которые можно обучить.
Если тебе интересны алгоритмические прорывы, то, например смотри на дропуат
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, De-Bill, Вы писали:
E>>С большой вероятностью кусочно-линейно аппроксимирует...
DB>С большой вероятностью, что нет. 20 мерное пространство — это серьёзно. Расстояния между известными ближайшими точками в среднем огромные, а нейросеть довольно маленькая.
При чём тут расстояния? Всё что твоя сеть умеет -- это свёртки и линейное программирование за счёт активации
Вопрос в том, есть ли у неё какая-то обобщающая сила.
С т. з. гарантий, можно попробовать какую-нибудь регуляризацию, например. Ещё можно с дропаутами обучать, по идее коллегия сетей надёжнее...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
E>При чём тут расстояния? Всё что твоя сеть умеет -- это свёртки и линейное программирование за счёт активации E>Вопрос в том, есть ли у неё какая-то обобщающая сила. E>С т. з. гарантий, можно попробовать какую-нибудь регуляризацию, например. Ещё можно с дропаутами обучать, по идее коллегия сетей надёжнее...
Ок, похоже, ты не совсем понял, про что я, но это не важно.
Здравствуйте, Nikе, Вы писали:
N>Это всё мизерные рюшечки, тот же CNN лично я вывел сам в юности зная про нейронки в объёме перцептрона 60х, как и DL был довольно таки очевиден — каким-то алгоритмическим мегапрорывом его сложно считать. Появились мощные компы — появилась возможность играть с обучением сложных нейронок. N>Пофиг на эмпирически подобранные функции, покажи новые способы поиска оптимумов.
А зачем?
В многомерном пространстве большинство экстремумов — это седловые точки.
Что же до последних достижений — например, чисто инженерный(архитектурный) трюк с residual блоком,
который позволил делать сети практически произвольной глубины за счет того, что эти блоки изначально просто
копируют вход на выход и лишь когда сети потребуется и их "вычислительная мощность" они включаются в работу.
K>Мне кажется, лучшим вариантом было бы видео, где знающий человек долго объясняет профанам суть концепции, и до тех понемногу начинает доходить.
для совсем чайников, красивые картинки и даже переведенные субтитры https://www.youtube.com/watch?v=aircAruvnKk
а дальше книжки...в НС скорее важно некоторое знание математики, нежели языка (затем уже важен тот иди иной фрэймворк)
Здравствуйте, De-Bill, Вы писали:
DB>Ок, похоже, ты не совсем понял, про что я, но это не важно.
Почему? Я тебя понял. Ты боишься, что есть какие-то области в пространстве состояний входа, для которых сеть сделает неверное обобщение, а реальных данных в датасете не будет, и всё сломается, когда реактор выйдет на такой режим (или что там у вас рулится этим прибором?)
Сетка эта даёт кусочно-линейную аппроксимацию. Если есть физические основания надеяться, что внутри непокрытых датасетом областей линейная аппроксимация подойдёт, то будет работать, если нет, то нет.
Но тут есть такой момент, что редкие точки редко будут не только при посещении попадаться, но и при работе.
Ещё можно по упрощённой физ. модели предобучить, например.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, steep8, Вы писали:
S>Ну нейросеть это же просто суперпозиция функторов. Если у тебя нейросетевики такие офигенно умные и все знают, то зачем они вообще пользуются нейрорсетью?
От задачи зависит. В задачах аппроксимации часто нейросети дают выигрыш по скорости на какой-нибудь SIMD архитектуре...
То есть можно написать тормозную честную модель, которая численно дифуры решает и там ещё что-то долгое делает, а потом нагенерить ей синтетики и на этом сеть обучить. Потом на частых реальных данных можно ещё и доучить, кстати...
Но задача аппроксимации сильно не единственная задача, которую можно решать сетями.
Например, задача переноса стиля. Мы берём твой почерк, и надпись сделанную мной, и хотим мою надпись на выходе, твоим почерком.
Или берём на входе кучу роликов с Обамой, и сценку сыгранную мной, а на выходе хотим ролик, который сыграл я, но что бы "играл" в нём Обама.
Какие прямые методы решения такой задачи ты предлагаешь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, steep8, Вы писали:
S>Почему надо ипользовать именно эту, а не другую "функцию" ? на это вопрос ответа нет, как правило о нем "нейросетевики" даже не задумываются. Это помимо того что надо подготовить правильные входные данные, понять как признаки у данных значимые. В итоге вполне может получится, что все люди которые ели огурцы умерли, на основе этого делаются выводы космического масштаба.
То, что написано выше и есть теория, которой 50 лет в обед уже. Современное понимание намного круче.
S>Вообще теория нейросетей была развита в 60-х. С появлением нормальных компов у ученых возник к ним интерес в конце 90-х начале 2000-х. После этого интерес как то угас — прорыва никакого не получилось. Зато сейчас нейросети стали пользоваться спросом у "программистов". Тут же думать особо не надо — фигачь данные в черный ящик и результат какой то будет, если че подкрутим параметры и покажем на митинге как круто сеть работает на тестовых данных .
Люди придумали как смотреть на нейросети не как на инструмент аппроксимации, а как на инструмент обобщения и получения закономерностей.
Пример задачи, которую нейросеть решает очень хорошо -- построение пространства признаков.
Ну и штуки вроде GAN, сильно выходят за задачу аппроксимации...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, steep8, Вы писали:
S>Вот безусловно систему уравнений мы можем выписать и без сетей. но тогда придется отвечать на неудобные вопросы — для чего здесь x и почему он в степени и т.п. S>Т.е. защищать свою построенную модель.
Есть куча задач, где модель построить нельзя. Скажем распознавание арабицы или речи
S>А тут все просто это же нейросеть, она все сама, я тут не причем, добавил слой, обучил , показал бигбоссу как оно круто работает на тестовых данных и вперед в S>продакшен. А как оно, а почему на эти вопросы можно не отвечать.
Можно обучить на синтетике, построенной по модели, можно проверить, что предсказания сети соответствуют модели в широком диапазоне параметров. Если аппроксимация сети кусочно-линейная, можно построить границы линейных кусков и построить области особенностей модели и потестировать вокруг пересечений и т. д...
Но халтурить можно и с сетями и без. Анекдот про эвакуированного сфероконя знаешь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, steep8, Вы писали:
S>Кстати, что такое обработка изображений? распознавание это одно, улучшений качество другое, трансформация третье, там куча разделов в этой самой обработке и в
У меня есть серия фоток камерофоном с трясущихся рук, в тёмной комнате, с точечным, дающим блики источником света документа с печатями и подписями, который держат в руке, и он, соответственно, тоже болтается.
Задача -- получить отдельно три вещи
1) карту глубин для каждого из изображений документа (либо тех частей, для которых можно достоверно построить)
2) распрямлённые изображения "слоя" с печатями и подписями
3) распрямлённое изображение слоя с текстом.
При этом для (2) и (3) убрать шум, смаз и расфокусировку.
Вперёд и с песнями, можешь сетями, можешь дифурами, можешь Фурье. Пусть расцветает сто цветов, когда засохнут будет много сена
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, steep8, Вы писали:
S>Давайте вот отложим хайп в сторону и посмотрим, что там изменилось с 2000-х годов? Компьютеры стали мощнее и мы можем черный ящик делать огроменных размеров? это не аргумент.
Всё ровно наоборот. "Чёрный ящик" научились очень сильно "сушить", и сделали полупрозрачным
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, steep8, Вы писали:
S>И конечно у тебя припасено несколько ссылочек на статьи, которые проводят сравнительный анализ алгоритмов обработки изображений с нейросетями?
Я бы мог написать несколько таких статей, но NDA того
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Khimik, Вы писали:
K>Это нейросеть из четырёх слоёв, которая видит картинку размером 28*28 пикселей (784) и на выходе даёт набор из 10 сигналов, каждый из которых соответствует цифре от 0 до 1 (если сигнал есть – значит цифра распозналась). K>Первый слой имеет 784 элемента (нейрона), второй и третий – 16 нейронов, четвёртый – 10 нейронов. K>Веса, определяющие переход от первого слоя ко второму, задаются набором из 784*16=12544 “синапсов”. Веса от второго к третьему слою – 16*16=256 “синапсов”. Веса от третьего к последнему слою – 16*10=160 “синапсов”. Суммарно имеем 12960 весов. Обучение нейронной сети заключается в хитрой оптимизации этих 12960 значений до тех пор, пока нейросеть не научится хорошо распознавать цифры. Пока всё правильно?
Более или менее да, но есть ещё активация. А так суперпозиция линейных операторов была бы тоже линейным оператором просто
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Пока по-прежнему почти ничего не понимаю (. Наверно большая часть поста посвящена специфике обучения НС.
У меня возник такой вопрос.
Предположим, я пишу НС, которая распознаёт цифры в изображении 16*16 из готового набора шаблонов, например таких:
Т.е. задача крайне простая – если рисунок совпадает, например, с первым, то НС даёт 1.
Очевидно, для этого достаточно собрать НС из двух слоёв, первый 256 нейронов, второй 10 нейронов. Матрица весов будет 256*10=2560, и каждая строка этой матрицы будет представлять собой всё тот же рисунок буквы, как выше.
А теперь я хочу усложнить задачу: пусть НС распознаёт эти же цифры, но в произвольном положении, например так:
Что нужно добавить в описанную двухслойную сеть, чтобы это заработало? Сколько слоёв надо добавить?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Предположим, я пишу НС, которая распознаёт цифры в изображении 16*16 из готового набора шаблонов, например таких:
K>А теперь я хочу усложнить задачу: пусть НС распознаёт эти же цифры, но в произвольном положении, например так:
K>Image: c1bsh.JPG
K>Что нужно добавить в описанную двухслойную сеть, чтобы это заработало? Сколько слоёв надо добавить?
Я так понял, ты решил подавать на вход сети картинку побольше 16х16, а например, 20х20?
Ну, например, можно твою сеть заменить на CNN 16х16х3 -> 1х1х256, а потом 1х1х256 -> 1х1х10
Это будет аналог твоей сети, а потом сделать пулинг со всего окна до 1x1x10
Только проблема в том, что для решения таких задач НС плохо подходят и решают их плохо и смысла их использовать мало.
Надо более сложные задачи смотреть, вернее более подходящие для сети. Скачай себе MNIST, например, получишь картинки рукописных цифр, поймёшь о чём речь
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
K>>Что нужно добавить в описанную двухслойную сеть, чтобы это заработало? Сколько слоёв надо добавить?
E>Я так понял, ты решил подавать на вход сети картинку побольше 16х16, а например, 20х20?
Нет, на входе всё те же 16*16 пикселей, просто картинка может быть чуть сдвинута.
E>Ну, например, можно твою сеть заменить на CNN 16х16х3 -> 1х1х256, а потом 1х1х256 -> 1х1х10 E>Это будет аналог твоей сети, а потом сделать пулинг со всего окна до 1x1x10
Что такое CNN? Что такое пулинг?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Khimik, Вы писали:
K>> Нет, на входе всё те же 16*16 пикселей, просто картинка может быть чуть сдвинута. E>То есть исходная 16х16 с полями? Или часть картинки утрачивается при сдвиге?
Нет, всегда размер 16*16 пикселей, просто изображение единички может быть сдвинуто, например, на пару пикселей вправо (не настолько далеко, чтобы потерять часть картинки).
E>Пуллинг -- это ещё один нелинейный слой, который берёт наш "квадратик" 4х4х10 и заменяет его квадратиком 1х1х10, выбирая каждый раз максимальной значение из 16-и.
Я чувствую какую-то путаницу в обозначениях. Здесь 4*4 — это размер растра, а третья цифра (10) — количество вариантов значений в каждом растре?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, anton_t, Вы писали:
_>Нейронные сети давно уже решают задачи которые алгоритмически хз как решать. Например яндекс и гугл переводчиики за последние пару лет довольно сильно подняли качество перевода — за счет использования нейронных сетей. От яндекса даже была статься на хабре на этот счет.
Ради интереса. Яндексопереводчик инглиш<->рашн — вполне на уровне. А вот Дойч->Русиш — на уровне промт 15-летней давности. Недообучили? Или меньше обратной связи и т.п. Про остальные языки я уже и не спрашиваю. А может просто база инглиш выражений накопилась? Без иронии, просто интересно.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Khimik, Вы писали:
E>>>Пуллинг -- это ещё один нелинейный слой, который берёт наш "квадратик" 4х4х10 и заменяет его квадратиком 1х1х10, выбирая каждый раз максимальной значение из 16-и.
K>>Я чувствую какую-то путаницу в обозначениях. Здесь 4*4 — это размер растра, а третья цифра (10) — количество вариантов значений в каждом растре? E>Да, обычно это называют "число каналов"
Нет, кажется вы меня путаете.
E>Идя CNN в том, что есть некое "окошко", например 13х13, которое скользит по исходной картинке, и вычисляет с ОДНИМИ И ТЕМИ ЖЕ коэффициентами свёртки, например 128 разных свёрток. В результате (если не дополнять исходную картинку 16х16 нулями), получим "картинку" 4х4 в каждом "пикселе" которой лежит 128 чисел. Теперь можем сделать ещё одну свёртку, которая из 128 числе делает 10 (то есть матрица 128х10), получаем 10 вероятностей, что в соответствующем тому или иному "пикселю" квадрате есть та или иная цифра.
Всё-таки, судя по этому тексту, обозначение 4*4*128 значит, что в каждом "пикселе" растра 4*4 содержится 128 чисел. Т.е. этот массив всё-таки трехмерный, а не двумерный, как мне вначале показалось.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Всё-таки, судя по этому тексту, обозначение 4*4*128 значит, что в каждом "пикселе" растра 4*4 содержится 128 чисел. Т.е. этот массив всё-таки трехмерный, а не двумерный, как мне вначале показалось.
Да, массив, конечно, 3-х-мерный. Я же там везде пишу, про отображение трёхмерных массивов?
Но воспринимать его можно как двухмерное многоканальное изображение.
Вот, например, RGB картинку ты как воспринимаешь? Как 2D — массив трёхканальных пикселей, или как 3D-массив? По идее можно и так и так.
Но для CNN, пуллинга и прочих подобных слоёв, первое представление удобнее.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Идя CNN в том, что есть некое "окошко", например 13х13, которое скользит по исходной картинке, и вычисляет с ОДНИМИ И ТЕМИ ЖЕ коэффициентами свёртки, например 128 разных свёрток. В результате (если не дополнять исходную картинку 16х16 нулями), получим "картинку" 4х4 в каждом "пикселе" которой лежит 128 чисел. Теперь можем сделать ещё одну свёртку, которая из 128 числе делает 10 (то есть матрица 128х10), получаем 10 вероятностей, что в соответствующем тому или иному "пикселю" квадрате есть та или иная цифра.
Я полагаю, это "окошко" в данном случае нужно как раз для того, чтобы чуть сдвинутая цифра распозналась не хуже оригинальной.
Откуда берётся 4*4 — понятно, а почему именно 128 коэффициентов свертки?
А далее для каждого "пикселя" с 128 "компонентами цвета" эти 128 чисел превращаются в 10 таким же способом — умножением на матрицу? А матрицы для умножения должны быть одинаковые или разные для каждого из 4*4 пикселей?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
E>>Да, обычно это называют "число каналов"
K>Нет, кажется вы меня путаете.
Да, я неверно понял про число вариантов.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Khimik, Вы писали:
K>Я полагаю, это "окошко" в данном случае нужно как раз для того, чтобы чуть сдвинутая цифра распозналась не хуже оригинальной. K>Откуда берётся 4*4 — понятно, а почему именно 128 коэффициентов свертки?
Ну я так понял, что в исходной сети был ещё один слой их примерно 13х13 нейронов, следующая матрица из 128 в 10 -- это он Можно 169 взять, но я думаю, что и 128 хватит
K>А далее для каждого "пикселя" с 128 "компонентами цвета" эти 128 чисел превращаются в 10 таким же способом — умножением на матрицу? А матрицы для умножения должны быть одинаковые или разные для каждого из 4*4 пикселей?
Оба раза да
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
K> ... Поэтому для освоения НС мне, возможно, необходимы хорошие видео. Мне кажется, лучшим вариантом было бы видео, где знающий человек долго объясняет профанам суть концепции, и до тех понемногу начинает доходить.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Khimik, Вы писали:
K>>Я полагаю, это "окошко" в данном случае нужно как раз для того, чтобы чуть сдвинутая цифра распозналась не хуже оригинальной. K>>Откуда берётся 4*4 — понятно, а почему именно 128 коэффициентов свертки? E>Ну я так понял, что в исходной сети был ещё один слой их примерно 13х13 нейронов, следующая матрица из 128 в 10 -- это он Можно 169 взять, но я думаю, что и 128 хватит
Если 169, то я это понимаю так: исходный слой из 13*13 нейронов умножается на выделенный участок растра тоже размером 13*13; это не матричное умножение, просто для каждого пикселя значения из обоих растров перемножаются, получается третий растр. Всё так?
K>>А далее для каждого "пикселя" с 128 "компонентами цвета" эти 128 чисел превращаются в 10 таким же способом — умножением на матрицу? А матрицы для умножения должны быть одинаковые или разные для каждого из 4*4 пикселей?
E> Оба раза да
Сорри, ещё раз: матрицы для превращения 128 компонентов в 10 одинаковые для всех 4*4 ячеек?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Если 169, то я это понимаю так: исходный слой из 13*13 нейронов умножается на выделенный участок растра тоже размером 13*13; это не матричное умножение, просто для каждого пикселя значения из обоих растров перемножаются, получается третий растр. Всё так?
Нет, именно матричное 169 или 13х13 с одной стороны и 169 с другой, или 128 или 100 или ещё сколько-то...
В оригинальной же (твоей) сетке был полносвязанный слой, где каждый нейрон зависел от каждого входа?..
K>>>А далее для каждого "пикселя" с 128 "компонентами цвета" эти 128 чисел превращаются в 10 таким же способом — умножением на матрицу? А матрицы для умножения должны быть одинаковые или разные для каждого из 4*4 пикселей?
E>> Оба раза да
K>Сорри, ещё раз: матрицы для превращения 128 компонентов в 10 одинаковые для всех 4*4 ячеек?
Да одинаковые, в этом идея CNN, что одно и то же ядро применяется во всех местах растра.
И первая матрица 13х13 на 169 тоже одна для всех положений квадратика 13х13
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Понять как работает нейронная сеть крайне просто. Нейронка по сути это машинка по преобразования сигнала типа А в сигнал типа Б. Но как сигнал в мире преобразовать? Сигнал в природе это обычно гладкая или кусочно-гладкая функция, которая естественно раскладывается в ряды (на множители или по синусам), что бы поставить знак равенства между двумя рядами А и Б — нужно подобрать коэффициенты преобразования. В конце концов вы решаете задачу оптимизации преобразования путем подбора коэффициентов. Подавая вариативные данные, вы и подбираете наиболее близко коэффициенты преобразования (т.е. обучаете нейронку) — т.е. в матрицу преобразования записываете значения, подбирая каждый из них более точно. Это все в рамках одного слоя, дальше добавляя слои, вы уже на основе тех данных разложения принимаете их как сигнал и делаете так же... уже с ними... в конце концов имеете разложение уже нужного вам сигнала (то что вы хотите получить в качестве результата вашей сети). Если при обучении данные будут слишком отличаться, то сигнал будет не гладким, и разложение в ряд станет не возможно и получится каша в весах разложения со всеми вытекающими. В общем все очевидно.
S>что касается философии, то нейросети имеют очень ограниченную область применения, в первую очередь потому, что программисты возлагают большие надежды на их способность к самообучению, но при этом упускают из виду то, что эффективный характер обучения объекта подразумевает взаимодействие с этим объектом, а при взаимодействии объект ведёт себя совершенно иначе, чем при просто наблюдении. и вот тут-то нейросети наталкиваются на философский закон: нельзя познать систему до конца, если ты сам являешься её частью. S>Мой совет: почитайте математику лежащую в основе нейросетей — она интересная, но прежде чем программировать приложения задумайтесь на сколько ваша нейросеть будет чувствительна к обучающему набору? может оператор или эвристические алгоритмы/шаблоны справятся лучше? К примеру: Abbyy по состоянию на 2006 год нейросети точно не использовала, да и сейчас скорее всего не использует.
подскажите пожалуйста что можно почитать по эвристическим алгоритмам/шаблонам
Здравствуйте, Erop, Вы писали:
E>И первая матрица 13х13 на 169 тоже одна для всех положений квадратика 13х13
Я вроде понял так.
Напомню, текущая задача – НС, которая распознаёт цифры от 0 до 9 на рисунке 16*16 из готового шаблона, но с произвольным сдвигом; например должно распознаваться это:
Делается НС из трёх слоёв. “Синапсы” от первого ко второму слою – это массив 256*16*10; последний индекс соответствует цифре, первый – исходному растру, второй – это массив окошек общим размером 4*4.
Например, в этом массиве слой X*1*1 выглядит, например, так:
Здесь внешние пиксели чёрные, поскольку окно имеет размер 13*13, то что за этими границами – просто обнуляется. Я рисую неточно. Вторая цифра 1 в X*1*1 означает левое нижнее окошко, третье – что распознаётся единица.
При перемножении исходной картинки 16*16 на эту матрицу синапсов получается матрица 16*10. Опять же, последний индекс – конкретная цифра которая распознаётся, первый – номер пикселя в растре 4*4.
Если на вход подавался рисунок с единицей, который изображён в начале поста, то эта матрица 16*10 будет большей частью заполнена нулями или близкими к нулю значениями, за исключением элемента 16*1: он будет равен 1.0, что означает что в пикселе с номером 4*4 картинки совпали и при перемножении растров получилось максимальное значение.
Здесь, правда, я уже изрядно запутался. Во-первых, я стал рисовать цветные рисунки, в то время как для начала проще было бы разобраться с бинарными чёрно-белыми. Во-вторых, если перемножать бинарные растры, то наверно должно использоваться умножение XOR (ноль на ноль дают один, один на один тоже дают один). А как сделать XOR для небинарных рисунков, да ещё цветных – мне непонятно.
В третьих, чтобы при перемножении совпадающих шаблонов получилось в сумме 1.0, надо ещё их отнормировать.
Но это наверно частности. Далее идёт переход от второго к третьему слою: в каждом слое 4*4 значения просто суммируются, и получается массив из 10 чисел. Если на вход подавался рисунок двойки (в любом положении), то второй элемент массива будет равен 1.
Тем не менее, а я по-прежнему не вижу философского камня фундаментального принципа НС. Возникает такой вопрос: не является ли изложенная выше НС относительно медленной по сравнению с продвинутыми НС, которых обучали по Deep Learning и которые могут распознавать гораздо более произвольные рисунки?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Здравствуйте, Khimik, Вы писали:
K>Я прочитал одну книгу про нейросети, и по-прежнему осознаю, что не понимаю, что это такое. Т.е. я вижу, что нейросети “думают” принципиально другим образом, чем программы, которые мы пишем, но ничего конкретнее сформулировать не могу. K>Я хотел бы написать на Delphi простую нейросеть, например распознающую буквы. Прошу подсказать хорошие книги и обучающие видеокурсы.