ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2_1 딥러닝 모델, 손실함수 , 역전파, 순전파
    1학년/딥러닝 공부 2022. 9. 13. 14:20

    딥러닝 모델 ?
    : input과 output 레이어 중간에 Hidden layer 층이 3층 이상 일 시 Deep learning 이란 단어를 사용해 서 딥러닝 모델이다.

    딥러닝 모델의 구성 요소
    : 노드 ( Node ) . 각 층을 구성하는 요소 (x1,x2,…)
    : 가중치 ( Weight ) . 노드간의 연결 강도 (w1, w2,…)
    : 레이어 (layer) . 모델을 구성하는 층

    딥러닝 모델의 학습 방법
    : Loss function을 정의해서 손실을 최소화 하기 위한 알고리즘을 적용해 스스로 학습하게 한다.

    손실함수( Loss function) ? 최적화( optimizat ion ) ?
    : 딥러닝이 가중치를 찾아가는 과정. 예측값과 실제값 간의 오차값을 최소화 하기 위한 모델의 인자값을 찾는 학습방법
    : 손실함수의 종류에는 MSE, RMSE, MAE, entropy, cross entropy, Binary entropy 등이 있다.

    MSE ( Mean Squared Error )
    : 평균 제곱 오차법이라고 부르는 것 같다. 예측한 값과 실제 값 사이. 즉 예측값에서 실제값 또는 라벨을 빼주고 제곱시켜주는 평균 제곱 오차를 정의한다. 보통 회귀 (regression). 용도의 딥러닝 모델을 훈련시킬때 많이 사용되는 손실 함수이다. 식은 타자로 치기 어려우니 패스… 인터넷에 많다. 여기서 절대값이 아닌 제곱으로 처리하는 이유는 오차가 큰 경우에 더 큰 가중치를 주어 학습을 빠르게 처리하고, 절대값은 미분이 불가능 하기 때문이다 .

    import numpy as np
    def mean_squared_error(y,t):
        return 0.5*np.sum((y-t)**2)
        
    t =[0,0,1,0,0,0,0,0,0,0]
    y =[0.1,0.05,0.6,0.05,0.1,0,0.1,0,0,0]
    print (mean_squared_error(np.array(y),np.array(t)))
    
    y=[0.1,0.05,0,0.05,0.1,0,0.1,0,0,0.6]
    print(mean_squared_error(np.array(y),np.array(t)))



    MAE ( Mean absolute error ) 1
    : mse와 비슷하다. 오차 제곱의 평균이 아니라 오차절대값의 평균이다.
    이것도 회귀 용도의 딥러닝 모델을 훈련시킬. 때 많이 사용된다. 이것도 식 패스…

    binary crossentropy
    : 이진 분류기를 훈련하기 위한 손실함수이다. true or false 같은 이진 분류이다. 공식 매우 길다… 패스

    categorical crossentropy
    : 분류해야할 클래스가 3개 이상인 경우 사용한다. 라벨이 [0,0,1,0,0] 과 같이 one-hot 인코딩 식일때 많이 쓴다.


    역전파?( Backpropagation )
    : 순전파의 반대 방향으로 이동하면서 가중치를 업데이트 하는 과정. 역전파에는 연쇄법칙 ( chain rule)이 작용하나보다. 이건 수학적 접근이기 때문에 패쓰~
    다음은 역전파를 구현한 코드이다.
    본 코드전 시그모이드 함수

    import math
    
    def sigmoid(x):
    	return 1 / (1 + math.exp(-x))

    본 코드

    ‘’’
    x는 x1,x2,x3의 list이며 y는 0혹은 1로 이루어진 list이다. x와y는 다음의 값을 가질 수 있다.
    [(1,0,0),(1,0,1),(0,0,1)]
    [(0,1,1)]
    ‘’’
    
    
    '''
    1. 지시 사항을 따라서 getParameters 함수를 완성하세요.
    
    Step01. X의 한 원소가 3개이므로 가중치도 3개가 있어야 합니다.
            초기 가중치 w를 [1,1,1]로 정의하는 코드를 작성하세요.
            
            단순히 f = 3, w = [1,1,1]이라고 하는 것보다 좀 더 
            좋은 표현을 생각해보세요.
            
            
    Step02. 초기 가중치 w를 모델에 맞게 계속 업데이트 해야합니다.
                
            업데이트를 위해 초기 가중치 w에 더해지는 값들의 리스트
            wPrime을 [0,0,0]로 정의하는 코드를 작성하세요.  
                
            마찬가지로 단순히 wPrime = [0,0,0]이라고 하는 것보다
            좀 더 좋은 표현을 생각해보세요.
            
            
    Step03. sigmoid 함수를 통과할 r값을 정의해야합니다. r은 
            X의 각 값과 그에 해당하는 가중치 w의 곱의 합입니다.
                
            즉, r = X_0_0 * w_0 + X_1_0 * w_0 + ... + X_2_2 * w_2
            가 됩니다.
                
            그리고 sigmoid 함수를 통과한 r값을 v로 정의합시다.
        
        
    Step04. 가중치 w가 더이상 업데이트가 안될 때까지 업데이트 해줘야합니다.
            즉, 가중치 w의 업데이트를 위해 더해지는 wPrime의 절댓값이 어느 정도까지
            작아지면 업데이트를 끝내야 합니다. 
                
            그 값을 0.001로 정하고, wPrime이 그 값을 넘지 못하면 가중치 
            업데이트를 끝내도록 합시다. 
            
            다만 wPrime의 절댓값이 0.001보다 작아지기 전까지는 w에 wPrime을 계속
            더하면서 w를 업데이트 합시다.    
    '''
    
    
    def getParameters(x,y):
    	# step1
    	f = len(x[0])
    	w = [1] * f
    	values[]
    	while True:
    		#step 2
    		wPrime = [0] * f
    		vv = []		#sigmoid를 통과한 r이 들어갈 빈 리스트
    
    		#step3
    		for i in range(len(y)):
    			r = 0
    			for j in range(f):
    				r = r + x[i][j]* w[j]
    
    				v = sigmoid(r)
    				vv.append(v)
    
    				for j in range(f):
    					wPrime[j] += -((v - y[i]) * v * (1-v) * x[i][j])
    
    		#step 4
    		flag = False
    		for i in range(f):
    			if abs(wPrime[i]) >= 0.001:
    				flag = True
    				break
    		if flag == False:
    			break
    		for j in range(f):
    			w[j] = w[j] +wPrime[j]
    		
    	return w
    
    def main():
    
    	X = [(1, 0, 0), (1, 0, 1), (0, 0, 1)]
       y = [0, 1, 1]
       
       print(getParameter(x,y))
       
    if __name__ == “__main__”:
    	main()



    순전파( Forwardpropagation )
    : 뉴런 네트워크 모델의 입력층부터 출력층까지 순서대로 변수들을 계산하고 저장하는 것. 보통 순전파로 가중치 곱하고 편차 더한 뒤에 손실함수로 손실 구하고 역전파로 가중치를 업데이트 해 가는 방식인 것 같다…

    옵티마이저
    : 손실 함수로 얻은 오차를 이용해 역전파로 가중치를 업데이트 하는 방법. Batch Gradient Descent( 배치 경사 하강법 ) , Stochestic Gradient Descent ( SGD라고도 불리는 확률적 경사 하강법 ) , Mini-batch Gradient Desent( 미니 배치 경사 하강법) , Momentum 등이 있다 .


    Epoch
    : 1epoch 전체 데이터셋을 한 번 신경망을 통하여 역전파와 순전파를 한 것을 의미한다.
    쉽게 말하자면 학습시키는 횟수? 여러번 할 수록 정확해지긴한다. 손실함수에서 손실값이 내려가긴 하는데 너무 과하게 하면 과대적합(overfitting)이 발생하기 때문에 조심해야한다. Overfitting을 막기 위해서는 가중치를 줄여주거나 훈련 dataset을 더 추가해 줘야한다! .
    n개의 데이터셋을 m번 학습시키면 epoch는 m이 된다.

    batch-size
    : 전체 데이터set을 7000개라 가정하면 batch-size를 100으로 설정해주면 7000개의 데이터셋이 70번 학습을 진행한다. 배치 사이즈는 보통 2의 n승으ㅗ 정해주는데 본인의 GPU의 램 용량에 따라 Out of Memory를 조심해줘야한다.

    728x90

    댓글

Designed by Tistory.
티스토리 친구하기