지금은마라톤중

멋사 AI스쿨 TIL - (29) 본문

멋쟁이사자처럼/Python

멋사 AI스쿨 TIL - (29)

달리는중 2023. 4. 18. 22:36

2023.04.10

머신러닝수업이 어느정도 진행되었고 오늘부터는 딥러닝에 대해 배운다.


 

 

딥러닝

=> 비정형(이미지, 영상, 텍스트, 음성)데이터에 대한 피처를 추출할 때 알고리즘 내부에서 추출합니다.
 
 
1) 기본 네트워크에 대한 동작 방식을 배웁니다.
2) 심층신경망(DNN), Fully Connected Network, Densely Connected Network
3) 합성곱신경망(CNN) => 이미지, 텍스트 다 사용가능하지만 주로 이미지 분류에 사용합니다.
4) 순환신경망(RNN) => 순서가 있는 데이터, 시계열데이터, 자연어처리 등에 주로 사용합니다.
 

● CNN과 RNN

CNN(Convolutional Neural Network)는 합성곱신경망으로도 불립니다. 주로 시각적 이미지를 분석하는 데 사용되는데 머신러닝의 한 유형인 딥러닝에서 가장 많이 사용되고 있는 알고리즘입니다.

RNN이란 Recurrent Neural Network의 약자로, 순환 신경망을 뜻합니다. 입력과 출력을 시퀀스 단위로 처리하는 시퀀스(Sequence) 모델입니다.

 

 

Fully Connected Layer

심층 신경망 : Fully Connected Network, Densely Connected Network

- 엄청난 수의 연결과 네트워크 매개변수를 필요로 하는 완전 연결 계층

- "완전히 연결 되었다"라는 뜻으로 한층의 모든 뉴런이 다음층이 모든 뉴런과 연결된 상태

 

* XOR 연산 문제 -> 깊게 쌓는 방식으로 해결

 

 

* 선형 회귀로 풀리지 않는 문제들을 비선형이 되도록 구현된 층이 딥러닝

 

 

네트워크가 촘촘하게 연결되어 있다면 어떤 문제가 있을 수 있을까요?

과적합 문제가 생길 수 있다.

-> 그래서 dropout 과정을 가진다.

 

 

Loss function

모델이 얼마나 잘 예측했는지에 대한 실제값과 예측값을 계산해서 loss 손실 값을 봅니다.

회귀 => Square Loss

분류 => Cross Entropy Loss

 

 

질문🙋🏻‍♂️ : 회귀 모델에서 loss 측정 시 Absolute Error 는 잘 사용하지 않습니다. 주로 Square loss 를 사용합니다. 왜 그럴까요?
(chat GPT 답변)
절대 오차(Absolute Error)는 회귀 모델에서 예측값과 실제값 사이의 차이를 측정하는 대표적인 지표 중 하나입니다. 이러한 지표는 회귀 모델의 성능을 평가하는 데에 자주 사용됩니다.
하지만 주로 회귀 모델에서는 MSE(Mean Squared Error)나 RMSE(Root Mean Squared Error)와 같은 제곱 오차(Square Loss) 지표를 사용합니다. 이는 오차의 크기를 더 크게 패널티를 주고, 이상치(outlier)에 민감하지 않기 때문입니다.


초기화된 가중치는 입력이 반복됨에 따라 더욱 적합한 값을 가질 수 있도록 첫 예측값 Y와 진짜 타깃 Y의 오차를 최소화해야 한다. 이를 위해 손실함수(Loss Function)로 그 오차를 구하고, 이러한 오차를 줄이기 위해 최적화함수(Optimizer Function)를 사용하여 가중치를 최적화할 수 있도록 적절하게 조절하고 이 값을 토대로 다음 계층의 입력값을 활성화함수(Activation Function)로 계산하여 다음 입력으로 사용한다. 이를 반복하면 딥러닝의 신경망 모델을 최적화시키게 되는 것이다.

 

 

● 활성화 함수

활성화함수(Activation Function)는 인공신경망 내부에서 입력받은 데이터를 근거로 다음 계층으로 출력할 값을 결정하는 기능을 수행한다. 활성화함수는 신경망을 구성할 때 설정하며 각각의 레이어를 정의할 때 세부적인 함수를 선택하게 된다.

relu, sigmoid

 

● 기울기 소실

가중치를 업데이트하는 과정에서 뒤로 갈수록 가중치가 잘 업데이트 되지 않는 현상

신경망의 활성함수의 도함수 값이 계속 곱해지다 보면 가중치에 따른 결과값의 기울기가 0이 되어 버려서, 경사 하강법을 이용할 수 없게 되는 문제이다

 

● 비선형 활성화 함수 (Activation functions)

- 입력 신호와 가중치를 곱하고 총합을 출력 신호로 변환하는 비선형함수

 

 

● 손실함수

모델이 얼마나 잘 예측했는지에 대한 실제값과 예측값을 계산해서 loss 손실 값을 봅니다.

회귀 => Square Loss 

분류 => Cross Entropy Loss

손실함수 : 예측한 값과 실제 정답의 차이를 비교함으로써 모델의 정확도를 측정. 손실함수로 인해 모델의 성능이 달라질 수 있고, 이러한 이유로 머신러닝 모델을 구현하는 사람들은 어떠한 손실함수가 최적일지 고민하게 된다.

옵티마이저(최적화) : 가중치를 업데이트하는 알고리즘

메트릭 : 어떤 평가지표로 평가할지

 

 

질문🙋🏻‍♂️ : 절대값으로 loss 를 사용하면 어떤 문제가 있을 까요?
미분을 할 수 없을 것 같습니다

 

 

● 레이어를 어떻게 쌓느냐가 하이퍼 파라미터 설정하는 것!

flatten : 신경망에 주입하기 위해 1차원 형태로 만들어주기

 

 

● DNN => 신경망에 주입하기 위해 1차원 형태로 변형이 필요합니다.

=> 이미지를 그대로 넣어줄 수 있게 만든게 CNN 합성곱신경망 입니다.

합성곱 신경망에서도 특징을 추출하고 Fully Connected Network 에 넣어주게 됩니다.

 

 

질문🙋🏻‍♂️ : 보통 은닉층이 많을수록, 한 층의 노드개수가 많을수록 과적합될 확률이 높나요?


머신러닝에서 배웠던 하이퍼파라미터처럼 적절하게 만들어 주는게 좋습니다. 보통은 레이어가 많고 노드가 많으면 더 잘 학습할 수 있지만 너무 많으면 과적합이 되기 때문에 적절한 값을 찾는 게 필요합니다
과적합 상태는 문제의 복잡성에 비해 숨겨진 레이어의 수가 매우 많아져 네트워크의 과훈련 과정이 시작되고 네트워크의 시간 복잡성에 나쁜 영향을 미칠 때 발생합니다. 주로 네트워크가 데이터와 너무 밀접하게 일치하여 테스트할 데이터에 대한 일반화 능력을 잃게 됩니다

 

 

● 노드, 유닛: 각 층(레이어)를 구성하는 요소

레이어 수, 유닛 수 -> 하이퍼 파라미터 예측하는 값에 따라 적절한 loss값을 설정

 

 

● multiclass 분류의 loss

ordinal 형태 => sparse_categorical_crossentropy

onehot 형태 => categorical_crossentropy

binary 형태 => binary_crossentropy

 

 

Tip❗️

TF.keras API => sckit-learn 과 유사

PyTorch => numpy 와 유사

 

 

 

● Sigmoid

-> 이진 분류

-활성화 함수에도 있는데 sigmoid가 있는데 잘 사용하지 않음!

-확률값으로 나오게 하는 predictproba

- 입력 데이터를 0과 1 사이의 값으로 출력하는 미분가능한 연속성을 가진 함수

- Gradient Vanishing 현상이 발생할 우려가 크다.

 

● Softmax

-딥러닝 모델의 입력층, 출력층, 활성화 함수, 옵티마이저, loss, 평가지표 구성하기

- 다중 분류 예제에서 주로 사용하는 함수

- 분류할 클래스 개수만큼 차원 벡터를 입력받아 각 클래스에 속할 확률값을 Output으로 출력한다.

- 입력값을 0~1 사이의 값으로 모두 정규화하고, 출력 값 총합계가 1이 되도록 하는 함수

 

 

질문🙋🏻‍♂️ : 기본 이미지 분류 초보자 문서를 보고 다른 데이터에 적용해 보고자 했을 때 어떤 점이 어려울까요?
1) 데이터가 예시와 다르다. 
2) 네트워크를 똑같이 구성했는데 입력층부터 오류가 발생한다. 
3) 출력 층을 어떻게 구성해야 할지 모르겠다.
4) loss, metric 지정이 어렵다. 
5) relu, sigmoid, softmax, adam 등의 용어를 이해하고 어디에 쓰는지 알아둔다!

 

● 최적의 가중치가 계속 업데이트될 때마다 어디에서 최적의 성능을 뽑아내는지를 찾는 과정

 

모델은 학습을 하며 loss를 줄여가는 방향으로 최적의 하이퍼 파라미터를 찾는다. accuracy는 점점 높아지고 loss는 점점 줄어들게 된다!

 

*np.argmax() : 최대값의 위치값(인덱스)를 반환

 

● 용어 정리

옵티마이저(Optimizer) - 데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정

평가 지표(Metrics) - 훈련 단계와 테스트 단계를 모니터링하기 위해 평가지표 지정

손실 함수(Loss function) - 훈련 하는 동안 모델의 오차를 측정하며 모델의 학습이 올바른 방향으로 향하도록 최소화

 

 

● 손실 함수(Loss function)

- 회귀 : MSE, MAE 등등 ..

- 분류 :

  - 이진 분류 : binary_crossentropy

  - 다중 분류 :

    - one-hot 형태 일 경우: [0, 1, 0, 0] :

  categorical_crossentropy

    - 정답값이 0, 1, 2, 3, 4 와 같은 ordinal한 형태일 때 : sparse_categorical_crossentropy

 

● TensorFlow의 callback

: 모델 학습 도중 모델의 상태를 모니터링하고, 특정 이벤트가 발생할 때 적절한 동작을 수행하도록 하는 함수

- tf.keras.callbacks.Callback 1

. 모델 학습 과정에서 손실 함수나 정확도 등의 지표를 확인하여 모델이 잘 학습되고 있는지 판단

2. 모델 학습 도중 일정 주기마다 모델의 상태를 저장

3. 학습률을 동적으로 조절

 

질문🙋🏻‍♂️ : loss, accuracy와 val_loss, val_accuracy의 차이가 정확히 무엇인가요?
validation_split=0.2, 80% 는 train, 20%는 validation 으로 사용합니다.

 

 

질문🙋🏻‍♂️ : 각 데이터들이 입력층에서 히든 레이어의 노드로 가게 되는 기준이 어떻게 되나요? 
각 입력층별로 가장 값이 유사한 애들끼리 동일한 하나의 노드로 가게 되나요..?
(chat GPT 답변)
각 데이터가 입력층에서 히든 레이어의 노드로 가는 기준은 가중치(Weight)와 편향(Bias)입니다.
입력층의 노드와 히든 레이어의 노드 사이의 연결은 가중치로 표현됩니다. 각 입력 노드에서 출력 노드로 가는 연결마다 고유한 가중치가 존재합니다. 즉, 입력층의 노드가 히든 레이어의 노드로 어떻게 연결될지는 가중치 행렬에 의해 결정됩니다.
행렬의 각 행은 하나의 입력 노드에서 히든 레이어의 모든 노드로 가는 가중치를 나타내며, 행렬의 열은 히든 레이어의 각 노드로 들어오는 입력 노드의 가중치를 나타냅니다.
이러한 가중치 행렬은 학습 과정에서 업데이트되며, 최적화 알고리즘이 학습 데이터를 기반으로 가중치를 조정하여 모델이 예측하는 결과를 개선하도록 합니다.
히든 레이어의 각 노드는 입력층의 모든 노드로부터 가중치를 받아 가중합(weighted sum)을 계산하고, 이 값에 편향을 더한 뒤 활성화 함수에 적용합니다.
이러한 가중합과 편향은 학습 과정에서 역시 최적화 알고리즘에 의해 조정됩니다. 따라서, 입력층에서 히든 레이어의 노드로 가는 기준은 가중치와 편향에 의해 결정되며, 이들은 학습 과정에서 업데이트되어 최적화됩니다

 

 
질문🙋🏻‍♂️ : 그럼 각 입력층 별 node 갯수 만큼의 가중치 행렬이 존재하고, 해당 node 로 출력된 값이 오답일 경우 해당 node에 해당 되는 값의 가중치 값만 업데이트가 되나요..?
오답일 경우 해당 노드의 가중치만 업데이트 되는 것은 아니며, 손실 함수를 최소화하기 위한 전체 모델의 가중치가 함께 갱신된다고 답변을 받았습니다
가중치 업데이트는 역전파(Backpropagation) 알고리즘을 통해 이루어지며, 출력 값과 실제 값 사이의 오차를 통해 손실 함수의 기울기를 계산합니다. 이 기울기를 통해 모델의 모든 가중치가 업데이트 됩니다. 따라서, 모든 가중치는 손실 함수를 최소화하는 방향으로 함께 조정되며, 오답일 경우 해당 노드의 가중치만 업데이트 되는 것은 아닙니다.
 
 
 
 

 
 
 
학습 마무리 정리
 
● 하이퍼파라미터 조정의 목적:
층의 개수를 어떻게 가져갈 것인가 -> Unit의 개수를 어떻게 가져갈 것인가
 
 
● 순전파와 역전파
순전파 : 인공 신경망에서 입력층 -> 출력층 방향으로 예측값의 연산이 진행되는 과정
역전파 : 순전파와 반대로 출력층에서 입력층 방향으로 계산하면서 가중치를 업데이트 다층 퍼셉트론 학습에 사용되는 통계적 기법!
 
● 활성화 함수
인공 신경망에서 입력을 변환하는 함수 신경망에 비선형성(non-linearity)을 더해주어 데이터를 설명할 수 있게 해줌
Sigmoid, tanh, ReLU, Leaky ReLU 등
 
● 기울기 소실
깊은 인공신경망을 학습할 때 역전파 과정에서 입력층으로 갈수록 기울기가 점점 작아져 최적의 모델을 찾을 수 없게 되는 문제 기울기 소실 문제 완화를 위해 은닉층의 활성화 함수로 ReLU나 LeakyReLU를 사용한다.
 
● 딥러닝의 학습방법
출력값과 실제값을 비교하여 그 차이를 최소화하는 가중치와 편향의 조합 찾기
가중치는 오차를 최소화하는 방향으로 모델이 스스로 탐색(역전파)
-> 알맞은 손실함수를 선정해야 함! 알맞은 손실함수를 찾아 최소화하기 위해 경사하강법 고안
 
● 손실함수 : 예측값과 실제값의 차이. 손실함수의 함수값이 최소화되게 하는 가중치와 편향을 찾는 것이 목표
경사하강법 : 손실함수의 현재 위치에서 오차가 줄어드는 방향으로 가중치를 움직이며 최솟값을 찾음
옵티마이저(최적화 함수) : 최적화 방법을 결정해주는 방식으로, 경사하강법에 기반을 둠
 
● 분류의 손실함수
이항분류 : BinaryCrossentropy
다항분류 : CategoricalCrossentropy, CategoricalHinge, Hinge 등
회귀의 손실함수
CosineSimilarity, Huber, LogCosh, MAE, MAPE 등
 
● Optimizer
데이터와 손실함수를 기반으로 모델이 업데이트 되는 방식
경사하강법 : 손실함수의 현재 위치에서 조금씩 손실이 낮아지는 쪽으로 가중치를 움직이며 최솟값을 찾는 방법
최적화 함수 : 손실함수를 최소화하는 방향으로 가중치를 갱신하는 알고리즘
경사하강법에 기반을 둔 옵티마이저로 SGD, RMSProp, Adam등이 있음
 
● 모델 컴파일하기
model.compile(optimizer=‘Adam’, loss=‘categorical_crossentropy’, metrics=[‘accuracy’])
모델을 컴파일할 때 옵티마이저, 손실함수, 평가지표를 설정한다

 

 

 

 

 

'멋쟁이사자처럼 > Python' 카테고리의 다른 글

멋사 AI스쿨 TIL - (31)  (0) 2023.04.18
멋사 AI스쿨 TIL - (30)  (0) 2023.04.18
멋사 AI스쿨 TIL - (28)  (0) 2023.04.18
멋사 AI스쿨 TIL - (27)  (0) 2023.04.18
멋사 AI스쿨 TIL - (26)  (0) 2023.04.18
Comments