sab123: (Default)
SB ([personal profile] sab123) wrote2025-02-16 04:05 pm

ИИ и формализмы

"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. Ну и то же самое с любой арифметикой.

Интересно, какие возражения такая идея вызывает у учоных: "но ведь разрешать выполнение питонного кода из вывода - небезопасно". То, что можно сделать не Питон, а любой свой безопасный язык, им просто в голову не приходит. На лицо еще один признак большого разрыва между Машинными Учоными и Компьюторными Учоными.

А вот еще интересен такой момент: я спрашивал в разных местах, и у всех генерация машинного кода искусственным интеллектом просиходит совершенно от балды этого ИИ. Но ведь машинный код - формальный язык. Грамматика и семантика его известна. Ничего не мешает генерировать сразу согласно грамматике - проверять каждую следующую лексему на соответствие грамматике, и если соответстие не найдено, то ее отбрасывать и выбирать другую, следующую по весу. Может полученный код и не будет правильно работать, но как минимум всегда будет соответствовать грамматике, и с небольшими дополнительными проверками - компилироваться. В одном из мест я видел примеры кода, сгенерированного моделями различной сложности, с качеством, растущим со сложностью модели. Но простая формальная проверка должна поднять качество кода, сгенерированного даже простыми моделями.
sobriquet9: (Default)

[personal profile] sobriquet9 2025-02-17 02:46 am (UTC)(link)
python3
Python 3.10.12 (main, Jan 17 2025, 14:35:34) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1+0.2-0.3
5.551115123125783e-17
>>> 

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.

chapai: (Default)

[personal profile] chapai 2025-02-17 04:23 am (UTC)(link)
да, хороший пример для чего.
sobriquet9: (Default)

[personal profile] sobriquet9 2025-02-17 03:03 pm (UTC)(link)

Если задать тот же вопрос, но по другому основанию (не 10, а например 7 или -7), фразы "visualize in my head" в ответе нет. Ответы тоже правильные и тоже получены двумя разными способами (через десятичное приближение и дробями). И все рассуждения в ответе правильные. Оно даже проверяет, нет ли где переноса.

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

sobriquet9: (Default)

[personal profile] sobriquet9 2025-02-17 08:57 pm (UTC)(link)

Как вы сформулируете запрос к внешнему вычислителю посчитать 0.1+0.2-0.3 по основанию -7? Я вот так навскидку не знаю синтаксис и функции стандартных библиотек в известных мне языках программирования для выполнения вычислений с отрицательным основанием.

Этот пример придуман мной вчера на ровном месте. Я очень удивлюсь, если где-то в обучающей выборке он есть. Если не верите, придумайте самостоятельно оригинальный вопрос и задайте его.

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

sobriquet9: (Default)

[personal profile] sobriquet9 2025-02-17 09:23 pm (UTC)(link)

bc не умеет, говорит "Runtime warning (func=(main), adr=6): negative ibase, set to 2".

Округление не исправляет ошибку, а только прячет её. Надо использовать recursive real arithmetic.