모델의 컴파일 단계에서 다음과 같은 코드를 사용했었다.

model.compile(loss='categorical_crossentropy' , optimizer='adam' , metrics=['accuracy'])

 

이에 대해 이 코드가 무엇인지 의문이 들었지만 그냥 뭐 쓰는거겠지 하고 넘어가는 경우도 있을 것이다.

위에서 사용한 코드들에 대해 keras API reference와 여러 자료들을 바탕으로 직접 정리해보았다,

 

keras API reference (https://keras.io/api/)

 

Keras documentation: Keras API reference

 

keras.io

 

 

Loss Function

Losses reference (https://keras.io/api/losses/)

 

Keras documentation: Losses

Losses The purpose of loss functions is to compute the quantity that a model should seek to minimize during training. Available losses Note that all losses are available both via a class handle and via a function handle. The class handles enable you to pas

keras.io

 

Optimizer

Optimizers reference (https://keras.io/api/optimizers/)

 

Keras documentation: Optimizers

Optimizers Usage with compile() & fit() An optimizer is one of the two arguments required for compiling a Keras model: from tensorflow import keras from tensorflow.keras import layers model = keras.Sequential() model.add(layers.Dense(64, kernel_initializer

keras.io

 

서로 다른 유형의 문제와 목표에 따라 서로 다른 평가 지표가 적합합니다.  각각을 사용하는 경우에 대한 몇 가지 지침은 다음과 같다.

Accuracy:  클래스가 균형이 잡혀 있고 올바른 예측의 비율이 높을 때.

Precision: 오차가 큰 것(FP)이 오차가 작은 것(FN)보다 더 치명적인 경우에는 precision을 최소화하려면 사용합니다.

Recall(Sensitivity): 오차가 작은 것(FN)이 오차가 큰 것(FP)보다 더 치명적인 경우에는 recall을 최소화하려면 사용합니다.

F1-Score: precision과 recall 사이의 균형이 중요하고 오차가 큰 것과 오차가 작은 것 사이의 좋은 균형을 찾으려면 사용합니다.

ROC-AUC: 클래스 분포가 균형이 잡히지 않은 경우 또는 이진 분류기의 전체 성능을 평가하려면 사용합니다.


MAE: 목표가 회귀 문제에서 오류의 평균 크기를 측정하는 것일 때.

MSE: 목표가 오류의 평균 크기를 측정하고 회귀 문제에서 큰 오류에 더 많은 페널티를 주는 것입니다.

 

 

Metric

Metrics reference (https://keras.io/api/metrics/)

 

Keras documentation: Metrics

Metrics A metric is a function that is used to judge the performance of your model. Metric functions are similar to loss functions, except that the results from evaluating a metric are not used when training the model. Note that you may use any loss functi

keras.io

 

🧐    GAN (Generative Adversarial Networks 실습 

 <손글씨 인식 model> 

 

 

 

 

🧐   Auto - Encoder 실습 

 <손글씨 인식 model> 

 

 

 

 

🧐  Auto - Encoder 

🤫 Auto - Encoder란?
inputcode(hidden layer)로 encoding하는 encoder부분과
encoding된 code를 다시 decoding하는 decoder부분으로 구성되어 있다.
Encoding원래 data를 차원축소(dimensionality reduction)하는 것이다.
- 이때, 입력층보다 적은 수의 노드로 이루어진 은닉층(일명, code)을 중간에 넣어 차원을 줄인다.
Decoding은 차원축소(dimensionality reduction)된 data를 원래 data로 복원하는 것이다.
- code를 다시 원래 입력층과 같은 크기의 결과물로 출력한다.

원래 auto-encoder는 이전 기계학습에서 말했듯, PCA(주성분 분석)과 같은 차원축소를 위해 사용했었다.
하지만, 현재는 데이터 생성모형으로도 사용되고 있으며, 이때 auto-encoder는 비지도학습(unsupervised learning)에 속한다.





🤫  Auto-Encoder의 내부 구조 및 formula

입력데이터와 출력층의 벡터를 𝜒,  code(은닉층)에 해당하는 벡터를  𝟋 라 할 때,
encoder ɸ와  decoder 𝜓에 대해 아래의 수식과 같을때,

은닉층에 해당하는 code는 아래와 같이 나타낼 수 있다.
h = ɸ1 (W1x + b1). 
(이때, ɸ는 은닉층의 활성함수를 의미, W와 b는 random하게 초기화, 역전파법으로 학습됨)

은닉층에 해당하는 codedecoding하는 과정은 아래와 같이 나타낼 수 있다.
𝜒' = ɸ2 (W2x + b2). 

이후 auto-encoder는 입력 데이터 벡터 𝜒와 출력층으로 복원된 data벡터𝜒'간의 복원 에러를 줄이는 방향으로 학습한다.


=  || x -  ɸ2 (W2(ɸ1(W1x + b1)) + b2) || ^2



🤫  Auto-Encoder의 효과



🤫  Auto-Encoder  vs. GAN

GAN: original과 상관없는 결과물을 생성
Auto-Encoder:
original의 특징을 잘 살린 결과물을 생성

 

 

 

 

 

 

 

 

 

 

 

 

🧐  GAN (Generative Adversarial Networks

🤫 GAN이란?
초기 딥러닝: Drop-out과 BackPropagation을 기반으로 판별모델(discriminative model)을 사용
이는 데이터 판별에서 좋은 성능을 발휘했는데, 대표적으로 classification, regression이 있다.
반면, 생성모델(generative model)의 경우, 복잡한 확률계산으로 어려움을 겪었다.

GAN(Generative Adversial Network)판별모델생성모델, 두 신경망의 경쟁(adversial)을 통해 학습시키는 신경망이다.
판별모델의 목적: 주어진 데이터가 original인지 생성모델이 만든 가짜인지 구분하는 것
생성모델의 목적: 판별모델이 구분할 수 없도록 진짜같은 가짜 데이터를 생성하는 것
이런 GAN판별모델이 진짜와 가짜의 구분이 불가할 때까지 발전하는데, 아래와 같다.

1. 가짜 데이터는 판별모델의 학습단계에서 target data 0을 라벨링판별모델의 학습대상이 된다.
2. 생성모델의 학습단계에서 가짜데이터의 target data를 1로 설정, 가짜를 진짜로 판별하는 확률을 구한다.
이때, 경쟁의 대상이 되는 진짜는 판별모델의 학습단계에서 target data를 1로 받아 판별모델을 거친다.




🤫  Auto-Encoder  vs. GAN

GAN: original과 상관없는 결과물을 생성
Auto-Encoder: original의 특징을 잘 살린 결과물을 생성

 

 

🧐  GAN   Algorithm 

1. 랜덤 데이터 분포 Pz로부터 랜덤데이터 z를 추출.

2. 1에서 추출한 random data를 생성모델에 넣고 생성모델을 통해 가짜를 생성.


3. 2에서 얻은 가짜중 m개를 추출해 미니 배치 {z1, . . . , zm}으로 설정.

4. 진짜데이터인 train dataset 분포 Pdata(x)에서 m개를 추출, 미니 배치 {x1, . . . , xm}으로 설정.

5. 아래와 같은 gradient를 이용, 판별모델을 update.
판별모델은 가치함수(value function)를 최소화하는 것이 아닌 최대화 하는 것이 목적.
따라서 아래와 같은 gradient ascent방법을 사용한다.

이전의 gradient descent는 gradient에 (-)부호를 붙이지만
gradient ascent는 gradient에 (+)부호를 붙인다.


6. 1~5의 과정을 k번 반복 (k는 판별기 학습단계로 사용자가 직접 설정 가능)

7. 랜덤 데이터 분포 Pz로부터 random data z를 추출

8. 7에서 추출한 random data를 생성모델에 넣고 가짜data 생성

9. 8에서 얻은 가짜 중 m개를 추출, 미니 배치 {z1, . . . , zm}으로 설정.

10. 아래와 같은 gradient를 이용해 생성기를 update.
생성모델은 가치함수(value function)를 최소화하는 것이 목적.
따라서 아래와 같은 gradient descent방법을 사용한다.

11.  1~10단계를 반복 

 

🧐   RNN 실습 

 <영화 리뷰 감성 분석 model> 

 

 

 

 

 

 

 

 

 

 

🧐  RNN (Recurrent Neural Network

🤫 RNN, 순환 신경망이란?
RNN은 특정시점 데이터를 한번에 수집하는 방법들과 다르게 sequence data(시간의 흐름에 따라 값이 달라지는 데이터)를 사용한다.
또한 지금까지 다룬 신경망은 feed forward 신경망 즉, 한번 출력된 결과를 다시 사용하지 않았지만
RNN의 경우, 출력결과를 다음시점까지 기억했다가 다음 시점에서 사용하는 방법이다.

가장 일반적인 AI딥 러닝을 사용한 시계열 작업에 대한 접근 방식은 순환 신경망(RNN)인데, RNN을 사용하는 이유는 시간에 대한 해결의 일반화에 있다. 시퀀스는 (대부분) 길이가 다르기 때문에 MLP 같은 고전적인 딥러닝 구조는 수정하지 않고는 적용할 수 없고 MLP의 가중치 수는 absolutely huge하다. 따라서 전체 구조에서 가중치가 공유되는 RNN을 일반적으로 사용한다. (in sequential data)



activation function이 tanh일 때, 아래와 같은 과정으로 수식이 진행된다.
다만 은닉층에서 편향 벡터(bias vector)가 있다면 이전처럼 더해주면 된다.


🤫 RNN의 종류



🤫 시간을 통한 Backpropagation

single time step일 때, 아래와 같은 단계로 진행된다.
input이 hidden layer를 거쳐 output에 도착하는데, 이때 실제와 예측의 차이계산을 위해 Loss함수가 계산된다.
전체 Loss가 계산되면 forward propagation이 완료되며 그 다음부터 도함수를 이용해 역전파를 진행한다.

 

🧐  LSTM (Long Short Term Memory

🤫 LSTM 의 등장배경: RNN의 Gradient 소실, 폭주 문제
RNN은 은닉층을 거친 결과값을 재사용하기에 그로 인해 gradient 소실 및 폭주 문제가 발생할 수 있다.


📌 Exploding Gradient Problem 
- 구간이 기하급수적으로 빠르게 무한대로 이동하고 불안정한 프로세스로 해당값이 NaN이 된다.

📌 Vanishing Gradient Problem 
- 구간이 기하급수적으로 빠르게 0이 되어 장기간 학습이 어려워 진다.
- 이에 대한 해결을 위해 다양한 방식의 접근이 시도되었는데, 다음과 같다.
 ∙ ReLU 활성화 함수 사용
 ∙ Forget Gate를 이용한 LSTM 구조
 ∙ weight matrix W를 orthogonal matrix로 초기화, 전체 training에 사용 (orthogonal은 explode되거나 vanish되지 않음)





🤫 LSTM이란? 

아래구조처럼 입력 게이트(input gate), 삭제 게이트(forget gate), cell state, hidden unit으로 나눌 수 있다.




 

 

🧐  GRU (Gated  Recurrent  Unit

🤫 GRU
GRU는 LSTM과 비슷한 원리로 작동하지만 조금 더 간소화된 방식으로 계산이 간편하다는 장점이 있다.
하지만 LSTM보다 학습능력이 다소 낮은면을 보인다.

LSTM과 다르게 GRU는 이전 시점에서 받는 벡터가 h하나이다.
또한 벡터 z가 입력과 삭제게이트를 모두 제어한다.
GRU에는 출력게이트가 없는데, 즉 전체 상태 벡터가 매 시점 출력된다는 뜻이다.



 

 

🧐   CNN 실습 

 <손글씨 인식 model> 

 

 

 

 

 

cf. print(model.evaluate(X_train, y_train))를 쳐보면 다음과 같은 출력이 나온다.

1875/1875 [==============================] - 2s 1ms/step - loss: 1.0363e-06 - accuracy: 1.0000
[1.0362750799686182e-06, 1.0]

즉, model.evaluate(X_train, y_train)[0]은 loss, model.evaluate(X_train, y_train)[1]은 정확도인 것을 알 수 있다.

 

 

 

 

🧐 CNN (Convolution Neural Network

🤫 CNN, 합성곱 신경망이란?
여러 분야, 특히나 image classification에서 좋은 성능을 보여주는 방법이다.
이런 합성곱 신경망에서 합성곱의 연산은 정의 자체에 가중치를 flip하는 연산이기에 아래와 같은 수식으로 표현한다.
i와 j시점에서 input x와 kernel(= weight)의 합성곱에 편향(bias)를 각 pixel에 더해 output y를 도출한다.
이때, 아래와 같은 연산식을 Cross-Correlation이라 부른다.

 

🤫 CNN이 등장하게 된 이유는 무엇일까?    MLP  vs   CNN 

▶ image classification에서 MLP보다 CNN이 더 선호된다.

1. 
MLP는 각 input(한 image의 pixel)에 대해 하나의 퍼셉트론만 사용하고 large한 image에 대해 weight가 급격하게 unmanageable해진다. 이는 너무 많은 parameter들이 fully-connected 되어 있기 때문이다. 따라서 일반화를 위한 능력을 잃는, 과적합(overfitting)이 발생할 수 있다.

2. MLP는 input image와 shift된 image가 다르게 반응한다는 점이다. (translation invariant(불변)가 아니기 때문)

예를 들어 고양이 사진이 한 사진의 이미지 왼쪽 상단에 나타나고 다른 사진의 오른쪽 하단에 나타나면 MLP는 자체 수정을 시도하고 고양이가 이미지의 이 섹션에 항상 나타날 것이다.

즉, MLP는 이미지 처리에 사용하기에 가장 좋은 아이디어가 아니다. 
주요 문제 중 하나는 이미지가 MLP로 flatten(matrix -> vector)될 때 공간 정보가 손실된다.

고양이가 어디에 나타나든 사진에서 고양이를 볼 수 있도록
image features(pixel)의 공간적 상관 관계(spatial correlation)를 활용할 방법이 필요.

∴ 이를 위한 해결책으로 등장한 것이 바로 CNN 이다!

좀 더 일반적으로, CNN은 공간적 상관관계가 있는 data에 잘 반응할 수 있다.
따라서 CNN은 input으로 image data를 포함하는 문제에 대한 prediction의 한 방법이다.

이런 CNN의 사용은 2차원 이상의 image의 내부적 표현에 대한 좋은 이점을 갖는다.
즉, image작업 시, 가변적인 구조의 data안에서의 position과 scale을 model이 배우기 쉽게 해준다.

 

 

 

 

🧐  Padding, Stride, Pooling 

🤫 Padding
예를들어 4x4차원이 input에 2x2의 kernel로 합성곱을 하게되면 output 차원은 3x3으로 차원이 줄어든다.
이렇게 차원이 줄어드는 현상을 방지하기 위해서 padding이라는 방법을 사용한다.
위 사진처럼 입력 데이터는 3x3이지만 zero-padding을 통해 차원의 축소가 일어나지 않게 할 수 있다.
🤫 Stride
한 번의 합성곱연산 이후 다음 계산영역으로 이동을 해야하는데, 이때 얼마나 이동할 것인지 간격을 정하는 값이며 이때
 output 데이터 행렬의 차원이 더 작아지는 것을 알 수 있다.

그렇다면, padding과 stride를 해도 output data의 크기를 미리 계산할 수는 없을까?
🤫 Pooling
CNN에서 feature의 resolution을 줄일 때, 사용하는 방식으로 아래와 같이 작동한다.


그렇다면, 이쯤에서 드는 생각이 있을 것이다.
Question?
왜 굳이? pooling을 사용하는거지? 
그냥 convolution layer를 stride = 2로 줄여서 작동하면 같은작업이지 않나?

Answer!

  • convolution layer를 이용하여 stride = 2로 줄이면 학습 가능한 파라미터가 추가되므로 학습 가능한 방식으로 resolution을 줄이게 되나 그만큼 파라미터의 증가 및 연산량이 증가하게 됩니다.
  • 반면 pooling을 이용하여 resolution을 줄이게 되면 학습과 무관해지며 학습할 파라미터 없이 정해진 방식 (max, average)으로 resolution을 줄이게 되어 연산 및 학습량은 줄어든다.
    다만
     convolution with stride 방식보다 성능이 좋지 못하다고 알려져 있습니다.
    따라서, layer를 줄여서 gradient 전파에 초점을 두려고 할 때 pooling을 사용하는게 도움이

 

 

 

 

 

 

🧐 고차원 데이터의 CNN 

🤫 width,  height,  channel

사실 하나의 픽셀은 2차원이 아닌, 3차원으로 이루어져 있다. (참고: https://chan4im.tistory.com/74 )


입력 데이터가 고차원이 됨에 따라 kernel도 채널 수만큼 필요하게 되는 것이다.
고차원 데이터의 합성곱 연산은 동일한 channel의 입력데이터와 kernel의 합성곱연산 후 연산 결과값 행렬을 모두 더한 값을 의미한다.

이때, kernel을 여러개 쓸수록 output의 채널 수가 kernel 수만큼 많아지는 것을 알 수 있다.


또한 차원이 커질수록 for문의 과다사용으로 인한 과부하의 우려로 인해 다음과 같이 고차원을 2차원 평면으로 변형해 표현한다.

 

 

🧐   classification 실습 

 

 

+ Recent posts