Category: it

Category was added automatically. Read all entries about "it".

with Cat The Cat

Не йронки.

https://github.com/thesz/higgs-logistic-regression

Взял HIGGS dataset, натравил на него логистическое приближение (logistic regression) с оптимизацией методом последовательно перевзвешенных наименьших квадратов (Iterated Reweighted Least Squares) и получил для всего 29 коэффициентов точность, сравнимую с точностью нейронки с одним скрытым слоем в 300.

После чего взял, и добавил к исходным значениям ещё и их квадраты (соединив вектора входов и квадратов). Использовал тот же метод и получил точность в 66%. На 57 коэффициентах.

Вопросы? ;)
with Cat The Cat

Связь.

"Стоимость исправления дефекта программы пропорциональна времени между внесением дефекта и его обнаружением" переводится на русский язык, как "взял и попользовался - положи на место, другим и тебе проще будет".

Навело воспоминаниями про серию push ax/push bx/push cx и соответствующие pop cx/bx/ax в статье TechHelp (гипертекстовая программа помощи по MSDOS) про резидентные программы, что ли. Там к этим сохранениям-восстановлениям был комментарий "good housekeeping".
with Cat The Cat

Про word2vec.

Word2vec это способ вычисления "вложений" (embeddings) для слов, основываясь на их окружении в тех местах, где они встречаются.

Его можно считать прямым использованием "дистрибутивной семантики" - смысл слова определяется его типичным окружением.

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

Есть два режима использования word2vec - предсказание непрерывного словесного окружения по слову (continuous skipgram) и предсказание слова по непрерывному словесному окружению (continuous bag of words, CBOW). В первом случае мы по слову предсказываем несколько слов из его окружения, во втором случае мы предсказываем слово по нескольким словам из окружения.

В первом случае у нас на входе слово, закодированное 1-из-N, на выходе - несколько слов, закодированных 1-из-N (softmax) или "кодированный двоичным кодом индекс слова по порядку возрастания частоты" (несколько сигмоидов на слово). Во втором случае у нас на входе сколько-то слов, кодированных так или эдак, на выходе - 1-из-N (softmax).

В первом случае вложения это строки матрицы первого полностью связного преобразования (прошу обратить внимание - там было 1-из-N), во втором случае вложения это строки матрицы второго полностью связного преобразования (снова 1-из-N).

(интересно здесь то, что "начало фразы" и "конец фразы" могут быть словами словаря и для них также может быть вычислены вложения)

Что интересного в этих вложениях?

Если использовать расстояние по косинусу угла между вложениями, то сходные слова будут расположены близко друг от друга. В частности, кластеризация через k-means (которая в исходном пакете word2vec есть из коробки) для предсказания окружения по слову давала интересные классы слов - в одном были прилагательные одного склонения, в другом - другого, и кластера слов ещё и делились по смыслу - вот в этих классах про положение на карте, а вот в этих про бытовую и электронную технику. Что интересно, разные режимы тренировок давали разные кластера и, по словам статьи, отличаются точностью решения языковых задач.

В исходной статье про word2vec давался алгоритм решения простых аналогий: чтобы вычислить "А относится к Б, как В относится к Х", надо было решить простую задачу Х=БлижайшееПоКосинусу(Вложение(Б)-Вложение(А)+Вложение(В)).

Товарищи из Фейсбука пошли чуть дальше (fasttext). В их работе слова разбиваются на части и вложения вычисляются не для слов, а для частей (n-grams - слово "будда" может быть разбито на триграммы "^бу", "удд", "дда" и "да$"). Вложение слова вычисляется простой суммой вложений частей. Таким образом, если для редко (менее 5 раз, обычно это в районе половины процента корпуса, опечатки и тому подобное) встречающихся слов word2vec не мог определить вложения, то фейсбучный подход позволяет и вложения определить, и сами слова использовать для вложений.

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

Можно сделать извлечение смысла, вычисляя вложение текста (например, сверточными сетями) и вычисляя из вложения текста краткое его содержание (encoder-decoder). На входе много слов текста, на выходе вектор размера M (вложение текста), из которого как-то (хоть простым полностью связным слоем) вычисляется несколько векторов-вложений слов смысла текста (см. выше про вложения для "конца фразы").
with Cat The Cat

На память.

https://concatenative.org/wiki/view/Exotic%20Data%20Structures

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

Меня там особо интересует массив, разбитый на √N подмассивов, это самая первая часть раздела. На нём можно оптимально (по словам авторов) реализовать очередь с сортировкой (priority queue), а это открывает интересные возможности.

Ещё в этой структуре количество разбиений √N, что роднит её с прозрачными-для-кеша (cache-oblivious) структурами данных (некоторыми, не всеми).

PS
Твиттер мне перестал нравиться, как средство выражения мыслей. Надо больше писать сюда.
with Cat The Cat

Современное программирование.

В течении лет шести-семи в начале моей трудовой деятельности моим предпочтительным инструментом был ассемблер, конкретно, Turbo Assembler. Практически всё я писал на ассемблере и до сих пор горжусь выводом сжатых изображений с кодированием последовательностей (не)прозрачности для VGA - код не использовал переменные на стеке, даже сохранения регистров на стеке не было, да и данных надо было пересылать меньше.

Так вот.

Современные технологии недалеко ушли от моего любимого tasm.

Если там я следил за регистрами, то сейчас я слежу за другими эффектами - cudaMallocManaged((void**)некий_массив_объявленный_static, ...) из последнего приключения в субботу, в процессе перевода программы на Си в программу на CUDA.

До этого был язык Regent, где надо было понимать, что это такой код на Lua, а не декларативное описание решения задачи. До этого Legion на C++. До этого ANTLR4, который сваливался до скорости синтаксического разбора в 4 килобайта в секунду (!!!), если ему не нравилось то, как грамматика языка используется программистами. И C#, который не умел видеть сквозь функции высших порядков.

И так далее, и тому подобное.

В современном Хаскеле это тоже присутствует, только больше в инфраструктуре, чем в языке. Хотя и язык тоже добавляет радости: "Haskell is very pragmatic language. You have to startyour program with at least dozen of LANGUAGE pragmas". Вот зачем специально надо разрешать вывод любых реализаций для newtype? Чему мешает постоянное включение этой возможности?

Не то, чтобы я жаловался - это же часть приключения. Как расследование преступлений Джека Потрошителя обязательно должно включать в себя путешествие по лондонской канализации, так и программирование должно включать борьбу с эффектами разного рода, от проблем языков программирования до разбора FIX.

Просто наблюдение.
with Cat The Cat

Блокчейны

Вдогонку к предыдущему.

Большинство БЧ, что я рассматривал (не скажу, чтобы много) грешат спешкой "надо урвать деньги инвесторов". В результате допускаются довольно грубые ошибки или не рассматриваются интересные вещи (снижение гарантий безопасности при разбиении или вообще возможность осуществления разбиений, например).

Исключение составляет bitcoin, одно из. Ну, он один из первых и довольно дубоват. Это понятно, поскольку до него никто ничего такого не делал.

Второе исключение - Avalanche. Этот интересен тем, что блокчейн-как-всё-на-свете у него вторичен (последний протокол из пачки), а консенсус достигается практически без использования шифрования.
with Cat The Cat

Блокчейны

Познакомили меня коллеги с системой Ergo: https://ergoplatform.org/en/

Общее описание вот тут.

Интересна она тем, что она основана на "доказательстве работы" и алгоритм использует секретный ключ (sk) добытчика для вычислений доказательства. Использование секретного ключа должно гарантировать невозможность создания кооперативов по выработке доказательств.

Внутри алгоритм выглядит вот так, примерно:

1. Создаём пару секретный-открытый ключи w и x (x - секретный)
2. Сперва просчитываем массив размером в N=226 элементов. Вычисляется он на основе открытого ключа добытчика pk и w.
3. Крутим цикл:
4.   вычисляем одноразовый номер
5.   на основе криптосуммы текущего блока и одноразового номера получаем k=32 индекса в массиве, вычисленном на шаге 2.
6.   считаем дельту d=(сумма по i=1..k (массив[i-й индекс в массиве] * x) - sk) mod q
7.   если дельта меньше порога b, возвращаем кортеж из (криптосумма блока, открытый ключ добытчика, w, одноразовый номер, дельта)
8.   продолжаем цикл

Мы можем представить вычисление выше, как отображение из списка одноразовых номеров в список элементов Maybe (кортеж результата). Далее обычный scanl позволяет получить результат.

Чем это ценно?

something `mappend` otherthing для значений из Maybe a, где a имеет фиксированный размер в битах (как в алгоритме выше) может быть представлено схемой - дополняем кортеж одним битом со смыслом "есть данные" и далее производим выбор варианта с данными с помощью функции выбора.

Чем ценно это?

Если мы можем представить вычисление (или часть его) в виде схемы, мы можем применять гомоморфное шифрование - побитовые операции над шифрованными данными.

В частности, в алгоритме выше надо гомоморфно шифровать шаги 6 и 7. Членам кооператива добытчиков надо раздать шифрованные x и sk, и предоставить константы 0 и 1 для представления на вход гомоморфных вычислений данных, вычисленных обычным способом (массив, индексы, результат выборки из массива).

Что это означает?

Это означает принципиальную возможность создания коллектива добытчиков. Мы раздаём членам коллектива шифрованные данные, и они производят вычисления по нескольким итерациям цикла и отдают результаты (свёрнутые с помощью mappend) владельцу кооператива. Последний расшифровывает данные и формирует доказательство, если оно было вычислено.

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

В общем описании системы про гомоморфное шифрование упоминаний нет.

Вдогонку - если использовать bit-sliced представление для выполнения гомоморфно-шифрованных вычислений, то просто на ровном месте можно получить ускорение в пару-пяток десятков раз. Это делает предложенный метод ещё более вероятным, не говоря уж про ASIC.
with Cat The Cat

Просуммирую опыт.

Современное состояние дел с программированием на Haskell чрезвычайно и требует скорейшего вмешательства высших сил.

Наличие cabal файлов и составление проектов из них, вкупе с текущей реализацией самого cabal, делает невозможным программирование с исследованием (exploratory programming). Потому, что вы, сделав cabal (new-)repl в текущем проекте, не можете простым образом загрузить файл из проекта, который использован в зависимостях вашего проекта.

В переводе на русский, если ваш проект содержит ссылку на проект abanamat с Control.Abanamat, который использует Funck.Russian из проекта funcking-i18n, то вы не можете выполнить ":m Funck.Russian" напрямую - надо переходить в другой проект. Таким образом, для понимания работы требуется больше движений, чем надо.

Так же, cabal местами чрезвычайно "последовательный". Из недавнего - я ждал порядка 15 минут окончания выполнения тестов happy, а ещё через некоторое время - окончание тестов alex, тоже заметные минуты. В это время ничего не собиралось. Ну, и даже на ноутбуке с 16Г памяти надо ограничивать параллельность оного кабала - иначе вы в обязательном порядке напоритесь на работу нескольких сборщиков (ld - он долгий!) одновременно, что вызовет откачку памяти и неработоспособность системы в целом. Приятная такая вишенка на торте.

Теперь перейдём к определению зависимостей внутри пакетов. На самом деле никого не интересует, какая версия у пакета. Интересна функциональность. Есть ли у функции sdL из пакета butic второй параметр с типом Zefirity, или нет? А что, если в версии 0.1 он был, потом, в версиях с 0.2.3 до 183.7.15.144 включительно его не было, а в версии 192.6 он снова появился? Надо ли мне ограничивать версии пакетов с помощью связей вида butic >= 192.6 || butic < 0.2.3? Или мне надо указать, что в sdL второй параметр должен иметь тип Zefirity? Или, вообще, "вот такой тест должен выполняться".

Я очень странно себя чувствую. Вроде бы, по всем ощущениям не Хаскель начала 2000-х, но, почему-то, я всё равно продуктивен. Но от ощущения "я мог бы и больше" избавиться не удаётся.
with Cat The Cat

Интересный опыт

Принял участи в телеграммном обсуждение под заголовком Haskell.

Покинул последнее по следующим причинам:

1. слишком часто отвлекался на обсуждение само по себе;
2. слишком часто принимал участие в обсуждении чего-то, что не могло принести пользу читателям;
3. мой комментарий со смыслом "используя Хаскель, как средство обучения, можно узнать много нового и, в результате, получать большую зарплату" был расценён некоторыми участниками обсуждения, как известный мем "сперва добейся" и даже появились призывы к бану.

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

Я думаю принести пользу как-то ещё.