가중치 클러스터링 종합 가이드

View on TensorFlow.org Run in Google Colab View source on GitHub 노트북 다운로드하기

여기서는 TensorFlow 모델 최적화 도구 키트의 일부인 가중치 클러스터링에 대한 종합 가이드를 제공합니다.

이 페이지는 다양한 사용 사례를 문서화하고 각각에 대해 API를 사용하는 방법을 보여줍니다. 필요한 API를 알고 나면, API 문서에서 매개변수와 하위 수준의 세부 정보를 찾아보세요.

  • 가중치 클러스터링의 이점과 지원되는 기능을 보려면 개요를 참조하세요.
  • 단일 엔드 투 엔드 예는 가중치 클러스터링 예를 참조하세요.

이 가이드에서는 다음 사용 사례를 다룹니다.

  • 클러스터링된 모델을 정의합니다.
  • 클러스터링된 모델을 검사하고 역직렬화합니다.
  • 클러스터링된 모델의 정확성을 개선합니다.
  • 배포의 경우에만 압축의 이점을 확인하기 위한 단계를 취해야 합니다.

설정

! pip install -q tensorflow-model-optimization

import tensorflow as tf
import numpy as np
import tempfile
import os
import tensorflow_model_optimization as tfmot

input_dim = 20
output_dim = 20
x_train = np.random.randn(1, input_dim).astype(np.float32)
y_train = tf.keras.utils.to_categorical(np.random.randn(1), num_classes=output_dim)

def setup_model():
  model = tf.keras.Sequential([
      tf.keras.layers.Dense(input_dim, input_shape=[input_dim]),
      tf.keras.layers.Flatten()
  ])
  return model

def train_model(model):
  model.compile(
      loss=tf.keras.losses.categorical_crossentropy,
      optimizer='adam',
      metrics=['accuracy']
  )
  model.summary()
  model.fit(x_train, y_train)
  return model

def save_model_weights(model):
  _, pretrained_weights = tempfile.mkstemp('.h5')
  model.save_weights(pretrained_weights)
  return pretrained_weights

def setup_pretrained_weights():
  model= setup_model()
  model = train_model(model)
  pretrained_weights = save_model_weights(model)
  return pretrained_weights

def setup_pretrained_model():
  model = setup_model()
  pretrained_weights = setup_pretrained_weights()
  model.load_weights(pretrained_weights)
  return model

def save_model_file(model):
  _, keras_file = tempfile.mkstemp('.h5') 
  model.save(keras_file, include_optimizer=False)
  return keras_file

def get_gzipped_model_size(model):
  # It returns the size of the gzipped model in bytes.
  import os
  import zipfile

  keras_file = save_model_file(model)

  _, zipped_file = tempfile.mkstemp('.zip')
  with zipfile.ZipFile(zipped_file, 'w', compression=zipfile.ZIP_DEFLATED) as f:
    f.write(keras_file)
  return os.path.getsize(zipped_file)

setup_model()
pretrained_weights = setup_pretrained_weights()

클러스터링된 모델 정의하기

전체 모델 클러스터링(순차적 및 함수형)

모델 정확성 개선을 위한 :

  • 이 API에 수용 가능한 정확성으로 미리 훈련된 모델을 전달해야 합니다. 클러스터링을 사용하여 처음부터 모델을 훈련하면 정확성이 떨어집니다.
  • 경우에 따라, 특정 레이어를 클러스터링하면 모델 정확성에 부정적인 영향을 미칩니다. 정확성에 가장 큰 영향을 미치는 레이어 클러스터링을 건너뛰는 방법을 보려면 "일부 레이어 클러스터링"을 확인하세요.

모든 레이어를 클러스터링하려면 tfmot.clustering.keras.cluster_weights를 모델에 적용합니다.

import tensorflow_model_optimization as tfmot

cluster_weights = tfmot.clustering.keras.cluster_weights
CentroidInitialization = tfmot.clustering.keras.CentroidInitialization

clustering_params = {
  'number_of_clusters': 3,
  'cluster_centroids_init': CentroidInitialization.DENSITY_BASED
}

model = setup_model()
model.load_weights(pretrained_weights)

clustered_model = cluster_weights(model, **clustering_params)

clustered_model.summary()
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cluster_dense_2 (ClusterWeig (None, 20)                423       
_________________________________________________________________
cluster_flatten_2 (ClusterWe (None, 20)                0         
=================================================================
Total params: 423
Trainable params: 23
Non-trainable params: 400
_________________________________________________________________

일부 레이어 클러스터링(순차적 및 기능적 모델)

모델 정확성 개선을 위한 :

  • You must pass a pre-trained model with acceptable accuracy to this API. Training models from scratch with clustering results in subpar accuracy.
  • 초기 레이어와 달리 더 많은 중복 매개변수(예: tf.keras.layers.Dense, tf.keras.layers.Conv2D)를 가진 이후 레이어를 클러스터링합니다.
  • 미세 조정 중 클러스터링된 레이어 이전에 초기 레이어를 고정합니다. 고정된 레이어의 수를 하이퍼 매개변수로 취급합니다. 경험적으로, 대부분의 초기 레이어를 고정하는 것이 현재의 클러스터링 API에 이상적입니다.
  • 중요 레이어(예: 주의 메커니즘)의 클러스터링을 피합니다.

추가 정보: tfmot.clustering.keras.cluster_weights API 문서에서 레이어별로 클러스터링 구성을 변경하는 방법에 대한 세부 정보를 제공합니다.

# Create a base model
base_model = setup_model()
base_model.load_weights(pretrained_weights)

# Helper function uses `cluster_weights` to make only 
# the Dense layers train with clustering
def apply_clustering_to_dense(layer):
  if isinstance(layer, tf.keras.layers.Dense):
    return cluster_weights(layer, **clustering_params)
  return layer

# Use `tf.keras.models.clone_model` to apply `apply_clustering_to_dense` 
# to the layers of the model.
clustered_model = tf.keras.models.clone_model(
    base_model,
    clone_function=apply_clustering_to_dense,
)

clustered_model.summary()
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cluster_dense_3 (ClusterWeig (None, 20)                423       
_________________________________________________________________
flatten_3 (Flatten)          (None, 20)                0         
=================================================================
Total params: 423
Trainable params: 23
Non-trainable params: 400
_________________________________________________________________

클러스터링된 모델 검사 및 역직렬화하기

사용 사례: 이 코드는 HDF5 모델 형식에만 필요합니다(HDF5 가중치 또는 기타 형식은 해당되지 않음).

# Define the model.
base_model = setup_model()
base_model.load_weights(pretrained_weights)
clustered_model = cluster_weights(base_model, **clustering_params)

# Save or checkpoint the model.
_, keras_model_file = tempfile.mkstemp('.h5')
clustered_model.save(keras_model_file, include_optimizer=True)

# `cluster_scope` is needed for deserializing HDF5 models.
with tfmot.clustering.keras.cluster_scope():
  loaded_model = tf.keras.models.load_model(keras_model_file)

loaded_model.summary()
WARNING:tensorflow:No training configuration found in the save file, so the model was *not* compiled. Compile it manually.
Model: "sequential_4"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
cluster_dense_4 (ClusterWeig (None, 20)                423       
_________________________________________________________________
cluster_flatten_4 (ClusterWe (None, 20)                0         
=================================================================
Total params: 423
Trainable params: 23
Non-trainable params: 400
_________________________________________________________________

클러스터링된 모델의 정확성 개선하기

특정 사용 사례에 대해 고려할 수 있는 팁을 소개합니다.

  • 중심 초기화는 최종 최적화된 모델의 정확성에 중요한 역할을 합니다. 일반적으로, 선형 초기화는 큰 가중치를 놓치지 않는 경향이 있으므로 밀도 및 임의 초기화보다 성능이 우수합니다. 그러나, 밀도 초기화는 바이모달 분포가 있는 가중치에 클러스터를 거의 사용하지 않는 경우 더 나은 정확성을 제공하는 것으로 관찰되었습니다.

  • 클러스터링된 모델을 미세 조정할 때 훈련에 사용되는 학습률보다 낮은 학습률을 설정합니다.

  • 모델 정확성을 개선하기 위한 일반적인 아이디어를 얻으려면 "클러스터링된 모델 정의하기"에서 사용 사례에 대한 팁을 살펴보세요.

배포

크기 압축으로 모델 내보내기

일반적인 실수: 클러스터링의 압축 이점을 확인하려면 strip_clustering과 표준 압축 알고리즘(예: gzip 이용) 적용이 모두 필요합니다.

model = setup_model()
clustered_model = cluster_weights(model, **clustering_params)

clustered_model.compile(
    loss=tf.keras.losses.categorical_crossentropy,
    optimizer='adam',
    metrics=['accuracy']
)

clustered_model.fit(
    x_train,
    y_train
)

final_model = tfmot.clustering.keras.strip_clustering(clustered_model)

print("final model")
final_model.summary()

print("\n")
print("Size of gzipped clustered model without stripping: %.2f bytes" 
      % (get_gzipped_model_size(clustered_model)))
print("Size of gzipped clustered model with stripping: %.2f bytes" 
      % (get_gzipped_model_size(final_model)))
1/1 [==============================] - 0s 357ms/step - loss: 0.5564 - accuracy: 0.0000e+00
final model
Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_5 (Dense)              (None, 20)                420       
_________________________________________________________________
flatten_5 (Flatten)          (None, 20)                0         
=================================================================
Total params: 420
Trainable params: 420
Non-trainable params: 0
_________________________________________________________________


Size of gzipped clustered model without stripping: 1881.00 bytes
Size of gzipped clustered model with stripping: 1481.00 bytes