gpt4 book ai didi

c++ - 如何在不并行的情况下提高我的反向传播 ANN 的性能

转载 作者:IT老高 更新时间:2023-10-28 22:29:32 26 4
gpt4 key购买 nike

分析我的反向传播算法后,我了解到它占用了我 60% 的计算时间。在我开始寻找并行替代方案之前,我想看看是否还有什么可以做的。

activate(const double input[]) 函数被配置为只占用约 5% 的时间。gradient(const double input)函数实现如下:

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

有问题的训练函数:

void train(const vector<double>& data, const vector<double>& 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/ .

最佳答案

如果您想训练/使用 NN,就无法避免 O(n^2) 算法。但它非常适合 vector 算术。例如,通过巧妙地使用 SSE 或 AVX,您可以以 4 或 8 个 block 处理神经元,并使用乘加而不是两条单独的指令。

如果您使用现代编译器并仔细地重新制定算法并使用正确的开关,您甚至可以让编译器为您自动矢量化循环,但您的结果可能会有所不同。

对于 gcc,使用 -O3 或 -ftree-vectorize 激活自动矢量化。当然,您需要一个支持 vector 的 cpu,例如 -march=core2 -mssse4.1 或类似的东西,具体取决于 objective-c pu。如果你使用 -ftree-vectorizer-verbose=2 你会得到详细的解释,为什么以及在哪里循环没有被矢量化。看看http://gcc.gnu.org/projects/tree-ssa/vectorization.html .

当然最好直接使用编译器内部函数。

关于c++ - 如何在不并行的情况下提高我的反向传播 ANN 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5713776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com