MLP 파라미터(param) 개수 자세히 알기 (feat. 케라스)
케라스(keras) 코드를 활용해 MLP 파라미터 개수에 대해서 살펴보려고 한다.
모델을 만들자
먼저 아래처럼 간단한 분류 모델을 만들었다.
import tensorflow as tf
from sklearn.datasets import load_iris
import numpy as np
iris_data = load_iris()
x = iris_data['data']
y = iris_data['target']
print(x.shape)
print(np.unique(y))
[출력결과]
x는 4개의 feature 를 가지고 있는 150개(row)의 데이터이고, y는 3개의 label을 가지고 있다.
이를 학습/분류 하기 위해서 아래같은 간단한 MLP(Multi Layer Perceptron) 모델을 만들었다
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(32, input_dim=x.shape[1]),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(16, activation='relu'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(len(np.unique(y)), activation='softmax')])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x, y, epochs=100, validation_split=0.2)
[출력결과]
학습후 모델 평가를 해보니 84%의 정확도가 나왔다. (편의상 train/test/eval 데이터셋은 나누지 않았다)
파라미터 개수 확인해보자
오늘 살펴볼 부분인 파라미터 개수를 확인해보자
keras 에서는 summary() 함수를 통해서 모델의 정보를 확인할 수 있다 (layer 개수, parameter 개수 등)
맨 처음 dense_3(Dense) Layer를 보면 제일 오른쪽에 Param #이 160 이다. 왜 그럴까?
일단, 결론부터 말하면, input_dim=4 이고, layer의 노드 개수가 32 개이므로, 4X32 + 32 = 160 이다.
4X32 + 32 = 160에 대해서 좀 더 자세히 알아보자.
dense_3(Dense) Layer는 결국 4개의 데이터가 들어와서 32개의 데이터로 나가야 한다.
행렬 연산으로 설명하자면 이런 모습이다.
- (1 X 4) X (? X ?) = (1 X 32)
행렬곱셉 조건에 의해서 이것이 가능하려면 (? X ?) 이 (4 X 32) 되어야 한다. (자세한 내용은 행렬곱셉 참고)
이것이 4X32 + 32 = 160 에서, 앞쪽 4X32 이다.
그렇다면 뒤쪽 + 32 는 무엇일까? 바로 32개 노드에 더해지는 상수이다.
전체를 정리하면 정리하면, 다음과 같다
- (각 Layer의 파라미터 개수) = (input_dim X 노드수 + 노드수)
이를 위에 summary 결과에 적용해보면 값이 일치함을 확인할 수 있다.
- dense_4: 160 = 4 X 32 + 32
- dense_5: 528 = 32 X 16 + 16
- dense_6: 51 = 16 X 3 + 3
파라미터 개수와 모델 size의 관계
파라미터 개수별 모델 size를 확인해보자. (dense_3, dense_5 의 unit수를 조정하면서 결과를 비교해봤다)
사이즈를 계산하는 여러가지 방법이 있지만, 가장 직관적인 방법으로 모델을 파일로 저장하고, 해당 파일의 크기를 확인해봤다.
편의상 과정은 생략하고 결과만 정리하면 아래와 같다.
노드수 | dense_3: 16 dense_5: 8 |
dense_3: 32 dense_5: 16 |
dense_3: 64 dense_5: 32 |
파라미터 개수 | 243 | 739 | 2499 |
파일 사이즈(byte) | 36416 | 43128 | 63640 |
모델에는 파라미터 외에 다양한 정보가 저장되어 있기 때문에,
완벽하게 비례 하지는 않지만, 거의 정비례한다 (33000 + 13 byte * param)