C# Short Posts 🔞 – Telegram
C# Short Posts 🔞
250 subscribers
111 photos
4 videos
151 links
Здесь я, Дима Афонченко @Undermove1, публикую короткие заметки о разработке (и около). Я не претендую на правильность высказываний и открыт к дискуссиям, исправлениям и конструктивной критике. С любыми деструктивными вещами можно приходить в комменты)
Download Telegram
🙅 Чего не может ChatGPT. Часть 0

Короче, тут пошла такая пьянка, что все пишут и говорят про то, что ChatGPT может. И порой люди дают этой штуке бОльший кредит доверия, чем она заслуживает.
 
Поэтому я тут напишу о том, чего эта штука не может, почему так происходит и напишу, какие есть пути решения этих проблем (если это конечно вообще проблемы).
 
🐺 Если вы хотите разобраться в том, как работает ChatGPT и не боитесь математики, то у Стивена Вольфарама вышла большая статья о том, как работает ChatGPT.

Для тех же кто боится математики, я в серии мини-постов расскажу обо всём на пальцах, но буду ссылаться на статью Стивена Вольфрама.
 
☎️ Итак, начнем с того, что эта штука не может выдать вам список телефонов всех страховых компаний Батуми.

Для этого просто зададим этот вопрос в ChatGPT дважды.

В первом запросе компания GPI Holding имеет один адрес и номер телефона, а во втором она уже переехала в новое здание и сменила номер. То же самое произошло с компанией Aldagi BCI. Если вы погенерируете ещё немного, то она будет каждый раз генерировать всё новые и новые значения. В целом похожие друг на друга, но часто с небольшими отличиями.

Наверняка у вас возникнет возражение "Сеть обучена на данных до 2021 года", и вы правы, но ключевое слово здесь "обучена", а не "знает".

(Ну или в Батуми страховые компании охуеть как любят переезжать с адреса на адрес, и не стоит лишний раз пользоваться их услугами. Это шутка, тут с этим всё норм. Во всяком случае, если вас захотят наебать, то справятся и без переезда)
 
И это не баг, а фича и она кроется в самом названии проекта: Generative Pretrained Model (или как мы привыкли GPT).
 
То есть сеть может хорошо ГЕНЕРИРОВАТЬ, как могли бы выглядеть названия и телефоны страховых компаний в Батуми, но она не идет в какую-то невероятную базу внутри своих 100 гигабайт и не ищет там данные. Как же она делает это я напишу в следующих постах.
#chatgpt
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3🌚1
1👀1
🙅‍♂️ Чего не может ChatGPT. Часть 1

Это изображение первого сервера, на котором запускался ChatGPT. И я не шучу! На Nokia 3310 был настоящий прародитель сегодняшнего хайпоносца, а именно движок текстовых подсказок Т9.
 
В чём суть T9?

Мы берем три буквы, к примеру "стр"

У нас есть словарь из слов, начинающихся на эти три буквы:
 
Страх
Страница
Страна
Строка
Стритбол

Телефон пытался предложить продолжение слова, которое набирает пользователь и продолжить его автоматически чтобы сократить время ввода.
 
Как телефону догадаться, какое слово пользователь хочет ввести? Есть несколько способов.

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

Один из таких – взять языковой корпус и вычислить частоту употребляемости каждого из слов и выбирать самое употребляемое. Я тут сам выставил частоту употребляемости чисто для иллюстрации, но, думаю, суть вы уловили:
 
Страх 60%
Страница 70%
Страна 50%
Строка 55%
Стритбол 10%

Получается, что слово страница самое употребимое, мы его и предлагаем. Но что если пользователь баскетболист? Не всё время же подставлять ему строку, если он постоянно зовёт друзей играть в стритбол? (хотя Т9 этим грешил, чем нагенерил кучу мемов в моей жизни)
 
Мы можем запоминать выбор пользователя и вносить поправки в нашу таблицу. Скажем, накидывать по 20% после каждого введенного стритбола от пользователя. И со временем у стритбол у нас поднимется с колен до вершин списка.
 
Так вот. Что мы тут имеем? Мы имеем небольшую модель, в которой есть 6 слов и 1 нейрон, который мы постепенно тренируем выдавать нам слово Стритбол.

🅰️ Вот эти процентики напротив каждого слова, это по сути коэффициенты. Коэффициенты это и есть то из чего состоит модель в своей сути. То есть, когда мы говорим, что ChatGPT весит 100 Гб и содержит 175 миллиардов записей, это значит, что это текстовый файл в котором записано 175 миллиардов вот таких вот процентиков:
 
Страх 60%
Страница 70%
Страна 50%
Строка 55%
Стритбол 10%
 
Естественно не всё так просто. В следующей части я попытаюсь на пальцах объяснить, как это улучшить так, чтобы можно было генерить целые тексты, пусть и бессвязные, но похожие на правду.
#chatgpt
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1😍1
🔥 Как я отслеживаю выгорание (ну точнее усталость, но про выгорание кликбейтнее)

У меня есть небольшой триггер, который помогает мне понять, что я глобально устаю, а как следствие начинаю выгорать.
 
В середине дня я делаю перерыв на час, чтобы сходить на турник и подтянуться. В этот момент я стараюсь поменьше смотреть в телефон, и побольше ходить и просто думать о всяком.
 
Этот перерыв дает очень хороший эффект – позволяет скипнуть все тревоги, которые успели скопиться за день и начали отвлекать от задачи. Ну и бодрит лучше чем кофе, из-за того что солнечный свет (пусть даже и за облаками) предназначен для того чтобы бодрить.
 
После этого перерыва работа делается объективно быстрее (коммиты появляются чаще). Заподлянка в том, что субъективно кажется, что ничего особо не меняется. "Ну пришла какая-то мысль в голову сразу, как сел за клавиатуру, а не через три часа, ну и что тут такого? Просто сегодня я в форме." – кажется мне.
 
Несмотря на то что я понимаю пользу, такой перерыв бывает очень и очень сложно сделать, ибо прям перед ним появляется ощущение "вот сейчас еще одину строчку поправлю и пойду". А там, глядишь и весь час на перерыв бездарно проЙОбан в попытке выдавить из себя коммит по капле.
 
🅰️ И вот мой триггер: если я начинаю пропускать свои перерывы, значит я глобально так заебался. Потому что уже не вижу очевидного – если сейчас сделаю перерыв, то выдавлю из себя коммит быстрее, чем если перерыв не сделаю.
 
Это как в эксперименте с детьми и конфетами. Одну сейчас, или две через час? Чем сильнее ты устаешь глобально, тем сложнее врубить рациональность, и проще поддаться на искушение сделать еще одну мааааааленькую правочку, чтоб тест позеленить.
 
В общем, поделился с вами триггером, вдруг и вам поможет. Успех, конечно не гарантирован, но мало ли!
#опыт
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥82
👎 Чего не может ChatGPT. Часть 1.5

ChatGPT развивается так быстро, что пока я писал эту статью про то, чего он не может, чуваки из OpenAI как раз выкатили штуку, которая как раз закроет эту немогучесть. И эта штука, это зарелизившиеся намедни плагины.

👿 Блэт, они на самом деле пилят фичи так быстро, что я не удивлюсь, если узнаю, что в OpenAI уже давно всё за всех пишет ChatGPT, а кожанные мешки только бумажки подписывают!

Хотел завершить цикл статьёй про то, что можно сделать, чтобы номера телефонов страховых компаний всё же были актуальны. То есть как делать факт-чекинг в справочниках, и подклеивать в сгенерированный ответ актуальные данные.
 
Думал рассказать, как это можно сделать кустарно, но вот теперь это стало прям встроенной фичей.
 
Короче. Я всё равно доведу цикл до конца, и просто дорасскажу, как работают такие штуки в своём базовом принципе, который вряд ли поменяется от модели к модели.
#chatgpt
Please open Telegram to view this post
VIEW IN TELEGRAM
👏1🤩1
🙏 Ща будет микро-спам. Простите.

Просто хочу, чтобы это было лентой,а не какой-то ссылкой на пост. Но если вдруг кому удобнее в формате поста, то я вот тут в телеграфе затащил.

Но там нет таких охуенных анимированных смайликов, а без них как бы никак! 🙅‍♂️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🤔 Почему ChatGPT может то, что может. Часть 2. Что такое нейрон?

Сегодня попытаюсь объяснить, что такое нейрон.

По своей сути это маленькая настолка с набором правил. На входе мы даем набор цифр. Обрабатываем их по правилам этой настолки, а на выходе мы получаем то, чему эти цифры соответствуют.

Давайте рассмотрим, как же работает простейший нейрон.

Допустим, мы хотим натренировать нейрон отличать жуков и гусениц. Как это сделать? Оцифруем тварей – будем отличать по длине и ширине! Гусеницы обычно длинные и узкие, а жуки обычно примерно толстые и не очень длинные (блин, прям как я, а я тот ещё жучила! 🪲).

Допустим у нас есть такой датасет:

Длина Ширина

Жук: 1 3

Гусеница: 3 1

Вынесем наш датасет на график:
Please open Telegram to view this post
VIEW IN TELEGRAM
Гусенично-жуковый датасет.
Чтобы отделить жука от гусеницы, мы можем провести линию между ними. Всё что будет выше этой линии, будет гусеницей, а всё что ниже – жуком.

Перекладывая язык математики. Вместо слова длина я тут напишу Y а вместо слова ширина я напишу X:

Мы проводим линию:

y = k*x + b

Если мы хотим провести линию ровно посередине, то k = 1, b = 0:

y = x
Жукогусеничный нейронный разделитель
Ну и соответственно правила нашей настолки:

1) Если точка лежит ниже линии (ширина больше длины):  x > y, то это жук

2) Если точка лежит выше линии: (ширина меньше длины): x < y, то это гусеница
 
🅰️ Итого у нас получился простой нейрон. Мы можем прогнать через него почти любые сочетания длины и ширины и получить ответ жук это или гусеница!
 
К примеру:  длина (Y) 100 ширина (Х): 5

Засовываем в нашу настолку:
5 > 100? Нет – значит это не жук.
5 < 100? Да – значит это гусеница.

Настолка выдает ответ:
Ответ – это гусеница! 🐛

Отлично у нас получился жукогусеничный нейрон! Но вот обучили мы его немного читерно 👎.

Точнее мы его вообще не обучали. Мы просто на глаз провели линию. А как эту же линию вычислить математически? Вот чуть дальше разберу и этот момент.

ЗЫ: Когда-то мне помогла книга Тарика Рашида "Создаём нейронную сеть". В ней максимально плавно рассказывается о том, как всё работает на базовом уровне. Книга из 264 страниц с картинками, как я люблю. Читается быстро, но лучше чтобы под рукой был комп, чтобы все примеры из книги можно было самому накодить. Этот пример взят из неё.
#chatgpt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2❤‍🔥1
🌿 ToList() vs ToArray() что быстрее/экономичнее по памяти?

Короче, я всю жизнь бездумно вызывал ToList(). ХЗ почему. Наверное потому что когда-то один раз так сделал и дальше пошло по накатанной.

Но тут великолепный Арсений Кравченко :nice обратил луч внимания на то, что кажется надо бы об этом подумать. И я подумал, что действительно, а есть ли разница?

Воспользовался темплейтом для бенчамарков:

using System.Collections.Generic;
using System.Linq;
using BenchmarkDotNet.Attributes;
 
namespace ToListToArrayBenchmark;
 
[MemoryDiagnoser]
public class Benchmarks
{
    [Benchmark]
    public void Scenario1()
    {
        var array = GenerateInts().ToArray();
    }
 
    [Benchmark]
    public void Scenario2()
    {
        var list = GenerateInts().ToList();
    }
 
    private static IEnumerable<int> GenerateInts()
    {
        for (var i = 0; i < 100; i++)
        {
            yield return i;
        }
    }
}

 
Получил результат:

По скорости:
Mean Scenario1: 801.7 ns
Mean Scenario2: 750.1 ns

По памяти:
Allocated Scenario1: 1.16 KB
Allocated Scenario2: 1.19 KB
 
🅰️ Если коротко делать вывод, то монопенисуально (однохуйственно), во что в итоге материализовать. Почему-то в лист чуть побытстрее, но немного больше по памяти занимает. Но прям типа ваще дэшку совсем. 👌

Так что буду продолжать всё в лист захерачивать и не париться. Но сегодня мы все стали чуточку умнее.

UPD: Великолепный Арсений в комментариях отметил, что всё не так эквипенисуально! Есть особенности связанные с тем, как растёт лист. Короче, я переобуваюсь и начинаю юзать ToArray и ToList более осмысленно!
#бенчмарки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
🤔 Почему ChatGPT может то что может. Часть 3.1. Как нейрон учится?
В предыдущих сериях мы взяли нейрон y = kx
 
И обучили его вручную. Это читерство, мы такое не одобряем. Так что давайте сделаем это по чести.
 
Обучение нейрона тоже похоже на настольную игру. Первый ход в этой игре выглядит примерно так:
 
1️⃣ Сначала выбираем случайное значение k и проводим линию
2️⃣ Проверяем, правильно ли линия разделяет жуков и гусениц. И если нас не устривает, то говорим нейрону посчитать ошибку.
3️⃣ Пересчитываем коэффициент k и снова спрашивает нас нормально ли?
 
Пройдем по шагам:
1. Предположим мы случайно выбрали значение k = 0,25
Please open Telegram to view this post
VIEW IN TELEGRAM
2. Проверяем. Мы видим, что эта линия нам не подходит, так как и жуки и гусеницы лежат поверх линии – нейрон всех считает гусеницами. Считаем ошибку:
 
Ошибка = желаемое - текущее.
 
Желаемое = 1,1
Текущее = 0,25*3  = 0,75
 
Ошибка = 0,35
Пунктирную линию мы провели сами – таким образом мы показываем нейрону, какое значение мы от него бы хотели.

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

3. Пересчитываем коэффициент k:
 
Считаем насколько надо изменить k:
∆k = Ошибка / x = 0,35 / 3 = 0,1167
 
k = k_предыдущее + ∆k = 0,25 + 0,1167 = 0,3667
 
Итак, новый нейрон будет выглядеть вот так:
Если 0,3667x > y, то это жук
Если 0,3667x < y, то это гусеница
 
Теперь линия лежит там где нужно и отличает жуков от гусениц.

P.S.: Я тут пропустил вывод формул, поэтому может возникнуть недопонимание. Для более подробного ознакомления с математикой этого процесса, вы можете почитать про такую штуку как Градиентный спуск. Лучше всего её изучать с компом, и с книгой Тарика Рашида, о которой я упоминал выше.
🔥41🤔1
🤔 Почему ChatGPT может то что может. Часть 3.2. Что имеют в виду, когда говорят, что в последняя модель GPT занимает 120Гб?

А что если нам нужно больше различий? Например отличать не только жуков и гусениц, но и бабочек?

Мы просто добавим новую линию, и будем обучать уже два нейрона! То есть у нас появится два коэффициента k:
Please open Telegram to view this post
VIEW IN TELEGRAM
А что если нам нужно больше различий? Например отличать не только жуков, но и бабочек? Мы просто добавим новую линию, и будем обучать уже два нейрона!