Backpropagation is a leaky abstraction (2016) 🔥 Горячее
Карпати утверждает, что понимание обратного распространения ошибки (backprop) критически важно, несмотря на автоматизацию в фреймворках вроде TensorFlow. Он называет backprop "утечкой абстракции" — опасно верить, что просто соединяя слои, можно "магически" обучить сеть. Студенты курса CS231n жаловались на ручную реализацию backprop в numpy, но Карпати настаивает: без понимания математики невозможно диагностировать проблемы обучения.
Яркий пример — сигмоидные функции. При плохой инициализации весов сигмоиды "насыщаются" (выходы близки к 0 или 1), делая локальный градиент z*(1-z) равным нулю. Это полностью останавливает обучение. Даже при нормальных условиях градиент сигмоиды не превышает 0.25 (при z=0.5), что означает его 4-кратное ослабление при каждом проходе. Для сетей с сигмоидами нижние слои учатся значительно медленнее верхних.
Комментарии (131)
- Обсуждение вращается вокруг статьи Карпати "Yes, you should understand backprop" и его тезиса о том, что понимание backprop важно, даже если вы никогда не будете писать его вручную.
- Участники спора сомневаются в ценности этого подхода, указывая на то, что современные фреймворки и высокоуровневые абстракции делают знание деталей неактуальным.
- Некоторые участники подчеркивают, что даже если вы не будете реализовывать backprop вручную, понимание принципов работы оптимизаторов и функций активации важно для отладки и проектирования моделей.
- Обсуждение также затрагивает вопрос о том, насколько важно понимать детали, когда вы пользуетесь высокоуровневыми инструментами, и какие уровни абстракции считаются приемлемыми.
- В конце концов, спор сводится к тому, что хотя фундаментальное понимание важно, но не стоит забывать, что большинство практических задач будут решаться с помощью высокоуровневых инструментов и фреймворков.
RustGPT: A pure-Rust transformer LLM built from scratch 🔥 Горячее 💬 Длинная дискуссия
RustGPT
Трансформерная языковая модель, полностью написанная на Rust.
Комментарии (170)
- Проект представляет собой реализацию LLM (языковой модели) на Rust "с нуля" как учебный эксперимент для понимания принципов работы.
- Отмечается читаемость и лаконичность кода по сравнению с большими фреймворками вроде PyTorch/TensorFlow.
- Обсуждаются технические детали реализации: использование констант из
lib.rs, структура трансформерных блоков, применение крейтовndarray,rand. - Поднимаются вопросы о данных для обучения: источник, объём (в проекте используется небольшой встроенный набор), возможности для непрерывного обучения.
- Упоминаются проблемы и сложности: отладка backpropagation, отсутствие GPU-ускорения, потенциальная неэффективность реализации.
- Высказываются мнения о экосистеме: преимущества
cargoнад "dependency hell" в Python, но и риски лёгкого включения зависимостей. - Обсуждаются возможные улучшения: добавление численного тестирования градиентов, лицензии, GPU-акселерация, бенчмарки.
- Проект сравнивают с другими аналогичными реализациями на Rust и Zig, а также с кодом, сгенерированным ИИ.
- Отмечается впечатляющая скорость генерации первого токена и простота запуска (
cargo run).
The maths you need to start understanding LLMs 🔥 Горячее
- Векторы и матрицы: LLM всё превращают в вектора; главное — скалярное произведение и умножение матриц.
- Softmax: превращает логиты в вероятности; температура регулирует «уверенность».
- Градиент и производная: показывают, как чуть изменить вес, чтобы ошибка уменьшилась.
- Цепное правило: позволяет распространить ошибку через слои; сердце backprop.
- Эмбеддинги: строки → векторы; чем ближе векторы, тем похожее значение.
- Attention: Q·K^T выделяет релевантные токены; V несёт смысл; маска прячет будущее.
- MLP в трансформере: два линейных слоя с ReLU; увеличивает выразительность.
- LayerNorm: стабилизирует распределение после каждого подслоя.
- Позиционное кодирование: добавляет «адрес» токену, иначе порядок теряется.
- Лосс (cross-entropy): средняя «удивлённость»; оптимизатор (Adam) крутит веса.
Дальше — только масштаб: больше слоёв, голов, данных и видеокарт.
Комментарии (106)
- Физики и математики вспомнили, что знание тензорного исчисления, линалгебры и энтропии пригодилось для понимания backprop и LLM.
- Практика: «смотреть» Karpathy недостаточно — нужно кодить за ним; его курс даёт базы и уверенность копать дальше.
- Книга «Build a Large Language Model (from Scratch)» идёт шаг-за-шагом, но объясняет только вычисления, а не «почему это вообще работает»; explainability всё ещё исследуется.
- Путаница: эмбеддинги ≠ вся модель; они лишь вход для трансформера, внутри которого 1,8 трлн параметров и «чёрный ящик».
- LLM — логит-генераторы с неизбежной неопределённостью; цепочки моделей накапливают ошибку и быстро «ломаются» без человека-оркестратора.
- Для 99 % разработчиков хватает линалгебры, softmax, градиентов и PyTorch; остальное — инженерия данных, трюки и эксперименты.
Who Invented Backpropagation?
Кто изобрел обратное распространение ошибки (backpropagation)
Современный backpropagation (BP) впервые опубликовал в 1970 г. финский магистрант Сеппо Линнайнмаа [BP1][R7]; 2020 г. отмечали 50-летие метода. Предшественник — работа Келли 1960 г. [BPA].
BP — это обратный режим автоматического дифференцирования: стоимость вычисления градиента примерно равна стоимости прямого прохода. Линнайнмаа дал алгоритм для произвольных разреженных сетей и привёл код на FORTRAN; все современные фреймворки (TensorFlow и др.) опираются на его метод.
В 1960-е уже применяли цепное правило Лейбница для градиентного спуска в многослойных системах (Келли, Брайсон, Дрейфус и др.), но без учёта эффективности для разреженных сетей.
Первое применение BP к обучению весов нейросетей — Дрейфус 1973 г.; первое NN-специфическое описание — Вербос 1982 г. [BP2] (в диссертации 1974 г. его ещё нет).
Уже в 1967 г. Амари с учеником Сайто обучал пятислойный перцептрон SGD, получая внутренние представления; это было глубокое обучение задолго до 1980-х. Параллельно Ивахненко строил глубокие сети GMDH (с 1965 г.).
К 1985 г. вычисления подешевели в 1000 раз; Румелхарт и др. показали, что BP формирует полезные скрытые представления.
Комментарии (86)
- Суть спора: кто «изобрёл» backpropagation — Хинтон/Румелхарт (1980-е) или она была раньше в теории управления и автоматическом дифференцировании (1960-е, Kelley, Amari и др.).
- Большинство участников считают, что это лишь эффективное применение цепного правила, которое переоткрывалось множество раз.
- Юрген Шмидхубер подаётся как главный «скептик», обвиняющий академическое сообщество в игнорировании более ранних работ.
- Некоторые подчеркивают, что решающим стало не само «изобретение», а переход к GPU и масштабируемым фреймворкам в 2010-х.