ブロードキャストとは
TensorFlow におけるブロードキャスト(broadcasting)とは,
形状(shape)の異なるテンソル同士で算術演算(足し算・掛け算など)を行うときに,
内部的に“次元を合わせて”自動的に拡張(broadcast)して計算できる仕組みです。
例えば,行列(2×3)とベクトル(3)の足し算を考えると,
ベクトルの次元を行列の行数分だけ複製して(2×3)に揃えた上で計算を行います。
ブロードキャストの基本ルール
TensorFlow(および NumPy)では,次のルールでブロードキャストを行います。
-
右詰めで次元を比較
形状の短い方のテンソルには,左側に長さ 1 の次元を補って比較します。
例:
(2, 3)
と(3,)
は →(2, 3)
と(1, 3)
として扱われる -
各次元ごとに互換性をチェック
-
サイズが同じ
-
どちらか一方のサイズが 1
以上のどちらかを満たせば OK。そうでない場合はエラー。
-
-
拡張
サイズが 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)
のテンソルを足し算するときは:
(4, 1, 6)
-
( 5, 6)
→(1, 5, 6)
(左側に長さ 1 の次元を追加) - 次元ごとに互換性をチェック →
(4, 1, 6)
と(1, 5, 6)
は OK - ブロードキャスト →
(4, 5, 6)
に揃えたうえで演算
x = tf.zeros((4,1,6))
y = tf.ones(( 5,6))
z = x + y # 結果の shape は (4,5,6)
注意点
-
意図しない拡張
形状をよく確認せずに演算すると,思わぬ次元拡張が起こりバグの原因になることがあります。
-
計算コスト
ブロードキャストはメモリ上で実際にデータを複製するわけではありませんが,演算時に仮想的に複製して計算するため,大きな次元で多用すると処理が遅くなる場合があります。
-
明示的なリシェイプ
tf.reshape
やtf.expand_dims
,tf.squeeze
を使って,自分で形状を整えてから演算するのもおすすめです。