Я вычисляю алгоритм backpropagation
для разреженного автокодера. Я реализовал его в python с помощью numpy
и в matlab
. Код почти такой же, но производительность сильно отличается. Время, которое занимает matlab для выполнения задачи, составляет 0.252454 секунды, а numpy 0.973672151566, что почти в четыре раза больше. Я буду вызывать этот код несколько раз позже в задаче минимизации, поэтому эта разница приводит к нескольким минутам задержки между реализациями. Это нормальное поведение? Как я могу улучшить производительность в numpy?
Реализация Numpy:
Sparse.rho - параметр настройки, sparse.nodes - количество узлов в скрытом слое (25), sparse.input(64) количество узлов во входном слое, theta1 и theta2 - весовые матрицы для первый и второй уровни соответственно с размерами 25x64 и 64x25, m равно 10000, rhoest имеет размерность (25), x имеет размерность 10000x64, a3 10000x64 и a2 10000x25.
UPDATE
: Я ввел изменения в код, следуя некоторым идеям ответов. Производительность теперь бесчисленная: 0,65 против Matlab: 0,25.
partial_j1 = np.zeros(sparse.theta1.shape)
partial_j2 = np.zeros(sparse.theta2.shape)
partial_b1 = np.zeros(sparse.b1.shape)
partial_b2 = np.zeros(sparse.b2.shape)
t = time.time()
delta3t = (-(x-a3)*a3*(1-a3)).T
for i in range(m):
delta3 = delta3t[:,i:(i+1)]
sum1 = np.dot(sparse.theta2.T,delta3)
delta2 = ( sum1 + sum2 ) * a2[i:(i+1),:].T* (1 - a2[i:(i+1),:].T)
partial_j1 += np.dot(delta2, a1[i:(i+1),:])
partial_j2 += np.dot(delta3, a2[i:(i+1),:])
partial_b1 += delta2
partial_b2 += delta3
print "Backprop time:", time.time() -t
Реализация Matlab:
tic
for i = 1:m
delta3 = -(data(i,:)-a3(i,:)).*a3(i,:).*(1 - a3(i,:));
delta3 = delta3.';
sum1 = W2.'*delta3;
sum2 = beta*(-sparsityParam./rhoest + (1 - sparsityParam) ./ (1.0 - rhoest) );
delta2 = ( sum1 + sum2 ) .* a2(i,:).' .* (1 - a2(i,:).');
W1grad = W1grad + delta2* a1(i,:);
W2grad = W2grad + delta3* a2(i,:);
b1grad = b1grad + delta2;
b2grad = b2grad + delta3;
end
toc