신경망 이야기 하게 되면, 제프리 힌튼 교수 처음 강의에 뉴런에 대해서 나온다. 한국어로 번역이 가능 한데, 음성을 영어로 인식 한 다음에 번역한 다음에 한국어로 나오게 할 수 있다.
즉 사람의 뇌의 구조는 복잡하게 되어 있다는 데 뉴런이 10^10개 100억개가 있다고 한다. 생물학적인 성격의 설명이 있는데, 직접 동영상을 보는 것이 좋을 것 같아서 링크하였다.
1. 일반적인 신경망
일반적인 신경망은 가장 왼쪽이 입력층(input layer), 가장 오른쪽 출력층(output layer) 그리고 가운데 층들은 은닉층(hidden layer)라고 부른다.
2. 단일 층 신경망
단일 층 신경 망은 앞에서 이미 설명 하였다. 단일층 신경망에 대해서 알고 싶으면, 아래를 클릭 후 본 다음에 다시 여기로 오면 된다.
이론
https://rdmkyg.blogspot.com/2021/05/part-1.html
예제
https://rdmkyg.blogspot.com/2021/05/wisconsin-breast-cancer-dataset.html
하지만 Loss Function을 이용해서 Loss 값을 관찰 해서, 여러가지 기능을 추가 시킬 수 있다.
그 이유는 경사 하강 법을 사용하지 않았기 때문이다.
이유는 최적치에 수렴 하는 과정을 안정적으로 하기 위함이다. 배치 경사 하강법에는 아래와 같이 존재 한다.
- 배치 경사 하강법(batch gradient descent) : 한번에 그레이언트 계산
- 미니 배치 경사 하강법 (mini batch gradient descent) : 배치크기를 작게 하여 계산
직접 딥러닝 프로젝트를 하면, 학습 곡선이 불안정 할때가 있다. 학습곡선이 불안정 할때는 과다계상(Over fitting) 된 것도 있지만, 때로는 경사 하강 법 할때, 배치 사이즈가 커서 불안정 하게 보일 때가 있다.
학습 곡선이 불안정 하면, 우리는 어떤 가중치를 가져갈지 할수가 없게 된다. 그래서 배치 사이즈를 줄여서 경사 하강법을 적용을 하면 학습곡선을 안정적인데, 계산 시간이 많이 걸린다.
그런데, 컴퓨터 사양이 낮을 경우 많이 사용하는게 배치 사이즈를 적게 하여, 이미지를 제너레이팅 하는 방법을 많이 사용한다.
경사 하강법을 사용을 할때, 매 애포크 마다 샘플의 순서를 섞어어 가중치의 최적값을 계산 하여야 한다.
아래 예제코드는 애포크 돌리때 마다, 샘플 데이터를 섞는 작업이 있다.
def fit(self, x, y, epochs =100):
self.w = np.ones(x.shape[1])
self.b = 0
for i in range(epochs):
loss = 0
indexes = np.random.permutation(np.arange(len(x))) # 인덱스를 섞음
for i in indexes: # 모든 샘플에 대해 반복
z = self.forpass(x[i])
a = self.activation(z)
err = -(y[i] - a)
w_grad, b_grad = self.backprop(x[i], err)
self.w -= w_grad
self.b -= b_grad
a = np.clip(a, 1e-10, 1-1e-10)
loss += -(y[i]*np.log(a)+(1-y[i])*np.log(1-a))
self.losses.append(loss/len(y))
numpy에서 np.random.permuation() 함수가 데이터 인덱스를 무작위로 섞는 작업이다.
모든 샘플 섞으면 조금 불안정 하지만 아래 그래프와 같이 그나마 안정적인 값을 볼 수 있다.
댓글 없음:
댓글 쓰기