Как я могу применить пользовательскую регуляризацию в CNTK (используя python)?

Знаете ли вы, как я могу применить пользовательскую функцию регуляризации к CNTK?

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

newLoss = loss + lambda * gradient_F(inputs)

где F — функция, изученная моделью, а входные данные — входные данные для модели.

Как я могу добиться этого в CNTK? Я не знаю, как получить доступ к градиентам относительно входных данных и как взять градиент относительно весов регуляризатора.


person Ant    schedule 25.06.2017    source источник


Ответы (3)


Во-первых, градиент — это не скаляр, поэтому его оптимизация не имеет особого смысла. Градиент нормы может быть интересным дополнением к вашей потере. Для этого CNTK должен был бы взять градиент нормы градиента, который на момент написания этой статьи (июль 2017 г.) не поддерживается. Однако это важная функция, которую мы хотим добавить в ближайшие несколько месяцев.

Обновление. Один из способов обхода — сделать что-то вроде этого noisy_inputs = x + C.random.normal_like(x, scale=0.01) noisy_model = model.clone('share', {x: noisy_inputs}) auxiliary_loss = C.squared_error(model, noisy_model) , но вам придется настроить масштаб шума для вашей проблемы.

person Nikos Karampatziakis    schedule 18.07.2017
comment
Спасибо за ваш ответ! Да, я явно имел в виду норму градиента (на самом деле норму разницы градиентов, как указано в статье... но я не буду вдаваться в подробности). Мне также было интересно, как получить градиент нормы градиента, но, поскольку он не поддерживается, я просто подожду. Еще раз спасибо! Вы участвуете в развитии cntk? - person Ant; 19.07.2017
comment
Да, я участвую в разработке CNTK. Один из способов приблизиться к тому, что вы хотите, - это добавить небольшое количество случайного шума к вашим данным, протолкнуть их через клонированную версию вашей сети и потребовать небольших различий между выходами клона и исходного. Смотрите обновленный ответ. - person Nikos Karampatziakis; 19.07.2017

Учащиеся CNTK принимают только числа в качестве значений регуляризатора (L1/L2). Если вы действительно хотите добавить свой собственный регуляризатор, вы можете легко реализовать свой собственный Learner. У вас будет доступ к нужным вам градиентам. Вы найдете несколько примеров того, как реализовать свой собственный Learner здесь .

person Zp Bappi    schedule 12.07.2017

Вот код для этого:

    def cross_entropy_with_softmax_plus_regularization(model, labels, l2_regularization_weight):
        w_norm = C.Constant(0);
        for p in (model.parameters):
            w_norm = C.plus(w_norm, 0.5*C.reduce_sum(C.square(p)))

        return C.reduce_log_sum_exp(model.output) - 

C.reduce_log_sum_exp(C.times_transpose(labels, model.output)) + l2_regularization_weight*w_norm

и мой http://www.telesens.co/2017/09/29/spiral_cntk/ запись в блоге об этом

person ankur    schedule 29.09.2017
comment
Привет! Я искал норму градиента, а не норму веса :) - person Ant; 30.09.2017
comment
Ах, хорошо, извините, я не прочитал исходный вопрос должным образом. Вы можете получить доступ к градиентам, вставив свою пользовательскую функцию обучения, которая реализует обновление параметров (см. код ниже). Не знаю, как получить доступ к этим градиентам из вашей функции потерь. для p, g в zip (параметры, градиенты): градиент_масштабный_фактор = 0,001 update_funcs.append(C.assign(p, p - градиентный_масштабный_фактор * г)) вернуть C.combine(update_funcs) ` - person ankur; 01.10.2017