問題タブ [autograd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - PyTorch の「detach()」と「with torch.nograd()」の違いは?
計算の要素を勾配計算から除外する 2 つの方法を知っていますbackward
方法 1:使用with torch.no_grad()
方法 2:使用.detach()
これら2つに違いはありますか?どちらにもメリット/デメリットはありますか?
python - なんらかの変換によってパラメータを定義する OR グラフ全体ではなくサブグラフを保持する
今まで見たことのない問題に出くわしています。私はベイジアン機械学習に取り組んでおり、PyTorch のディストリビューションをよく利用しています。よくあることの 1 つは、分布のパラメーターのいくつかをパラメーターの対数で定義することです。これにより、最適化で負になることはありません (正規分布の標準偏差など)。
ただし、分布に依存しないようにするために、このパラメーターの変換を手動で再計算する必要はありません。例を介して実証するには:
次のコードは実行されません。最初の後方パスの後、パラメーターの指数関数を計算するグラフの部分は自動的に削除され、再度追加されることはありません。
次のコード セットは実行されlog_std
ますが、ループ内でパラメーターを明示的に参照し、ディストリビューションを再作成する必要があります。分散タイプを変更したい場合、特定のケースを考慮しないと不可能です。
ただし、グラフが静的であるため、最初の例は Tensorflow で機能します。これを修正する方法について誰かアイデアがありますか? 関係を定義するグラフの部分のみを保持することが可能であれば、std = torch.exp(log_std)
これはうまくいく可能性があります。逆方向勾配フックも試してみましたが、残念ながら、新しい勾配を適切に計算するには、パラメーター値と学習率にアクセスする必要があります。
前もって感謝します!マイケル
編集
ディストリビューションを変更する方法の例を求められました。現在機能しないコードを取得し、分布をガンマ分布に変更します。
ただし、現在動作しているコードを見ると:
そして、アルゴリズムが機能するようにするには、ループ内のコードを変更する必要があることがわかります。この小さな例では大きな問題ではありませんが、これは、心配する必要がないことが信じられないほど有益な、はるかに大きなアルゴリズムのデモンストレーションにすぎません。