나는야 데이터사이언티스트/Deep Learning

딥러닝 개론(학습 방법 및 구현 방법)

우주먼지의하루 2021. 10. 30. 00:02
728x90

딥러닝 모델의 구성 요소

먼저 앞에 배웠떤 이름을 정확하게 짚고 넘어가야할 것 같아 정리 겸 ?! 개요 글 입니다. 보라색 원형 그림이 Node/Unit이라고 부르고, 이것은 각 층을 구성하는 요소입니다. Node를 이어주는 선을 가중치라고 부르고, 이것은 노든 간의 연결 강도입니다. Layer는 점선 네모네모 인데 각 모델을 구성하는 층을 의미합니다. 입력층과 출력층을 제외하고는 Hidden Layer라고 불립니다. 관련 내용은 딥러닝 개론(퍼셉트론, 다층 퍼셉트론) 글에 적어놓았으니 참고하시면 됩니다.

딥러닝 모델의 학습 방법

딥러닝 모델은 예측값과 실제값 간의 오차값을 최소화하기 위해 오차값을 최소화하는 모델의 인자를 찾는 알고리즘을 적용시키는 것입니다. Loss Function을 최소화하는 가중치를 찾기 위한 최적화 알고리즘을 적용시키는 것이 딥러닝 모델의 학습 방법이라고 생각하면 됩니다.

순전파 예시

첫 번째 입력 단에서 시작해서 점진적으로 값을 구하는 방식을 순전파(Forward Propagation)이라고 합니다. 이 방식을 통해서 최종적인 예측값을 구할 수 있습니다. 예시를 보면 입력 값과 가중치를 계산하고, activation 함수에 들어가게 됩니다. 저번 딥러닝 개론(퍼셉트론, 다층 퍼셉트론) 글에서는 activation 함수를 하나만 소개했는데 사실 다양한 함수들이 존재합니다. 딥러닝 구현 방법에 따라서 함수가 다르게 사용하는데 이것은 나중에 정리해보도록 하겠습니다. 다시 돌아가서 입력 값과 가중치를 계산해서 activation 함수에 들어가서 나온 결과 값을 다시 입력 값으로 생각하고 다음 Layer으로 들어가 다시 계산하게 됩니다. 쭉쭉쭉 계산이 진행되고 마지막에 예측값이 나오는 방법이 순전파로 계산하는 방법입니다.

순전파를 사용하면 예측값과 실제값 간의 오차값을 구하여 Loss Function을 구할 수 있고, 경사 하강법(Gradient descent)을 사용하여 최적화 시킵니다. 가중치를 Gradient 값을 사용하여 업데이트를 수행하여 구할 수 있는데, Gradient 값은 각 가중치마다 정해지고 역전파(Backpropogation)을 통해 구할 수 있습니다

Gradient 값을 구하는 방법


* 딥러닝 모델의 학습 순서 *

1. 학습용 Feature 데이터를 입력하여 예측값 구하기(순전파)
2. 예측값과 실제값 사이의 오차 구하기(Loss 계산)
3. Loss를 줄일 수 있는 가중치 업데이트 하기(역전파)
4. 1~3번의 반복으로 Loss를 최소로하는 가중치 얻기

딥러닝 모델 구현 방법

* 딥러닝 모델의 구현 순서 *

1. 데이터 전처리
2. 딥러닝 모델 구축하기
3. 모델 학습시키기
4. 평가 및 예측하기


1. 데이터 전처리
전처리에는 Tensorflow를 사용할 예정입니다. 딥러닝에서 텐서말고 Pytorch라는 것도 있는데 여기서는 텐서로 사용해보겠습니다. Tensor란 다차원 배열로서 Tensorflow에서 사용하는 객체입니다.

ex) 총 데이터가 1000개, Batch size = 100

 * 1 iteration = 100개 데이터에 대해서 학습

 * 1 epoch = 1000/Batch size = 10 iteration

 


딥러닝에 사용하는 데이터는 추가적인 전처리 작업이 필요한데 batch 작업이 필요합니다. 이 batch를 알기 위해서 epoch도 알아야하는데, 먼저 epoch은 학습하는 과정을 말합니다. 딥러닝을 만들 때 한번 epoch을 돌리는데 전체적으로 돌리면 너무 많은 가중치들을 업데이트해야 합니다. 다시 말하면 모델이 무거우면 무거울수록 또는 데이터가 크면 클수록 업데이트 해야하는 계산 양이 무수히 많아지는 것이죠. 그래서 한번의 epoch을 돌릴 때 batch 사이즈만큼 나누어서 돌리면 계산이 조금 빨라질 수 있기에 사용하는 것입니다. 당연히 잘게 나누어지면 확률적으로 예측이 잘 될 수 있는데 계산이 안되면 말짱 도루묵이겠쥬 ?

 

#데이터 불러오기 
df = pd.read_csv("data.csv") 
feature = df.drop(columns=['label']) 
label = df['label'] 


#tensor 형태로 데이터 변환(배열로 전달해야 변환 가능!) 
dataset = tf.data.Dataset.from_tensor_slices((feature.values,label.values))


#dataset의 batch 사이즈를 32로 설정
dataset = dataset.batch(32)

 

2. 딥러닝 모델 구축

 

#모델 구축하기_첫번째 방법
model = tf.keras.models.Sequential([
	tf.keras.layers.Dense(10,input_dim = 2, activation='sigmoid'), #2개의 입력변수, 10개의 노드
    tf.keras.layers.Dense(10,activation='sigmoid'), #10개의 노드
    tf.keras.layers.Dense(1,activation='sigmoid'),  #1개의 노드
])


#모델 구축하기_두번째 방법
model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(10,input_dim=2,activation='sigmoid'))
model.add(tf.keras.layers.Dense(10,activation='sigmoid'))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))

 

3. 모델 학습시키기

#MSE를 loss로 설정, 최적화 방식은 SGD
model.compile(loss="mean_squared_error",optimizer="SGD")

#dataset에 저장된 데이터를 입력하고 epochs를 100으로 설정하고 학습
model.fit(dataset,epochs=100)

 

4. 평가 및 예측하기

 

#모델 평가 및 예측하기
model.evaluate(X_test,Y_test)
predicted_labels_test = model.predict(X_test)
반응형