[모두의 딥러닝] 정리
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