ニューラルネットワークは, backpropagationさえできればかなり自由に設計することができる. 例の人が自然言語処理の世界で流行らせたRecursive Neural Networkでも, 任意のノードを選んでひとつのソフトマックス層に直接つなぐことなども可能だ. つまり, やりたい放題.
    さて, ある目的のためにニューラルネットワークを実装した時, いきなり本格的な実験を始めるのは極めて危険である. なぜなら, 複雑なネットワークのbackpropは実装でミスりやすいからである. プログラムを動かしてみたら目的関数が確かに小さくなっていってるから正しく実装できている, などと言うのは愚かなことだ (以前の自分).
    そんな時に役に立つ強力な武器が, gradient checking (gradient checker など)である. 数多くある変数の中の i 番目に着目して実際に以下の式の右辺の第一項目を用いて偏微分の近似値を計算する.



ここで, は微小値で, 程度の値がよく用いられる. これで計算した値と, backpropで計算した値を比較すれば, backpropの実装が正しいかどうかを確かめられる. つまり, 2通りで計算した勾配の値が大きく異なっていたら, 実装が間違っているということになる. 自分の実験中のgradient checkingでは, 0じゃない数字が出てきた桁から数えて7~8桁程度は一致することが確認できた. 少なくとも4桁は一致していないとまずいらしい.
    あれ?こんな簡単な数値計算で勾配が計算できるならそもそもbackpropとかいうめんどうなことしなくてもよかったんだ, と思うのは大間違い. たった一つの変数に関する勾配を求めるだけのために目的関数の計算が2回必要, つまり, 1000万くらい変数があったら, 一度の勾配計算のために2000万回もの目的関数の計算が必要になる!Backpropがいかに凄いかということである.