Category: образование

Category was added automatically. Read all entries about "образование".

with Cat The Cat

Эксперимент.

А что будет, если мы попробуем приблизить градиент случайными векторами?

(проверяю идеи)

Collapse )

Предел получается в районе обратного корня из 2. Это разумно ожидать. До косинуса, равного половине, мы добираемся за выборку, равную трети от размерности вектора. Четверть - где-то в районе 7%, пятая часть - 4,7%. Снижая скорость приближения, мы можем уменьшить количество вычислений.

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

Мне не нравится градиентный спуск, как его применяют сейчас. Он был придуман, в его современной форме, из-за ограниченности ресурсов (особенно learning rate) и уже довольно давно. У него есть проблемы со значениями и он плохо применим в новых системах (то самое обучение подкреплением). Поэтому я и пытаюсь получить что-то другое. Две вещи, которые мне очень не нравятся, это скорость обучения (learning rate) и обратное распространение ошибок (backpropagation). Обе они подозрительны мне из-за связанной с ними магии - для скорости обучения придумывают вычурные "расписания" (learning rate cosine schedule, например), обратное распространение ошибок требует хитрых приведений (batch normalization, ADAM и тп), чтобы оно обучало более-менее быстро на современных данных.
with Cat The Cat

Про тренировку нейросетей

Итак, у нас есть обычный стохастический спуск по градиенту (ССГ). Это мы вычисляем градиент, сглаженный по порции из нескольких, случайно выбранных, обучающих отсчётов, а потом смещаем наши веса по вычисленному направлению, умноженному на текущий множитель обучения.

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

Для ССГ необходимо несколько проходов по обучающему набору, со случайной выборкой обучающих примеров. Во время прохода множитель обучения меняется от начального относительного большого значения до конечного относительно малого. Выбор множителя и способа его убывания является ремеслом (тут, с картинками, может работать, а вот тут, со словами - может, но много хуже; cosine learning rate schedule - это вот что такое? кому в голову пришло? и почему cosine, а не tangent или hyperbolic?..).

Практически все современные нейросети страдают от исчезающего градиента - чем дальше слой от выхода, тем у него меньше градиент. Некоторые (рекуррентные) страдают от взрывающегося градиента - плохо обусловленная матрица преобразований может привести к экспоненциально большому изменению весов. Поэтому используются разные методы обусловливания градиента. Например, для всех промежуточных слоёв поэлементно считается среднее и среднеквадратичное отклонение для данных из порции и эти статистики загоняются в 0 и 1, соответственно. Это увеличивает градиенты для дальних слоёв и улучшает результаты тренировки. Для рекуррентных сетей используется встречная рекуррентная сеть, которая учится предсказывать предыдущее состояние нашей тренируемой сети, что позволяет начинать тренировку с произвольного места фразы (а не с её начала, где состояние известно) и также обуславливает значения нашей основной сети. Даже квантование способно улучшить результаты, несмотря на потерю информации. Как легко понять, ни один из этих способов не уменьшает количество требуемых для тренировки вычислительных мощностей. Да и выбор способа обусловливания тоже является ремеслом - почему тут работает, а тут работает хуже?

Критикуя, предлагай.

Предложение - тренировать нейросети на всём тренировочном наборе сразу и всегда.

Первое, самое интересное: http://proceedings.mlr.press/v48/taylor16.pdf Смотрите сразу на страницу 8, рисунок 2, правая часть. На нём показаны результаты тренировки на ЦЕРНовском наборе из области физики элементарных частиц высоких энергий для ССГ, который тренируется по части набора, для метода в статье и для метода сопряжённых градиентов. Последние два работают с полным тренировочным набором. Важно в картинке то, что ССГ после полного цикла тренировки с многочисленными проходами по всему набору остановился там, где методы, работающие с полным тренировочным набором, начали.

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

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

Собственно, моя попытка что-то сделать со случайными направлениями это как раз оно - как научиться работать с большими наборами в памяти наилучшим образом и убрать из машинного обучения как можно больше ремесла (нет множителя обучения, нет обусловливания промежуточных слоёв и тп).
with Cat The Cat

Про успех.

К моему предыдущему посту.

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

В моей исходной формулировке веса были представлены частицами с одинаковой массой (равной единице). Поэтому сеть училась, но долго. А когда я добавил возможность иметь произвольную массу при коэффициентах и сделал ее экспоненциально возрастающей от входов к выходам, то скорость обучения возросла. Например, первый шаг обучения в старом варианте уменьшал процент ошибки до 75%, а в новом уменьшает до 53.

Сейчас думаю, как ещё подойти к этой проблеме, чтобы не задавать массы изначально, ведь формула может быть произвольно сложной.
with Cat The Cat

Про Верилог и VHDL, про образование.

Verilog это 1985 год, на два года позже VHDL, который был основан на языке Ada, принятом в 1979 году.

Для понимания - 1978 это год появления алгоритма вывода типов Хиндли-Милнера, когда в его имени появилось второе имя (первое - это 1968 год). Ada появилась через год после появления ML.

Поэтому Ada имеет структурную систему типов (positive это подмножество integer, или unsigned это такой специально ограниченный std_logic_vector (массив)).

Verilog пошёл по ещё более простому пути - он ВСЁ ЗАШИЛ В ЯЗЫК.

В VHDL есть тип std_logic, состоящий из девяти значений - неопределенного, не подключенного, 1 (буквально - подключение к цепи питания), 0 (подключение к земле), короткое замыкание (соединили вместе 1 и 0), питание через сопротивление, земля через сопротивление, среднее напряжение (как если бы мы смотрели на точку, подсоединённую к питанию и земле через резисторы) и "наплевать" (don't care).

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

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

В Верилоге это невозможно.

Не все типы VHDL позволяют соединять два выхода. Например, тип bit (ограничение character: только '0' и '1') так поступать не позволяет. И современная внутрикристальная микроэлектроника тоже не позволяет. Поэтому вы можете написать ядро процессора с использованием bit, bit_vector и соответствующих операций, а периферию описать с помощью std_logic(_vector).

В Верилоге это невозможно. ;)

Вышеуказанное разделение очень важно - положительно, вся современная периферия является аналоговой. Поэтому правильным решением было бы разрешить логику типа bit/bit_vector и периферию моделировать аналогово. Но в во времена создания этих языков на такое не хватило бы всех вычислительных ресурсов мира, поэтому - std_logic и тому подобное.

И если посмотреть на эти языки внимательней, вы поймёте, что такая беда не из-за злого умысла, и не потому, что авторы стандартов не пишут компиляторы. Это потому, что в то время создатели языков не знали и не могли лучшего. При этом создатели VHDL знали чуть лучшее, чем создатели Верилога, которые вообще ленивые сволочи.

А далее изначальные решения проекта языка диктуют направление последующих решений.

Поэтому создавая язык в настоящее время, попробуйте знать лучше, чем средний программист. Как минимум, мне легче будет. ;)
with Cat The Cat

Вот, кстати.

http://www.bbc.com/future/story/20141202-hack-your-memory-learn-faster

Если в поисках решения (или понимания) всегда перебирать всё известное тебе, то помниться будет лучше.

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

И если у моего успеха есть секрет, то это он - думать всей головой и долго, а не быстро выдавать умеренно подходящее решение.

Выводы в статье выше немного не согласуются с "размеренным повторением" (перевод википедии мне не нравится), но общее направление схоже.
with Cat The Cat

Про (само)обучение.

http://www.gwern.net/Spaced%20repetition?2

Краткое содержание: факт (сведения) забывается дольше при повторном его изучении; чем больше повторений, тем меньше вероятность забыть.

Отсюда следует стратегия самообучения: надо исследовать скорость забывания фактов и повторять необходимые факты, когда вероятность их забыть становится достаточно низкой (например, 70%).

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

(соответственно, интересно ввести сжатие информации - изучение обобщения изученных фактов)
with Cat The Cat

Ах! Какая красота!

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

Что интересно.

Американским компаниям запрещено проводить тестирование общего интеллекта (IQ) при приёме на работу. Это запрещено решением суда, дискриминация.

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

За весь этот карнавал платят сами студенты: объём студенческих займов за прошлый год составил 100 миллиардов долларов, а общий долг превысил 1 триллион.

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

(здесь вспоминается распределение выпускников ВУЗов в СССР)

И чтобы два раза не вставать: TSA начала обыски грузовиков и автобусов на предмет взрывчатки и наркотиков. В обсуждении по ссылке есть забавные свидетельства о работе полицейских в США.
with Cat The Cat

Биохимия.

Есть такой нейромедиатор допамин. Это очень забавная штука, в частности она стимулирует стремление к новому, любопытство и улучшает способности к обучению (пусть и у мышей).

Так вот, повышение уровня тестостерона приводит к повышению уровня допамина. У людей. К слову, понижение уровня допамина - -один из признаков болезни Паркинсона.

Получается интересная стратегия: если вы хотите научиться чему-то новому, то лучше повышать уровень тестостерона силовыми упражнениями, если же вы хотите отточить навыки (запомнить что-то лучше), то надо заниматься упражнениями на выносливость.

Хотя тестостерон можно доставлять инъекциями и пилюлями, какие процессы происходят в организме при повышении выносливости, мне неизвестно. То есть, сэкономить получится всего на одном типе занятий. ;)
with Cat The Cat

История десятилетней давности.

В нашей команде работал учащийся МИФИ. Он больше работал, чем учился, поэтому в один прекрасный момент ему потребовалась справка, почему он прогулял довольно большой отрезок времени.

Ему сделали справку из ожогового центра.

Для того, чтобы он вообще попал в больницу, ему требовался ожог второй степени. А это, если мне не изменяет память, не менее 15% площади тела.

Ладонь человека - один процент его поверхности. Всего один процент.

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

Народ у нас был простой и об этой махинации стало всем известно.

А также стало известно женам наших коллег.

И один из нас, Денис Юрьевич, по прозвищу Поручик (потому, что шутил сильно пошло), потом рассказал, что он рассказал про это своей жене и рассказал также, что ладонь - всего один процент кожи. Жена задумалась, а потом стала ладонями прикидывать диаметр и длину паховой области нашего коллеги.
with Cat The Cat

Зачем кричат киай?

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

Весь поединок в каратэ - это подготовка к такому киай.

Собственно, теперь про поединки на экране. ;)

Я застал достаточно большой кусочек Перезагрузки Матрицы, и посмотрел на бои с высоты приобретённого знания. Оказалось, очень интересно.

В каратэ длинные и низкие стойки предназначены для обучения большим перемещениям в время боя. Например, самая первая ученическая ката Шотокан Каратэ-до, Хейан Шо Дан, обучает сопротивляться, не много, ни мало, восьми противникам. Начинается она с шага в сторону в длинную стойку.

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

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

Вот. Теперь смотрим на Перезагрузку.

Нео в работе против большого количества противников делает совсем небольшие шажки. Агенты Смиты и не очень - просто топчутся на месте. Когда показывают Морфея с очередным агентом в профиль, видно, что он или его противник наклоняют корпус вперёд во время ударов рукой. Ни в одном ударе рукой ли, ногой ли, нет работы хары - той самой раскрутки живота, кстати, хару (живот) разрезают (кири) по необходимости, - а без этого можно разве, что мячик пнуть. Да и то, гола ждать не стоит.

На мой не очень образованный взгляд, сцена нарезания якудз Невестой из первого Kill Bill сделана на порядок лучше - ну, в тех местах, где не бегают по мечам и перилам. ;)

Когда она шугает собравшихся в круг японцев - корпус прямой, стойка достаточно длинная для ожидаемых перемещений, сами перемещения - низ живота вперед. Очень хорошо.

PS
Притча.

В школе боевых искусств был не очень умный и не очень способный ученик. Учитель, чтобы отвязатся от его глупых вопросов, всё время отправлял его колотить макивару.

А когда пришла пора поединка с пришедшим злым мастером, победил именно этот глупый ученик, потому, что он действовал, как сказал учитель: бьют рукой - сломай руку, бьют ногой - сломай ногу. Время отработать эти два приёма у него было достаточно.

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

На первых же тренировках-подготовках к соревнованиям он обнаружил, что его одноногость лучше, чем двуногость противников, поскольку ударную ногу он натренировал лучше противников. Как он говорил, за тренировку он может сделать либо 1000 ударов каждой ногой, либо 2000 ударов одной ногой.

Это соображение и привело меня к пониманию важности сохранения прямоты корпуса.