Entry tags:
ИИ и формализмы
"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
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
no subject
no subject
Если задать тот же вопрос, но по другому основанию (не 10, а например 7 или -7), фразы "visualize in my head" в ответе нет. Ответы тоже правильные и тоже получены двумя разными способами (через десятичное приближение и дробями). И все рассуждения в ответе правильные. Оно даже проверяет, нет ли где переноса.
Вряд ли в обучающей выборке был точно такой же пример.
no subject
Я как-то слушал лекцию человека, работающего над Лламой, и он рассказал, что у них в тренировках есть ОЧЕНЬ много специальных случаев, к котороым постоянно добавляют по мере обнаружения примеров того, что работает неправильно.
no subject
Как вы сформулируете запрос к внешнему вычислителю посчитать 0.1+0.2-0.3 по основанию -7? Я вот так навскидку не знаю синтаксис и функции стандартных библиотек в известных мне языках программирования для выполнения вычислений с отрицательным основанием.
Этот пример придуман мной вчера на ровном месте. Я очень удивлюсь, если где-то в обучающей выборке он есть. Если не верите, придумайте самостоятельно оригинальный вопрос и задайте его.
Также обратите внимание на то, что в десятичной базе r1 возвращает точный ответ, а внешний вычислитель на питоне делает это с ошибкой округления.
no subject
"Точный ответ" может быть в частности результатом округления:
$ 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
bc не умеет, говорит "Runtime warning (func=(main), adr=6): negative ibase, set to 2".
Округление не исправляет ошибку, а только прячет её. Надо использовать recursive real arithmetic.
no subject