C# Short Posts 🔞 – Telegram
C# Short Posts 🔞
250 subscribers
111 photos
4 videos
151 links
Здесь я, Дима Афонченко @Undermove1, публикую короткие заметки о разработке (и около). Я не претендую на правильность высказываний и открыт к дискуссиям, исправлениям и конструктивной критике. С любыми деструктивными вещами можно приходить в комменты)
Download Telegram
🙅‍♂️ Чего не может 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
А что если нам нужно больше различий? Например отличать не только жуков, но и бабочек? Мы просто добавим новую линию, и будем обучать уже два нейрона!
Когда ваших нейронов становится слишком много, то каждую отдельную линию учить сложно. Поэтому нам проще учить такие сложные линии целыми таблицами.

Если считать всё вручную, то это кажется сложным, но на самом деле суть та же, как и в обучении одной линии. Только обучаем пачками
 
Это делается при помощи матричных уравнений, которые в простом виде записываются так:

Kx + C = y
 
И с ними работают все те же действия, что и с обычными уравнениями. Чуть сложнее, но разница не сильно принципиальна.

Эти таблицы бываю маленькими, большими, очень большими и… Просто гигантскими! Как раз у ChatGPT эта таблица настолько большая, что занимает, аж 120 Гб!
 
🙅 Это супер-важно для понимания. Многие думают, что обученная ChatGPT хранит в себе какие-то тексты типа вот так:

жук        бабочка    кирпичик                 if
Фонарь аптека      сейчас 2021 год      канал

🅰️ Но хранит он числа, вот примерно такие:

0.2324234   0.3452345  0.2873456 …
0.2324234   0.3452345  0.2873456 …
…                   …                  …
Этих чисел там миллиарды, и именно они приводят к тому, что ChatGPT может генерировать те кучи осмысленного текста, которые мы видим!

P.S.: Слова ChatGPT в себе всё же хранит, но об этом чуть позже.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1🤔1
🤔 Почему ChatGPT может то что может. Часть 4. Embeddings и Word2Vec
 
Итак, мы поняли, что ChatGPT оперирует только цифрами. Тогда как он справляется с тем, что мы даем ему буквы? Он превращает их в цифры!
 
Как же оцифровать слова? На самом деле мы с вами это делали в школе, но не придавали особого значения такой скучной штуке, как морфологический разбор. Это была настоящая цифровизация на минималках
 
К примеру, оцифруем слова "король" и "королева":
                     Существительное:   Одушевленное:  Род мужской:
Король:      1                                   1                              1
Королева:  1                                   1                              0
 
Король у нас теперь представлен тремя числами: 1, 1, 1
Как и королева: 1, 1, 0
 
Если мы разместим их на трехмерном графике существительных, то увидим, что они довольно близки:
Please open Telegram to view this post
VIEW IN TELEGRAM