혜온의 이것저것

[Chapter 1 신경망 복습] 1 수학과 파이썬 복습 본문

Deep Learning/밑바닥부터 시작하는 딥러닝2

[Chapter 1 신경망 복습] 1 수학과 파이썬 복습

혜온 :) 2022. 1. 3. 12:05

1.1.1 벡터와 행렬

벡터는 크기와 방향을 가진 양으로 숫자가 일렬로 늘어선 집합으로 표현할 수 있다.

\begin{pmatrix} 1 \\ 2 \\ 3 \end{pmatrix}

행렬은 숫자가 2차원 형태(사각형 형상)으로 늘어선 것.

\begin{pmatrix} 1 & 2 \\ 3 & 4  \\ 5 & 6 \end{pmatrix}

벡터와 행렬을 확장하여 숫자 집합을 N차원으로 표현한 것도 생각할 수 있는데, 이를 일반적으로 텐서라고 한다.

벡터는 숫자들을 세로롤 나열하는 방법(열벡터), 가로로 나열하는 방법(행벡터)으로 표현 가능.

import numpy as np

x=np.array([1,2,3])
x.shape
## (3,)
x.ndim
## 1

W=np.array([[1,2,3],[4,5,6]])
W.shape
## (2,3)
W.ndim
## 2

 

1.1.2 행렬의 원소별 연산

W=np.array([[1,2,3],[4,5,6]])
X=np.array)[[0,1,2],[3,4,5]])
W+X
## array([[1,3,5],
##	[7,9,1]])
W*X
## array([[0,2,6],
##	[12,20,30]])

피연산자인 다차원 배열들에서 서로 대응하는 원소끼리 독립적으로 연산이 이루어지는 것을 넘파이 배열의 원소별 연산이라고 한다.

 

1.1.3 브로드캐스트

넘파이의 다차원 배열에서는 형상이 다른 배열끼리도 연산할 수 있다.

A=np.array([[1,2],[3,4]])
A*10
## array([[10,20],
##	[30,40]])

b=np.array([10,20])
A*b
## array([[10,40],
##	[30,80]])

행렬A에 스칼라 10을 곱하고, 1차원 배열은 b를 곱하면 배열A와 형상이 같아지도록 확장된 후 연산을 수행한다. 이 영리한 기능을 브로드캐스트(broadcast)라고 한다.

 

1.1.4 벡터의 내적과 행렬의 곱

$$ x=(x_1,\cdots,x_n), y=(y_1,\cdots,y_n) $$ 

2개의 벡터가 있다고 가정할때 내적

$$ x \cdot y = x_1 y_1 + x_2 y_2 + \cdots + x_n y_n $$

으로 두 벡터에서 대응하는 원소들의 곱을 모두 더한 것이다.

벡터의 내적은 직관적으로 두 벡터가 얼마나 같은 방향을 향하고 있는가를 나타낸다. 벡터의 길이가 1인 경우로 한정하면, 같은 방향을 향하는 두 벡터의 내적은 1이 되고, 반대 방향을 향하는 두 벡터의 내적은 -1이 된다.

a=np.array([1,2,3])
b=np.array([4,5,6])
np.dot(a,b)
## 32

행렬의 곱은 왼쪽 행렬의 행벡터와 오른쪽 행렬의 열벡터의 내적으로 계산한다.

예를 들어 A의 1행과 B의 1열의 계산 결과는 1행 1열 위치의 원소가 되고, A의 2행과 B의 1열의 계산 결과는 2행 1열 위치의 원소가 된다.

A=np.array([[1,2],[3,4]])
B=np.array([[5,6],[7,8]])
np.matmul(A,B)
## array([[19,22],
##	[43.50]])

벡터의 내적과 행렬의 곱 모두 np.dot( ) 사용할 수 있다.

인수가 모두 1차원 배열이면 벡터의 내적을 계산하고, 2차원 배열이면 행렬의 곱을 계산한다.

 

1.1.5 행렬 형상 확인

행렬이나 벡터를 사용해 계산할 때는 형상(shape)에 주의해야 하여 대응하는 차원의 원소 수를 꼭 일치시켜야 한다.

행렬의 곱 등 행렬을 계산할 때 형상 확인을 잘 해야 신경망 구현을 부드럽게 진행할 수 있다.

Comments