Конкуренция AI продуктов🏆
Альтернатива ChatGPT от гугла: Bard
➕ Бесплатный
➕ С доступом к поиску под капотом, то есть можно спрашивать про свежие события
➕ Быстрее, чем ChatGPT
➕ Чаще выводит результат в удобно читаемой табличке (мне такое нравится 🙂)
➖ Только на английском
Смелый шаг от гугла. Такой новый поиск пока не понятно как монетизировать. То есть это угроза их основному бизнесу (рекламе). Плюс, теперь их бренд в какой то степени будет ассоциироваться с галлюцинациями, которые иногда выдают все LMки (и Bard не исключение). И наверняка будет достаточно желающих засудить гугл за неверные факты в ответах
Ну а пользователям больше опций только лучше) Конкуренция - хорошо и весело🥔
(только если эти компании станут сильно меньше публиковать информации про свои открытия, это не так весело👎 )
Альтернатива ChatGPT от гугла: Bard
➕ Бесплатный
➕ С доступом к поиску под капотом, то есть можно спрашивать про свежие события
➕ Быстрее, чем ChatGPT
➕ Чаще выводит результат в удобно читаемой табличке (мне такое нравится 🙂)
➖ Только на английском
Смелый шаг от гугла. Такой новый поиск пока не понятно как монетизировать. То есть это угроза их основному бизнесу (рекламе). Плюс, теперь их бренд в какой то степени будет ассоциироваться с галлюцинациями, которые иногда выдают все LMки (и Bard не исключение). И наверняка будет достаточно желающих засудить гугл за неверные факты в ответах
Ну а пользователям больше опций только лучше) Конкуренция - хорошо и весело
(только если эти компании станут сильно меньше публиковать информации про свои открытия, это не так весело
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍3❤1👎1🤔1
Безопасный Искусственный Интеллект 🤖
Последнее время много обсуждается про возможные опасности ИИ и как он уничтожит человечество. В связи с этим, популярней становятся исследования про AI Safety. Вот некоторые направления в этой области, если вдруг захочется сделать вклад😉
☝ Интерпретируемость. Нейросеть - черный ящик, перемножение и складывания чиселок миллиарды раз. Но есть разные подходы, чтобы понимать на какие части входного текста модель опиралась больше, или за что отвечает отдельно взятый нейрон, и так далее
☝ Робастность. Если подать на вход нетипичные данные, которые модель не видела во время обучения, она может выдать полный бред. Робастность это как раз про то, чтобы на широком спектре входных данных отвечать адекватно
☝ Честность. LLMки способны генерировать очень правдоподобный вымысел. Какой нибудь медицинский совет от ChatGPT может звучать очень научно и классно, но следовать ему без дополнительного факт чекинга - плохая идея
☝ Определение награды. Как донести до нейросети человеческие ценности, предпочтения? Самый популярный подход сейчас: Reward modeling на попарных сравнениях, сделанных людьми, и последующий RL
☝ Оценка качества. Перед тем как выпускать свежеобученную нейросеть в мир, было бы хорошо оценить её способности на разнообразных тестах, и заранее обнаружить её слабые и сильные стороны
Последнее время много обсуждается про возможные опасности ИИ и как он уничтожит человечество. В связи с этим, популярней становятся исследования про AI Safety. Вот некоторые направления в этой области, если вдруг захочется сделать вклад
☝ Интерпретируемость. Нейросеть - черный ящик, перемножение и складывания чиселок миллиарды раз. Но есть разные подходы, чтобы понимать на какие части входного текста модель опиралась больше, или за что отвечает отдельно взятый нейрон, и так далее
☝ Робастность. Если подать на вход нетипичные данные, которые модель не видела во время обучения, она может выдать полный бред. Робастность это как раз про то, чтобы на широком спектре входных данных отвечать адекватно
☝ Честность. LLMки способны генерировать очень правдоподобный вымысел. Какой нибудь медицинский совет от ChatGPT может звучать очень научно и классно, но следовать ему без дополнительного факт чекинга - плохая идея
☝ Определение награды. Как донести до нейросети человеческие ценности, предпочтения? Самый популярный подход сейчас: Reward modeling на попарных сравнениях, сделанных людьми, и последующий RL
☝ Оценка качества. Перед тем как выпускать свежеобученную нейросеть в мир, было бы хорошо оценить её способности на разнообразных тестах, и заранее обнаружить её слабые и сильные стороны
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍6🤔3❤1
SLiC-HF - убийца 🔪 RLHF?
RLHF, которым обучались ChatGPT и GPT-4, обладает следующим недостатком: сложное, долгое и нестабильное RL дообучение, с большими требованиями по памяти; ведь во время него нужно оценивать генерации с помощью Reward модели и считать вероятности изначальной моделью для KL члена (на рисунке 3 более подробное сравнение).
Так вот, чуваки из гугла показали, что есть более эффективный и простой способ дообучаться на сложный недифференцируемый сигнал типа Human Feedback'а. По human evaluation их метод статзначимо выигрывает у RLHF💪
Коротко про метод (Sequence Likelihood Calibration):
1️⃣ Обучить нейронку моделировать Human Feedback. Они экспериментировали с pair-wise (контрастив) и point-wise обучениями
2️⃣ Создать датасет
a. сгенерировать
b. либо взять непосредственно датасет попарных сравнений в качестве
c. микс a и b
3️⃣ Дообучить на нем с лоссом с рисунка 1
Что круто, они сравнились с более простым и очевидным способом улучшения модели: простой supervised finetuning на
Подробности читайте в статье, очень годная 🔥
Подписывайтесь на мой канал, чтобы читать про интересные штуки в AI: https://t.iss.one/building_singularity :)
RLHF, которым обучались ChatGPT и GPT-4, обладает следующим недостатком: сложное, долгое и нестабильное RL дообучение, с большими требованиями по памяти; ведь во время него нужно оценивать генерации с помощью Reward модели и считать вероятности изначальной моделью для KL члена (на рисунке 3 более подробное сравнение).
Так вот, чуваки из гугла показали, что есть более эффективный и простой способ дообучаться на сложный недифференцируемый сигнал типа Human Feedback'а. По human evaluation их метод статзначимо выигрывает у RLHF
Коротко про метод (Sequence Likelihood Calibration):
1️⃣ Обучить нейронку моделировать Human Feedback. Они экспериментировали с pair-wise (контрастив) и point-wise обучениями
2️⃣ Создать датасет
(x, y+, y-, y_ref)
:a. сгенерировать
n
кандидатов, проранжировать их моделью с 1 шага, выбрать лучший в качестве y_ref
, и ещё пару для y+
и y-
b. либо взять непосредственно датасет попарных сравнений в качестве
y+
и y-
; а в качестве y_ref
- написанные людьми суммаризацииc. микс a и b
3️⃣ Дообучить на нем с лоссом с рисунка 1
Что круто, они сравнились с более простым и очевидным способом улучшения модели: простой supervised finetuning на
y_ref
(рисунок 2)Подробности читайте в статье, очень годная 🔥
Подписывайтесь на мой канал, чтобы читать про интересные штуки в AI: https://t.iss.one/building_singularity :)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍7❤2🎉1
Улучшение качества 📈 за счет оптимального выбора весов для обучающих датасетов 📚
Датасеты бывают из разных доменов: интернет новости, википедия, код, диалоги, инструкции... И применяться одна и та же модель может на разных задачах: например это могут быть chit-chat диалоги, диалоги с детьми, диалоги, склоняющие к целевому действию - в зависимости от пользователя. В каких пропорциях брать датасеты в финальный трейн сет?
Авторы статьи (из Гугла и Стенфорда) предлагают способ выбора весов для каждого домена, который в их экспериментах:
🔹 Уменьшил лосс на каждом домене относительно бейзлайна (эвристически подобранные веса датасета Pile) - без трейдоффа, просто улучшение (рисунок 1)
🔹 Обученная их методом модель улучшила среднюю точность One-Shot’а в 5 разных задачах (рисунок 2)
Метод (рисунок 3):
1️⃣ Обучить небольшую reference Langauage Model
2️⃣ Обучить прокси модель (используя Group Distributionally Robust Optimization), чтобы получить новые веса для доменов
3️⃣ Обучить финальную большую LM с этими весами
❗️Group DRO: минимизация наибольшего лосса по всем доменам. То есть ищем модель, которая работает как можно лучше в самых тяжелых случаях.
На самом деле Group DRO не просто лосс минимизирует, а разницу лосса прокси и референс моделей (но получилось бы слишком тяжелое для понимания предложение 😁). Сам процесс обучения: поочередное изменение весов доменов и весов прокси LM’ки для решения минимакс задачи (алгоритм на рисунке 4)
В итоге:
🔸 качество строго лучше и достигается оно быстрее - относительно эвристически подобранных весов
🔸 качество такое же, но эксперименты дешевле - относительно оптимизации весов доменов под целевые задачи сразу с большой LM’кой
Статья: DoReMi: Optimizing Data Mixtures Speeds Up Language Model Pretraining
Датасеты бывают из разных доменов: интернет новости, википедия, код, диалоги, инструкции... И применяться одна и та же модель может на разных задачах: например это могут быть chit-chat диалоги, диалоги с детьми, диалоги, склоняющие к целевому действию - в зависимости от пользователя. В каких пропорциях брать датасеты в финальный трейн сет?
Авторы статьи (из Гугла и Стенфорда) предлагают способ выбора весов для каждого домена, который в их экспериментах:
🔹 Уменьшил лосс на каждом домене относительно бейзлайна (эвристически подобранные веса датасета Pile) - без трейдоффа, просто улучшение (рисунок 1)
🔹 Обученная их методом модель улучшила среднюю точность One-Shot’а в 5 разных задачах (рисунок 2)
Метод (рисунок 3):
1️⃣ Обучить небольшую reference Langauage Model
2️⃣ Обучить прокси модель (используя Group Distributionally Robust Optimization), чтобы получить новые веса для доменов
3️⃣ Обучить финальную большую LM с этими весами
❗️Group DRO: минимизация наибольшего лосса по всем доменам. То есть ищем модель, которая работает как можно лучше в самых тяжелых случаях.
На самом деле Group DRO не просто лосс минимизирует, а разницу лосса прокси и референс моделей (но получилось бы слишком тяжелое для понимания предложение 😁). Сам процесс обучения: поочередное изменение весов доменов и весов прокси LM’ки для решения минимакс задачи (алгоритм на рисунке 4)
В итоге:
🔸 качество строго лучше и достигается оно быстрее - относительно эвристически подобранных весов
🔸 качество такое же, но эксперименты дешевле - относительно оптимизации весов доменов под целевые задачи сразу с большой LM’кой
Статья: DoReMi: Optimizing Data Mixtures Speeds Up Language Model Pretraining
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4❤1🤔1
Большой обзор 👁 методов по исправлению ответов LLM’ок 👨🏫
В генерациях LLM могут быть ложные факты, неверные рассуждения, код с багами, токсичные высказывания и прочие приколы. Авторы разложили по полочкам имеющиеся способы борьбы с этим.
Самый популярный сейчас подход для такого - собрать датасет предпочтений пользователей и делать RLHF. Но есть и намного более быстрые способы, где LLM генерирует критику сама для себя, и на её основе сама же исправляется😱
Такой пример post-hoc исправления может быть дешевле и эффективней в некоторых задачах, чем исправление в процессе обучения как в RLHF.
Авторы выделили во всех этих методах 3 сущности (рисунок 1):
1. Языковую модель, которая генерирует изначальный ответ
2. Критика, который дает фидбек; это может быть человеческая оценка, ответ GPT4 с нужным промптом, награда ревард модели, …
3. Способ исправления
Способы исправления могут быть:
⁃ С дообучением модели: RLHF (или SLiC / DPO) или просто составление исправленного датасета и обычный файнтюн
⁃ Во время генерации: изменять вероятности новых токенов на основе награды ревард модели, например; или генерировать N кандидатов, а затем выбирать лучший по мнению критика
⁃ Post-hoc исправление (рисунок 2): генерация той же LLM с 1ого шага, но с расширенным промптом, ...
Прикольно смотреть на такую таксономию, всё уложилось четко😗
Можно брать листья из каждой ветки, получать новый способ по исправлению ответов, и писать статью :D
(хотя там столько ссылок на другие работы, что может всё уже и перебрали)
Статья: "Automatically Correcting Large Language Models: Surveying the landscape of diverse self-correction strategies"
В генерациях LLM могут быть ложные факты, неверные рассуждения, код с багами, токсичные высказывания и прочие приколы. Авторы разложили по полочкам имеющиеся способы борьбы с этим.
Самый популярный сейчас подход для такого - собрать датасет предпочтений пользователей и делать RLHF. Но есть и намного более быстрые способы, где LLM генерирует критику сама для себя, и на её основе сама же исправляется
Такой пример post-hoc исправления может быть дешевле и эффективней в некоторых задачах, чем исправление в процессе обучения как в RLHF.
Авторы выделили во всех этих методах 3 сущности (рисунок 1):
1. Языковую модель, которая генерирует изначальный ответ
2. Критика, который дает фидбек; это может быть человеческая оценка, ответ GPT4 с нужным промптом, награда ревард модели, …
3. Способ исправления
Способы исправления могут быть:
⁃ С дообучением модели: RLHF (или SLiC / DPO) или просто составление исправленного датасета и обычный файнтюн
⁃ Во время генерации: изменять вероятности новых токенов на основе награды ревард модели, например; или генерировать N кандидатов, а затем выбирать лучший по мнению критика
⁃ Post-hoc исправление (рисунок 2): генерация той же LLM с 1ого шага, но с расширенным промптом, ...
Прикольно смотреть на такую таксономию, всё уложилось четко
Можно брать листья из каждой ветки, получать новый способ по исправлению ответов, и писать статью :D
(хотя там столько ссылок на другие работы, что может всё уже и перебрали)
Статья: "Automatically Correcting Large Language Models: Surveying the landscape of diverse self-correction strategies"
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3❤2
Какой размер датасета 📚 нужен для дообучения❓
Точного ответа конечно нет, но есть статьи где показали
- профит с гигантским датасетом: Orca на 5М инструкций и ответов, полученных от GPT-4
- профит с небольшими, но очень качественными датасетами
Например в статье Less is More for Alignment (LIMA) чуваки из Meta вручную собрали датасет из 1000 примеров. Дообучение на нем дает результаты лучше, чем на 52к примеров из Alpaca датасета.
Но вручную собирать дорого и долго, и в статье AlpaGasus предложили автоматизировать это (рис. 1)
Ученые придумали промпт🧠
Причем они даже не пробовали разные, просто сказали что воспользовались этим (рис. 2) и всё👍
Использовали GPT-4 с этим промптом, чтобы для пар (инструкция, ответ) получить оценку от 0 до 5 - насколько они подходят друг другу. Проскорили все пары в Alpaca и выбрали 9k примеров с оценкой больше 4.5. Дообучили модель на этих 9к и сравнились с обучением на 52к аж на 4 тест сетах:
- WizardLM 250к сложных примеров evol-instruct методом
- Vicuna 70к диалогов с ChatGPT
- Koala 260к разных датасетов (QA, диалоги с LLM, ...)
- Self-Instruct 82к инструкций и ответов, сгенерированных GPT-3
Выглядит как хороший замер, да вот только примеров в тест сетах было 180, 80, 218 и 252 соотвественно😵
Замеряли качество используя GPT-4, так что я вообще не понял, почему так мало. Тем не менее, по всем тест сетам стало лучше (рис. 3)
На других обучающих данных свой подход автоматической фильтрации они не пробовали. Возможно, потому что на GPT-4-distilled датасетах (типа vicuna) это и работать не будет. Статья в общем то не очень (на мой взгляд; плюс это препринт), но есть пара вещей, которые мне кажутся действительно полезными и применимыми на практике:
1️⃣ Маленький и качественный дотасет как отличная начальная точка; больше данных не всегда лучше
2️⃣ Фильтровать ответы моделей (не ChatGPT/GPT-4) по небинарным скорам от GPT-4 (хотя в первую очередь имеет смысл просто сгенерировать ответов от GPT-4 на своем домене)
subscribe
like, share, repost :D
Точного ответа конечно нет, но есть статьи где показали
- профит с гигантским датасетом: Orca на 5М инструкций и ответов, полученных от GPT-4
- профит с небольшими, но очень качественными датасетами
Например в статье Less is More for Alignment (LIMA) чуваки из Meta вручную собрали датасет из 1000 примеров. Дообучение на нем дает результаты лучше, чем на 52к примеров из Alpaca датасета.
Но вручную собирать дорого и долго, и в статье AlpaGasus предложили автоматизировать это (рис. 1)
Ученые придумали промпт
Причем они даже не пробовали разные, просто сказали что воспользовались этим (рис. 2) и всё
Использовали GPT-4 с этим промптом, чтобы для пар (инструкция, ответ) получить оценку от 0 до 5 - насколько они подходят друг другу. Проскорили все пары в Alpaca и выбрали 9k примеров с оценкой больше 4.5. Дообучили модель на этих 9к и сравнились с обучением на 52к аж на 4 тест сетах:
- WizardLM 250к сложных примеров evol-instruct методом
- Vicuna 70к диалогов с ChatGPT
- Koala 260к разных датасетов (QA, диалоги с LLM, ...)
- Self-Instruct 82к инструкций и ответов, сгенерированных GPT-3
Выглядит как хороший замер, да вот только примеров в тест сетах было 180, 80, 218 и 252 соотвественно
Замеряли качество используя GPT-4, так что я вообще не понял, почему так мало. Тем не менее, по всем тест сетам стало лучше (рис. 3)
На других обучающих данных свой подход автоматической фильтрации они не пробовали. Возможно, потому что на GPT-4-distilled датасетах (типа vicuna) это и работать не будет. Статья в общем то не очень (на мой взгляд; плюс это препринт), но есть пара вещей, которые мне кажутся действительно полезными и применимыми на практике:
subscribe
like, share, repost :D
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥3❤1😁1
Фидбек пользователей - конкурентное преимущество 💪
💡 Извлекать полезный сигнал для дообучения модели из взаимодействий пользователей с вашим приложением - важнейшая вещь.
С выходом ChatGPT стал популярен такой способ улучшения качества:
1. на своих production запросах получить датасет пар (запрос, качественный ответ от ChatGPT)
2. дообучить на этом свою собственную LLM поменьше, чтобы было дешевле и быстрее инферить
Это работает, потому что GPT-4 (полгода назад ChatGPT) от OpenAI - лучшая general purpose модель.
Но вот недавно OpenAI добавили возможность дообучать ChatGPT.
И если хочется максимального качества, то в алгоритм выше логично добавить в самое начало шаг с дообучением ChatGPT. Но на чем его дообучать?
- Если на ответах GPT-4, то профит будет не такой большой
- Если на своих же ответах (ответах ChatGPT), то его скорее всего вообще не будет
И тут (это конечно полезно и без ChatGPT, на своих собственных моделях) на помощь приходит Human Feedback, который вы собираете в своем приложении:
1️⃣ Выкатить ChatGPT на пользователей и собрать пары (запрос, ответ ChatGPT)
2️⃣ Отобрать из этих данных те ответы, которые максимально понравились пользователям
3️⃣ Дообучиться на этом
Таким образом, приватные данные создают вам конкурентное преимущество и помогают улучшать модели.
Про эту же идею есть слайд (на рисунке) в 153-страничном отчете от ARK Invest, вдруг кому будет полезно :)
С выходом ChatGPT стал популярен такой способ улучшения качества:
1. на своих production запросах получить датасет пар (запрос, качественный ответ от ChatGPT)
2. дообучить на этом свою собственную LLM поменьше, чтобы было дешевле и быстрее инферить
Это работает, потому что GPT-4 (полгода назад ChatGPT) от OpenAI - лучшая general purpose модель.
Но вот недавно OpenAI добавили возможность дообучать ChatGPT.
И если хочется максимального качества, то в алгоритм выше логично добавить в самое начало шаг с дообучением ChatGPT. Но на чем его дообучать?
- Если на ответах GPT-4, то профит будет не такой большой
- Если на своих же ответах (ответах ChatGPT), то его скорее всего вообще не будет
И тут (это конечно полезно и без ChatGPT, на своих собственных моделях) на помощь приходит Human Feedback, который вы собираете в своем приложении:
Таким образом, приватные данные создают вам конкурентное преимущество и помогают улучшать модели.
Про эту же идею есть слайд (на рисунке) в 153-страничном отчете от ARK Invest, вдруг кому будет полезно :)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3❤2
В реддите AI энтузиасты делают прикольные вещи. Вот эта картина прям очень классная
Промпт:
Medieval village scene with busy streets and castle in the distance
; на вход Control Net'у (QR Monster) была подана спиральВ комментах треда можно почитать поподробней.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍6❤3
Приближаем сингулярность
Фидбек пользователей - конкурентное преимущество 💪 💡 Извлекать полезный сигнал для дообучения модели из взаимодействий пользователей с вашим приложением - важнейшая вещь. С выходом ChatGPT стал популярен такой способ улучшения качества: 1. на своих production…
Какой фидбек бывает❓
Немного дополню предыдущий пост про то, какой фидбек пользователей обычно бывает и какие могут возникнуть проблемы (в контексте дальнейшего его использования для улучшения моделей).
Явный фидбек: лайк на видео, например. Очень хороший сигнал. Но обычно оставляется небольшим числом пользователей и данных мало.
И если попытаться награждать пользователей за их лайки/дизлайки/реакции/etc, то это скорее всего ухудшит ситуацию: фидбека действительно станет больше, но его качество сильно упадет. Стимул получать бонусы сильнее желания оставлять осмысленный фидбек.
С явным фидбеком может быть ещё одна проблема: его может оставлять только специфическая группа пользователей. Таким образом, обучившись на этот фидбек, модель станет лучше для них, но для медианного пользователя всё ухудшится (прям диктатура меньшинства получатся).
Проблема нерепрезентативности и малого количества данных может решиться с неявным фидбеком. Это про поведение пользователя: досмотрел ли видео/дослушал ли песню/продолжил ли взаимодействие.
Но хоть такого фидбека и много, он сильно более шумный, чем явный. На пользователя и его поведение влияют сотни других факторов, не связанных с вашим преложением. Чтобы извлечь полезный сигнал для дообучения, нужно хорошо фильтровать такой неявный фидбек:
- User-based фильтрация: удалять фидбек странных/неопытных/неплатящих/etc пользователей
- Content-based фильтрация: удалять странный/нерелевантный/чрезмерный/etc фидбек
Впрочем и фильтрация может внести свои искажения :D
Поэтому надо быть аккуратным🦔
Немного дополню предыдущий пост про то, какой фидбек пользователей обычно бывает и какие могут возникнуть проблемы (в контексте дальнейшего его использования для улучшения моделей).
Явный фидбек: лайк на видео, например. Очень хороший сигнал. Но обычно оставляется небольшим числом пользователей и данных мало.
И если попытаться награждать пользователей за их лайки/дизлайки/реакции/etc, то это скорее всего ухудшит ситуацию: фидбека действительно станет больше, но его качество сильно упадет. Стимул получать бонусы сильнее желания оставлять осмысленный фидбек.
С явным фидбеком может быть ещё одна проблема: его может оставлять только специфическая группа пользователей. Таким образом, обучившись на этот фидбек, модель станет лучше для них, но для медианного пользователя всё ухудшится (прям диктатура меньшинства получатся).
Проблема нерепрезентативности и малого количества данных может решиться с неявным фидбеком. Это про поведение пользователя: досмотрел ли видео/дослушал ли песню/продолжил ли взаимодействие.
Но хоть такого фидбека и много, он сильно более шумный, чем явный. На пользователя и его поведение влияют сотни других факторов, не связанных с вашим преложением. Чтобы извлечь полезный сигнал для дообучения, нужно хорошо фильтровать такой неявный фидбек:
- User-based фильтрация: удалять фидбек странных/неопытных/неплатящих/etc пользователей
- Content-based фильтрация: удалять странный/нерелевантный/чрезмерный/etc фидбек
Впрочем и фильтрация может внести свои искажения :D
Поэтому надо быть аккуратным
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4🤔2