살콤아내 자기계발/파이썬

파이썬 머신러닝 완벽가이드 6주차 정리 (경사하강법, 퍼셉트론/아달린)

살콤아내 2021. 5. 24. 09:13
728x90
반응형

 

파이썬머신러닝완벽가이드 290pg. 회귀(퍼셉트론)
0.01MB



참고자료) 간단한 분류 알고리즘 훈련
2.1 인공 뉴런: 초기 머신 러닝의 간단한 역사 (48pg)
- 맥컬록-피츠 뉴런: 1943년 워런 맥컬록, 월터피츠가 처음으로 AI를 설계하기 위한 뇌의 뉴런 개념을 발표함. 수상돌기에 여러신호가 도착하면 세포체에 합쳐진다. 합쳐진 신호가 특정임계값을 넘으면 출력 신호가 생성되고 이 신호는 축삭돌기를 이용하여 전달된다.
- 인공뉴런의 수학적 정의: 이진분류(-1, +1)분류 작업으로서 가중치 벡터 w의 선형조합으로 결정함수(z)가 만들어짐.
z=w1x1+w2x2+....+wmxm (이는 벡터와 벡터의 내적과 비슷하다.)
- 단위계단함수: Φ(z)= 1 (z>=θ일 때) 그리고 -1 (그외) **단위계단함수는 알고리즘에 따라 변화가능

https://ko.wikipedia.org/wiki/%EB%B6%80%ED%98%B8%ED%95%A8%EC%88%98

2.1.2. 퍼셉트론 학습규칙
- 로젠블라트의 초기 퍼셉트론 학습규칙: 가중치 0/랜덤한 작은 값 >> 각 훈련샘플 작업 (y를 계산, 가중치 업데이트)
- 새로운가중치 W= 기존의 가중치W+가중치의 변화량
- 가중치 변화량= learning rate X (i번째 훈련샘플의 true class label - i번째 훈련샘플의 predict class label ) X input 값
- 퍼셉트론은 두 클래스가 선형적으로 구분되고 학습률이 충분히 작을 때만 수렴이 보장됨. (훈련 데이터셋을 반복할 최대횟수 epoch및 분류허용 오차 지정하여 선형 결정 경계로 나눌 수 있음)
- 더 정확한 정답값을 구하는 최적의 가중치를 찾는 것이 모델학습의 목표임

퍼셉트론 코드예제

- 24줄: 생성자 __init__ 에서 eta는 learning rate값임. n_iter는 epoch값임 (업데이트를 수행하는 횟수).
- 25줄: self.eta와 self.n_iter값은 아래 103줄에서 설정한 값인 0.1과 10이 들어간다.
- 44줄: rgen은 특정 설정아래 랜덤값을 반환함. normal은 정규분포데이터 데이터를 랜덤으로 반환(평균 loc, 표준편차 scale). size=1+X.shape[1]은 100x2행렬을 가진 X데이터에서 두 번째 열을 반환함.
- 45줄: self.w_에는 3개의 랜덤값이 들어감. print(self.w_)를 하면 [ 0.01624345 -0.00611756 -0.00528172]가 확인된다.
- 48줄: n_iter값이 10이므로 for문은 10번 돌아간다.
- 50줄: zip(X, y)값에는 100x2 데이터와 100x1 (-1, 1인) 데이터가 for문에 의해 순차적으로 들어간다. 이 for문은 데이터 사이즈가 100이므로 100번 돌어간다.
- 51줄: update는 퍼셉타일 가중치업데이트 식으로 상수* target-self.predict(xi)의 결과값은 스칼라값이다.
- 52줄: 스칼라값 update와 벡터값 xi를 곱해서 가중치 업데이트를 한다. (xi는 X의 두 feature값이므로 벡터값이다).
참고) 벡터와 스칼라의 곱은 벡터값이 나온다.
- 54줄: update가 0이 아니라면 error가 있다는 것이고 1을 누적적으로 더해준다. 즉 변수 errors의 값은 error가 얼마나 발생했는지 나타낸다. (update가 0이라면 예측을 제대로 했다는 것으로 0을 더해주는 것은 의미가 없다)

- 60줄: np.dot 은 벡터의 내적을 의미 (기하학적 의미는 두 벡터사이에서 어떤 벡터를 어떤 벡터에 투영시켰을 때 동일 방향으로 가해지는 힘을 말한다) self.w_은 45줄 참고 (랜덤값3개 [ 0.01624345 -0.00611756 -0.00528172]).
- 60줄: net_input은 z값을 구하는 식이라고 생각하면 된다. 붓꽃데이터의 length, width를 가중치와 벡터내적을 한 뒤 self.w_[0]를 더한다.
참고) input값과 가중치를 섞는 산식= w2·x2+w1·x1+w0
(w0는 x값과 내적하는 데 포함되지 않는 bias. w0= 0.01624345 )
- 62줄: predict을 호출한 곳에서 X값이 넘어옴. 즉 51줄의 predict(xi), i번째 줄 x값의 수치
- 64줄: net_input(X)도 predict(xi)의 값으로 계산됨. (단위계단함수 참고) 즉, 최종예측값 z를 말한다. 이후 실제값과 예측값의 차이를 구해서 가중치를 업데이트 하게된다. (다시 51줄로 돌아감)
- 85줄: 150개 데이터 중 0-100인덱스, 즉 setosa와 versicolor라는 두종류의 꽃 데이터 feature만 불러옴
- 86줄: y가 Iris-setosa이면 -1, 아니면 1을 반환
- 92줄: 0 column의 인덱스 0-49, 1 column의 인덱스 0-49에 대한 setosa scatter 산점도 그리기
- 94줄: 0 column의 인덱스 50-100, 1 column의 인덱스 50-100에 대한 versicolor scatter 산점도 그리기

- 103줄: ppn이라고 정의한 객체 사용 (learning rate인 eta는 0.1, epoch값인 n_itner는 10으로 설정)
- 105줄: ppn.fit(X, y) 에서 X는 100x2의 feature값, y는 -1, 1의 데이터 label값

epochs 6회 이후에는 error가 0으로 줄어들어 가중치 업데이트가 되지 않는다. (epochs의 값인 n_iter값을 증가시켜도 마찬가지이다)

- 127줄: meshgrid로 그래프를 그린다. 각 데이터를 펼쳐서 학습시킨 estimator의 predict위치에 넣는다.
- 131줄: contour로 등고선을 그린다.



2.3. 적응형 선형 뉴런과 학습의 수렴
- 아달린 알고리즘: 퍼셉트론의 향상된 버전으로 연속함수로 비용함수를 정의하고 최소화함
- 아달린 규칙(위드로우-호프 규칙): 가중치를 업데이트 할 때 선형활성화 함수를 사용함 (비용함수 미분가능/볼록함수)
>>진짜클래스레이블-선형활성화 함수의 실수 출력값


2.3.1. 경사 하강법으로 비용함수 최소화
- 목적함수: 비용함수를 최소화하는 가중치를 찾는 함수 >> 전역최속값에 도달하게하는 가중치 w값을 찾아야 함
- 아달린의 비용함수: 계산된 출력과 진짜 클래스레이블 사이의 제곱오차합
- 퍼셉트론규칙과 달리 모든 샘플을 기반으로 가중치가 동시 업데이트된다 (퍼셉트론처럼 각 샘플마다 순차적으로 가중치를 업데이트하지 않음) 그래서 퍼셉트론보다 계산속도가 빠르다.


아달린 코드예제

- 162줄: X, y데이터를 fit시킨다.
- 179줄: np.dot으로 X와 self.w_[1:]의 내적을 구한다. 즉 (100x2)와 (2,)의 각각의 row의 내적을 구해 벡터값 (100, )을 도출한다. (이를 test에 구현함)
- 181줄: activation은 X를 그대로 output값으로 뱉어줌. 즉 벡터값 (100, )가 그대로 반환된다. (여기서는 아무 기능이 없지만 선형함수 외에 다른 활성화 함수를 사용하기 위한 절차로서 사용됨)
- 171줄: X.T.dot(errors)는 X를 전치행렬T 시키고 (shape를 맞춰주기 위해) 이를 errors와 내적하는 것이다. (100x2)의 행렬과 (100, )내적이 되서 스칼라 값 2개가 도출된다.
- 173줄: errors를 제곱오차합한다. epoch별로 비용함수값을 append 시킨 뒤 2로 나눈다. 이는 66pg의 비용함수 J(w)와 같다.

참고) self.w_ 의 값은 다음과 같다.

X, y데이터
179줄 내적된 벡터값

 

171줄 내적된 스칼라값

- 193줄: cost에 log10을 적용해서 데이터별 극단적인 차이를 줄이기 위함.

첫번째 그래프는 epoch값이 증가함에 에러율값이 증가하고 있는데 두번째 그래프는 반대로 에러율값이 감소하고 있다. learning rate에 따라 발산/수렴이 달라짐을 알 수 있다.

 



728x90
반응형