Будет ли трансляция? Обязательно будет. Ссылку разместим позже на странице мероприятия — поэтому советуем зарегистрироваться на оффлайн-встречу, даже если вы не сможете прийти. Так вы точно не потеряете ссылку на онлайн
Нужно что-то платить? Нет, митап бесплатный — ждём всех неравнодушных к программированию на Spark!
Посмотрите на код ниже — где в нём проблема? Пишите ваши мысли в комментариях, а ниже мы дадим решение ошибки.
object UnitError {
def printMsg(message: String): Unit = {
println(message)
}
def process(data: List[Int]): List[Unit] = {
for (element <- data) yield {
printMsg(s"Элемент: $element")
}
}
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3)
val res = process(nums)
println(s"Результат: $res") // Вывод List[Unit] даёт неожиданный результат
}
}
Дальше будет решение — если не хотите спойлеров, пролистните текст ниже.
Ошибка заключается в неверной конструкции при использовании функции process. Она возвращает пустые значения: List((), (), ()). Происходит это потому, что yield собирает результаты каждой итерации. В итоге получается список, состоящий из пустых значений Unit — по одному на каждый элемент в data.
Unit в Scala — это аналог void в Java и Си-подобных языках, означающий пустое значение. В данном примере yield собирает результаты printMsg(...), которые все являются Unit (пустыми).
Программисты, привыкшие к императивным языкам и переходящие на Scala, интуитивно ожидают, что такая конструкция будет возвращать какие-то преобразованные данные, например — как это делает map в JavaScript. То есть, начинающие скалисты могут ожидать здесь на выходе список элементов, а получат пустой вывод.
Исправление
Если требуется вернуть список преобразованных значений, тогда нужно использовать эти значения в yield.
def printMsg(message: String): String = { // Теперь возвращает String
println(message)
message // Возвращает саму строку
}
def process(data: List[Int]): List[String] = { // Теперь функция возвращает List[String]
for {
element <- data
} yield {
printMsg(s"Обрабатываем элемент: $element") // Теперь выводится результат String
}
}
Большие языковые модели (LLM) обычно требуют мощного оборудования и потому запускаются в облачных сервисах, а без подписки их функционал ограничен. Однако Google Gemma 3 — исключение.
Google Gemma 3 — это семейство открытых моделей, некоторые из которых достаточно легковесны, что их можно использовать локально.
Модели Gemma 3 созданы на основе Gemini 2.0 и доступны в четырёх вариантах: 1B, 4B, 12B и 27B, где B — миллиарды параметров. Самая лёгкая модель 1B работает только с текстом, а все остальные — мультимодальные, то есть обрабатывают текст и картинки.
Модели на 4B, 12B и 27B параметров поддерживают более 140 языков и хорошо справляются с переводом текстов, модель на 1B параметров работает только с английским.
Главная особенность Gemma 3 — умение обрабатывать длинные запросы и анализировать объёмные документы благодаря большому контекстному окну (128K токенов для моделей 4B, 12B и 27B).
Вариант 4B особенно универсален: сжатая версия (int4) требует всего 3 ГБ видеопамяти, а несжатая версия (BF16) — около 8 ГБ VRAM, что позволяет запускать модель на видеокартах среднего класса.
Модели Gemma 3 совместимы с Windows, Linux и macOS.
Поддержка Apple Silicon через MLX даёт возможность запускать Gemma 3 на Mac и iPhone (инструкция).
Для запуска Gemma 3 можно использовать Python-библиотеку transformers (инструкция).
Ещё один способ установки Gemma 3 на компьютер — через фреймворк Ollama. Он прост в установке и доступен на Windows, Linux и macOS.
Для удобства работы с моделью можно добавить веб-интерфейс Open WebUI.
Помимо Gemma 3, для локальной установки подходят и другие облегчённые модели, но у них своя специфика:
Llama 3.3: требует больше ресурсов и не является полностью открытой;
Mistral 7B, Qwen2.5 и Phi-3 Mini: легковесны, но имеют меньшее контекстное окно;
DeepSeek-R1: конкурент Gemma 3 27B по качеству, но требует значительно больше ресурсов.
Что такое «совершенные» и «избыточные» числа? Рассказывают эксперты ИТ-компании «Криптонит».
Наверняка вы знакомы с понятием «делители числа». Например, у шестёрки кроме неё самой есть три делителя: 1, 2, и 3. Если сложить их, получится ровно шесть (1+2+3=6). Числа, у которых сумма делителей, не считая самого числа, равна самому числу, называются совершенными.
Если же сумма делителей оказывается больше самого числа, то такие числа называются избыточными. Самое малое избыточное число: 12. У него много делителей: 1, 2, 3, 4, 6. Если их сложить, получится 16, а 16 > 12.
Понятия совершенных и избыточных чисел возникли ещё в Древней Греции. Их описали пифагорейцы, заложившие основы учения о свойствах чисел и их классификации.
Какие же свойства есть у избыточных чисел?
12 — наименьшее избыточное число. Проверьте сами!
все числа, кратные избыточному числу, также являются избыточными. Раз 12 – избыточное число, значит 24, 36, 48 и т.д. тоже будут избыточными;
существуют как чётные, так и нечётные избыточные числа;
наименьшее нечётное избыточное число – 945. Сможете ли назвать все его делители?
У совершенных чисел свойства другие:
все известные совершенные числа чётные;
возможность существования нечётных совершенных чисел не доказана и не опровергнута;
сумма обратных величин всех делителей совершенного числа, включая само число, всегда равна двум. Пример для обратных делителей числа 6: 1/1 + 1/2 + 1/3 + 1/6 = 2;
все известные совершенные числа заканчиваются на 6 или 8 (6, 28, 496 и т.д.);
совершенные числа используются для вычисления простых чисел Мерсенна.
В повседневной жизни мы не задумываемся о том, совершенное перед нами число, избыточное или какое-то другое. Однако такая классификация лежит в основе теории чисел, которая имеет большое значение в сфере ИТ и, в частности, для криптографии.
Изучение свойств чисел помогает развивать математическое мышление, писать эффективные алгоритмы и понимать более сложные математические концепции.
В это воскресенье в 14:00 эксперты из «Криптонита» и других брендов расскажут про профессию «инженер данных»: чем занимается этот специалист, какими навыками он должен обладать и как им стать.
В это воскресенье (20 апреля) в 13:30 приглашаем на «Ключ к профессии»! Осталось всего 40 билетов!
Эта встреча будет посвящена профессии «криптограф». Мы с представителями других брендов расскажем про особенности этой специальности, о навыках криптографов и о том, как им стать.
На ноль делить нельзя... а вообще-то можно! Давайте разберёмся, откуда взялся этот запрет. Покажем на примерах.
Возьмём какое-нибудь число (пусть будет 2) и разделим его на 0,1. Получим 20. Теперь разделим 2 на 0,01. Получим 200. При делении 2 на 0,000001 уже получится 2 000 000. Легко увидеть, что чем ближе знаменатель будет к нулю, тем больше получится результат. Соответственно, результат деления на ноль устремляется в бесконечность. С отрицательными числами всё то же самое, только со знаком минус.
Если же мы делим ноль на ноль, то… получим ещё одну неопределённость. Есть Теорема Лопиталя, помогающая раскрывать неопределённости такого вида, но правила их раскрытия зависят от контекста и свойств анализируемых функций. Согласно IEEE 754 деление нуля на ноль даёт NaN (not a number, не число).
В общем случае говорят, что результат операции деления на ноль не определён.
В практических расчётах деление на ноль — явная ошибка, поскольку обратная операция оказывается невыполнима. Нет такого числа, которое можно умножить на ноль и получить исходное делимое.
Операция деления на ноль имеет смысл только в специализированной алгебраической структуре, которую описывает Теория колеса (Wheel theory). Её суть в том, что вводится понятие обратного числа, а деление заменяется умножением на обратное число. Числовая ось замыкается в кольцо через элемент ∞, а операция деления на ноль определяется как умножение ноля на ∞. Её результат записывается как ⊥, а этот элемент помещается вне кольца. По сути в Теории колеса подменяется смысл операции деления на ноль, поэтому она и становится возможной.
В программировании деление на ноль — распространённая проблема. Не всегда бывает легко поймать деление на ноль в коде. Оно может возникнуть в результате какого-то неявного процесса и привести к критическому сбою.
Например, в начале 1990-х после обновления авионики американские самолёты не могли летать в районе Мёртвого моря. Разработчики софта для процессора бортовой системы не учли, что этот регион находится ниже нулевой отметки высоты. При расчёте параметров полёта происходило деление на ноль, и процессор выполнял общий сброс. Авионика отключалась прямо в полёте.
На картинке — код на Rust, и в нём затаилась ошибка. Я специально попросила её сделать моих коллег, разработчиков ИТ-компании «Криптонит».
Зачем? Чтобы потом попросить её найти и написать о ней в комментариях (ох, уж эти сммщики).
Итак, где тут ошибка?
СЕЙЧАС БУДЕТ СПОЙЛЕР!
Так в чём же ошибка?
В третьей строке возникает ошибка попытки доступа к элементу за пределами массива. for i in 1..=numbers.len() выполнит итерацию по элементам, начиная со второго, а не с первого.
Ошибка заключается в попытке доступа к элементу с индексом [5] на последней итерации цикла. Такого элемента в массиве нет, в результате получаем аварийное завершение программы.
Также следует обратить внимание, что первый элемент массива с индексом [0] игнорируется. Это не является ошибкой с точки зрения выполнения программы, однако скорее всего является логической ошибкой в коде
Итак, в языке rust индексация элементов начинается с 0 и заканчивается len() - 1. В массиве из 5 элементов допустимо обращение к [0], [1], [2], [3] и [4] элементам.
Рекомендуемый способ перебора элементов коллекции с автоматической индексацией на rust — использование цепочки вызовов iter().enumerate().
Вот как это выглядит
fn main() {
let numbers = vec![10, 20, 30, 40, 50];
for (index, number) in numbers.iter().enumerate() {
println!("Элемент {index}: {number}");
}
}
Этот вариант позволяет также упростить выражение println, поместив печатаемые значения сразу в скобки на свои места. Это исключает возможность ошибиться в порядке печати значений и повысив наглядность кода.
Что такое метод дистилляции знаний? Рассказывают наши коллеги из лаборатории искусственного интеллекта. #нейрословарь
В сфере искусственного интеллекта используются разные методы оптимизации нейросетей. Среди них метод KD (knowledge distillation) часто применяется для переноса «знаний» от более сложной модели (учителя) к более простой (ученику).
Идея дистилляции знаний в том, чтобы научить упрощённую модель не только предсказывать верные классы, но и подражать поведению «учителя». Особенно это востребовано для смартфонов, интернета вещей (IoT) и граничных вычислений (edge-computing), словом — везде, где нужно «добавить нейронку» на слабое железо.
При обучении «ученика» используются как мягкие, так и жёсткие цели (one-hot метки как в обычном обучении). «Мягкие цели» содержат больше информации, чем простые метки классов. Они показывают не только какой класс правильный, но и как учитель воспринимает другие классы, какие из них считает более вероятными.
Для этого на стороне «учителя» увеличивается гиперпараметр «температура». Он смягчает распределение вероятностей классов, выдаваемое функцией softmax, в результате чего вероятности неправильных классов заметнее отличаются друг от друга.
Оба типа целей учитывает комбинированная функция потерь. Она вычисляет потерю дистилляции (разницу между предсказаниями ученика и мягкими целями учителя), а также стандартную кросс-энтропию (степень несоответствия предсказаний ученика жёсткими метками классов).
Есть три разновидности KD:
оффлайн — учитель обучается без взаимодействия с учеником, а затем генерирует ему мягкие цели;
онлайн — учитель и ученик обучаются параллельно, чтобы адаптироваться друг к другу;
cамодистилляция — модель учит сама себя. Одни слои сети играют роль «учителя» для других слоёв.
Модели, обученные с помощью дистилляции, обычно достигают лучшей точности и обобщающей способности, чем такие же модели, обученные только на жёстких метках классов с нуля.
Также дистилляция знаний используется для сжатия. Она позволяет создавать более компактные модели, которые занимают меньше места в памяти и работают быстрее. В частности, так создавались облегчённые версии больших языковых моделей (LLMs), включая BERT () и DeepSeek.
На картинке — код на JavaScript с ошибкой, который написал специально для Хабра руководитель группы разработки интерфейсов компании «Криптонит» Василий Беляев.
Кто увидел, где ошибка и как её можно решить — пишите в комментариях! А решение этой ошибки оставили под картинкой.
Где здесь ошибка?
Если запустим этот код, то получим ошибку
Uncaught TypeError: this.clearHistory is not a function
Проблема находится на строчках 11-13 (на картинке)
Всем привет! Я работаю в ИТ-компании «Криптонит» и как-то раз услышала от наших коллег из лаборатории искусственного интеллекта про Moët MoE. Расспросила у них про эту архитектуру — делюсь!
MoE (Mixture of Experts, набор экспертов) — архитектура нейросети, в которой используется набор из нескольких специализированных подсетей меньшего размера. Каждая из них играет роль эксперта и специализируется на определённом типе задач.
Распределяет задачи между экспертами отдельный механизм, который в разных источниках называется шлюзом (gate) или маршрутизатором (router). Анализируя пользовательский запрос и формат входных данных, он решает, кому из экспертов поручить выполнение задания.
Есть два подхода к маршрутизации: жёсткий и мягкий. В первом случае маршрутизатор активирует только наиболее подходящего эксперта, что экономит вычислительные ресурсы.
Второй вариант подразумевает передачу задания всем подходящим экспертам. Каждому из них назначаются веса, с учётом которых составляется обобщённый ответ. Поэтому мягкая маршрутизация требует больше ресурсов, но даёт более точные ответы.
В последние годы популярность MoE растёт, а её применение выходит за рамки больших языковых моделей. За счёт такого подхода модели могут лучше работать при малом обучающем наборе данных. Также расширяется спектр решаемых моделью задач и снижается риск генерации фактически неверного ответа.
Помимо работы с текстом, ИИ-сервисы на базе MoE находят применение в генерации изображений, видеороликов и музыки, а также в рекомендательных системах. Лаборатория искусственного интеллекта компании «Криптонит» тоже применяет MoE в решении задач обработки текста и аудио.
Один из методов машинного обучения называется «дерево решений». Он эффективен для задач классификации и регрессии, с которыми чаще всего сталкиваются при анализе изображений и текстов.
Деревья решений названы так потому, что похожи на древовидные диаграммы. Каждый узел в них соответствует функции (проверяющей какое-либо условие), а исходящие из узлов ветви — это вероятные результаты проверки.
Структуры деревьев максимально наглядны и позволяют проследить ход принятия решений. Но деревья не отличаются стабильностью: даже лёгкие изменения в данных могут привести к существенным изменениям в структуре дерева. Поэтому они часто страдают от переобучения.
Чтобы устранить эти недостатки, был разработан более продвинутый метод машинного обучения на основе деревьев решений — случайный лес (random forest). Это ансамблевый метод машинного обучения, применяемый в основном для анализа медицинских данных, маркетинговых исследований и кредитного скоринга.
Случайный лес комбинирует предсказания нескольких деревьев решений, каждое из которых обучается на случайной подвыборке данных.
В задачах регрессии случайный лес делает предсказание путём усреднения результатов всех деревьев, а в задачах классификации он выбирает вариант, к которому пришло большинство деревьев.
Такой подход повышает точность предсказаний и снижает влияние эффекта переобучения. Однако он требует в разы больше ресурсов и теряет лёгкость интерпретации.
Как-то один из наших коллег (а я работаю в ИТ-компании «Криптонит») услышал забавный разговор в метро.
— Ой, давай не будем стоять в очереди! Вон турникет с оплатой лицом свободный, пошли там пройдём. — Ты что, доверяешь биометрии!? А если твоё лицо украдут? — Там проезд со скидкой 10 рублей. — А, тогда пошли.
Ситуация смешная, но вопрос серьёзный. В России с 2018 года работает Единая биометрическая система (ЕБС). Как любая система, она подвержена атакам, и специалисты внутри ЕБС постоянно с ними борются.
Так как же защищают ЕБС?
Применяют не один вендор биометрических процессоров (они стоят в ядре), а несколько. Это позволяет минимизировать ложные срабатывания; атаки на предъявляемые образцы и всё, что с этим связано.
Проверяют объекты «на живость» (liveness). То есть применяют технологию, которая на этапе идентификации отличает живого человека от маски или дипфейка.
Используют модуль аномалий. Специалисты на стороне ЕБС разработали модуль, который отслеживает аномалии при транзакционном взаимодействии с системой.
Это значит, что «универсального» средства защиты нет, а использовать приходится несколько инструментов одновременно. Именно так выглядит постоянная борьба «белых» специалистов и тех, кто хочет взламывать нейронки.
Об этом на V встрече экспертного сообщества по криптографии и большим данным рассказал руководитель направления по продуктам ИБ от Центра биометрических технологий Илья Александров. Встречу организовал «Криптонит» при поддержке Музея криптографии.
Я уже рассказывала, что главная задача участников — создать DeepFake-устойчивую Face ID-модель. Но что она должна уметь?
Распознавать фальшивые изображения, созданные с помощью DeepFake-технологий, без использования модулей защиты от спуфинга.
Точно сравнивать реальные фотографии одного и того же человека.
Различать снимки разных людей.
А оценивать участников будут эксперты — сотрудники лаборатории искусственного интеллекта «Криптонита»! Попросили их дать напутствие или совет участникам — читайте их ниже.
Георгий Поляков, заместитель руководителя лаборатории искусственного интеллекта
Друзья, рад вас всех приветствовать на нашем хакатоне. Мы постарались придумать для вас любопытную задачу, теперь ваша очередь быть креативными! Пусть ваши идеи будут смелыми, код — чистым, а решения — интересными. Вперёд, к победе
Виктор Подгорский, ведущий научный сотрудник направления обработки речи
Не бойтесь пробовать новые подходы и предлагайте нестандартные варианты. Зачастую именно в них прячется самое подходящее решение задачи!
Азамат Канаметов, специалист-исследователь
Желаю участникам вдохновения, упорства и уверенности в своих силах. Пускай ваши модели будут точными, данные — качественными, а идеи — смелыми. Не бойтесь пробовать новое, учиться на ошибках и искать нестандартные решения
Артём Рыженков, специалист-исследователь
Всем удачи в соревновании и творческого полёта! А пока есть время на подготовку, рекомендую ознакомиться с открытыми решениями по генерации лиц, посмотреть, какие есть открытые модели распознавания. Хотя я верю, вы уже и так готовы, и все у вас получится!
У китайской компании ByteDance был случай. Их стажёр на что-то обиделся и решил саботировать работу: он внедрял зловреды в модели машинного обучения и подменял её чекпоинты. В итоге вся команда два месяца, вместо того, чтобы работать, пыталась понять, что же происходит? Стажёры, не надо так!
А это стажёр сделал вещи, которые заметны. А что если кто-то будет делать то, что незаметно по логам или по метрикам? Например, в модель встроит триггеры и изменит в целом смысл продукта.
Тут вновь встаёт вопрос доверия к искусственному интеллекту и его аудиту.
Что нужно делать, чтобы доверять моделям ML?
так обучать модели, чтобы они были устойчивы к разному классу атак (состязательный шум, состязательные патчи и так далее);
проверять наборы данных на закладки, аномалии; проводить очистку данных;
Доверенной может называться только та система, которая разрабатывалась на платформе с правильной методологией разработки и которая контролирует процесс.
А вот признаки, что этой ML-платформе можно доверять:
правильная методология разработки в ML;
много переиспользуемых инструментов обеспечения доверия;
автоматизация и прозрачность использования инструментов обеспечения доверия;
интеграция со всеми этапами жизненного цикла модели машинного обучения:
появились новые угрозы — появились новые инструменты борьбы.
Пост написан по мотивам доклада Максима Рындина «Роль ПО автоматизации процессов для обеспечения доверия в машинном обучении». Он представил его на V встрече экспертного сообщества по криптографии и большим данным, которую организовал «Криптонит» при поддержке Музея криптографии. Дискуссия была посвящена теме аудита безопасности систем ИИ.
Победи DeepFake! ИТ-компания «Криптонит» запускает соревнование Kryptonite ML Challenge!
Сегодня открылась регистрация на соревнование Kryptonite ML Challenge. Главная задача участников — создать DeepFake-устойчивую Face ID-модель. А призовой фонд — 600 тысяч рублей.
Кто может принять участие?
Молодые специалисты и профессионалы в областях Data Science, Computer Vision, Face Recognition и Metric Learning.
Студенты старших курсов, проходящие обучение по специальностям «Прикладная математика», «Информатика» или «Информационная безопасность».
Участвовать можно как одному, так и в команде до 5 человек. Авторы лучших решений получат возможность стать частью команды «Криптонита»💙
А что вообще такоеаудит искусственного интеллекта? Это процесс, который проверяет, соответствуют ли система ИИ и её алгоритмы безопасным, правовым и этическим стандартам.
Подробнее о требованиях к аудиту рассказал Петр Владимирович Ганелин, советник по стратегии АНО «НТЦ ЦК». Он выступал на экспертном клубе «Аудит безопасности систем ИИ», который организовала ИТ-компания «Криптонит».
Какими качествами должна обладать надёжная система ИИ?
Подотчетность и прозрачность.
Объясняемость. Важно, чтобы пользователь понимал цель и возможное влияние системы ИИ.
Обеспечение приватности. Система ИИ должна гарантировать пользователю анонимность, конфиденциальность и контроль за данными.
Достоверность и надежность. Систему ИИ надо постоянно тестировать и проверять, точно ли она работает так, как было задумано.
Безопасность. Система ИИ не должна приводить к состоянию, в котором человек подвергается опасности.
Устойчивость. Это способность поддерживать регулярную деятельность и предотвращать, защищаться и восстанавливаться после атак.
А на чем именно фокусируется аудит ИИ?
Обычно аудиты обращают особое внимание на:
ввод данных для обучения (источник, качество и достоверность);
модели и алгоритмы ИИ;
общее использование системы ИИ, с кем взаимодействует система, какие вопросы решаются с ее помощью (уровень принятия решений, их контроль уполномоченным человеком).
Какие проблемы есть в вопросах аудита систем искусственного интеллекта?
незрелые или отсутствующие методики (фреймворки), специфичные для аудита ИИ;
ограниченные прецеденты (малый опыт проведения аудитов подобного рода);
неоднозначность определения ИИ (отличие от экспертных систем);
быстрое изменение моделей (дообучение, федеративное обучение);
отсутствие сертифицированных аудиторов ИИ.
Доклад Петра Владимировича Ганелина «Требования к системам ИИ и организация аудита» был на V встрече экспертного сообщества по криптографии и большим данным, которую организовал «Криптонит» при поддержке Музея криптографии. Дискуссия была посвящена теме аудита безопасности систем ИИ.
С точки зрения математики нейронные сети аппроксимируют многомерные непрерывные функции при помощи более простых одномерных.
Проблема точного представления многомерных функций через одномерные ещё в 1900 году была сформулирована немецким математиком Давидом Гильбертом. Она известна как «13-я проблема Гильберта о суперпозициях непрерывных функций».
В общем виде решение этой проблемы описывает теорема Колмогорова — Арнольда. Она показывает, что любую непрерывную функцию нескольких переменных можно выразить с помощью непрерывных функций одной переменной и операции сложения.
Проще говоря, теорема Колмогорова — Арнольда даёт возможность выразить сложные функции как комбинации простых. В машинном обучении на этом строится численная модель, которую дальше можно подстраивать для выражения заданной функции.
Построенная таким способом модель используется при создании так называемых «сверхвыразительных» нейросетей, которые обладают высокой способностью к аппроксимации сложных функций и представлению сложных зависимостей в данных.
Главная особенность сверхвыразительных нейронных сетей состоит в том, что при конечной сложности они способны аппроксимировать достаточно широкий класс непрерывных функций.
Причины сделать нейросети сверхвыразительными:
академический интерес;
поиск универсального инструмента для максимально широкого спектра задач.
Но не всегда рационально использовать мультитул. Часто сочетание специализированных инструментов оказывается эффективнее. К тому же, слишком большая выразительная способность нейросети потребует гораздо более строгого обучения, которое может стать экстремально сложным, создавая проблемы надёжности и безопасности.