Определение и изучение анализа нейронных всплесков.

Neuralink версии 0.9 - это электронный имплант, состоящий из крошечных проводов (микропровода из карбида кремния), которые входят в ваш мозг, каждый из которых содержит множество электродов, в общей сложности 1024 канала. До Neuralink отраслевым эталоном для имплантируемого интерфейса мозг-машина была матрица Utah (матрица кремниевых микроэлектродов), содержащая всего 100 каналов.

Массив Utah выглядит как набор больших коробок на вашей голове, инвазивно имплантированных медицинским экспертом, в то время как Neuralink невидима и автоматически устанавливается роботом менее чем за час.

Пишу

Каждый из каналов Neuralink имеет возможность одновременного чтения / записи, потенциально достигая от тысячи до десяти тысяч нейронов на электрод, так что можно записывать миллионы нейронов. Ожидается, что будущие версии Neuralink будут на порядки лучше. Представим, что Neuralink v4 имеет 100 000 каналов - тогда теоретически он может записывать до миллиарда нейронов.

Чтение

Нейроны общаются, распространяя «потенциалы действия», также известные как «нейронные шипы». 1024 микроэлектрода в Neuralink v0.9 могут измерять эти нервные импульсы. Затем настраиваемый ASIC Neuralink выполняет сортировку спайков для разделения активности нейронов, включая обнаружение спайков и назначение спайков конкретным нейронам. Предположительно, они используют ИИ для отслеживания каналов с нейронными данными (и отбрасывают каналы шума), а затем автоматически находят характерные формы.

Изучение текущих моделей

Поскольку мы не можем понять, как модели искусственного интеллекта Neuralink работают под капотом, давайте посмотрим, как на самом деле работают общедоступные нейронные модели искусственного интеллекта, такие как SpikeDeeptector. На высоком уровне для создания SpikeDeeptector использовалось три шага:

  • Соберите и пометьте данные о пиках.
  • Обучите DNN обнаруживать и классифицировать каналы (как нейронные или шумовые).
  • Сделайте вывод (запустите модель онлайн на пациентах с микроэлектродными имплантатами).

SpikeDeeptector использовал данные пациентов с тетраплегией, которым имплантировали вышеупомянутый массив из Юты, и пациентов, которым имплантировали глубинные электроды при подготовке к эпилептической операции. Пациенты с микропроводами имели 8–16 электродов, в то время как пациенты с двойными решетками Utah имели 196 электродов (две сетки 10x10 с четырьмя угловыми электродами, оставленными неподключенными в одной группе). Электроды матрицы Юты были около миллиметра в длину с расстоянием между электродами 400 мкм. Для пациентов с тетраплегией данные собирались в течение двух-четырех очных занятий каждую неделю в течение двух лет.

Аналоговая электрическая активность, собранная электродами, усиливалась и оцифровывалась с частотой дискретизации 30 кГц, а события пиков извлекались с помощью пороговой процедуры. Обнаруженные формы сигналов состояли из 48 отсчетов с длительностью 1,6 мсек, содержащих 15 отсчетов до и 32 отсчета после порога.

SpikeDeeptector рассматривает классификацию спайков как контролируемую задачу обучения, поэтому для обучения модели необходимы метки наземной достоверности. За один сеанс канал записывает сотни или даже тысячи необработанных сигналов. При 136 сеансах записи и 8 сеансах было 31,21 миллиона необработанных сигналов, соответствующих как нейронным событиям, так и внешним артефактам.

Данные были помечены полуавтоматическим способом, например:

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

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



Из 31,21 миллиона помеченных форм сигналов и пакета размером 20 было 1,56 миллиона помеченных векторов признаков. Затем данные были разделены на группы тестовых поездов, и были построены два варианта модели: сверточная нейронная сеть (CNN) и FNN (полносвязная нейронная сеть).

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

Интересно отметить, что оба варианта были значительно более точными на данных, полученных от пациентов с микропроводами (в отличие от тех, которые использовались микрочипами), даже несмотря на то, что пациенты с микропроводами имели примерно на порядок меньше каналов. Наивысшая точность составила 98,9%, что было достигнуто с помощью CNN на пациентах с микропроводами.

DetectCS

Другая библиотека - D etect CS, сокращение от обнаружения сложных всплесков. Это более нишевая библиотека, поскольку сложный всплеск относится к большому, быстрому электрическому событию, за которым следует медленный хвост меньших всплесков амплитуды.

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

Библиотека позволяет легко анализировать электрофизиологические сигналы. Например, ниже мы видим необработанный широкополосный сигнал клетки Пуркинье мозжечка, выбранный на частоте 25 кГц.

Глядя на «прошедший верхний» электрофизиологический сигнал, выявляются всплески. «Фильтр верхних частот» применяется для отфильтровывания медленных частот, обычно ниже 0,1 Гц, и, таким образом, уменьшения шума.

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

Как и SpikeDeeptector, используется сверточная нейронная сеть, а Alpha Omega Engineering Multi Spike Detector (MSD) использовался для сортировки простых всплесков в реальном времени в процессе сбора данных для DetectCS.

Волновой кластер

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

Я скачал данные в виде .ncs файла, который является форматом, используемым производителем системы записи. Следуя инструкциям по форматированию данных Neuralynx, мы можем импортировать данные следующим образом:

header_size = 16 * 1024 # Header has 16 kilobytes length
fid = open('CSC4.Ncs', 'rb')
fid.seek(header_size) # Skip header by shifting position by header size
data_format = np.dtype([('TimeStamp', np.uint64),
                         ('ChannelNumber', np.uint32),
                         ('SampleFreq', np.uint32),
                         ('NumValidSamples', np.uint32),
                         ('Samples', np.int16, 512)])
raw = np.fromfile(fid, dtype=data_format)
fid.close() # Close file 
sf = raw['SampleFreq'][0] # Get sampling frequency 
data = raw['Samples'].ravel() # Create data vector

Как мы видим, есть SampleFreq (точки данных, записываемые за секунду) и NumValidSamples, что означает, что мы можем построить график сигнала во времени с помощью вектора времени. Во-первых, давайте создадим временной вектор.

dur_sec = data.shape[0]/sf 
time = np.linspace(0, dur_sec,data.shape[0])

Вот наши данные на данный момент:

  • data.shape[0] - 61 000 192 строк данных
  • sf - 32 051 точка данных в секунду (герц)
  • dur_sec (длина выборки) составляет 1903 секунды.
  • time - наш массив numpy для построения графиков.

Давайте изобразим только первую секунду, используя вектор времени.

fig, ax = plt.subplots(figsize=(15, 5))
ax.plot(time[0:sf], data[0:sf])
ax.set_title('32 KHz Broadband Sampling'.format(sf), fontsize=23)
ax.set_xlim(0, time[sf])
ax.set_xlabel('Time in seconds')
ax.set_ylabel('Amplitude in microvolts')
plt.show()

Существует четкая циклическая закономерность, поэтому с первого взгляда мы можем сделать кое-что интересное. Однако, если мы посчитаем количество всплесков, мы обнаружим, что за одну секунду происходит 60 всплесков - 60 Гц, что равно частоте источника питания в США. То, что мы наблюдаем, - это просто электрический шум.

Мы хотим найти электрические сигналы - потенциалы действия длительностью от 1 до 2 миллисекунд, а не шум. Для этого мы отфильтруем необработанный широкополосный сигнал от 500 до 9000 Гц (исключая шум 60 Гц).

from scipy.signal import butter, lfilter
def filter_data(data, low=500, high=9000, order=2):
     nyq = sf/2 # Determine Nyquist frequency
     low = low/nyq # Setting bands
     high = high/nyq
     b, a = butter(order, [low, high], btype='band') # Calculate coefficients
     filtered_data = lfilter(b, a, data) # Filter signal
     return filtered_data

Затем мы вызовем нашу функцию для создания новых данных.

data = filter_data(data)

Наконец, мы можем запустить тот же графический код, что и раньше.

Колебания 60 Гц больше нет, и примерно через полсекунды появляется явный всплеск. Поскольку мы сделали это за 1 секунду, мы можем сделать это для всего набора данных за 1903 секунды, просто масштабируя наш процесс. Мы найдем точки данных выше определенного порога, определим окно для этих событий, чтобы выделить их, и выровняем их на максимальной высоте.

Сначала мы определяем функцию get_spikes.

Теперь мы можем построить кривые.

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

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

Вот пример трех сгруппированных сигналов из GitHub для полного руководства с использованием кластеризации k-средних, применяемой к основным компонентам данных.

Резюме

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

Год назад Neuralink записывал 20 000 выборок в секунду с разрешением 10 бит, что соответствует 200 000 бит в секунду (200 Мбит / с / 200 килобит) на чип. На 1024 каналах это около 204800 Мбит / с, сжатых в 200 раз с помощью встроенных алгоритмов, до, по совпадению, 1024 Мбит / с или 1 Гбит / с. При использовании радиомодуля Bluetooth с низким энергопотреблением это слишком много данных для отправки с чипа, поэтому обнаружение и сортировка всплесков также выполняется на кристалле, так что гораздо меньшая информация отправляется вне кристалла.

Мы только касаемся поверхности, и эволюция Neuralink, несомненно, продолжится по пути прорывов.

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel