BioErrorLog Tech Blog

試行錯誤の記録

PyTorch関数名の末尾アンダーバー`_`の意味

in-place処理であることを意味します。

はじめに

PyTorchを触っていると、しばしばアンダーバー_を接尾語とする関数を見かけます。

  • kaiming_normal_
  • add_
  • etc...

初見で意味を知らなかったので備忘録メモです。

PyTorch関数名の末尾アンダーバー_

意味

PyTorch関数名の末尾アンダーバー_は、in-place処理を意味します。

in-place処理とは、元のデータを直接変更する処理のことです。

In-place operations Operations that have a _ suffix are in-place.
For example: x.copy_(y), x.t_(), will change x.

Ref. Tensors — PyTorch Tutorials 2.4.0+cu121 documentation

in-place処理はメモリを節約することができますが、そこまでの履歴を書き換えることになるためautograd処理に問題が生じる可能性があるとのこと。 基本的には非推奨です。

In-place operations save some memory, but can be problematic when computing derivatives because of an immediate loss of history. Hence, their use is discouraged.

Ref. Tensors — PyTorch Tutorials 2.4.0+cu121 documentation

具体例

ごく簡単な具体例として、addadd_の違いを見ていきます。

まずはaddの例:

import torch


x = torch.tensor([1, 2, 3])
print("x: ", x)
y = x.add(1)
print("y: ", y)
print("x: ", x)

### 実行結果 ###
# x:  tensor([1, 2, 3])
# y:  tensor([2, 3, 4])
# x:  tensor([1, 2, 3])

add前後で、xには変化がありません。

一方、add_では、

x_ = torch.tensor([1, 2, 3])
print("x_: ", x_)
y_ = x_.add_(1)
print("y_: ", y_)
print("x_: ", x_)

### 実行結果 ###
# x_:  tensor([1, 2, 3])
# y_:  tensor([2, 3, 4])
# x_:  tensor([2, 3, 4])

x_自体も1加算されることがわかります。

in-place処理されてますね。

おわりに

以上、PyTorch関数名の末尾アンダーバー_の意味をメモしました。

どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

参考

Tensors — PyTorch Tutorials 2.4.0+cu121 documentation

python - What does the underscore suffix in PyTorch functions mean? - Stack Overflow

What do the underscores at the end of functions mean in pytorch? - PyTorch Forums

What is `in-place operation`? - PyTorch Forums

torch.nn.init — PyTorch 2.4 documentation

pytorch/torch/nn/init.py at 0adb5843766092fba584791af76383125fd0d01c · pytorch/pytorch · GitHub