2022.08.29~2022.09.02
구름 X 전주 ict이노베이션 스퀘어의 온라인 코딩교육 내용을 정리하였습니다.
진도가 한달 정도 밀렸는데 이걸 언제쯤 따라잡을 수 있을까요... 취업이라는 거대한 벽이 점점 가까워져 오고 있음에, 그럼에도 점프할 역량이 아직 되지 않음에 갑갑할 뿐인 매일입니다.
Activation Functions (활성함수)
- "이전 레이어의 모든 입력에 대한 가중합"을 받아 출력값을 생성해 다음 레이어로 전달하는 비선형 함수
- 하이퍼파라미터 'activation'. Sigmoid, Tanh, ReLU가 대표적.
- 과정: (이전 레이어에서 받은) 데이터와 세타(가중치)들의 선형결합 계산 -> 선형결합 결과에 활성함수 적용
Perceptrons
- 단층 퍼셉트론(Single-Layer Perceptron, SLP): 직선으로만 영역을 구분할 수 있기 때문에 XOR같은 문제 해결 불가
- 다층 퍼셉트론(Multi-Layer Perceptron, MLP): 복수의 Perceptron을 연결해 레이어를 쌓아('은닉층') 복잡한(곡선) 영역구분 가능. 과적합 가능성 존재
- 인공 신경망(Artificial Neural Network, ANN): Perceptron을 모은 Layer들을 깊이 방향으로 쌓아 복잡한 모델 생성.
Back Propagation Algorithm (오차 역전파 알고리즘)
- 오차를 계산한 뒤 역방향으로 전파(Propagation)하는 알고리즘
- forward로 한번 연산 -> Cost를 역방향으로 전달하며 (미분, 곱, 합 등 연산 반복하며)파라미터 갱신
- Vanishing gradient: 레이어가 깊어질수록 기존의 오차값이 역방향 뒤까지 전달되지 않는 문제(미분을 반복하면서 하수 기울기가 0이되는 등). ReLU를 활성함수로 적용하면 해결 가능
https://playground.tensorflow.org/ : 딥러닝 모델 학습 과정, 결과 등을 볼 수 있는 사이트.
Gradient Descent (경사 하강)
- 이미지 출처: https://www.ibm.com/cloud/learn/gradient-descent
- starting point에서 loss를 감소시킬 수 있는 방향(=기울기 반대방향. 미분 시 기울기가 +라면 -쪽으로, -라면 +쪽으로) point를 옮겨가며 최적의 point를 찾아내는 것
- 학습률 크기에 따라 조금씩 움직일수도, 크게 움직일 수도 있음
- 이를 활용한 신경망 학습 과정: 모든 파라미터 theta(가중치) 초기화 -> cost function상의 가장 낮은 지점을 향해 나아감 -> 선택한 gradient descent method를 적용해 theta(가중치) 지속적으로 업데이트
Neural Network Optimization (신경망 최적화)
- 파라미터 theta(가중치)초기화 -> 가중치 규제(감퇴)
- 가중치 초기화: Weight Initialization. 퍼셉트론 Activation function에서의 입력값이 너무 커지거나 작아지지 않게 조정해주는 과정. 자비에Xavier 초기화(Sigmoid/tanh)와 헤He 초기화(ReLU) 두가지가 주로 쓰임.
- 가중치 규제: Weight Regularization. 모델이 복잡해질수록 가중치 개수 多 -> 값 大. 이에 L1 / L2 정규화(규제) 시행
- L1 Regularizaiton: Lasso. 가중치 절대값 합에 비례해 패널티(관련성이 없거나 거의 낮은 특성 가중치를 0으로 유도)
- L2 Regularization: Ridge. 가중치 제곱의 합에 비례해 패널티(큰 가중치에 제약)
- Regularization Rate(정규화율, lambda): 정규화 함수의 상대적 중요도 지정. 높을수록 과적합 가능성, 모델 정확성 감소
Stochastic Gradient Descent (확률적 경사하강, SGD)
- 하나의 Training data(Batch size=1)마다 cost를 계산하고 바로 Gradient Descent를 적용해 weight값을 update하는 것. early-step(수렴 조건)을 조정해주어야 함.
- Mini-Batch Stochasitc Descent라고 해서, 작은 사이즈로 시행도 가능: Batch size만큼의 데이터를 골라 cost를 계싼하고 Gradient Descent를 적용. GPU기반의 효율적인 병렬연산 가능
Avoiding Overfitting
1. Dropout 사용
- `tf.keras.layers.Dropout(0.5)`: 훈련 시, 매 batch마다의 layer단위에서 50%만큼의 뉴런을 꺼트려 학습시킴
- 가중치 값이 큰 특정 뉴런의 영향력으로 다른 뉴런의 학습에도 문제가 일어나는 Co-adaption을 피할 수 있음
2. Batch Normalization
- input data에 대해 표준화를 진행하는 것. 데이터 내 column들의 scale을 통일해 모델 성능을 높임
- 신경망 내부 중간에 있는, 은닉층으로의 input에 대해서도 적용해 줌
- 활성함수 적용 전에 먼저 적용! 하므로 학습 속도 & 결과 개선, overfitting억제
※ epoch: 데이터를 몇 '번' 넣어 줄 것인지 결정
※ batch size: 데이터 덩어리를 나누었을 때 한 덩어리 안의 데이터 수
※ layer / unit size: 작은 인공신경망에서 시작해 점차적으로 고도화하는 것이 좋다.
※ 과적합에서 더 복잡해지다 보면 새로운 보간법 임계점(interpolation threshold)이 나온다. 즉, 변곡점을 지나면 기존 error보다 더 낮은 error에 도달할 수도 있다.
DEEP LEARNING(모델 위주 설명)
- 구조결정의 핵심: 층Layer(데이터 처리 필터). 데이터로부터 주어진, '문제 해결에 도움이 될' 표현을 추출해 냄.
- 실행 순서: 컴파일compile -> 훈련fit -> 평가evaluate -> 예측predict.
- 모델 기본 구조: 입력층input layer, 은닉층hideen layer, 출력층output layer
#구조 결정(모델을 설정하고 실행하는 부분)
model = Sequential() #신경망을 한 층 쌓음(아래에서 add() 사용)
model.add(Dense(30, input_dim=17, activation='relu', name='Hidden-1'))
#dense()로 신경망 각 층의 특성 설정. 순서대로 출력 뉴런 수, 입력 뉴런 수, 활성함수
model.add(Dense(1, activation='sigmoid', name='Output'))
- 왼쪽 그림은 위 코드의 실행과정을 설명한 것. 첫번째로 쌓은 은닉층의 활성함수가 relu -> relu를 적용한 결과가 이후의 은닉층에 들어감 -> sigmoid 활성함수를 출력으로 갖게 됨
- 컴파일compile(): 손실함수loss, 최적화도구optimizer, 평가도구metrics를 주요 파라미터로 받음. (손실함수에는 mse, crossentropy. 최적화 도구에는 rmsprop, adam. 평가 종류 도구에는 loss(오차), accuracy(정확도)등이 있다.)
- 훈련fit(): 훈련용 (특징)데이터, 훈련용 레이블 데이터, epochs, batch_size를 주요 파라미터로 받음. (epochs는 학습 반복 횟수(문제를 몇 번 풀건지), batch_size는 반복 시 사용할 데이터의 개수(몇 문제를 풀고 답을 확인할건지))
#딥러닝 실행(컴파일 및 훈련) 및 모델 평가
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
#compile()로 학습 프로세스 설정. 순서대로 손실함수 종류, 최적화 방법, 평가 방법
model.fit(X_train, y_train, epochs=100, batch_size=10, verbose=0)
print(f"Accuracy: {model.evaluate(X_test, y_test)[1].4f}")
Tensor (텐서)
- 신경망을 위한 데이터 표현. 숫자를 위한 데이터 container
- 임의의 차원 개수를 가지는 다차원 배열(벡터의 확장, N-dimension Matrix). 차원을 축axis이라 부름!
- 핵심 속성: 축 개수(rank), 크기(shape. 텐서 각 축에 얼마나 많은 차원이 있나 나타냄), 타입(tensor)
- 0D텐서: 0개의 축. 하나의 숫자 값.
- 1D텐서: 1개의 축. 숫자의 배열. 벡터의 '차원'과 텐서의 '축'개념은 다름 (아래 x의 경우, 원소가 5개이므로 5D벡터라고 할 수 있으나 텐서 축은 1개이므로 1D텐서)
x = np.array([1, 2, 3, 4, 5])
x, x.ndim, x.shape #(array([1, 2, 3, 4, 5]), 1, (5,))
- 2D텐서: 2개의 축. 벡터의 배열. '행렬'이라고도 불림. 행(row/sample)과 열(column/features)로 지칭됨
x = np.array([[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15]])
x, x.ndim, x.shape #위의 x그대로, 2, (3, 5)
- 3D텐서: 3개의 축. 데이터에 시간 축(주로 두번째 축, 인덱스 1 축)이 포함된 것. 주식 데이터, 트위터 데이터 등 (1분마다 현재 가격, 지난 최고 가격, 지난 최소 가격을 390분동안 저장한 250일치 데이터는 (250, 390, 3))
- 4D텐서: 4개의 축. 높이, 너비, 컬러채널의 3차원 이미지에 대한 데이터셋 (텐서플로우의 경우 `(samples, height, weight, color_depth)`: 48 x 48크기의 흑백 이미지 128개 데이터셋의 경우 (128, 48, 48, 1))
- 5D텐서: 5개의 축. 비디오데이터. 하나의 비디오=프레임의 연속, 프레임=하나의 컬러이미지. ((samples, frames, height, width, color_depth))
Tensorflow
- 수치 연산과 대규모 머신러닝을 위한 오픈소스 라이브러리
- python API이나 javascript, 모바일 앱, 라즈베리 파이 등 다양한 곳에서 사용 가능. 시각화, 이벤트 로그, 모델 세이브포인트 기능을 제공
- 업데이트가 잦고 버전별로 변동이 크기때문에 검색, 도큐먼트 이용이 필수
- 텐서플로우에서 연산 시행: 텐서플로우 그래프 형성(텐서 사이 연산 계산, 그래프 정의 및 선언) -> 텐서플로우 그래프 실행(그래프에 정의된 연산 시행)
- tensorflow v1과 v2는 사용방법과 함수 등이 많이 다름: 구버전을 사용해야 하다면 찾아가며 공부하기!
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior() #v2를 끔
a = tf.add(3, 5)
print(a) #Tensor("Add:0", shape=(), dtype=int32)
b = tf.add(231, 132, name="metamon") #텐서 이름을 metamon으로 지정
print(b) #Tensor("metamon:0", shape=(), dtype=int32)
sess = tf. Session() #세션(텐서를 실행시킴) 엶
print(sess.run(a)) #8
print(sess.run(b)) #363
sess.close() #세션을 열었다면 반드시 꺼주어야 함
#세션을 열고 닫기 귀찮다면 아래처럼 with 사용해주기
with tf.Session() as sess: #with로 '열린 잠깐'만 실행하고 끎
print(sess.run(a)) #8
print(sess.run(b)) #363
- sklearn은 y가 1차원이어도 상관 없었지만, tensorflow는 y역시 x와 마찬가지로 2차원이어야 함 (low-level api일수록 차원을 맞춰주는 게 중요하다)
중간정리-
머신러닝 분류: 지도학습, 비지도학습, 준지도학습, 자기지도학습, 강화학습
- 지도학습: 샘플 데이터가 주어지면 그 데이터에 타깃을 매핑하는 방법을 학습하는 것. 분류와 회귀가 대표적. 시퀀스 생성, 구문트리 예측, 물체 감지, 이미지 분할 등에 사용됨
- 비지도학습: 어떤 타깃도 사용하지 않고 데이터에 대한 변환을 찾아내는 것. 차원축소와 군집이 대표적. 데이터 시각화, 데이터 압축, 데이터 노이즈 제거, 데이터 상관관계 이해 등에 사용됨
- 준지도학습: 전체 데이터 중 일부만 타깃이 있는 경우. 대부분 지도학습과 비지도학습의 조합으로 이루어짐
- 자기지도학습: 학습과정에 사람이 개입하지 않는 지도학습. 오토인코더가 대표적. 레이블이 필요하긴 하나, 보통은 입력 데이터로부터 레이블을 생성함
- 강화학습: 환경에 대한 정보를 받아 보상(원하는 결과)을 최대화(빠르게 성취)하는 행동을 선택하도록 학습하는 것.
머신러닝 모델 평가
- 데이터를 2개(3개)로 나누어 진행. validation set(혹은 test set)의 데이터가 train set에 영향을 주는 정보 누설이 일어나지 않도록, 중복되지 않도록 유의해야 함
- hold-out validation, K-fold cross validation, iterated K-fold cross validation을 주로 사용
- 훈련 세트와 테스트 세트를 나누기 전 데이터를 shuffle하거나 `stratify=yes`로 클래스 비율을 유지시켜야 함
데이터 전처리, 특성공학feature engineering, 특성 학습: 원본 데이터를 모델에 적합하기 쉽도록 만들기 위함. 사용할 모델에 따라 벡터화(신경망), 정규화, 결측치 확인, 특성 추출 등이 필요
과대적합overfitting, 과소적합underfitting
- ML은 최적화와 일반화 사이의 줄다리기가 중요하다..
- 최적화optimization: 훈련 데이터에서 최고의 성능을 뽑아내기 위해 모델 조정
- 일반화generalization: 훈련시킨 모델의 성능이 얼마나 좋은지(다른 데이터에서도 괜찮은 성능을 보이는지) 확인
- 과소적합은 훈련데이터 loss도, 테스트 데이터 loss도 적은 상태(제대로 학습x). 과대적합은 훈련데이터 loss는 적으나 테스트 데이터 loss는 큰 상태(훈련 데이터에'만' 집중했기 때문에 다른 데이터에 대한 성능이 좋지 않음)
- 과적합을 피하기위해 데이터를 더 많이 모으거나, 규제(릿지/랏소)를 가하거나, (신경망)은닉층(혹은 유닛) 수를 줄이거나, (신경망)dropout을 추가해 주면 됨
ML 전체과정: 문제 정의, 데이터 수집 -> 지표 선택 -> 평가방법 선택 -> 데이터 준비 -> 모델 훈련 -> 모델 고도화 -> 모델 규제, 하이퍼 파라미터 튜닝
- ML은 훈련 데이터 세트의 '패턴'을 기억하기 위해 사용됨
'STUDY' 카테고리의 다른 글
파이썬 스터디 ver3. 14주차 (3) | 2022.10.22 |
---|---|
파이썬 스터디 ver3. 13주차 (0) | 2022.10.19 |
파이썬 스터디 ver3. 11주차 (2) | 2022.10.03 |
파이썬 스터디 ver3. 10주차 (4) | 2022.09.19 |
파이썬 스터디 ver3. 9주차 (3) | 2022.08.26 |