Градиент функции потери шарнира по отношению к входному прогнозу - PullRequest
0 голосов
/ 11 ноября 2018

Для присвоения мне необходимо реализовать функции расчета потерь в шарнирах и их частной производной. Я получил саму функцию потери шарнира, но мне трудно понять, как рассчитать ее частную производную w.r.t. прогнозирование ввода. Я пробовал разные подходы, но ни один не работал.

Любая помощь, советы, предложения будут высоко оценены!

Вот аналитическое выражение для самой функции потери шарнира:

Hinge loss function

А вот моя реализация функции потери шарнира:

def hinge_forward(target_pred, target_true):
    """Compute the value of Hinge loss 
        for a given prediction and the ground truth
    # Arguments
        target_pred: predictions - np.array of size `(n_objects,)`
        target_true: ground truth - np.array of size `(n_objects,)`
    # Output
        the value of Hinge loss 
        for a given prediction and the ground truth
        scalar
    """
    output = np.sum((np.maximum(0, 1 - target_pred * target_true)) / target_pred.size)

    return output

Теперь мне нужно вычислить этот градиент:

Hinge loss gradient w.r.t. prediction input

Это то, что я пробовал для расчета градиента потерь шарнира:

def hinge_grad_input(target_pred, target_true):
    """Compute the partial derivative 
        of Hinge loss with respect to its input
    # Arguments
        target_pred: predictions - np.array of size `(n_objects,)`
        target_true: ground truth - np.array of size `(n_objects,)`
    # Output
        the partial derivative 
        of Hinge loss with respect to its input
        np.array of size `(n_objects,)`
    """
# ----------------
#     try 1
# ----------------
#     hinge_result = hinge_forward(target_pred, target_true)

#     if hinge_result == 0:
#         grad_input = 0
#     else:
#         hinge = np.maximum(0, 1 - target_pred * target_true)
#         grad_input = np.zeros_like(hinge)
#         grad_input[hinge > 0] = 1
#         grad_input = np.sum(np.where(hinge > 0))
# ----------------
#     try 2
# ----------------
#     hinge = np.maximum(0, 1 - target_pred * target_true)
#     grad_input = np.zeros_like(hinge)

#     grad_input[hinge > 0] = 1
# ----------------
#     try 3
# ----------------
    hinge_result = hinge_forward(target_pred, target_true)

    if hinge_result == 0:
        grad_input = 0
    else:
        loss = np.maximum(0, 1 - target_pred * target_true)
        grad_input = np.zeros_like(loss)
        grad_input[loss > 0] = 1
        grad_input = np.sum(grad_input) * target_pred

    return grad_input

1 Ответ

0 голосов
/ 11 ноября 2018

Мне удалось решить эту проблему с помощью функции np.where (). Вот код:

def hinge_grad_input(target_pred, target_true):
    """Compute the partial derivative 
        of Hinge loss with respect to its input
    # Arguments
        target_pred: predictions - np.array of size `(n_objects,)`
        target_true: ground truth - np.array of size `(n_objects,)`
    # Output
        the partial derivative 
        of Hinge loss with respect to its input
        np.array of size `(n_objects,)`
    """
    grad_input = np.where(target_pred * target_true < 1, -target_true / target_pred.size, 0)

    return grad_input

В основном градиент равен -y / N для всех случаев, когда y * y <1, иначе 0. </p>

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