Найти в Дзене
птица говорун

залезть в мозг

в предыдущей заметке я написал про применение искусственных нейросетей. вернее даже так: я хотел написать про применение в музыке, а потом скатился на самую разделяемую человеческую ценность. здесь же я хотел немного поговорить об реализации этих сетей даже конкретно об искусственном нейроне. меня всегда удивляло как из этих примитивных моделей рождается "разум" - пресловутая эмерджентность. при упоминании искусственного нейрона(перцептрона) принято рисовать что-то типа такого: как видно все довольно просто: на входе мы имеем некоторое количество сигналов. после чего вычисляется их некоторая линейная комбинация и подаётся на вход функции активации. если функция активации возвращает значение «истина» выходной сигнал распространяется дальше. все довольно несложно. на деле это может оказаться ещё проще. пусть у нас нейрон определяет является ли объект вороной. пусть приходит 3 сигнала сами сигналы булевые т.е. могут принимать значения либо «истина» — 1 либо «ложь» — 0: каждому входу сопо
Оглавление

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

перцептрон

при упоминании искусственного нейрона(перцептрона) принято рисовать что-то типа такого:

схема перцептрона
схема перцептрона

как видно все довольно просто: на входе мы имеем некоторое количество сигналов. после чего вычисляется их некоторая линейная комбинация и подаётся на вход функции активации. если функция активации возвращает значение «истина» выходной сигнал распространяется дальше. все довольно несложно.

на деле это может оказаться ещё проще.

пусть у нас нейрон определяет является ли объект вороной. пусть приходит 3 сигнала сами сигналы булевые т.е. могут принимать значения либо «истина» — 1 либо «ложь» — 0:

  1. птица w1 = 40
  2. серая w2 = 20
  3. каркает w3 = 30

каждому входу сопоставлен вес. веса это важность сигнал для активации нейрона. в нашем случае для определения признака объекта «ворона». веса будем расставлять от 1 до 100. запишем так: W1 = 40, W2 = 20, W3 = 30.

сумматор (Σ): вычисляет взвешенную сумму: Z = (X1 * W1) + (X2 * W2) + (X3 * W3). т.е. произведение веса на состояние входа либо равно нулю когда вход не активен либо его весу когда значение входа «истина», вычисляем сумму произведений. дополнительно имеется ещё одно слагаемое - смещение (bias). оно дает возможность подвинуть результат ближе к «вороне» или дальше от неё, но для простоты я не буду это учитывать.

функция активации тоже будет простейшая — это классическая пороговая функция. если взвешенная сумма больше 50 функция равна 1 сигнал распространяется дальше. в нашем случае определение объекта как «ворона» меньше 50 — 0 т.е. объект не ворона.

тогда получаем варианты, когда функция активации равна 1:

птица =1, серая=1, каркает=0

1*40 + 1*20 + 0 * 30 = 60 ; 60>50 f = 1

птица =1, серая =0, каркает =1

1*40 + 0 * 20 + 1* 30 = 70; 70>50 f = 1

птица =1, серая =1, каркает =1

1*40 + 1 * 20 + 1* 30 = 90; 90>50 f = 1

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

зачем всё усложнять? от нейрона к сети.

впрочем нам не нужна арифметика — у нас фиксированное число входных сигналов принимающие значение либо 0 либо 1. можно просто написать те случаи в которых функция активации равна 1.

птица =1, серая=1, каркает=0

1 1 0 => f = 1

птица =1, серая =0, каркает =1

1 0 1 => f = 1

птица =1, серая =1, каркает =1

1 1 1 => = 1

т.е. введем булевую функцию. если обозначить аргументы функции начальными буквами слов, наша таблица истинности нашей булевой функции будет выглядеть так:

П С К

0 0 0 => 0

0 0 1 => 0

0 1 0 => 0

0 1 1 => 0

1 0 1 => 1

1 1 0 => 1

1 1 1 => 1

проблема в том, что число комбинаций катастрофически быстро растёт (экспоненциально). например для 8 входов можно составить 256 комбинаций.

Решение: нейронные сети. нейроны объединяются в слои.

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

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

    второй слой комбинирует их в более сложные формы (глаз, клюв).

    третий слой уже собирает эти формы в образ "птицы".
  3. Выходной слой: выдаёт окончательный ответ (например, [Вероятность_Вороны, Вероятность_Попугая, ...]).

вы наверное уже слышали страшный термин «глубокие нейронные сети» (Deep Neural Network, DNN), но на в самом деле ничего страшного. это описанная архитектура сети. термин «глубокое» указывает на количество скрытых слоёв между входным и выходным слоями — от десятков до тысяч.

трансформеры и механизм внимания

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

  • Query — Что мы ищем.
  • Key — На что это слово похоже.
  • Value — Само содержание слова

если сравнить Query одного слова со всеми Key других слов, то получится веса (внимание), сколько внимания уделить каждому слову. иллюстрация: «человек идёт по дороге потому что у него есть ноги» что такое «у него»? вы интуитивно ищете в предложении слово, на которое оно указывает. механизм самовнимания делает то же самое математически. «у него» — человек.

подведём итог

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

тем не менее веса играют очень важное значение. изменяя веса мы можем очень сильно влиять на логику нейрона. например в нашем примере «основной» сигнал был выбран «птица» ни что не мешает выбрать иной например «каркает». изначально веса «выбираются от фанаря» и в процессе пассивного обучения тонко настраиваются.

процесс пассивного обучения сети выглядит так:

  • данные для обучения: у нас есть тысячи картинок, на которых точно указано, где ворона, а где нет. тут кстати стоит отметить принципиальную проблему пассивного обучения. человек должен в ручную подобрать материалы и явно указать выделяемые признаки. многие скажут что это «ненатурально», но по сути начальное обучение человека происходит примерно по такому же сценарию: малолетнему ребёнку показывают объект и объясняют что это такое.
  • прямое распространение: картинка подаётся на вход сети. сеть выдаёт свой ответ (например, "85% уверенности, что это ворона").
  • расчет ошибки: сравниваем ответ сети с правильным ответом из данных. вычислится функция потерь (loss function) — насколько мы ошиблись.
  • градиентный спуск: веса немного изменяются в сторону, которая уменьшает ошибку. процесс повторяется многократно повторяется на разнообразных входных данных.

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

биология сложнее

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

  • тормозящие — угнетают активность нейронов;
  • возбуждающие — активизируют нейроны;
  • модулирующие — изменяют восприимчивость нейронов к влияниям.

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

простой пример: например вам нравится девушка Саша, а не девушка Маша, но почему? обе молодые женщины репродуктивного возраста, но у Саши более привлекательная вам фигура или вам понравился её цвет глаз? а может быть Саша хорошо поёт или рисует или интересно рассказывает о животных и учится на био факультете МГУ?

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

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

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

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

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

для нашего примера это будет выглядеть так:

  1. в наш нейрон определитель вороны пришёл сигнал «каркает»
  2. нейрон оправляет запрос на определение сигналов «серая» и «птица»
  3. если в него приходит необходимая комбинация сигналов — нейрон активируется

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

современное положение дел

функция активации

вообще говоря пример с вороной не совсем правильный. пороговая функция активации была выбрана исключительно для наглядности. дело в том что функция мгновенно меняет своё значение с 0 в 1. т.е. производная пороговой функции в точке порога не определена (разрыв), а на всех остальных участках равна нулю. нулевая производная "убивает" градиент, делая обучение невозможным.

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

некоторые функции активации:

  • гиперболический тангенс: f(Z) = (e^Z - e^(-Z)) / (e^Z + e^(-Z)).
    не линейная и гладкая. идеальна для градиентного спуска, производная легко вычисляется.

    Проблема . На "краях" функции (когда Z очень большое или очень маленькое) график становится почти плоским, а производная стремится к нулю.
  • ReLU (Rectified Linear Unit) f(Z) = max(0, Z)
    невероятно проста для вычисления. сильно уменьшает проблему затухающего градиента. для положительных Z производная всегда равна 1. градиент свободно течет через такие нейроны при обратном распространении сигнала приобучении, что позволяет обучать очень глубокие сети. однако при отрицательных Z производная равна 0, что и является причиной "проблемы умирающих ReLU".

    проблема "умирающих ReLU" (Dying ReLU).
    Если нейрон всегда выдает отрицательный вход (Z < 0), его выход становится 0, и градиент через него тоже 0. Веса такого нейрона никогда больше не обновятся — он "умер" и перестал учиться.
  • "Исправленные" версии ReLU f(Z) = max(0.01 * Z, Z)
    решает проблему "умирающих ReLU". даже при отрицательном Z есть небольшой градиент, позволяющий нейрону "ожить". сохраняет все преимущества обычной ReLU.

свёрточные сети (CNN / Convolutional Neural Networks)

если подать на вход вашей сети изображение вороны. даже небольшое фото 100x100 пикселей — это уже 100 * 100 = 10 000 входных нейронов. если следующий скрытый слой будет всего из 1000 нейронов, количество весовых коэффициентов между ними составит 10 000 * 1000 = 10 000 000 (10 миллионов)!

  • вычислительно дорого.
  • требует гигантского объёма данных для обучения, иначе сеть переобучится.
  • игнорирует структуру данных. для полносвязной сети пиксель в углу и пиксель в центре — это просто два независимых числа. она не "понимает", что соседние пиксели связаны.

ядро свертки.

это маленькая матрица (например, 3x3 или 5x5). как это работает?

  1. Мы "прикладываем" это ядро к верхнему левому углу изображения.
  2. Вычисляем значения ядра с значениями пикселей изображения, которые оказались под ним, и складываем результаты. получаем одно число.
  3. Записываем это число в соответствующую позицию на новой карте (она называется картой признаков).
  4. Сдвигаем ядро на один пиксель (это называется шаг) и повторяем процесс, пока не "просканируем" все изображение.

стоит отметить что это не совсем перемножение матриц или вычисление определителя в строго математическом смысле, возможно вы даже слышали словосочетание «тензорный процессор», но это и не тензор. математически это похоже на скалярное произведение — результат операции число в кате признаков.

использование карты признаков даёт существенную экономию ресурсов по сравнению с полносвязный сетью.

разделение весов (Weight Sharing)

это улучшенный метод выше. одно и то же ядро свертки (с одними и теми же весами) "скользит" по всему изображению. веса ядра (например, 3x3=9 весов) используются повторно для каждой позиции на изображении. фактически скалярное произведение даёт ответ на вопрос на сколько вектора похожи. т.е. если нейрон научился находить, скажем, вертикальную грань в левом верхнем углу, он сможет найти такую же грань и в правом нижнем, потому что использует тот же фильтр.

пулинг (Pooling) — упрощение карты

или субдискретизация. после операции свертки и нелинейной функции активации (обычно ReLU) часто применяют подвыборку (пулинг). самая распространённая — Max Pooling. мы разбиваем карту признаков на небольшие области (например, 2x2) и из каждой области выбираются только максимальное значение.

Что это дает?

  1. Еще большее сокращение объёма вычислений.
  2. Повышение инвариантности к малым сдвигам и искажениям. Неважно, где именно в области 2x2 активировался признак, главное, что он там есть. Это делает сеть более устойчивой.

все вместе

  • свервый сверточный слой: нейроны учатся реагировать на простейшие паттерны.
    фильтры 1-го слоя: детекторы границ, углов, пятен.
    на выходе: "Карта того, где на изображении есть границы и углы".
  • второй сверточный слой: комбинирует признаки из первого слоя.
    Фильтры 2-го слоя: детекторы более сложных форм, составленных из границ и углов. на выходе: "Карта глаз, клювов, перьев".
  • третий сверточный слой: Комбинирует еще больше. фильтры 3-го слоя: детекторы, реагирующие на комбинации глаз, клювов и т.д. на выходе: "карта, содержащая активации для целых объектов: 'голова птицы', 'крыло'".
  • в конце: карта признаков "выпрямляется" в один вектор и подаётся на несколько полносвязных слоев (как в изначальном примере), которые уже и принимают окончательное решение: "голова птицы + крыло + определенный размер = ворона с вероятностью 92%".

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

в будущем можно ожидать появление общего сильного интеллекта способного к самообучению и целеполаганию. такие работы ведутся. например Titans от Google. нейросеть основном потоке использует трансформеры (механизмы внимания) и имет сложную архитектуру:

  1. Ядро — действует как кратковременная память, использует классический механизм самовнимания для обработки контекста.
  2. Долгосрочная память — сохраняет информацию, выходящую за рамки текущего контекста.
  3. Постоянная память — хранит базовые знания, полученные на этапе обучения.

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

экологический аспект

чтом можно сказать в заключении? ну видимо стандартную фразу «мы живём в очень интересное хоть и не простое время». тут правда вот ещё что надо учитывать. думали вы сколько это великолепие потребляет энергии? обучение модели уровня GPT-4 оценивается в десятки гигаватт-часов электроэнергии. эксплуатация уже обученной модели, когда она отвечает на запросы пользователей здесь проблема масштабируется. если моделью пользуются миллионы людей, совокупные энергозатраты многократно превосходят затраты на обучение. это естественно проблема.

Что делается прямо сейчас?

  1. специализированные чипы (TPU, AI-ускорители). Они не универсальны, как CPU/GPU, а заточены под конкретные матричные операции нейросетей. их вычилительная мощьность на ватт) на порядки выше.
  2. квантование (Quantization). Использование для расчетов не 32-битных чисел с плавающей запятой, а 8-битных или даже 4-битных целых чисел. теряется ничтожная точность, но выигрыш в скорости и снижении энергопотребления — колоссальный.
  3. прунинг (Pruning). «Обрезка» нейросети: удаление слабых, малозначимых связей (весов) после обучения. сеть становится меньше и быстрее, почти не теряя в качестве.
  4. эффективные архитектуры. поиск более компактных и эффективных архитектур, которые достигают результатов больших моделей с меньшим числом параметров.
  5. оптимизация дата-центров. Использование свободного охлаждения (холодный климат), продвинутые системы жидкостного охлаждения, рекуперация тепла для отопления ближайших зданий (в Скандинавии такое практикуется).

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

текст создан при экспертной поддержке DeepSeek