C# Short Posts 🔞 – Telegram
C# Short Posts 🔞
250 subscribers
111 photos
4 videos
151 links
Здесь я, Дима Афонченко @Undermove1, публикую короткие заметки о разработке (и около). Я не претендую на правильность высказываний и открыт к дискуссиям, исправлениям и конструктивной критике. С любыми деструктивными вещами можно приходить в комменты)
Download Telegram
🌿 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
Мы оцифровали слова по трем параметрам для удобства. Но параметров может быть сильно больше. У модели GPT 2 для каждого набора слов может быть более 1600 разных параметров.
 
То есть, перед тем, как прочитать ваше предложение и сделать выводы, ChatGPT сначала превращает каждое слово в набор цифр. Если вам интересно, как это работает математически, то сильно рекомендую почитать статью про алгоритм word2vec (или вот тут, чуть более лаконично, но на английском)
 
🅰️ Набор цифр, который описывает слово называется Embedding. От английского слова embedded - включать в себя. То есть по сути эмбеддинг это однострочная таблица цифр, которая показывает какие свойства ВКЛЮЧАЕТ в себя слово.
🔥311
🤔 Почему ChatGPT может то что может. Часть 5. Работа в общих чертах. Внутренний словарь.
Прежде чем двигаться дальше, суммируем полученные знания.
1️⃣ Мы поняли, что задача ChatGPT – это предсказать следующее слово.
2️⃣ Мы поняли, что нейронная сеть – это большая-большая таблица чисел.
3️⃣ Мы можем превращать слова в таблицы чисел.
4️⃣ Мы можем перемножать таблицы чисел между собой.
5️⃣ После перемножения двух таблиц чисел получается ещё одна таблица чисел.
 
Этих знаний нам уже хватит, чтобы переварить обобщенную схему того, как работает ChatGPT: 
1️⃣ Переводит каждое слово из предложения в таблицу чисел
2️⃣ Перемножает эти числа на свои внутренние таблицы
3️⃣ На выходе получает результирующую таблицу чисел.
4️⃣ Находит в словаре слово у которого таблица больше всего похожа на результирующую таблицу числел.
 
Вот как это выглядит на очень упрощенной схеме (квадратики это ячейки таблицы):
Please open Telegram to view this post
VIEW IN TELEGRAM
В текстовом варианте:
 
1️⃣ Превращаем каждое слово в набор цифр – покрашены желтым цветом. 🟨
2️⃣ Перемножаем эти цифры на огромные таблицы. Числа в этих таблицах долго подбирались в процессе обучения модели. Зеленые квадратики. 🟩
3️⃣ Результатом этого перемножения служит другой набор цифр, который мы должны превратить в слово. Розовые квадратики 🟪
4️⃣ У ChatGPT есть внутрениий словарь, в котором лежат слова, а напротив этих слов лежат наборы цифр. По набору цифр ChatGPT находит нужное слово в своем словаре. В нашем случае это будет слово "компания"
 
Давайте чуть подробнее остановимся на последнем этапе. В слове явно есть ошибка в склонении. Итоговая фраза будет звучать правильно, но кривовато: "Список страховых компания" Это нужно поправить, и тут мы подбираемся в такому понятию, как токены.

P.S: Опять же я тут много много подробностей опустил. К примеру про такую интересную штуку, как внутреннее внимание. Вы можете почитать про него подробнее вот в этой статье. Вообще у автора целая серия статей, где рассказывается всё немного подробнее, но без душной математики.

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

P.P.S: Правда прочитайте статью, она охуенная!
🔥31👌1
🤔 Почему ChatGPT может то что может. Часть 6. Работа в общих чертах. Токены. Автогрегрессия.
Итак, мы дали чату фразу "Список страховых" А он сгенерировал нам фразу "Список страховых компания". Окончание у последнего слова хромает.

На самом деле большой проблемы в этом нет. Дело в том, что слово "компания" мы выбирали из словаря, где хранятся целые слова. Если хранить слова не целиком, а по кусочкам, то всё быстро выправляется.
Please open Telegram to view this post
VIEW IN TELEGRAM
🅰️ Такие кусочки слов называются токенами. Так что теперь вы знаете, что такое токены – это просто кусочки слов в словаре ChatGPT.
 
Поэтому после прохождения четырёх итераций мы получим вот такой результат:
"Список страховых компаний”
 
Чтобы эту фразу закончить ChatGPT просто засунет фразу "Список страховых комп" в самого себя и попробует дополнить её еще раз: