본문 바로가기
딥러닝/이론 정리

딥 러닝 차근차근 이론 정리.

by 초보코딩러 2021. 7. 2.

1. 딥러닝 

인공지능 > 머신러닝 > 딥러닝
  • 머신러닝 : 데이터를 이용해 앞 일을 예측.
  • 인공지능의 큰 범주 안에 머신러닝 

point : 딥러닝을 배우려면 머신러닝의 기초 개념을 알아야 한다.

 

1#-1. 딥러닝을 이용해 할 수 있는 것은????????

  • 수술 환자의 사망률 예측
  • 아이리스 품종 분류
  • 손글씨 판별

이미 다양한 곳에서 인공지능이 활용되고 있다.

 

 

2. 케라스와 텐서플로우

  • 딥러닝은 케라스(keras)를 사용해 실행 시킨다.
  • 케라스는 텐서플로(tensorFlow)가 먼저 설치되어 있어야 한다.
  • 딥러닝 프로젝트 == '여행' 비유에 본다면

    -  텐서플로는 목적지까지 빠르게 이동시켜주는 비행기

    -  케라스는 비행기의 이륙 및 정확한 지점까지의 도착을 책임지는 파일럿

 

 

Sequential() 함수
▶ 딥러닝의 구조를 한 층 한 층 쉽게 쌓아 올릴 수 있게 해 준다. #모델을 담는 바구니 역할.
▶ Sequential() 함수를 선언 model.add( ) 함수를 사용해 필요한 층을 차례로 추가하면 된다.

model = Sequential() #바구니                                   
model.add(Dense(24,  input_dim=60, activation='relu'))  # 입력층 노드 수 60개(relu)
model.add(Dense(10, activation='relu'))                 # 은닉층1 노드 수 24개(relu)
                                                        # 은닉층2 노드 수 10개(relu)
model.add(Dense(1, activation='sigmoid'))               # 출력층 노드 수 1개(sigmoid로 이진 분류)
                                                        # activation : 다음층으로 어떻게 값을 넘길지 결정하는 함수 

2#-2 model.add( ) 함수

    • 층을 몇 개 쌓을지는 데이터에 따라 그때 그때 결정한다.
    • 케라스의 가장 큰 장점 중 하나는 model.add( ) 함수를 이용해 필요한 만큼의 층을 쉽게 쌓아 올린다.
    • model.add( ) 함수안에는 Dense( ) 함수가 포함 (dense는 조밀하게 모여있는집합) 각 층이 제각각 어떤 특징을 가질지 옵션을 설정하는 역할
    • 딥러닝의 구조와 층별 옵션 입력 완료 후 compile( ) 함수를 이용해 실행  (ex Metrics : 척도는 결과적으로 이 모델의 성능은 얼마짜리야라는 개념이다. )

      출처:https://needjarvis.tistory.com/568[자비스가 필요해]
함수 정리 설명 자주 사용되는 함수
activation 다음 층으로 어떻게 값을 넘길지 결정하는 부분

relu( ) , sigmoid( ) 
loss 한번 신경망이 실행될 때 마다 오차 값을 추적하는함수 'binary_crossentropy'
optimizer 오차를 어떻게 줄여 나갈지 정하는 함수 'adam'

 

입력값이 네트워크 층을 거치면 예측값이 나오고, 이를 실제값과 비교해서 Loss score을 계산한 후 
                                          Optimizer를 통해 Weight를 업데이트 한다.

★point

y = ax +b

  • 딥러닝의 수학원리를 배울 때 이 식이 등장
  • x가 주어지고 원하는 y값이 있을 때 적절한 a 와 b 를 찾는 것, 딥러닝을 설명하는 가장 간단한 표현
계열 오차함수 종류 의미  사용처 특징
평균 제곱 계열
(Mean squared)
MSE
(Mean squared error)
평균제곱 오차 회귀 문제 속도가 느리다는 단점
MAE 평균절대 오차
MAPE 평균절대박분율 오차
MSLE 평균제곱로그 오차
교차 엔트로피 계열
(Cross-entropy)
categorical_crossentropy 범주형
교차 엔트로피
다중 클래스 분류 장점:
출력 값에 로그를 취해서 오차가 커지면 수렴 속도 증가, 오차가 작아지면 수렴속도 감소
binary_crossentropy 이항
교차 엔트로피
이중 클래스 분류

3. 딥러닝의 기본적인 계산 원리

딥러닝의 가장 말단에서 이루어지는 기본적인 계산 원리 2가지

1. 선형 회귀

2. 로지스틱 회귀 

 

3#-1 선형 회귀

  • 독립 변수 : 독립적으로 변할 수 있는 x값
  • 종속 변수 : 독립 변수에 따라 종속적으로 변하는 값
  • 선형 회귀 : 독립 변수 x를 사용해 종속 변수 y의 움직임을 예측하고 설명하는 작업
  • 단순 선형 회귀 : 하나의 x값 만으로도 y값 설명 가능
  • 다중 선형 회귀 : y값 설명에 x값이 여러 개 필요할 때

 

4.퍼셉트론

  • 인간의 뇌는 약 1000억개의 뉴런으로 이루어져 있고, 뉴런과 뉴런 사이에는 시냅스라는 연결 부위 존재
  • 신경 말단에서 자극을 받으면 시냅스에서 화학 물질이 나와 임계값 넘으면 전위 변화를 일으키는데, 이 매커니즘이 로지스틱 회귀와 많이 닮음.

로지스틱 회귀란?

: 회귀를 사용하여 데어터가 어떤 범주에 속할 확률을 0에서 1 사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류 해주는 지도 학습 알고리즘이다. 

 

2진 분류란?

: 데이터가 2개의 범주 중 하나에 속하도록 결정하는 것을 2진 분류(binary classification)라고 한다.

 

  •  y = ax +b( a는 기울기, b는 y 절편)

--> y = wx + b (w는 가중치, b는 바이어스)

  • 가중합(weighted sum) : 입력 값 X과 가중치 w 의  곱을 모두 더한 다음 거기에 바이어스 b를 더한 값
  • 활성화 함수 (activation function) : 가중합의 결과를 놓고 1 또는 0을 출력해서 다음으로 보내는데, 여기서 0과 1을 판단하는 함수 (sigmoid 함수 , relu함수, softmax함수 등 )

4#-1 XOR문제(1969년) 퍼셉트론의 과제

AND게이트 : x1, x2 둘 다 1일 때만 결과값이 1로 출력되는 게이트 

XOR게이트 : 둘 중 하나만 1일 때만 결과값이 1로 출력되는 게이트

OR게이트 : x1, x2 둘 중 하나라도 1이면 결과값이 1로 출력되는 게이트 

 

XOR의 경우 선을 그어 구분 할 수 없음. ----> 해결책 : 다층 퍼셉트론

 

4#-2 다층 퍼셉트론

  • 차원의 변화 

 

 

5. 기울기 소실 문제

  • 가중치를 수정하려면 미분 값, 즉 기울기가 필요하다고 배웠는데, 층이 늘어나면서 기울기 값이 점점 작아져 맨 처음 층까지 전달되지 않는 기울기 소실 문제 발생
  • 기울기 소실 문제가 발생하기 시작한 것은 활성화 함수로 사용된 시그모이드 함수의 특성 때문이다.

 

  • 여러 층을 거칠수록 기울기가 사라져 가중치를 수정하기가 어려워지는 것임
  • 활성화 함수를 시그모이드가 아닌 다른 함수들로 대체하기 시작

6. 활성화 함수 종류

6-1. 활성화 함수 설명

7. 고급 경사 하강법 - 확률적 경사 하강법(SGD, stochastic Gradient Descent)

  • 경사 하강법은 저확하게 가중치를 찾아가지만, 전체 데이터를 미분해야 하므로 계산량이 매우 많다는 단점.
  • 이러한 단점 보완한 고급 경사 하강법(SGD)이 등장하면서 딥러닝의 발전 속도는 더 빨라짐.
  • 전체 데이터르 사용x , 랜덤하게 추출한 일부 데이터 사용
  • 일부 데이터를 사용하므로 더 빨리 그리고 자주 업데이트가 가능
  • 경사 하강법의 대안으로 사용됨.

7-1 고급 경사 하강법 - 모멘텀(momentum)

  • 모멘텀 SGD란 말 그대로 경사 하강법에 탄력을 더해 주는 것 
  • 경사 하강법과 마찬가지로 매번 기울기를 구하지만, 이를 통해 오차를 수정하기 전 바로 앞 수정 값과 방향(+,-)을 참고하여 같은 방향으로 일정한 비율만 수정되게 하는 방법
  • 지그재그 현상이 줄어들고, 이전 이동 값을 고려하여 일정 비율만큼만 다음 값을 결정함으로 관상의 효과를 낼 수 있음.

7-2 고급 경사 하강법- 아담(Adam)

: 모멘텀과 알엠에스프롭 방법을 합친 방법(모멘텀 + 알엠에스프롭(RMSProp)

정확도와 보폭 크기 개선

 

8. 과적합(overfitting)

:모델이 학습 데이터셋에서는 어느 정도 예측 정확도를 보이지만, 새로운 데이터에 적용하면 잘 맞지 않는 것

  • 과적합은 층이 너무 많을 때, 변수가 복잡할 때, 테스트셋과 학습셋이 중복될 때 생기기도 함
  • 딥러닝은 학습 단계에서 입력층은닉층출력층의 노드들에 상당히 많은 변수들이 투입됨

8-1.과적합 판단

:학습이 깊어져서 학습셋의 정확도는 높아져도 검증셋에서 효과가 없다면 과적합 발생으로 판단

 

9. 모델 저장과 재사용

학습이 끝난 후 결과가 만족스러울 때 이를 모델로 저장하여 새로운 데이터에 사용 가능.

model.fit(X_train, Y_train, epochs = 130, batch_size = 5)
modal.save('my_model.h5)

#저장된 모델 로드
model = load_model('my_model.h5)

10. K겹 교차 검증

  • 알고리즘을 충분히 테스트 하였어도 데이터가 충분치 않으면 좋은 결과를 내기가 어렵다.
  • 이러한 단점을 보완하고자 만든 방법 K겹 교차 검증(k-fold cross validation)
  • k겹 교차 검증 : 학습 데이터를 여러 개로 나누어 하나씩 검증셋으로 사용하고 나머지를 모두 합해서 학습셋으로 사용하는 방법
  • 이렇게 하면 가지고 있는 데이터의 100퍼센트 검증셋으로 사용할 수 있다.
  • # kfold 교차 검증
    n_fold = 10
    skf = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=seed)

 

11. 모델 저장 폴더 만들기

MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
    os.mkdir(MODEL_DIR)

modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5"

11-1 모델 업데이트 및 저장

# 모델 업데이트 및 저장
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)

# 학습 자동 중단 설정
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=100)

12. 이미지 인식 컨볼루션 신경망CNN( Convolution Neural Net)

  • 컨볼루션 신경망(CNN) : 입력된 이미지에서 다시 한번 특징을 추출하기 위해 마스크(=필터, 윈도, 커널)을 도입하는 기법
  • 새롭게 만들어진 층을 컨볼루션(합성곱)이라고 부름
  • 컨볼루션을 만들면 입력 데이터로 부터 더욱 정교한 특징을 추출 할 수 있음.

 

12-1 여러개의 컨볼루션 만들기.

  • 새롭게 만들어진 층을 컨볼루션(합성곱)이라고 부름
  • 컨볼루션을 만들면 입력 데이터로부터 정교한 특징 추출
  • 이러한 필터를 여러 개 만들 경우 여러 개의 컨볼루션이 만들어짐

12-2 맥스 풀링

 

풀링(pooling) 또는 서브 샘플링(sub sampling)

: 컨볼루션 층을 통해 이미지 특징을 도출할 때, 그결과가 여전히 크고 복잡하면 다시 한번 축소 하는 과정

(꼭 필요한 내용만 간추리는 과정)

 

12-3 드롭 아웃

  • 딥러닝 학습을 실행할 때 가장 중요한 것은 과적합을 얼마나 효과적으로 피해가는지 달려있다.
  • 드롭 아웃(drop out) : 은닉층에 배치된 노드 중 일부를 임의로 꺼줘서 과적합 방지.
  • 랜덤하게 노드를 끔으로써 학습데이터에 지나치게 학습되는 과적합을 막을 수 있다.
  • model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu'))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=2))
    model.add(Dropout(0.25)) #과적합 방지 일부 노드를 사용하지 않는다. 과도한 데이터 학습을 막기 위함.
    model.add(Flatten()) #1차원으로 바꿔주는 함수 
    model.add(Dense(128,  activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))

 

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

  • 인공지능 비서 서비스를 누구나 사용하는 시대가 올 것
  • 자연어 처리 (NLP, Natural Language Processing): 음성이나 텍스트를 컴퓨터가 인식하고 처리하는것
  • AI스피커 : 애플 시리, 구글 어시스턴트, 아마존 엘렉사, SK Nugu, 네이버 클로바
  • 딥러닝이 등장하면서 자연어 처리 연구가 활발해짐(대용량 데이터를 학습할 수 있는 딥러닝의 속성때문)
  • 컴퓨터는 수치 데이터만 이해할 수 있기 때문에, 자연어처리는 텍스트 전처리 과정이 필수

13-1 텍스트의 토큰화

  • 먼저 해야 할일은 텍스트(문장)을 잘게 나누는 것
  • 토큰(token) : 텍스트(문장)를 단어별, 문장별, 형태ㅗ별로 나눌 수 있는데, 나누어져서 의미가 있는 단위
  • 토큰화(tokenization) : 입력된 텍스트를 나누는 과정

13-2  문장의 원 핫 인코딩 워드 임베딩(word embedding)

  • 공간적 낭비를 해결하기 위해 등장한 것이 단어 임베딩(word embedding)이라는 방법
  • 단어 임베딩은 주어진 배열을 정해진 길이로 압축 시킨다.

 

13-3 워드 임베딩 - Embedding() 함수

  • 워드 임베딩으로 얻은 결과는 밀집된 정보를 가지고 있음
  • 워드 임베딩을 이용해서 각 단어 간의 유사도를 계산할 수 있음
Embedding(16, 4) : 입력될 총 단어 수는 16, #임베딩 후 출력되는 벡터 크기 4
Embedding(16, 4, input_length = 2) : #총 입력되는 단어 수는 16개, 임베딩 후 출력되는 벡터 크기=4
                                     #단어를 매번 2개씩 집어 넣겠다는 뜻.

 

13-4 패딩(padding)

  • 문장의 단어 수를 똑같이 맞춰 주는 작업
  • pad_sequnce() 함수 :  원하는 길이보다 짧은 부분은 숫자 0을 넣어서 채어주고, 긴 데이터는 잘라줌
  • # 패딩, 서로 다른 길이의 데이터를 4로 맞추어 준다.
    padded_x = pad_sequences(x, 4)

 

 

 

 

댓글