PytorchBroadcastingのセマンティクス
Pytorch Broadcasting Semantics
ピットピトーチに入り始めたばかりですが、これはわかりません。 ブロードキャストセマンティクス どういう意味ですか、今それを見て、その背後にはまだたくさんのものがあることがわかります。
つまり、pytorchのブロードキャストセマンティクスには次のルールがあります。
一般的なセマンティクス
次のルールに従うと、2つのテンソルは「再生可能」になります。
- 各テンソルには少なくとも1つの次元があります。
- 末尾のサイズから始めてサイズを反復処理する場合、寸法は等しくなければなりません。寸法の1つが1であるか、1つが存在しません。
では、これら2つのルールをどのように理解しますか? ? ?
個人的には2つのテンソルだと思います( 各テンソル次元を0にすることはできません。これは、最初のルールと一致しています。 )、最後からサイズを見ると、どちらかです 等しい または1つ持っています 1の場合 それから私は彼らが「放送」できると言いました(定義の下では意味をなさない数学の感覚があります...)。それなら誰かが尋ねますか?なぜそれらは「ブロードキャスト互換」である必要がありますか?当初、私は「調査」をしませんでした。後で、2つの放送互換テンソルが異なるサイズで操作できることを発見しました。これは非常に便利で、人為的に拡張する必要はありません。同じタイプのサイズに自動的に拡張できます。
次に例を見てください:
形状 | + | b.shape | c.shape | |
(4、1) | + | (1) | -> | (4、1) |
(4、1) | + | (3、) | -> | (4、3) |
(2. 3. 4) | + | (1、4) | -> | (2. 3. 4) |
(2. 3. 4) | + | (3、1) | -> | (2. 3. 4) |
(2. 3. 4) | + | (2、1、1) | -> | (2. 3. 4) |
(2. 3. 4) | + | (3、) | バツ | |
(4、3) | + | (4、) | バツ | |
(4、3) | + | (3、) | -> | (4、3) |
(4、3) | + | (3) | -> | (4、3) |
具体的なアプローチは次のとおりです。
- サイズの数
x
withy
等しくない場合は、小さいテンソルの前に1を追加して、長さが等しくなるようにします。 - 次に、各ディメンションサイズについて、生成されるディメンションサイズは、ディメンションのサイズ
x
withy
このディメンションに沿った最大値です。
公式文書の例を見てください:
>>> x=torch.empty(5,7,3) >>> y=torch.empty(5,7,3) # The same shape tensor can be broadcast (the above rules are always true) >>> x=torch.empty((0,)) >>> y=torch.empty(2,2) # x and y cannot be broadcast because x has no dimension # can line up trailing dimensions >>> x=torch.empty(5,3,4,1) >>> y=torch.empty( 3,1,1) # x and y can broadcast. # 1st trailing dimension: both have size 1 # 2nd trailing dimension: y has size 1 # 3rd trailing dimension: x size == y size # 4th trailing dimension: y dimension doesn't exist # : >>> x=torch.empty(5,2,4,1) >>> y=torch.empty( 3,1,1) # x and y cannot be broadcast (because 2 != 3 )
インプレースセマンティクス
複雑な要因は、ローカル操作では、ローカルテンソルがブロードキャストによって形状を変更できないことです。
例:
>>> x=torch.empty(5,3,4,1) >>> y=torch.empty(3,1,1) >>> (x.add_(y)).size() torch.Size([5, 3, 4, 1]) # but: >>> x=torch.empty(1,3,1) >>> y=torch.empty(3,1,7) >>> (x.add_(y)).size() RuntimeError: The expanded size of the tensor (1) must match the existing size (7) at non-singleton dimension 2.
下位互換性
以前のバージョンのPyTorchでは、各テンソルの要素数が等しい限り、特定のポイントバイポイント関数をさまざまな形状のテンソルで実行できました。次に、各テンソルを1つの次元として扱うことにより、ポイントごとの操作が実行されます。 PyTorchはブロードキャストをサポートするようになり、「1次元」のポイントごとの動作は非推奨と見なされ、テンソルが再生できないが同じ数の要素がある場合にPython警告が生成されます。
2つのテンソルが同じ形状ではなく、ブロードキャスト可能で要素数が同じである場合、ブロードキャストの導入により、後方互換性のない変更が生じる可能性があることに注意してください。例えば:
>>> torch.add(torch.ones(4,1), torch.randn(4))
以前は、Tensorのサイズが生成されました:torch.Size([4,1])が、現在のサイズはTensor:torch.Size([4,4])です。コードで発生する可能性のある後方互換性を特定するために、torch.utils.backcompat.broadcast_warning.enabledをTrueに設定すると、この場合はPython警告が生成されます。
例えば:
>>> torch.utils.backcompat.broadcast_warning.enabled=True >>> torch.add(torch.ones(4,1), torch.ones(4)) __main__:1: UserWarning: self and other do not have the same shape, but are broadcastable, and have the same number of elements. Changing behavior in a backwards incompatible manner to broadcasting rather than viewing as 1-dimensional.