페이지

2022년 7월 23일 토요일

3.4.3 신경망 모델 만들기

 입력 데이터가 벡터고 레이블은 스칼라(1 또는 0)입니다. 아마 앞으로 볼 수 있는 문제 중에서 가장 간단할 것입니다. 이런 문제에 잘 작동하는 네트워크 종류는 relu활성화 함수를 사용한 완전 연결 층(즉 Dense(16, activation='relu'))을 그냥 쌓은 것입니다.

Dense 층에 전달한 매개변수(16)은 은닉 유닛(hidden unit)의 개수입니다. 하나의 은닉 유닛은 층이 나타내는 표현 공간에서 하나의 차원이 됩니다. 2장에 relu 활성화 함수를 사용한 Dense층을 다음 텐서 연산을 연결하여 구현했습니다.

output = relu(dot(W, input)  + b)

16개의 은닉 유닛이 있다는 것을 가중치 행렬 W의 크기라 (input_dimension, 16)이라는 뜻입니다. 입력 데이터와 W를 점곱하면 입력 데이터가 16차원으로 표현된 공간으로 투영됩니다(그리고 편향 벡터 b를 더하고 relu 연산을 적용합니다). 표현 공간의 차원을 '신경망이 내재된 표현을 학습할 때 가질 수 있는 자유도'로 이해할 수 있습니다. 은닉 유닛을 늘리면(표현 공간을 더 고차원으로 만들면) 신경망이 더욱 복잡한 표현을 학습할 수 있지만 계산 비용이 커지고 원하지 않는 패턴을 학습할 수도 있습니다(훈련 데이터에서는 성능이 향상되지만 테스트 데이터에서는 그렇지 않은 패턴입니다.).

1) 얼마나 많은 츠을 사용할 것인가?

2) 각 츧에 얼마나 많은 은닉 유닛을 둘 것인가?

4장에서 이런 결정을 하는 데 도움이 되는 일반적인 원리를 배웁니다. 당분간은 필자를 믿고 선택한 다음 구조를 따라 주세요

1) 16;개의 은닉 유닛을 가진 2개의 은닛 층

2) 현재 리뷰의 감정을 스칼라 값의 예측으로 출력하는 세 번째 층

중간에 있는 은닉 층은 활성화 함수로  relu를 사용하고 마지막 층은 확률(0과 1사이의 점수로, 어떤 샘플의 타깃 '1'일 가능성이 높다는 것은 그 리뷰가 긍정일 가능성이 높다는 것을 의미합니다)을 출력하기 위해 시그모이드 활성화 함수를 사용합니다. relu는 음수를 0으로 만드는 함수입니다, 시그모이드는 임의의 값을 [0, 1]사이로 압축하므로 출력 값을 확률처럼 해석할 수 있습니다.

    from keras import models

    from keras import layers

    model = models.Sequential()

    model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))

    model.add(layers.Dense(16, activation='relu'))

    model.add(layers.Dense(1, activation='sigmoid'))

활성화 함수가 무엇인가요? 왜 필요한가요?

relu와 같은 활성화 함수(또는 non-linearity)라고도 부릅니다)가 없다면 Dense 층은 선형적인 연산인 점곱과 덧셈 2개로 구성됩니다.

output = dot(W, input) + b

그러므로 이 층은 입력에 대한 선형 변환(아핀 변환)만을 학습할 수 있습니다. 이 층의 가설 공간은 입력 데이터를 16차원의 공간으로 바꾸는 가능한 모든 선형 변환의 집합니다. 이런 가설 공간은 매우 제약이 많으며, 선형 층을 깊게 쌓아도 여전히 하나의 선형 연산이기 때문에 층을 여러 개로 구성하는 장점이 없습니다. 즉 층을 추가해도 가설공간이 확정되지 않습니다.

가설 공간을 풍부하게 만들어 층을 깊게 만드는 장점을 살리기 위해서는 비선형성 또는 활성화 함수를 추가해야 합니다. relu는 딥러닝에서 가장 인기 있는 활성화 함수입니다. 이름은 조금 이상하지만 prelu, elu등 비슷한 다른 함수들도 많습니다.


마지막으로 손실 함수와 옵티마이저를 선택해야 합니다. 이진 분류 문제고 신경망의 출력이 확률이기 때문에(네트워크의 끝에 시그모이드 활성화 함수를 사용한 하나의 유닛으로 된 층을 놓았습니다), binary_crossentropy 손실이 적합합니다. 이 함수가 유일한 선택은 아니고 mean_squared_error도 사용할 수 있습니다. 확률을 출력하는 모델을 사용할 때는 크로스 엔트로피가 최선의 선택입니다. 크로스엔트로피(Crossentropy)는 정보 이론(Information Theory) 분야에서 온 개념으로 확률 분포 간의 차이를 측정합니다. 여기에서는 원본 분포와 예측 분포 사이를 측정합니다.

다음은 rmsprop 옵티마이저와 binary_crossentropy손실 함수로 모델을 설정하는 단계입니다. 훈련하는 동안 정확도를 사용하여 모니터링하겠습니다.

    model.compile(optimizer='rmsprop',

                    loss='binary_crossentropy',

                    metrics=['accuracy'])

케라스에 rmsprop, binary_crossentropy, accuracy가 포함되어 있기 때문에 옵티마이저, 손실 함수, 측정 지표를 문자열로 지정하는 것이 가능합니다. 이따금 옵티마이저의 매개변수를 바꾸거나 자신만의 손실 함수, 측정 함수를 전달해야 할 경우가 있습니다. 전자의 경우에는 코드 3-5와 같이 옵티마이저 파이썬 클래슬르 사용해서 객체를 직접 만들어 optimizer 매개변수에 전달하면 됩니다. 후자의 경우는 코드 3-6과 같이 loss와 metrics 매개변수에 함수 객체를 전달하면 됩니다.

    from keras import optimizers

    model. compile(optimizer=optimizers.RMSprop(lr=0.001),

                                    loss='binary_crossentropy',

                                    metrics=['accuracy'])


    from keras import losses

    from keras import metrics

    model.compile(optimizer=optimizers.RMSprop(lr=0.001),

                                    loss = losses.binary_crossentropy,

                                    metrics=[metrics.binary_accuracy])


댓글 없음: