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

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

with Cat The Cat

Увидел у ru_teacher.

https://demkristo.livejournal.com/3535337.html - про травлю детьми детей и взрослых.

Я вспомнил "Республику ШКИД", там это хорошо разобрано, как и почему.

Условно, если нет занятия интересней, то будет и травля тоже. Такое "интересное занятие" может быть обеспечено родителями или самим учителем ("а вот что такое глобус, вам сейчас и расскажет Светлана Ивановна").
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% площади тела.

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

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

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

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

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