0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tensorflowにおけるブロードキャスト

Posted at

ブロードキャストとは

TensorFlow におけるブロードキャスト(broadcasting)とは,
形状(shape)の異なるテンソル同士で算術演算(足し算・掛け算など)を行うときに,
内部的に“次元を合わせて”自動的に拡張(broadcast)して計算できる仕組みです。

例えば,行列(2×3)とベクトル(3)の足し算を考えると,
ベクトルの次元を行列の行数分だけ複製して(2×3)に揃えた上で計算を行います。


ブロードキャストの基本ルール

TensorFlow(および NumPy)では,次のルールでブロードキャストを行います。

  1. 右詰めで次元を比較

    形状の短い方のテンソルには,左側に長さ 1 の次元を補って比較します。

    例:(2, 3)(3,) は → (2, 3)(1, 3) として扱われる

  2. 各次元ごとに互換性をチェック

    • サイズが同じ

    • どちらか一方のサイズが 1

      以上のどちらかを満たせば OK。そうでない場合はエラー。

  3. 拡張

    サイズが 1 の次元は,もう片方に合わせて複製される(=broadcast される)。


具体例

import tensorflow as tf

# 2×3 の行列
a = tf.constant([[1, 2, 3],
                 [4, 5, 6]])        # shape=(2, 3)

# 長さ 3 のベクトル
b = tf.constant([10, 20, 30])      # shape=(3,)

# ブロードキャストにより b は (1,3) → (2,3) に拡張されてから足し算
c = a + b
print(c)
# tf.Tensor(
# [[11 22 33]
#  [14 25 36]], shape=(2, 3), dtype=int32)

この例では,b(shape=(3,))がまず (1,3) と見なされ,さらに行数方向に 2 行分複製されて (2,3) になります。


多次元テンソルでの応用

たとえば,形状 (4, 1, 6) のテンソルと ( 5, 6) のテンソルを足し算するときは:

  1. (4, 1, 6)
  2. ( 5, 6)(1, 5, 6) (左側に長さ 1 の次元を追加)
  3. 次元ごとに互換性をチェック → (4, 1, 6)(1, 5, 6) は OK
  4. ブロードキャスト → (4, 5, 6) に揃えたうえで演算
x = tf.zeros((4,1,6))
y = tf.ones((   5,6))
z = x + y   # 結果の shape は (4,5,6)


注意点

  • 意図しない拡張

    形状をよく確認せずに演算すると,思わぬ次元拡張が起こりバグの原因になることがあります。

  • 計算コスト

    ブロードキャストはメモリ上で実際にデータを複製するわけではありませんが,演算時に仮想的に複製して計算するため,大きな次元で多用すると処理が遅くなる場合があります。

  • 明示的なリシェイプ

    tf.reshapetf.expand_dimstf.squeeze を使って,自分で形状を整えてから演算するのもおすすめです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?