교육/KT 에이블스쿨

[KT AIVLE School(에이블스쿨)] - 5주차 후기(딥러닝)

aaaahy 2023. 9. 9. 11:09

에이블 스쿨 5주차(9.4 ~ 9.8) - 4기 AI트랙

9월도 열심히 시작해보자고 ‎(*˙︶˙*)و

근데 여름 언제 끝나지

 
 

딥러닝

 
이번에도 지난주 머신러닝과 마찬가지로 5일동안 딥러닝 수업이 진행되었다.
딥러닝은 예전에 맛보기 수준으로 잠깐 배운적이 있었는데 기억이 잘 나지 않아서 전에 학교에서 과제로 진행했던 노트 정리가 있어서 찾아보았다. 이런걸 했었나..? ( ´△`)
 
여러 실습을 진행해보면서 모델의 정확도를 좀 더 높이기 위해 다양한 시도를 해보는 것이 흥미로웠고 
마지막 이틀동안은 딥러닝을 실제 어떤 방식으로 이용할 수 있을지 Hugging Face, Open api 등을 사용하여 실습해 볼 수 있었다. 
챗봇 실습을 진행하면서 느낀점 .. 챗 지피티는 엄청나다 ⧹╲⎝⧹༼◕ ͜.◕ ༽⧸⎠╱⧸
 

import tensorflow as tf
import pandas as pd

# 1. 데이터를 준비합니다
보스턴 = pd.read_csv("https://raw.githubusercontent.com/blackdew/ml-tensorflow/master/data/csv/boston.csv")
보스턴.columns

독립 = 보스턴[['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat']]
종속 = 보스턴[['medv']]

# 2. 모델을 준비합니다
X = tf.keras.Input(shape=[13])
Y = tf.keras.layers.Dense(1)(X)
model = tf.keras.Model(X, Y)
model.compile(loss='mse')

# 3. 데이터로 모델을 학습(fit)합니다
model.fit(독립, 종속, epochs=500, verbose=0)
model.fit(독립, 종속, epochs=10)

# 4. 모델을 이용합니다
model.predict(독립[:5])

↪ 코드 구조 ( 보스턴 집값 예측 )

  1. 데이터를 준비한다
  2. 모델을 준비한다
  3. 데이터로 모델을 학습한다
  4. 모델을 이용한다

* 퍼셉트론(Perceptron) : 다수의 값을 입력받아 하나의 값으로 출력하는 알고리즘 
                   예시로 보스턴 집값 예측 예제, 가중치와 편향 존재
* 인공신경망 : 퍼셉트론(Perceptron)이 모여 층(Layer)을 만드는 것
 

활성화 함수 

➙ 퍼셉트론의 출력 값 결정
 
 - 회귀 모델

  • Identity (y=x 형태로 값 그대로 전달)
  • activation (사용 x)
  • loss = 'mse'

 
- 분류 모델

  • 0 ~ 1 확률 값으로 변경
  • activation = 'softmax' ▶ loss = 'categorical_crossentropy'
  • activation = 'sigmoid' ▶ loss = 'binary_crossentropy'

 

* Softmax

- 결과값 합이 1 ⇾ 종속 변수 One-hot encoding 진행
get_dummies(drop_first=True)로 진행 시 하나의 변수가 삭제되므로 종속변수 전체 합이 0이 되지 않는 결과값 존재

x1, x2, x3, x4 = 5.1, 3.5, 1.4, 0.2

y1 = 0.65599036 * x1 + 2.2484128 * x2 + -2.6467762 * x3 + -1.8446894 * x4 + 1.1519309
y2 = -0.019268851  * x1 + 0.80599034 * x2 + 0.22133625 * x3 + -1.4227935 * x4 + 0.83878
y3 = 0.05205865 * x1 + -0.4040903 * x2 + 0.6569694 * x3 + 0.3416532 * x4 + -1.0772195

print(y1, y2, y3)

ey1 = math.e ** y1
ey2 = math.e ** y2
ey3 = math.e ** y3

py1 = ey1 / (ey1 + ey2 + ey3)
py2 = ey2 / (ey1 + ey2 + ey3)
py3 = ey3 / (ey1 + ey2 + ey3)

print(py1, py2, py3)

↪ softmax 결과 값 확인 코드(아이리스 품종 분류)
 

* Relu

➧ max(0, x) - 음수인 부분은 0 ➱ 미분이 불가 ➱ 개선된 활성화 함수 : swish, gelu
 

Optimizer

: 최적화 알고리즘으로 모델을 학습시킬 때 가중치를 조정하여 손실을 최소화하고 모델의 성능을 향상시키는 역할 
 
1) Gradient Descent (경사하강법)
- 함수의 기울기를 계산하여 극값에 이를 때 까지 기울기가 낮은 쪽으로 이동
* SGD(확률적 경사하강법) - 각 배치에 대해 함수의 기울기 계산하고, 반대 방향으로 가중치를 업데이트
2) Momentum (관성)
- 이전 기울기의 지수 가중 평균을 사용하여 업데이트
- 기울기의 방향이 일정한 속도로 유지, Local Minima(지역 최소값)에서 빠져나오기 쉬움
3) Adagrad (Adaptive Gradient)
- 많이이동한변수(w)는 최적값에 근접했을것이라는가정
- 자주 업데이트되는 변수에 대해서는 학습률을 작게 하고, 드물게 업데이트되는 매개변수에 대해서는 학습률을 크게 조절
4) Adam (RMSprop + Momentum)
- Momentum과 RMSprop의 아이디어를 결합한 최적화 알고리즘
 

Flatten Layer, sparse_categorical_crossentropy, validation_split

 
mnist 손글씨 이미지 분류 학습 코드

import tensorflow as tf
import pandas as pd

# 데이터를 준비합니다.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
# 모델을 준비합니다.
X = tf.keras.Input(shape=[28, 28])
H = tf.keras.layers.Flatten()(X) # Flatten 층 추가
H = tf.keras.layers.Dense(64, activation="swish")(H)
Y = tf.keras.layers.Dense(10, activation="softmax")(H)
model = tf.keras.Model(X, Y)
model.compile(loss="sparse_categorical_crossentropy", metrics="accuracy")
# 범주형 변수가 0부터 시작하여 레이블링이 완료되어있는 경우 사용 가능

model.summary()

▶ 표로 만드는 reshape() 대신 Flatten 층 추가
▶ 종속변수가 범주형 변수로 숫자로 레이블링 되어있는 경우, 원핫인코딩 방식 생략 후 compile할 때 손실함수로 sparse_categorical_crossentropy 사용 가능
 

# 데이터로 모델을 학습합니다.
result = model.fit(x_train, y_train, epochs=10, batch_size=128,
          validation_split=0.2 # validation_data=(x_val, y_val)
)

training set만 가지고 계속 학습할 경우, training set에 대해 높은 성능을 보이며 loss가 감소
➝  validation set에서의 loss가 증가(training set에만 너무 맞추어져있어서) ➝ Overfitting 발생
Validation은 학습 도중에 Overfitting을 모니터링하기 위한 셋
validation_split = 0.2(분할 비율) or validation_data = (x_val, y_val) 
 

Overfitting

: training set에 특화된 학습으로 새로운 데이터(validation set)에 대한 예측이 나빠지거나 성능 효과가 좋지 않은 상태
 
해결하기 위한 방법
1) 충분한 데이터 확보
2) Dropout
- 지정된 확률의 개수만큼 랜덤하게 노드 제외시키고 학습 진행
- 앙상블 효과
3) Batch Normalization
- Layer 사이에 중간 결과 데이터들을 표준정규화하는 계층