Числовой… Вычислительный…? Ага. ЛА. Но машина делает свою работу.

Помимо Передового глубокого обучения, часть 2, я только начинаю Вычислительную линейную алгебру Рэйчел Томас. И, как и в случае с курсом глубокого обучения, я думаю написать здесь серию заметок по курсу. Во-первых: почему?

Я начал свое техническое образование с Линейной алгебры UT5.02x профессора van de Geijn: Основы границ на edX, и в конце он упомянул о своем классе числового обучения в Лос-Анджелесе в UT Austin. В то время я был просто взволнован тем, что могу быть готов начать инженерный курс на уровне магистра, но продолжил заниматься более непосредственной / практической работой. Перенесемся на неделю назад, когда я увидел объявление о курсе Comp-LA на сайте fast.ai. Есть часть меня, которая хочет пойти прямо вверх по Гейзенбергу и раствориться в исследованиях. В то же время остальная часть меня хочет знать: где это вписывается в общую картину?

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

Первая мотивация заключается в том, что вычислительная (также известная как числовая) линейная алгебра - это то, что заставляет глубокие нейронные сети работать. Слои матричных умножений обновляются через цепное правило исчисления в форме SGD. Хорошо, так что в будущем, если я захочу лучше контролировать свои «нейронные» модели, или если я захочу реализовать какие-то безумные идеи, может быть полезно знать, как все работает под капотом. Но есть еще кое-что:

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

Я действительно не могу переоценить, насколько велик был для меня приведенный выше пример. Не только потому, что еда хорошая. Потому что именно здесь все произошло. Лекция Джереми Ховарда (L4) на тему Практическое глубокое обучение о встраивании, о том, как LA настолько неотъемлемая часть ИИ, и просто ... насколько это легко. Затем все пошло на убыль, я стал думать о том, как все эти вещи + другие алгоритмы можно объединить для создания действительно мощных систем.

Это сложная задача, которую нужно решить вручную. Даже с компьютером и калькулятором: это утомительно и легко ошибиться - а что, если сопоставить от десятков до сотен? Тысячи?

Просто добавьте их в Dot-Product. Вы получаете свою матрицу бюджетов и выбираете самые маленькие. Ага.

Подождите, а как насчет гигантских разреженных матриц, которые превратят ваши RAM и C / GPU в марксистов? О, есть алгоритмы, которые оптимизируют для них ... ну, это становится интересным.

Но это еще не все.

Итак, приступим.

ПРИМЕЧАНИЕ: лекция - это гораздо больше, чем описано выше. На ум приходят такие важные вещи, как Halide Talk, написание кода для оптимизации локализации ЦП / ОЗУ и распараллеливания более эффективно, чем это делается вручную на C ++, потому что простота позволяет выполнять больше итераций ... это открыло глаза. Часть, посвященная числам / арифметике с плавающей запятой и их хранению, в частности: IEEE Арифметика с двойной точностью (числа с плавающей запятой более точны, ближе к нулю. Ariane 5 или что происходит, когда вы пытаетесь уместить 64-битное число в 16-битную память (спойлер: Бум) и многое другое.

[черновик завершен 1 августа 2017 г.]