음악 분류 딥러닝을 만들자(22) - Nas-search space 구현

응큼한포도·2024년 8월 23일
0

Nas 구현

mobileNetv3와 mobileNetv4는 각각 Nas 알고리즘중에서 Mnas, Tunas를 이용한 구현체를 사용한다.

mobileNetv3에서 mnas구현체를 이용해서 구한 아키텍처에 NetAdapt를 적용하여 경량화를 이끌어낸다.

이 시리즈의 목적이 단순히 구현체를 써서 모델에 넣고 학습시키는 것 이라면 그냥 나도 구현체를 쓰고 간단히 끝내겠지만 이 시리즈의 목적은 그게 아니다.

이 시리즈는 원리를 이해하고 직접 구현함으로써 종국엔 내 맘대로 커스텀하는게 목적이다.

따라서 Nas를 이해하고 직접 구현할 것 이다.

내가 이해한 바가 맞다면 Nas는 본인의 환경에 최적화된 아키텍처를 자동으로 찾는 과정이다. 그렇다면 Mnas의 구현체를 이용한다는 것은 결국 구글의 좋은 환경에 맞춰 구현된 결과물이란 것 이다.

물론 mobileNetv3나 Mnas에서도 사용자가 직접 사용하는 기기에서 latency와 accuracy를 측정하여 파인튜닝을 하지만 내 생각엔 처음부터 사용자 기기에서 최적화를 하는 것이 효율적이라고 생각한다.

이런 이유로 Nas를 직접 구현하고 이해하여 나중에는 다양한 nas를 이용해서 결과를 비교하거나 내가 직접 만든 nas 알고리즘을 실험해보는 과정을 거치겠다.

잡소리가 길었는데 오늘은 Nas에서 가장 중요한 search space를 구현해보자.

search space

Mnas 논문에서 나온 search space를 기준으로 일단 구현하겠다.

search space가 왜 중요한가?

Nas의 과정은 search space에서 랜덤으로 선택한 파라미터로 레이어와 블럭을 구성하고 trainer를 이용해 학습, 직접 정의한 reward를 통해 최적화 하는 과정을 반복한다. 이 과정을 통해 최적의 아키텍처를 자동으로 찾는 것이 Nas의 목표고

search space가 중요한 이유도 단순하다. Nas는 search space에서 정해진 값들의 조합을 비교하는 과정이기 때문

애초에 좋지 못한 search space를 구성한다면 결과값도 최악일 수 밖에 없다. 따라서 좋은 search space를 구성하는 게 중요하다

Mnas의 search space의 레시피는 다음과 같다

우선 우리가 구현에서 주목할 점은 skeletons다. 하나의 블럭을 구성하는 기본이 저 skeletons다. 계속해서 레시피를 살펴보자.

우리가 구현해야 될 레시피는 위와 같다. 구현해보면

class SearchSpace:
    def __init__(self):
        self.conv_ops = ['conv', 'dconv', 'mbconv']  # Convolution operations
        self.kernel_sizes = [3, 5]  # Kernel sizes
        self.se_ratios = [0, 0.25]  # Squeeze-and-Excitation ratios
        self.skip_ops = ['none', 'identity', 'pool']  # Skip operations
        self.filter_sizes = [0.75, 1.0, 1.25]  # Filter sizes
        self.num_layers = [-1, 0, 1]  # Number of layers per block

    def get_search_space(self):
        """
        Returns the complete search space as a dictionary of lists.
        """
        return {
            'ConvOp': self.conv_ops,
            'KernelSize': self.kernel_sizes,
            'SERatio': self.se_ratios,
            'SkipOp': self.skip_ops,
            'FilterSize': self.filter_sizes,
            'NumLayers': self.num_layers
        }

위 클래스를 이용해 다음 시간엔 block를 만드는법을 구현하겠다

profile
미친 취준생

0개의 댓글