В 2011 году читал книгу про ЭВМ времён СССР,не могу вспомнить название. В ней был показан принцип работы современных микропроцессоров на примере очень маленькой микросхеме и ещё там был раздел про нейронные сети и там также просто была показана суть их работы на примере небольшой схемы.
Истина и ложь заменяются значениями функции на отрезке от 1 до 0(концепция частичной правды), которая позволяет уйти от однозначного ответа на вопрос
У Onigiri очень неплохое есть затравочное видео: Правда оно очень многое оставляет за кадром. Если первые минуты про сеть с двумя нейронами посмотреть, то работавшему с трёхмерной графикой может стать очевидно, что сия нейросеть реализует ничто иное как умножение двумерного вектора на матрицу 2x2. А значит она просто проводит афинное преобразование точки со входов (как он сам их трактует) - а это комбинация из сжатий/растяжений/поворотов которая как то "выворачивает" входную точку превращая её в выходную. И весь цимес в том, чтобы развернуть её в пространстве таким образом, что если она голубая, то чтобы у неё координата X стала больше (сигнал на первом выходе), а если красная, то координата Y стала больше (сигнал на втором выходе). Собственно что он делает на виртуальном холсте - это красит двумерное пространство входных точек в цвета какая из координат на выходе станет больше по логике деления между синими и красными точками (эта нейросеть как раз старается понять красной точка является или синей на основе входного массива заданных им точек). Это чистое линейное преобразование довольно бесхитростное и так можно эффективно разделить точки только когда они действительно в исходном пространстве легко делятся на две отдельные хорошо отстоящие друг от друга группы. Однако да, возникает проблема с центром координат - нам еще надо не только сжимать/вращать, но и сдвигать центр координат. Опять таки знакомые люди с 3D-графикой понимают, что смещение в матрицы вводится увеличением размерности матрицы на одно измерение куда засядет линейная операция смещения независимая от X и Y что он и делает вводом единичного нейрона. Следующим шагом он вводит второй слой тоже из двух нейронов. Вот тут человек опять таки знакомый с трёхмерной графикой может опешить. Дело в том, что это будет просто второе умножение на матрицу. Но комбинацию из двух умножений матриц всегда можно заменить на одну. Это легко понять проследив все пути из выходов на входы и поняв что их можно просто заранее просуммировать слепив из двух слоёв один единственный. Это действительно так. Но почему тогда оно как то помогло и придало сети нелинейность? И вот этот момент он тоже совсем не озвучил - дело в том, что да, слои нейросетей из-за этого факта "усложняют" вводя функцию активации. Если его сорцы глянуть на которые есть ссылка под видео, то это вот эта строчка: Код (Text): l1.neurons[j] = activation.apply(l1.neurons[j]); Выходы слоёв на самом деле подвергаются преобразованию нелинейной функцией которая и называется функцией активации и таким образом в линейное афинное матричное умножение вводится существенная нелинейность которая ломает принцип "перемножение нескольких матриц можно заменить одной матрицей" и собственно приводит к существенному обогащению тех результатов что может теперь выдавать нейросеть - появляются изгибы, пространство уже не просто смещается/растягивается/вращается, но еще и перекручивается и взбивается венчиком нелинейности более сложным образом. Итого: повышая число нейронов в слое мы повышаем размерность пространства вариантов и сложность первичного афинного преобразования, а повышая число слоёв и играясь с функцией активации мы усугубляем нелинейность преобразования и повышаем изощрённость того каким замысловатым веером нейросеть может раскидать точки на выходе. Обучение в принципе своём это алгоритм градиентного спуска - алгоритм оптимизации который подбирает веса нейросети для достижения лучшего результата пользуясь математикой - ему нужно чтобы функции активации были дифференцируемыми и тогда он может считать аналитически как лучше подкручивать коэффициенты чтобы улучшать результат. Принципы зиждутся на том же на чём в старших классах школы нас заставляли искать минимумы/максимумы функций поиском того где их производные обращаются в ноль. Но это уже тема гораздо более глубокая и я сам уже почти всё забыл.
Да то же самое. У Onigiri только принцип выходов нейросети "какой больше, тот считается ответом" из двух ответов. Нетрудно при этом опять таки понять, что это функция X>Y и она разбивает двумерное пространство линией под 45 градусов к осям координат. А значит и классифицирующее афинное преобразование точек просто должно исходные повернуть и отмасштабировать так чтобы они удачно попали по разные стороны от этой разделяющей линии и без операции смещения это не всегда возможно сделать. На этом же видео один единственный выход уровень которого считается ответом, но геометрически если трактовать это уравнение a*X+b*Y=z где z после пропуска через функцию активации ужмётся в интервал [0,1]. А уравнение a*X+b*Y это не что иное как уравнение прямой проходящей через центр координат. А уравнение произвольной прямой на плоскости имеет вид a*X+b*Y+c=0. Вот этот "c" задающий смещение относительно начала координат и добавляет нейрон смещения, т.к. он всегда 1, то уравнение принимает вид a*X+b*Y+c*1=0, что то же самое что нам нужно. При этом выход z как число это там где должно быть 0 в уравнении прямой - там где он от 0 отличается это значит, что точка не лежит на прямой, а отстоит от неё на _знаковом_ расстоянии z. Расстояние со знаком, то есть отрицательное значит по одну выделенную сторону, а положительное - по другую выделенную сторону. Функция активации смещает это дело к [0;1] и серединой деления становится 0,5. А технически ровно та же геометрия в эн-мерных пространствах. И бинарная классификация это по сути рассечение облака точек какой то гиперповерхностью (в простейших случаях какие тут видны - гиперплоскостью/прямой) и определение с какой стороны они лежат.
aa_dav, а что делать если надо распределить на 3 класса данных, или например на 15? Самый цимес был бы в том, если алгоритм мог бы сам определить колличество классов
Классический подход для трёх классов - на выходе стоит три нейрона и чей сигнал больше, тот и принимается за детект. При этом как понятно можно оценивать "уверенность" нейросети в результате. Там где Onigiri на видео выше тестирует нейронку на распознавании цифр прекрасно видно 10 выходных нейронов. При этом мы начинаем говорить о том, что выходное пространство результата 10-мерное и по сути геометрически мы ищем в какую из "пирамид" с центром в центре координат попадает точка - если её координата вдоль оси K больше всех других, то она попадает в пирамиду вдоль оси K. Опять таки геометрически мы говорим о таком преобразовании исходных точек чтобы оно максимально достоверно разбросало их по этим пирамидам в конечном пространстве выходов нейросети. При этом надо помнить, что размерность пространства исходных точек уже сильно отличается от размерности выходных точек - ведь мы анализируем на входах в нейросеть уже множество пикселей картинки - каждый станет измерением входного слоя и его гиперпространства. Так или иначе де-факто нейросети это геометрические преобразователи пространств точек посредством смеси афинных и нелинейных преобразований. Чистая аналитическая геометрия.
Хорошо такой вопрос.А что если дать волю ИИ над всем что творится внутри микропроцессора над каждым транзистором.Что бы он нашёл какой то свой способ (всех мнемоник,чипсетов,драйверов и ТД).Я уверен он всё перепишет.
Filthmw, нейросеть это обычная математическая формула, её не то что на микропроцессоре, её на листке бумаги можно запустить. Нужно взять у deepmind коэффициенты, которые они насчитали для нейросети