Machine learning Interview
24.4K subscribers
1.04K photos
69 videos
12 files
700 links
Разбираем вопросы с собеседований по Machine Learning, Data Science, Deep Learning и Нейронным сетям, Python.

Вопросы - @notxxx1


@itchannels_telegram -🔥лучшие it каналы

РКН: clck.ru/3FmwRz
Download Telegram
Вопросы для собеседования по Docker, к которым следует подготовиться в 2023 году

Docker - это программный продукт, который программисты могут использовать для упаковки своего кода.

1. Что такое Docker?

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

Пример: Docker - это платформа контейнеризации, которую программисты могут использовать для развертывания приложений в облачных вычислениях. Системные администраторы могут использовать платформу для масштабирования больших объемов данных в контейнерах и повышения эффективности работы приложений.

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

2. Чем контейнерные технологии отличаются от виртуализации гипервизоров?

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

Пример: Гипервизор - это программное обеспечение, которое позволяет пользователям создавать и запускать виртуальные машины. Docker - это платформа, которую можно использовать для упаковки программного обеспечения и запуска его в любой среде. Запуск приложения в Docker занимает меньше шагов, чем запуск в виртуальной среде.

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

3. Как Docker повлиял на виртуализацию и облачные среды?

📌 Продолжение

@machinelearning_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Форматы файлов Big Data для озера данных. Расскажите о Apache Parquet и его реализации.

Apache Parquet — это столбчатый формат хранения для обработки больших данных. Он активно используется в экосистеме Hadoop. Несмотря на снижение ее популярности, этот формат остается весьма распространенным — отчасти потому, что он все еще поддерживается ключевыми системами обработки данных, в том числе Apache Spark, Apache Flink и Apache Drill.

Реализованный в Parquet способ организации данных оптимизирует их для столбчатых операций, таких как фильтрация и агрегирование. Чтобы хранить данные с высокой эффективностью, в Parquet используется сочетание приемов сжатия и кодирования.

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

Обзор реализации

Эта схема (картинка) позволяет эффективно фиксировать метаданные, поддерживает эволюцию файлового формата и упрощает хранение. Алгоритмы сжатия Parquet снижают требования к объемам хранилища, позволяют быстрее извлекать данные и поддерживаются множеством фреймворков.

Есть три типа метаданных: файла, столбца (фрагмента) и заголовка страницы. Для сериализации и десериализации структур метаданных в Parquet используется Thrift TCompactProtocol.

👇Напишите в комментариях, что вы знаете о формате ORC, (Optimized Row Columnar).

@machinelearning_interview
📌 Форматы данных и файлов. Расскажите о формате стерилизации MessagePack.

MessagePack — это формат сериализации, который обеспечивает компактное бинарное представление структурированных данных. Он эффективнее и быстрее других форматов сериализации, таких как JSON, благодаря представлению в двоичном, а не в текстовом формате. MessagePack применяют в распределенных системах, микросервисах и хранилищах данных. Он поддерживается множеством языков программирования, в том числе C++, Python и Java.

Его часто используют, чтобы передавать данные по сети или хранить их в компактном формате. Кроме того, MessagePack — это расширяемый формат, так что пользователи могут определять собственные типы и структуры.

Обзор реализации

Благодаря возможности добавлять и удалять ключи обеспечивается расширяемость с JSON. Его изначальная реализация — это заголовок, за которым следует объект MessagePack со структурой:

{
"Versions": [
{
"Type": 0, // Type of version, object with data or delete marker.
"V1Obj": { /* object data converted from previous versions */ },
"V2Obj": {
"VersionID": "", // Version ID for delete marker
"ModTime": "", // Object delete marker modified time
"PartNumbers": 0, // Part Numbers
"PartETags": [], // Part ETags
"MetaSys": {} // Custom metadata fields.
// More metadata
},
"DelObj": {
"VersionID": "", // Version ID for delete marker
"ModTime": "", // Object delete marker modified time
"MetaSys": {} // Delete marker metadata
}
}
]
}


Преобразования метаданных унаследованы от предыдущих версий, а новые версии включают V2Obj или DelObj в зависимости от активной операции при получении запросов на обновление. В сущности, когда нам нужно просто прочитать метаданные, можно остановить чтение файла, дочитав до их конца. Для получения обновлений нужно максимум два непрерывных чтения. Для этого меняется и представление на диске. Раньше все метаданные хранились как большой объект, содержащий все версии. Теперь мы пишем это следующим образом:

сигнатура с версией;
версия данных заголовка (целое число);
версия метаданных (целое число);
счетчик версий (целое число).

@machinelearning_interview
📌Назовите способы и инструменты сбора данных

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

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

Извлечение данных при помощи интерфейсов программирования приложений

Application programming interface (API) — это слой ПО, позволяющий программам взаимодействовать друг с другом. Для прямого доступа к своим данным большинство современных платформ раскрывают публичные или приватные API. Благодаря API система может автоматически собирать интересующий вас контент.

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

Оптическое распознавание символов

Optical character recognition (OCR) — это технология, распознающая печатный или рукописный текст в отсканированных документах, изображениях PDF и других файлах, а затем преобразующая его в машиночитаемый электронный вид. Она позволяет не только быстро оцифровывать бумажные документы, но и извлекать ценный контент из различных документов, делая его доступным для дальнейшей обработки.

Полнофункциональные системы наподобие ABBYY FineReader PDF и OCR-решения Google используют машинное обучение для анализа структуры документа и распознавания текста вне зависимости от его языка.

Автоматизация процессов

Robotic process automation (RPA) — это тип ПО, предназначенный для выполнения повторяющихся и монотонных повседневных операций, обычно выполняемых людьми. Среди прочего, RPA-боты способны выполнять некоторые действия, связанные со сбором данных, например, открывать электронные письма и вложения, собирать статистику в социальных сетях, извлекать данные из предварительно указанных полей в документах, считывать требуемые данные из баз данных и электронных таблиц, и так далее.

Традиционные RPA-инструменты способны работать только со структурированными и слабоструктурированными данными. Когда необходимо обрабатывать неструктурированные данные (которые, как мы помним, составляют 80-90% потенциально полезного контента), требуются более сложные решения на основе ИИ.

Интеллектуальная обработка документов

Intelligent document processing (IDP) включает в себя:

OCR для извлечения текста из сканов,
RPA для выполнения монотонных манипуляций со структурированными и слабоструктурированными данными, и
методики машинного обучения, в частности, компьютерное зрение и NLP, для классификации документов на основании текстов, изображений или визуальной структуры, извлечения значимой информации, очистки, упорядочивания и разметки неструктурированных данных с целью их подготовки для обучения моделей машинного обучения.

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

Веб-скрейпинг

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

Стоит заметить, что не каждый вид веб-скрейпинга легален. Вы можете свободно скрейпить собственный веб-сайт и, в большинстве случаев, собирать публично доступные данные в Интернете (если они не скрыты за логином).

@machinelearning_interview
🖥 Как происходит обучение с нуля на собственных данных (LLM). Какую архитектуру выбрать для pre-training обучения?

Такое обучение, которое ещё называется pre-training, решает задачу моделирования языка или, говоря проще, позволяет нашей модели выучить (насколько это возможно) язык, с которым она работает.

Для этого обучение проходит в парадигме Masked Language Modeling, MLM (проходим по тексту, маскируем по очереди каждый токен и пытаемся по окружающим его токенам – контексту предсказать этот токен) и Next Sentence Prediction, NSP (предсказание по паре текстовых фрагментов, следуют они друг за другом или нет). Есть ещё также Casual Language Modeling, но MLM обычно используется чаще.

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

специфичный стиль текста, его структура (яркий пример – юридические тексты, договора, сметы),

наличие специфичных терминов (пример – медицинские тексты).

На что стоит обратить внимание перед процедурой pre-training:

данные, с которыми вы работаете, может быть недостаточно для эффективного обучения модели, поэтому даже обладая хорошим потенциалом, они могут не обучиться и показывать такое же либо даже худшее качество по сравнению с бейзлайном;

хорошие эмбеддинги – это лишь один из этапов во всём пайплайне и вовсе не единственная точка роста. Поэтому если вы стоите перед выбором, стоит ли тратить ресурсы на pre-training, аренду видеокарт и т.д., возможно, стоит сначала сделать упор на другие вещи, например, на более качественный сбор/обработку/обогащение данных.

Если решили идти по этому пути, то рабочим вариантом может быть следующий: взять веса общедоступной модели, обученной на таких текстах, как Википедия, затем обучить её на собственных текстах в парадигме MLM, дав возможность изучить тонкости именно ваших текстов. А затем снова дообучить в парадигме fine-tuning для решения целевой задачи.

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

RoBERTa (A Robustly Optimized BERT Pre-training Approach) – это архитектура, основанная на BERT, но в которой оптимизировали параметры обучения, отказались от обучения в парадигме NSP и показали, что так качество будет выше.

DeBERTa (Decoding-enhanced BERT with disentangled attention) – дословно BERT улучшенного декодирования с рассеянным вниманием. Это основанная на RoBERTa архитектура, в которой авторы дополнительно применили механизм кодирования слова двумя векторами (кодирующими его содержание и положение в тексте) и заменили выходной softmax-слоя усовершенствованным декодером. Вот пример успешного применения этой архитектуры.

ELECTRA – архитектура (оригинальная статья), в которой отказались от обучения в парадигмах MLM и NSP и тренируют генератор и дискриминатор. Первая модель учится выборочно заменять токены в тексте, а вторая (которую и будем использовать после обучения) учится определять токены, которые были заменены, и таким образом осваивает структуру языка. Архитектура модели и её преимущества довольно подробно расписаны в статье Более эффективное предварительное обучение NLP моделей с ELECTRA.

@machinelearning_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Расскажите про метод увеличения производительности обучения больших языковых моделей ReLoRA ?

ReLoRA — это метод обучения больших языковых моделей-трансформеров с использованием матриц низкого ранга, который увеличивает производительность обучения.

Эффективность метода возрастает с увеличением масштабов моделей. На модели с 1,3 миллиардами параметров использование памяти уменьшилось на 30%, а производительности обучения увеличилось на 52% по сравнению с обучением с полным рангом. Код доступен в открытом доступе на Github.

Основная идея, лежащая в основе ReLoRA, заключается в разложении обновлений весов во время обучения на матрицы низкого ранга путем добавления новых обучаемых параметров к исходным весам модели. ReLoRA превзошла базовые методы обучения с низким рангом, такие как LoRA, на всех размерах моделей.

ReLoRA использует несколько дополнительных техник
во время обучения, чтобы увеличить эффективный ранг обновлений модели:

Перезапуски обучения: После обучения матриц низкого ранга в течение нескольких шагов, ReLoRA объединяет низкоранговые факторы обратно с исходными весами модели. Это позволяет последующим низкоранговым факторам захватывать различные компоненты обновления весов.

Сбросы оптимизатора: При повторном запуске обучения ReLoRA сбрасывает часть состояний оптимизатора Adam. Это предотвращает смещение новых низкоранговых факторов в сторону предыдущего пространства решений.

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

Это позволяет ReLoRA выполнять обновления высокого ранга, одновременно обучая лишь небольшое количество параметров.

Авторы оценили эффективность ReLoRA, предварительно обучив языковые модели трансформеров с до 350 миллионами параметров на датасете C4. Результаты показали, что ReLoRA достигла сравнимой перплексии с обычным полноранговым обучением трансформеров, и её эффективность улучшается с увеличением размера модели. Например, для модели с 350 миллионами параметров ReLoRA уменьшила количество обучаемых параметров на более чем 70%, сохраняя при этом конкурентоспособную перплексию: 22,48 против 20,40 соответсвенно.

Эффективность метода существенно возрастает с увеличением размера модели. На модели с 350 миллионами параметров ReLoRA требовала всего 99 миллионов обучаемых параметров, что уменьшило количество обучаемых параметров на 70%.

Анализ сингулярных значений обновлений весов показал, что ReLoRA качественно лучше аппроксимирует обновления с более высоким рангом при обучении с полным рангом, чем стандартные методы обучения с низким рангом, такие как LoRA. Это указывает на то, что ReLoRA способна выполнять обновления модели высокого ранга с помощью обучения с низким рангом.

Разрыв в производительности между ReLoRA и обучением с полным рангом уменьшился с увеличением размеров моделей. Например, на модели с 60 миллионами параметров разрыв составлял более 5 пунктов перплексии, в то время как на модели с 350 миллионами параметров он уменьшился до менее чем 2 пунктов перплексии.

Улучшения использования памяти и вычислительной эффективности существенно возрасли при оценке на модели с 1,3 миллиарда параметров. Оценки показали уменьшение использования памяти на 30% и повышение производительности обучения на 52% по сравнению с обучением с полным рангом.

@machinelearning_interview
📌 Расскажите про альтернативы ансамблированию при файнтюнинге моделей?

Понятие «model soup»‎ было предложено в папере 2022 года «Model soups: averaging weights of multiple fine-tuned models improves accuracy without increasing inference time», написанном в соавторстве Google Research, Meta AI Research и несколькими университетами.

Для начала вспомним, как выглядит стандартный процесс обучения модели: мы обучаем модель с различными вариациями гиперпараметров, а затем выбираем лучшую из них, измерив качество на evaluation set. После этого все модели, кроме наилучшей, отправляются в корзину.

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

Идея model soup заключается в том, чтобы усреднять не logits, а непосредственно веса моделей. В этом случае на инференсе мы запускаем лишь одну модель, и время не увеличивается.

Сравнение с ансамблями
Авторы приводят результаты тестирования бэггинга и различных рецептов «супов» при файнтюнинге модели CLIP ViT-B/32 на ImageNet. Accuracy оценивается как на тестовой выборке самого ImageNet, так и на distribution shift датасетах — ImageNet-V2, ImageNet-R, ImageNet-Sketch, ObjectNet, ImageNet-A.

Функции потерь нейронных сетей не являются выпуклыми, и при их минимизации решение может сходиться к разным локальным минимумам. Так почему же усреднение весов в случае файнтюнинга приводит к адекватному решению? Ответ кроется в папере Google 2020 года «What is being transferred in transfer learning?». Его авторы приходят к выводу, что при файнтюнинге предобученных моделей решения всех моделей остаются в окрестности одного и того же локального минимума (авторы называют её «basin» — «впадина»). В то же время модели, обученные с нуля, даже если они инициализированы одинаково, таким свойством не обладают.

Вдохновившись этим открытием, авторы model soup исследуют форму поверхности loss-функции и приходят к выводу, что среднее нескольких решений может лежать ближе к минимуму loss-функции, чем каждое из решений по отдельности.

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

Также можно заметить, что угол между решениями (обозначенный серыми стрелками на изображении выше) может влиять на точность среднего. Авторы предоставляют отдельное исследование данной зависимости и приходят к выводу, что чем ближе этот угол к 90°, тем больший выигрыш мы получаем при усреднении решений:

В свою очередь на угол между решениями влияет то, какой гиперпараметр мы изменяем. На изображении выше видно, как влияет изменение random seed, learning rate и аугментаций.

Подробнее.

@machinelearning_interview
🚀Расскажите про архитектуры внедрения ML-пайплайна в real-time сервисы

Подробнее остановимся на особенностях внедрения моделей в случае real-time предсказаний.

1. Монолит

Кодовая база ML интегрирована в кодовую базу бэкэнда. Это требует тесного сотрудничества между ML-специалистами и владельцами кодовой базы бэкэнда. Процесс CI/CD замедляется из-за юнит-тестов сервиса машинного обучения, а размер модели и требования к вычислениям создают дополнительную нагрузку на серверы бэкэнда.

Такой тип развертывания следует рассматривать только в том случае, если инференс модели очень легкий для запуска.

2. ML как один сервис

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

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

Обычно это самый простой способ развернуть модель с обеспечением масштабируемости, поддерживаемости и надежности.

3. Микросервисный подход

Каждая часть пайплайна получает свой собственный сервис. Этот подход требует высокий уровень зрелости в области ML и MLOps.

Такой подход может быть полезен, например, если компонент обработки данных используется несколькими моделями. Например, у нас может быть несколько моделей, которые ранжируют рекламу в разных поддоменах (реклама на Facebook, реклама в Instagram и т. д.). При этом они должны следовать одному и тому же процессу аукциона. Тогда эта часть пайплайна может быть обработна отдельным сервисом, отвечающим за аукцион.

Важно использовать сервис для оркестрации, например, Kubernetes, для обработки возникающей сложности микросервисов. “Dependency Hell in Microservices and How to Avoid It“

@machinelearning_interview
Как узнать больше об LLM?

Large Language Models в последнее время стали слишком популярны, и многие строят свои ML-решения поверх таких LLM. Но не все знают, что злоумышленники могут делать инъекции через промты и нарушить работу модели или вообще сломать систему.

Поэтому VK устраивает онлайн-семинар, где расскажет, какие могут быть опасности и как защитить решения, основанные на LLM. Регистрация по ссылке.
📌Отличие рекуррентных нейронные сети от других методов машинного обучения? Назовите способы улучшения стандартных рекуррентных сетей?

Рекуррентные нейронные сети (RNN) отличаются от других методов машинного обучения тем, что они способны обрабатывать серии событий во времени или последовательные логические цепочки. Рекуррентные нейронные сети могут использовать свою внутреннюю память для обработки последовательностей разной длины.

RNN применимы в таких задачах как, например: распознавание рукописного текста, анализ текстов, распознавание речи и др.

Кроме того, известно, что RNN являются полными по Тьюрингу, и поэтому имеют возможность имитировать произвольные программные процедуры. Но на практике это не всегда просто сделать.

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

Одним из способов улучшения стандартных рекуррентных сетей для успешного решения алгоритмических задач является введение адресной памяти большого размера. В отличие от машины Тьюринга, нейронная машина Тьюринга (NTM) является полностью дифференцируемой моделью, которая может быть обучена модификациями метода градиентного спуска (например, RMSProp), что дает практический механизм для обучения программ на примерах.

Модель NTM была предложена в 2014-ом году в работе. В этой работе не описаны подробно детали функционирования данной нейросетевой модели. Одной из задач выпускной квалификационной работы является предоставление детального описания работы нейронной машины Тьюринга.

Основным фактором появления нейронных сетей с внешней памятью является изобретение дифференцируемых механизмов внимания.

В 2016-ом году в работе была предложена усовершенствованная модель нейронной сети с внешней памятью под названием дифференцируемый нейронный компьютер. В ней также было лишь краткое описание принципов работы этой модели.

В 2018-ом году в работе были предложены четыре модификации для дифференцируемого нейронного компьютера, которые позволяли улучшить качество решения задач, связанных с вопросно-ответными системами (QA tasks). Эти модификации были основаны на работах.

На сегодняшний день очень высока актуальность создания новых рекуррентных нейросетевых моделей, способных хранить большие объёмы данных, а также успешно решать задачи, предъявляемые к вопросно-ответным системам (QA-задачи).

К таким нейросетевым моделям предъявляются следующие требования:

наличие «долгосрочной» обучаемой памяти;

высокая скорость обучения;

устойчивость процесса обучения (процесс обучения не должен существенно зависеть от начальной инициализации);

прозрачность принятия решений моделью и интерпретируемость работы нейронной сети (попытка уйти от концепции «черного ящика»);

способность решать QA-задачи;

модель должна содержать относительно небольшое количество обучаемых параметров;

способность работать с переменными, а также со структурами данных (например, с графами), решать алгоритмические задачи.

@machinelearning_interview
🖥 Как бы вы реализовали функцию потерь в PyTorch?

В PyTorch функции потерь могут быть реализованы путем создания подкласса класса nn.Module и переопределения метода forward. Метод forward принимает на вход прогнозируемый выход и фактический выход и возвращает значение потерь.

Приведем пример кода:

import torch
import torch.nn as nn

class CustomLoss(nn.Module):
def __init__(self):
super(MyLoss, self).__init__()

def forward(self, output, target):

loss = ... # compute the loss

return loss


Теперь, чтобы использовать функцию потерь, необходимо инициализировать ее и передать в качестве аргумента параметру criterion оптимизатора в цикле обучения.

model = ...
optimizer = ...
criterion = CustomLoss()

# цикл обучения
for epoch in range(num_epochs):

optimizer.zero_grad()
outputs = model(data)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()

...


#pytorch #junior

@machinelearning_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
import numpy as np
Polynomial = np.polynomial.Polynomial
p = Polynomial([1, -1, 1])
q = Polynomial([2, -3])
print(int((p + q)(1)))
Выберите правильный вариант
Anonymous Quiz
2%
-2
4%
-1
27%
0
7%
1
3%
2
8%
3
4%
4
3%
17
42%
Посмотреть результаты
🔍 Выявление неявных связей при анализе графов или как увидеть незримое

Неявные связи в графах. Что это и как с ними работать, разберу на примерах.

Граф — множество узлов, объединенных множеством ребер.

С узлами все понятно, взяли города России, клиентов банка или компьютеры в сети, и получили множество объектов, которые и будут узлами для графа.

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

Существует факт взаимосвязи между объектами: если дороги нет, то ребро между узлами отсутствует.
Что же относится к неявным связям? Неявные связи сложнее, они могут зависеть от явных связей или же быть самостоятельными.

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

Теперь перейдем к практическому примеру.
Есть 2 файла:

◾️Данные о мошенниках, их номерах телефонов, а также периоды их активности;
◾️Данные о клиентах и номерах телефонов с периодами активности.
◾️Данные с номерами телефонов сложно найти в открытом доступе, придется сгенерировать их самостоятельно. Код для генерации необходимых данных расположен по ссылке.

Следующим этапом будет создание графа. Для этой задачи понадобятся следующие python-библиотеки:

▪️Pandas – для работы с файлами;
▪️NetworkX – для создания графа связей, его визуализации;
▪️Matplotlib и Numpy – нужны для настройки визуализации графа;
▪️Datetime – для операций над временными данными.

Перед созданием графа взглянем на данные, с которыми нам предстоит работать.

Описание данных:

📍index – id клиента / мошенника;
📍numbers – номер телефона;
📍Date_start – начало периода активности;
📍Date_end – окончание периода активности.

➡️ Продолжение
Please open Telegram to view this post
VIEW IN TELEGRAM
🎯Подробный разбор механизма Self-attention больших языковых моделей

В этой статье пошагово с прмиерами кода разобрана работа Self-attention механизма.

Self-attention это механизм предназначенный для обработки последовательных данных с учётом контекста каждой метки времени.

📌Статья

@machinelearning_interview
🖥 Аналитика небольших данных: как совместить Excel, Python и SQL с помощью инструментов с открытым исходным кодом

Однажды Джоэл Спольски в своей знаменитой презентации «You Suck at Excel» сказал, что существуют сотни коммерческих продуктов, вместо которых можно было бы использовать табличку Excel.

В этой шутке очень высокая доля правды. Excel благородя интуитивному UI, формулам и VBA дает возможность пользователям самим решать широкий спектр задач, избавляя от необходимости каждый раз обращаться за помощью к разработчикам или внедрять в компании новый продукт. Excel используется везде от мелкой розницы до Fortune 500 и CERN.

Пользовательский интерфейс Excel оказался, настолько удачным – ни один из конкурентов так и отошел от привычных таблиц. Для пользователя Excel интерфейс Google Spreadsheet будет привычным и интуитивно понятным. А вот по своим функциональным возможностям Excel до сих пор превосходит большинство конкурентов.

Как с помощью двух мощных инструментов с открытым исходным кодом можно совместить привычный для пользователей интерфейс, надежность и мощь SQL, гибкость Python и командную работу как в Google Spreadsheet? Давайте рассмотрим это на простом примере.

📌Читать дальше

@machinelearning_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👆 Принципы SOLID в инженерии данных. Часть 1.

SOLID — это набор основных принципов процесса разработки ПО, направленных на упрощение чтения, тестирования и сопровождения кода.

Как расшифровывается SOLID

Акроним SOLID расшифровывается так:

Single responsibility principle («Принцип единственной ответственности»).
Open/close principle («Принцип открытости/закрытости»).
Liskov substitution principle («Принцип подстановки Лисков»).
Interface segregation principle («Принцип разделения интерфейса»).
Dependency inversion principle («Принцип инверсии зависимостей).

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

Примеры
Продемонстрируем нарушение и соблюдение принципа единственной ответственности, создав простой класс для банковского счета:

а) нарушение принципа:
class BankAccount:
def __init__(self, account_number: int, balance: float):
self.account_number = account_number
self.balance = balance

def deposit_money(self, amount: float):
self.balance += amount

def withdraw_money(self, amount: float):
if amount > self.balance:
raise ValueError("Unfortunately your balance is insufficient for any withdrawals right now ... ")
self.balance -= amount

def print_balance(self):
print(f'Account no: {self.account_number}, Balance: {self.balance} ')

def change_account_number(self, new_account_number: int):
self.account_number = new_account_number
print(f'Your account number has changed to "{self.account_number}" ')

Принцип нарушается, поскольку классом BankAccount контролируется больше одной задачи, связанной с банковскими счетами: управление профилями счетов и управление денежными средствами.

б) соблюдение принципа:

А вот пример соблюдения принципа:
class DepositManager:
def deposit_money(self, account, amount):
account.balance += amount


class WithdrawalManager:
def withdraw_money(self, account, amount):
if amount > account.balance:
raise ValueError("Unfortunately your balance is insufficient for any withdrawals right now ... ")
account.balance -= amount


class BalancePrinter:
def print_balance(self, account):
print(f'Account no: {account.account_number}, Balance: {account.balance} ')


class AccountNumberManager:
def change_account_number(self, account, new_account_number):
account.account_number = new_account_number
print(f'Your account number has changed to "{account.account_number}" ')


class BankAccount:
def __init__(self, account_number: int, balance: float):
self.account_number = account_number
self.balance = balance
self.deposit_manager = DepositManager()
self.withdrawal_manager = WithdrawalManager()
self.balance_printer = BalancePrinter()
self.account_number_manager = AccountNumberManager()

def deposit_money(self, amount: float):
self.deposit_manager.deposit_money(self, amount)

def withdraw_money(self, amount: float):
self.withdrawal_manager.withdraw_money(self, amount)

def print_balance(self):
self.balance_printer.print_balance(self)

def change_account_number(self, new_account_number: int):
self.account_number_manager.change_account_number(self, new_account_number)

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

в) пример расширения кодовой базы:

🔘 Продолжение части 1
🔘 Часть 2
🔘 Часть 3

@machinelearning_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🔝Лучшие GitHub репозитории для изучения MLOps.

#️⃣ MLOps-Basics

#️⃣ MLOps-Guide

#️⃣ Awesome MLOps

#️⃣ Awesome MLOps - Tools

#️⃣ DTU MLOps

#️⃣ MLOps Course

@machinelearning_interview
🐼Как устроен Pandas: взгляд изнутри

Структура данных Pandas
Как правило, датафрейм поддерживается каким-нибудь массивом, например NumPy или Pandas ExtensionArray. Эти массивы хранят данные датафрейма. pandas добавляет промежуточный слой Block и BlockManager. Он управляет этими массивами, обеспечивая максимальную эффективность операций. Это одна из причин, почему в Pandas методы, работающие с несколькими столбцами, могут быть очень быстрыми. Далее более подробно рассмотрим упомянутые слои.

Массивы
Фактические данные датафрейма могут храниться в наборе массивов NumPy или Pandas ExtensionArray. Этот слой обычно направляет к базовой реализации, например использует NumPy API при условии хранения данных в массивах NumPy. Pandas хранит в них данные и вызывает свои методы без расширения интерфейса.

Массивы NumPy обычно являются двумерными и дают ряд преимуществ в производительности, о которых речь пойдет далее. На данный момент Pandas ExtensionArray в основном представляют собой одномерные структуры данных, благодаря чему операции становятся предсказуемыми.
Однако не обошлось и без недостатков: в ряде случаев страдает производительность.

ExtensionArray допускает применение датафреймов, которые поддерживаются массивами PyArrow и другими типами данных Pandas.

Block

Датафрейм обычно состоит из столбцов, представленных по крайней мере одним массивом. Как правило, имеется коллекция массивов, так как один массив может хранить только один определенный тип данных. Эти массивы хранят данные, но не владеют информацией о том, какие столбцы они представляют. Каждый массив из датафрейма обернут соответствующим блоком Block.
Block добавляет дополнительную информацию в массивы, например расположение представленных им столбцов.
Block служит слоем вокруг фактических массивов с возможностью расширения вспомогательными методами, необходимыми для операций Pandas.
При выполнении фактической операции с датафреймом Block гарантирует, что метод направляется в базовый массив. Например, при вызове astype он убедится, что эта операция вызывается в массиве.

Данный слой не располагает информацией о других столбцах в датафрейме, являясь автономным объектом.

BlockManager
Как следует из названия, BlockManager управляет всеми Block, связанными с одним датафреймом. Он содержит сами Block и информацию об осях датафрейма, например имена столбцов и метки Index.
И самое главное в том, что он направляет большинство операций к фактическим Block:

df.replace(...)

BlockManager гарантирует, что replace выполняется для каждого Block.

Понятие консолидированного датафрейма
Мы исходим из того, что датафреймы поддерживаются типами данных NumPy, например их данные могут храниться в двумерных массивах.

При создании датафрейма Pandas гарантирует, что на каждый тип данных приходится только один Block:

df = pd.DataFrame(
{
"a": [1, 2, 3],
"b": [1.5, 2.5, 3.5],
"c": [10, 11, 12],
"d": [10.5, 11.5, 12.5],
}
)

У этого датафрейма есть 4 столбца, представленные двумя массивами: один из них хранит целочисленный тип данных, а другой — числа с плавающей точкой. Это и есть консолидированный датафрейм.

Добавим новый столбец к этому датафрейму:
df["new"] = 100

У него такой же тип данных, как и у существующих столбцов "a" и "c". Рассмотрим 2 возможных варианта дальнейших действий:

1. Добавление нового столбца в существующий массив, содержащий целочисленные столбцы.
2. Создание нового массива только для хранения нового столбца.

◾️ Первый вариант предусматривает добавление нового столбца в существующий массив. Для этого требуется скопировать данные, поскольку NumPy не поддерживает эту операцию без копирования. В итоге добавление одного столбца оборачивается слишком большими затратами.

◾️ Второй вариант

📌 Читать

@machinelearning_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM