Имеет ли смысл иметь несколько нейронов типа функции активации в одном слое?

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

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

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

Решение можно легко сделать, проверив формулу ниже:
(x-0,5)^2 + (y-0,5)^2 ‹ r^2
и это можно преобразовать следующим образом:
x^2 - х + у ^ 2 - у + 0,5 ‹ г ^ 2

Теперь, глядя на эту последнюю формулу, очевидно, что обучение могло бы стать эффективным, если бы сама нейронная сеть могла автоматически получать значения, такие как x ^ 2 и y ^ 2, просто из значения своего признака, которое задается как (x, y). Для этого я пришел к идее смешать такие нейроны, у которых f(x)=x^2 в качестве функции активации, среди стандартных нейронов ReLU.

Честно говоря, я уже сделал несколько тестовых реализаций этой проблемы с использованием фреймворка Tensorflow Estimator, и в одной из них я видел, что предоставление x^2 и y^2 в качестве дополнительных функций (всего 4 значения функций) должно способствовать эффективная сходимость обучения по сравнению со случаем с двумя признаками, но решение с использованием функции активации f(x)=x^2 показалось мне намного умнее.

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

Спасибо.


person nursmaul    schedule 30.03.2018    source источник


Ответы (1)


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

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

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

def make_activator(activations):
    def activator(t):
        slices = tf.unstack(t)
        activated = []
        for s, act in zip(slices, itertools.cycle(activations)):
            activated.append(act(s))
        return tf.stack(activated)
    return activator

Затем вы можете использовать его в своих слоях следующим образом:

tf.layers.dense(..., activation=make_activator([tf.nn.relu, tf.square]))

Вы также можете просто добавить «параллельные слои», каждый с различной активацией, а затем объединить (например, суммировать) или объединить их выходные данные, прежде чем передать их следующему слою.

person iga    schedule 05.04.2018
comment
Итак, если добавление дополнительных функций гораздо более популярно, чем работа с функциями активации, знаете ли вы какую-либо возможную причину, по которой большинство людей делают это при разработке функций? Я изменил свой код, где я вызывал функцию плотности (), в код, который вы мне показали, но, похоже, мне не повезло заставить его работать должным образом, он говорит, что не может вывести число из формы (?, особенно в мой этап прогнозирования, который следует за этапом обучения, вы найдете какие-либо обходные пути, которые я могу сделать для этого? - person nursmaul; 07.04.2018
comment
Re: зачем фичеинжиниринг. Потому что, если вы знаете, что x^2 важен в вашем домене, проще всего передать его в качестве входных данных для сети. Re: твоя ошибка. Я ожидаю, что TF сможет нормально определять формы этого пользовательского активатора, и я попытался использовать этот код в примере mnist (это не дало лучших результатов, но не дало никаких ошибок). Я бы предложил опубликовать отдельный вопрос с минимальным кодом для воспроизведения ошибки. - person iga; 09.04.2018
comment
Спасибо за вашу поддержку. Я бы разместил свой минимальный код как отдельный вопрос. Почему разработка функций, спасибо за отличный совет. Имея это в виду, я бы еще немного подумал и узнал об этом. - person nursmaul; 09.04.2018