diff --git a/bambini77/week1/answer1.md b/bambini77/Week_1/answer1.md similarity index 100% rename from bambini77/week1/answer1.md rename to bambini77/Week_1/answer1.md diff --git a/bambini77/week1/week 1.md b/bambini77/Week_1/week 1.md similarity index 100% rename from bambini77/week1/week 1.md rename to bambini77/Week_1/week 1.md diff --git a/bambini77/week1/week1 img/Untitled 1.png b/bambini77/Week_1/week1 img/Untitled 1.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 1.png rename to bambini77/Week_1/week1 img/Untitled 1.png diff --git a/bambini77/week1/week1 img/Untitled 10.png b/bambini77/Week_1/week1 img/Untitled 10.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 10.png rename to bambini77/Week_1/week1 img/Untitled 10.png diff --git a/bambini77/week1/week1 img/Untitled 11.png b/bambini77/Week_1/week1 img/Untitled 11.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 11.png rename to bambini77/Week_1/week1 img/Untitled 11.png diff --git a/bambini77/week1/week1 img/Untitled 12.png b/bambini77/Week_1/week1 img/Untitled 12.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 12.png rename to bambini77/Week_1/week1 img/Untitled 12.png diff --git a/bambini77/week1/week1 img/Untitled 13.png b/bambini77/Week_1/week1 img/Untitled 13.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 13.png rename to bambini77/Week_1/week1 img/Untitled 13.png diff --git a/bambini77/week1/week1 img/Untitled 14.png b/bambini77/Week_1/week1 img/Untitled 14.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 14.png rename to bambini77/Week_1/week1 img/Untitled 14.png diff --git a/bambini77/week1/week1 img/Untitled 15.png b/bambini77/Week_1/week1 img/Untitled 15.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 15.png rename to bambini77/Week_1/week1 img/Untitled 15.png diff --git a/bambini77/week1/week1 img/Untitled 16.png b/bambini77/Week_1/week1 img/Untitled 16.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 16.png rename to bambini77/Week_1/week1 img/Untitled 16.png diff --git a/bambini77/week1/week1 img/Untitled 17.png b/bambini77/Week_1/week1 img/Untitled 17.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 17.png rename to bambini77/Week_1/week1 img/Untitled 17.png diff --git a/bambini77/week1/week1 img/Untitled 18.png b/bambini77/Week_1/week1 img/Untitled 18.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 18.png rename to bambini77/Week_1/week1 img/Untitled 18.png diff --git a/bambini77/week1/week1 img/Untitled 19.png b/bambini77/Week_1/week1 img/Untitled 19.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 19.png rename to bambini77/Week_1/week1 img/Untitled 19.png diff --git a/bambini77/week1/week1 img/Untitled 2.png b/bambini77/Week_1/week1 img/Untitled 2.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 2.png rename to bambini77/Week_1/week1 img/Untitled 2.png diff --git a/bambini77/week1/week1 img/Untitled 20.png b/bambini77/Week_1/week1 img/Untitled 20.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 20.png rename to bambini77/Week_1/week1 img/Untitled 20.png diff --git a/bambini77/week1/week1 img/Untitled 3.png b/bambini77/Week_1/week1 img/Untitled 3.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 3.png rename to bambini77/Week_1/week1 img/Untitled 3.png diff --git a/bambini77/week1/week1 img/Untitled 4.png b/bambini77/Week_1/week1 img/Untitled 4.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 4.png rename to bambini77/Week_1/week1 img/Untitled 4.png diff --git a/bambini77/week1/week1 img/Untitled 5.png b/bambini77/Week_1/week1 img/Untitled 5.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 5.png rename to bambini77/Week_1/week1 img/Untitled 5.png diff --git a/bambini77/week1/week1 img/Untitled 6.png b/bambini77/Week_1/week1 img/Untitled 6.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 6.png rename to bambini77/Week_1/week1 img/Untitled 6.png diff --git a/bambini77/week1/week1 img/Untitled 7.png b/bambini77/Week_1/week1 img/Untitled 7.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 7.png rename to bambini77/Week_1/week1 img/Untitled 7.png diff --git a/bambini77/week1/week1 img/Untitled 8.png b/bambini77/Week_1/week1 img/Untitled 8.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 8.png rename to bambini77/Week_1/week1 img/Untitled 8.png diff --git a/bambini77/week1/week1 img/Untitled 9.png b/bambini77/Week_1/week1 img/Untitled 9.png similarity index 100% rename from bambini77/week1/week1 img/Untitled 9.png rename to bambini77/Week_1/week1 img/Untitled 9.png diff --git a/bambini77/week1/week1 img/Untitled.png b/bambini77/Week_1/week1 img/Untitled.png similarity index 100% rename from bambini77/week1/week1 img/Untitled.png rename to bambini77/Week_1/week1 img/Untitled.png diff --git a/bambini77/Week_2/answer2.md b/bambini77/Week_2/answer2.md new file mode 100644 index 0000000..41a4bf9 --- /dev/null +++ b/bambini77/Week_2/answer2.md @@ -0,0 +1,34 @@ +# [핸즈온머신러닝] 2주차 + + +## Non-Linearity라는 말의 의미와 그 필요성은?(3줄 분량으로 작성해주세요) + +- 선형적인 함수는 일차 함수의 형태이며 비례 관계에 있는것이며 그렇지 않으면 비선형적이다고 한다. 층들 사이에 비선형성을 추가해줘야 한다. 왜냐하면 선형함수들을 여러개 연결해도 하나의 선형함수로 합쳐질 수 있기 때문에 층을 많이 쌓아도 하나의 층과 동일한 효과를 내게 된다. 비선형인 활성함수들을 선형 layer들 사이에 추가하여 층이 층이 합쳐지지 않게해준다. + + +## 미니배치를 작게 할때의 장단점은?(2줄 분량으로 작성해주세요) + +- 배치 사이즈가 작으면 큰 배치를 사용할 때보다 일반화 성능은 좋을 수 있다 . 그렇지만 계산의 효율성이 큰 배치 사이즈를 사용할 때 보다 떨어진다. + 일반화 성능이 좋다는 것은? + trainig data의 loss값과 test data의 loss값 차이가 작다는 뜻이다. + +## 배치 정규화의 장점과 단점은 무엇인가요? + +- 모든 심층 신경망에서 배치 정규화가 성능을 크게 향상시킨다. 그레디언트 소실 문제가 크게 감소한다. 또한 가중치 초기화에 덜 민감해진다. 그러나 모델의 복잡도를 키운다는 단점이 있다. 또한 실행 시간에서도 손해를 본다. + +그래디언트 소실이란? + 신경망을 학습시키는 과정에서 네트워크의 초기 층으로 전파되는 그래디언트가 점점 줄어들어 사라지게 되는 문제로 이로 인해 네트워크의 가중치가 거의 또는 전혀 업데이트되지 않아 학습이 잘 안되는 문제가 발생한다. + + +## 학습률 스케줄링이란 무엇이며, 왜 사용되나요? + +- 큰 학습률로 시작하고 학습 속도가 느려질 때 학습률을 낮춰 좋은 솔루션을 더 빨리 발견하는 전략을 학습률 스케줄링이라 한다. 좋은 학습률을 찾는 것은 훈련 과정에서 매우 중요한 과정이므로 적절한 학습률 찾기를 통해 과적합을 방지하고 훈련 과정을 안정적으로 진행한다. + + +## 추가 질문 + +Q. 작은 배치 사이즈를 쓰면 빠르다는건가요? 큰 배치 사이즈를 쓰면 빠르다는건가요? 하나는 작아서 빨리 모델이 순환하며 업데이트된다라고 되어있고 큰배치 사이즈는 계산효율이 빨라져 빠르다는거 같은데 헷갈리네요 + +A. 한 에포크당 속도는 큰 배치 사이즈에서 일반적으로 더 빠르다. 큰 배치는 더 적은 수의 그래디언트 업데이트를 필요로 하므로, 한 에포크를 빠르게 처리할 수 있다. +전체 학습 과정에서의 수렴 속도는 더 자주 모델을 업데이트하므로, 더 빠른 수렴이 가능하게 할 수 있다. +즉, 상황에 따라 다르다. \ No newline at end of file diff --git a/bambini77/Week_2/week2 img/Untitled 1.png b/bambini77/Week_2/week2 img/Untitled 1.png new file mode 100644 index 0000000..21fe298 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled 1.png differ diff --git a/bambini77/Week_2/week2 img/Untitled 2.png b/bambini77/Week_2/week2 img/Untitled 2.png new file mode 100644 index 0000000..14a8ba3 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled 2.png differ diff --git a/bambini77/Week_2/week2 img/Untitled 3.png b/bambini77/Week_2/week2 img/Untitled 3.png new file mode 100644 index 0000000..d5dd4e6 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled 3.png differ diff --git a/bambini77/Week_2/week2 img/Untitled 4.png b/bambini77/Week_2/week2 img/Untitled 4.png new file mode 100644 index 0000000..4372ab0 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled 4.png differ diff --git a/bambini77/Week_2/week2 img/Untitled 5.png b/bambini77/Week_2/week2 img/Untitled 5.png new file mode 100644 index 0000000..7ce1aa3 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled 5.png differ diff --git a/bambini77/Week_2/week2 img/Untitled 6.png b/bambini77/Week_2/week2 img/Untitled 6.png new file mode 100644 index 0000000..fcaf099 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled 6.png differ diff --git a/bambini77/Week_2/week2 img/Untitled 7.png b/bambini77/Week_2/week2 img/Untitled 7.png new file mode 100644 index 0000000..47bd617 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled 7.png differ diff --git a/bambini77/Week_2/week2 img/Untitled 8.png b/bambini77/Week_2/week2 img/Untitled 8.png new file mode 100644 index 0000000..7437f19 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled 8.png differ diff --git a/bambini77/Week_2/week2 img/Untitled.png b/bambini77/Week_2/week2 img/Untitled.png new file mode 100644 index 0000000..c9addc5 Binary files /dev/null and b/bambini77/Week_2/week2 img/Untitled.png differ diff --git a/bambini77/Week_2/week2.md b/bambini77/Week_2/week2.md new file mode 100644 index 0000000..d9315d4 --- /dev/null +++ b/bambini77/Week_2/week2.md @@ -0,0 +1,252 @@ +# 2주차 Summary + +생성일: December 17, 2023 1:15 AM +주차: 2주차 +깃허브 커밋: No +사람: 최윤창 +완료 여부: 진행 중 + + + +# 10장 케라스를 사용한 인공 신경망 소개 + +## 인공 뉴런 + +### **퍼셉트론** + +- 가장 간단한 인공 신경망 구조 +- TLU라는 인공 뉴런 기반이며 입출력이 이진값이 아닌 숫자이고, 각각의 입력 연결은 가중치와 연관되어 있다. +- TLU는 입력의 가중치 합을 계산한 뒤 계산된 합에 계단 함수를 적용하여 결과를 출력 + +![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled.png) + +- **헤비사이드 계단 함수 / 부호 함수 (주로 사용되는 계단 함수)** + + ![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled%201.png) + +- TLU는 간단한 선형 이진 분류에 사용 가능 +- 퍼셉트론은 하나의 층 안에 놓인 하나 이상의 TLU로 구성. 각각의 TLU는 모든 입력에 연결 → fully connected layer라고 불림 +- input layer는 모두 입력 뉴런으로 구성 +- 완전 연결 층의 출력 계산 : hW,b(X)=ϕ(XW+b) + - X : 입력 특성의 행렬을 나타냄 + - 이 행렬의 행은 샘플, 열은 특성 + - W : 가중치 행렬. 편향 뉴런을 제외한 모든 연결 가중치를 포함 + - 이 행렬의 행은 입력 뉴런에 해당하고 열은 출력층에 있는 인공 뉴런에 해당 + - b : 편향 벡터. 편향 뉴런과 인공 뉴런 사이의 모든 연결 가중치를 포함 + - 인공 뉴런마다 하나의 편향 값이 있다. + - ϕ : 활성화 함수 (activation function) +- **헤브의 규칙** + + 두 뉴런이 동일한 출력을 낼 때마다 둘 사이의 연결 가중치가 증가 + + 퍼셉트론 학습 규칙은 오차가 감소되도록 연결을 강화시킨다 + + ![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled%202.png) + +- **퍼셉트론 수렴 이론** + + 훈련 샘플이 선형적으로 구분될 수 있다면 이 알고리즘이 정답에 수렴한다는 것을 증명 + +- **다층 퍼셉트론** + + 퍼셉트론을 여러개 쌓아 일부 제약을 줄일 수 있다. + + xor 문제를 해결 가능 + + +### 다층 퍼셉트론과 역전파 + +- 다층 퍼셉트론은 입력층 하나와 은닉층이라 불리는 하나 이상의 TLU층과 마지막 출력 층으로 구성 +- 은닉층을 여러개 쌓아 올림 인공 신경망을 **심층 신경망**이라고 한다. +- **역전파**? + - 후진 자동 미분 + 경사 하강법 + - 작동 방식 + 1. 역전파 알고리즘이 먼저 미니배치에 대한 예측을 만들고 오차를 측정(정방향계산) + 2. 역방향으로 각 층을 거치면서 각 연결이 오차에 기여한 정도를 측정(역방향계산) + + → 연쇄 법칙 적용 + + 3. 오차가 감소하도록 가중치와 편향을 조정(경사 하강법) + - 계단 함수를 시그모이드 함수로 변경(사실 다른 활성화 함수와도 사용 가능-ReLU, tanh 함수) + - **활성 함수는 왜?** + - 선형 층 사이에 비선형함수를 포함해야 하나로 합쳐지지 않고 각 각의 층으로 나누어질 수 있음 + + ![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled%203.png) + + +### 회귀를 위한 다층 퍼셉트론 + +회귀 작업에 사용될 수 있음 + +- 회귀 MLP의 전형적인 구조 + + ![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled%204.png) + + +### 분류를 위한 다층 퍼셉트론 + +분류 작업에 사용될 수 있음 + +- 시그모이드 활성화 함수를 가진 하나의 출력 뉴런만 필요(출력은 0과 1사이) +- 다층 퍼셉트론은 다중 레이블 이진 분류 문제를 쉽게 처리 +- 확률 분포를 예측해야 하므로 손실 함수에는 일반적으로 크로스 엔트로피 손실을 선택하는 것이 좋다 +- 분류 MLP의 전형적인 구조 + + ![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled%205.png) + + +## 케라스로 다층 퍼셉트론 구현하기 + +~ + +## 신경망 하이퍼파라미터 튜닝하기 + +조절할 하이퍼파라미터가 많다 → 어떤 조합이 주어진 문제에 최적일까? + +케라스 모델을 위한 하이퍼파라미터 튜닝 라이브러리인 케라스 튜너 라이브러리 사용 + +### 은닉 층 개수 / 은닉 층의 뉴런 개수 + +- 은닉 층이 하나인 다층 퍼셉트론이더라도 뉴런 개수가 충분하면 아주 복잡한 함수도 모델링할 수 있음 +- 하지만 복잡한 문제에서는 심층 신경망이 파라미터 효율성이 좋다 → 적은 수 의 뉴런을 사용하므로 동일한 양의 훈련 데이터에서 더 높은 성능을 낼 수 있다. +- 층의 개수와 뉴런의 개수는 과대적합이 시작되기 전까지 점진적으로 뉴런 수를 늘릴 수 있다. → 일반적으로는 층의 수를 늘리는 쪽이 이득이 많다. + +### 학습률, 배치 크기, 하이퍼파라미터 + +- **학습률** + - 일반적으로 최적의 학습률은 최대 학습률의 절반 + - 매우 낮은 학습률에서 시작해서 점진적으로 매우 큰 학습률까지 수백 번 반복하여 모델을 훈련 → 반복마다 일정한 값을 학습률에 곱한다 + - 최적의 학습률은 손실이 상승하는 지점보다 조금 아래에 있을것 +- **옵티마이저** + - 미니배치 경사하강법보다 더 좋은 옵티마이저를 선택하는 것도 매우 중요 +- **배치 크기** + - 큰 배치 크기를 사용 + - GPU같은 하드웨어 가속기를 효율적으로 활용 + - 훈련 초기 종종 불안정하게 훈련될 수 있음 → 학습률 예열을 사용해 큰 배치 크기를 시도/ 훈련이 불안정하다면 작은 배치 크기를 사용해본다 +- **활성화 함수** + - 일반적으로 ReLU가 좋은 기본값 +- **반복 횟수** + - 조기 종료를 사용 + +# 11장 심층 신경망 훈련 + +## gradient 소실과 폭주 + +### 글로럿과 He 초기화 + +### 고급 활성화 함수 + +- ReLU에 문제점이 있다 + + → 훈련하는 동안 일부 뉴런이 0 이외의 값을 출력하지 않는다 + +- LeakyReLU + - LeakyReLUα(z)=max(αz,z) + + ![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled%206.png) + + 기울기를 0이 아닌 다른 작은 수로 설정하여 0이 되지 않게 함. + +- ELU + + 훈련 시간이 줄고 신경망의 테스트 세트 성능도 더 높았다 + + 다만 지수함수를 사용하므로 계산이 느리다 + + +### 배치 정규화 + +- 그레디언트 소실과 폭주 문제를 해결하기 위한 배치 정규화 기법을 제안 +- 각 층에서 활성화 함수를 통과하기 전이 나 후에 모델에 연산을 추가 + - 입력을 원점에 맞추고 정규화 한 다음, 각 층에서 2개의 새로운 피라미터로 결괏값의 스케일을 조정하고 이동 + - 평균은 0으로 분산은 스케일 조정한다 +- 훈련이 끝난 후 전체 훈련 세트를 신경망에 통과시켜 배치 정규화 층의 각 입력에 대한 평균과 표준편차를 계산하는 것이다. +- 대부분 배치 정규화 구현은 층의 입력 평균과 표준편차의 이동 평균을 사용해 훈련하는 동안 최종 통계를 추정한다. +- 배치 정규화 층마다 네 개의 파라미터 벡터가 학습된다. + - **γ**(출력 스케일 벡터)와 **β** ( 출력 이동 벡터)는 일반적인 역전파를 통해 학습된다. + - **μ** (최종 입력 평균 벡터)와 **σ** (최종 입력 표준편차 벡터)는 지수 이동 평균을 사용하여 추정된다. + - **μ**와 **σ**는 훈련하는 동안 추정되지만 훈련이 끝난 후에 사용된다 +- 장점 + - 그레디언트 소실 문제가 크게 감소 + - 가중치 초기화 덜 민감해진다 + - 규제와 같은 역할을 하여 다른 규제의 필요성을 줄여준다 +- 단점 + - 모델의 복잡도를 키운다 + - 실행 시간면에서 손해(층마다 추가되는 계산 시간) + +### gradient clipping + +- 역전파될 때 특정 임곗값을 넘어서지 못하게 그레디언트를 잘라낸다 + - 배치 정규화를 사용하기 힘든 순환 신경망에서 사용 + +## 사전 훈련된 층 재사용하기 + +- 비슷한 유형의 문제를 처리한 신경망이 있다면 최상위 층을 제외하고 대부분의 층을 재사용할 수 있다.(전이학습) +- 보통 원본 모델의 출력 층을 바꾼다. 비슷한 원본 모델의 하위 은닉층이 훨씬 유용하다. + +![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled%207.png) + +- 방법 + 1. 재사용하는 층을 모두 동결하고 훈련 및 성능 평가 (즉, 경사 하강법으로 가중치가 고정된 상태로 남도록 훈련되지 않는 가중치로 만든다) + 2. 맨 위에 있는 한두개의 은닉 층의 동결을 해체하고 역전파를 통해 가중치 조정하여 성능 향상 확인 + + → 훈련 데이터가 많을수록 많은 층의 동결 해제 가능 + + → 재사용 층의 동결을 해제할 때는 학습률을 줄이는것이 좋음 + + 3. 좋은 성능이 안나오거나 훈련 데이터가 적다면 상위 은닉 층들을 제거하고 남은 은닉 층을 다시 동결 + + → 적절한 개수의 은닉 층을 찾을 때까지 반복 + + → 훈련 데이터가 아주 많다면 은닉 층 제거 대신 다른 것으로 바꾸거나 은닉층 추가도 가능 + + +### 비지도 사전 훈련 + +- 풀어야 할 문제가 복잡하고 재사용할 수 있는 비슷한 모델이 없으며 레이블된 훈련 데이터가 적을때 비지도 사전 훈련이 좋다. +- 레이블되지 않은 훈련 데이터를 많이 모을 수 있다면 이를 사용하여 오토인코더나 생성적 적대 신경망과 같은 비지도 학습 모델 훈련 가능 + - 오토인코더나 GAN판별자의 하위층을 재사용하고 그 위에 새로운 착업에 맞는 출력층 추가 + - 그 다음 지도학습으로 최종 네트워크를 세밀하게 튜닝 + + +### 보조 작업에서 사전 훈련 + +- 레이블된 훈련 데이터가 많지 않다면 레이블된 훈련 데이터를 쉽게 얻거나 생성할 수 있는 보조 작업에서 첫 번째 신경망을 훈련한다 + + → 이 신경망의 하위층을 실제 작업을 위해 재사용 + + +## 고속 옵티마이저 + +### 모멘텀 최적화 + +### ****네스테로프 가속 경사**** + +- AdaGrad +- RMSProp +- Adam, Nadam + +### 학습률 스케줄링 + +![Untitled](2%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%204f9eb77affe448bb9a78151e584bbeb9/Untitled%208.png) + +- 큰 학습률로 시작하고 학습 속도가 느려질 때 학습률을 낮춰 좋은 솔루션을 더 빨리 발견 +- 거듭제곱 기반 스케줄링 +- 지수기반 스케줄링 +- 구간별 고정 스케줄링 +- 성능 기반 스케줄링 +- 1사이클 스케줄링 + +## 규제를 사용해 과대적합 피하기 + +### l1과 l2규제 + +### 드롭아웃 + +- 각 뉴런은 p의 확률로 드롭아웃 되게 된다.(p는 10-50%사이) +- 몬테 카를로 드롭아웃 + +### 맥스-노름 규제 \ No newline at end of file diff --git a/bambini77/Week_3/flower_classification.md b/bambini77/Week_3/flower_classification.md new file mode 100644 index 0000000..7d4aa16 --- /dev/null +++ b/bambini77/Week_3/flower_classification.md @@ -0,0 +1,96 @@ +# 4주차 Summary + + +## 베이스라인에서 바꾼것 + +```python +def data_augment(image, label): +# Thanks to the dataset.prefetch(AUTO) +# statement in the next function (below), this happens essentially +# for free on TPU. Data pipeline code is executed on the "CPU" +# part of the TPU while the TPU itself is computing gradients. +image = tf.image.random_flip_left_right(image) +image = tf.image.random_flip_up_down(image) +image = tf.image.random_brightness(image, max_delta=0.1) +image = tf.image.random_saturation(image, lower=0.7, upper=1.3) +image = tf.image.rot90(image, k=tf.random.uniform(shape=[], minval=0, maxval=4, dtype=tf.int32)) +#image = tf.image.random_saturation(image, 0, 2) +return image, label +``` + +data augementation을 추가적으로 여러가지를 추가해주었다. + +```python +with strategy.scope(): +pretrained_model = tf.keras.applications.DenseNet201( +weights='imagenet', +include_top=False , +input_shape=[*IMAGE_SIZE, 3] +) +#vgg 말고 다른거 해보기 +pretrained_model.trainable = False +#batch normalization 추기 + True로 바꿔보기 +for layer in pretrained_model.layers[-3:]: +layer.trainable = True +#dropout 추가 +model = tf.keras.Sequential([ +# To a base pretrained on ImageNet to extract features from images... +pretrained_model, +# ... attach a new head to act as a classifier. +tf.keras.layers.GlobalAveragePooling2D(), +tf.keras.layers.BatchNormalization(), +tf.keras.layers.Dense(512, activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)), +tf.keras.layers.BatchNormalization(), +tf.keras.layers.Dropout(rate=0.2), +tf.keras.layers.Dense(len(CLASSES), activation='softmax') +]) +``` + +1. pretraidned_model에서 마지막 3개 layer를 훈련 가능하게 바꾸어주었다 +2. 배치 정규화층을 추가하였다 +3. dense layer층을 추가하였다 (여기에 l2규제를 추가해주었다). 이후에 배치 정규화 layer을 하나 더 추가 하였다 +4. dropout을 추가하였다. + +```python +model.compile( +optimizer='nadam', +loss = 'sparse_categorical_crossentropy', +metrics=['sparse_categorical_accuracy'], +) +#optimizer lion 사용 찾아보기 +model.summary() +``` + +optimizer를 adam에서 nadam으로 변경하였다 + +```python +def exponential_lr(epoch, +start_lr = 0.0001, min_lr = 0.0001, max_lr = 0.0005, +rampup_epochs = 20, sustain_epochs = 0, +exp_decay = 0.8): +``` + +rampup_epochs를 20으로 변경하였다 + +```python +early_stop = EarlyStopping( +monitor='val_loss', # 성능을 모니터링할 지표 +patience=5, # 성능 향상이 없는 에포크를 얼마나 기다릴 것인지 +verbose=1, # 얼리 스톱핑이 시작될 때 로그를 출력할지 여부 +restore_best_weights=True # 가장 좋은 모델의 가중치를 복원할 것인지 +) +``` + +epoch 값을 100으로 맞춘뒤 earlystopping을 걸어주었다 + +![Untitled](4%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20e88458b5f6f0483d98a94fa645acd671/Untitled.png) + +최고 f1_score ⇒ 0.865 + +## 알게된 점? + +추가적으로 layer를 추가할수록 오히려 점수 떨어짐 + +lr 맞추기가 굉장히 힘듦 → 최적? + +전이학습을 통해 진행되는데 pretrained layer가 훈련이 안되게 False로 맞춰져 있는데 일부를 통해 True로 변경 diff --git a/bambini77/Week_3/flower_classification/Untitled.png b/bambini77/Week_3/flower_classification/Untitled.png new file mode 100644 index 0000000..cb2d936 Binary files /dev/null and b/bambini77/Week_3/flower_classification/Untitled.png differ diff --git a/bambini77/Week_3/week3.md b/bambini77/Week_3/week3.md new file mode 100644 index 0000000..9e7a36b --- /dev/null +++ b/bambini77/Week_3/week3.md @@ -0,0 +1,174 @@ +# 3주차 Summary + +생성일: December 17, 2023 1:15 AM +주차: 3주차 +깃허브 커밋: No +사람: 최윤창 +완료 여부: 진행 중 + + + +# 12장 텐서플로를 사용한 사용자 정의 모델과 훈련 + +## 텐서플로 훑어보기 + +텐서플로는 강력한 수치 계산용 라이브러리 + +- 핵심 구조는 넘파이와 매우 비슷하지만 GPU를 지원한다. +- (여러 장치와 서버에 대해서) 분산 컴퓨팅을 지원한다. +- 일종의 JIT 컴파일러를 포함한다. 속도를 높이고 메모리 사용량을 줄이기 위해 계산을 최적화한다. 이를 위해 파이썬 함수에서 계산 그래프를 추출한 다음 최적화하고 효율적으로 실행한다. +- 계산 그래프는 플랫폼에 중립적인 포맷으로 내보낼 수 있다. +- 텐서플로는 자동 미분 기능과 RMSProp, Nadam 같은 고성능 옵티마이저를 제공하므로 모든 종류의 손실 함수를 최소화할 수 있다 + +## 넘파이처럼 텐서플로 사용하기 + +텐서는 일반적으로 다차원 배열 (넘파이 ndarray와 비슷) + +- tf.constant()로 텐서를 만듦 + - 크기와 데이터 타입 가진다 + - 인덱스 참조가 넘파이와 매우 비슷하게 작동 + - 모든 종류의 텐서 연산이 가능 + - 스칼라값 가질 수 있음 + - 기본수학 연산과 넘파이에서 볼 수 있는 대부분의 연산 제공 +- 넘파이 배열로 텐서 만들고 그 반대도 가능. 서로 연산 적용도 가능 +- 타입 변환은 성능을 크게 감소시킬 수 있으므로 자동으로 수행하지 않는다. 필요하다면 tf.cast()함수 사용 +- tf.Tensor는 변경이 불가능한 객체 → 일반적인 텐서로는 역전파로 변경되어야 하는 신경망의 가중치 구현 x + + → tf.Variable() 사용 + +- **tf.Variable()** + - assign() 메서드를 사용하여 변숫값 변경 +- 희소 텐서, 텐서 배열, 래그드 텐서, 문자열 텐서, 집합, 큐와 같은 여러 데이터 구조 지원 + +## 사용자 정의 모델과 훈련 알고리즘 + +### 사용자 정의 손실 함수 + +- 모델 저장 easy, 모델 로드할 때는 함수 이름과 실제 함수를 매핑한 딕셔너리를 전달 +- 사용자 정의 객체를 포함한 모델을 로드할 때는 그 이름과 객체를 매핑해야 한다. + +### 활성화 함수, 초기화, 규제, 제한을 커스터마이징하기 + +```python +def my_softplus(z): +return tf.math.log(1.0 + tf.exp(z)) + +def my_glorot_initializer(와ape, dtype=tf.float32): +stddev = tf.sqrt(2. / (shape[0] + shape[l])) +return tf.random.normal(shape, stddev=stddev, dtype=dtype) + +def my_ll_regularizer(weights): +return tf.reduce_sum(tf.abs(0.01 * weights)) + +def my_positive_weights(weights): # tf.nn.relu(veights)와 반환값이 같습니다• +return tf.where(weights < 0., tf•zeros_like(weights), weights) +``` + +만들어진 사용자 정의 함수는 보통의 함수와 동일하게 사용 + +### 사용자 정의 지표 + +- **손실 vs 지표** + - **손실**은 모델을 훈련하기 위해 경사 하강법에서 사용되므로 미분 가능해야 하고 그레디언트가 모든 곳에서 0이 아님 + - **지표는** 모델을 평가할 때 사용. 미분이 가능하지 않거나 모든 곳에서 그레디언트가 0이어도 괜찮다. (주로 평균 절댓값 오차나 평균 제곱 오차를 많이 사용) + - 대부분 사용자 손실 함수를 만드는 것과 사용자 지표 함수를 만드는 것은 동일 +- **스트리밍 지표** + +### 사용자 정의 층 + +- 가중치가 없는 층 (ex>tf.keras.layers.Flatten이나 tf.keras.layers.ReLU) + - 파이썬 함수를 만든 후 tf.keras.layers.Lambda층으로 감싸기 +- 훈련과 테스트에서 다르게 작동하는 층이 필요하다면 call()메서드에 training 매개변수를 추가하여 훈련인지 테스트인지 결정 + +### 사용자 정의 모델 + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled.png) + +위와 같은 예제 모델 + +keras.Model 클래스를 상속하여 생성자에서 층과 변수를 만들고 모델이 해야 할 작업을 call() 메서드에 구현 + +잔차 블록? + +### 모델 구성 요소에 기반한 손실과 지표 + +- 은닉 층의 가중치나 활성화 함수 등과 같이 모델의 구성 요소에 기반한 손실을 정의해야 할 경우도 있음 +- 모델 구성 요소에 기반한 손실을 정의하고 계산하여 add_loss() 메서드에 그 결과를 전달 + +### 자동 미분으로 그레디언트 계산하기 + +- 각 파라미터가 매우 조금 바뀔 때 함수의 출력이 얼마나 변하는지 측정하여 도함수의 근삿값을 계산하는 것 → 대규모 신경망에서는 적용하기 어려움 + +```python +def f(w1, w2): + return 3 * w1 ** 2 + 2 * w1 * w2 + +w1, w2 = 5, 3; eps = 1e-6 +# 각 파라미터가 바뀔 때마다 함수의 출력이 얼마나 변하는지 측정하여 도함수의 근삿값을 계산함 +print((f(w1 + eps, w2) - f(w1, w2)) / eps) # 36.000003007075065 +print((f(w1, w2 + eps) - f(w1, w2)) / eps) # 10.000000003174137 +``` + +- 후진 모드 자동 미분을 사용 + +ex. 변수 w1, w2 정의 tf.GradientTape 블록을 만들어 이 변수 와 관련된 모든 연산을 자동으로 기록 + +```python +w1, w2 = tf.Variable(5.), tf.Variable(3.) +with tf.GradientTape() as tape: + z = f(w1, w2) + +gradients = tape.gradient(z, [w1, w2]) +# tape.gradient(z, [w1, w2])는 출력 z에 대한 가중치 w1과 w2의 그래디언트를 계산 +# z가 w1과 w2에 대해 얼마나 민감한지를 나타내는 값입니다. +gradients +# [, +# ] +``` + +- 기본적으로 테이프는 변수가 포함된 연산만을 기록. 변수가 아닌 다른 객체에 대한 그레디언트는 None이 반환. + + 모든 연산을 기록하도록 강제 → watch()함수 사용 + +- tf.stop_gradient()함수 → 신경만의 일부분에 그레디언트가 역전파되지 않도록 막을때 사용. +- 안정적인 함수에도 수치적으로 불안정한 그레디언트 존재할 수 있음 + + → 자동 미분을 사용하지 않고 그레디언트 계산을 위해 사용할 식을 텐서플로에 알려준다 + + 이를 위해 @tf.custom_gradient 데코레이터를 사용하고 + + +### 사용자 정의 훈련 반복 + +## 텐서플로 함수와 그래프 + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%201.png) + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%202.png) + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%203.png) + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%204.png) + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%205.png) + +batch normalization 추가 + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%206.png) + +배치 정규화 2개 추가 → f1 0.518 + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%207.png) + +배치정규화 하나 빼고 드롭아웃 추가 → f1 0.514 + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%208.png) + +상위 레이어 일부 훈련 가능하게 설정 → f1 0.525 + +![Untitled](3%E1%84%8C%E1%85%AE%E1%84%8E%E1%85%A1%20Summary%20ac3a3a65235840eb8caabef7621f320a/Untitled%209.png) + +l2규제 추가 f1→ 0.554 \ No newline at end of file diff --git a/bambini77/Week_3/week3_img/Untitled 1.png b/bambini77/Week_3/week3_img/Untitled 1.png new file mode 100644 index 0000000..50d3d7c Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 1.png differ diff --git a/bambini77/Week_3/week3_img/Untitled 2.png b/bambini77/Week_3/week3_img/Untitled 2.png new file mode 100644 index 0000000..2b3bb9a Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 2.png differ diff --git a/bambini77/Week_3/week3_img/Untitled 3.png b/bambini77/Week_3/week3_img/Untitled 3.png new file mode 100644 index 0000000..5e488ab Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 3.png differ diff --git a/bambini77/Week_3/week3_img/Untitled 4.png b/bambini77/Week_3/week3_img/Untitled 4.png new file mode 100644 index 0000000..33bbdeb Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 4.png differ diff --git a/bambini77/Week_3/week3_img/Untitled 5.png b/bambini77/Week_3/week3_img/Untitled 5.png new file mode 100644 index 0000000..4b8e53c Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 5.png differ diff --git a/bambini77/Week_3/week3_img/Untitled 6.png b/bambini77/Week_3/week3_img/Untitled 6.png new file mode 100644 index 0000000..d2bde7e Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 6.png differ diff --git a/bambini77/Week_3/week3_img/Untitled 7.png b/bambini77/Week_3/week3_img/Untitled 7.png new file mode 100644 index 0000000..edcfdd7 Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 7.png differ diff --git a/bambini77/Week_3/week3_img/Untitled 8.png b/bambini77/Week_3/week3_img/Untitled 8.png new file mode 100644 index 0000000..d1ef99a Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 8.png differ diff --git a/bambini77/Week_3/week3_img/Untitled 9.png b/bambini77/Week_3/week3_img/Untitled 9.png new file mode 100644 index 0000000..b0b5c81 Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled 9.png differ diff --git a/bambini77/Week_3/week3_img/Untitled.png b/bambini77/Week_3/week3_img/Untitled.png new file mode 100644 index 0000000..c98bfbc Binary files /dev/null and b/bambini77/Week_3/week3_img/Untitled.png differ