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

Вопросы - @notxxx1


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

РКН: clck.ru/3FmwRz
Download Telegram
Хабр Карьера опубликовали статистику с зарплатами айтишников по городам.

@machinelearning_interview
Расскажите про методы увеличения производительности СУБД?

СУБД очень часто становится «узким местом» в производительности веб‑приложений, влияющим на общее быстродействие и устойчивость к высоким нагрузкам.

Масштабирование «железа» и адекватная настройка

Первое, что стоит сделать, если скорость работы базы данных не удовлетворяет требованиям, это проверить адекватность настройки СУБД относительно имеющихся ресурсов, а также убедиться, что при проектировании БД были учтены используемые запросы. Если, например, для СУБД работает с настройками «из коробки», а при обработке запросов не используются индексы, то надо не масштабировать СУБД, достаточно просто откорректировать конфигурацию работы сервера баз данных и обновить схему используемой базы данных под профиль нагрузки.
Иногда также проще увеличить выделение ресурсов под сервер баз данных — количество оперативной памяти и скорость работы дисковой подсистемы оказывают существенное воздействие на скорость работы СУБД. Нередко даже небольшое увеличение RAM и переход на SSD увеличивает производительность в разы.

Масштабирование через партиционирование, репликацию и шардинг

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

Партиционирование (partitioning)
Партиционирование — это разбиение таблиц, содержащих большое количество записей, на логические части по неким выбранным администратором критериям. Партиционирование таблиц делит весь объем операций по обработке данных на несколько независимых и параллельно выполняющихся потоков, что существенно ускоряет работу СУБД. Для правильного конфигурирования параметров партиционирования необходимо, чтобы в каждом потоке было примерно одинаковое количество записей.

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

Репликация (replication)
Репликация — это синхронное или асинхронное копирование данных между несколькими серверами. Ведущие серверы часто называют мастерами (master), а ведомые серверы — слэйвами (slave). Более политкорректные современные названия — Лидер и Фолловер (leader & follower).

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

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

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

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

@machinelearning_interview
🏋️‍♀️ Упражнения для продвинутого использования NumPy

https://uproger.com/prodvinutyj-numpy-ottachivajte-tryuki-s-shagami/

@machinelearning_interview
📌C какими проблемами может столкнуться нейронный алгоритм в работе с временными рядами? Какую архитектуру можно выбрать, чтобы решить такие проблемы?

Первое, что приходит на ум - это, конечно, рекуррентные нейросети(картинка 1).

Одна из идей, сделавшая RNN неоправданно эффективными - "авторегрессия" (auto-regression), это значит, что созданная переменная добавляется в последовательность в качестве входных данных. В машинном обучении часто применяется эта техника, особенно в работе с временными рядами.

Хотя рекуррентная сеть и должна работать со всей последовательностью, к сожалению, присутствует проблема "затухающего градиента"(vanishing gradient problem). Что значит, что более старые входы не влияют на текущий выход. Такие модели, как LSTM пытаются решить эту проблему, добавляя дополнительные параметры (картинка 2).

Такие модели считывают ввод данных последовательно.

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

@machinelearning_interview
Как создавать качественные ML-системы

Команда VK Cloud перевела серию из двух статей, посвященных ML-системам. В первой статье разобрались, почему каждый проект надо начинать с плана, обсудили жизненный цикл ML-проекта, выяснили, как определять его ценность для бизнеса и собирать требования, а заодно поговорили о важности проектной документации на этом этапе.

Во второй статье остановились на Data-centric ИИ, данных для обучения, разметке и очистке, синтетических данных и еще немного о Data Engineering и ETL.

@machinelearning_interview
📌 Почему длина контекста так важна при работе с большими языковыми моделями? Как обходить ограничения длины контекста?

Длина контекста – один из важнейших лимитирующих факторов при работе с большими языковыми моделями. Увеличить контекст до 100K – это уже невероятное достижение, ставшее реальностью (занятно, как этот тезис будет восприниматься через год).

Вот как выглядит один из важных практических случаев, в которых желательно применять большие языковые модели: «забросить в LLM целую кучу пользовательских данных (документов, касающихся работы компании либо конкретной задачи; также это могут быть различные разнородные тексты, т.д.) и задавать вопросы по этим конкретным данным, а не по какой-нибудь взятой из Интернета отвлечённой информации, которую LLM видела на этапе обучения.

В настоящее время обходить это ограничение пробуют по-разному, а именно:

При помощи приёмов резюмирования и изощрённых сцепленных затравок

Ведя векторные базы данных, в которых хранятся векторы для пользовательских документов с последующим «поиском» по этому корпусу в соответствии с некоторой метрикой схожести

Когда это возможно – тонко настраивать LLM на данных, предоставляемых пользователем (такая возможность предоставляется не во всех коммерческих LLM, а для опенсорсных LLM это не самая тривиальная задача)

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

При наличии длинного контекстного окна уже имеющаяся в вашем распоряжении большая языковая модель (видевшая целый Интернет) может изучить имеющийся у вас контекст и данные, а затем взаимодействовать с вами на совершенно ином уровне, предполагающем более высокую персонализацию. Всё это – без изменения весов модели, когда всё «обучение» производится на лету, «в памяти». В целом, чем больше контекстное окно, тем более высокая точность, беглость и изобретательность приобретается моделью.

В качестве аналогии здесь можно рассмотреть ОЗУ компьютера, где операционная система хранит в режиме реального времени актуальный контекст для всех ваших приложений. LLM, располагая достаточно длинным контекстом, сравнима с «рассуждающим компьютером», учитывающим широкий контекст, предоставляемый пользователем.

Оригинальный трансформер и длина контекста
Важно отметить, что в архитектуре транмформеров формы всех весов матриц, доступных для обучения, не зависят от количества подаваемых на вход токенов n. Все параметры, поддающиеся обучению (поиск по векторам, слои проекций, слой softmax и слои внимания) не зависят от длины входного фрагмента и должны быть в состоянии обрабатывать такие фрагменты варьирующейся длины. Просто отлично, когда такое свойство в архитектуре предоставляется прямо «из коробки».

Это значит, что, если вы обучали трансформерную модель с контекстным окном длиной 2K, то можете экстраполировать её на последовательности токенов любой длины. Единственная проблема здесь в том, что в таком случае модель не сможет методом вывода дать осмысленных результатов на материале в 100K токенов, если её не обучали на окне контекста длиной 100K. В таком случае распределение учебных данных будет очень далеким от тех данных, которые приходится логически обрабатывать, поэтому модель потерпит фиаско, как и любая модель машинного обучения в таком сценарии.

Если требуется обучить трансформер на таком большом контексте, то можно, например, обучать его в два этапа: сначала базовую модель на окне контекста длиной 2K токенов, а потом продолжить обучение (в качестве тонкой настройки) на более длинных контекстах (например, 65K или 100K). Именно это и было сделано с моделью MosaicML. Но вот загвоздка: такой подход не сработает с оригинальной архитектурой Трансформеров, поэтому придётся прибегать к определённым ухищрениям.

@machinelearning_interview
🚀 Расскажите что такое утечка данных в машинном обучении? В чём суть проблемы ?

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

Представьте, что вы готовитесь к экзамену по математике. Вы решаете много задач, чтобы получше натренироваться. И тут выясняете, что вопросы к экзамену случайно выложили в интернет. У вас есть доступ к этой критически важной информации и возможность всё решить. То есть вы начинаете учиться на датасете, который, по идее, должен был попасть к вам только на экзамене, и таким образом вы «запоминаете» паттерны. Результат? Вы вызубрили задачи «тестового датасета» и получили нереалистично высокую оценку за эту часть экзамена, но когда речь заходит о выполнении реальных задач… лучше даже не говорить, что будет.

Утечка информации о целевой переменной

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

Но при пристальном рассмотрении выясняется, что «количество звонков в службу поддержки» — это следствие, а не причина ухода. Клиенты, которые уже решили отказаться от сервиса, просто звонят уладить оставшиеся вопросы, прежде чем окончательно отписаться. Так что эта информация будет недоступна на тот момент, когда нужно спрогнозировать, уйдёт клиент или нет. Иными словами, она известна нам только по клиентам, которые уже решили уйти.

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

Контаминация обучающих и тестовых данных и утечка данных во время предварительной обработки

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

scaler = StandardScaler()
scaler.fit(X_train)
scaler.transform(X_train)
scaler.transform(X_test)


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

Тренируйте модель на обучающих данных, выполняйте преобразования и с обучающими, и с тестовыми данными.

Последствия утечки данных

Модель показывает чрезвычайно высокую эффективность при обучении, а тестовый датасет даёт крайне низкие результаты — знакомая ситуация? Возможно, всё дело в утечке данных. Здесь ключевые слова это «чрезмерное обучение» и «неспособность генерализации». Модель натренировалась на шуме и нерелевантной информации, что привело к низкой эффективности при работе с реальным тестовым датасетом.

В конечном счёте из-за неточной оценки модели вы получаете ненадёжные прогнозы. Это бессмысленная трата ресурсов!

@machinelearning_interview
⚡️Маст-хэв список для программистов, каналы с последними книжными новинками, библиотеками, разбором кода и актуальной информацией, связанной с вашим языком программирования.
Лучший способ получать свежие обновлении и следить за трендами в разработке.

Машинное обучение: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
C#: t.iss.one/csharp_ci
C/C++/ t.iss.one/cpluspluc
Data Science: t.iss.one/data_analysis_ml
Devops: t.iss.one/devOPSitsec
Go: t.iss.one/Golang_google
Базы данных: t.iss.one/sqlhub
Rust: t.iss.one/rust_code
Javascript: t.iss.one/javascriptv
React: t.iss.one/react_tg
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Мобильная разработка: t.iss.one/mobdevelop
Linux: t.iss.one/+A8jY79rcyKJlYWY6
Big Data: t.iss.one/bigdatai
Хакинг: t.iss.one/linuxkalii
Тестирование: https://t.iss.one/+F9jPLmMFqq1kNTMy
Java: t.iss.one/javatg

💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy

Папка машинное обучение: https://t.iss.one/addlist/_FjtIq8qMhU0NTYy

📕 Бесплатные Книги для программистов: https://t.iss.one/addlist/YZ0EI8Ya4OJjYzEy

🎞 YouTube канал: https://www.youtube.com/@uproger

😆ИТ-Мемы: t.iss.one/memes_prog

🇬🇧Английский: t.iss.one/english_forprogrammers
Please open Telegram to view this post
VIEW IN 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)))