?

Log in

Discreet · and · not · discrete.


Do you want to crack jokes about it or do you want me to go?

Recent Entries · Archive · Friends · Profile

* * *
Вчера потребовалось мне иметь неизменный словарь, который можно обновлять небольшими частями и иметь несколько очень похожих (500 тысяч одинаковых и 5 разных записей) словарей.

Так вот, в Тикле заявлен неизменяемый dict, с подходящим интерфейсом. Но он сделан на хэш-таблице и, поэтому, небольшое изменение словаря приводит к копированию таблицы. Каковая для словаря в 500 тысяч записей обязательно большая.

В результате сложность моего алгоритма получилась O(n^2), а могла бы быть O(nlogn). Что было заметно уже на ~20 тысячах записей, кстати. Обработка новой записи требовала секунды! До 500 тысяч я бы добрался к концу следующего месяца, если бы добрался.

В Питоне же вообще ничего похожего нет, а если и есть (в проекте), то опять на обычном словаре на хэш-таблице с копированием.

Господа!

Даже Clojure выступила лучше. Там словари на HAMT, что и быстро, и разделяемо. С 2009 года, что позже dict, но для столь популярного языка, как Питон, примерно равно началу времён.
* * *
...почему практически весь AI сейчас это "глубокое обучение"?

Из более-менее современного только MatrixNet Яндекса может работать не с нейронками.

* * *
* * *
https://gcc.gnu.org/gcc-7/changes.html

"AddressSanitizer gained a new sanitization option, -fsanitize-address-use-after-scope, which enables sanitization of variables whose address is taken and used after a scope where the variable is defined: ..."

Так что вот так-то вот.

Ещё OpenMP в этой версии умеет переносить вычисления на GPGPU.
* * *
* * *
* * *
Случайный лес с произвольными плоскостями разбиения, получаемый непрерывной оптимизацией.

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

Очень интересно.
* * *
Код тут. Перцептрон сейчас не работает, а PenDigits (тренировка на задаче pendigits) как-то пытается сойтись.

Идея вот какая.

Я могу сформулировать Лагранжиан для материальной точки с массой 1, где координаты это веса нейронной сети: L(w)=E(w) - ((d/dt)w)2/2

E - это потенциальная энергия. Она определяется, как вычисление квадрата разности функции нейронной сети и ожидаемого ответа сети: E(w)=Σj(F(w, xj)-yj)2 Здесь j - это индекс пары векторов входа (x) и выхода (y). Сама функция F(w,x) тоже векторная.

Соответственно, можно вычислить частные производные и так далее, прямо как написано в Ландау и Лившице, первом томе.

Далее нам надо вычислить шаг "времени" - веса у нас будут функциями от времени (рядами), как и "потенциальная энергия" системы (которую мы стараемся уменьшить). Вычислив шаг, который приведёт к ошибке вычислений не более, чем на заданную константу, мы можем обновить веса. Обновлённые веса должны привести к уменьшению E.

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

Сейчас думаю, как ускорить сходимость, это во-первых. Сейчас шаг по времени приводит к улучшению точности предсказаний, примерно, на половину-один процент. Что медленно. Я уже написал и проверил использование весов в формуле потенциальной энергии, но можно (и нужно) его улучшить, и я примерно знаю, как.

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

Полная ерунда получается.

Пробую разобраться с нейронными сетями путём написания их обучения необычным образом.

Перцептрон обрабатывается хорошо, а вот "рукописные цифры" уже плохо.

* * *
...понял, что умничанье может быть не только в литературе.

Очень неприятное место. Слишком много Лебедева.

* * *
* * *
* * *

Previous