久々に回答しようと思ってpytorchで探してみたら回答されていなかったのがあったので、僕の解釈できている範囲で回答してみたいと思います。もう既に自己解決されているかもしれないですが...汗
detach()はコピーは作成してグラフからテンソルを切り離すために使用されますが、こちらはメモリが共有されています。なので、例えば何かしらの演算処理がされてしまった場合はコピー元も影響を受けてしまいます。また、ここが重要ですが勾配情報を含まない(というよりも勾配情報がないので例えるならNoneの状態の)テンソルの形で取り出すことができるのが特徴です。
一方で、clone()はコピー元とメモリを共有していないので、一方に何かしらの演算処理が発生しても影響を受けないのがdetach()との大きな違いだと解釈しています。
dataは変数からtensor-dataを得るだけになってます(例えるなら、勾配情報が完全にないNullの状態)。しかし、(勾配情報が全くないからだと思いますが)計算途中で参照すると逆伝搬の際にエラーが起きるみたいなので、detach()を使うことが推奨されています。そもそも.data自体が旧バージョンの仕様で将来的にはなくなる予定みたいです。
https://qiita.com/vintersnow/items/91545c27e2003f62ebc4
全てを説明できる自信がないのでいくつかだけ説明させて頂きますが、下記の場合はautoencoderなどで使用されます。
python
1x = my_tensor.clone().detach()
https://discuss.pytorch.org/t/difference-between-detach-clone-and-clone-detach/34173/2
上記のURLで出ている例では、デコーダ部分でパラメータBを介して逆伝搬をしたくない、つまり固定入力のみで使いたいのですが、別の部分ではパラメータBを学習できるようにしたいというautoencoderの事例です。この場合、Bがrequires_grad(自動微分)がない入力として固定入力を定義しなければならないのですが、先述したようにメモリを共有していると色々と面倒なので、.clone()で一旦メモリを共有しない状態にしてから.detach()でrequires_gradなしの固定入力として定義している形になります。
一方で、下記のケースの場合は、requires_gradがNoneの状態でtensorを取り出してからメモリ共有を行わない完全なコピーを作っている形になります
x = my_tensor.detach().clone()
detach()などはGANなどで使用されるケースが多いので、よかったらGANの実装部分を参考にして頂ければと思います。他の部分は実装する上で書いた経験がないので具体的な説明はできないですが、先述した部分の説明を踏まえればイメージができるのではないかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/02 07:07
2020/05/10 06:38 編集
2020/05/10 17:32
2020/05/11 07:06
2020/05/11 07:17
2020/05/12 11:59
2022/09/15 17:13 編集