확률적 경사하강법은 가중치 1번 업데이트 할때 1개의 샘플을 사용하므로, 손실 함수의 전역 최소값을 불안 정하게 찾았다.
하지만, 배치 하강법은 가중치를 1번 업데이트 할때 전체 샘플을 사용하므로, 손실 함수의 전역 최소값을 안정적으로 찾는다.
여기에서 가장 핵심적으로 이야기 할 수 있는 그림은 아래와 같다.
점곱과 행렬곱의 차이 |
CNN 하면서 이미지 데이터 전처리는 아주 중요한 것이다. 본인이 수집하거나 관찰 한 사진이 많고, 데이터 라벨 작업을 하였다면, 아래와 같은 딥러닝 할 수 있는 데이터 셋을 만들어야 한다.
즉 feature (image) 값과 label값(cat & dog)을 numpy array값을 변환 하여야 한다. 데이터 전처리 하는데, 아래의 2가지 방법이 있다. 이번 설명은 첫번째 설명 방법이다. 이런 방법으로 하려면, RAM 메모리와 HDD 용량이 커야 한다.
사내 자율 교육에서 야나두 딥러닝을 진행 하였다. 중공업 계열인 우리 회사 특성 상 남자들만 있었고, 코로나 바이러스의 영향으로 방역 수칙을 준수 하면서 강의를 해야 했기 때문에, 아주 큰 강의장에 작은 인원을 두고 강의 하였다.
즉 사회적 거리두기를 하고 하였다. 역시 딥러닝 강의인 만큼 목차는 아래와 같았다.
야나두 딥러닝에서 딥러닝 원리에 필요한 알고리즘만 모아 놓았다. 리스트, if, for 함수, 클래스가 많이 쓰인다. 다른 것도 있지만, 이번에 교육 할 때는 필요한 원리만 이야기 하는 것이 좋을 것 같다. 왜냐하면, 기초적인 개념을 많이 아는 것도 좋지만, 정보가 너무 많으면 수강생들이 많이 헤깔리기 때문이다.
보다 기초적인 개념을 알려며, 백문이 불여일견 인 것 처럼 백문이 불여일타 가 되어야 한다. 즉 기초적인 코딩도 훈련의 일종이다. 하긴 훈련을 아무리 많이 하여도 실전을 하지 않으면, 나중에 잊어 버린다. 이번에는 누가 봐도 잘 알 수 있게 끔 가능 한한 쉽게 하려고 노력 하였다.
파이썬 기초 |
과대적합을 해결 하는 대표적인 방법 중 하나인 가중치 규제(regularization) 이다. 가중치 규제란 말 그대로 가중치의 값이 커지지 않도록 제한 하는 기법이다. 가중치를 규제하면 모델의 일반화 성능이 올라간다.
아래 경사가 급한 것과 낮은 그래프 특정 샘플에만 적용 하는 사례를 보여 준다. 즉 가중치를 제한 하면, 모델 몇 개의 데이터에 집착하지 않는다.
신경망 이야기 하게 되면, 제프리 힌튼 교수 처음 강의에 뉴런에 대해서 나온다. 한국어로 번역이 가능 한데, 음성을 영어로 인식 한 다음에 번역한 다음에 한국어로 나오게 할 수 있다.
즉 사람의 뇌의 구조는 복잡하게 되어 있다는 데 뉴런이 10^10개 100억개가 있다고 한다. 생물학적인 성격의 설명이 있는데, 직접 동영상을 보는 것이 좋을 것 같아서 링크하였다.
제조업에는 금융하고, 의학 분야와 같이 분류 할 수 있는 데이터들이 많이 있다. 이번에 소개할 데이터 셋은 사이킷런에 있는 위스콘신 유방암 데이터 셋이다. 유방암 데이터 셋은 유방암 세포 특징 10개에 대하여 평균, 표준오차, 최대 이상치가 기록되어 있다.
유방암 데이터 세트의 분석 목표는 유방암 데이터 샘플이 악성 종양인기 정상 종양인지 분류하는 문제 이다.
분류하는 뉴런은 딥러닝에서 가장 많이 사용하는 것이다. 일반 데이터를 분류하고자 할때는 데이터가 없어서, 분류를 하지 못하였다면, 사진이나 글 같은 비정형 데이터는 상당히 많다. 하지만, 그것을 하는데도 사전에 전처리 기술이 필요하지만, 딥러닝은 퍼셉트론을 기반으로 지속적으로 발전 해 온 것도 사실이다.
분류에 관련된 통계를 시작한다, 항상 분류에 대한 통계를 들어 갈 때는 강좌를 하는 사람이나 받는 사람 모두 부담이 된다. 최근에 딥러닝이, 그나마 성숙하고 성장하게 된 계기는 분류에 대한 부분이 최근에 발달이 잘 되어서 이다. 조금 어렵지만, 강의 자료인 만큼 쉽게 풀어서 쓸 것이다.
선형회귀를 위한 뉴런은 앞서 이야기 한 부분을 클래스 만들어 정리 하는 것이다. 초기에 알고리즘을 만들고 나면 클래스 형태로 정리 해야만, 나중에 큰 프로젝트 할때 유리 하다.
선형 회귀는 정방향 계산에서 부터 시작 이 된다.
$ y = w * x +b $
파이썬에서 함수를 사용할때 def를 써야 하는데, def__init__(self)는 변수 초기화 할때 사용한다. 그리고 나머지는 사용자 함수로서 사용한다.
1) 정방향 (forpass) 계산
class만들 때는 self가 반드시 들어 간다 self는 현재의 인스턴스 객체를 가르키는 기능으로 쉽게 풀어 이야기 하면 self의 사전적 의미는 그대로 자기 자신을 이야기 한다. self라는 지시어는 이름공간(namespace)와 관련 있다. 주의점은 클래스 내에서 함수가 정의 될때, 첫번째 매개변수는 self 이어야 한다.
2) 역방향(backpropagation) 계산
선형회귀에 대한 손실함수는 앞에서 증명 하였다. 손실함수의 증명된 결과는 아래와 같다.
$ { \partial SL \over \partial w } = -(y - \hat{y})x $
$ { \partial SL \over \partial b } = -(y - \hat{y}) $
위 그림은 가중치 및 절편에 대한 경사하강법(gradient descent) 계산 하는 것이다. 위에 있는 가중치와 절편의 손실값을 계산 하여, 새로운 가중치와 절편을 만드는 것이다. 이렇게 계속 계산 하다 보면, 손실값이 가장 적은 시점이 오게 되는데, 그때가 우리가 이야기하는 최적화 된 값이 나오게 된다.
3) 훈련을 위한 fit 구하기
Neuron 이라는 클래스에 초기화 함수 정방향 함수, 역방향 함수, 모델 fitting화 하는 함수인 fit 함수가 있다. 이를 실행 하는 방법은 아주 간단하다.
첫번째 클래스 객체를 활성화 시킨다.
neuron = Neuron()
두번째 객체 에서 x와 y값을 넣고 활성화 한다.
neuron.fit(x, y)
세번째 가중치와 절편을 본다.
print(neuron. w, neron.b)
4) 학습 완료된 가중치와 절편 확인 하기
neuron.w(가중치), neuron.b(절편)
경사 하강법을 적용 하여, 회귀 분석 알고리즘을 완성 하였다. 자세한 소스코드는 아래를 클릭 하면 된다.
※ 참고서적 : 정직하게 코딩하며 배우는 딥러닝 입문 (이지스퍼블리싱)
선형 회귀의 목표는 입력 데이터 (x)와 타깃 데이터 (y)를 통해 기울기가 절편을 찾는 것이었다. 즉 최소 제곱법에 의해 관측치와 평균치의 차이를 비교해서 기울기와 절편을 찾았다.
경사하강법(gradient descent) 바로 그 방법 중에 하나이다. 경사 하강법은 모델이 데이터를 잘 표현 할수 있도록 기울기 (변화율)을 사용하여 조금씩 조정하는 최적화 알고리즘 이다. 경사 하강법은 모델이 데이터를 잘 표현 할 수 있도록 기울기(변화율을) 사용하여 조금씩 조정 하는 최적화 알고리즘 이다.
딥러닝에서 왜 통계를 다루는 이유는 딥러닝을 배우려면 초기 모델부터 가야 하는데, 초기 모델은 대부분 통계에서 시작 되기 때문이다. 초기의 뉴런은 회귀 방정식에서 나온 직선 가지고 검증을 하였기 때문이다. 통계 기초는 다른 깊은 부분을 이야기 하기 보다는 회귀 분석 까지 가기 까지의 과정만 이야기 할 예정 이다.
회귀분석까지 가려면, 아래의 그림과 같다. 그리고, 통계 기초에 대해서는 이 한 개의 포스트로 정리 한다.
앞에서는 html의 간단한 sheet를 소개 하였습니다. html은 주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다. 아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다. body 부분의 css 코딩 ...