๊ด€๋ฆฌ ๋ฉ”๋‰ด

Doby's Lab

Tensor๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ndim์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์—ฐ์‚ฐํ• ๊นŒ? (Broadcasting Semantics) ๋ณธ๋ฌธ

Code about AI/PyTorch

Tensor๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ndim์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์—ฐ์‚ฐํ• ๊นŒ? (Broadcasting Semantics)

๋„๋น„(Doby) 2024. 5. 4. 01:19

๐Ÿค” Problem

์˜ค๋Š˜ ๋‹ค๋ฃจ์–ด๋ณผ ๋ฌธ์ œ๋Š” ์–ด์ฐŒ ๋ณด๋ฉด ์˜ˆ์ „๋ถ€ํ„ฐ ๊ถ๊ธˆํ–ˆ์œผ๋‚˜ ๊ทธ์— ๋Œ€ํ•œ ๋‹ต์„ ๊ฐ๊ฐ์ ์œผ๋กœ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๊ณ , ๋ฌธ์ œ์ ์œผ๋กœ ๋‹ค๋ฃจ์—ˆ์„ ๋•Œ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ–ˆ์—ˆ๊ธฐ์— ์กฐ๊ธˆ ๋ฏธ๋ฃจ์–ด์™”๋˜ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์˜ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์ „์— ์ด๊ฒƒ๋ถ€ํ„ฐ ์–˜๊ธฐํ•ด ๋ด…์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ฌ ๋•Œ, ๋ฐฐ์น˜ ๋‹จ์œ„๋กœ ํ•™์Šต์„ ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด์„œ Input Tensor๊ฐ€ (4, 2)์˜ shape์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, Batch Size๊ฐ€ 16์ด๋ผ ํ•ด๋ด…์‹œ๋‹ค.

 

์‹ค์ œ๋กœ ๋ชจ๋ธ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” Input Tensor์˜ shape์€ (16, 4, 2)๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ชจ๋ธ์˜ Weight๊ฐ€ Batch Size์— ๋”ฐ๋ผ์„œ ๋˜‘๊ฐ™์ด (16, weight shape)๋กœ ๋ณ€ํ•˜๋‚˜์š”? ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ (weight shape)์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์›์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ๋ฐ ์„œ๋กœ ์—ฐ์‚ฐ์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ๊ฒ๋‹ˆ๋‹ค.

 

์ด๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๋กœ ํ•˜์—ฌ๊ธˆ ํ˜ผ๋ž€์„ ๊ฐ€์ ธ์˜ค๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

'๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ๊ฑฐ์•ผ? ๋‚ด๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ํ•˜๊ณ  ์žˆ๊ธด ํ•œ ๊ฑฐ์•ผ?'

 

์—ฌ๊ธฐ์„œ ์˜ค๋Š˜ ์•Œ์•„๋ณผ ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ๋Š” 'Tensor๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ndim(์ฐจ์›์˜ ๊ฐœ์ˆ˜)์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์—ฐ์‚ฐ์„ ํ•˜๋Š”๊ฐ€?'๊ฐ€ ์ด๋ฒˆ ํฌ์ŠคํŒ…์˜ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

 

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์‹ค Broadcasting์˜ ๊ฐœ๋…์œผ๋กœ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ์ „๋ถ€์˜ˆ์š”. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด์„œ Broadcasting์„ ์„ค๋ช…ํ•˜๋ฉด ๋๋‚ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ œ๊ฐ€ ์›ํ•˜๋Š” ๊ฑด ์ด๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์ €๋Š” Broadcasting์˜ ๊ฐœ๋…์„ ์•Œ์•„๋„ ์ข…์ข… ๋ชจ๋ธ์„ ๋งŒ๋“ค ๋•Œ shape๊ณผ ๊ด€๋ จํ•œ ์‹ค์ˆ˜๋ฅผ ๋งŽ์ด ํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, ๊ฐœ๋…์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ Broadcasting๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ํ•ธ๋“ค๋งํ•  ๋•Œ๋Š” ์–ด๋ ค์›€์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋‹ค์‹œ ๋งํ•ด์„œ, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃฐ ์ฃผ์ œ์— ๋Œ€ํ•ด์„œ ์ •ํ™•ํžˆ ์žฌ์ •์˜๋ฅผ ํ•˜๋ฉด, 'Broadcasting์˜ ๊ฐœ๋…๊ณผ ์›๋ฆฌ๋Š” ์•Œ๊ฒ ์œผ๋‚˜, ์–ด๋– ํ•œ ๊ทœ์น™์ด ์žˆ๋Š”๊ฐ€?'๋ฅผ ๋‹ค๋ฃจ์–ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 


๐Ÿ˜€ Broadcasting Semantics

Broadcasting์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ๋‹ค๋ฃจ์ง€๋Š” ์•Š์ง€๋งŒ, ์ด ๊ฐœ๋…์— ๋Œ€ํ•ด ํ•ต์‹ฌ์ ์œผ๋กœ ๊ฟฐ๋šซ๋Š” ๋ง์ด ์žˆ๊ธฐ์— ์ด๊ฒƒ๋งŒ ์ ์–ด๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

 

"Broadcasting์ด๋ž€ ํŠน์ •ํ•œ ์–ด๋–ค ์กฐ๊ฑด์ด ๋งž์•„์ง„๋‹ค๋ฉด, ๋ชจ์–‘์ด ๋‹ค๋ฅธ ๋ฐฐ์—ด๋ผ๋ฆฌ๋„ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค."

 

์ด๋Ÿฌํ•œ Broadcasting์ด ์–ด๋–ค ์กฐ๊ฑด, ์–ด๋–ค ๊ทœ์น™์— ์˜ํ•ด์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€๋ฅผ Broadcasting Semantics๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ด๋ ‡๊ฒŒ ์–ธ๊ธ‰์„ ํ•˜๊ณ  ์žˆ๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ Semantics๋ž€ "์–ด๋–ค ์š”์†Œ๋ฅผ ์–ด๋– ํ•œ ์œ„์น˜์— ๋‘์–ด์•ผ ํ•˜๋Š”๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋–ค ์š”์†Œ๋ฅผ ์–ด๋– ํ•œ ์œ„์น˜์— ๋‘๋ฉด ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”์ง€๋ฅผ ๋งํ•œ๋‹ค.[1]"๋ผ๋Š” ๋œป์˜ ์šฉ์–ด์ž…๋‹ˆ๋‹ค.

 

Broadcasing Semantics์— ๊ด€ํ•œ ๋‚ด์šฉ์€ PyTorch์˜ Documentation[2]์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. (ํ•ด๋‹น ๋งํฌ์˜ In Brief: Tensor Broadcasting)

1๏ธโƒฃ ๋งˆ์ง€๋ง‰ ์ฐจ์›์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋น„๊ต

์ฒซ ๋ฒˆ์งธ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ํ…์„œ๋ผ๋ฆฌ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ๋Š” ๊ฐ ํ…์„œ์—์„œ ์ฐจ์›์˜ ํฌ๊ธฐ๋ฅผ ์„œ๋กœ ๋น„๊ตํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ ํ…์„œ์˜ ๋งˆ์ง€๋ง‰ ์ฐจ์› ํฌ๊ธฐ์—์„œ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ฒซ ์ฐจ์›์˜ ํฌ๊ธฐ๊นŒ์ง€ ๋น„๊ต๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์˜ˆ์‹œ๋ฅผ ๋“ ๋‹ค๋ฉด, ์ฒ˜์Œ์œผ๋กœ ๋ด์•ผ ํ•  ๊ฒƒ์€ 2์™€ 2์ž…๋‹ˆ๋‹ค. ๊ทธ๋‹ค์Œ์€ 3๊ณผ 3์ด๊ณ , ๊ทธ๋‹ค์Œ์€?

์—†์Šต๋‹ˆ๋‹ค. matrix2์˜ 0๋ฒˆ์งธ ์ฐจ์› ํฌ๊ธฐ๊ฐ€ 4์ด์ง€๋งŒ, ์ด๊ฒƒ์€ Broadcasting ๊ฐ€๋Šฅ ์—ฌ๋ถ€์— ์žˆ์–ด์„œ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ๋งˆ์ง€๋ง‰๋ถ€ํ„ฐ ๋ณด๋Š” ๊ฑฐ์˜ˆ์š”.

(๋ฌผ๋ก , ๋งˆ์ง€๋ง‰๋ถ€ํ„ฐ ๋ณผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋’ค ์ฐจ์›๋ถ€ํ„ฐ ๋งž์ถฐ์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ตณ์ด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ๋ถ€ํ„ฐ ๊ณ ๋ คํ•œ๋‹ค๋Š” ์ƒ๊ฐ์€ ๋ฒ„๋ ค๋„ ๋ฉ๋‹ˆ๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋‚  ๋•Œ๋„ ๋ณด๋ฉด, ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ์›์„ ์ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

matrix1 = torch.ones((   3, 2))
matrix2 = torch.ones((4, 3, 2))
matrix3 = matrix1 * matrix2

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒ๊ฐํ•ด ๋ณธ๋‹ค๋ฉด, 3x2 ํ–‰๋ ฌ๊ณผ ๋‹ค๋ฅธ 4๊ฐœ์˜ 3x2 ํ–‰๋ ฌ์„ ๊ฐ๊ฐ Element-wise Product๋ฅผ ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์˜๋ฏธ์—์„œ ๋” ๋งŽ์€ ์ฐจ์›์„ ๊ฐ€์ง„ ํ…์„œ์˜ ์•ž ์ฐจ์›๋“ค์€ ๋ณผ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋น„๊ตํ•˜๋Š” ์ฐจ์›๋“ค์€ ๊ทธ ํฌ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ 2์™€ 2, 3๊ณผ 3์ฒ˜๋Ÿผ ๋น„๊ต๋ฅผ ํ•˜๋Š” ์ฐจ์›๋“ค์˜ ํฌ๊ธฐ๋Š” ๋ชจ๋‘ ๊ฐ™์•„์•ผ Broadcasting์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด ๋ฉ๋‹ˆ๋‹ค.

matrix1 = torch.ones((3, 2))
matrix2 = torch.ones((2, 2))
matrix3 = matrix1 * matrix2

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋น„๊ตํ•˜๋Š” ์ฐจ์›์ด ๋‹ค๋ฅด๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

RuntimeError: The size of tensor a (3) must match the size of tensor b (2) at non-singleton dimension 0

0๋ฒˆ์งธ ์ฐจ์›์—์„œ 1๋ฒˆ ํ…์„œ์™€ 2๋ฒˆ ํ…์„œ์˜ ์‚ฌ์ด์ฆˆ(ํฌ๊ธฐ)๊ฐ€ ๋‹ค๋ฅด๋‹ˆ ์ด๊ฒƒ์„ ํ™•์ธํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

3๏ธโƒฃ ํ•˜์ง€๋งŒ, ๋น„๊ตํ•˜๋Š” ์ฐจ์›์ด ๋‹ค๋ฅด๋”๋ผ๋„ ๊ทธ ํฌ๊ธฐ๊ฐ€ 1์ด๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค.

2๋ฒˆ์—์„œ๋Š” ๋น„๊ตํ•˜๋Š” ์ฐจ์›๋“ค์ด ๋ชจ๋‘ ๊ฐ™์•„์•ผ ๋œ๋‹ค๊ณ  ํ–ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ผ๋„ ๊ทธ ํฌ๊ธฐ๊ฐ€ 1์ด๋ฉด Broadcasting์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

matrix1 = torch.ones((3, 2))
matrix2 = torch.ones((1, 2))
matrix2[:, 1] += 1

matrix3 = matrix1 + matrix2

์œ„์™€ ๊ฐ™์ด ํ–‰์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ผ๋ฉด, ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€๋Šฅํ•˜๊ณ ์š”.

matrix1 = torch.ones((3, 2))
matrix2 = torch.ones((3, 1))
matrix2[1, :] += 1
matrix2[2, :] += 2

matrix3 = matrix1 + matrix2

์œ„์™€ ๊ฐ™์ด ์—ด์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ผ๋ฉด, ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์‹œ๋“ค๊ณผ ์ฐจ์›์˜ ํฌ๊ธฐ๊ฐ€ 1์ธ ๊ฒฝ์šฐ์— ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ๋ณต์‚ฌํ•˜๋“ฏ์ด ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ๋ฒกํ„ฐ์—์„œ ํ–‰๋ ฌ๋กœ ์—ฐ์‚ฐ์„ ํผ์ ธ๋‚˜๊ฐ€๋“ฏ์ด ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Broadcasting์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์—ฐ์‚ฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด ํ…์„œ, ๋ฒกํ„ฐ๊ฐ€ ์•„๋‹Œ ์Šค์นผ๋ผ์ธ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

์‚ฌ์‹ค ์ด๊ฒƒ์€ ์•ˆ ์ ์œผ๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. 1๋ฒˆ๊ณผ 3๋ฒˆ ์กฐ๊ฑด์„ ํ•ฉ์นœ ๊ฒƒ๊ณผ ๊ฒฐ๊ตญ์— ๊ฐ™์€ ์ด์•ผ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

matrix1 = torch.ones((3, 2))
matrix2 = torch.ones((1))

matrix3 = matrix1 * matrix2

์œ„ ์ฝ”๋“œ์—์„œ ์Šค์นผ๋ผ์˜ shape์„ ๋ณด๋ฉด 1๋ฒˆ ์กฐ๊ฑด์— ๋Œ€ํ•ด์„œ 1๊ณผ 2๋งŒ ๋น„๊ตํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋น„๊ตํ•˜๋Š” ์ฐจ์›์ด 1์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜๋„ ์ ์–ด๋‘” ์ด์œ ๋Š” ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์™€์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๊ณ , ์ด๊ฒƒ์ด ๊ฒฐ๊ตญ์—๋Š” Broadcasting์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๋ฐ์— ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ์˜ˆ์‹œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

5๏ธโƒฃ ํ–‰๋ ฌ ๊ณฑ์€ ๋งˆ์ง€๋ง‰ ๋‘ ์ฐจ์›์ด ํ–‰๋ ฌ ๊ณฑ์˜ ์กฐ๊ฑด์„ ๊ฐ–์ถ”๋ฉด ๋œ๋‹ค.

์–ด์ฉŒ๋ฉด ์ด ๊ธ€์„ ์จ์•ผ ํ–ˆ๋˜ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋”ฅ๋Ÿฌ๋‹์—์„œ element-wise product๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” matrix multiplication๋ณด๋‹ค ๋น„์ค‘์ด ๋” ์ ๊ณ , Broadcasting Semantics์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•˜๊ฒŒ ๋˜์—ˆ๋˜ ์ด์œ ๋„ ์—ฌ๊ธฐ์— ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ์ด ๋‚ด์šฉ์€ ์ œ๊ฐ€ ์ฐธ๊ณ ํ•œ ๊ณต์‹ ๋ฌธ์„œ๋‚˜ ๋‹ค๋ฅธ ํฌ์ŠคํŒ…์—์„œ๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ element-wise๊นŒ์ง€๋งŒ Broadcasting์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ 5๋ฒˆ ์กฐ๊ฑด์€ ์ œ๊ฐ€ ์‹คํ—˜์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•œ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์‹คํ—˜์„ ํ†ตํ•ด์„œ ์•Œ๊ฒŒ ๋œ ๊ฒƒ์€ ๋‹น์—ฐํ•œ ๋‚ด์šฉ์ผ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

 

ํ–‰๋ ฌ ๊ณฑ์— ๋Œ€ํ•ด์„œ๋Š” 1~4๋ฒˆ ์กฐ๊ฑด๊นŒ์ง€ ๋ชจ๋‘ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋”ฑ ํ•˜๋‚˜์˜ ์กฐ๊ฑด๋งŒ ๋” ์ง€์ผœ์ง€๋ฉด ํ–‰๋ ฌ ๊ณฑ์— ์žˆ์–ด์„œ๋„ Broadcasting Semantics๋Š” ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰ ๋‘ ์ฐจ์›์ด ํ–‰๋ ฌ ๊ณฑ์˜ ์กฐ๊ฑด์„ ๊ฐ–์ถ”๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ๋งˆ์ง€๋ง‰ ๋‘ ์ฐจ์›์ž…๋‹ˆ๋‹ค.

 

ํ•ต์‹ฌ์„ ๋‹ค๋ฃจ๊ธฐ ์ „์—, ํ–‰๋ ฌ ๊ณฑ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ด…์‹œ๋‹ค. ํ–‰๋ ฌ ๊ณฑ์˜ ์กฐ๊ฑด์€ ๋‹น์—ฐํžˆ ์ต์ˆ™ํ•˜๊ฒ ์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ํ–‰๋ ฌ์˜ ์—ด๊ณผ ๋‘ ๋ฒˆ์งธ ํ–‰๋ ฌ์˜ ํ–‰์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ํ–‰๋ ฌ ๊ณฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์กฐ๊ฑด์„ ํ…์„œ์˜ ๊ฒฝ์šฐ๋กœ ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ์ฒซ ๋ฒˆ์งธ ํ…์„œ๊ฐ€ n๊ฐœ์˜ ์ฐจ์›์„ ๊ฐ€์ง€๊ณ , ๋‘ ๋ฒˆ์งธ ํ…์„œ๊ฐ€ m๊ฐœ์˜ ์ฐจ์›์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ๋•Œ, n์˜ ์ฐจ์›์˜ ํฌ๊ธฐ์™€ m-1์˜ ์ฐจ์› ํฌ๊ธฐ๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ๋กœ ๋ดค์„ ๋•Œ๋Š” ์ฒซ ๋ฒˆ์งธ ํ…์„œ์—์„œ 0๋ฒˆ์งธ ์ฐจ์›์ด 3์ธ ๊ฒƒ์€ 1~4๋ฒˆ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๊ณ ๋ คํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ์ƒ๊ด€์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , 2x5 ํ–‰๋ ฌ๊ณผ 5x4 ํ–‰๋ ฌ์ด ํ–‰๋ ฌ๊ณฑ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” Broadcasting์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

matrix1 = torch.ones((3, 2, 5))
matrix2 = torch.ones((5, 4))

matrix3 = matrix1 @ matrix2

๊ทธ๋Ÿฌ๋ฉด, ๋งˆ์ง€๋ง‰ ๋‘ ์ฐจ์›์ด์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ƒ? ๋งˆ์ง€๋ง‰ ๋‘ ์ฐจ์›์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์˜ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

matrix1 = torch.ones((3, 2, 5, 4))
matrix2 = torch.ones((3, 5, 2, 4))

matrix3 = matrix1 @ matrix2

์œ„ ์ฝ”๋“œ๊ฐ€ ๊ทธ ๊ฒฝ์šฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ธ๋ฐ ์œ„ ์ฝ”๋“œ๋Š” ๋‹น์—ฐํ•˜๊ฒŒ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์• ์ดˆ์— ์ฝ”๋“œ์˜ ๊ด€์ ์—์„œ๋Š” 2๋ฒˆ ์กฐ๊ฑด์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ์ˆ˜ํ•™์ ์œผ๋กœ ์ด๋ฅผ ์ ‘๊ทผํ•ด ๋ดค์„ ๋•Œ, ๋งŒ์•ฝ์— ์ด๊ฒƒ์ด 'ํ–‰๋ ฌ ๊ณฑ์˜ ์กฐ๊ฑด์ฒ˜๋Ÿผ ์™œ ๋˜์ง€ ์•Š๋Š๋ƒ?'๋ฅผ ๋ฌผ์—ˆ์„ ๋•Œ๋Š” ์ด๊ฒƒ์€ ํ–‰๋ ฌ ๊ณฑ์˜ ์ •์˜์— ์œ„๋ฐฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•„๋งˆ, 2x5 ํ–‰๋ ฌ๊ณผ 5x2 ํ–‰๋ ฌ์ด ๊ณฑํ•ด์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ–ˆ์„ ํ…๋ฐ, ํ–‰๋ ฌ ๊ณฑ์€ ๊ฒฐ๊ตญ ํ–‰๋ ฌ ํฌ๊ธฐ์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•˜์—ฌ ์›์†Œ๋ฅผ ๊ณฑํ•˜๊ณ  ๋”ํ•˜๋Š” ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, 2x5 ํ–‰๋ ฌ, 5x2 ํ–‰๋ ฌ์ด๋ผ ๋ณด๋Š” ๊ด€์ ์€ ์›์†Œ๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ดค๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ ์—ฌ๊ธฐ์„œ ์›์†Œ ์ž์ฒด์˜ ์˜๋ฏธ๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๊ทธ ์ž์ฒด์ผ ๋ฟ, ๋ฒกํ„ฐ๋‚˜ ํ–‰๋ ฌ ํ˜น์€ ๋” ๋‚˜์•„๊ฐ€์„œ ํ…์„œ๊ฐ€ ๋  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰ ๋‘ ์ฐจ์›์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ž, ์ด๋ ‡๊ฒŒ 1~5๋ฒˆ ์กฐ๊ฑด๊นŒ์ง€ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. 4๋ฒˆ ์กฐ๊ฑด์„ ์ œ์™ธํ•˜๋ฉด, ์ƒ๊ฐํ•ด ๋ณผ ๊ฒƒ์€ 4๊ฐœ ์—†์œผ๋‹ˆ ์ตํ˜€๋‘๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.


โœ… Result

์˜ค๋Š˜์€ Broadcasting Semantics์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ์ด ๊ทœ์น™๋งŒ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐœ๋…์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋ฐฐ์ œ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋… + ๊ทœ์น™์„ ๋™์‹œ์— ์„ค๋ช…ํ•˜๊ธฐ์—๋Š” ์ œ๊ฐ€ ๋‹ค๋ฅธ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•  ๋•Œ, ์กฐ๊ธˆ ๋ณต์žกํ•˜๊ฒŒ๋” ๋Š๊ปด์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๋˜ํ•œ, Broadcasting์€ ๋”ฅ๋Ÿฌ๋‹์—์„œ๋Š” ์•„์ฃผ ์ค‘์š”ํ•œ ์—ฐ์‚ฐ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ, ์˜ค๋Š˜ ์•Œ๊ฒŒ ๋œ ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ํ† ๋Œ€๋กœ ๋ชจ๋ธ์„ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด ์—๋Ÿฌ์˜ ๋นˆ๋„์ˆ˜๋ฅผ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“‚ Reference

https://jake-seo-dev.tistory.com/445

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋งํ•˜๋Š” ์˜๋ฏธ๋ก  (Semantics, ์‹œ๋ฉ˜ํ‹ฑ) ์ด๋ž€?

์˜๋ฏธ๋ก  (Semantics)์ด๋ž€? ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์šฉ์–ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์˜์–ด๋กœ๋Š” semantics ๋กœ ๋ถˆ๋ฆฐ๋‹ค. ์–ด๋–ค ์š”์†Œ๋ฅผ ์–ด๋– ํ•œ ์œ„์น˜์— ๋‘์–ด์•ผ ํ•˜๋Š”๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋–ค ์š”์†Œ๋ฅผ ์–ด๋– ํ•œ ์œ„์น˜์— ๋‘๋ฉด

jake-seo-dev.tistory.com

https://pytorch.org/tutorials/beginner/introyt/tensors_deeper_tutorial.html

 

Introduction to PyTorch Tensors — PyTorch Tutorials 2.3.0+cu121 documentation

Note Click here to download the full example code Introduction || Tensors || Autograd || Building Models || TensorBoard Support || Training Models || Model Understanding Introduction to PyTorch Tensors Follow along with the video below or on youtube. Tenso

pytorch.org

 

728x90