# Compute gradient
    dW[:, j] += X[i]
    dW[:, y[i]] -= X[i]

    # Add regularization gradient
    #注意这里,求的是平均梯度。因为之前求过平均损失。
    dW /= num_train
    dW += 2 * reg * W

    num_train = X.shape[0]
    scores = X.mm(W)
    score_y = scores[torch.arange(num_train), y].view(-1, 1)
    margins = torch.relu(scores - score_y + 1)
    margins[torch.arange(num_train), y] = 0
    loss = torch.sum(margins) / num_train

上面的蓝色对应实际有问题

下面的代码之所以要转置,是为了把方便把每条数据编做一个列向量

    # Compute gradient
    binary = margins
    binary[margins > 0] = 1
    row_sum = torch.sum(binary, dim=1)
    binary[torch.arange(num_train), y] = -row_sum
    dW = X.t().mm(binary) / num_train

    # Add regularization gradient
    dW += 2 * reg * W

这个就很简单啦,不要被迷惑,抓住上面的式子,不断分组分析,复合求导即可

    # Compute gradient
    probs[torch.arange(num_train), y] -= 1  # subtract 1 from correct class
    dW = X.t().mm(probs) / num_train
    
    # Add regularization gradient
    dW += 2 * reg * W

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐