2019-10-17こしあんTweetPocketTF2.0系で少し複雑なモデルを訓練するときに、GradientTapeを複数使うことがあります。例として、微分を取りたい場所が2箇所あるケースや、2階微分を取りたいケースを挙げます。場合によって微妙に書き方が違うので注意が必要です。微分を取りたい場所が2箇所あるケース2階以上の偏微分を取るまとめ微分を取りたい場所が2箇所あるケース簡単な例にします。次の関数の微分を考えます。$$合成関数の微分の公式の要領で、$y$の$x$微分と、$x^2$の$x$微分を計算してみます。main()xの値を1~3と変化させます。結果は数学的に計算した通りになりました。dtype=float32)ポイントはここです。tape2:このように1つのwith句の中に2つのGradientTapeをおくと、2箇所の微分を取ることができます。ちなみに、tape1をtape2にしたり、tape2をtape1にしたりと、同一のGradientTapeに対して2回以上tape.gradientを呼び出すと次のようなエラーになります。tapes.つまりこの記事でやっているのは、「GradientTape1つに対して2回以上偏微分計算できない」という縛りを回避するために、GradientTapeを2つ定義しているということです。ちなみに、この例は次のようにネストさせて書いてもOKです。x))2階以上の偏微分を取るディープラーニングで使うケースとしては少ないと思いますが、GradientTapeをネストさせることで2階以上の偏微分が計算できます。先程の2箇所の微分計算とは少し異なる書き方をします。\frac{d^2y}{dx^2}=-\frac{2}{x^2}$$となります。これとあっているか確認してみます。dtype=float32)確かにあっているようです。GradientTapeの部分を再掲します。x)最初に複数のTapeをネストさせて宣言するのがポイントです。tape2両方記録しています。tape2側がgradientを計算した部分は、tape2のインデントの外側なので、この偏微分を計算するというグラフはtape1だけ記録されます。したがって、tape1でもう一回gradientを呼べば2階微分が計算できる......という仕組み。Noneとなり、2階部分が正常に計算できません。これはスコープの外側になっているためです。まとめ少し複雑なモデルではGradientTapeを複数個作ることがありますが、ケースによって適切な書き方が微妙に違うので確かめながらやりましょうということでした。想像ですが、インデント分けて書いたほうが無駄な微分計算をしなくて厳密......なのかもしれません。Commentコメントをキャンセルメールアドレスが公開されることはありません。