728x90
반응형
신경망의 추론 전체 그림
- 신경망은 간단하게 말하면 '함수'라 할 수 있다.
- 예) 2차원 데이터를 입력해 3차원 데이터를 출력하는 함수
- 입력층(input layer)에는 뉴런2개, 출력층(output layer)에는 3래를 각각 준비
- 은닉층(hidden layer)혹은 중간층에도 적당한 수의 뉴런을 배치한다.
신경망의 예
- 화살표에는 가중치(weight)가 존재하며, 그 가중치와 뉴런을 각각 곱해서 그 합이 다음 뉴런의 입력으로 쓰인다.(정확히 그 합에 활성화 함수(activation function)를 적용한 값이 다음 뉴런의 입력이 된다.)
- 이때 각 층에서는 이전 뉴런의 값에 영향받지 않는 '정수'도 더해진다.
- 이 정수는 편향(bias)라고 한다.
- 신경망은 인접하는 층의 모든 뉴런과 연결(화살표로 이어짐)되어 있다는 뜻에서 완전연결계층(fully connected layer)라고 한다.
신경망이 수행하는 계산 수식
은닉층의 첫 번째 뉴런
- 은닉층의 뉴런은 가중치의 합으로 계산된다.
위의 식 간소화
- x는 입력, h는 은닉층의 뉴런, W는 가중치, b는 편향
완전연결계층에 의한 변환의 미니배치 버전
# 완전연결계층에 의한 변환의 미니배치 버전
W1 = np.random.randn(2,4) # 가중치
b1 = np.random.randn(4) # 편향
x = np.random.randn(10, 2) # 입력
h = np.matmul(x, W1) + b1
# 10개의 샘플 데이터 각각을 완전연결계층으로 변환
# x의 첫 번째 차원이 각 샘플 데이터에 해당한다.
# x[0]은 0번째 입력 데이터, x[1] 은 첫 번째 입력 데이터
# h[0]은 0번째 은닉층 뉴런
# b1의 덧셈은 브로드캐스트 b1의 형상은 (4,) 이지만 자동으로 (10,4)로 복제
- 완전연결계층에 의한 변환은 '선형' 변환이다.
- '비선형' 효과를 부여하는 것이 바로 활성화 함수다.
- 활성화 함수를 이용함으로 신경망의 표현력을 높일 수 있다.
- 여기서는 시그모이드 함수(sigmoid function)를 사용 - 'S'자 모양의 곡선 함수
시그모이드 함수의 그래프
def sigmoid(x):
return 1/(1 + np.exp(-x))
- 시그모이드 함수는 임의의 실수를 받아 0에서 1사이의 실수를 출력한다.
a = sigmoid(h)
- 활성화 함수의 출력 a(활성화(activation)라고 한다.) 또 다른 완전연결계층에 통과시켜 반환한다.
종합
def sigmoid(x):
return 1/(1 + np.exp(-x))
W1 = np.random.randn(2,4)
b1 = np.random.randn(4)
x = np.random.randn(10, 2)
W2 = np.random.randn(4,3)
b2 = np.random.randn(3)
h = np.matmul(x, W1) + b1
a = sigmoid(h)
s = np.matmul(a, W2) + b2
계층으로 클래스화 및 순전파 구현
- 신경망에서 하는 처리를 계층(layer)로 구현
- 완전연결계층에 의한 변환 Affine 계층
- 시그모이드 함수에 의한 변환을 Sigmoid 계층으로 구현
- 완전연결계층에 의한 변환은 기하학에서 아핀(affine) 변환에 해당하기 때문에 Affine 계층이라고 이름 지음
- 기본 변환을 수행하는 메서드 이름 forward()
순전파(forward propagation)
- 신경망 추론 과정에서 하는 처리
- 그대로 입력층에서 출력층으로 향하는 전파
- 각 계층이 입력으로부터 출력 방향으로 처리 결과를 차례로 전파해간다.
Sigmoid 계층과 Affine 계층
class Sigmoid:
def __init__(self):
self.params = []
def forward(self, x):
return 1/(1+np.exp(-x))
class Affine:
def __init__(self,W,b):
self.params = [W,b] # 가중치와 편향, 신경망이 학습될 때 수시로 갱신
def forward(self, x):
W, b = self.params
out = np.matmul(x, W) + b
return out
- Affine 계층은 초기화될 때 가중치와 편향을 받는다. - 가중치와 편향은 Affine 매개변수며 신경망이 학습될 때 수시로 갱신된다.
구현해볼 신경망의 계층 구성
class TwoLayerNet:
def __init__(self, input_size, hidden_size, output_size):
I, H, O = input_size, hidden_size, output_size
#가중치와 편향 초기화
W1 = np.random.rand(I, H) # 입력층, 은닉층
b1 = np.random.rand(H) # 은닉층
W2 = np.random.rand(H, O) # 은닉층, 출력층
b2 = np.random.rand(O) # 출력층
# 계층 생성
self.layers = [
Affine(W1,b1),
Sigmoid(),
Affine(W2, b2)
]
# 모든 가중치 리스트에 모으기
self.params = []
for layer in self.layers:
self.params += layer.params
def predict(self, x):
for layer in self.layers:
x = layer.forward(x)
return x
x = np.random.rand(8,2)
model = TwoLayerNet(2, 4, 3)
s = model.predict(x)
출처 : 밑바닥부터 시작하는 딥러닝2
https://www.hanbit.co.kr/store/books/look.php?p_code=B8950212853
728x90
반응형
최근댓글