Вы хотите по короткой анкете оценивать риск того, что клиент скоро уйдёт из сервиса. У вас есть три сигнала: сколько раз человек жаловался за месяц, как давно он заходил в приложение и пользуется ли он платным тарифом. Уже ясно, что эти сигналы влияют на решение по-разному. Частые жалобы должны повышать риск. Долгое отсутствие тоже тревожит. Платный тариф, наоборот, часто связан с более устойчивым поведением.
Теперь попробуйте мысленно собрать из этого один ответ модели. Если просто сложить признаки, все они окажутся равноправными, хотя по смыслу это не так. Если ориентироваться на один самый заметный сигнал, вы потеряете остальные. Если каждый раз решать вручную, какой признак важнее, получится длинная и хрупкая система оговорок. А ещё остаётся неприятный крайний случай: что делать, когда признаки сами по себе почти ничего не говорят, но модели всё равно нужен какой-то исходный уровень ответа? Значит, ей нужен более точный механизм, который умеет учитывать вклад каждого входа отдельно и при этом задаёт общий фон решения.
Зачем модели нужен самый простой решающий элемент
В прошлом уроке мы разобрали общий цикл обучения: модель получает пример, вычисляет ответ, сталкивается с ошибкой и постепенно подстраивает параметры. Теперь полезно заглянуть внутрь самой модели. Если обучение меняет параметры, то где именно они находятся и что именно делают во время вычисления ответа?
Начать лучше с самого малого элемента. Представьте ручку громкости на пульте звукорежиссёра. На вход приходит несколько дорожек, и каждую можно сделать громче, тише или вообще приглушить. Похожая идея появляется и в нейросети. Когда у модели несколько входных сигналов, ей нужно каким-то образом учитывать силу каждого из них. Один признак действительно может быть важным. Другой полезен лишь как слабая подсказка. Третий может действовать в обратную сторону и уменьшать итоговую уверенность.
Слово «нейрон» здесь помогает удержать структуру, но не должно уводить в биологические ассоциации сильнее, чем нужно. На этом этапе перед нами обычный вычислительный узел. Он берёт числа на входе и собирает из них один итог. Главный вопрос состоит в том, как именно он это делает, чтобы разные признаки не сливались в безликую сумму.
Почему каждому входу нужен свой вес
Вернёмся к анкете клиента из Разведки боем. Если число жалоб выросло, риск ухода обычно становится выше. Если человек давно не заходил, тревога тоже растёт. Если у него платный тариф, риск часто ниже. Уже отсюда видно, что одинаково относиться ко всем входам нельзя. Модели нужен способ задавать каждому сигналу собственную силу и собственное направление влияния.
Именно вес отвечает на вопрос: насколько важно то, что пришло на этот вход. Большой положительный вес усиливает сигнал. Малый вес делает его почти фоновым. Отрицательный вес меняет знак вклада. Благодаря этому модель может учитывать, что одни признаки повышают итоговую оценку, а другие снижают её.
Здесь впервые появляется очень полезная формула:
y = w1 * x1 + w2 * x2 + w3 * x3 + b
Она выглядит скромно, но в ней уже спрятана важная идея. x1, x2, x3 — входные сигналы. w1, w2, w3 — веса, которые говорят, как сильно каждый сигнал влияет на результат. Пока можно думать о нейроне именно так: он умножает каждый вход на свой вес, а потом складывает получившиеся вклады.
Полезно посмотреть на числа. Пусть у клиента x1 = 3 жалобы за месяц, x2 = 2 условные единицы давности последнего входа и x3 = 1, если у него есть платный тариф. Допустим, модель использует веса w1 = 0.8, w2 = 0.5, w3 = -0.6. Тогда вклад жалоб будет равен 2.4, вклад давности входа 1.0, а вклад платного тарифа -0.6. Уже на этом шаге видно, что модель не просто складывает признаки. Она сначала переводит каждый признак в его реальную силу внутри задачи.
Зачем нужно смещение
Если остановиться только на весах, картина останется неполной. Представьте клиента с нейтральными признаками: жалоб почти нет, заходит он более или менее регулярно, платного тарифа нет. Модель всё равно должна выдать некоторую стартовую оценку. Ей нужен способ немного сдвинуть итог даже тогда, когда входные сигналы в сумме дают слишком мало.
Смещение удобно понимать как начальную точку отсчёта. Иногда без него нейрон оказался бы слишком привязан к нулю: если все входы малы, итог тоже почти обязан быть малым. Но в реальных задачах полезно иметь возможность немного поднять или опустить результат ещё до того, как входные сигналы внесут свои поправки.
Вернёмся к нашему числовому примеру. Раньше у нас получилось 2.4 + 1.0 - 0.6 = 2.8. Если добавить смещение b = -1.2, итог нейрона станет 1.6. Эта цифра важна как пример общего эффекта: смещение перенастраивает базовый уровень ответа. Благодаря ему модель может вести себя гибче: одинаковые входы при другом смещении дадут другую стартовую оценку.
Теперь можно вернуться к вопросу из Разведки боем. Модели не приходится одинаково обращаться со всеми сигналами. Нейрон даёт ей более точный механизм. Каждый признак приходит на свой вход, получает собственный вес, а затем вся сумма сдвигается смещением. Так появляется базовый вычислительный элемент, который способен учитывать признаки по-разному. На следующем уроке мы увидим предел этой конструкции: иногда одной такой суммы мало, если зависимость в данных устроена сложнее.
Нейрон — это базовый вычислительный элемент сети, который получает несколько входных сигналов и собирает из них один результат. Его работа начинается с того, что каждый вход умножается на свой вес.
Вес задаёт силу и направление влияния признака. Положительный вес усиливает вклад входа, отрицательный разворачивает его в противоположную сторону, а малый по модулю вес делает сигнал почти фоновым.
Смещение добавляет к этой сумме общий сдвиг. Благодаря смещению нейрон получает более гибкую стартовую точку и не зависит только от самих входов. Вместе веса и смещение дают модели первый осмысленный способ по-разному учитывать признаки задачи.