매개 변수의 갱신


신경망 학습의 목적은 손실함수의 값을 가능한 낮추는 매개변수를 찾는 것이다. 이는 곧 매개 변수의 최적 값을 찾는 문제이며, 이러한 문제를 푸는 것을 최적화(Optimization)라고 한다.




1. 확률적 경사 하강법(SGD)

1.1 개요

  


여기서 X는 갱신할 가중치 매개변수고

라운드 f / 라운드 x0 는 손실함수의 기울기 이다.


SGD는 기울어진 방향으로 일정 거리만 가겠다는 단순한 방법이다.

class SGD:
def __init__(self,lr=0.01):
self.lr=lr

def update(self,params,grads):
for key in params.keys():
params[key]-=self.lr*grads[key]

초기화 할때 받은 인수인 lr(learning rate)를 뜻한다.
이 학습률을 인스턴스 변수로 유지하고,
upgrade() 메서드로 SGD 과정에서 반복해서 불린다.


1.2 단점 

SGD는 단순하고 구현도 쉽지만, 문제에 따라서는 비효휼적일 때가 있다.


SGD의 단점은 비등방성(방향에 따라 성질, 즉 기울기가 달라지는 ) 함수에서는

탐색 경로가 비효율적이라는 것이다.




1.3 단점 개선 방법


1. 모멘텀




2. AdaGrad 





3. Adam



신경망 학습이란?

- 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것


데이터 주도 학습

- 기계학습은 데이터에서 답을찾아서 패턴을 발견하고 데이터로 결론을 도출하는것


MINST :손글씨를 인식하는  머신러닝을 공부하기에 유명한 데이터 셋?

    • 손으로 쓴 5라는 것에서 패턴을 찾기란 어렵다.
    • 머신러닝이 효율적
    • 지도학습을 이용



지도학습이란?


지도 학습 (Supervised Learning)은 훈련 데이터(Training Data)로부터 하나의 함수를 유추해내기 위한 기계 학습(Machine Learning)의 한 방법이다. 훈련 데이터는 일반적으로 입력 객체에 대한 속성을 벡터 형태로 포함하고 있으며 각각의 벡터에 대해 원하는 결과가 무엇인지 표시되어 있다. 이렇게 유추된 함수 중 연속적인 값을 출력하는 것을 회귀분석(Regression)이라 하고 주어진 입력 벡터가 어떤 종류의 값인지 표식하는 것을 분류(Classification)라 한다. 지도 학습기(Supervised Learner)가 하는 작업은 훈련 데이터로부터 주어진 데이터에 대해 예측하고자 하는 값을 올바로 추측해내는 것이다. 이 목표를 달성하기 위해서는 학습기가 "알맞은" 방법을 통하여 기존의 훈련 데이터로부터 나타나지 않던 상황까지도 일반화하여 처리할 수 있어야 한다. 사람과 동물에 대응하는 심리학으로는 개념 학습(Concept Learning)을 예로 들 수 있다.

https://ko.wikipedia.org/wiki/%EC%A7%80%EB%8F%84_%ED%95%99%EC%8A%B5






손실함수 (loss Function)

학습을 통해 최적의 가중치 매개변수를 결정하기 위한 지표로 손실함수를 사용한다.

손실함수의 오차값을 가장 적게 만드는 것이 신경망의 학습목표이고




손실함수는 두가지


평균 제곱 오차 (mean squared error, MSE)





Y 는  신경망의 OUTPUT 이다 


파이썬 구현 함수 

def mean_square_error(y,t=list()):
return np.sum((y-t)**2)/t.size



교차 엔트로피 오차 (Croos Entroypy Error ,CEE)





왜 손실함수를 설정하는가?


숫자 인식의 경우도 우리의 궁극적인 목적은 높은 정확도를 끌어내는 매개변수 값을 찾는 것이다.

신경망 학습에서는 미분의 역활에 주목하야한다.
가상의 신경망이 있고 그 신경망의 어느 한 가중치 매개변수에 주목한다고 할때,
이때 그 가중치 매개변수의 손실함수의 미분이란 '가중치 매개변수의 값을 아주 조금  변화 시켰을때 손실함수가 어떻게 변하나 ?' 라는 의미 이다.

if 미분값이 음수면 그 가중치 매개변수를 양의 방향으로 변화 시켜 손실함수의 값을 줄일수 있다.

but  미분값이 0이면 매개 변수를 어느쪽으로 움직여도 손실함수의 값은 달라지지 않는다. 
그래서 그 가중치 매개 변수의 갱신은 거기서 멈춰야한다.

정확도를 지표로 삼으면 미분이 대부분의 장소에서 0이 되버린다.


반면에 손실함수를 지표로 삼는다면 매개변수의 값이 조금 변하면 그에 반응하여 손실 함수의 값도 0.9742.... 처럼 연속적으로 변화 하는 것이다.

계단 미분 함수의 미분은 대부분의 장소에서 0이다 그결과 계단함수를 손실함수 로 사용하면 아무런 효과가 없게 된다.


그렇기에 시그모이드 함수의 미분은 연속적으로 변하고 곡선의 기울기도 연속적으로 변한다




'Computer Science > Artificial Intelligence' 카테고리의 다른 글

기계 학습 관련 기술들  (0) 2018.10.14
인공신경망이란 무엇인가  (0) 2018.09.16
퍼셉트론이란 무엇인가  (0) 2018.09.16

2.인공신경망


  1. 퍼셉트론으로 복잡한 함수도 표현할수 있다 (이론상으로)

  2. 가중치를 설정하는 작업은 여전히 사람이 수동으로 해야한다는 문제점이 여전히 있다.


인공신경망은 2번에 해당하는 문제점을 해결해준다.


2.1 신경망의 예

  • 입력층, 은닉층, 출력층 3개로 나누어져있다.

b= 편향  , bias 



2.2 활성화 함수의 등장 Activation Function

    • 활성화함수 식

      • y= h(a)

      • a= b+w1*x1+w2*x2





2.3 활성화 함수 시그모이드 함수

    • 시그모이드 함수 
h(x)= 1/1+exp(-x)


2.4 계단 함수 구현하기



import matplotlib.pylab as plt


def step_function(x):
return np.array(x > 0, dtype=np.int)


x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()



계단 함수는 어느 경계점을 기점으로 

출력값을 0,1  두가지 값으로 바꿔준다.





2.5 시그모이드 함수 구현


def sigmoid(x0):
return 1 / (1 + np.exp(-x0))


x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()


시그모이드 함수와 계단함수의 가장 큰차이는

매끄러움의 차이이다


부드러운 곡선이며 (=미분가능한 함수이며)


두 함수는 모두 입력값에 관계없이 0~1 사이의 값을 출력해준다는 공통점이 있다.



시그모이드는 비선형 함수 이다.


인공 신경망에서는 활성화 함수로 비선형 함수를 사용해야한다.

선형함수를 이용하면  신경망의 층을 깊게하는 의미가 없어지기 때문이다.


층을 쌓는 혜택을 얻고싶다면 활성화 함수로 반드시 비선형 함수를 사용해야한다.




2.6 출력층 설계하기


  • 신경망은 분류와 회귀 모두에 이용할수 있다.
  • 다만 둘중 어떤 문제냐에 따라 출력층에서 사용하는 활성화 함수가 달라진다.
    • 항등함수
    • 소프트맥수 함수


NOTE : 기계학습 문제는 분류(Classification)와 회귀(regression)로 나뉩니다. 

분류는 불연속 수치 분석 (성별 :남or여)

회귀는 연속적인 수치 분석 (몸무게 50kg ~ 80kg)







1.퍼셉트론이란?

  • 신경망의 기원이 되는 알고리즘 
  • y= 0 or 1 의 값을 가지며

i)  w1*x1+w2*x2 < θ  then y = 0

ii)  w1*x1+w2*x2 >θ  then y = 1




1.1 퍼셉트론 구현하기

    • 간단한 구현 

def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1 * w1 + x2 * w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1



    • 실행
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))


    • 결과

0

0

0

1




1.2 가중치와 편향 도입

    • 구현 numpy사용 


def AND2(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w * x) + b

if tmp <= 0:
return 0
else:
return 1






1.3 퍼셉트론의 한계 

      • XOR게이트를 구현할수 없다.

      • 비선형 영역을 표현할수 없다

-선형과 비선형 -



1.4 하지만 다중퍼셉트론이라면 가능하다 

      • 구현 


def XOR(x1,x2):
s1=NAND(x1,x2)
s2=OR(x1,x2)
y=AND(s1,s2)
return y




1.5 정리

    1. 퍼셉트론은 입출력을 갖춘 알고리즘
    2. 퍼셉트론에서는 가중치와 편향을 설정
    3. AND, OR 게이트 등 구현가능
    4. but ! XOR 는 구현불가
    5. 2층 퍼셉트론을 이용하면 XOR게이트를 표현할 수 있다.
    6. 다중 퍼셉트론은 비선형 영역도 표현 가능하다.





+ Recent posts