손실함수와 경사하강법의 관계
손실함수
- 예상한 값과 실제 타깃값의 차이를 함수로 정의한 것
cf. 비용함수 : 모든 훈련 데이터에 대한 손실 함수의 합
목적함수 : 최적화하기 위한 대상 함수
제곱오차
- (타깃값 - 예측값)^2
- 제곱 오차가 최소가 되면 산점도 그래프를 가장 잘 포현한 직선이 그려진다.
- 최솟값은 함수의 기울기에 따라 이동하면 알 수 있다.
- 기울기 구하려면 (타깃값 - 예측값)^2 를 w나 b에 대해 미분하면 된다.
=> w(가중치)에 대해 제곱 오차를 미분하면 오차 역전파 수식과 결과가 같은 것을 확인할 수 있다.
=> b(절편)에 대해 제곱 오차를 미분하면 오차 역전파 수식과 결과가 같은 것을 확인할 수 있다.
선형회귀를 위한 클래스 생성
Neuron클래스
__init__ 메소드
- __init___ 메소드는 객체를 생성하면 가장 먼저 실행되는 초기화 함수다.
- 매개변수로 객체 자기자신을 받는다.
- Neuron 클래스는 __init__ 메소드에서 w(가중치), b(절편)을 초기화 한다.
forpass() 메소드
- 입력 값으로 예측값(y^)을 구하는 함수다.
- 매개변수로 객체와 입력값 x를 받는다.
- y^=x*w + b에 매개변수로 온 w를 넣어서 예측값을 구한다.
backprop() 메소드
- y, y^ 이용해 오차 구하고, 그 값으로 w와 b의 그레이디언트 구해 반환하는 함수
- 매개변수로 객체, x(입력값), err(오차)를 받는다. <- err = y-y^
- w(가중치)의 그레이디언트 = x(입력값) * err(오차)
- b(절편)의 그레이디언트 = 1 * err(오차)
fit() 메소드
- 데이터 훈련을 위한 함수
- 매개변수로 객체, x(입력값), y(타깃값), epochs(반복횟수)를 받는다.
- forepass()로 y^구하고, 오차를 계산한다. 그 다음, backpass()로 w,b의 그레이디언트를 구하고, w와 b 업데이트
위 과정을 epochs 만큼 반복해서 훈련한다.
객체 neuron을 생성하고 입력 데이터와 타깃 데이터를 입력했다.
학습이 완료된 것을 산점도 위에 직선 그래프로 그렸다. 꽤나 적당한 직선이 나온 거 같다.
퍼셉트론
- 이진 분류 문제이셔 최적의 가중치를 학습하는 알고리즘.
- 선형회귀와 유사한 구조로, 선형 함수에서 z를 구하고 그 값을 계단 함수에 넣어 그 결과를 가지고 w와 b를 업데이트 하는데 사용한다.
- z = w1x1+ w2x2 + b
- 계단 함수는 z가 0보다 크면 1(양성 클래스), 0보다 작으면 -1(음성 클래스)를 반환한다.
- 계단 함수 결과값을 기준으로 역방향 계산한다. -> 계단함수 결과를 학습에 사용한다.
- 사이킷런 패키지에서 Perceptron 클래스를 제공한다.
=> 퍼셉트론은 선형함수를 통과한 값 z를 계단 함수로 보내 0보다 큰지, 작은지 검사해 1과 -1로 분류하는 알고리즘
아달린
- 퍼셉트론을 개선한 적응형 선형 뉴런.
- 선형 함수에서 z를 구 하고 그 결과를 가지고 w와 b를 업데이터 하는 데 사용한다. 또한, z를 계단 함수에 넣어 결과를 예측하는데 사용한다.
- z = w1x1 + w2x2 + b
- 계단 함수는 z가 0보다 크면 1, 0보다 작으면 -1을 반환한다.
- 선형 함수 결과값을 기준으로 역방향 계산한다. -> 선형함수 결과를 학습에 사용한다.
로지스틱 회귀
- 아달린을 발전시킨 것.
- 선형함수를 통해 얻은 z를 임계 함수(계단 함수와 유사)에 보내기 전 활성화 함수에 넣어 변형시키고 그 값으로 예측한다.
- 활성화 함수의 결과값을 a라 한다.
- 활성화 함수 결과값을 기준으로 역방향 계산한다. -> 활성화 함수 결과를 학습에 사용한다.
- 임계 함수는 계단 함수와 유사하지만 활성화 함수의 출력값을 사용한다는 점이 다르다.
시그모이드 함수
- z를 0~1 사이의 확률 값으로 변환시켜주는 함수.
- 오즈 비 -> 로짓 함수 -> 시그모이드 함수 순으로 만들어진다. (p는 성공 확률)
- 오즈 비(OR; Odds ratio)
성공 확률, 실패 확률의 비율을 나타내는 통계.
OR = p/1-p
p가 0부터 1까지 증가할 때, 오즈비 값은 p가 1에 가까워지면 급격히 증가한다.
- 로짓함수(logit)
오즈 비에 로그 함수를 취한 함수.
logit(p) = log(p/1-p)
p가 0.5일 때 0 / p가 0일 때 음수 무한대 / p가 1일 때 양수 무한대
- 로지스틱 함수(시그모이드 함수)
로짓 함수에서 가로 축을 z로 놓은 함수.
==> 로지스틱 회귀의 목효는 이진분류다.
==> 선형함수의 결과 z는 음수 무한대에서 양수 무한대 범위의 값이 나온다. z를 시그모이드 함수에 넣어 범위가 0~1인 a 를 만들고, a를 임계 함수에 넣어 예측값이 0 또는 1인 y^를 구해 예측한다.
==> 시그모이드 함수의 결과를 가지고 학습시킨다.
- 선형회귀의 목표 => 예상값의 오차 제곱이 최소가되는 가중치, 절편을 찾는 것.
-> 분류된 샘플의 비율은 미분 가능한 함수이므로 경사하강법의 손실함수로 사용할 수 있다.
- 분류의 목표 => 올바르게 분류된 샘플 데이터의 비율을 높이는 것.
-> 분류된 샘플의 비율은 미분 가능한 함수가 아니므로 경사하강법의 손실함수로 사용할 수 없다.
로지스틱 손실 함수
- 올바르게 분류된 샘플 데이터의 비율을 높이기 위해 사용하는 손실 함수.
- 크로스 엔트로피 손실 함수(다중 분류를 위한 손실 함수)를 이진 분류 버전으로 만든 것.
- L = -( ylog(a) + (1-y)log(1-a) )
- y가 1(양성 클래스)인 경우, L = -log(a)
-> L을 최소로 만드려면 a가 1에 가까워지면 된다. - y가 0(음성 클래스)인 경우, L = -log(1-a)
-> L을 최소로 만드려면 a가 0에 가까워지면 된다. - 로지스틱 함수를 최소화하면 a가 우리가 이상적으로 생각하는 값이 된다.
로지스틱 손실 함수 미분
L을 가중치(w)에 대해 미분 = -(y-a)xi
L을 절편(b)에 대해 미분 = -(y-a)1
-> 로지스틱 손실 함수 미분 결과가 제곱 오차 미분 결과에서 y^를 a로 바꾼 것과 같다.
로지스틱 함수 미분 결과 = L을 a에 대해 미분한 결과 * a를 z에 대해 미분한 결과 * z를 w에 대해 미분한 결과
L을 a에 대해 미분 = -( y/a - (1-y)/1-a )
a를 z에 대해 미분 = a(1-a)
z를 w에 대해 미분 = xi
로지스틱 함수 미분 = -( y/a - (1-y)/1-a ) * a(1-a) * xi
= -(y-a)xi
가중치 업데이트
- L을 w에 대해 미분한 식을 w에서 뺀다.
- wi = wi + (y-a)xi
절편 업데이트
- L을 b에 대해 미분한 식을 b에서 뺀다.
- b = b + (y-a)1
'STUDY > 인공지능' 카테고리의 다른 글
[6주차] 신경망 알고리즘 벡터화 (0) | 2021.05.25 |
---|---|
[5주차] 규제 방법, 교차검증 (0) | 2021.05.17 |
[4주차] 검증세트, 전처리, 과대적합과 과소적합 (0) | 2021.05.11 |
[3주차]데이터 세트 분류, 로지스틱 회귀과 단일층 신경망 관계 (0) | 2021.05.04 |
[1주차] 코랩 사용법, 선형 회귀, 경사하강법 (0) | 2021.03.28 |