반응형

다차원 배열(행렬)은 딥러닝에서 신경망 구현시 필수로 알아야 하는 부분이다.

배열(Array)이나 행렬은 프로그래밍 언어나 수학을 배울 때 들어봤을 것이다.

딥러닝에서 신경망에도 다차원 배열이 꼭 필요하다고 한다.

어렵지 않으니 기본 개념부터 하나씩 같이 살펴보자.

딥러닝 신경망 다차원 배열 (행렬)

다차원 배열과 행렬

C나 자바 같은 프로그래밍 공부를 했다면 배열(Array)을 배웠을 것이다.

파이썬 딥러닝은 넘파이(Numpy)에서 배열(Array)을 지원한다.

np는 import numpy as np 에서

숫자 1부터 5까지 같은 데이터타입(숫자)을 만든다.

2차원 배열은 어떻게 만들까?

2×3 배열(행렬)

1차원 배열과 달리 2차원 배열은 [1,2,3]과 [4,5,6]을 []로 한 번 더 구분했다.

 

딥러닝 신경망을 구현하려면 배열로 된 행렬의 연산이 필요하다.

위 1차원 2차원 배열을 행렬로 표시하면 아래와 같다.

딥러닝 신경망 다차원 배열 (행렬)

2차원 배열부터 다차원 배열(행렬)이라 한다.

행렬은 뭘까? 행과 열을 의미한다.

행과 열 = 행렬

가로로 보는 행이 2줄이다. 1 2와 3 4.

세로도 열이 2줄이다. 1 3과 2 4.

가로는 행 세로는 열이라고 한다.

그래서 행렬이다.

위 행렬은 행이 2개 열이 2개라 2 × 2 행렬이라고 부른다.

 

행렬 곱셈 하는 방법

딥러닝 신경망에서 다차원 배열(행렬)이 필요하다.

그러기 위해서 행렬의 곱셈을 알아야 한다.

그 이유는 뒤에 나온다.

우선 학교 다닐 때 배운 행렬의 곱에 대해 살펴보자.

행렬 곱셈

× 2 행렬 두 개를 곱하는 식이다.

곱하는 방법은 아래와 같다.

1. 첫 번째 행렬의 1행과 두 번째 행렬의 1열을 곱한다.

2. 1 × 5 + 2 × 7 = 19로 1행 1열의 값이 된다.

3. 첫 번째 행렬의 1행과 두 번째 행렬의 2열을 곱한다.

4. 1 × 6 + 2 × 8 = 22로 1행 2열의 값이 된다.

5. 첫 번째 행렬의 2행과 두 번째 행렬의 1열을 곱한다.

6. 3 × 5 + 4 × 7 = 43으로 2행 1열의 값이 된다.

7. 첫 번째 행렬의 2행과 두 번째 행렬의 2열을 곱한다.

8. 3 × 6 + 4 × 8 = 50으로 2행 2열의 값이 된다.

행렬의 곱은 새로운 행렬을 만든다.

 

행렬 곱셈의 결과

직접 계산을 해보자.

눈으로만 보면 실수할 확률이 높다.

 

행렬의 곱셈, 파이썬 넘파이 (Python, Numpy) 

이제 직접 행렬 곱셈을 코딩해 보자.

직접 코딩 연습 하라고 캡처함.

numpy를 import 해서 array를 사용해야 된다.

6번 라인을 보면 numpy 함수 dot을 사용하고 있다. (np.dot())

행렬곱을 계산해 주는 기능은 dot 함수로 할 수 있다.

행렬곱을 할 경우 주의할 점이 있다.

모든 행렬을 곱할 수 없다. 조건이 있다.

첫 번째 행렬의 열과 두 번째 행렬의 행은 같은 숫자여야 한다.

× 2 행렬 곱하기 × 2 행렬인 경우 앞의 열 2와 뒤의 행 2가 같다.

만약 × 3 행렬 곱하기 3 × 4 행렬인 경우도 앞의 열 3과 뒤의 행 3이 같다.

× 2 행렬 곱하기 3 × 2 행렬인 경우 앞의 열 2와 뒤의 행 3이 다르다. 계산할 수 없다.

하나가 1차원 배열인 경우,

× 2 행렬 곱하기 2 배열은 첫 번째 2열과 두 번째 2가 같기에 가능하다.

2 배열 곱하기 3 × 2 행렬은 첫번째가 2이고 두 번째 행렬의 행은 3이라 다르다. 계산할 수 없다.

파이썬 코드로 확인해 보자.

딥러닝 신경망 다차원 배열 (행렬)

결과는 다음과 같다.

6번 라인은 A1의 행렬로  (4, 3)

7번 라인은 A2의 행렬로 (3, 2)

A1의 열과 A2의 행이 3으로 같다. 그래서 오류 없이 결과가 나온다.

딥러닝 신경망 다차원 배열 (행렬)

4번 라인을 보면 × 2 행렬이다.

6번과 7번 라인을 보면 (4, 3) (2, 2)가 되고 첫번째 열은 3 두 번째 행은 2 다르다.

위 코드를 실행하면 오류가 난다.

앞의 열과 뒤의 행 숫자가 맞지 않아 계산 불가 오류가 남.

× 2 행렬 곱하기 2 배열도 코딩해 보자.

(2,2) × (2)

첫 번째 열 2와 두 번째 1차원 2 배열과 일치한다. 

잘 실행된다.

(2) × (2,3)

이 예제는 1차원 배열과 2차원 행렬의 곱이다. 

첫 번째 1차원 2와 두 번째 2차원 행인 2와 일치해서 잘 된다.

다차원 배열, 행렬과 신경망과의 관계

이전 포스팅에서 신경망의 구조와 퍼셉트론에 대해 알아봤다.

2025.03.21 - [인공지능(AI)/딥러닝(DeepLearning)] - [딥러닝]신경망과 활성화 함수(계단 함수, 시그모이드 함수, ReLU 함수) 계산 방법. 초보용 핵심 정리.

 

[딥러닝]신경망과 활성화 함수(계단 함수, 시그모이드 함수, ReLU 함수) 계산 방법. 초보용 핵심 정

딥러닝을 공부하면서 이해하기 어려운 부분이 나온다. 나를 위해 정리해 봤다. 같은 공부를 하는 독자가 있다면 조금이나마 도움이 되길 바란다.시작해 보자. 신경망이란?신경망(Neural Network)은

tiboy.tistory.com

신경망은 입력층, 은닉층 그리고 출력층으로 구성되어 있다.

퍼셉트론을 보면 가중치(w)와 편향( 𝞱)을 활용해 계산 후 출력값을 만든다.

여기서, 다차원 배열(행렬)이 신경망에서 어떻게 활용되는지 궁금해진다.

먼저 신경망과 퍼셉트론의 예를 보자.

딥러닝 신경망 다차원 배열 (행렬)

입력층, 은닉층, 출력층이 있는 신경망 구조의 예다.

입력값은 x1, x2로 1차원 배열로 보자. 

입력층이 가중치(w)와 곱하고 편향을 더하면 은닉층의 a1, a2 값이 나온다.

이 식을 행렬의 곱으로 계산하면 된다.

처음 1차식 2 배열과 가중치 2차식 × 2 행렬을 곱한 뒤 편향 b를 더한다는 의미다.

이렇게 그림으로 그리면 입력층 x가 1, 2로 2개이고 가중치 시작 밑이 1과 2만 있어 2개라 계산이 가능하다는 의미다.

만약 가중치 밑 3이 존재한다면 구조 자체가 잘못된 것이라는 의미다.

은닉층 a 가 3개라도 가중치 시작 밑은 1과 2면 된다.

그림으로 간단하게 보자.

?를 잘 살펴보자

x1의 선은 빨간색이다. x1에서 출발했게이 w밑이 1로 시작하고 a1로 도착하면 w밑이 1로 끝난다. w11   

x2의 선은 파란색이다. 만약 a2로 간다면 x2에서 시작, a2로 도착이기에 w22가 된다.

x3가 없는데 x3에서 출발 a1에 도착하는 가중치 w31을 초록색으로 표현했다.

?를 보면 x3 이 없다. 그래서 행렬 곱이 불가능하다는 의미다.

 

신경망, 활성화 함수 그리고 행렬곱

다차원 배열(행렬) 곱을 파이썬 넘파이(Python Numpy)로 코드를 작성해 보자.

실제와 유사하게 활성화 함수도 추가했다.

지금까지 공부한 부분을 복습하고 확인하는 과정이라 생각하자.

시작~

import numpy as np

# 활성화 함수 시그모이드
def sigmoid(x):
 return 1 / (1 + np.exp(-x))

# 입력값 x 2개 설정
x = np.array([1.0, 2.0])

# 가중치 w
w = np.array([[0.1, 0.4], [0.2, 0.5]])

# 편향 b
b = np.array([0.1, 0.2])

# 계산해보자.
# 입력값 x와 가중치 w로  dot 함수로 행렬곱 계산 더하기 편향.
a = np.dot(x, w) + b

# 활성화 함수에 a 적용
z = sigmoid(a)

# 결과 출력
print(z)

# 결과 [0.64565631 0.83201839]

직접 코딩해 보자.

위 코드를 직접 복사해서 사용해도 된다. 마지막 라인에 결과도 추가했다.

친절하게 주석도 달았으니 자세히 살펴보면 이해될 것이다.

안되면 댓글에~

지금까지 딥러닝 신경망에서 중요한 역할을 하는 다차원 배열(행렬)의 곱셈에 대해 알아봤다.

이제 우리는 딥러닝 신경망에서 다차원 배열(행렬) 곱셈을 활용할 수 있게 되었다.

열공 열코딩~

반응형
반응형

딥러닝을 공부하면서 이해하기 어려운 부분이 나온다.

나를 위해 정리해 봤다. 

같은 공부를 하는 독자가 있다면 조금이나마 도움이 되길 바란다.

시작해 보자.

 

신경망이란?

신경망(Neural Network)은 무엇일까?

영화 터미네이터 2: 심판의 날을 보면 주인공 아놀드 슈왈제네거가 인조인간 역을 맡아 멋진 오토바이를 타고 활약한다.

인조인간 T-800은 존 커너를 제거하러 온 T-1000(액체형 인조인간)을 피하고 미래를 바꾸기 위해 노력한다.

이때 존 커너는 도망 다니면서 인간들의 방식을 T-800에게 교육한다.

몇 번의 반복 학습을 통해 T-800은 인간과 유사한 감정 표현과 행동을 하게 되고 그런 장면에서 웃었던 기억이 있다.

바로 오늘 공부할 신경망을 통해 훈련이 이뤄졌다고 본다.

존 코너에게 정보를 입력받고 T-800 내부 프로세스에서 학습 후 적절한 상황이 되면 출력하는 구조다.

입력층(존 커너 정보 받음) - 은닉층(T-800 내부 프로세스) - 출력층(T-800 말과 행동)

존 커너(입력층, 밖)는 T-800(은닉층, 프로세스)가 어떻게 받아들이는지 모른다.

그래서 은닉이라는 용어를 쓴다.

이처럼 신경망은 인간의 두뇌와 유사한 방식으로 데이터를 처리하고 결정할 수 있도록 컴퓨터를 교육 시킨다.

바로 머신러닝과 딥러닝 프로세스의 일종이다.

파이썬(Ptyhon) 코드로 직접 만들고 그래프를 출력해서 쉽게 이해해 보자.

 

퍼셉트론 활성화 함수인 계단 함수 특징

퍼셉트론을 되새겨 보자.

퍼셉트론도 인공 신경망 중 하나다.

2024.11.19 - [인공지능(AI)/딥러닝(DeepLearning)] - [딥러닝]퍼셉트론(Perceptron)이란? 초보 인공지능(AI) 개발자를 위한 쉬운 설명, 퍼셉트론 뜻

 

[딥러닝]퍼셉트론(Perceptron)이란? 초보 인공지능(AI) 개발자를 위한 쉬운 설명, 퍼셉트론 뜻

인공지능(AI) 프로그래머가 되고 싶다.처음 보는 단어가 많다.하나씩 정리해 본다.인공지능(AI) 개발자의 필수 공부 딥러닝(DeepLearning) 그리고 퍼셉트론(Perceptron)인공지능(AI) 개발자가 되기 위해서

tiboy.tistory.com

여러 개의 입력값을 받아 하나의 출력 신호를 내보내는 오래된 알고리즘이라 했다.

퍼셉트론은 가중치와 편향이 있고 두 개의 값에 의해 출력 신호가 제어된다.

그 수식은 다음과 같다.

퍼셉트론 (Perceptron) 수식

위 식의 구조는 다음과 같이 그릴 수 있다.

편향:1, 가중치:w1w2, 입력:x1x2, 출력:y

퍼셉트론의 활성화 함수는 계단 함수다.

파이썬(Python), numpy 그리고 matplotlib.pylab를 이용해서 계단 함수 그래프를 구현해 보자.

코드 내 "#" 뒤의 내용은 주석이니 참고하자.

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np     
import matplotlib.pylab as plb
 
def step_func(x):
    return np.array(x > 0, dtype=np.int32) # x가 0보다 크면 true(1), 같거나 작으면 false(0)
 
= np.arange(-3.03.00.001# -3에서 3 전까지 0.001 간격 넘파이 배열 생성  -3.0 ~ 2.9
= step_func(x)
 
plb.plot(x, y) # x, y 값 대입
plb.ylim(-0.11.1# y값(축) 범위 지정
plb.show() # 그래프 실행
cs

 

퍼셉트론 활성화 함수인 계단 함수

return 식을 보자.

return np.array(x > 0, dtype=np.int32)

np.array에서 x가 0보다 크면 true(1), 아니면 (0과 같거나 작으면, false(0))을 출력한다.

0과 1이 출력값이 되므로 계단 함수가 나오게 된다.

퍼셉트론처럼 기준점(가중치, 임계값을 적용해서)을 사이에 두고 0 또는 1 값만 표현된다.

신경망에서 활성화 함수인 시그모이드 함수(Sigmoid)

퍼셉트론에서 활성화 함수는 계단 함수임을 알았다.

좀 더 발전된 활성화 함수는 시그모이드(Sigmoid) 함수다.

시그모이드는 S 자 형태라는 의미다.

그래프가 S자 모양으로 나온다.

시그모이드 함수와 계단 함수를 파이썬(Python)으로 구현하고 그래프를 비교해 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np    
import matplotlib.pylab as plb
 
# 계단함수
def step_func(x):
    return np.array(x > 0, dtype=np.int32)
 
#시그모이드 함수
def sigmoid_func(x):
    return 1/(1+np.exp(-x))
 
= np.arange(-5.05.00.001)  
= step_func(x)
= np.arange(-5.05.00.001)  
= sigmoid_func(a)
 
plb.plot(x, y, a, b)
plb.ylim(-0.11.1)
plb.show()
cs

랑:계단 함수, 주황:시그모이드 함수

주황색 선이 시그모이드(Sigmoid) 함수다.

S 자 모양이다.

파란색 계단 함수와 다르지만 0과 1 사이에 있다.

계단 함수는 0과 1이 경계에서 갈라지지만 시그모이드 함수는 0.73, 0.88처럼 실수 값이 나와 곡선이 된다.

 

시그모이드(Sigmoid) 함수 계산 방법

계단 함수와 시그모이드 함수를 파이썬(Python)으로 코딩해 봤고 그래프도 그려봤다.

계단 함수는 0을 기준으로 조건을 걸어 true(1) 또는 false(0)으로 결과를 출력했다.

특별한 수식이 아닌 조건식이다.

반면, 시그모이드 함수식을 보자.

return 1/(1+np.exp(-x))

exp(-x)라는 생소한 함수가 보이고 분수식으로 되어 있다.

수학식으로 어떻게 계산하는지 보자.

함수 f(x) 식으로 구현해 보겠다.

exp()는 파이썬에서 사용하는 지수 계산 함수다.

수학식으로 바꾸면 다음과 같다.

우측항의 e는 자연 상수다.

수학에서 자연 상수 e는 매우 중요하게 사용된다.

자연 상수에 대한 이야기는 이 정도만 설명하겠다.

이제 위 공식과 값을 이용해서 시그모이드 식에 대입하고 실제 값을 계산해 보자.

위 함수 f(x)에서 exp 부분을 수식으로 바꾼다.

이 exp() 변환식을 시그모이드에 적용하자.

수학에서 지수 공식을 활용하자.

a가 0이 아니고 양의 정수라면 다음과 같다.

지수 공식에서 2번을 활용하면 되겠다.

시그모이드 함수 f(x)에 x = 1을 대입해 보자.

자연상수 e를 대입하자.

0.3679...가 나왔는데 소수점 4자리만 사용해서 다시 대입하자.

결과가 나왔다.

시그모이드 함수 f(1) = 0.713이다.

x = 5로 f(5)는 어떤 값이 나올까?

수학의 지수 법칙을 이용해 어렵지 않게 직접 풀어보았다.

0과 1만 출력하는 계단 함수와 다르게 시그모이드 함수는 실수형 값을 출력해서 부드러운 S 자형 곡선을 만들 수 있다.

렐루(ReLU, Rectified Linear Unit) 함수는 뭐지?

다 끝난 줄 알았는데 시그모이드 이후 더 많이 사용한다는 ReLU 함수가 있단다.

세 가지 함수를 같이 적용해서 파이썬(Python)으로 코딩하고 그래프를 확인하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np    
import matplotlib.pylab as plb
 
#계단 함수
def step_func(x):
    return np.array(x > 0, dtype=np.int32)
 
#시그모이드 함수수
def sigmoid_func(x):
    return 1/(1+np.exp(-x))
 
#ReLU 함수
def relu_func(x):
    return np.maximum(0, x)
 
= np.arange(-5.05.00.001)  
= step_func(x)
= np.arange(-5.05.00.001)  
= sigmoid_func(a)
= np.arange(-5.05.00.1)
= relu_func(c)
 
plb.plot(x, y, a, b, c, d)
plb.ylim(-0.15.1)
plb.show()
 
cs

초록:ReLU 함수다. 이해를 돕기 위해 y축을 5로 정했다.

ReLU 함수의 return 값을 보자.

return np.maximum(0, x)

numpy의 maximum 함수를 사용했다.

maximum은 입력받은 두 값 중 큰 값을 출력한다.

np.maximum(0, x)는 x값이 0보다 크면 x값 그대로 출력하고 0과 같거나 작으면 0만 출력한다.

그래서 그래프가 0보다 같거나 작을 때는 0을 유지하다 0을 지나면서 x=y 형태의 그래프가 그려지게 된다.

 

신경망의 활성화 함수의 공통점

각각 다른 계산식을 가진 신경망 활성화 함수다.

또한 비선형 그래프인 점이 같다.

 

정리해 보자

딥러닝을 공부하면서 퍼셉트론을 시작으로 신경망까지 왔다.

활성화 함수인 계단 함수, 시그모이드 함수,  ReLU 함수까지 파이썬으로 코딩하고 그래프로 특징을 확인했다.

첫걸음을 뗀 것이다.

수학에서 나오는 지수 함수와 파이썬/numpy 내장 함수를 활용해서 활성화 함수들을 이해하게 되었다.

1. 계단 함수

입력값에 가중치와 편향을 적용해서 나온 값을 기준으로 조건식을 이용해서 true/false 값으로 1 또는 0을 출력한다.

2. 시그모이드(Sigmoid) 함수

자연 상수로 구현된 식을 활용해서 실수형 값을 출력한다.

좀 더 세밀하게 구성할 수 있다.

3. 렐루(ReLU) 함수

maximum 함수를 사용해 0보다 크면 x=y 형태를 구성하고 0과 같거나 작으면 0을 출력하게 한다.

 

점점 재미있어진다.

잘못된 부분이 있으면 댓글로 알려주세요.

끝.

반응형