Pull to refresh

Comments 19

UFO just landed and posted this here
Сигмоиды тоже используются, например, в моей работе. Думаю, с их помощью, проще приближать сетью сложные многоэкстремальные данные — возможно, меньше нейронов требуется.
UFO just landed and posted this here
Иногда занимаюсь ускорением личных научных расчетов в области аэродинамики и сжатием полученных данных, собственно, именно там нейронные сети и применяю.
UFO just landed and posted this here
UFO just landed and posted this here
… например, если она вычисляется многократно, в двойном или тройном цикле. Пример такой задачи: численное решение задачи аэродинамики на сетке...
Неявно таким образом работает вообще любая сверточная сеть.
без существенных потерь в качестве
Делать такой вывод на основе сети из 3х8 нейронов мягко говоря сомнительно.
Ведь вы же не оценивали качество и скорость обучения этой сети для реальных задач.
Подозреваю, что с уменьшением (огрублением) точности при подобном способе оптимизации могут возникнуть проблемы с величиной ошибки при процедуре обучения большой сети.
Такой эффект может быть незаметен для небольшого количенства данных, но для реального применения может не иметь смысла, т.к. потребует дополнительных эпох обучения для компенсации уменьшения точности расчета.
А что вам мешает представить результат вычисления сигмоидальной функции в виде таблицы с любой желаемой точностью? Быстрее этого уже вряд ли выйдет.
В посте представлен лишь один из вариантов оптимизации. Возможно, есть и более быстрые/точные методы.
Конечно есть — например представить всю сеть в целочисленной форме, выбрав масштаб всех аргументов таким образом, чтоб в функции активации при табличной интерполяции в принципе устранить все деления и построить ее лишь на целочисленных умножениях-сложениях. Обычно так делают когда реализуют сетку на слабом железе или без FPU.

А если нет ограничений по памяти — можно просто таблицу сделать огромного размера и убрать интерполяцию.
Определение нужного элемента в таблице все равно требует 3-5 операций процессора, это как минимум. И ещё — Вы, возможно не обратили внимания, после замены экспонент полученная функция символьно упрощается, это даёт дополнительный выигрыш, который одним табулированием экспоненты не получить.
Да но это уже простые умножения-деления — в целом они быстрее, хотя конечно в определенных случаях могут стать даже медленнее. Но зато мы имеем строго запрограммированную потерю в качестве и не трогаем активационную функцию. А если вы меняете функцию — возникает вопрос, почему не на такую.
Можно попробовать немного пожертвовать качеством за счет выигрыша в скорости, приближенно заменив расчет классической активационной функции на расчет более простой функции, которая (на имеющихся входных данных) дает примерно те же результаты. Это, вообще говоря, классическая задача интерполяции: имеем набор значений, вычисленных исходной функцией A(s), и подбираем более простую функцию, которая дает очень похожие значения.


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

Другое дело, что функция активации — одномерная, можно например делать приближение не по набору точек, а по всей вещественной прямой, что вроде как возможно. Но вроде как методологически вернее просто брать простую функцию уже на этапе обучения, как например уже писали про ReLU.
Но вроде как методологически вернее просто брать простую функцию уже на этапе обучения, как например уже писали про ReLU

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

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

Ну вот вы сами об этой проблеме пишете. Зачем же было тогда от сигмоид возвращаться обратно к полиномам (пусть и с отрицательными степенями, степенями кратности 1/2)? Вообще из статьи не очевидны некоторые существенные детали, например если вы обучали и тестировали нейросеть на одних и тех же данных, тогда результат вообще не имеет никакой ценности.
Нейросеть на ReLU не может превратиться в полином хотя бы потому, что ReLU — недифференцируемая функция

По-моему, как раз может. На линейных положительных участках ReLU имеет вид y = x. Тогда на выходе y нейрона первого слоя имеем y = сумма w1*x, на выходе нейрона второго слоя имеем z = сумма w2*y =сумма w2*(сумма w1*x). Чем не полином, если скобки раскрыть?
Зачем же было тогда от сигмоид возвращаться обратно к полиномам (пусть и с отрицательными степенями, степенями кратности 1/2)

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

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

Чем не устроили существующие решения? Или же просто было интересно написать свой Common subexpression elimination?
Да, было интересно написать и тщательно распараллелить, чтобы задача в-целом считалась как можно быстрее. Кстати, там чуть сложнее, чем просто вынесение common subexpressions — после всех подстановок упрощенных активационных функций в общую нейросетевую функцию обычно получается громоздкое алгебраическое выражение, которое последовательно приводится к дроби, где и числитель и знаменатель — полиномы (от множества переменных), и делается попытка, если возможно, символически поделить полином на полином.
Sign up to leave a comment.

Articles