티스토리 뷰
1. Introduction to Deep Learning / L5. Matrix Math and NumPy Refresher - Element-wise Matrix Operations
chrisysl 2018. 6. 23. 19:39Scalar Math
- 2 + 3 = 5 또는 2 * 3 = 6과 같이 대부분의 스칼라값 계산은 덧셈과 곱셈이다.
- 신경망 네트워크에선 이러한 스칼라값의 계산도 수천 수백개씩 해야할 경우가 다수이다.
- 또 [2^2 4^2 6^2 ...] 와 같은 행렬에서도 여기에 다시 제곱을 해야 할 수도 아니면
- 동일한 값으로 모두 나눠야 하는 경우도 있다.
- 또한 프로그램을 설계함에 있어 모든 값에 대해 어느 시점에서 반복문을 돌려야 할 지도 고려해야한다.
- 그런데 이러한 연산에 대한 복잡도를 고려할 때 행렬이 한가지 대안이 될 수 있다.
Element-wise Operation
- 이러한 수많은 스칼라 값들이 행렬에 저장되어 있으면 Element-wise Operation이 가능한데,
- 행렬의 개별 원소(요소)들을 각각 처리 및 계산할 수 있고 또 같은(동일한) 연산을 모두 적용시킬 수 있다.
- 예시로 행렬이라는 단어(용어)를 사용하였을 뿐 실제로는 어떠한 차원에서건
- 이 Element-wise Operation은 모두 적용되는 개념이다.
- 2 + 3 = 5와 같이 스칼라값 두개를 더하는것은 쉽다.
- 그 아래 보이는 것 처럼 스칼라를 행렬에 더하는것도 동일하다.
- 이번엔 픽셀에 대해 얘기해보도록 하자.
- 한 이미지에 RGB 픽셀값 중 R타입의 픽셀값을 행렬로 가지고 있다면, 0~255 범위 중 한가지 값을 가질것이다.
- 이러한 픽셀값을 0에서 1사이의 값인 floating point value로 정규화(Normalization) 시켜보도록 하자.
- 간단하다. 행렬 전체를 255로 나눠주면 된다. (divide the matrix element-wise by 255)
- 이러한 정규화의 개념은 스칼라 값(위의 예시에선 255)에만 해당되는것이 아니라
- 행렬로 나누는것도 가능하다. 즉, 행렬 두개를 가지고도 정규화가 가능하다.
- 행렬을 이용해 정규화를 시키기 위해선, 두 행렬의 shape가 동일해야한다.
- 행렬의 shape가 같을 경우, 상응하는 index의 값에대한 연산이 가능하다.
Element-wise operations
· The Python way
- 파이썬으로 숫자 리스트에 대한 모든 요소에 5를 더하는 방법으로는 반복문을 돌리는것이다.
- 예시로 들은 것은 요소들의 개수가 몇개 안되지만, 집합이 커지는경우 순수 파이썬은 연산이 매우 느려지게 된다.
· The Numpy way
- 넘파이로는 이와같이 코드를 줄이고 직관적으로 연산이 가능하다.
- 일반적으로 데이터를 ndarray에 저장하게 될 텐데, 그렇게 되면 더 간단해진다.
- values 라는 이름의 ndarray에 모든 요소들에 5를 더하는 연산은 이거면 된다.
- 넘파이는 이러한 연산에 대해 직관적으로 연산을 줄여줄 수 있지만, 표준 수학 연산도 지원한다.
- 즉 위의 두 계산식은 동일한 것이다.
- 앞으로 함수를 사용한 연산 보다는 연산자를 통한 연산을 자주 사용하게 될텐데
- 그 이유는 코드를 더 직관적으로 이해할 수 있기 때문이다.
- m 이라는 행렬을 가지고 있는데, 이것을 재사용하려면 먼저 모든 값들을 0으로 만들어야한다(초기화).
- 이럴경우 간단하게 위와같이 처리 할 수 있다.
Element-wise Matrix operations
# 행렬 연산에 대한 예시
# shape이 다른 행렬에 대한 연산을 시도하면 에러가 난다.