Расскажу про одну из лучших книг для того, чтобы разобраться в принципах работы нейросетей: от понятно объяснённой математики до пошаговой практики разработки собственной сети на Python.
Зачем нужны нейросети?
Компьютеры - это, по сути, калькуляторы, выполняющие арифметические операции с огромной скоростью. Даже просмотр видео или прохождение компьютерной игры - не требуют чего-то большего, чем быстрого выполнения арифметических операций, а точнее — быстрое следование инструкциям с использованием 0 и 1.
Но есть задачи, например распознавание (лиц, рукописных текстов, произносимых фраз) или генерация оригинального адекватного контента, которые трудно реализовывать по заранее составленным инструкциям. Для решения таких задач существуют нейронные сети, являющиеся одним из подходов к созданию искусственного интеллекта.
Как работают нейросети?
Мы решаем задачу распознавания в формате «Вопрос --> Анализ --> Ответ», но компьютеры (усовершенствованные калькуляторы) не могут думать, они получают вводную информацию, проводят обработку и выдают результат. В случае обычных программ, обработка идет по заданному алгоритму, например Ввод: 34, Расчет: 4+4+4, Вывод: 16, нейросети же создают свой внутренний алгоритм, действуя через многократную попытку проверки результата при различных пробных значениях с их уточнением. Давайте разбираться на примере!
Предположим, что мы не знаем формулы преобразования километров в мили, но знаем что:
(а) существует какая-то линейная формула преобразования одной величины в другую (мили = км * с, где с - некая константа)
(б) существуют проверочные значения: 0 км = 0 миль и 100 км = 62,137 мили.
Тогда мы (если бы мы действовали как нейросети) начнем с того, что возьмем случайное значение константы с (например 0,5), поймем результат (100 км * 0,5 =50 миль), сравним его с проверочными значениями и определим величину ошибки (62,137 - 50 = 12,137).
Далее попробуем взять другой показатель с, например 0,6. При нем размер ошибки уменьшиться. Для нас (как для нейросети) это будет показателем того, в какую сторону нужно двигаться, чтобы минимизировать размер ошибки.
Далее повторим уже знакомые действия, взяв с=0,7. В таком случае, размер ошибки окажется отрицательным, значит, следующее значение константы нужно будет подбирать в диапазоне от 0,6 до 0,7. Что мы и сделаем с учетом того, что чем меньше размер ошибки, там меньше должна быть поправка при следующей итерации. В результате, через какое-то количество рациональных переборов вариантов, получим с=0,62137.
Если ваш внутренний математик достает вас сейчас вопросом: зачем все это было нужно, если можно было просто посчитать ответ с использованием математической формулы? То для него есть простой ответ: дело в том, что для решения большинства задач не существует однозначных алгоритмов для расчета и, соответственно, математических формул.
Как выглядят нейросети?
Нейроны - это, по сути, проводники, которые передают входящий сигнал на выход, усиливая или ослабляя его, но только при условии достижения определенного порогового значения силы сигнала на входе. У каждого нейрона есть несколько входов (в биологии их называют дендридами) и выходы, ведущие к нейронам следующего слоя (в биологии — один выход (аксон), который далее ветвится). В результате образуется сеть с несколькими слоями: входной, выходной и промежуточные (скрытые).
![](https://webcf.waybackmachine.org/web/20240229064332/https://habrastorage.org/getpro/habr/upload_files/ef8/4e7/32a/ef84e732a578ab24e684269f7a31343b.png)
Сила входящего сигнала нейрона определяется как сумма всех входящий в него сигналов. При этом, до определенного (порогового) значения суммы всех входящих сигналов нейрон будет “спать”, а, после превышения порога, постепенно повышать значение исходящего сигнала до определенных пределов (для тех, кто в теме - это можно описать сигмоидой, aka S-образная или логистическая функция).
Далее каждому выходу (исходящему сигналу от одного нейрона к другому) нужно ещё присвоить определенный весовой коэффициент, ослабляющий или усиливающий получающийся сигнал. Именно размеры этих весов и будет подбирать алгоритм нейросети.
Рассмотрим подробнее механику:
Тренировочные данные (база с входящими значениями и соответствующими им результатами) загружаются в первый слой сети (для этого количество нейронов в первом слое должно соответствовать количеству наименований загружаемых параметров)
Сеть путем перебора подбирает такие весовые коэффициенты, при которых размер ошибки выходных значений будут минимальным. Оптимизации функции ошибки, как правило, ведётся, так называемым, методом градиентного спуска
Результаты подбора весовых коэффициентов проверяются на тестовых данных, не участвовавших в тренировке сети
Если результаты оказываются удачными, данную сеть можно использовать (при необходимости, оптимизируя в процессе). Если нет, то можно внести правки в конфигурацию сети (например количество слоёв или параметры пороговых значений), проверить / изменить тренировочные данные, улучшить механику определения размера ошибки или внести дополнительные ограничения и попробовать снова.
**
Другие книги в тему:
Гудфеллоу и ко. Глубокое обучение — для более глубокого (но не смертельного для гуманитариев) погружения в математику, стоящую за нейросетями.
Лекун. Как учится машина — для понимания истории развития нейросетей и наиболее актуальных подходов к их развитию.
Дэвис, Маркус. Искусственный интеллект: перезагрузка — для дополнения ажиотажа вокруг нейросетей порцией обоснованного скепсиса.
Делитесь в комментариях своими рекомендациями книг и видео по нейросетям!
**
Больше конспектов и подборок — у меня на канале “Стоит записать” и на сайте.