ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HandsOn]11. 심층 신경망 훈련하기 - 내용 정리 2
    [도서완독]Hands On Machine Learning 2022. 7. 6. 18:39

    11.2 사전훈련된 층 재사용하기 

    전이 학습(transfer learning)

    아주 큰 규모의 DNN을 처음부터 새로 훈련하는 것은 힘듬...

    비슷한 유형의 문제를 처리한 신경망이 이미 있는지 찾고, 그 신경망의 하위층을 재사용하는 것이 좋다.

    훈련 속도, 훈련 데이터의 양 면에서 좋음 

     

    이미지, 텍스트 데이터에 주로 쓰인다고 함!

     

    그럼 모든 DNN을 짤 때 신경망을 좀 서치하는 게 좋은건가?

    ❗요즘은 텐서플로 내부에 유명한 모델 구조는 다 패키지로 제공된다고 함. 단, 이미지 텍스트 데이터 한정...😂

    ❗ 정형 데이터는 적당히 dense 여러개 쌓으면 웬만하면 된다고 하는데...

     

    https://mldlcvmjw.tistory.com/238?category=938422

    원본 모델의 출력층 바꾸어야 함.

    원본 모델의 상위 은닉층은 하위 은닉층보다 덜 유용함. -> 재사용할 층 개수를 잘 선정하는 것이 필요(작업이 비슷할수록 더 많은 층 재사용)

     

    1. 재사용하는 층 모두 동결(훈련되지 않는 가중치로 만들기)
    2. 모델을 훈련하고 성능을 평가
    3. 맨 위에 있는 한두개의 은닉층 동결을 해제하고 가중치 조정하여 성능이 향상되는지 확인 
    4. 훈련 데이터가 많을수록 많은층의 동결 해제 가능(재사용 층의 동결을 해제 할 때는 학습률을 줄이는 것이 좋음)

     

    11.2.1 케라스를 사용한 전이 학습 

    8개의 패션 클래스를 분류하는 모델 A 
    2개의 패션 클래스를 분류하는 모델 B

    전이 학습을 이용해 확인해보자!

     

    모델 A를 로드하고 이 모델의 층을 기반으로 새로운 모델 model_B_on_A를 만듬

    model_A=keras.models.load_model("my_model_A.h5")
    model_B_on_A=keras.models.Sequential(model_A.layers[:-1])
    #출력층 제외하고 모든 층 재사용
    model_B_on_A.add(keras.layers.Dense(1,activation="sigmoid"))

    ❗모델 A와 모델B_on_A는 일부층 공유! -> 모델B_on_A를 훈련할 때 모델 A도 영향을 받음.

    이게 싫다면, 층을 재사용하기 전에 model_A를 클론!

     

    clone_model()로 모델A의 구조를 복제한 후 가중치를 복사(clone_model()메서드는 가중치 복제하지 않음)

    model_A_clone=keras.models.clone_model(model_A)
    model_A_clone.set_weights(model_A.get_weights())

    (뭔가 점점 어려움) 새로운 출력층이 랜덤하게 초기화 되어 있으므로, 적어도 처음 몇 에포크 동안은 큰 오차를 만들 수 있음. ▶ 큰 오차 그레이디언트가 재사용된 가중치 망칠 수 있음

    ▶ 처음 몇 번의 에포크 동안 재사용된 층을 동결하고, 새로운 층에게 적절한 가중치를 학습할 시간을 준다!

     

    모든 층의 trainable 속성을 False로 지정하고 모델을 컴파일

    ❗층을 동결하거나 해제한 후에는 반드시 모델 컴파일!

    for layer in model_B_on_A.layers[:-1]:
        layer.trainable = False
    
    model_B_on_A.compile(loss="binary_crossentropy",optimizer="sgd",
                        metrics=["accuracy"])

    몇번의 에포크 동안 모델을 훈련

    ▶재사용된 층의 동결을 해제

    ▶모델 다시 컴파일

    ▶B에 맞게, 재사용된 층을 세밀하게 튜닝하기 위해 훈련 (동결을 해제한 후에 학습률을 낮추는게 좋음)

     

    history=model_B_on_A.fit(X_train_B, y_train_B,epochs=4,
                            validation_data=(X_valid_B,y_valid_B))
    
    for layer in model_B_on_A.layers[:-1]:
        layer.trainable = True #동결 해제
    
    optimizer=keras.optimizers.SGD(lr=1e-4) #기본 학습률은 1e-2
    model_B_on_A.compile(loss="binary_crossentropy",optimizer=optimizer,
                        metrics=["accuracy"]) #다시 컴파일 
    history=model_B_on_A.fit(X_train_B,y_train_B,epochs=16,
                            validation_data=(X_valid_B,y_valid_B))

    ❗근데 모델의 테스트 정확도를 믿어선 안된다고 한다! 속임수가 있다고함~!

    사실 높은 성능을 가진 모델을 찾기까지 여러 설정을 시도했는데 교재에서 안 밝힌것임. 

    타깃 클래스나 랜덤 초기값을 바꾸면 성능이 떨어질것이다.....

    현란한 새 기술이 도움이 안될때가 많음....

     

    왜 그랬을까? 전이 학습은 작은 완전연결 네트워크에서는 잘 동작하지 않음

    작은 네트워크: 패턴수를 작게 학습, 완전 연결 네트워크: 특정 패턴을 학습 

    이런 패턴은 다른 작업에 유용하지 않다!

     

    전이 학습은 일반적인 특성을 감지하는 경향이 있는 심층 합성곱 신경망에서 잘 동작함.

    14장에서 전이 학습을 다시 살펴보자!

     

     

     

Designed by Tistory.