"- Когда я вижу ответ LLM, я скорее поверю, что где-то сидят миллион индусов, чем то, что ответ есть результат перемножения матриц.
- Я тебе покажу "молекулу" этих нейросетей и ты поверишь, что индусы заняты не этим."
После этого диалога с Юриком, держу слово. Написал ему письмо, и решил - пусть и остальные прочтут. Прошу простить за несколько развязный тон письма, но это все-таки личное письмо и в нашем общении он допустим.
«Дорогой, Юрик!
Стало обидно и за матрицы, и за индусов, я обещал тебе, что покажу как можно с помощью первых, заменить вторых. Я обещал показать работу нейросети на примере решения ХОR, но я начну на шаг раньше, не потому, что ты этого не знаешь, а так мне, - тугодуму, легче удержать логику объяснения.
Что такое XOR
Если пара танцующая танго состоит из мальчик-девочка (1-0) или девочка-мальчик (0-1) — это нормально ( пусть будет равно 1), а девочка-девочка или мальчик-мальчик — это не очень ( равно 0). Формально: на входе пара 1 и 0, или пара 0 и 1, то выход — 1. В случае на входе пара 0 и 0 или пара 1 и1, то выход — 0.
Перед решением XOR сначала рассмотрим метод, который в дальнейшем и будем использовать. Предлагаю такую бизнес-идею, она нам может вскоре будет необходима: сделаем нашейный приборчик который будет нам подсказывать куда идти при приступах деменции:
Наш запрос |
Численное значение |
Ответ |
Численное значение |
Хочу спать |
0 |
Спальня |
0 |
Хочу есть |
1 |
Кухня |
1/2 |
Отрицательно поесть |
2 |
Туалет |
2 |
Коридор |
11/6 |
||
Балкон |
5/6 |
Каждому ответу я присвоил численные значения. Запросов я пока выбрал три, сделаем MVP (минимальную рабочую модель), найдем инвесторов, тогда и добавим остальное. Количество из трех запросов я выбрал только для удобства описать метод который нам понадобится.
Конечно, мы бы с тобой, как старпёры, сделали бы этот приборчик на дискретной логике. Молодежь использовала бы «малинку», а юность просто спросила бы ЧатЖПТ. Вот мы и посмотрим, как оно там у юности и устроено.
Так как у нас запрос имеет один параметр, то нам достаточно одной прямой (ось запросов), чтобы расположить все запросы. А на другой оси расположим ответы (ось ответов). Нарисую эту ситуацию, возможно, так будет легче объяснять проблему и ее решение:

Как видишь, точки не лежат на одной прямой. Почему это проблема? Аппроксимация значений прямой — проверенный и во многом хороший способ. Конечно, можно аппроксимировать другой функцией, но линейная регрессия и сейчас «под капотом» нейросетей, да и аппроксимация любым другим многочленом будет иметь коэффициенты при степенях, а это опять линейная зависимость. Поэтому давай сделаем приближение линейной функцией, и к тому же для нее есть удобный инструмент оценки ошибки (среднее квадратичное отклонение - СКО), который тоже до сих пор «в строю» и служит верой и правдой нейросетям.
В принципе, не плохо аппроксимировалось, среднеквадратичная ошибка равна 1/18 (считал в уме, мог и ошибиться). Все бы ничего, но когда в будущем наша бизнес-идея разрастётся, и появятся новые запросы, ответы мест куда нужно пойти будут не точны (поесть нас отправит в коридор, например) , и может случится конфуз. Я не рассматриваю вопрос «как получились числовые значения ответов?», это выходит за рамки нашего вопроса. Получились и все, так бывает.
Можно понаклонять и подвигать нашу аппроксимирующую прямую, пожертвовав точностью одних ответов в пользу других (поспать можно и в кладовке, лишь бы не навалить в коридоре), но идеального ответа не будет. Вот, кстати, одна из причин того, что назвали «галлюцинацией ЛЛМ» - не возможность точного отображения запроса в ответ при не точном преобразовании. Но не будем сдаваться! Помучившись с линейными функциями и поняв, что сколько меч не крути, он ятаганом не станет, первое, что приходит на ум - «Так давайте аппроксимировать нелинейными функциями!». Идея правильная, но, как написал выше, проблему линейной зависимости коэффициентов все равно решать придется, но это тоже выходит за рамки нашего вопроса.
И вот первая блестящая идея - «Раз в данном пространстве признаков не получается линейная зависимость, может попытаться изменить пространство признаков на другое, где возможно будет искомая линейная функция?» В нашем примере признак у каждого запроса один, а значит пространство признаков — прямая, мы ее разместили по оси Х, ну, как обычно. Чтобы нам оставаться в линейных преобразованиях, мы можем наши признаки сдвигать по этой оси либо сложением с какой-то константой либо умножением. Что собственно следует и из уравнения прямой:
Дальше вторая хитрость - какая-то светлая голова предложила идею: «А давайте-ка, введем нелинейность с помощью стандартного элемента, с очень простой, стандартной нелинейной функцией!» Юрик, вот если меня что-то восхищает, так это - вот такие простые, но эффективные решения. Смотри, что получается в нашем примере, сначала, мы делаем сдвиг всего пространства запросов влево на 2/3. Я специально написал это матричной форме, чтобы и дальше уже писать все в ней. Вот собственно и начинаются матричные чудеса:

У тебя возник вопрос, как это я так сложил матрицы? Да-да, я знаю правило, что складывать можно только одинаковые матрицы, но в данном случае это корректно, так как матрица запросов — это матрица матриц, она не является сутью, она просто удобная запись, фактически это три матрицы.
Вот теперь, все готово, чтобы применить волшебную палочку — нелинейность. В принципе, любая нелинейность подойдет, но она будет значительно влиять на организацию дальнейших вычислений. Идеального решения нет, но все начиналось, да и до сих пор используется с нелинейности такого вида: Если значение меньше нуля, то оно изменяется на нуль, если значение больше нуля, то оно остается неизменным. (А если значение равно нулю, то нуль умножается на нуль)). Вот, что мы имеем после применения нелинейности:

Как видишь, произошла нужная нам вещь — ответы выстроились в линию. То есть могут быть представлены прямой. Пока эта прямая, не дает правильных ответов на наши запросы, но матрицы нам помогут. Умножим нашу матрицу на некоторую величину которую назовем - вес. Пусть вес будет равен 3/2. Как я его определил выходит за рамки темы, есть способы, а уж в нашем примере этот вес вычислить легко. Нахождение величин сдвигов и весов — это и есть обучение нейросети.
Как видишь, после манипуляций: сдвиг + нелинейность + вес мы получили значения ответов в точности совпадающих с правильными. У нас не будет галлюцинаций, нам не понадобятся вероятностные методы. Будем спать в спальне, есть на кухне, а отрицательно питаться в туалете. Такая вот MVP, доработаем с ЧатЖПТ и в прод.
Вот эта магия с матрицами и нелинейностью она и будет использоваться в нашей будущей крошечной нейросети по решению задачи ХОR.
Я тебе обещал сделать ХОR. Делаю. И сделаю это с маленькой, но настоящей нейронной сетью. Без CPU, GPU и даже калькулятора.
Так как параметров для запроса два, то нам понадобится не одна прямая, как прежде, а две, а они образуют плоскость. Вот, кстати, пример того, как начинается увеличиваться пространство входных параметров. Запрос, он может иметь разное количество параметров, у нас в ХОR их два, если сделать три, то будет трехмерная картина запросов, а ответы нужно будет рисовать в 4-х мерном измерении, (Давай это в другой раз, а?). Да и ответы могут иметь больше одного параметра, значит и для них нужно рисовать свое н-мерное пространство... Не знаю как тебе будет удобнее следить за рассуждениями, поэтому приведу три варианта — плоскую картинку, аксонометрию и уравнения:

Линейным решение этой задачи будет плоскость. Причем проходящая через точки ответов. Все по аналогии с разобранным примером, но в большей размерности. Как видишь, плоскость проходящую через все четыре ответа провести не получается. Давай, как и ранее, построим плоскость максимально близкую к ответам. Все так же, чтобы среднеквадратичная ошибка была минимальной. (Если занудствовать, то этот метод здесь плохо применять, но для единообразного изложения будем пользоваться им).
Плоскость можно описать двумя прямыми расположенными в перпендикулярных плоскостях, тогда уравнение плоскости будет:
Из уравнений видно, что они не дают решения. Вычислим плоскость дающую минимальное значение СКО. Опускаю длинные уравнения из 7-го класса начальной школы, даю сразу результат (я считал вручную, мог и ошибиться, но принцип верный, проверенный):

Результат: наклон1 = 0, наклон2 = 0, сдвиг = 1/2. СКО = 1/4.
Мило. Плоскость параллельна плоскости параметров запросов и приподнята над ней на 1/2. Что не спроси — ответ один — 1/2. Не унываем, от плоскости не отказываемся, у нас есть «метод».
Колдуем. Умножаем матрицу входных параметров на веса первого, а у нас - единственного слоя.

Еще раз отвечу на возможный твой вопрос: «Откуда ты взял эту матрицу весов первого слоя?» Отвечаю - «Посчитал», ответ честный, но это ответ не правильный, эти веса в реальных нейронных сетях считает алгоритм обучения, в этом собственно и весь смысл обучения, но это выходит за рамки моего тебе письма. Поэтому мой правильный ответ такой: «Я показываю тебе, Юрик, возможность решить задачу ХОR, а где взял веса — это не важно.»
Уравнения не имеют решения. Хотя плоскость содержащая все ответы и получилась, толку пока мало, так как эта плоскость перпендикулярна плоскости параметров.
Теперь сделаем сдвиг пространства параметров с помощью матрицы сдвига:

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

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

Вот и нужный нам точный результат решения XOR, нашей микронейросетью.
А ниже результата вычисления XOR я нарисовал нашу микронейросеть с одним слоем.
Я не знаю, друг мой, сидят ли на другом конце чата индусы, но я знаю, что можно получить такой же ответ и путем манипуляций с матрицами и нелинейностями. Конечно, эта микронейросеть обрезана максимально, в ней отсутствует многое, что есть в реальных нейросетях. Цель моего примера - показать всего две маленькие хитрости, применение которых дает неожиданный результат, а внутри нейросетей таких хитростей много, но все они удивительно просты.
Привет из 206-й."
P.S. Текст написан, а картинки нарисованы благодаря нейросети с использованием четырехцветной ручки BIC.
gorshfan
одними линейными преобразованиями XOR не решить. Нужна нелинейность