バックプロパゲーションを使用してニューラルネットワークをトレーニングするための時間の複雑さは何ですか?


16

NNには、n隠れ層、訓練例、特徴、および各層のノードが含まれているとします。バックプロパゲーションを使用してこのNNをトレーニングする時間の複雑さは何ですか?mxni

私はアルゴリズムの時間の複雑さをどのように見つけるかについての基本的なアイデアを持っていますが、ここでは4つの異なる要因、すなわち反復、レイヤー、各レイヤーのノード、トレーニング例、そしてさらに多くの要因があります。ここで答えを見つけましたが、十分に明確ではありませんでした。

上記で述べたものとは別に、NNのトレーニングアルゴリズムの時間の複雑さに影響する他の要因はありますか?


回答:


9

信頼できるソースからの回答を見たことはありませんが、簡単な例を使って(現在の知識で)これに自分で答えようとします。

一般に、逆伝播を使用したMLPのトレーニングは通常、行列で実装されることに注意してください。

行列乗算の時間の複雑さ

MijMjkの行列乗算の時間計算量は単純にO(ijk)です。

ここでは、最も単純な乗算アルゴリズムを想定していることに注意してください。時間の複雑さがいくらか改善された他のアルゴリズムがいくつか存在します。

フィードフォワードパスアルゴリズム

フィードフォワード伝播アルゴリズムは次のとおりです。

まず、レイヤーiからjに移動するには、次のようにします。

Sj=WjiZi

次に、アクティベーション機能を適用します

Zj=f(Sj)

我々が持っている場合はN(入力と出力層を含む)層を、これが実行されますN1回。

例として、4層のMLPのフォワードパスアルゴリズムの時間計算量を計算してみましょう。ここで、iは入力層のノード数、jは2番目の層のノード数、kはノードのノード数3番目の層とlは出力層のノードの数です。

4レイヤーがあるため、これらのレイヤー間の重みを表すには3マトリックスが必要です。WjiWkjWlkでそれらを示しましょう。ここで、Wjiji列の行列です(したがって、Wjiにはレイヤーiからレイヤーjへの重みが含まれます)。

あなたが持っていると仮定t訓練例を。レイヤーiからj伝播するには、最初に

Sjt=WjiZit

そして、この操作(すなわち、行列の乗算)はO(jit)時間の複雑さを持ちます。次に、アクティベーション関数を適用します

Zjt=f(Sjt)

また、これは要素単位の操作であるため、O(jt)時間の複雑さを持ちます。

したがって、合計で、

O(jit+jt)=O(jt(t+1))=O(jit)

同じロジックを使用して、jkに進むにはO(kjt)があり、klにはO(lkt)ます。

In total, the time complexity for feedforward propagation will be

O(jit+kjt+lkt)=O(t(ij+jk+kl))

I'm not sure if this can be simplified further or not. Maybe it's just O(tijkl), but I'm not sure.

Back-propagation algorithm

逆伝播アルゴリズムは次のように進みます。出力層から開始lk、我々は、エラー信号、計算Elt、層のノードのための誤差信号を含むマトリックスl

Elt=f(Slt)(ZltOlt)

どこ要素毎の乗算を意味します。Eltl行とt列があることに注意してください。各列がトレーニング例tエラー信号であることを意味します。

We then compute the "delta weights", DlkRl×k (between layer l and layer k)

Dlk=EltZtk

where Ztk is the transpose of Zkt.

We then adjust the weights

Wlk=WlkDlk

For lk, we thus have the time complexity O(lt+lt+ltk+lk)=O(ltk).

Now, going back from kj. We first have

Ekt=f(Skt)(WklElt)

Then

Dkj=EktZtj

And then

Wkj=WkjDkj

where Wkl is the transpose of Wlk. For kj, we have the time complexity O(kt+klt+ktj+kj)=O(kt(l+j)).

And finally, for ji, we have O(jt(k+i)). In total, we have

O(ltk+tk(l+j)+tj(k+i))=O(t(lk+kj+ji))

which is same as feedforward pass algorithm. Since they are same, the total time complexity for one epoch will be

O(t(ij+jk+kl)).

This time complexity is then multiplied by number of iterations (epochs). So, we have

O(nt(ij+jk+kl)),
where n is number of iterations.

Notes

Note that these matrix operations can greatly be paralelized by GPUs.

Conclusion

We tried to find the time complexity for training a neural network that has 4 layers with respectively i, j, k and l nodes, with t training examples and n epochs. The result was O(nt(ij+jk+kl)).

We assumed the simplest form of matrix multiplication that has cubic time complexity. We used batch gradient descent algorithm. The results for stochastic and mini-batch gradient descent should be same. (Let me know if you think the otherwise: note that batch gradient descent is the general form, with little modification, it becomes stochastic or mini-batch)

Also, if you use momentum optimization, you will have same time complexity, because the extra matrix operations required are all element-wise operations, hence they will not affect the time complexity of the algorithm.

I'm not sure what the results would be using other optimizers such as RMSprop.

Sources

The following article http://briandolhansky.com/blog/2014/10/30/artificial-neural-networks-matrix-form-part-5 describes an implementation using matrices. Although this implementation is using "row major", the time complexity is not affected by this.

If you're not familiar with back-propagation, check this article:

http://briandolhansky.com/blog/2013/9/27/artificial-neural-networks-backpropagation-part-4


Your answer is great..I could not find any ambiguity till now, but you forgot the no. of iterations part, just add it...and if no one answers in 5 days i'll surely accept your answer
DuttaA

@DuttaA I tried to put every thing I knew. it may not be 100% correct so feel free to leave this unaccepted :) I'm also waiting for other answers to see what other points I missed.
M.kazem Akhgary

3

For the evaluation of a single pattern, you need to process all weights and all neurons. Given that every neuron has at least one weight, we can ignore them, and have O(w) where w is the number of weights, i.e., nni, assuming full connectivity between your layers.

The back-propagation has the same complexity as the forward evaluation (just look at the formula).

So, the complexity for learning m examples, where each gets repeated e times, is O(wme).

The bad news is that there's no formula telling you what number of epochs e you need.


From the above answer don't you think itdepends on more factors?
DuttaA

1
@DuttaA No. There's a constant amount of work per weight, which gets repeated e times for each of m examples. I didn't bother to compute the number of weights, I guess, that's the difference.
maaartinus

答えは同じだと思います。私の答えでは、重みの数を想定できますw = ij + jk + kl。基本的にn * n_i、ご指摘のようにレイヤー間の合計。
M.kazem Akhgary
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.