質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

9060閲覧

PyTorchのdetach()メソッドの意味

OOZAWA

総合スコア45

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/12 09:21

編集2020/01/12 09:23

PyTorchのdetach()メソッドの利用方法を紹介する例を見ましたが、
意味が全然分かりません。
ご存じの方、以下のような文のそれぞれの意味を説明していただけませんか。

x = my_tensor.detach().clone()
x = my_tensor.clone().detach()
x = my_tensor.data.detach().clone()
x = my_tensor.detach().data.clone()
x = my_tensor.clone().detach().data

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

久々に回答しようと思って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/04/30 15:48

bamboo-nova

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OOZAWA

2020/05/02 07:07

丁寧なご説明本当にありがとうございます! 良く分かりました。 これから更に勉強していこうと思います。
OOZAWA

2020/05/10 06:38 編集

《 detach()はコピーは作成してグラフからテンソルを切り離すために使用されますが、こちらはメモリが共有されています。》に 矛盾に感じてしまいます。もしかして、ここで「コピーは作成してグラフからテンソルを切り離す」というのは、C言語流で言えば、単にデータのポインターを「コピー」して新規のポインター変数またはデータの「参照」を新規作成するのでは? 通常「コピー」元と「コピー」先のメモリ空間が共有することはあり得ないですね。
bamboo-nova

2020/05/10 17:32

すみません、確かに言い方に語弊がありました汗 OOZAWA様のご指摘の通りでして、メモリ空間が共有されるという訳ではなく、例えばコピー先に何かしらの演算(足し算や引き算)が入るとコピー元も値が変わってしまうことを意図して発言しました。誤解を招くアドバイスになってしまい申し訳ありません。
OOZAWA

2020/05/11 07:06

丁寧な解釈ありがとうございます。 いったいdetach()はどんな場合利用されるのでしょうね。 これこそ知りたいのです。
bamboo-nova

2020/05/11 07:17

https://qiita.com/hkthirano/items/7381095aaee668513487 detach()は、例えばGANのように生成器と識別器で別々のモデルを学習させたいときに使用します。detach()を使用することで、識別器の学習の際に生成器に影響が出ない(勾配情報が伝わらない)ようにするために使用しています。
OOZAWA

2020/05/12 11:59

bamboo-nova さま すばらしいお返答本当にありがとうございます! <識別器の学習の際に生成器に影響が出ない(勾配情報が伝わらない)ようにするために使用しています。>
insecticide

2022/09/15 17:13 編集

”コピーは作成して”以上、 ”メモリが共有”は必要しないし、逆もまたしかり。 コピーの作成は、clone()の場合ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問