Почему градиент классификатора softmax делится на размер партии (CS231n)?

Вопрос

В CS231 Вычисление аналитического градиента с обратным распространением, который сначала реализует Классификатор Softmax, градиент от (softmax + log loss) делится на размер пакета (количество данных, используемых в цикле прямого расчета стоимости и обратного распространения в обучении).

Пожалуйста, помогите мне понять, почему его нужно разделить на размер партии.

введите здесь описание изображения

Цепное правило для получения градиента должно быть ниже. Где я должен включить разделение?

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

Код

N = 100 # number of points per class
D = 2 # dimensionality
K = 3 # number of classes
X = np.zeros((N*K,D)) # data matrix (each row = single example)
y = np.zeros(N*K, dtype='uint8') # class labels

#Train a Linear Classifier

# initialize parameters randomly
W = 0.01 * np.random.randn(D,K)
b = np.zeros((1,K))

# some hyperparameters
step_size = 1e-0
reg = 1e-3 # regularization strength

# gradient descent loop
num_examples = X.shape[0]
for i in range(200):

  # evaluate class scores, [N x K]
  scores = np.dot(X, W) + b

  # compute the class probabilities
  exp_scores = np.exp(scores)
  probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # [N x K]

  # compute the loss: average cross-entropy loss and regularization
  correct_logprobs = -np.log(probs[range(num_examples),y])
  data_loss = np.sum(correct_logprobs)/num_examples
  reg_loss = 0.5*reg*np.sum(W*W)
  loss = data_loss + reg_loss
  if i % 10 == 0:
    print "iteration %d: loss %f" % (i, loss)

  # compute the gradient on scores
  dscores = probs
  dscores[range(num_examples),y] -= 1
  dscores /= num_examples                      # <---------------------- Why?

  # backpropate the gradient to the parameters (W,b)
  dW = np.dot(X.T, dscores)
  db = np.sum(dscores, axis=0, keepdims=True)

  dW += reg*W # regularization gradient

  # perform a parameter update
  W += -step_size * dW
  b += -step_size * db

person mon    schedule 13.12.2020    source источник


Ответы (2)


Это потому, что вы усредняете градиенты вместо того, чтобы напрямую брать сумму всех градиентов.

Можно было конечно и не делить на такой размер, но у такого деления масса преимуществ. Основная причина в том, что это своего рода регуляризация (чтобы избежать переобучения). При меньших градиентах веса не могут выйти за пределы пропорций.

И эта нормализация позволяет сравнивать различные конфигурации размеров партий в разных экспериментах (как я могу сравнить характеристики двух партий, если они зависят от размера партии?)

Если вы разделите на этот размер сумму градиентов, может быть полезно работать с более высокими скоростями обучения, чтобы ускорить обучение.

Этот ответ в проверенном сообществе весьма полезен.

person Nikaido    schedule 13.12.2020
comment
Спасибо за продолжение, но мне все еще не ясно. Выход softmax p(k) находится между 0 и 1, что является каждым элементом dscore, то есть матрицей формы (num_samples, 3). Если dscore разделить на num_samples, он разделит каждый элемент в матрице, следовательно, при делении p(k) получится очень маленькое значение. До сих пор недоумеваю, зачем это делать. - person mon; 13.12.2020

Пришел к выводу, что точка в dW = np.dot(X.T, dscores) для градиента в W равна Σ по экземплярам num_sample. Поскольку dscore, который является вероятностью (вывод softmax), был разделен на num_samples, не понял, что это нормализация для dot и < strong>sum позже в коде. Теперь понятно, что требуется деление на num_sample (может все еще работать без нормализации, если скорость обучения обучена).

Я считаю, что приведенный ниже код объясняет лучше.

# compute the gradient on scores
dscores = probs
dscores[range(num_examples),y] -= 1

# backpropate the gradient to the parameters (W,b)
dW = np.dot(X.T, dscores) / num_examples
db = np.sum(dscores, axis=0, keepdims=True) / num_examples

введите здесь описание изображения

person mon    schedule 13.12.2020
comment
dscores — это градиент, а не чистый вывод softmax (dscores[range(num_examples),y] -= 1). Вы усредняете градиенты, а не вероятности - person Nikaido; 14.12.2020