Быстрая альтернатива степени числа - страница 2

 

Urain:

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

Почему не в том? В том:

Желтая - последняя в списке на графике.

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

здесь A-коэффициентах угла атаки. Во все остальные формулы типа sigmoid abs  ,  sigmoid new не так то легко встроить этот коэффициент а ведь с этого же всё началось, Коэф в функции активации это основное что тебе нужно? или тебе просто нужна функция делающая нелинейное преобразование?

Мне нужна быстрая нейронная сеть с нейронами, имеющими нелинейное преобразование.

TheXpert:

:) А теперь посчитаем.

допустим, в сети 80 входов, 200 на скрытом слое, 5 на выходе, сигмоиды только на скрытом слое, простой 3-слойный персептрон.

Распространение сигнала = O1 (80*200 + 5*200) = О1(85*200), преобразование сигнала = О2 (1*200).

Итого, получаем, чтобы цифры были равнозначны, функция вычисления степени должна быть в 100 раз дороже (примерно) чем умножение + сумма. Тогда получим выигрыш в 2 раза, если ускорим функцию в 100 раз. Впечатляют расчеты?

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

Воистину преждевременная оптимизация зло.

Ты прав. Такими простыми ухищрениями, которые предпринял я, особого выигрыша в скорости не добиться. Выход - распараллеливание алгоритма сети (CPU или лучше GPU).

 
joo:

Почему не в том? В том:

Желтая - последняя в списке на графике.

...

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

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

Хотя может я забегаю вперёд и такая задача у тебя пока не стоит, но она появится в последствии уверен.

ЗЫ кстати ты ограничил окно от -1 до 1 расширь горизонатль больше и увидишь много нового об этих функциях. Это конечно не актуально если ты предварительно будешь нормализовать данные, но вот классика потянет и без нормализации а новые формулы загнутся.

 

Urain:

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

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

Хотя может я забегаю вперёд и такая задача у тебя пока не стоит, но она появится в последствии уверен.

Я тебя понял. И  о коэффициенте кривизны знаяю/помню/применяю. Вот в последней как раз формуле какие коэффициенты не подставляй, нужной кривизны добиться не удастся. А вот в этой

3*х/(1+|x|+x*x) легко.

ЗЫ кстати ты ограничил окно от -1 до 1 расширь горизонатль больше и увидишь много нового об этих функциях. Это конечно не актуально если ты предварительно будешь нормализовать данные, но вот классика потянет и без нормализации а новые формулы загнутся.

Расширял, знаю. Удобство как раз в том, что формула имеет нужную кривизну и значения функции в диапазоне -1 до 1.

Сделал так:

if (x>-1.0 && x<1.0)
    HiddenLayer1[i]=3.0*x/(1.0+MathAbs(x)+x*x);
else
{
    if (x>1.0)
        HiddenLayer1[i]=1.0;
    if (x<-1.0)
        HiddenLayer1[i]=-1.0;
}

Как видишь, из диапазона не вылезает. А то, что дальше -1,1 мне не интересно. :)

 

вот, с разными коэффициентами:

Короче, овчинка выделки нифига не стоит. Легче работать по старинке, и всю эту старинку перебросить в дэлээлку.

 
joo:

вот, с разными коэффициентами:

Короче, овчинка выделки нифига не стоит. Легче работать по старинке, и всю эту старинку перебросить в дэлээлку.

раздвинь горизонтальный масштаб от -20 до 20
 
joo:

Вычисление степени числа очень ресурсоемкая задача.

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

Первое, правда и последнее, что пришло на ум, заранее рассчитать функцию с достаточно для практического применения мелким шагом на заданном диапазоне чисел:

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

Есть ли какие нибудь более быстрые способы расчета степени числа с заданной наперед точностью?

ИМХО, математический сопроцессор (а именно он вычисляет степень числа, вернее, должен вычислять) вычислит все намного быстрее, чем любые ухищрения.
 
Urain:
раздвинь горизонтальный масштаб от -20 до 20
Зачем? У меня сигнал в каждую функцию активации ограничен диапазоном [-1;1]. Зачем расширять горизонтальный масштаб, если функция никогда не работает при аргументах вне диапазона [-1;1]?
 
Dima_S:
ИМХО, математический сопроцессор (а именно он вычисляет степень числа, вернее, должен вычислять) вычислит все намного быстрее, чем любые ухищрения.
Математический сопроцессор штука конечно хорошая, но считает степень в десять раз медленнее, в приведённых формулах. Но дело, как оказалось, не в скорости вычисления степени.
 
joo:
Зачем? У меня сигнал в каждую функцию активации ограничен диапазоном [-1;1]. Зачем расширять горизонтальный масштаб, если функция никогда не работает при аргументах вне диапазона [-1;1]?

Вот тут ты не прав, аргументом функции активации (те горизонтальная шкала на твоём графике) выступает сумма перемноженных входов и весов и этот аргумент легко вылетает за облать -1:1

ЗЫ а вот выход из функции активации (ось Y) конечно будет в заданном диапазоне.

 
Urain:

Вот тут ты не прав, аргументом функции активации (те горизонтальная шкала на твоём графике) выступает сумма перемноженных входов и весов и этот аргумент легко вылетает за облать -1:1

ЗЫ а вот выход из функции активации (ось Y) конечно будет в заданном диапазоне.

Ну вот гляди. Если сумма произведений нейронов предыдущего слоя и их весов выходит за диапазон [-1;1], то он обрезается до -1 или 1. Таким образом, нейрон нечувствителен вне диапазона.

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

if (x>-1.0 && x<1.0)
    HiddenLayer1[i]=3.0*x/(1.0+MathAbs(x)+x*x);
else
{
    if (x>1.0)
        HiddenLayer1[i]=1.0;
    if (x<-1.0)
        HiddenLayer1[i]=-1.0;
}
Причина обращения: