Как повысить производительность без параллельного использования для моей ANN обратного распространения

После профилирования моего алгоритма обратного распространения я узнал, что он отвечает за 60% моего времени вычислений. Прежде чем я начну рассматривать параллельные альтернативы, я хотел бы посмотреть, что еще я могу сделать.

Функция activate (const double input []) профилирована так, чтобы занимать только ~ 5% время. Функция gradient (const double input) реализована следующим образом:

inline double gradient(const double input) { return (1 - (input * input)); }

Обучающая функция, о которой идет речь:

void train(const vector& data, const vector& desired, const double learn_rate, const double momentum) {
        this->activate(data);
        this->calculate_error(desired);

        // adjust weights for layers
        const auto n_layers = this->config.size();
        const auto adjustment = (1 - momentum) * learn_rate;

        for (size_t i = 1; i < n_layers; ++i) {
            const auto& inputs = i - 1 > 0 ? this->outputs[i - 1] : data;
            const auto n_inputs = this->config[i - 1];
            const auto n_neurons = this->config[i];

            for (auto j = 0; j < n_neurons; ++j) {
                const auto adjusted_error = adjustment * this->errors[i][j];

                for (auto k = 0; k < n_inputs; ++k) {
                    const auto delta = adjusted_error * inputs[k] + (momentum * this->deltas[i][j][k]);

                    this->deltas[i][j][k] = delta;
                    this->weights[i][j][k] += delta;
                }

                const auto delta = adjusted_error * this->bias + (momentum * this->deltas[i][j][n_inputs]);

                this->deltas[i][j][n_inputs] = delta;
                this->weights[i][j][n_inputs] += delta;
            }
        }
    }
}

Этот вопрос лучше подходит для https://codereview.stackexchange.com / .

15
задан deceleratedcaviar 14 October 2019 в 01:38
поделиться