Skip to content
Home » 과적 합 해결 | 딥러닝 – 과적합 해결을 넓은 관점에서 보자 20622 명이 이 답변을 좋아했습니다

과적 합 해결 | 딥러닝 – 과적합 해결을 넓은 관점에서 보자 20622 명이 이 답변을 좋아했습니다

당신은 주제를 찾고 있습니까 “과적 합 해결 – 딥러닝 – 과적합 해결을 넓은 관점에서 보자“? 다음 카테고리의 웹사이트 hu.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: hu.taphoamini.com/photos. 바로 아래에서 답을 찾을 수 있습니다. 작성자 딥러닝호형 DL bro 이(가) 작성한 기사에는 조회수 839회 및 좋아요 31개 개의 좋아요가 있습니다.

이번에는 모델의 과적합을 막을 수 있는 여러가지 방법에 대해서 논의합니다.

05) 과적합(Overfitting)을 막는 방법들
  1. 1. 데이터의 양을 늘리기 …
  2. 모델의 복잡도 줄이기 …
  3. 가중치 규제(Regularization) 적용하기 …
  4. 드롭아웃(Dropout)

Table of Contents

과적 합 해결 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 딥러닝 – 과적합 해결을 넓은 관점에서 보자 – 과적 합 해결 주제에 대한 세부정보를 참조하세요

🏆 최신 기술 딥러닝 강의 들으러 가기!!
https://www.inflearn.com/course/딥러닝-비전트랜스포머?inst=66bcff38
🏆 실전 인공지능으로 이어지는 파이토치 딥러닝 강의 들으러 가기!!
https://www.inflearn.com/course/파이토치-딥러닝?inst=0d0cebb7
🏆 실전 인공지능으로 이어지는 딥러닝 개념 잡기 강의 들으러 가기!!
👉 https://www.inflearn.com/course/딥러닝-개념?inst=fafa258e
🏆 머신러닝/딥러닝으로 이어지는 선형대수 강의 들으러 가기!!
https://www.inflearn.com/course/딥러닝-선형대수?inst=95fcac2b
🏆 딥러닝 구현 필독 도서 \”딥러닝을 위한 파이토치 입문\” 구매하기
교보문고: https://bit.ly/3351kvV
예스24: https://bit.ly/3n2gXeG
알라딘: https://bit.ly/3eOlcW
비지니스, 유튜브 문의: [email protected]
Instagram: deeplearningbro
#머신러닝#딥러닝#인공지능

과적 합 해결 주제에 대한 자세한 내용은 여기를 참조하세요.

기계학습 : 과적합을 방지하는 방법 6가지

과적합이라는 단어는 교육 데이터를 너무 잘 모형화하는 모형을 나타냅니다. 이 모형은 데이터의 일반 분포를 학습하는 대신 모든 데이터 점에 대해 기대 …

+ 자세한 내용은 여기를 클릭하십시오

Source: iotnbigdata.tistory.com

Date Published: 8/16/2022

View: 7938

딥러닝의 고질병, Overfitting(과적합) 해결 팁! – velog

그래서 과적합을 어떻게 해결하느냐. 물론! 가장 좋은 방법은 train data의 양을 늘리는 것! 그러나 우리가 데이터를 늘리고 싶다해서 늘릴 수 있는게 …

+ 여기에 자세히 보기

Source: velog.io

Date Published: 5/1/2021

View: 6699

[Deep Learning] 과적합(Overfitting) 해결 | DevOps Syndrome

1) 과적합의 원인 · 2) DNN에서 과적합을 해결하는 방법. (1) 더 많은 Train Data; (2) Model Capacity; (3) L2 Regularization; (4) Dropout; (5) Batch …

+ 자세한 내용은 여기를 클릭하십시오

Source: gilbertlim.github.io

Date Published: 3/30/2022

View: 4874

Overfitting을 해결하는 방법 3가지 – Fennec

머신러닝은 학습 데이터로부터 배우고 테스트 데이터에 대해서 예측하는 것을 목표로 합니다. Overfitting은 학습 데이터의 성능은 높지만, …

+ 여기에 표시

Source: jrc-park.tistory.com

Date Published: 11/16/2022

View: 9522

인공 신경망의 성능 개선 – 과적합(Overfitting) – MINI

과적합 해결. 학습 데이터를 많이 확보. 학습 데이터 생성에는 돈과 시간이 많이 들어가기 때문에 학습 데이터를 많이 만드는데 어려움이 있을 수 …

+ 더 읽기

Source: minimi22.tistory.com

Date Published: 7/30/2022

View: 7507

과적합(Overfitting)과 규제(Regularization) – 쑥쑥 크는 조이

과적합(Overfitting)이란 모델이 train 데이터에 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태를 말한다.

+ 여기에 보기

Source: nanunzoey.tistory.com

Date Published: 11/4/2021

View: 9880

딥러닝 과적합 문제 해결하기(feat 광석 판별하기)

과적합(Overfitting)이란? 과적합은 특정 모델이 학습 데이터셋 안에서는 일정 수준 이상의 예측 정확도를 보이지만, 새로운 데이터를 적용 하면 …

+ 자세한 내용은 여기를 클릭하십시오

Source: incomeplus.tistory.com

Date Published: 8/15/2022

View: 5253

캐글 딥러닝 강좌 정리 3 – 과적합(Overfitting)과 해결 방법 …

캐글의 딥러닝 튜토리얼을 바탕으로 정리한 문서입니다. 개인적으로 추가한 내용이 있어서 원문 내용에 차이가 있습니다. Intro to Deep Learning …

+ 여기에 더 보기

Source: webnautes.tistory.com

Date Published: 5/29/2021

View: 8056

[딥러닝 기본] Deep Learning 과적합 해결 – 욱이의 냉철한 공부

자료는 대부분 Andrew 교수님의 Coursera 수업자료입니다. * 목차. 1. 과적합(Overfit) 해결 : Regulation(규제화). 2. 과적합 …

+ 여기에 더 보기

Source: warm-uk.tistory.com

Date Published: 1/12/2022

View: 9642

주제와 관련된 이미지 과적 합 해결

주제와 관련된 더 많은 사진을 참조하십시오 딥러닝 – 과적합 해결을 넓은 관점에서 보자. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

딥러닝 - 과적합 해결을 넓은 관점에서 보자
딥러닝 – 과적합 해결을 넓은 관점에서 보자

주제에 대한 기사 평가 과적 합 해결

  • Author: 딥러닝호형 DL bro
  • Views: 조회수 839회
  • Likes: 좋아요 31개
  • Date Published: 2020. 8. 21.
  • Video Url link: https://www.youtube.com/watch?v=cAfILI8VflU

05) 과적합(Overfitting)을 막는 방법들

학습 데이터에 모델이 과적합되는 현상은 모델의 성능을 떨어트리는 주요 이슈입니다. 모델이 과적합되면 훈련 데이터에 대한 정확도는 높을지라도, 새로운 데이터. 즉, 검증 데이터나 테스트 데이터에 대해서는 제대로 동작하지 않습니다. 이는 모델이 학습 데이터를 불필요할정도로 과하게 암기하여 훈련 데이터에 포함된 노이즈까지 학습한 상태라고 해석할 수 있습니다. 이번에는 모델의 과적합을 막을 수 있는 여러가지 방법에 대해서 논의합니다.

특히 이 책은 딥 러닝을 다루고 있으므로, 인공 신경망의 과적합을 막는 방법에 초점을 둡니다.

1. 데이터의 양을 늘리기

모델은 데이터의 양이 적을 경우, 해당 데이터의 특정 패턴이나 노이즈까지 쉽게 암기하기 되므로 과적합 현상이 발생할 확률이 늘어납니다. 그렇기 때문에 데이터의 양을 늘릴 수록 모델은 데이터의 일반적인 패턴을 학습하여 과적합을 방지할 수 있습니다.

만약, 데이터의 양이 적을 경우에는 의도적으로 기존의 데이터를 조금씩 변형하고 추가하여 데이터의 양을 늘리기도 하는데 이를 데이터 증식 또는 증강(Data Augmentation)이라고 합니다. 이미지의 경우에는 데이터 증식이 많이 사용되는데 이미지를 돌리거나 노이즈를 추가하고, 일부분을 수정하는 등으로 데이터를 증식시킵니다. 텍스트 데이터의 경우에는 데이터를 증강하는 방법으로 번역 후 재번역을 통해 새로운 데이터를 만들어내는 역번역(Back Translation) 등의 방법이 있습니다.

2. 모델의 복잡도 줄이기

인공 신경망의 복잡도는 은닉층(hidden layer)의 수나 매개변수의 수 등으로 결정됩니다. 과적합 현상이 포착되었을 때, 인공 신경망 모델에 대해서 할 수 있는 한 가지 조치는 인공 신경망의 복잡도를 줄이는 것 입니다.

인공 신경망에서는 모델에 있는 매개변수들의 수를 모델의 수용력(capacity)이라고 하기도 합니다.

3. 가중치 규제(Regularization) 적용하기

복잡한 모델이 간단한 모델보다 과적합될 가능성이 높습니다. 그리고 간단한 모델은 적은 수의 매개변수를 가진 모델을 말합니다. 복잡한 모델을 좀 더 간단하게 하는 방법으로 가중치 규제(Regularization)가 있습니다.

L1 규제 : 가중치 w들의 절대값 합계를 비용 함수에 추가합니다. L1 노름이라고도 합니다.

L2 규제 : 모든 가중치 w들의 제곱합을 비용 함수에 추가합니다. L2 노름이라고도 합니다.

L1 규제는 기존의 비용 함수에 모든 가중치에 대해서 $\lambda \mid w \mid$를 더 한 값을 비용 함수로 하고, L2 규제는 기존의 비용 함수에 모든 가중치에 대해서 $\frac{1}{2} \lambda w^2$를 더 한 값을 비용 함수로 합니다. $\lambda$는 규제의 강도를 정하는 하이퍼파라미터입니다. $\lambda$가 크다면 모델이 훈련 데이터에 대해서 적합한 매개 변수를 찾는 것보다 규제를 위해 추가된 항들을 작게 유지하는 것을 우선한다는 의미가 됩니다.

이 두 식 모두 비용 함수를 최소화하기 위해서는 가중치 w들의 값이 작아져야 한다는 특징이 있습니다. L1 규제로 예를 들어봅시다. L1 규제를 사용하면 비용 함수가 최소가 되게 하는 가중치와 편향을 찾는 동시에 가중치들의 절대값의 합도 최소가 되어야 합니다. 이렇게 되면, 가중치 w의 값들은 0 또는 0에 가까이 작아져야 하므로 어떤 특성들은 모델을 만들 때 거의 사용되지 않게 됩니다.

예를 들어 $H(X) = w_{1}x_{1} + w_{2}x_{2} + w_{3}x_{3} + w_{4}x_{4}$라는 수식이 있다고 해봅시다. 여기에 L1 규제를 사용하였더니, $w_{3}$의 값이 0이 되었다고 해봅시다. 이는 $x_{3}$ 특성은 사실 모델의 결과에 별 영향을 주지 못하는 특성임을 의미합니다.

L2 규제는 L1 규제와는 달리 가중치들의 제곱을 최소화하므로 w의 값이 완전히 0이 되기보다는 0에 가까워지기는 경향을 띕니다. L1 규제는 어떤 특성들이 모델에 영향을 주고 있는지를 정확히 판단하고자 할 때 유용합니다. 만약, 이런 판단이 필요없다면 경험적으로는 L2 규제가 더 잘 동작하므로 L2 규제를 더 권장합니다. 인공 신경망에서 L2 규제는 가중치 감쇠(weight decay)라고도 부릅니다.

책에 따라서는 Regularization를 정규화로 번역하기도 하지만, 이는 정규화(Normalization)와 혼동될 수 있으므로 규제 또는 정형화라는 번역이 바람직한 것 같습니다.

인공 신경망에서 정규화(Normalization)라는 용어가 쓰이는 기법으로는 또 배치 정규화, 층 정규화 등이 있습니다.

4. 드롭아웃(Dropout)

드롭아웃은 학습 과정에서 신경망의 일부를 사용하지 않는 방법입니다.

위의 그림은 드롭아웃 전과 후의 신경망을 비교하고 있습니다. 예를 들어 드롭아웃의 비율을 0.5로 한다면 학습 과정마다 랜덤으로 절반의 뉴런을 사용하지 않고, 절반의 뉴런만을 사용합니다.

드롭아웃은 신경망 학습 시에만 사용하고, 예측 시에는 사용하지 않는 것이 일반적입니다. 학습 시에 인공 신경망이 특정 뉴런 또는 특정 조합에 너무 의존적이게 되는 것을 방지해주고, 매번 랜덤 선택으로 뉴런들을 사용하지 않으므로 서로 다른 신경망들을 앙상블하여 사용하는 것 같은 효과를 내어 과적합을 방지합니다.

케라스에서는 다음과 같은 방법으로 드롭아웃을 모델에 추가할 수 있습니다.

from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dropout, Dense max_words = 10000 num_classes = 46 model = Sequential() model.add(Dense(256, input_shape=(max_words,), activation=’relu’)) model.add(Dropout(0.5)) # 드롭아웃 추가. 비율은 50% model.add(Dense(128, activation=’relu’)) model.add(Dropout(0.5)) # 드롭아웃 추가. 비율은 50% model.add(Dense(num_classes, activation=’softmax’))

http://blog.naver.com/angryking/221330145300

기계학습 : 과적합을 방지하는 방법 6가지

728×90

반응형

서론

오버핏은 기계 학습의 가장 좌절스러운 문제일 수 있습니다. 이 기사에서 우리는 그것이 무엇인지, 어떻게 그것을 발견하는지, 그리고 가장 중요한 것은 어떻게 그것이 일어나지 않도록 하는지 볼 것입니다.

무엇이 과적합인가?

과적합이라는 단어는 교육 데이터를 너무 잘 모형화하는 모형을 나타냅니다. 이 모형은 데이터의 일반 분포를 학습하는 대신 모든 데이터 점에 대해 기대되는 출력을 학습합니다.

이것은 공식을 아는 대신 수학 퀴즈에 대한 답을 암기하는 것과 같다. 이 때문에 모델을 일반화할 수 없습니다. 익숙한 지역에 있는 한 모든 것이 좋지만, 밖으로 나가자마자 길을 잃는다.

이 작은 녀석은 곱셈을 할 줄 모르는 것 같군요. 그는 자신이 이미 본 질문에 대한 대답만 기억한다.

어려운 점은 교육 데이터에 오류가 매우 작기 때문에 언뜻 보기엔 모형이 잘 작동하는 것처럼 보일 수 있다는 것입니다. 그러나 새 데이터 점을 예측하도록 요청하면 즉시 실패합니다.

과적합 감지 방법

위에서 설명한 것처럼 과적합은 모형을 일반화하지 못하는 것이 특징입니다. 이 기능을 테스트하기 위해 간단한 방법은 데이터 집합을 교육 세트와 테스트 세트 두 부분으로 나누는 것입니다. 모형을 선택할 때 데이터 집합을 세 개로 분할해야 할 수 있습니다. 여기서 이유를 설명합니다.

교육 세트는 사용 가능한 데이터의 약 80%를 나타내며, 모델을 교육하는 데 사용됩니다(그렇지 않습니까?).

테스트 세트는 데이터 집합의 나머지 20%로 구성되며, 이전에는 보지 못했던 데이터에 대한 모형의 정확도를 테스트하는 데 사용됩니다.

이러한 분할을 통해 각 세트의 모델 성능을 점검하여 교육 프로세스가 어떻게 진행되고 있는지 파악하고 교육 프로세스가 발생할 때 오버핏을 찾아낼 수 있습니다. 다음 표에서는 여러 가지 사례를 보여 줍니다.

Overfitting can be seen as the difference between the training and testing error.

참고: 이 기술이 작동하려면 두 부품이 모두 데이터를 대표하는지 확인해야 합니다. 분할하기 전에 데이터 집합의 순서를 섞는 것이 좋습니다.

과적합은 여러분의 희망을 잔인하게 짓밟기 직전에 올리기 때문에 상당히 실망스러울 수 있습니다. 다행히도, 이런 일이 일어나지 않도록 하기 위한 몇 가지 요령이 있다.

과적합을 방지하는 방법 – 모델 및 데이터

첫째, 솔루션을 찾기 위해 시스템의 구성 요소를 살펴볼 수 있습니다. 즉, 사용 중인 데이터나 모델을 변경할 수 있습니다.

추가 데이터 수집

모형은 너무 많은 정보만 저장할 수 있습니다. 즉, 더 많은 교육 데이터를 제공할수록 과적합 가능성이 적다는 의미입니다. 그 이유는 데이터를 추가하면 모형에서 모든 표본을 과대 적합시킬 수 없게 되고 모형을 일반화하여 진행해야 하기 때문입니다.

더 많은 데이터가 모델의 정확도를 높이는 동시에 과적합 가능성을 줄이기 때문에 더 많은 예제를 수집하는 것이 모든 데이터 과학 과제의 첫 번째 단계가 되어야 한다.

The more data you get, the less likely the model is to overfit.

데이터 확대 및 노이즈

더 많은 데이터를 수집하는 것은 지루하고 비용이 많이 드는 과정입니다. 이렇게 할 수 없는 경우 데이터가 더 다양한 것처럼 나타나도록 해야 합니다. 이렇게 하려면 표본이 모형에 의해 처리될 때마다 이전 시간과는 약간 달라지도록 데이터 확대 기술을 사용합니다. 이렇게 하면 각 표본에 대한 모수를 모형에서 학습하기가 더 어려워집니다.

Each iteration sees as different variation of the original sample.

또 다른 좋은 방법은 소음을 추가하는 것입니다.

입력 내용: 이는 데이터 증강과 동일한 목적을 제공하지만, 모델이 야생에서 직면할 수 있는 자연적 동요에 견실하게 만드는 데에도 도움이 될 것이다.

출력 대상: 다시 말하지만, 이것은 훈련을 더 다양화 시킬 것이다.

참고: 두 경우 모두 노이즈의 크기가 너무 크지 않은지 확인해야 합니다. 그렇지 않으면 각각 입력 정보를 노이즈에 넣거나 출력을 부정확하게 만들 수 있습니다. 둘 다 훈련 과정을 방해할 것이다.

모델 단순화

현재 보유한 모든 데이터에도 불구하고 모델이 교육 데이터 세트를 초과 달성할 수 있다면, 모델이 너무 강력할 수 있습니다. 그런 다음 모형의 복잡성을 줄일 수 있습니다.

앞에서 설명한 대로, 모형은 그 만큼의 데이터만 적합시킬 수 있습니다. 그 복잡성을 점진적으로 줄임으로써, 무작위 포리스트의 추정기 수, 신경 네트워크의 매개 변수 수 등. — 모델을 너무 단순하게 만들면 안 되지만 데이터로부터 배울 수 있을 만큼 충분히 복잡해집니다. 그러기 위해서는 모델 복잡성에 따라 두 데이터 세트의 오류를 보는 것이 편리합니다.

또한 모델을 더 가볍고, 더 빨리 훈련하고, 더 빨리 달릴 수 있다는 장점이 있습니다.

On the left, the model is too simple. On the right it overfits.

과적합을 방지하는 방법 – 교육 프로세스

두 번째 가능성으로 인해 교육 수행 방법이 변경될 수 있습니다. 여기에는 손실 함수 또는 훈련 중에 모델이 작동하는 방식을 변경하는 것도 포함됩니다.

조기 종료

대부분의 경우, 모형이 데이터의 올바른 분포를 학습하는 것으로 시작되고, 어느 시점에서 데이터가 과대 적합되기 시작합니다. 이러한 이동이 발생하는 순간을 식별하면 과적합이 발생하기 전에 학습 프로세스를 중지할 수 있습니다. 이전과 마찬가지로, 이는 시간 경과에 따른 교육 오류를 살펴봄으로써 이루어집니다.

When the testing error starts to increase, it’s time to stop!

과적합을 방지하는 방법 — 정규화

정규화는 과적합을 줄이기 위해 모델의 학습을 제약하는 과정이다. 그것은 많은 다른 형태를 취할 수 있고, 우리는 그것들 중 몇 가지를 볼 것이다.

L1 및 L2 정규화

정규화의 가장 강력하고 잘 알려진 기법 중 하나는 손실 함수에 페널티를 추가하는 것이다. 가장 일반적인 것은 L1 및 L2입니다.

L1 패널티는 가중치의 절대값을 최소화하는 것을 목표로 한다.

L2 패널티는 가중치의 제곱을 최소화하는 것을 목표로 한다.

이 벌칙으로, 모델은 더 이상 임의로 크기를 조정할 수 없기 때문에 중량을 절충해야 합니다. 따라서 모델이 보다 일반적이므로 과적합에 대처할 수 있습니다.

L1 패널티는 형상 선택을 강제한다는 이점이 추가되는데, 이는 덜 유용한 파라미터 0으로 설정하는 경향이 있다는 것을 의미한다. 이를 통해 데이터셋에서 가장 관련성이 높은 기능을 식별할 수 있습니다. 단점은 종종 L2 패널티만큼 계산 효율이 높지 않다는 것이다.

무게 행렬은 다음과 같습니다. L1 행렬이 많은 0으로 희박하고, L2 행렬이 약간 더 작은 가중치를 갖는 방법에 유의하십시오.

또 다른 가능성은 훈련 중 매개변수에 노이즈를 추가하여 일반화에 도움이 됩니다.

딥러닝: 중퇴 및 드롭커넥트

이 매우 효과적인 기술은 딥러닝에 특화되어 있는데, 이는 신경망이 한 계층에서 다음 계층으로 정보를 처리한다는 사실에 의존하기 때문이다. 이 아이디어는 훈련 중에 뉴런(드롭아웃) 또는 연결(드롭커넥트) 중 하나를 임의로 비활성화하는 것입니다.

이것은 네트워크가 더 이상 특정한 특징들을 추출하기 위해 특정 뉴런이나 연결에 의존할 수 없기 때문에 네트워크가 중복되게 만든다. 일단 훈련이 끝나면, 모든 뉴런과 연결이 복원됩니다. 이 기법은 일반화를 선호하는 앙상블 접근방식을 갖는 것과 어느 정도 동등하므로 과적합을 줄이는 것으로 나타났다.

결론

여러분도 알다시피, 데이터 과학자가 직면해야 하는 주요 문제 중 하나는 과적합입니다. 그것을 멈추는 방법을 모른다면 그것은 정말 고통스러울 수 있다. 이 기사에서 제시된 기술을 통해, 여러분은 이제 여러분의 모델이 학습 과정을 속이는 것을 막을 수 있고, 여러분이 받을 만한 결과를 얻을 수 있어야 합니다!

본 내용은 아래의 자료를 번역한 내용입니다.

https://hackernoon.com/memorizing-is-not-learning-6-tricks-to-prevent-overfitting-in-machine-learning-820b091dc42

Memorizing is not learning! — 6 tricks to prevent overfitting in machine learning. | Hacker Noon

Introduction Overfitting may be the most frustrating issue of Machine Learning. In this article, we’re going to see what it is , how to spot it , and most importantly how to prevent it from happening . What is overfitting? The word overfitting refers to a model that models the training data too well…

hackernoon.com

728×90

반응형

[Deep Learning] 과적합(Overfitting) 해결

과적합(Overfitting)

모델이 Train Data에만 최적화되어 Validation Data에는 성능이 떨어지는 상태

1) 과적합의 원인

(1) 학습 데이터 부족

(2) Model Capacity가 높을 때(= 파라미터 개수가 많을 때)

2) DNN에서 과적합을 해결하는 방법

여러가지 방법이 있으며 하나의 방법만 사용하는 것이 아니라,

조합해서 사용할 수 있다.

(1) 더 많은 Train Data

Data points를 추가로 획득하는 방법

(2) Model Capacity

Hidden Layer, Node 수를 줄이는 방법

코드 from keras import models , layers mnist_MC = models . Sequential () # mnist_MC.add(layers.Dense(512, activation = ‘relu’, input_shape = (28 * 28,))) mnist_MC . add ( layers . Dense ( 256 , activation = ‘relu’ , input_shape = ( 28 * 28 ,))) # 노드 개수 줄이기 # mnist_MC.add(layers.Dense(256, activation = ‘relu’)) # 삭제 mnist_MC . add ( layers . Dense ( 10 , activation = ‘softmax’ ))

(3) L2 Regularization

가중치의 제곱에 비례하는 노이즈를 오차 함수에 추가하는 방법(가중치 감쇠로 인한 가중치 차수 감소)

코드 from keras import models , layers from keras import regularizers mnist_L2 = models . Sequential () mnist_L2 . add ( layers . Dense ( 512 , activation = ‘relu’ , kernel_regularizer = regularizers . l2 ( 0.00001 ), input_shape = ( 28 * 28 ,))) mnist_L2 . add ( layers . Dense ( 256 , activation = ‘relu’ , kernel_regularizer = regularizers . l2 ( 0.00001 ))) mnist_L2 . add ( layers . Dense ( 10 , activation = ‘softmax’ ))

(4) Dropout

훈련 과정에서 네트워크의 일부를 생략하는 방법(Fully connected와 반대 개념)

Srivastava, Nitish, et al. ”Dropout: a simple way to prevent neural networks from overfitting”, JMLR 2014

Epoch 마다 Drop되는 Node들이 무작위로 바뀐다.

코드 from keras import models , layers mnist_DO = models . Sequential () mnist_DO . add ( layers . Dense ( 512 , activation = ‘relu’ , input_shape = ( 28 * 28 ,))) mnist_DO . add ( layers . Dropout ( 0.5 )) mnist_DO . add ( layers . Dense ( 256 , activation = ‘relu’ )) mnist_DO . add ( layers . Dropout ( 0.5 )) mnist_DO . add ( layers . Dense ( 10 , activation = ‘softmax’ ))

(5) Batch Normalization

활성화 함수의 입력값을 정규화 과정을 수행하여 전달하는 방법

https://excelsior-cjh.tistory.com/178

최근 가장 많이 적용되고 있는 방법 중 하나

일반적으로 Fully Connected나 Convolutional layer 바로 다음과 활성화 함수를 사이에 레이어를 삽입하여 사용함 Input data는 정규분포라고 하더라도 레이어를 거치고나면 정규분포가 아닐 수도 있다. 따라서 data를 정규화하여 활성화 함수를 통과하게 한다.

Gradient Vanishing 문제(미분값이 0이되는 문제) 해결을 가능하게 함 분포를 변경하면, 미분했을 때 0이 되지 않기 때문

더 큰 학습률을 사용할 수 있게 함

Batch Normalization을 적용하면 학습을 위한 파라미터($\mu,\ \sigma$)가 추가된다.

코드 from keras import models , layers mnist_BN = models . Sequential () mnist_BN . add ( layers . Dense ( 512 , input_shape = ( 28 * 28 ,))) mnist_BN . add ( layers . BatchNormalization ()) mnist_BN . add ( layers . Activation ( ‘relu’ )) mnist_BN . add ( layers . Dense ( 256 )) mnist_BN . add ( layers . BatchNormalization ()) mnist_BN . add ( layers . Activation ( ‘relu’ )) mnist_BN . add ( layers . Dense ( 10 , activation = ‘softmax’ ))

3) 예시 : 과적합 해결 방법 비교

실습

Overfitting을 해결하는 방법 3가지

머신러닝은 학습 데이터로부터 배우고 테스트 데이터에 대해서 예측하는 것을 목표로 합니다. Overfitting은 학습 데이터의 성능은 높지만, 테스트 데이터에 대해서 성능이 나오지 않는 경우를 말합니다.

Overfitting을 해결하는 방법은 대표적으로 3가지가 있습니다.

데이터의 수를 늘린다. 모델의 Complexity를 줄인다. Regularization을 사용한다.

편의상 모델의 파라미터에 대한 복잡도를 M, 데이터에 대한 복잡도를 D라고 하겠습니다.

Overfitting은 M>D 인 경우에, 학습이 경과됨에 따라서 학습데이터를 모두 학습한 상태를 말합니다. (모델의 복잡도가 충분하므로 데이터를 모두 학습할 수 있습니다.)

문제는 완료된 학습이 데이터에 대한 패턴을 배우는 것이 아니라 데이터를 기억하는 수준이라는 것 입니다. 따라서 새로운 데이터가 등장한다면, 이 데이터의 패턴을 통해서 예측하는 방식이 아니고 기억 속에서 찾아야 하므로 잘 예측하지 못합니다. (보지 못했으니까요)

결국 데이터와 모델의 복잡도는 서로 연관되어 있습니다. Overfitting을 해결하는 방법은 이 두가지를 비슷한 크기로 만들어주는 것 입니다.

1. 데이터의 수를 늘린다.

첫 번째 해결 방법은 D 를 증가시키는 방법입니다. 동일한 모델에 대해서 다양한 데이터를 줌으로써 데이터의 복잡도를 높입니다. 이는 단순히 데이터의 양 관점에서 내린 결론이 아니며 모델 사이즈와 연관되어 있습니다.

2. 모델의 Complexity를 줄인다.

두 번째 해결 방법은 M을 줄이는 방법입니다. 동일한 데이터에 대해서 모델의 복잡도를 줄인다면 데이터로부터 일반적인 패턴을 학습하여 일반화가 됩니다. (이를 Generalization이 된다고 말합니다.)

랜덤으로 생성된 15개의 데이터에 대해서, Polynomial Curve Fitting을 해보겠습니다. Polynomial의 차수 [1, 3, 5, 9]에 대해서 그림과 같은 Polynomial Curve가 만들어집니다.

# 1, 3, 5, 9차 Polynomial의 계수

————–

0.2292 x + 0.4642

————–

-0.004657 x^3 + 0.1235 x^2 – 0.4795 x + 0.6676

————–

0.0001364 x^5 – 0.007481 x^4 + 0.1426 x^3 – 1.122 x^2 + 3.715 x – 3.163

————–

9.76e-08 x^9 – 1.029e-05 x^8 + 0.0004635 x^7 – 0.01156 x^6 + 0.1735 x^5

– 1.594 x^4 + 8.746 x^3 – 26.74 x^2 + 39.75 x – 20.34

1차 다항식은 계수의 절대값이 작고 3차 Polynomial의 경우 계수의 절대값이 조금 커진 것을 확인할 수 있습니다. 9차 다항식은 1차의 계수가 39정도로 더 커진 것을 확인할 수 있습니다. 따라서 모델이 복잡하면 데이터에 Fitting하기 위해서 모델의 계수가 증가하게 됩니다. 이러한 현상은 다항식 뿐만아니라 Neural Network에서도 발생합니다.

모델이 복잡하면 데이터에 Fitting하기 위해서 모델의 계수가 증가하게 됩니다.

3. Regularization을 사용한다.

위 실험에서 알 수 있는 점은, 모델의 구조가 복잡할수록 계수가 점점 커진다는 것 입니다. 다항식의 계수가 크기 때문에 값에 민감하게 반응하게 되고, 바로 이 때문에 테스트 데이터에 대해서 모델은 높은 에러를 가지게 됩니다.

따라서 계수의 크기를 줄여준다면, 모델의 계수에 의한 영향력을 줄일 수 있습니다. Regularization은 모델의 계수를 0에 가깝게 만들어 계수의 절대값을 줄이는 방법입니다. 대표적으로 Ridge나 Lasso가 있는데, 목적이 계수의 절대값을 줄이는 것이라고 이해하면 충분할 것 같습니다.

인공 신경망의 성능 개선 – 과적합(Overfitting)

호로록 빨리 지식을 머리에 마구마구 집어 넣어보쟈

딥러닝을 포함한 머신러닝 분야에서 중요한 과적합에 대해서 알아보쟈

과적합이란?

맨 왼쪽 그래프에서는 우리가 알고자 하는 값을 전혀 예측하지 못함 – 과소적합

가운데 그래프는 학습 데이터로 학습 후 예측 값이 잘 되고 있음 – 적정, 좋은 모델

학습 데이터로 학습을 했는데, 학습을 너무 잘해서 학습 데이터에 너무 잘 맞춰진 예측식을 만들다 보니까 학습 데이터가 보지 못한 시험 데이터에 대해서는 제대로 예측하지 못하는 경우가 있음 – 과적합

과적합 해결

학습 데이터를 많이 확보 학습 데이터 생성에는 돈과 시간이 많이 들어가기 때문에 학습 데이터를 많이 만드는데 어려움이 있을 수 있음 그래서 학습 데이터를 확보하기 위해 아래와 같은 방법을 사용함 데이터 증식(Data Augmentation) 기존 데이터 10개를 가지고 평행이동이나 대칭 이동을 해서 새로운 데이터 10개를 생성함 그래서 훈련 시 기존 데이터 10개와 새로 생성한 데이터 10개를 합친 20개를 사용함 조기 종료(Early Stopping) 학습을 하면 입력 값을 모델에 넣고 출력 값을 뽑아내고, 뽑아낸 예측 값을 실제 값과 비교를 해서 Loss를 계산해서 최적화를 진행함 학습 반복 횟수가 늘어날수록 기존에 있던 학습 데이터를 맞출 확률이 높아짐 기존에 있던 학습 데이터는 잘 배워지기 때문에 Loss가 작아짐 시험 데이터는 학습에는 관여하지 않고 평가하는데 쓰이기 때문에 잘 맞추다가 과적합이 있다면 학습 반복 횟수가 늘어날 수록 Loss가 높아짐 조기 종료 시점을 확인하여 과적합을 방지함 굴곡이 2개가 생길 수도 있기 때문에 학습 반복 횟수인 epoch를 크게 해서 어떻게 그래프가 나오는지 확인해야 함 L1, L2 정규화(L1, L2 Regularization) Loss function에서 가장 아랫부분인 w*까지 간다면 train data에 최적화가 되었다는 것을 알 수 있음 최소점까지 가지 못하게 방해물을 줌 바운더리 경계를 만들어서 그 안에서만 처리하도록 함 Loss function 뒤에 정규화 텀(바운더리)을 붙여줌 L1 : 절댓값 미분이기 때문에 V 형태의 그래프, 0 기준 왼쪽은 -1, 0기준 오른쪽은 1 , 0 기준에서는 subgradient를 이용하면 됨 L2 : weight decay라고도 함 드롭아웃(Dropout) 계산할 때 랜덤으로 노드를 제거하여 계산을 하지 못하도록 하는 방법 들어오는 값에 0을 곱해서 노드를 없애는 것처럼 함 드롭커넥트(DropConnect) 드롭아웃은 노드를 없애는 반면, 드롭커넥트는 일부 가중치를 0으로 만드는 것 교란라벨(DisturbLabel) 과적합을 방지하기 위해 일부 실제 값을 틀린 라벨로 바꿔치기하는 것 배치 정규화(Batch Normalization) 층과 층 사이에 배치 정규화를 넣어줌으로써 과적합을 해결함 데이터에 대해서 항상 같은 분포에서 계산이 되도록 해줌 각 배치마다 정규화된 정도가 다를 수 있어서, 감마와 베타를 곱하고 더해서 shift를 해줌 라벨 스무딩(Label Smoothing) Loss를 계산할 때 어떤 특정 비율로 실제 값을 조정해주는 것 노이즈 주입(Noise Injection) 입력값 자체나 레이어 중간의 임의의 노이즈를 주입 train data 자체에 노이즈를 추가함 계산 과정에 노이즈를 추가함 교차 검증(Cross Validation) 과적합을 직접적으로 해결하는 방법은 아님 과적합이 됐는지 안됐는지 판단하는 척도 Train data, Validataion data, Test data로 나눔 Test data는 오로지 검증할 때만 사용함 교차 검증은 Train data를 kfold 한 후 순차적으로 Validation data를 두는 것 위 이미지는 3fold 예시 예를 들어, 5fold일 경우 TTTTV, TTTVT, TTVTT, TVTTT, VTTTT 이런 식으로 할 수 있음 단점 : 평균 loss 또는 평균 accuracy로 모델을 판단하기 때문에, k가 3일 경우 3번을 학습시켜야 하기 때문에 시간이 오래 걸린다는 단점이 있음

내용에 문제가 있으면 댓글로 알려주세요!

출처 : 인프런 – 실전 인공지능으로 이어지는 딥러닝 개념 잡기(딥러닝 호형)

과적합(Overfitting)과 규제(Regularization)

과적합(Overfitting)이란 모델이 train 데이터에 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태를 말한다.

이게 과연 무슨 말일까? 데이터를 잘 학습할수록 좋은 것 아닌가?

예를 들어 아래와 같은 회귀 문제가 있을 때, 우리가 원하는 모델은 두 번째에 가깝다.

첫 번째 모델은 과소적합(Underfitting)의 경우로, 주어진 데이터를 아직 제대로 반영하지 못하고 있고,

세 번째 모델은 주어진 데이터가 모든 경우에 나타나는 일반적인 경향이라고 오해한 경우이다.

즉 과적합(Overfitting)되어 새로운 데이터에 대해서는 적용할 수 없는, 일반화하기 어려운 경우이다.

https://www.quora.com/Are-there-any-criteria-to-distinguish-overfitting

세 그래프에 빨간 점(data)을 하나씩 더 찍어 보았다.

점선(모델이 예측한 결과)과의 거리가 가장 가까운 모델은 무엇인가?

모든 input 데이터에 대한 오차가 존재하지만, 그럼에도 대체적으로 가장 데이터의 분포와 경향을 잘 나타내고 있는 것은 바로 두 번째 모델이다.

오버피팅된 세 번째 모델의 경우 기존 데이터들은 오차 없이 모두 표현해냈지만, 새로운 데이터가 주어지자 오히려 예측한 값의 오차가 더 크게 나타났다.

이처럼 좋은 모델, 즉 모델의 성능이 좋다는 것은 얼마나 범용적 인가와 직접적으로 연결된다.

모델의 성능은 곧 일반화 성능을 말한다고도 볼 수 있다.

따라서 주어진 데이터를 잘 학습해서, 그것을 잘 표현해내는 모델을 만드는 것이 우리의 목표이지만,

동시에 과적합을 방지함으로써 지나치게 train 데이터에 의존적이지 않도록 해야 한다.

과적합이 일어나는 이유

과적합이 일어나는 이유는 다양하지만, 주로 아래 두 가지의 경우에 발생한다.

feature(→ parameter)가 많고 표현력이 높은 모델인 경우 (상대적으로 데이터 수가 적은 데 비해)

(상대적으로 데이터 수가 적은 데 비해) train 데이터가 적은 경우 (상대적으로 feature → parameter 가 많은 데 비해)

위 두 가지 조건을 충족시켜서 실제 코드로 오버피팅을 재현해보자.

일부러 MNIST 데이터셋에서 6만 개 중 300개만을 train 데이터로 사용하고, layer가 7층이면서 각 층의 노드는 100개인 매우 복잡한 네트워크를 만든다.

(전체 소스코드는 여기에서 확인 가능)

# 데이터셋 로드 (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True) # overfitting 재현을 위해 데이터 300개만 사용 x_train = x_train[:300] t_train = t_train[:300] # input_size: mnist dataset의 dimension = 784 # 각 layer의 노드 수 = 100개 # hidden_size_list: hidden layer가 6개이면 network layer가 7개 network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=100) optimizer = SGD(lr=0.01) max_epochs = 201 train_size = x_train.shape[0] batch_size = 100

이렇게 해서 학습시킨 각 epoch에 따른 accuracy를 그래프로 그려보면 다음과 같다.

train accuracy는 epoch이 증가함에 따라 거의 1.0에 수렴하면서 매우 높아지는 데 비해,

test accuracy는 점점 train accuracy와의 차이가 벌어지면서 약 0.7 수준에 머물고 있다.

이처럼 train에 비해 test 성능이 낮고 그 차이가 크다면 과적합이 발생한 것이라고 판단할 수 있다.

과적합을 방지하는 방법

안타깝게도 과적합을 완벽히 피할 수는 없다. 다만 어떻게 완화하고, 그에 따른 성능 저하를 최소화할 것인가에 집중해야 한다.

그렇다면 과적합을 가능한 한 억제할 수 있는 방법에는 어떤 것들이 있을까?

쉽게 생각해보면 과적합이 일어나는 조건의 반대 상황을 만들어주면 된다!

즉 1) input 데이터를 늘리거나, 2) parameter를 줄이면 되는데 사실 데이터를 더 수집해서 수를 늘리는 방법은 대부분의 경우 어렵기 때문에 feature를 줄이는 것을 중점적으로 고려할 수 있다.

feature의 개수를 줄이는 방법은 사람이 판단해 manually select 하는 방법과 model이 select하게끔 하는 방법이 있다.

그러나 사실 어떤 feature가 얼마나 유용할지 알 수 없기 때문에 이 또한 적용하기가 쉽지 않다.

대신에 우리가 찾을 수 있는 방법은 각 feature마다 페널티(규제)를 부여해서 그 영향력을 조정하는 것이다.

이러한 방법을 정칙화 또는 규제 Regularization라고 한다.

💡 잠깐!

Regularization이라는 말은 ‘정규화’라고도 불리며 Normalization과 혼동되는 경우가 많다.

또 이 normalization은 표준화(Standardization)와도 자주 헷갈리는 개념이다.

이들의 개념(차이)을 정리하자면,

– 정규화 Normalization은 데이터의 분포가 정규분포에 가깝게 만드는 것, 즉 범위(scale)를 0~1 사이 값으로 바꾸는 것

– 표준화 Standardization은 데이터가 표준 정규분포에 가깝게 만드는 것, 즉 평균이 0이고 분산이 1이 되도록 scaling 하는 것

– 정칙화 Regularization은 오버피팅을 방지하기 위해 weight에 penalty를 부여하는 것이라고 할 수 있다.

이 regularization에도 가중치 감소(Weight Decay), 드롭아웃(Dropout), 배치 정규화(Batch Normalization) 등 다양한 방법이 있지만, 이번 글에서는 가중치 감소와 드롭아웃에 대해서만 다뤄보기로 한다.

① 가중치 감소(Weight Decay)

가중치 감소는 모델의 학습 과정에서 가중치에 페널티(규제)를 부여함으로써 과적합을 방지하는 방법이다.

가중치 `W` 가 클수록 더 큰 페널티를 부과해 해당 input `x`에 대해 지나치게 fit하지 않도록 조절하는 것이다.

이때 페널티를 얼마나 부과할 것인지를 계산하는 방법이 L1 또는 L2 Regularization이다.

각각의 계산식은 다음과 같다.

L1 규제 regularization

$$L_{new} = L_{old} + \lambda \sum \left | W \right |$$

L2 규제 regularization

$$L_{new} = L_{old} + \frac{\lambda }{2n}\sum W^2$$

위 식에서 `L`은 손실함수(Loss Function)를, `\lambda`는 규제 강도(Regularization Strength), 즉 규제의 정도를 결정하는 하이퍼파라미터를 의미한다.

이렇게 규제를 적용하면, 위에서 보았던 epoch에 따른 accuracy 그래프가 아래와 같이 바뀐다.

과적합이 억제되어 train과 test 데이터셋에 대한 차이가 줄어든 것이다.

② 드롭아웃(Dropout)

신경망이 복잡해질수록 위에서 살펴본 규제만으로는 과적합을 방지하기 어렵다.

이럴 때 적용할 수 있는 것이 바로 드롭아웃이다.

드롭아웃은 뉴런을 임의로 삭제하면서 학습하는 방법을 말한다.

train 하면서 무작위로 은닉층(Hidden Layer)의 뉴런을 골라 배제하고, 다음 layer로 신호를 전달하지 못하도록 하는 것이다.

실제 코드에서는 keras 라이브러리를 이용해 매우 간단하게 드롭아웃 layer를 추가할 수 있다.

아래 예시에서는 dropout layer에 0.5라는 값을 주어서 뉴런의 절반만 학습에 이용하도록 하였다.

# keras를 이용해 dropout layer를 적용한 예시 from tensorflow import keras model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation=’relu’), keras.layers.Dropout(0.5), keras.layers.Dense(10, activation=’softmax’)]) model.compile(optimizer=’adam’, loss=’sparse_categorical_crossentropy’, metrics=[‘accuracy’]) model.fit(x_train, y_train, epochs=10)

이러한 기법은 결과적으로 앙상블 학습을 구현한 것과 유사한 효과를 낸다.

앙상블 학습을 통해 여러 모델의 평균을 내는 것과 비교해 보면, 그 결과는 비슷하지만 훨씬 더 적은 계산 비용이 든다는 장점이 있다.

“It is better to be approximately right than precisely wrong.”

By Warren Buffett

아래 내용을 참고했습니다.

반응형

딥러닝 과적합 문제 해결하기(feat 광석 판별하기)

반응형

과적합(Overfitting)이란?

과적합은 특정 모델이 학습 데이터셋 안에서는 일정 수준

이상의 예측 정확도를 보이지만, 새로운 데이터를 적용

하면 정확도를 높이지 못하는 현상을 의미한다.

과적합이 발생하는 이유?

모델 내에 층이 너무 많이 쌓이게 되거나, 변수가 복잡하면

과적합이 발생한다. 또한 테스트셋과 학습셋이 중복되면,

과적합이 발생한다.

딥러닝 모델에서는 입력층, 은닉층, 출력층에 상당히 많은

노드들이 중첩되기 때문에 과적합 문제에 빠지기가 쉽다.

과적합 문제를 해결하는 방법

과적합에 빠지지 않고, 정확한 예측 모델을 만들기 위해서는

학습 데이터와 테스트 데이터를 완전히 분리하는 것이 방법이

된다.

예를 들어 100개의 데이터를 샘플로 가지고 있는 데이터셋이라면,

70개는 학습셋으로 사용하고, 나머지 30개는 테스트셋으로 분류해서

모델을 학습시키는 것이다.

학습셋과 에포크(epocs) 그리고 은닉층을

무한히 늘린다고 해서 모델의 정확도를 보장

하는 것은 아니다. 우리가 해야 할 일은

학습셋의 예측률을 올리되 테스트셋에서의

예측률을 개선하는 것이다.

실전 코드

먼저 모델링에 필요한 라이브러리들을 호출한다.

1 2 3 4 5 6 7 8 9 from keras.models import Sequential from keras.layers.core import Dense from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split import pandas as pd import numpy import tensorflow as tf tf.compat.v1.disable_eager_execution() cs

넘파이와 tensorflow에 동일한 랜덤테이블을

적용하기 위해 seed값을 설정한다.

광물 데이터를 호출한다.

데이터셋은 60개의 속성과 한개의 클래스로

구분된다. X값과 Y값을 분류해준다.

광물 데이터의 출력값이 문자열이기 때문에,

이를 구분할 수 있는 숫자 형태로 변환해준다.

데이터셋의 결과는 광물 vs 돌 두개의 값을

비교한다. LabelEncoder() 함수를 사용해서

1과 0의 값으로 바꿔서 출력값을 얻는다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # seed 값 설정 seed = 0 numpy.random.seed(seed) tf.compat.v1.set_random_seed(seed) #데이터 입력 df = pd.read_csv( ‘./dataset/sonar.csv’ ) dataset = df.values X = dataset[:, 0 : 60 ] Y_obj = dataset[:, 60 ] #문자열 변환 e = LabelEncoder() e.fit(Y_obj) Y = e.transform(Y_obj) cs

이제 과적합(Overfitting) 문제를 해결하기 위해

학습셋과 테스트셋을 구분한다. 사이킷런 라이브

러리를 사용해서 train_test_split() 함수를 호출

한다. 인자로는 입력값 ,출력값, 사이즈, 랜덤여부를

입력한다.

만약 test_size를 0.3으로 지정하면 학습셋을 70%,

테스트셋을 30%로 조정해서 모델을 학습시킨다는

말이다.

1 2 # 학습셋과 테스트셋을 구분함 X_train, X_test, Y_train, Y_test = train_test_split(X,Y,test_size = 0. 3 , random_state = seed) cs

모델을 생성한다.

24개의 노드와 60개의 입력값을 가진 입력층+은닉층을

생성한다. 활성화함수는 ReLU를 사용한다. 입력층은

입력층과 은닉층의 두개의 역할을 동시에 겸한다.

10개의 노드와 활성화함수 ReLU를 사용하는 은닉층을

설계한다.

마지막으로 출력층에서는 1개의 출력값을 가짐과 동시에,

이항 판별 모델이기 때문에, Sigmoid 함수를 활성화 함수로

사용한다.

모델 컴파일을 진행한다.

오차함수로는 평균제곱근 함수를 사용한다.

최적화 함수로는 Adam을 사용한다. 가중치와 바이어스를

자동으로 조절해주고 모멘텀, SGD를 합친 강력한 최적화

함수다.

모델을 실행한다.

에포크는 200번을 실행하고, 한번에 들어가는 샘플데이터는

5개로 한정한다.

1 2 3 4 5 6 7 8 9 10 11 12 13 # 모델 설정 model = Sequential() model.add(Dense( 24 , input_dim = 60 , activation = ‘relu’ )) model.add(Dense( 10 , activation = ‘relu’ )) model.add(Dense( 1 , activation = ‘sigmoid’ )) #모델 컴파일 model.compile(loss = ‘mean_squared_error’ , optimizer = ‘adam’ , metrics = [ ‘accuracy’ ]) # 모델 실행 model.fit(X_train, Y_train, epochs = 200 , batch_size = 5 ) cs

모델링의 결과값을 출력해본다.

모델 결과값 출력은 model.evaluate()함수를 사용한다.

인자로는 위에서 구분한 테스트셋을 추가해준다. 결과값을

확인하면 model.evaluate()함수는 리스트 형식의 데이터를

반환한다.

첫번째 요소는 오차를, 두번째 요소는 정확도를 표시한다.

정확도를 보기위해서 두번째 요소를 출력한다.

1 2 # 결과를 출력한다. print ( ”

Accuracy : ” , model.evaluate(X_test, Y_test)[1]) cs

결과값을 확인해보니, 정확도가 85.71%로

광석과 돌을 구분해는데 성공했음을 확인

할 수 있다.

반응형

캐글 딥러닝 강좌 정리 3 – 과적합(Overfitting)과 해결 방법(dropout, batch normalization)

반응형

캐글의 딥러닝 튜토리얼을 바탕으로 정리한 문서입니다. 개인적으로 추가한 내용이 있어서 원문 내용에 차이가 있습니다.

Intro to Deep Learning

https://www.kaggle.com/learn/intro-to-deep-learning

추가로 참고

https://mongxmongx2.tistory.com/26

https://brunch.co.kr/@mnc/8

2022. 3. 3 최초작성

2022. 3. 20

Overfitting과 Underfitting

Keras는 모델을 훈련시키는 동안 train 데이터 세트를 여러번 입력으로 사용하게 됩니다. 한번 train 데이터 세트를 입력으로 사용할때마다 epoch가 1씩 증가하며 이때마다 compile 메소드로 지정한 메트릭인 훈련/검증 손실, 훈력/검증 정확도 등을 저장합니다.

학습 곡선 해석하기

train 데이터 세트의 정보는 신호와 잡음의 두 종류라고 생각할 수 있습니다. 신호는 일반화하는 부분으로, 우리 모델이 새로운 데이터로부터 예측하는 데 도움이 될 수 있는 부분이고 노이즈는 실제 데이터 및 모든 부수적인 데이터에서 발생하는 모든 무작위 데이터입니다. 즉 모델이 예측하는 데 실제로 도움이 되지 않습니다.

train 데이터 세트의 손실을 최소화하는 방향으로 학습을 진행하여 그에 맞는 가중치를 선택합니다. 이때 모델의 성능을 정확하게 평가하기위해 학습에 사용하지 않은 validation 데이터 세트를 사용하여 모델을 평가합니다. 이 평가를 통해 현재 모델의 학습이 Overfitting인지 알 수 있습니다.

아래 그림은 모델을 훈련할 때 training 데이터 세트의 손실과 validation 데이터 세트의 손실을 그래프로 나타냈습니다. X축은 epoch, Y축은 loss입니다. epoch만큼 train 데이터셋을 모델 학습에 사용시 loss가 어떻게 변했는지를 보여줍니다.

validation 손실은 학습에 사용하지 않은 데이터에서 학습중인 모델의 예상 오류의 추정치를 제공합니다.

위 그래프처럼 모델에 대한 학습이 진행됨에 따라(그래프가 오른쪽으로 이동함에 따라) train 손실은 줄어듭니다. 그러나 모델이 의미있는 신호를 학습할 때만 validation 손실이 줄어듭니다. 따라서 모델이 신호를 학습하면 train 손실과 validation 손실은 모두 감소하지만 노이즈를 학습하면 두 곡선 사이에 간격이 생깁니다. 이 간격이 클수록 모델이 노이즈를 많이 학습했을 가능성이 있습니다. 두 곡선의 차이가 거의 없고 일치해야 좋습니다.

이상적으로는 신호만 학습하고 노이즈는 학습하지 않아야 좋지만 그런 일은 거의 일어나지 않습니다.

그래서 노이즈를 많이 학습하는 대신 신호를 많이 학습하도록 해야 합니다. 신호를 많이 학습하고 있다면 validation 손실은 계속해서 감소하게 됩니다. 하지만 특정 epoch가 지난 후, 신호보단 노이즈를 많이 학습하여 validation 손실이 증가하는 상황이 생길 수 있습니다. 이를 Overfitting이라고 합니다.

Underfitting과 overfitting

모델을 학습할때 의미있는 데이터인 신호가 충분하지 않거나 노이즈가 너무 많은 두 가지 상황이 생길수 있습니다. Train 데이터 세트에 대해 학습시 Underfitting이 발생했다는 것은 모델이 신호를 충분히 학습하지 못했기 때문에 손실이 높은 상황으로 위 왼쪽 그림처럼 모델이 직선처럼 만들어져서 실제 데이터인 2차함수 그래프를 설명할 수 없는 경우입니다. Train 데이터 세트에 대해 학습시 Overfitting이 발생했다는 것은 모델이 신호보단 노이즈를 더 많이 학습했기 때문에 손실이 높은 상황으로 위 오른쪽 그림처럼 모델이 너무 실제 모습인 2차함수 그래프에 대해 많이 학습한 경우로 학습에 사용하지 않는 Test 데이터 세트를 모델에 적용시 모델이 이 데이터 세트를 설명할 수 없는 상황이 생깁니다. 따라서 딥러닝 모델을 학습 시킬때 신호가 충분하고 노이즈가 적도록 해야 합니다.

피자를 예로 들면 Underfitting은 피자가 원형이라는 점만 학습하여(너무 적은 개수의 특징만 학습) 시계도 원형이니 피자로 판단하는 것입니다. Overfitting은 올리브에 토핑으로 추가되어 있는 경우만 피자라고 학습하여(너무 많은 개수의 특징을 학습) 올리브가 토핑으로 추가되지 않은 피자는 피자가 아니라고 판단하는 것입니다.

모델의 복잡도와 테이터 세트의 양과 질때문에 오버피팅이 발생할 수 있습니다.

모델의 파라미터수가 많아지면 더 복잡한 것을 학습할 수 있는 모델이 되며 모델의 복잡도가 올라간다고 합니다. 하지만 모델의 복잡도가 올라간다고 성능이 좋아지는 것은 아닙니다. 올리브가 얹어진 피자만 피자로 판단한 것처럼 원하는 학습결과와 상관없는 특징까지 학습하여 오버피팅이 발생할 수 있습니다.

Train 데이터 세트에 올리브가 올라간 피자만 포함된 경우 올리브가 없는 피자는 피자로 인식하지 못하는 문제가 발생합니다. 올리브가 있는 피자와 올리브가 없는 피자가 모두 데이터 세트에 포함되어야 합니다.

오버피팅이란 모델이 Train 데이터 세트에 대해서 지나치게 훈련되어 Test 데이터 세트에 대해서는 결과가 안 좋은 경우입니다.

위 그림처럼 빨간색 점과 파란색 점이 흩어져 있을 때 빨간색 점과 파란색 점으로 분류하는 모델을 학습시킨 경우, 학습이 잘 이루어진 경우에는 검은색 선과 같이 파란색 점과 빨간색 점을 나누게 됩니다.

하지만 학습 데이터 세트에 대해 너무 학습이 잘되었다면(즉 오버피팅) 일어났을 경우 녹색 선과 같이 빨간색 점과 파란색 점을 나누게 됩니다.

이러한 오버피팅은 학습에 사용되지 않은 Test 데이터 세트에서 좋지 않은 분류 결과를 보여주게 됩니다.

Capacity

모델의 크기는 학습할 수 있는 패턴의 크기와 복잡성을 나타냅니다. 신경망의 경우 모델의 크기는 뉴런의 수와 레이어 연결 방법에 따라 결정됩니다.

주어진 Train 데이터 세트를 사용하여 신경망이 학습이 안되지 않으면 네트워크 크기를 늘려야 합니다.

이 네트워크 크기를 늘리는 방식은 다음 2가지입니다.

기존 레이어에 더 많은 유닛(뉴런)을 추가하여 네트워크를 더 넓게 만들기

더 많은 레이어를 추가하여 네트워크를 더 깊게 만들기

네트워크가 더 넓어지게 되면 선형적인 관계를 쉽게 배울 수 있는 반면 네트워크가 더 깊어지면 비선형적인 관계를 쉽게 배울 수 있게 됩니다.

두가지 방법 중 어느 것이 더 나은지는 학습에 사용하는 데이터 세트에 따라 다릅니다.

기본 신경망입니다.

model = keras.Sequential([

layers.Dense(16, activation=’relu’),

layers.Dense(1),

])

레이어의 유닛수를 증가시며 신경망을 넓게 만든 경우입니다.

wider = keras.Sequential([

layers.Dense(32, activation=’relu’),

layers.Dense(1),

])

레이어 개수를 증가시켜서 신경망을 깊게 만든 경우입니다.

deeper = keras.Sequential([

layers.Dense(16, activation=’relu’),

layers.Dense(16, activation=’relu’),

layers.Dense(1),

])

Early Stopping

모델이 노이즈를 너무 많이 학습하는 경우 학습 중에 validation 손실이 증가할 수 있습니다. 이를 방지하기 위해 검증 손실이 더 이상 감소하지 않는 시점에서 학습을 중단시킬 수 있습니다. 이렇게 학습을 중단시키는 것을 조기 중단(Early Stopping)이라고 합니다.

Validation 손실이 증가하기 시작할때에는 신경망의 가중치는 업데이트하지 않고 이전 값을 유지하도록 할 수 있습니다. 이렇게 하면 모델이 계속해서 노이즈를 학습하더라도 Overfitting이 발생하지 않습니다.

Early Stopping을 하게되면 너무 빨리 학습을 중지할 가능성이 줄어듬을 의미합니다. 따라서 Overfitting 상태로 학습되는 것을 방지하면서 동시에 충분히 학습하지 못한 Underfitting 상태가 되는 것도 방지할 수 있습니다. 학습할 epoch를 실제로 필요하다고 생각하는 것보다 더 크게 설정하고 학습을 시작하면 Early Stopping이 Validation 손실이 더 이상 감소하지 않는 상황을 감지하여 Overfitting이 발생하기전에 학습을 중단시켜줍니다.

Keras에서 Early Stopping 사용

Keras에서 Early Stopping을 사용하려면 콜백을 추가하면 됩니다. 콜백은 신경망이 훈련되는 동안 epoch 전후처럼 특정 시점에 실행되는 함수입니다.

Early Stopping 콜백은 epoch가 끝날때마다 실행됩니다. 이 시점에서 모델에 대한 loss가 측정되기 때문입니다. 보통 Validation 손실 상태를 확인하여 Early Stopping을 할 시점을 결정하도록 합니다.

from tensorflow.keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(

min_delta=0.001, # 개선으로 간주되는 최소 변경 크기. 이 값만큼 개선이 없으면 Early Stopping 대상이 됩니다.

patience=20, # Early Stopping이 실제로 학습을 중지하기 전에 몇 epoch를 기다릴지를 의미합니다.

restore_best_weights=True, # Early Stopping시 이전에 찾은 최적의 가중치값으로 복원합니다.

)

위에서 지정한 파라미터의 의미는 “20개 에포크 동안 validation 손실이 0.001 이상 개선되지 않은 경우 훈련을 중지하고 이 시점에서 찾았던 최적의 가중치를 신경망이 유지하도록 한다”입니다.

예제 – Early Stopping를 적용한 모델 훈련

네트워크의 크기를 늘리면서 Overfitting을 방지하기 위해 Early Stopping 콜백을 fit 메소드에 추가합니다.

from tensorflow import keras

from tensorflow.keras import layers, callbacks

early_stopping = EarlyStopping(

min_delta=0.001, # 개선으로 간주되는 최소 변경 크기. 이 값만큼 개선이 없으면 Early Stopping 대상이 됩니다.

patience=20, # Early Stopping이 실제로 학습을 중지하기 전에 몇 epoch를 기다릴지를 의미합니다.

restore_best_weights=True, # Early Stopping시 이전에 찾은 최적의 가중치값으로 복원합니다.

)

model = keras.Sequential([

layers.Dense(512, activation=’relu’, input_shape=[11]),

layers.Dense(512, activation=’relu’),

layers.Dense(512, activation=’relu’),

layers.Dense(1),

])

model.compile(

optimizer=’adam’,

loss=’mae’,

)

EarlyStopping 콜백을 정의한 후 fit 메소드의 callbacks 인수로 추가합니다. 리스트에 콜백함수를 여러 개 넣어 추가할 수 있습니다. early stopping를 사용시 학습에 필요한 에포크보다 더 많은 수의 에포크를 선택합니다.

history = model.fit(

X_train, y_train,

validation_data=(X_valid, y_valid),

batch_size=256,

epochs=500,

callbacks=[early_stopping] # 콜백을 리스트에 추가합니다.

)

학습 결과 model의 fit 메소드의 epochs 아규먼트에 지정한 500 에포크가 완료되기 전에 학습이 중단된 것을 볼 수 있습니다.

Dropout

Overfitting을 해결하는 방법 중 하나가 모델에 드롭아웃 레이어를 추가하는 것입니다.

무작위로 선택된 히든 레이어의 일부 유닛이 동작하지 않게 하여 overfitting 되는 것을 막는 방법입니다.

위 그림은 히든 레이어에 50% 드롭아웃을 추가한 경우입니다. 첫번째 히든 레이어에서 50%의 유닛만 다음에 오는 히든 레이어에 데이터를 전달하고 있습니다.

드롭아웃을 적용하며 실행할때마다 무작위로 레이어의 유닛이 삭제하기 때문에 실행할때 마다 다른 네트워크가 됩니다.

keras에서 Dropout 추가하기

Dropout 레이어의 rate 아규먼트에 차단할 입력 유닛의 백분율을 적어줍니다.

드롭아웃을 적용하려는 레이어 바로 앞에 드롭아웃 레이어를 배치합니다.

keras.Sequential([

layers.Dense(32),

layers.Dropout(rate=0.3), # 이전 레이어의 30%에 해당하는 유닛들만 다음 레이어에 데이터 전달하도록 함

layers.Dense(16),

# …

])

Batch Normalization

배치 정규화를 모델에 적용하면 학습 속도가 느리거나 네트워크가 불안정한 경우 도움이 될 수 있습니다.

데이터 세트를 신경망 학습에 사용하기 전에 표준화(Standardization)나 정규화(Normalization)를 적용하여 모든 데이터가 공통 스케일로 만드는 것이 좋습니다. 데이터가 공통 스케일을 갖지 않는다면 학습이 불안정할 수 있습니다.

네트워크 내부에서도 이 정규화를 하도록 하기 위해 배치 정규화(Batch Normalization) 레이어를 추가합니다.

배치 정규화 레이어는 들어오는 각 배치(batch)에 대해 자체 평균과 표준 편차로 배치를 정규화 해줍니다.

keras에 Batch Normalization 레이어 추가

Batch Normalization 레이어를 추가하는 방법은 여러가지입니다.

레이어 뒤에 추가할 수도 있고

layers.Dense(16, activation=’relu’),

layers.BatchNormalization(),

레이어와 활성화 함수 사이에 추가할 수도 있습니다.

layers.Dense(16),

layers.BatchNormalization(),

layers.Activation(‘relu’),

반응형

[딥러닝 기본] Deep Learning 과적합 해결

* 출저

본 개념정리는 제 지도교수님이신 연세대학교 정보대학원 김하영 교수님 수업과 Andrew 교수님의 Coursera 수업을 통해 얻은 정보를 통해 정리했습니다. 자료는 대부분 Andrew 교수님의 Coursera 수업자료입니다.

* 목차

1. 과적합(Overfit) 해결 : Regulation(규제화)

2. 과적합(Overfit) 해결 : Drop-out(드롭아웃)

3. 과적합(Overfit) 해결 : data augmentation

4. 과적합(Overfit) 해결 : early stopping

5. 과적합(Overfit) 해결 : 모델 Size를 축소?

1. 과적합 (Overfit) 해결 : Regualtion(규제화)

– Regulation(규제화)가 왜 Overfit(과적합)을 해결하는가?

가중치(W) 즉 자유도에 제약을 건다.

학습할 때 가중치(W)값을 0에 가깝게 한다. 즉 Sparse하게 만든다고 할 수 있다.

가중치(W)값이 작아지면서, Z값이 작아지고, 활성화 함수가 선형수에 근접하게 된다.

예시로 Tanh 활성화 함수를 보면, 가운데(0)으로 갈수록 선형함수화 되는 것을 확인할 수 있다.

Regulation(규제화)를 사용하면 가중치(W)값이 작아지면서, Z값도 0으로 향하기 때문에 선형함수화 되는 것을 확인 할 수 있다. 즉 복잡한 함수가 아닌 간단한 함수가 된다. => 일반화 효과

이것은 모델 크기를 줄이는 것과 같은 효과이다.

– Regulation(규제화) 종류

1) L1 Regulation(규제화)

L1 Regulation은 대부분의 가중치(W)를 0으로 만든다. 이를 통해 모델을 Sparse하게 만든다.

이것은 반면 어떤 특성들이 모델에 영향을 주고 있는지 정확히 판단해준다.

2) L2 Regulation (규제화)

L2 Regulation은 L1 Regulation과 다르게 가중치(W)들의 제곱을 최소화하므로, 가중치(W)의 값이 완전히 0이 되기보다 0에 가까워지는 경향을 가지고 있다.

2. 과적합 (Overfit) 해결 : Drop-Out(드롭아웃)

– 드롭아웃(Drop-out) 개요

-> W 분산시켜서 다양성 추구, 여러 가지 모델 학습하는 효과 가져온다.

-> 랜덤하게 계속 재설정, 미니배치 사용한다면 배치마다 가중치는 드롭아웃 적용되서 업데이트

-> 입력층, 출력층은 바꾸지만 않다.

-> 반복할 때마다 더 작은 신경망으로 일하는 것과 같음

– 드롭아웃(Drop-out) 설명

미니배치마다 각 layer마다 확률을 넣어 Neuron의 활성화 멈추게 한다.

그리하여 매 미니배치마다 다른 아키텍쳐(Network)를 학습하게 만드는 구조이다.

이것은 과적합을 막게 한다. 구체적인 설명은 다음과 같다.

1) 규제화 효과

반복할 때마다 작은 신경망으로 학습이 되며, 매번 활성화되는 Neuron이 달라지기 때문에 헷깔리게 만든다.

이것은 한가지 Neuron 즉 한가지 Feature에 많은 비중을 부여하지 않는 효과가 있다.

어느 특정 Neuron이 큰 가중치 값을 가져서 큰 영향력을 행사하지 않는다는 뜻이다.

이를 통해 규제화 효과를 가져오게 된다.

2) 앙상블 효과

매 미니배치마다 여러가지 모델(다양성) 학습하게 된다.

원래 신경망을 학습하게 되면 각 미니매치마다 Overfitting이 일어난다.

그런데 미니배치마다 다른 모델이 학습되다보니, 여러 모델이 합쳐져 Voting에 의한 평균 효과로

Overfitting이 상쇄되는 regularization과 비슷한 효과를 가져온다.

– 드롭아웃(Dropout)과 L2 Regulaltion의 차이점

1) L2 Regulation (규제화)

노이즈 작은 것에 사용

2) 드롭아웃(Dropout)

노이즈 큰 것에 주로 사용(CNN에서 강력한 기법)

ex) 컴퓨터비전에서 입력값 크기가 너무 커서 모든 픽셀들을 입력하는 데에는 항상 데이터 부족하다.

이럴 때 드롭아웃 사용한다.

3. data augmentation – data augmentation 개요 이미지에서 자주 사용 (CNN에서 강력한 기법) 너무 심한 방향전환은 금물이다. ex) 숫자 8을 오른쪽으로 회전하면 무한대 기호가 될 수 있다. ​ – data augmentation 주의할 점 TEST set에서는 Data augmentation 사용하면 안된다. TEST set은 노이즈 없는 정확한 데이터 사용해야 한다. ​ – data augmentation 단점 관계형 데이터테이블에서 사용 어렵다. 즉 적용하기 까다롭다.

​ 4. early stopping – early stopping 사용에 고민해야할 부분 eqrly stopping은 과적합 방지의 좋은 방법 하지만 최적화 <-> 과적합 사이에서 고민해야 한다. 우리는 최적화를 높이고 과적합을 줄여야 한다. early stopping은 이 둘 사이를 복잡하기 만드는 경향이 있다.

5. 과적합(Overfit) 해결 : 모델 Size를 축소?

– 모델 Size 축소는 최후의 보류

모델(Network) Size를 줄이는 것은 되도록 사용하지 않는다.

왜냐하면 모델의 자유도(Neuron의 수)가 축소되고, 이것은 Representive Capacity가 축소되는 것과 같다.

이렇게 된다면, High-level Feature의 학습이 어렵게 되고, 성능이 좋게 개선되지 않는다.

다른 말로 설명하자면 함수들을 합성하면서 더 복잡한 함수로 표현하는 것에 제약이 걸리고, 더 복잡한 문제를 해결하는 것에도 제약이 걸리는 것과도 같다.

키워드에 대한 정보 과적 합 해결

다음은 Bing에서 과적 합 해결 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 딥러닝 – 과적합 해결을 넓은 관점에서 보자

  • 딥러닝
  • 머신러닝
  • 딥러닝 알고리즘
  • 딥러닝 기초
  • 인공지능
  • 데이터분석
  • 데이터 분석
  • 빅데이터
  • 파이썬
  • 파이토치
  • 인공 신경망

딥러닝 #- #과적합 #해결을 #넓은 #관점에서 #보자


YouTube에서 과적 합 해결 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 딥러닝 – 과적합 해결을 넓은 관점에서 보자 | 과적 합 해결, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  디아블로2 무설치 맵핵 | 디아블로2 맵핵 시디키 리마스터 무설치 무료 상위 125개 베스트 답변

Leave a Reply

Your email address will not be published. Required fields are marked *