о том, как отвечают модели
Андрей Карпати недавно опубликовал новое видео про то, как работают языковые модели, для широкой публики. Скорее всего, оно очень хорошее и стоит вашего внимания, если вы хотите разобраться, как устроен ChatGPT и другие такие модели - говорю "скорее всего", потому что целиком его не смотрел, там слишком мало для меня нового. Но Карпати всегда очень хорошо объясняет, по моему опыту.Я хочу привлечь внимание к одному месту в его видео (1:47 в видео), где он сравнивает разные методики тренировки моделей на примерах "вопрос - ответ". Он дает такой пример: скажем, мы хотим, чтобы модель идеально отвечала на вопросы типаЭмили купила 3 яблока и 2 апельсина. Каждый апельсин стоит $2, а всего она заплатила $13. Сколько стоит каждое яблоко?Тогда мы можем сгенерировать много примеров вопросов такого вида и правильных ответов, и натренировать модель на них, вдонабок к тому, что она и так уже имеет; это назыается подкрутка, файн-тьюнинг.(Это просто игрушечный пример: конкретно на этот вопрос любая ведущая модель сегодня и так ответит, но в реальности нам могут понадобиться более сложные вопросы и задачи). Но вот вопрос, как сформулировать правильный ответ, к которому модель должна стремиться? Два варианта:Ответ: $3. Два апельсина по $2 каждый стоят вместе $4, значит, яблоки стоят $13-$4=$9, и каждое яблоко стоит $9/3 = $3.Два апельсина по $2 каждый стоят вместе $4, значит, яблоки стоят $13-$4=$9, и всего есть три яблока, поэтому каждое яблоко стоит $9/3 = $3. Ответ: $3.Карпати совершенно справедливо объясняет, что второй вариант ответа НАМНОГО ЛУЧШЕ, чем первый, в том смысле, что если мы будем использовать второй вариант при тренировки модели, она сможет решить больше задач, и более качественно. Это верно вот почему, и это ключевой момент, который, наверное, многие недостаточно хорошо понимают про языковые модели: когда вы получаете ответ от модели, она выдает его буква за буквой (точнее токен за токеном, но разница в данном случае неважна), и каждый раз "думает" заново, какую букву выдать следующей, и при каждом таком размышлении ВИДИТ ВСЕ, ЧТО УЖЕ НАПИСАЛА.Поэтому если модель натренировали отвечать по первому шаблону, то она начнет выдавать: "Ответ $", и в этот момент ей нужно будет сказать правильный ответ, основываясь только на условии задачи. А если по второму, она может выдавать промежуточные результаты: апельсины $4, осталось $9, всего 3 яблока, надо поделить - не "вписываясь" за какой-то определенный ответ до самого конца - и в конце выдавать этот ответ, используя в том числе свои же предыдущие промежуточные размышления. То, что Карпати не говорит тут, а я добавлю: тот же самый трюк вы можете использовать не во время тренировки, а во время использования больших моделей типа ChatGPT. Когда вы задаете модели сложный вопрос - необязательно математический - для ответа на который надо учесть много факторов, всегда стоит попробовать сказать ей: "Не давай мне ответ сразу, сначала сделай все промежуточные вычисления и приведи их результаты, и только потом напиши окончательный ответ". Или: "Я хочу попробовать сделать X таким-то способом. Не пиши мне сразу, хорошая это идея или нет, сначала приведи список доводов за и против, а также альтернатив, и в самом конце подытожь и дай свою рекомендацию".Я почти всегда именно так прошу языковые модели на что-то сложное и неочидное мне ответить или порекомендовать, просто потому, что у меня в голове есть эта устоявшаяся картинка того, как модель отвечает буква за буквой, все время потребляя все окно контекста, включая уже сказанную часть ответа. Нередко это неважно, потому что модель и так "решила", какой ответ хочет дать, на основании вопроса, и ей не нужна помощь в виде своих же промежуточных шагов. Но именно на самых сложных и неочевидных для моделей вопросов это часто помогает. Как минимум стоит об этом помнить и попробовать так сформулировать, если обычный и самый простой вопрос ведет к неверному ответу или бреду.
Я хочу привлечь внимание к одному месту в его видео (1:47 в видео), где он сравнивает разные методики тренировки моделей на примерах "вопрос - ответ". Он дает такой пример: скажем, мы хотим, чтобы модель идеально отвечала на вопросы типа
Эмили купила 3 яблока и 2 апельсина. Каждый апельсин стоит $2, а всего она заплатила $13. Сколько стоит каждое яблоко?
Тогда мы можем сгенерировать много примеров вопросов такого вида и правильных ответов, и натренировать модель на них, вдонабок к тому, что она и так уже имеет; это назыается подкрутка, файн-тьюнинг.
(Это просто игрушечный пример: конкретно на этот вопрос любая ведущая модель сегодня и так ответит, но в реальности нам могут понадобиться более сложные вопросы и задачи).
Но вот вопрос, как сформулировать правильный ответ, к которому модель должна стремиться?
Два варианта:
Ответ: $3. Два апельсина по $2 каждый стоят вместе $4, значит, яблоки стоят $13-$4=$9, и каждое яблоко стоит $9/3 = $3.
Два апельсина по $2 каждый стоят вместе $4, значит, яблоки стоят $13-$4=$9, и всего есть три яблока, поэтому каждое яблоко стоит $9/3 = $3. Ответ: $3.
Карпати совершенно справедливо объясняет, что второй вариант ответа НАМНОГО ЛУЧШЕ, чем первый, в том смысле, что если мы будем использовать второй вариант при тренировки модели, она сможет решить больше задач, и более качественно.
Это верно вот почему, и это ключевой момент, который, наверное, многие недостаточно хорошо понимают про языковые модели: когда вы получаете ответ от модели, она выдает его буква за буквой (точнее токен за токеном, но разница в данном случае неважна), и каждый раз "думает" заново, какую букву выдать следующей, и при каждом таком размышлении ВИДИТ ВСЕ, ЧТО УЖЕ НАПИСАЛА.
Поэтому если модель натренировали отвечать по первому шаблону, то она начнет выдавать: "Ответ $", и в этот момент ей нужно будет сказать правильный ответ, основываясь только на условии задачи. А если по второму, она может выдавать промежуточные результаты: апельсины $4, осталось $9, всего 3 яблока, надо поделить - не "вписываясь" за какой-то определенный ответ до самого конца - и в конце выдавать этот ответ, используя в том числе свои же предыдущие промежуточные размышления.
То, что Карпати не говорит тут, а я добавлю: тот же самый трюк вы можете использовать не во время тренировки, а во время использования больших моделей типа ChatGPT. Когда вы задаете модели сложный вопрос - необязательно математический - для ответа на который надо учесть много факторов, всегда стоит попробовать сказать ей: "Не давай мне ответ сразу, сначала сделай все промежуточные вычисления и приведи их результаты, и только потом напиши окончательный ответ".
Или: "Я хочу попробовать сделать X таким-то способом. Не пиши мне сразу, хорошая это идея или нет, сначала приведи список доводов за и против, а также альтернатив, и в самом конце подытожь и дай свою рекомендацию".
Я почти всегда именно так прошу языковые модели на что-то сложное и неочидное мне ответить или порекомендовать, просто потому, что у меня в голове есть эта устоявшаяся картинка того, как модель отвечает буква за буквой, все время потребляя все окно контекста, включая уже сказанную часть ответа. Нередко это неважно, потому что модель и так "решила", какой ответ хочет дать, на основании вопроса, и ей не нужна помощь в виде своих же промежуточных шагов. Но именно на самых сложных и неочевидных для моделей вопросов это часто помогает. Как минимум стоит об этом помнить и попробовать так сформулировать, если обычный и самый простой вопрос ведет к неверному ответу или бреду.