Приветствую любителей порассуждать о том, как скоро нейросети отнимут работу у человека и захватят мир. А также тех, кто этой темой никогда не интересовался. В общем, устраивайтесь по удобней.

Я планирую выпустить несколько статей, в которых расскажу о своих попытках воссоздать нейросеть в оригинальном ее виде. Т.е. повторить функционал настоящего нейрона, а затем и целой нейросети в коде.

С чего все началось

Нейросетями я пользовался давно. С ностальгией вспоминаю насколько убогой была первая версия ChatGPT... И меня всегда интересовал вопрос о подкапотном устройстве хотя бы самой простой из них. Но как только я начинал лезть в эту тему, меня тут же спускала на землю ОНА. Да, да - МАТЕМАТИКА. Так как математику я мягко говоря не люблю, а нейросети не отпускают мое любопытство, я решил пойти другим путем.

Во первых, возник вопрос, оправдывает ли "нейросеть" свое название? Действительно ли математические модели нейронных сетей так похожи на то, что происходит в нашей черепной коробке.

Во вторых, было бы интересно именно воссоздать нейросеть в оригинальном ее смысле. И посмотреть что из этого выйдет.

Наверняка, я не первый, кто это делает. Но смотреть на результаты других довольно скучно... поэтому поехали!

Нейробиология

Как можно программировать нейрон, не зная что он себя представляет? Поэтому, прочитав пару статей из интернета, пообщавшись с ChatGPT и отсмотрев десяток лекций из этого замечательного плейлиста, я пришел к следующим выводам.

  • На первом этапе нужно забыть о мозге целиком и его структурах, потому что до сих пор точно не изучено каким образом они все взаимодействуют

  • Существуют разные типы нейронов, но, применив главный принцип человека разумного - абстракцию, я могу создать только одну модель нейрона и получать любой другой, изменяя характеристики исходного

  • Существует большое количество клеток, которые поддерживают жизнь нейрона. Их тоже можно исключить из модели

  • Так как самые примитивные нейросети не предоставляют организмам более чем возможность передвигаться и питаться, то и мне не стоит сразу смотреть в сторону решения сложных задач. Пусть нейросеть хотя бы позволит оживить модельку червя

Устройство нейрона

Внешне нейрон выглядит так:

Внутреннее устройство нейрона. Подробнее смотрите лекции: первую и вторую.

Работа нейрона делится на четыре части.

Часть 1: Создание потенциала

Тут мы вводим новое понятие: "нейротрансмиттер", или же "нейромедиатор". Это некоторое вещество, которое способно открывать специальные каналы в дендритах. Через эти каналы в нейрон попадают положительно и отрицательно заряженные ионы.

Ионы в свою очередь создают электрический потенциал. Когда потенциал достигает порогового значения, происходит передача потенциала по аксону.

Часть 2: Передача потенциала

Благодаря электрическому потенциалу открываются каналы, которые впускают ионы натрия, которые в свою очередь открывают следующие каналы. Получается цепная реакция, которая проходит по аксону.

Когда ионы натрия доходят до конца аксона, они открывают другие каналы, которые впускают ионы кальция.

Часть 3: Выброс нейромедиаторов

В процессе жизни нейрона вырабатывается большое количество веществ. В том числе и нейромедиаторы. Это тоже довольно увлекательный процесс, но описывать его я сейчас не буду.

Эти вещества в пузырьках передаются к концу аксона.

Ионы кальция позволяют этим пузырькам слиться с телом нейрона и выбросить их в СИНАПС. Синапс - это место, где связаны дендриты одного нейрона и отростки аксона другого.

Часть 4: Реполяризация

Далее идет волна реполяризации. Она движется в обратную сторону и выравнивает электрический потенциал. После чего нейрон снова готов принимать нейромедиаторы. Цикл завершен.

Надеюсь из моего краткого описания у вас появилось хотя бы малейшее понимание работы нейрона. Переходим к коду.

Общая схема

Общая схема работы нейросети выглядит так:

Общая модель нервной системы в организме
Общая модель нервной системы в организме

Допустим, что класс контроллера это кожа. Она генерирует импульс на нейрон. Далее нейросеть обрабатывает этот импульс. И через другие нейроны импульс возвращается на класс контроллер. Например, на мышцы, чтобы существо сжалось от внешнего раздражителя.

Рассчет нейросети будет происходить в простом цикле. Нейросеть будет инициировать действия внутри нейрона, а также передавать нейротрансмиттеры между нейронами. Для начала запрограммируем сам нейрон.

Класс нейрона

Применяя абстракцию от сложных химических и биологических терминов в ходе длительных размышлений, я пришел к следующему

class Neuron:
    def __init__(self, name):
        self.name = name
        self.treshold = 10  # treshold of activation
        self.returnablity = 0.1  # percent of remaining transmitters
        self.speed = 5  # the less, the faster signal will be sent after activation
        self.recovery = 5  # if 0, neuron ready to send signal. -=1 on each step after

        self.sta = 5  # sta - steps to activation. Set > 0 when created to autostart
        self.str = 0  # str - steps to recovery

        # outer tm
        self.dendrite = [0, 0]  # recieve from another synaps
        self.synapse = [0, 0]  # send to another neuron and reset to zero

        # inner tm
        self.reproductivity = [0.5, -0.1]  # amount of transmitters + on each step
        self.accumulated = [0, 0]  # move to synapse and set accumulated * returnability

        self.current_state = [0, 0]  # how many transmitters in synapse; before calculations complete
        self.last_state = [0, 0]  # after calculations; [activator, ingibitor]

Давайте по порядку.

# outer tm
self.dendrite = [0, 0]  # recieve from another synaps
self.synapse = [0, 0]  # send to another neuron and reset to zero

Нейромедиаторы в общем бывают двух видов: возбуждающие и подавляющие. В зависимости от того, положительные или отрицательные ионы они впускают. Поэтому абстрагируемся от конкретных веществ. Пусть нулевой элемент всегда отвечает за положительные, а первый за отрицательные.

dendrite - отвечает за хранение возбуждающих и подавляющих нт, получаемых на дендритах

synapse - отвечает за хранение их же, но в синапсе(между дендритами одного и аксоном другого)

self.treshold = 10  # treshold of activation
self.sta = 5  # sta - steps to activation. Set > 0 when created to autostart
self.speed = 5  # the less, the faster signal will be sent after activation

Когда потенциал превышает пороговое значение treshold, происходит передача потенциала. Она отражена в переменной-счетчике sta. То есть через sta итераций произойдет выброс нт в синапс. При каждой активации нейрона, она устанавливается в константное значение speed.

self.recovery = 5  # if 0, neuron ready to send signal. -=1 on each step after
self.str = 0  # str - steps to recovery

После передачи нт нейрон восстанавливается. str еще одна переменная-счетчик.

# inner tm
self.reproductivity = [0.5, -0.1]  # amount of transmitters + on each step
self.accumulated = [0, 0]  # move to synapse and set accumulated * returnability

Все время существования нейрона в нем вырабатываются нейротрансмиттеры. reproductivity показывает сколько будет создано на каждой итерации. А accumulated - сколько уже содержится в нейроне.

Да, это довольно прямолинейная и топорная логика, но в будущем при желании можно использовать какие-либо функции для динамического рассчета нт.

Когда счетчик sta оказывается в нуле, значения из accumulated назначаются в synapse, а accumulated обнуляется.

Следующие связанные нейроны будут брать нт из synapse, а часть нт будет возвращена из synapse в accumulated. (Да, часть нт возвращается обратно в нейрон)

self.current_state = [0, 0]  # how many transmitters in synapse; before calculations complete
self.last_state = [0, 0]  # after calculations; [activator, ingibitor]

current_state хранит уровень потенциала в нейроне. Так как рассчет происходит последовательно в цикле, то может возникнуть такая ситуация, что нейрон должен принять нт из множества других, но один уже был рассчитан, а остальные еще нет. Поэтому для каждого нейрона введен дополнительный атрибут last_state, который будет обновлен для каждого нейрона после завершения рассчетов. Т.е. в процессе рассчета новые данные записываются в current_state, а используются last_state.

На схеме это выглядит следующим образом

А это уже целая нейросеть!

Класс нейросети

Хорошо, класс нейрона есть. Но сам по себе он бесполезен. Его нужно заставить работать.

class Network:
    def __init__(self):
        #  replace axons and dendrites with it
        self.neurons: {Neuron: [Neuron]} = {}
        self.run = False

Словарь neurons хранит все нейроны в нейросети в качестве ключей, а также список нейронов с которыми он связан в качестве значений.

А также есть флаг run, который помогает останавливать нейросеть, когда она запущена в отдельном потоке.

Далее пару методов для создания и редактирования сети

# first to second (one way communication)
def link(self, n1, n2):
    if n2 in self.neurons[n1]:
        self.neurons[n1].remove(n2)
    else:
        self.neurons[n1].append(n2)
def add(self, n: Neuron):
    self.neurons[n] = []

И наконец, главная логика ее работы

  def maincycle(self):
      while self.run:
          for neuron in self.neurons.keys():
              neuron.step()
              tm = neuron.synapse
              neuron.synapse[0] = neuron.synapse[0] * 0.1
              neuron.synapse[1] = neuron.synapse[1] * 0.1
              amount = len(self.neurons[neuron])
              for dendrite in self.neurons[neuron]:
                  dendrite.dendrites((tm[0]/amount, tm[1]/amount))

          for neuron in self.neurons.keys():
              neuron.last_state = neuron.current_state

          time.sleep(0.01)

Здесь мы проходим по всем нейронам в словаре. Распределяем нейротрансмиттеры из синапса поровну по всем связанным с ним нейронам. А затем обновляем состояния каждого.

Как вы могли заметить, в цикле вызывается метод step нейрона. Он реализует логику его работы

def step(self):
    self.accumulated[0] += self.reproductivity[0]
    self.accumulated[1] += self.reproductivity[1]
    if self.str > 0:
        print(pcns(), self.name, 'ВОССТАНАВЛИВАЮСЬ')
        self.str -= 1
    elif self.sta == 1:
        print(pcns(), self.name, 'ВЫБРАСЫВАЮ')
        self.sta = 0
        self.synapse[0] += self.accumulated[0]
        self.synapse[1] += self.accumulated[1]
        self.accumulated[0] = self.accumulated[0] * self.returnablity
        self.accumulated[1] = self.accumulated[1] * self.returnablity
        self.str = self.recovery
    elif self.sta > 0:
        print(pcns(), self.name, 'ПЕРЕДАЮ')
        self.sta -= 1
    elif self.last_state[0] + self.last_state[1] > self.treshold:
        print(pcns(), self.name, 'АКТИВИРУЮСЬ')
        self.current_state = [0, 0]
        self.sta = self.speed
    else:
        print(pcns(), self.name, 'НАКАПЛИВАЮ')
        self.current_state[0] += self.dendrite[0]
        self.current_state[1] += self.dendrite[1]
        self.dendrite[0] = 0
        self.dendrite[1] = 0

И метод dendrites для приема нт из синапса

def dendrites(self, tm):
    print(pcns(), self.name, 'ПРИНИМАЮ')
    self.dendrite[0] += tm[0]
    self.dendrite[1] += tm[1]

Теперь попробуем это все запустить

if __name__ == '__main__':
    net = Network()
    net.run = True
    threading.Thread(target=net.maincycle).start()
    n1 = Neuron('ПЕРВЫЙ')
    n2 = Neuron('ВТОРОЙ')
    net.add(n1)
    net.add(n2)
    net.link(n1, n2)
Часть вывода в консоли

-----------1------------
386500223981600 ПЕРВЫЙ ПЕРЕДАЮ
386500224013300 ВТОРОЙ ПРИНИМАЮ
386500224025400 ВТОРОЙ ПЕРЕДАЮ
-----------2------------
386500727221500 ПЕРВЫЙ ПЕРЕДАЮ
386500727240500 ВТОРОЙ ПРИНИМАЮ
386500727253100 ВТОРОЙ ПЕРЕДАЮ
-----------3------------
386501230345700 ПЕРВЫЙ ПЕРЕДАЮ
386501230378100 ВТОРОЙ ПРИНИМАЮ
386501230395500 ВТОРОЙ ПЕРЕДАЮ
-----------4------------
386501739995900 ПЕРВЫЙ ПЕРЕДАЮ
386501740041700 ВТОРОЙ ПРИНИМАЮ
386501740061700 ВТОРОЙ ПЕРЕДАЮ
-----------5------------
386502247167700 ПЕРВЫЙ ВЫБРАСЫВАЮ
386502247208500 ВТОРОЙ ПРИНИМАЮ
386502247231500 ВТОРОЙ ВЫБРАСЫВАЮ
-----------6------------
386502761955400 ПЕРВЫЙ ВОССТАНАВЛИВАЮСЬ
386502761996500 ВТОРОЙ ПРИНИМАЮ
386502762028300 ВТОРОЙ ВОССТАНАВЛИВАЮСЬ
-----------7------------
386503265130200 ПЕРВЫЙ ВОССТАНАВЛИВАЮСЬ
386503265159800 ВТОРОЙ ПРИНИМАЮ
386503265181800 ВТОРОЙ ВОССТАНАВЛИВАЮСЬ

Все работает именно так, как и было задумано! (хотя при первом прочтении вряд ли это можно понять)

Графический интерфейс

Но ведь ничего не понятно! Скажете вы. И я с вами полностью согласен. Поэтому посидев часок с ChatGPT я смог получить графический интерфейс на pygame.

С помощью этого интерфейса можно добавлять нейроны, удалять, создавать и удалять связи. Сохранять и загружать модели, перемещаться по экрану и масштабировать. А также выводить показатели в реальном времени. (Я был приятно удивлен качеством работы ChatGPT 4.0)

Здесь подсвечена связь во время передачи сигнала
Здесь подсвечена связь во время передачи сигнала

Исходный код можно найти в моем github.

Заключение

Мне удалось реализовать изначальную задумку. Все работает так, как я и хотел. Был удивлен, насколько математические модели нейросетей похожи на то, как они выглядят на самом деле.

В следующих статьях покажу, как я проектирую нейросеть. Попробую привязать ее к объектам и взаимодействовать с ними. А также вывести инструкцию по тонкой настройке нейросети(показателей, чьи значения можно изменять там ого-го).

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

В общем, идей еще очень много. По мере их реализации, буду писать новые статьи. Спасибо за прочтение!

Комментарии (10)


  1. yMad
    20.06.2024 07:37
    +2

    Есть такой проект, называется Blue Brain, ему уже прилично лет.


  1. Dddn
    20.06.2024 07:37

    Тут ещё до конца не изучено как мозг работает. Мне так показалось по чтению статей, например, когда люди живут без части мозга. А вы уже его воссоздаёте. Но ИИ сейчас на хайпе, так что ок)


  1. phenik
    20.06.2024 07:37

    Функции биологических нейронов, например, пиромидальных можно моделировать с помощью ИНС (1, 2, 3, 4).


  1. ebt
    20.06.2024 07:37
    +1

    Очень хорошо, но как это будет работать, скажем, с классическим датасетом MNIST?


    1. Tiques Автор
      20.06.2024 07:37

      Об этом я собираюсь рассказать в следующей статье. На самом деле я уже сейчас пришел к тому, откуда появились математические модели и понял все их преимущества. Но попытка воссоздать сеть, где сигналы подаются и обрабатываются не синхронно имеет место быть


  1. avam78
    20.06.2024 07:37

    Поизучайте NuPIC от Numenta
    Они вот такое как вы и делают - нейроны, дендриты, слои.
    И давольно давно и масштабно.


  1. Vsevo10d
    20.06.2024 07:37
    +5

    Я не айтишник, и плохо понимаю код (даже псевдокод). Поэтому если что, поправляйте.

    Прежде всего, вы предельно упростили нейрон, взяв только ходжкиновский принцип потенциала действия (все или ничего) и выброс нейротрансмиттеров. То есть, свели логику нейрона к АЦП с оптроном. Ладно, ок, забудем про шванновские клетки и миелин, электрический синапс (без нейротрансмиттеров), ок, вам ГПТ сказал, что это не нужно. Пусть.

    У вас есть фраза:

    Здесь мы проходим по всем нейронам в словаре. Распределяем нейротрансмиттеры из синапса поровну по всем связанным с ним нейронам. А затем обновляем состояния каждого

    Я ее не до конца понял. Конкретный нейротрансмиттер, принадлежащий к возбуждающему либо тормозному типу, вырабатывается в конкретном типе нейронов (они так и называются, холинергические, пептидергические, ГАМК-ергические и т.д.). Конкретный нейрон может быть только одного типа. Возбуждающий не может стать тормозным. Нейротрансмиттер в нем не меняется.

    Был удивлен, насколько математические модели нейросетей похожи на то, как они выглядят на самом деле

    Ну так вы из своих единиц-"нейронов" создали классическую нейросеть со входами-выходами-коэффициентами.

    Вот вам пример работы реальной системы обратных связей в базальных ганглиях, которые контролируют целенаправленные движения человека:

    Тут нет места коэффициентам внутри этой системы, после сигналов моторной коры - все должно работать железобетонно, если не работает, разрегулируется - получаем паркинсонизм или иные двигательные расстройства.

    Далее, у вас в модели нейрон - сущность со входом и выходом. Но у живого тысячи входов и выходов! Дендритные шипики, синаптические зоны на аксоне, бешеное количество точек контакта с соседними и отстоящими на полметра нейронами и рецепторными полями. И нейротрансмиттер выбрасывается не везде одинаково! И самое главное - никто не знает, как именно распределяются мощности входных сигналов, чтобы стать достаточными для возбуждения потенциала действия. Но именно в их количестве, конфигурации и мощности и заложены архитектура сетей мозга, потенциал к нейропластичности (обучение, развитие новых навыков), компенсаторные возможности. И все это вовсе не организовано в слои, как у компьютерных нейросетей.

    Архитектура гораздо сложнее, чем у перцептрона, или сверточных сетей, где-то она имеет четкие обратные связи, как в примере в видео, а где-то - гораздо более сложное "горизонтальное" устройство. До конца ее никто не знает, известен коннектом только самых простых мозгов, типа червя C. elegans с его 302 нейронами, но там вообще нет места пластичности, эта сеть по сравнению с человеческим мозгом - как детская игрушка на рассыпухе по сравнению с процессором, она работает скорее по закону Ома, чем по принципам высшей нервной деятельности.

    Поэтому респект за попытку, но копайте дальше. Почитайте про биологический нейрон поподробнее, например в классической книге "От нейрона к мозгу". Вам важно построить именно стабильную систему с обратными связями и торможением сигнала, для простейших задач вроде рефлекса избегания или мышечной реакции на сенсорный сигнал. Если при моделировании ваши нейроны окажутся legit, тогда уже можно баловаться со всякими слоями коры ГМ и когнитивными задачами.


  1. piv1k
    20.06.2024 07:37
    +2

    TLDR: Ни пуха! Дело классное, но сложное!

    Приятно видеть нейро-энтузиаста на Хабре! Интересно посмотреть, что будет дальше. Мой личный опыт в программировании настолько скромный, что неприлично называть его опытом. Но хочу высказаться по части нейробиологии.

    Хоть я с некоторыми комментариями @Vsevo10d не вполне согласен, но он правилно заметил, что вам недостает более глубокого понимания нейробиологии. Некоторые подробности действительно можно опустить в зависимости от целей. Если вы хотите организовать максимально правдоподобную нейросеть, то это в действительности настолько сложно, что врядли получится сформулировать даже примерный ту-ду лист, чтобы это воплотить. Если хотите чуть усовершенствовать математические нейросети, приблизить их к реальным и сравнить эффективность, то ваша модель может занимать любое место между формализованной математической нейросетью и реальной. Будет ли между ними один контакт, сотни, или тысячи, будут ли у вас исключительно химические синапсы или с учетом электрических - вообще не критично. Модель по определению не может быть тождественна биологической сети со всей ее сложностью.

    Общее замечание таково, что представленная вами абстракция в действительности очень далека от реальных сетей. Вы правы, когда предполагаете, что созданием модели реальных нейронов уже кто-то обеспокоился. Этим занимаются серьезные научные коллективы.

    Еще одно общее замечание. У вас нет ни слова про пластичность, а это одна из наисущественнейших вещей в нейронных сетях. Гляньте про LTP, LTD, STD, STP, и тд. Мне кажется, вам зайдет эта теория. Считается, что именно нейропластичность является ключивым фактором в обучении, памяти и в целом функционировании нейросетей, мозга.

    На будущее имейте ввиду, что не-нейрональные клетки, особенно астроциты, выполняют не только лишь поддерживающую функцию. Можете почитать про tripartite synapse. Еще в далеком 2016 находил статью, где математически сравнивали модель синапса с астроцитом и без. Астроцит существенно модулирует передачу сигнала между нейронами через, например, выделение глиотрансмиттеров или захватывая нейромедиаторы из межсинапса. На первых парах их действительно не стоит учитывать, но не стоит и полностью отказываться от их рассмотрения в дальнейшем на основании их поддерживающей функции.

    Следующие связанные нейроны будут брать нт из synapse, а часть нт будет возвращена из synapse в accumulated. (Да, часть нт возвращается обратно в нейрон)

    Эта логика пренципиально неверна, если я правильно уловил мысль. Я за всю свою многолетнюю практику ниразу не слышал, чтобы дендриты захватывали нейротрансмитеры (киньте ссылку кто-нибудь на статью, если такое бывает). НТ временно связывается с рецептором на дендритах, после чего диффундирует из синапса (spillover), либо поглащается назад пресинапсом, либо поглащается астрацитом и передается в пресинапс (ацетилхолин так деградирует, если не ошибаюсь). Может есть и другие варианты, но вряд ли среди них присутствует поглощение дендритом. Развивая данную логику, правильно ли я понимаю, будто вы считаете, что поглащенные дендритами нт транспортируются затем по аксону в синаптическую терминаль, в пресинапс? Если так, то это тоже не вполне верно. НТ синтезируются в синаптической терминали аксона, в пресинапсе. Только нейропептиды (небольшой подкласс нт) синтезируются в теле, затем перемещаются по аксону в терминаль.

    А еще не очень понятно как вы оцениваете, что сеть работает. Вывод через принты говорит о том, что все циклы и блоки выполняются без ошибок, верно? Обычно выводят изменения потенциала, например, на одном из нейронов в зависитмости от поданных токов/напряжений или какой-нибудь другой график.

    Есть чоткая книга по нейродинамике от пацанов из EPFL. Там, конечно, много матана с диффурами и интегралами, но без них, увы, мало что сделаешь. Книга довольна сложная, но в ней присутствуют упражнения на пайтоне, которые могут вас на какие-то мысли навести.

    И действительно не понятно как у вас в сети разграничиваются функции возбуждающих/ингибирующих нейронов. Мало того, что они строго разграничены, как указал @Vsevo10d, так еще сущетсвуют разные их подтипы. Они и друг с другом находятся в очень не тривиальных отношениях. Гляньте тут на самые примитивные типы организации микросетей (Fig. 6). Или погуглите микроорганизацию коры, чтобы понимать важность хоть какой-нибудь типизации нейронов.

    А вообще весь пост мне напомнил один интересный проект, в котором авторы пытаются реальные нейроны заставить работать как нейросети. Вот статья и их вебсайт. Даже API написали. Любопытное направление.


    1. phenik
      20.06.2024 07:37

      Согласен с приведенными оценками, только одно замечание методологического характера.

      Есть чоткая книга по нейродинамике от пацанов из EPFL. Там, конечно, много матана с диффурами и интегралами, но без них, увы, мало что сделаешь.

      Есть предел вычислений сложного оптимального поведения в изменчивой среде который можно произвести с помощью аналитических методов, как для отдельных нейронов, так и сетей из них. Эволюция реализовала это в относительно простых организмах в которых структура и функции нейронов и сетей из них полностью предопределены генетически. Они фактически не настраиваются, в действуют сразу после рождения. Однако для более сложного поведения в усложненной и изменчивой среде этот метод уже не работает эффективно, включая с энергетической точки зрения. Поэтому для более сложных организмов эволюция от "аналитических" методов перешла к приближенным, "аппроксимационным". Это потребовало развития функций памяти и обучения - настройки нейронов и сетей и их специализации. Что это означает с методологической точки зрения? Можно продолжать поиски точного, аналитического описания активности нейронов в стиле модели Хаксли и Ходжикина, и поиска моделей формальных нейронов на них, а также архитектур сетей обучаемых с помощью метода обратного распространения ошибки, но это в перспективе заведет в тупик. Эволюция этот путь уже отработала на относительно простых организмах, и даже похоже попробовала некий аналог обратного распространения (хотя его исследования еще продолжается, возможно это рудиментарные остатки механизма), но остановилась на ассоциативном, хеббовском обучении (STPD). Т.е. перешла, условно говоря, от аналитических методов вычисления поведения к приближенным, настраиваемым с помощью обучения. Поэтому актуальнее подходы с обучением даже к моделированию поведения на уровне отдельных нейронов. Ссылки на такие работы в коменте выше (еще тут как это может влиять на архитектуру (слоистость) сетей).

      А вообще весь пост мне напомнил один интересный проект, в котором авторы пытаются реальные нейроны заставить работать как нейросети. Вот статья и их вебсайт. Даже API написали. Любопытное направление.

      Работа в правильном направлении. Но уже есть немалый задел для биологически более правдоподобных импульсных сетей и нейромофных решениях. Возможно будущее за ними.

      Для традиционных ИНС с учетом важности аппроксимационных возможностей моделей формальных нейронов и сетей, величайший конъюнктурщик всех времен и народов Макс Тегмарк;) проинтуичил, и развил новую архитектуру сетей KAN, которая дает такие возможности. Посмотрим как будет развиваться ситуация.


    1. phenik
      20.06.2024 07:37
      +1

      Согласен с приведенными оценками. Одно замечание методологического характера.

      Есть чоткая книга по нейродинамике от пацанов из EPFL. Там, конечно, много матана с диффурами и интегралами, но без них, увы, мало что сделаешь.

      Есть предел вычислений сложного оптимального поведения в изменчивой среде, который можно произвести с помощью аналитических методов, как для отдельных нейронов, так и сетей из них. Эволюция реализовала это в относительно простых организмах в которых структура и функции нейронов и сетей из них полностью предопределены генетически. Они фактически не настраиваются, действуют сразу после рождения. Однако для более сложного поведения в усложненной и изменчивой среде этот метод уже не работает эффективно, включая с энергетической точки зрения. Поэтому для более сложных организмов эволюция от "аналитических" методов перешла к приближенным, "аппроксимационным". Это потребовало развития функций памяти и обучения - настройки нейронов и сетей и специализации нейронов. Что это означает с методологической точки зрения? Можно продолжать поиски точного, аналитического описания активности нейронов в стиле модели Хаксли и Ходжикина, и поиска моделей формальных нейронов на них, а также архитектур сетей обучаемых с помощью метода обратного распространения ошибки, но это в перспективе заведет в тупик. Эволюция этот путь уже отработала на относительно простых организмах, и даже похоже попробовала некий аналог обратного распространения (хотя его исследования еще продолжается, возможно это рудиментарные остатки механизма), но остановилась на ассоциативном, хеббовском обучении (STPD). Т.е. перешла, условно говоря, от аналитических методов вычисления поведения к приближенным, настраиваемым с помощью обучения. Поэтому актуальнее подходы с обучением даже к моделированию поведения на уровне отдельных нейронов. Ссылки на такие работы в коменте выше (еще тут как это может влиять на архитектуру (слоистость) сетей).

      А вообще весь пост мне напомнил один интересный проект, в котором авторы пытаются реальные нейроны заставить работать как нейросети. Вот статья и их вебсайт. Даже API написали. Любопытное направление.

      Работа в правильном направлении. Но уже имеется немалый задел для биологически более правдоподобных импульсных сетей и нейромофных решений. Возможно будущее за ними.

      Для традиционных ИНС с учетом важности аппроксимационных возможностей моделей, величайший конъюнктурщик всех времен и народов Макс Тегмарк;) проинтуичил, и развил новую архитектуру сетей KAN, которая дает такие возможности. Посмотрим как ситуация будет развиваться.