행렬의 연산시 파이토치가 브로드캐스팅을 통해 크기를 맞춰줌.1

Explicit is better than implicit

하지만 이건 그냥 코딩얘기고 인공지능에서는 브로드캐스팅 하는게 정석이다. 연산을 벡터화해서 반복문없이 매우 큰 성능을 가져갈 수 있다.
그냥 책에서 연산시 행렬 크기를 자동으로 맞춰준다길래 진짜 필요없는 기술이라고 생각했는데, (3,4)*(2,3) 같은 연산을 가능케 하는 그런 건 아니다. 내가 안써봐서 그렇지 사실은 수학적으로 더 직관적이라고 함.

브로드캐스팅의 핵심 규칙

Trailing Dimensions

텐서의 차원을 오른쪽에서부터 읽은 배열

ex) shape이 (3, 2, 4) 인 경우
후행 차원은 4, 2, 3

원본 링크

  1. 텐서의 차원(Rank)가 같을 필요는 없음 >> Rank가 다르면 자동으로 선행 차원에 크기가 1인 차원 추가됨
  2. 후행 차원으로 비교했을 때, 다음 조건 중 하나를 만족해야 한다
    1. 각 차원의 크기가 일치
    2. 한 차원의 크기가 1

ex. (2, 3, 4) 와 (1, 4) 연산
후행 차원 : 4, 3, 2와 4, 1
첫 번째 차원 : 둘다 4로 일치
두 번째 차원 : 하나가 1이므로 가능
세 번째 차원 : 1인 차원이 추가되므로 가능
따라서 (2, 3, 4) 와 (1, 4) 연산은 가능하다.

활용처

스칼라 + 텐서
텐서 + 벡터 : 편향 벡터 더할때 자주 쓰임
배치 정규화 하면 (1,특성수) 모양의 평균벡터가 나오는데 여기서 브로드캐스팅으로 바로 연산할 수 있음.

쓸데없는 지식

내부적으로 반복문을 안 쓰는건 아니다. 말이 안되잖아.
근데 내부적으로 CPU실행시, SIMD연산을 시키고
GPU실행시, CUDA 연산 시킨다.
그래서 파이썬으로 그냥 돌리는거랑 아주 다른 속도가 된다.

더 쓸데없는 지식

매트랩도 이래서 행렬연산 빠른거임.

Footnotes

  1. Dot Product vs Element-Wise Multiplication