Czy wiesz, jak mogę zastosować niestandardową funkcję regularyzacji do CNTK?

W szczególności chciałbym dodać do straty pochodnej funkcji WRT do wejść; coś jak

newLoss = loss + lambda * gradient_F(inputs)

Gdzie f jest funkcją wyciągniętą przez model, a wejścia są wejścia do modelu.

Jak mogę to osiągnąć w CNTK? Nie wiem, jak uzyskać dostęp do gradientów WRT do wejść i jak wziąć gradientowy WRT do wag regularów.

1
Ant 25 czerwiec 2017, 18:10

3 odpowiedzi

Najlepsza odpowiedź

Po pierwsze, gradient nie jest skalarnym, więc nie ma znaczenia, aby go zoptymalizować. Normę gradientu może być ciekawą rzeczą, aby dodać do twojej straty. Aby to zrobić, CNTK musiałby podjąć gradient normy gradientu, które w momencie tego pisania (lipiec 2017 r.) Nie jest wspierany. Jest to jednak ważna funkcja, którą chcemy dodać w ciągu najbliższych kilku miesięcy.

Aktualizacja : Jeden obejście ma zrobić coś takiego 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) Ale będziesz musiał dostroić skalę hałasu na swój problem.

2
Nikos Karampatziakis 18 lipiec 2017, 21:44

Oto kod, aby to zrobić:

    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

I mój http://www.telesens.co/2017/09/29/spiral_cntk / Post na blogu o tym

0
ankur 29 wrzesień 2017, 20:36

Uczniówki CNTK akceptują tylko liczby jako wartości regulacyjne (L1 / L2). Jeśli naprawdę chcesz dodać niestandardowy regularyzator, możesz łatwo wdrożyć własny uczeń. Będziesz mieć dostęp do potrzebnych gradientów. Znajdziesz kilka przykładów na temat sposobu wdrożenia własnego ucznia Oto.

0
Zp Bappi 12 lipiec 2017, 03:10