ML\DL

[모두의 딥러닝] 정리

메린지 2022. 4. 29. 16:35

1장. 해보자! 딥러닝

  • 인공지능 > 머신러닝 > 딥러닝
  • 코랩 사용법

2장. 딥러닝의 핵심 미리 보기

  • 머신러닝 = 데이터 안에서 규칙을 발견하고 그 규칙을 새로운 데이터에 적용해서 새로운 결과를 도출
  • 학습 = 데이터가 입력되고 패턴이 분석되는 과정
  • 예측성공률 ~ 얼마나 정확한 경계선을 긋느냐
  • 퍼셉트론, 아달라인, 선형회귀, ...
  • sample + attribute (속성, X) + Class (y)

1. 환경준비 -> 2. 데이터 준비

-> 3. 구조 결정: 1) model 선언 2) model.add() 로 층 쌓기 ~> 몇 개의 층? dense 안 파라미터 설정?

-> 4. 모델 실행: model.compile(), 한 번만 통과가 아니라 위아래로 오가며 최적의 모델 찾기

3장. 딥러닝을 위한 기초 수학

  • 기울기, y절편, 미분, 편미분
  • 활성화함수 = 출력값으로 얼마나 내보낼지를 계산하는 함수

4장. 가장 훌륭한 예측선

  • 하나의 x값으로도 y값을 설명 가능 -> 선형회귀 (linear regression)
  • x값이 여러개 필요함 -> 다중 선형 회귀 (multiple linear regression)
  • 최소제곱법 = (x-x_mean)(y-y_mean) / (x-x_mean)^2
  • 평균제곱오차 (Mean Square Error, MSE) = (y-y_pred)^2 / n

5장. 선형 회귀 모델: 먼저 긋고 수정하기

  • 경사하강법(gradient decent) = 오차의 변화에 따라 이차 함수 그래프를 만들고 적절한 학습률을 설정해 미분값이 0인 지점을 구하는 것 <-> 옵티마이저(optimizer)
  • 학습률(learning rate) = 변화율 -> 학습률이 0.01 이고 그래프 기울기가 2.5 면 둘을 곱한만큼 이동
  • 너무 크거나 작으면 안됨 -> 수렴하는 값을 찾을 수 없음
  • 가설함수(hypothesis) <-> H(x)
  • 가중치(weight) <-> w
  • 편향(bias) <-> b
  • 손실함수(loss function) = 실제 값과 예측 값 사이의 오차 <-> MSE

model = Sequential()

model.add(Dense(층에 있을 노드 수, input_dim = 1 (입력인자 수), activation='relu' (활성화함수)))

model.compile(optimizer='sgd', loss='mse')

model.fit(x, y, epochs=2000)

6장. 로지스틱 회귀 모델: 참 거짓 판단하기

  • 로지스틱 회귀(logistic regression) -> 참과 거짓 중 하나를 내놓는 과정
  • 값이 0과 1로만 되어있으므로 일차 방정식이 어렵고 s자 형태여야 함 -> 시그모이드 함수 (sigmoid function)
    --> y = 1 / 1+e^-(ax+b) --> a가 커지면 경사가 커짐, 반대는 작아짐 / b가 너무 커지거나 작아지면 오차커짐
  • 실제 값이 0과 1이기 때문에 함수를 -{ylogh + (1-y)log(1-h)}로 두면 앞에는 1이면 없어지고 뒤는 0이면 없어짐
    => 교차 엔트로피 오차 (cross entropy error)
  • 선형 회귀 -> MSE / 로지스틱 회귀 -> 교차 엔트로피 오차

7장. 퍼셉트론과 인공지능의 시작

  • 인공신경망 (Artificial Neural Network, ANN)
  • 퍼셉트론(perceptron) -> 입력 여러개 받아 출력 만듦, 입력 값에 가중치를 조절할 수 있도록 하여 최초의 '학습'
  • 이후 경사 하강법을 도입해 최적의 경계선을 그릴 수 있게 한 아달라인(Adaline)
  • 퍼셉트론의 과제 -> XOR 문제 : 최적의 선을 어떻게 긋지,,?

8장. 다층 퍼셉트론 (Mulitilayer perceptron)

  • 퍼셉트론의 한계인 XOR 문제를 어떻게 해결할 것이냐?
    -> 퍼셉트론 두 개를 한 번에 계산하면 된다는 결론 => 두개를 각각 처리하는 은닉층(hidden layer)
  • 은닉층으로 입력 값에 가중치(w)를 곱하고 bias(b)를 더해 전송
  • 하지만 가중치를 데이터를 통해 학습하는 방법이 없었음 -> 오차 역전파

9장. 오차 역전파에서 딥러닝으로

  • 경사하강법 -> 임의의 가중치를 선언하고 결과값을 이용해 오차를 구한 후에 이 오차가 최소인 지점으로 서서히 이동
  • 즉, 단일 퍼셉트론 시 가능한 방법 (입력-출력층만 존재) -> 입력과 출력 값을 비교해 오차 구함
  • 하지만 은닉층은 겉으로 드러나지 않아서 그 값을 모름 -> 오차를 구할 만한 적절한 출력이 없음
  • 델타식을 이용해 은닉층의 가중치를 구할 수 있게됨 (out(1-out) 형태)
  • 하지만 층이 깊어질수록 출력층에서 시작된 가중치 업데이트가 출력층까지 전달되지 않음
    -> 그 이유는 시그모이드는 미분하면 최대치가 1보다 작은 0.25이기 때문
  • 이를 해결하고자, ReLU (렐루) 등장 = x가 0보다 작을 때 모든 값을 0으로 처리, 0보다 크면 x 그대로 사용
  • * 활성화 함수는 그 이후 하이퍼볼릭 탄젠트(tanh(x)), softplus 등 등장
  • 경사 하강법 : 계산량 너무 많은 단점 => Stochastic Gradient Descent, SGD, 확률적 경사 하강법 등장
    --> 전체 데이터 아닌 랜덤하게 추출한 일부 데이터, 빠르고 더 자주 업데이트 장점
  • 모멘텀: 이전 것과 같은 방향으로 일정한 비율만 수정되도록 하는 방법, 관성법, 지그재그 현상 감소
  • 현재 adam, 아담 이라는 고급 경사 하강법이 가장 많이 쓰임
  • 경사 하강법 <-> optimizer, 활성화 함수 <-> activation

10장. 딥러닝 모델 설계하기

1) model = Sequential() ## 딥러닝 모델의 구조를 짜고 층을 설정

2) model.add ( Dense ( 30, input_dim = 16, activation = 'relu' ) ) ## add시 마지막 제외 은닉층 쌓기

3) model.add ( Dense (1, activation='sigmoid' ) ) ## 마지막이라 출력층 쌓기
-> Dense로 모델의 상세 구조 짜기 ( 그 층의 Node 수, 가져올 입력값 수, 활성화 함수 )

4) model.compile ( loss = 'binary_crossentropy', optimizer='adam', metrics = ['accuracy'] ) # 모델 컴파일

 

오차 함수 설정

1> Linear regression (선형회귀) : MSE (평균 제곱 오차, 평균 절대 오차, 평균 절대 백분율 오차, 평균 제곱 로그 오차)

2> Logistic regression (로지스틱 회귀) / 이항 분류 : cross entropy error

3> 다항 분류 : categorical_crossentropy

 

평가 metrics 종류

1> train set: acc, loss (정확도, 손실값)

2> test set: val_acc, val_loss

  • epoch(에포크): 각 샘플이 처음부터 끝까지 몇 번 재사용될지 정하는 변수
  • batch_size: 전체 샘플 데이터 한 번에 몇 개씩 처리할지 정하는 것
    -> 너무 크면 느리고, 너무 작으면 그룹 간 편차가 커짐, 적절하게 설정

11장. 데이터 다루기

https://colab.research.google.com/drive/1fPK2nqHyhG0np9zOw98rPMNetpNFDggE?usp=sharing 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

12장. 다중 분류 문제 해결하기

https://colab.research.google.com/drive/1BqrKSA3o2cJDdRyCRAMbV3X693LDyuaQ?usp=sharing 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

  • 원-핫 인코딩
  • 소프트맥스 함수
  • verbose : 상세한 log를 출력할지 말지 정하는 para

13장. 모델 성능 검증하기

https://colab.research.google.com/drive/1pYXS_2UVZNpQbzqlSz9zB_99lk1Lso3M?usp=sharing 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

  • 과적합(overfitting) <--> underfitting
  • train vs test
  • 모델 저장 (model.save)
  • k-fold cross validation

14장. 모델 성능 향상시키기

https://colab.research.google.com/drive/1ljoq9ket-MH15QJmMp8529XiuPwV1B3g?usp=sharing 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

  • validation set (검증셋) 추가
  • 모델 업데이트하기 -> ModelCheckpoint()로 확인
  • history 사용
  • 학습 자동 중단-> EarlyStopping() 로 멈춤

15장. 실제 데이터로 만들어 보는 모델

https://colab.research.google.com/drive/1TTmakxfRxWN3nb-55oYG_7t88q6rVuqY?usp=sharing 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

  • 전체 단계 적용 해보기
  • isnull() : 결측치 확인
  • fillna() : 결측치 보완
  • 속성 관련 corr()

16장. 이미지 인식의 꽃, 컨볼루션 신경망(CNN)

https://colab.research.google.com/drive/1g4x7YaqNv8d62dBKAlR_hy3p0SsDoQca?usp=sharing 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

  • model.evaluate(x, y) -> 0: loss 출력 || 1: accuracy 출력
  • mnist 손글씨 데이터 이용 : 28 * 28 = 784 (2차원) , 0~255 의 행렬로 채워짐 -> reshape() 함수로 1차원 배열 변경
  • class는 0~9 까지, np_utils.to_categorical() 로 원-핫 인코딩 ( 8 -> [0, 0, 0, ,,, ,1, 0] )
  • CNN (Convolution Neural Network) : 입력된 이미지에서 다시 특징을 추출하기 위해 커널(슬라이딩 윈도) 도입
  • Kernel(커널) 안에는 가중치 -> 커널을 적용하여 새롭게 만든 layer는 convolution layer(컨볼루션, 합성곱 층)
  • 컨볼루션 추가: model.add( Conv2D( kernel 수 , kernle_size = (n, m) , input_shape=(a, b, 색상(1 or 3)) , activation='relu') ) -> 추가한 Conv 층으로 이미지 특징 추출
  • 풀링(pooling) : 이미지 특징 추출 결과가 여전히 크고 복잡할 시, 축소
    -> model.add ( MaxPooling2D( pool_size = (n, m) ) )
  • maxpooling : 정해진 구역에서 최댓값 뽑기, average pooling : 평균값 뽑기
  • 드롭아웃(Dropout) : 은닉층에 배치된 노드 중 일부를 임의로 꺼서 학습 -> model.add( Dropout (0.25) )
    ==> 랜덤하게 노드를 꺼주면 학습 데이터에 지나치게 치우쳐서 학습되는 과적합 방지
  • 이러한 과정을 지나 처음 Dense() 기본 층에 연결하기 위해서는, 컨볼루션 층이나 맥스 풀링이 주어진 이미지를 2차원 배열인 채로 다루기 때문에 1차원 배열로 바꿔주어야 함
    ==> Flatten() : model.add( Flatten() )

17장. 딥러닝을 이용한 자연어 처리

https://colab.research.google.com/drive/1Jg8b5JNCqGcQr7Bweh00slhpGh3KcEhY?usp=sharing 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

  • 텍스트를 잘게 나누는 것 -> 토큰(token)화 (tokenization)
  • keras의 text_to_word_sequence()를 이용하면 단어 단위로 나눠짐
  • Bags-of-Words -> 단어의 가방, 빈도수 세기 쉽고 순서 X
Tokenizer
token = Tokenizer()
1) token.word_counts : 단어 빈도수
2) token.document_count : 문장 카운트
3) tkoen.word_docs : 단어 포함 문장수
4) token.word_index : 단어 index 확인
  • 원-핫 인코딩을 이용하여 각 문장 내 단어의 해당 위치를 1로 바꾸어 표현 -> [0 1 0 0 0]
  • 하지만 이러한 방식은 벡터의 길이가 불필요하게 길어지며 공간 낭비할 확률 높음
  • 따라서, 단어 임베딩(word embedding)을 통해 차원축소 (단어 간 유사도 이용)
    ==> model.add( Embedding ( n=input word , m=output vector size , <<input_length=단어수>> ) )
  • 패딩(padding) : 딥러닝 모델 입력 시 학습 데이터 길이 동일해야함, 토큰 수 맞추는 작업

18장. 시퀀스 배열로 다루는 순환 신경망(RNN)

  • RNN (Recurrent Neural Network): 순환신경망, 여러 개의 데이터가 순서대로 입력되었을때 잠시 기억하고 얼마나 중요한지 판단하고 별도의 가중치를 주어 다음 데이터로 넘기는 방법 -> 같은 층을 맴도는 것처럼 보임
  • LSTM (Long Short Term Memory): 한 층 안에서 반복을 많이 해야 하는 RNN의 특성상 일반 신경망보다 기울기 소실문제가 더 많이 발생하고 이를 해결하기 어렵다는 단점 보완 -> 즉, 반복되기 직전에 기억된 값을 넘길지 관리

https://colab.research.google.com/drive/1o7J_JCQp9xjF6aDg_6LX3oSS-3y8JMyb?usp=sharing 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

  • load_data() 사용시 -> num_words = n para를 이용해 빈도수 n까지의 단어를 불러옴
  • 주의할점: 각 기사의 단어 수가 제각각 다르므로 이를 동일하게 맞추어야 함 -> sequence(x, max_len=m)
  • Conv1D, MaxPooling1D: 1차원 배열에서 작동
  • RNN의 한계: 입력된 값들을 잠시 가져 적절한 출력값 만듦 -> 너무 길면 어떻게 다 기억할거야....
    => 마지막 셀 Context vector (문맥벡터)가 기억해야함
Attention(어텐션)
1) 인코더와 디코더 사이에 층 생성
2) 그 층에 각 셀로부터 계산된 층 생성
3) softmax 함수를 통해 attention 가중치 생성
4) 이 가중치를 보고 중점적으로 볼 셀 결정
-> model.add ( Attention () )

19장. 세상에 없는 얼굴 GAN, Autoencoder