ИИ и формализмы
Feb. 16th, 2025 04:05 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
"Transformers Can Do Arithmetic with the Right Embeddings"
https://neurips.cc/virtual/2024/poster/94565
LLMов научили арифметике, как я понимаю, через специальное кодирование чисел. Это интересный трюк, поскольку у обычных ЛЛМов даже счет не получается, и да у людей научиться арифмерике занимает годы. Так что интересно с точки зрения понимания, как оно работает.
Но одновременно у меня возникает вопрос (который, как оказалось, авторам этой бумаги в голову не пришел): накойхер их учить арифмерике, если у них есть под боком компьютер, который может посчитать все то же самое легко и эффективно? Гораздо более продуктивным занятием было ты научить ЛЛМы пользоваться калькулятором. В простейшем варианте, добавить поспроцессинг к выводу ЛЛМа, который выцепит и выполнит вычислительные инструкции, и научить ЛЛМ генерить эти инструкции. Ну вот например, недавно народ активно рассуждал про "посчитать буквы r в слове strawberry". Это задание можно поделить на две части: (1) выцепить буквы r, (2) посчитать их. ИИ мог бы генерить что-то типа
$(wc r r r)
и получить на выходе 3. Ну и то же самое с любой арифметикой.
Интересно, какие возражения такая идея вызывает у учоных: "но ведь разрешать выполнение питонного кода из вывода - небезопасно". То, что можно сделать не Питон, а любой свой безопасный язык, им просто в голову не приходит. На лицо еще один признак большого разрыва между Машинными Учоными и Компьюторными Учоными.
А вот еще интересен такой момент: я спрашивал в разных местах, и у всех генерация машинного кода искусственным интеллектом просиходит совершенно от балды этого ИИ. Но ведь машинный код - формальный язык. Грамматика и семантика его известна. Ничего не мешает генерировать сразу согласно грамматике - проверять каждую следующую лексему на соответствие грамматике, и если соответстие не найдено, то ее отбрасывать и выбирать другую, следующую по весу. Может полученный код и не будет правильно работать, но как минимум всегда будет соответствовать грамматике, и с небольшими дополнительными проверками - компилироваться. В одном из мест я видел примеры кода, сгенерированного моделями различной сложности, с качеством, растущим со сложностью модели. Но простая формальная проверка должна поднять качество кода, сгенерированного даже простыми моделями.
https://neurips.cc/virtual/2024/poster/94565
LLMов научили арифметике, как я понимаю, через специальное кодирование чисел. Это интересный трюк, поскольку у обычных ЛЛМов даже счет не получается, и да у людей научиться арифмерике занимает годы. Так что интересно с точки зрения понимания, как оно работает.
Но одновременно у меня возникает вопрос (который, как оказалось, авторам этой бумаги в голову не пришел): накойхер их учить арифмерике, если у них есть под боком компьютер, который может посчитать все то же самое легко и эффективно? Гораздо более продуктивным занятием было ты научить ЛЛМы пользоваться калькулятором. В простейшем варианте, добавить поспроцессинг к выводу ЛЛМа, который выцепит и выполнит вычислительные инструкции, и научить ЛЛМ генерить эти инструкции. Ну вот например, недавно народ активно рассуждал про "посчитать буквы r в слове strawberry". Это задание можно поделить на две части: (1) выцепить буквы r, (2) посчитать их. ИИ мог бы генерить что-то типа
$(wc r r r)
и получить на выходе 3. Ну и то же самое с любой арифметикой.
Интересно, какие возражения такая идея вызывает у учоных: "но ведь разрешать выполнение питонного кода из вывода - небезопасно". То, что можно сделать не Питон, а любой свой безопасный язык, им просто в голову не приходит. На лицо еще один признак большого разрыва между Машинными Учоными и Компьюторными Учоными.
А вот еще интересен такой момент: я спрашивал в разных местах, и у всех генерация машинного кода искусственным интеллектом просиходит совершенно от балды этого ИИ. Но ведь машинный код - формальный язык. Грамматика и семантика его известна. Ничего не мешает генерировать сразу согласно грамматике - проверять каждую следующую лексему на соответствие грамматике, и если соответстие не найдено, то ее отбрасывать и выбирать другую, следующую по весу. Может полученный код и не будет правильно работать, но как минимум всегда будет соответствовать грамматике, и с небольшими дополнительными проверками - компилироваться. В одном из мест я видел примеры кода, сгенерированного моделями различной сложности, с качеством, растущим со сложностью модели. Но простая формальная проверка должна поднять качество кода, сгенерированного даже простыми моделями.
no subject
Date: 2025-02-17 12:57 am (UTC)Смысл не в том, чтоб научить LLM совершать арифметические операции. Это умеет делать даже механический арифмометр.
Смысл в том, чтобы LLM научилась этому самостоятельно. В этом преимущество нового поколения reasoning моделей вроде DeepSeek r1. У них умение мыслить логически появилось само по себе, в результате тренировки, а не было заранее запрограммировано человеками.
При разговоре с r1 видно, как оно думает, можно отследить логическую цепочку мыслей. Даже когда оно ошибается, эти ошибки не такие, как раньше, где просто слова брались явно от балды. Может сказать "я не знаю", может зациклиться в рассуждениях и не найти ответа, как человек.
no subject
Date: 2025-02-17 01:22 am (UTC)no subject
Date: 2025-02-17 02:16 am (UTC)На практике я не буду просить ChatGPT что-то посчитать, потому что ему нельзя доверять, и потому что мне быстрее посчитать в экселе или на калькуляторе.
no subject
Date: 2025-02-17 01:57 am (UTC)no subject
Date: 2025-02-17 02:03 am (UTC)no subject
Date: 2025-02-17 02:46 am (UTC)what is 0.1+0.2-0.3?
deepseek-r1-distill-qwen-7b: Alright, let's tackle this problem step by step. So, the question is: what is 0.1 + 0.2 - 0.3? Hmm, at first glance, it seems straightforward, but I want to make sure I do this correctly.
Okay, starting with adding 0.1 and 0.2. Let me visualize a number line in my head. If I have one-tenth and add two-tenths, that should give me three-tenths. So, 0.1 + 0.2 equals 0.3. That part seems simple enough.
Now, the next step is subtracting 0.3 from that sum. So, if I take 0.3 (which is the result of adding 0.1 and 0.2) and then subtract another 0.3, what do I get? Well, subtracting three-tenths from three-tenths should bring me back to zero.
Wait a second, let me double-check that. Sometimes with decimals, it's easy to make little mistakes. So, adding 0.1 and 0.2: 0.1 is like one dime, and 0.2 is two dimes. Together, that makes three dimes, which is 0.3. Then subtracting another three dimes would indeed leave me with zero.
Is there any chance I could have messed up the decimal places? Like, maybe thinking of them as whole numbers instead? Let's see: if I treated them as integers, 1 + 2 - 3 equals 0. So that still checks out.
Another way to look at it is by converting everything into fractions. 0.1 is 1/10, 0.2 is 2/10, and 0.3 is 3/10. Adding the first two gives me (1 + 2)/10 = 3/10, which is 0.3 again. Subtracting 3/10 from that leaves me with zero.
I think I'm pretty confident here. The operations are straightforward, and both methods—decimal addition and fraction conversion—lead to the same result. So, yeah, it looks like the answer should be zero.
The result of 0.1 + 0.2 - 0.3 is:
0
Step-by-Step Explanation:
Add 0.1 and 0.2: 0.1 + 0.2 = 0.3 Subtract 0.3 from the sum: 0.3 - 0.3 = 0 Therefore, the final answer is 0.
no subject
Date: 2025-02-17 04:23 am (UTC)no subject
Date: 2025-02-17 04:33 am (UTC)no subject
Date: 2025-02-17 03:03 pm (UTC)Если задать тот же вопрос, но по другому основанию (не 10, а например 7 или -7), фразы "visualize in my head" в ответе нет. Ответы тоже правильные и тоже получены двумя разными способами (через десятичное приближение и дробями). И все рассуждения в ответе правильные. Оно даже проверяет, нет ли где переноса.
Вряд ли в обучающей выборке был точно такой же пример.
no subject
Date: 2025-02-17 08:39 pm (UTC)Я как-то слушал лекцию человека, работающего над Лламой, и он рассказал, что у них в тренировках есть ОЧЕНЬ много специальных случаев, к котороым постоянно добавляют по мере обнаружения примеров того, что работает неправильно.
no subject
Date: 2025-02-17 08:57 pm (UTC)Как вы сформулируете запрос к внешнему вычислителю посчитать 0.1+0.2-0.3 по основанию -7? Я вот так навскидку не знаю синтаксис и функции стандартных библиотек в известных мне языках программирования для выполнения вычислений с отрицательным основанием.
Этот пример придуман мной вчера на ровном месте. Я очень удивлюсь, если где-то в обучающей выборке он есть. Если не верите, придумайте самостоятельно оригинальный вопрос и задайте его.
Также обратите внимание на то, что в десятичной базе r1 возвращает точный ответ, а внешний вычислитель на питоне делает это с ошибкой округления.
no subject
Date: 2025-02-17 09:10 pm (UTC)"Точный ответ" может быть в частности результатом округления:
$ python
>>> 0.1+0.2-0.3
5.551115123125783e-17
>>> "%f" % (0.1+0.2-0.3)
'0.000000'
Но, опять же, ничего не мешает считать без перевода в двоичную систему, а прямо в заданной базе. Что вроде бы bc тоже делает. Например:
$ bc
scale=20
0.1+0.2-0.3
0
Объяснение порядка вычисления выглядит в ответе очень похоже на объяснение синтаксического дерева после разбора выражения.
no subject
Date: 2025-02-17 09:23 pm (UTC)bc не умеет, говорит "Runtime warning (func=(main), adr=6): negative ibase, set to 2".
Округление не исправляет ошибку, а только прячет её. Надо использовать recursive real arithmetic.
no subject
Date: 2025-02-17 09:26 pm (UTC)no subject
Date: 2025-02-17 02:42 am (UTC)Калькулятор это приложение и его надо сначала запрограммировать, а пользоваться калькулятором, который поставляется с ОС не совсем корректно, только если это система не написана сама ИИ.
no subject
Date: 2025-02-17 04:34 am (UTC)no subject
Date: 2025-02-17 05:06 am (UTC)накойхер их учить арифмерике
Date: 2025-02-17 04:04 am (UTC)no subject
Date: 2025-02-17 05:54 am (UTC)Сделать отдельно калькулятор – просто. Но совместить с логическим мышлением не получается.
Почему так. Арифметика существует несколько тысячелетий, но у неё никогда не было логически непротиворечивых правил. Это упущение попытались устранить лет 150 назад и напоролись на теоремы Гёделя о противоречивости и неполноте.
Пример 1. Делить можно на любое число за исключением нуля. Это нарушение закона исключённого третьего. В логике не существует утверждений вида «все без исключения… за исключением…», «любой… кроме…». А ещё есть проблемы с единицей.
Пример 2. Матан опирается на утверждение, что на дифференциально малом участке дуга тождественна прямой. Это прямое нарушение закона тождества.
В общем совместить логику и математику даже у людей не получается. В подавляющем большинстве случаев люди этого не замечают, потому что логикой не владеют. А вот в ЛЛМ проблема проявилась во всей красе.
no subject
Date: 2025-02-17 03:23 pm (UTC)Правила арифметики всегда были непротиворечивыми. Гёдель доказал то, что в непротиворечивой системе могут быть истинные утверждения, которые невозможно доказать в рамках этой системы.
Матан не перестал работать после того, как Вейерштрасс придумал одноимённую функцию. Законы Ньютона или Кеплера от этого открытия никак не пострадали. Они и так ломаются на квантовом уровне, а в рамках их применимости фрактальных функций не бывает.
no subject
Date: 2025-02-18 04:48 am (UTC)Я и не говорил, что математика не работает. На матане вся физика держится. Я говорю, что математика нелогична, как и физика. Сила науки проявляется в ее способности предсказывать будущее, а не в том, насколько она логична. Но здесь речь об ЛЛМ. Как ему совместить логику и математику?
no subject
Date: 2025-02-18 12:42 pm (UTC)Неполнота в данном контексте именно это и означает.
Как встроить калькулятор в LLM
Date: 2025-02-17 07:13 pm (UTC)Правильнее добавить нейроны, представляющие калькулятор внутрь нейросети, чтобы эти нейтроны активизировались соответствующими текстовыми запросами, и чтобы эти нейроны могли сформировать посчитанный результат и добавить его в ответ.
Re: Как встроить калькулятор в LLM
Date: 2025-02-17 08:29 pm (UTC)Re: Как встроить калькулятор в LLM
Date: 2025-02-17 08:36 pm (UTC)Разница в способе обработки информации.
Нейроны - непосредственная часть нейросети, которая работает с уже распарсенной информацией, которую удобно обрабатывать.
Текст - нужно сначала распарсить и создать контекст, и только потом - думать. После чего - снова преобразовать в текст.
Re: Как встроить калькулятор в LLM
Date: 2025-02-17 08:46 pm (UTC)Но можно попробовать пропустить последний этап формирования текста и скармливать в парсер арифмометра непосредсвенно embeddings, и его результат конвертировать тоже в embeddings. В этом смысле исследования оптимального представления эмбеддингов для кодирования чисел может быть полезно.
Re: Как встроить калькулятор в LLM
Date: 2025-02-17 10:11 pm (UTC)Число для калькулятора можно представить одним нейроном, специально созданным для этого.
Также и число из калькулятора можно представить нейроном созданным для этого числа.
И сразу же связать эти нейроны друг с другом и остальным контекстом решаемой задачи.
> можно попробовать пропустить последний этап формирования текста и скармливать в парсер арифмометра непосредсвенно embeddings
Embeddings - это не совсем нейросеть. Embeddings - это лишь проекция нейросети на набор в ~1500 нейронов (dimensions).
Re: Как встроить калькулятор в LLM
Date: 2025-02-17 10:26 pm (UTC)> Число для калькулятора можно представить одним нейроном, специально созданным для этого.
Нельзя. Оно так не работает. Начиная с того, что диапазон значений, используемых в нейроне ограничен чем-то более или менее близким к [-1, +1].
Re: Как встроить калькулятор в LLM
Date: 2025-02-17 10:30 pm (UTC)Только те числа, которые используются.
Каждый нейрон может быть представлен Int32 ID (up to 4B neurons).
При кодировании числа в нейрон - записывать это число в специальную таблицу NeuronNumber { Id int, Number real}
Ну а когда этот нейрон больше не нужен - удалять из нейросети и удалять из таблицы NeuronNumber.
Re: Как встроить калькулятор в LLM
Date: 2025-02-17 10:37 pm (UTC)Моделировать какую-то функцию на нейросети - безусловно возможно. Это довольно базовая вещь, хоть и как оказывается на практике, тоже с приключениями. Для уменьшения приключений я даже придумал новую V-образную функцию активации. Но тут весь этот кусок оказывается изначально посвящен одной функции, на конкретно которую он натренировывается. Это не общая нейросеть.
Re: Как встроить калькулятор в LLM
Date: 2025-02-18 08:44 pm (UTC)Как это "нет"?
Если нам нужно что-то посчитать - мы нам нужен новый нейрон с числом и привязкой к калькулятору (через таблицу NeuronNumber).
После того, как посчитали и получили ответ - нужен новый нейрон с результатом из калькулятора.
После того, как результат осмыслен, превращён в текстовый ответ и забыт - этот нейрон больше не нужен.
Re: Как встроить калькулятор в LLM
Date: 2025-02-19 11:06 pm (UTC)Re: Как встроить калькулятор в LLM
Date: 2025-02-20 03:46 pm (UTC)Что мешает удалить ненужный нейрон?
Re: Как встроить калькулятор в LLM
Date: 2025-02-21 06:29 pm (UTC)Переменное количество нейронов
Date: 2025-02-22 07:57 am (UTC)Почему ты считаешь, что количество нейронов в нейросети должно быть фиксированным?
Re: Переменное количество нейронов
Date: 2025-02-22 11:35 pm (UTC)Re: Переменное количество нейронов
Date: 2025-02-23 12:05 am (UTC)Какие-то нейросети имеют фиксированное количество нейронов.
Нейросеть, которую создавал я - имеет динамическое количество нейронов.
Нейросеть человеческого мозга - имеет динамическое количество нейронов.
Re: Как встроить калькулятор в LLM
Date: 2025-02-17 08:40 pm (UTC)Можно и иногда (когда надо думать внимательнее) - полезно.
> Почему не сделать эту уточняющую фазу автматической?
Автоматической по условию (не всегда) - можно.
Автоматической всегда - не нужно, потому что жрёт ресурсы, а в простых ситуациях пользы от дополнительных прогонов - нет.
> Но есть новомодное направление "агентов", когда ИИ строится из группы "личностей", которые задают друг другу уточнения и формулируют общий ответ.
Да, это перспективное направление, которое может заменить многие профессии.