본문 바로가기

머신러닝, 딥러닝

혼자 공부하는 머신러닝+딥러닝 6주차

인공 신경망
생물학적 뉴런에서 영감을 받아 만든 머신러닝 알고리즘입니다. 신경망은 기존의 머신러닝 알고리즘으로 다루기 어려웠던 이미지, 음성, 텍스트 분야에서 뛰어난 성능을 발휘하면서 크게 주목받고 있습니다. 인공 신경망 알고리즘을 종종 딥러닝이라고도 부릅니다.

밀집층 Dense


가장 간단한 인공 신경망의 층입니다. 뉴런들이 모두 연결되어 있기 때문에 완전 연결층Fully Connected Layer라고도 부릅니다. 특별히 출력층에 밀집층을 사용할 때는 분류하려는 클래스와 동일한 개수의 뉴런을 사용합니다.
입력층과 출력층 사이에 있는 모든 층을 은닉층hidden layer이라고 부릅니다. 


원-핫 인코딩

해당하는 값만 1로 남기고 나머지는 모두 0으로 변환


정수값을 배열에서 해당 정수 위치의 원소만 1이고 나머지는 모두 0으로 변환합니다. 
이런 변환이 필요한 이유는 다중 분류에서 출력층에서 만든 확률과 크로스 엔트로피 손실을 계산하기 위해서입니다. 
텐서플로에서 'sparse_categorical_entropy' 손실을 지정하면 이런 변환을 수행할 필요가 없습니다. 

 

[기본 미션]

1. 어떤 인공 신경망의 입력 특성이 100개고 밀집층에 있는 뉴런 개수가 10개일 때 필요한 모델 파라미터의 개수는 몇 개인가요?

입력 특성이 100개고 밀집층에 있는 뉴런 개수가 10개라면, 100개의 입력 특성과 10개의 뉴런이 연결되므로 1000개의 가중치가 있습니다. 뉴런 개수만큼 bias 가 더해지기 때문에, 총 파라미터의 개수는 1,010개 입니다.

2. 케라스의 Dense 클래스를 사용해 신경망의 출력층을 만들려고 합니다. 이 신경망이 이진 분류 모델이라면 activation 매개변수에 어떤 활성화 함수를 지정해야 하나요?
-> 이진분류 모델에서는 sigmoid 함수를 활성화 함수로 사용하고, 다중 분류 모델에서는 softmax 함수를 활성화 함수로 사용합니다. 

3. 케라스 모델에서 손실 함수와 측정 지표 등을 측정하는 메서드는 무엇인가요?

model.compile(optimizer="Adam", loss="mse", metrics=["mae"])


4. 정수 레이블을 타깃으로 가지는 다중 분류 문제일 때 케라스 모델의 compile() 메서드에 지정할 손실 함수로 적절한 것은 무엇인가요?
-> 텐서플로에서는 정수로 된 타깃값을 원-핫 인코딩으로 바꾸지 않고 그냥 사용할 수 있습니다. 정수로 된 타깃값을 사용해 크로스 엔트로피 손실을 계산하는 것이 바로 'sparse_categorical_crossentrophy'입니다. 

 


은닉층

layer와 layer 사이의 연결이 가중치를 곱해서 빽빽하기 때문에 Dense!


입력층과 출력층 사이에 밀집층이 추가되었을 때, 입력층과 출력층 사이에 있는 모든 층을 은닉층hidden layer라고 부릅니다. 신경망에서 은닉층이 나름의 역할을 할 수 있도록 활성화 함수를 추가해 신경망 층의 선형 방정식의 계산 값에 적용하는데요, 은닉층의 활성화 함수는 대표적으로 sigmoid, relu 함수가 있습니다. 

model = keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))

첫번째 덴스 레이어는 은닉층이고, 100개의 뉴런을 가졌습니다. 두 번쨰 덴스 레이어는 10개의 뉴런을 가졌네요.
은닉층의 뉴런은 적어도 출력층의 뉴런보다는 많아야 합니다.
신경망은 분류해야 하는 클래스의 개수에 대한 확률을 예측해야 하므로, 이전 은닉층의 뉴런 개수가 출력층보다 적으면 부족한 정보가 전달될 것입니다. 

인공신경망의 강력한 성능은 층을 추가하여, 입력 데이터에 대해 연속적인 학습을 진행하는 능력에서 나옵니다. 

덴스 레이어의 모델의 출력 크기를 보면 (None, 100) 입니다. 첫번쨰 차원은 샘플의 개수를 나타내는데, 샘플의 개수가 아직 정의되어 있지 않기 때문에 None입니다. 
케라스의 fit() 메서드에 훈련 데이터를 주입하면 이 데이터를 한번에 모두 사용하지 않고 잘게 나누어 여러 번에 걸쳐 미니배치 경사 하강법을 사용하는데, 기본 미니배치 크기는 32입니다. 
샘플 개수를 고정하지 않고 어떤 배치 크기에도 유연하게 대응할 수 있도록 None으로 설정한 것입니다. 
이렇게 신경망 층에 입력되거나 출력되는 배열의 첫 번째 차원을 배치 차원이라고 부릅니다.

sgd = keras.optimizers.SGD(learning_rate=0.1)
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics='accuracy')
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)

위의 두 코드는 컴파일 메서드의 파라미터로 경사 하강법 알고리즘인 optimizer를 변경하는데요, 케라스의 기본 경사 하강법 알고리즘은 RMSprop입니다. 

확률적 경사 하강법 SGD(Stocastic Gradient Discent)는가장 기본적인 옵티마이저로, 미니배치를 사용하여 데이터를 훈련합니다. (원래의 SGD는 샘플을 1개만 뽑아 훈련하는 것을 말합니다)

optimizer중 momentum 매개변수를 0보다 큰 값으로 지정하면 마치 이전의 그레이디언트를 가속도처럼 사용하는 모멘텀 최적화를 사용합니다. 
Nestrov momentum은 모멘텀 최적화를 2번 반복해서 구현하는 것으로, SGD보다 성능이 더 낫습니다.

모델이 최적점에 가까이 갈수록 학습률을 낮출 수 있는데요, 모델이 안정적으로 최적점에 수렴할 수 있도록 학습률을 낮추는 것을 적응적 학습률이라고 합니다. 적응적 학습률을 사용하는 모델로는 Adagrad와 RMSprop이 있는데요, 
모멘텀 최적화와 RMSprop의 장점을 접목한 것이 Adam optimizer 입니다. 

 

[선택 미션]

1. 올바른 모델의 add() 사용법

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

2. 크기가 300 X 300인 입력을 케라스 층으로 펼치려면 Flatten 레이어를 사용해야 합니다.

3. 이미지 분류를 위해 심층망에 널리 사용되는 케라스의 활성화 함수로는 relu가 있습니다. 
relu는 입력이 양수일 경우 입력을 통과시키고 음수일 경우에는 0으로 만듭니다. 

4. 적응적 학습률을 사용하는 optimizer로는 Adagrad, RMSprop, Adam이 있습니다.