Pull to refresh
13
0.1
Владислав Дудников @Vladislav_Dudnikov

Программист

Send message

Как языковая модель предсказывает следующий токен (часть 1)

Reading time 27 min
Views 6.3K

Я обучил небольшой (порядка 10 миллионов параметров) трансформер по превосходному туториалу Let’s build GPT: from scratch, in code, spelled out Андрея Карпати. После того, как он заработал, я захотел максимально глубоко понять, как он устроен внутри и как создаёт свои результаты.

В исходной научной статье, как и во всех туториалах по трансформерам упор в основном делается на многоголовом самовнимании, — механизме, при помощи которого трансформеры обучаются множественным взаимосвязям между токенами, не используя рекурретности или свёртку. Ни в одной из этих статей или туториалов я не нашёл удовлетворительного объяснения того, что происходит после внимания: как конкретно результаты вычисления внимания превращаются в точные прогнозы следующего токена?

Я подумал, что могу пропустить несколько примеров промтов через обученный мной небольшой, но работающий трансформер, изучить внутренние состояния и разобраться в них. То, что казалось мне быстрым исследованием, оказалось полугодовым погружением, но дало результаты, которыми стоит поделиться. В частности, у меня появилась рабочая теория, объясняющая, как трансформер создаёт свои прогнозы, и эмпирические свидетельства того, что это объяснение, по крайней мере, правдоподобно.

Если вы знакомы с трансформерами и хотите сразу узнать вывод, то он таков: каждый блок трансформера (содержащий слой многоголового внимания и сеть с прямой связью) изучает веса, связывающие конкретный промт с классом строк, найденных в обучающем корпусе. Распределение токенов, соответствующее этим строкам в обучающем корпусе, и есть приблизительно то, что блок выводит как прогноз для следующего токена. Каждый блок может ассоциировать один и тот же промт со своим классом строк обучающего корпуса, что приводит к другому распределению следующих токенов, а значит, и к другим прогнозам. Окончательный результат работы трансформера — это линейное сочетание прогнозов каждого блока.

Читать далее
Total votes 27: ↑27 and ↓0 +27
Comments 5

STM32. Подготавливаем среду разработки в Linux

Level of difficulty Easy
Reading time 21 min
Views 16K
В недавнем времени получилось так, что у меня появилась пара интересных проектов, где одна из составных частей — микроконтроллер STM32. И каждый раз при смене ноутбука или ОС на домашнем компе приходится настраивать окружение для разработки как в первый раз. Плюсом, последние проекты, которые я делал для STM32 — выполнял в Windows, в демо-версии Keil uVision. Но поскольку я давно переехал в Linux — возникла необходимость основательно разобраться и изложить процесс настройки окружения для будущих применений.

Всем, кому интересно — добро пожаловать под кат.

Читать дальше →
Total votes 63: ↑62 and ↓1 +61
Comments 31

Книги, которые помогут прокачать писательские скилы

Reading time 4 min
Views 4.7K

Пять разноплановых книг, которые помогут прокачать писательские скилы и создавать интересные и полезные статьи для Хабра. В одних упор делается на смысловое содержание, в других на подачу и логику взаимодействия с умной аудиторией, ну и на работу с самим текстом.

Начать лучше с основополагающих вещей – книги «Я, редактор», где изложена суть современного подхода к подготовке интересных публикаций, а также объясняется смысл редакторской работы. Многие думают, что она связана лишь с правкой текстов, но это не так.

Читать далее
Total votes 30: ↑26 and ↓4 +22
Comments 21

Создаём собственную систему поиска фильмов на основе проекта Андрея Карпати

Level of difficulty Medium
Reading time 8 min
Views 8.3K
image

В апреле 2023 года Андрей Карпати, один из основателей OpenAI и бывший директор по ИИ в Tesla, поделился своим занятным проектом выходного дня – системой поиска и рекомендации кино.

Её пользовательский интерфейс откровенно прост и предлагает две основных функции: блок поиска, в котором можно искать кино по названию, и вывод списка из 40 похожих фильмов при клике по интересующему.

Несмотря на популярность этого проекта, Карпати, к сожалению, пока не поделился с публикой его исходным кодом.

И вот почему
Источник

Chaturvedi: «Может, откроете исходный код проекта?»

Andrej Karpathy: «Даже не знаю. Он такой страшный, что мне стыдно».


Так что запасайтесь попкорном и будем воссоздавать его сами на основе OpenAI и векторной базы данных!
Читать дальше →
Total votes 55: ↑55 and ↓0 +55
Comments 5

Профилирование асинхронного Python

Level of difficulty Easy
Reading time 3 min
Views 6.6K

Профилирование приложений — это процесс анализа программы для определения её характеристик: времени выполнения различных частей кода и использования ресурсов.

Для асинхронного python-кода существует конечное количество специфических "узких мест", которые лучше перечислить заранее.

Читать далее
Total votes 13: ↑13 and ↓0 +13
Comments 3

Пароль не нужен. Разбиение файла на зашифрованные фрагменты по схеме Шамира

Reading time 4 min
Views 13K


После того как Google отказалась от паролей и перешла на Passkey по умолчанию создаётся впечатление, что концепция текстовых паролей (парольных фраз) сама по себе устарела. И действительно, в некоторых случаях можно добиться достаточного уровня безопасности без паролей вообще.

Например, простенькая утилита horcrux (крестраж*) разбивает файл на несколько зашифрованных частей (например, пять), причём для дешифровки и восстановления исходного текста не нужен пароль, а нужно найти и соединить несколько из этих частей (например, три). Предполагается, что сами отдельные части хранятся у разных людей в разных местах и/или надёжно спрятаны, например, в разных местах дома, сейфах, банковских ячейках и т. д.

*Крестраж — волшебный артефакт, созданный с помощью тёмной магии, из вселенной Гарри Поттера.
Читать дальше →
Total votes 34: ↑33 and ↓1 +32
Comments 14

OpenConnect: недетектируемый VPN, который вам понравится

Level of difficulty Medium
Reading time 15 min
Views 212K

Я уже написал здесь много статей на тему прокси-протоколов и прокси-клиентов, которые очень сложно детектировать и заблокировать, и которые используют пользователи в Китае, Иране, Ираке, Туркменистане, и теперь вот в России (мы здесь в отличной компании, правда?). Но довольно часто мне в комментариях писали, мол, это все отлично, но мне нужен именно VPN для целей именно VPN - доступа в частные локальные сети, либо для соединения клиентов между собой, и желательно так, чтобы его не заблокировали обезьяны с гранатой. Поэтому сегодня мы поговорим именно о VPN.

Классические OpenVPN, Wireguard и IPSec отметаем сразу - их уже давно умеют блокировать и блокировали не раз. Модифицированный Wireguard от проекта Amnezia под названием AmneziaWG — отличная задумка, но есть одно но...

Читать далее
Total votes 325: ↑324 and ↓1 +323
Comments 340

Манифест Чистого Программиста или краткий конспект книги «Чистый Код» Роберта Мартина

Reading time 8 min
Views 95K

Данная статья является конспектом книги "Чистый Код" Роберта Мартина и моим пониманием того, каким Чистый Код должен быть. Тут нет разделов о тестировании, TDD, о том какая должна быть архитектура и т.д. Здесь все только о том, каким должен быть Чистый Код.


Читать дальше →
Total votes 48: ↑44 and ↓4 +40
Comments 49

Принципы непрерывного рефакторинга

Level of difficulty Hard
Reading time 23 min
Views 11K

Работа со старым кодом для многих команд является частью повседневных обязанностей. За свою карьеру я видел и применял разные способы борьбы с тяжестью легаси. Они обычно сводились к одному из трёх основных сценариев:

«Работает — не трогай!»: вообще забить на чистки и ничего не менять. В некоторых случаях валидный подход. Но в коде, который приходится менять хотя бы даже эпизодически (фиксы багов, мелкие доделки, смена окружения и т. п.), со временем неизбежно приводит к катастрофе. Вам надо что‑то поменять в коде, и это оказывается невозможно сделать легко. Даже за тривиальные изменения приходится платить большой кровью.

«Я прочитал Роберта Мартина»: включаем чистки в обычный код. Надеваем галстук бойскаута и чистим код прямо по ходу работы над текущими задачами. Отправляем его коллегам на ревью и ждём несколько дней, покуда они не разберутся, где заканчиваются рефакторинги и начинаются непосредственно изменения по задаче. Или же уходим по кривой дорожке рефакторингов в тёмный лес и продалбываем к чертям все изначальные сроки. Когда начинаешь приводить код к идеалу, не всегда бывает так легко остановиться!

«Нужен порядок и учёт»: делаем отдельные коммиты с чистками, но нерегулярно — только когда в дело берётся соответствующий тикет. Правда, тикеты на рефакторинг почему‑то регулярно получают самый низкий приоритет во время планирования и маринуются в беклоге месяцами. Но что уж тут поделать?

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

За прошедший год я нащупал и отточил ещё один подход, который лишён указанных недостатков. И теперь готов поделиться им с вами.

Читать далее
Total votes 22: ↑22 and ↓0 +22
Comments 20

Настройка Selenoid для запуска UI-тестов на Android

Level of difficulty Medium
Reading time 8 min
Views 4.2K

Если вы читаете эту статью, то наверняка слышали о Selenoid. Это мощное решение написанное на Go от компании aerokube для управления Docker-контейнерами, в которых «завёрнуты» все необходимые программы и драйверы для тестирования в браузерах или на Android-эмуляторах.Как утверждают производители Selenoid, их решение потребляет намного меньше ресурсов, чем, например тот же Selenium. В то время, как первый имеет удобный веб интерфейс (в документации к Selenium нет никаких упоминаний про UI) и также возможность параллельного запуска тестов. У Selenoid также есть отличная поддержка, большое коммьюнити и достаточно хорошая документация .

Отмечу, что Selenoid работает только на Linux. За исключением, когда вам нужно запустить Selenoid без Docker. Но это уже совсем другая история.

В статье на своем опыте я расскажу и покажу с какими сложностями сталкивался и как их решал. Хотелось бы подчеркнуть, что возможно у вас возникнут подобные проблемы при установке и настройке данного инструмента.

Читать далее
Total votes 19: ↑19 and ↓0 +19
Comments 2

Когнитивные искажения в программировании

Reading time 5 min
Views 17K

Всем привет!

Сегодня мы поговорим о такой интересной и забавной вещи, как когнитивные искажения. Что это? Зачем это? Как с этим бороться или, быть может, их даже можно использовать? Для начала давайте разберемся, о чем же мы говорим.

Читать далее
Total votes 35: ↑31 and ↓4 +27
Comments 6

Молодые математики открывают новую главу в изучении простых чисел

Level of difficulty Easy
Reading time 11 min
Views 40K
Анимация отсева по Эратосфену, где показаны кратные величины каждого простого числа, простирающиеся вдоль числовой оси.

Более 2000 лет назад греческий математик Эратосфен разработал метод поиска простых чисел, получивший название решето Эратосфена, который остаётся актуальным по сей день. Его идея заключалась в том, чтобы определять простые числа вплоть до заданной точки путём постепенного «отсеивания» тех, которые таковыми не являются. Начинается отсев с вычёркивания всех чисел, кратных 2 (кроме самой 2), затем кратных 3 (кроме 3). Следующее число, 4, уже оказывается вычеркнуто, значит, очередным шагом идёт вычёркивание всех чисел, кратных 5 и так далее. Все оставшиеся в итоге числа считаются простыми, то есть такими, которые делятся только на 1 и на самих себя.

Эратосфен работал со всем множеством простых чисел, но вы можете использовать вариации его метода для поиска таких, которые будут обладать особыми свойствами. Хотите найти «близнецов», которые отличаются всего на 2 единицы, например, 11 и 13 или 599 и 601? Для этого есть свой отсев. Интересуют простые числа, которые на 1 больше полного квадрата, например, 17 или 257? И для этого тоже есть свой отсев.
Читать дальше →
Total votes 70: ↑66 and ↓4 +62
Comments 39

Playground. Как сэкономить время на настройке локальной среды

Reading time 21 min
Views 3.5K

Привет, Хабр! Меня зовут Никита, и я Go-разработчик. В свободное от работы время я интересуюсь платформенной разработкой, а в рабочее — практикую в команде PaaS в СберМаркете. Моя специализация — локальное окружение разработчика и тулинг.

Главная метрика, на которую работает моя команда, — Тime-Тo-Мarket, совокупное время, затраченное на разработку фичи от самого начала разработки и до релиза на пользователей.

В сложившихся процессах разработки всегда найдется место для оптимизации затрат ресурсов разработчика. Будь то написание boilerplate кода, подготовка инфраструктуры, ручной рефакторинг или перезапуск кода при внесении изменений. Список далеко не исчерпывающий.

Уже сейчас PaaS может предложить многое для сокращения времени разработки фичи. Сегодня хочу рассказать о том, как именно наша команда помогает выпускать релизы быстрее с помощью инструмента Playground. С помощью него можно легко и быстро запустить ряд сервисов прямо на вашем Mac или Linux.

Читать далее
Total votes 16: ↑15 and ↓1 +14
Comments 4

Почему программные задачи всегда занимают больше времени, чем вы думаете

Reading time 6 min
Views 21K
Каждый в IT-индустрии знает, насколько сложно оценить срок выполнения проекта. Трудно объективно оценить, сколько времени займёт решение трудной задачи. Одна из моих любимых теорий заключается в том, что здесь имеет место просто статистический артефакт.

Предположим, вы оцениваете проект в 1 неделю. Предположим, есть три одинаково вероятных результата: либо он займёт 1/2 недели, либо 1 неделю, либо 2 недели. Медианный результат фактически такой же, как и оценка: 1 неделя, но среднее значение (aka average, aka expected value) составляет 7/6 = 1,17 недель. Оценка фактически откалибрована (беспристрастна) для медианы (которая равна 1), но не для среднего.
Читать дальше →
Total votes 50: ↑49 and ↓1 +48
Comments 24

Подборка: 5 полезных сервисов для написания статей на английском

Reading time 5 min
Views 24K


Всем привет! Меня зовут Марго, я профессиональный маркетолог и редактор, в последние пару лет фокусируюсь на продвижении за рубежом и много пишу на английском. Я решила поделиться ссылками на приложения и сайты, которые помогают мне в ежедневной работе при создании контента. Надеюсь, список поможет изучающим английский и тем, кто публикует англоязычные материалы на Хабре.
Читать дальше →
Total votes 51: ↑48 and ↓3 +45
Comments 29

35% доходность акций на альтернативных данных

Reading time 4 min
Views 19K


Торговля на альтернативных (нестандартных) данных становится модным и перспективным. На днях попал в руки любопытный датасет от Московской Биржи по популярным акциям. После поверхностного исследования удалось получить привлекательный результат c хорошими доходностями. Подробности под катом
Читать дальше →
Total votes 42: ↑32 and ↓10 +22
Comments 37

CRISP-DM: проверенная методология для Data Scientist-ов

Reading time 16 min
Views 69K
Постановка задач машинного обучения математически очень проста. Любая задача  классификации, регрессии или кластеризации – это по сути обычная оптимизационная задача с ограничениями. Несмотря на это, существующее многообразие алгоритмов и методов их решения делает профессию аналитика данных одной из наиболее творческих IT-профессий. Чтобы решение задачи не превратилось в бесконечный поиск «золотого» решения, а было прогнозируемым процессом, необходимо придерживаться довольно четкой последовательности действий. Эту последовательность действий описывают такие методологии, как CRISP-DM.

Методология анализа данных CRISP-DM упоминается во многих постах на Хабре, но я не смог найти ее подробных русскоязычных описаний и решил своей статьей восполнить этот пробел. В основе моего материала – оригинальное описание и адаптированное описание от IBM. Обзорную лекцию о преимуществах использования CRISP-DM можно посмотреть, например, здесь.


* Crisp (англ.) — хрустящий картофель, чипсы
Читать дальше →
Total votes 53: ↑52 and ↓1 +51
Comments 16

51 бесплатная книга о Data Science

Reading time 3 min
Views 54K
Смирись, человек 21 века, что твой главный инструмент — это информация, данные, цифры и управление с их помощью. Сегодня мы делимся с вами очень полезным списком литературы о Data Science!

Читать дальше →
Total votes 10: ↑9 and ↓1 +8
Comments 0

STM32 — правильно используем встроенный flash

Reading time 2 min
Views 94K
Предисловие

Давно ни для кого не секрет, что STMicroelectronics производит замечательные 32-битные ARM микроконтроллеры STM32. В последнее время они набирают всё большую популярность, и на то есть веские причины, которые в рамках этой статьи я повторять не намерен. Кому интересно — раз, два и три.

Однако у резкого повышения популярности есть и неприятные минусы — довольно часто авторы статей повторяют одни и те-же ошибки. А если ещё и в официальном документе производителя нужный момент описан поверхностно — то тут черт ногу сломит, пока найдёт решение проблемы.

Именно о таком моменте я и хочу рассказать. А именно — как правильно использовать возможность записи во встроенный flash нашего МК. Добро пожаловать под кат.
Читать дальше →
Total votes 35: ↑35 and ↓0 +35
Comments 36

Используем Cmake для автоматической генерации makefile в проектах

Reading time 8 min
Views 69K
  Вступление большое, так как подробно объясняет зачем нужен cmake. Можете сразу под кат, если уже знаете.

Вступление


  Компилирование проекта руками — пустая трата времени. Это фактически аксиома и об этом знают те, кто программирует. Но чтобы всё скомпилировалось автоматически необходимо задать правила, так ведь? Часто и по-старинке используют makefile для *nix или какой-нибудь nmake для windows.
  Я хоть и не первый год программирую, и руками составлял простые автосборщики проектов на основе makefile, но стоит немного подзабыть и приходится заново изучать как же составить эту хитрую схему. В основном приходится делать проекты расчитанные на какую-то одну систему, будь то linux или windows, и часто между собой не кросскомпилируемые. Для переносимости makefile используется automake и autogen, но их синтаксис ещё более запутан. Не скажу, что выбор идеальный, но для себя я решил перейти на cmake, благо он портирован под всё доступное. Мне он показался более человекопонятным. Попробую объяснить основы. Вы пишите словами правила, а из них генерируется makefile, который вы уже запускаете стандартным способом.

Ликбез

  Зачем он нужен? Чтобы при переносе на другую машину, с другими путями вы двумя командами собрали проект ничего не исправляя в файле makefile. Но есть же configure? Это альтернатива. И configure не кросплатформенный, для его генерации нужен autoconf/autogen, для которых идёт ещё свой набор правил. Только преимущества? Компиляция автосгенерированным makefile получается немного медленнее старого способа. Например, в KDE-4 является официальным инструментом выпуска.
Приступим
Total votes 44: ↑39 and ↓5 +34
Comments 45

Information

Rating
3,279-th
Location
Луганск, Луганская обл., Украина
Date of birth
Registered
Activity