연구 일지 - 0812
박현준 점털 뽑고싶다
Github: https://github.com/JHCHO98/NN-Geometry-Power-Analysis
연구 주제: 저전력 엣지 컴퓨팅을 위한 인공신경망 계층 구조의 기하학적 형상과 에너지 효율성 상관관계 연구
데이터 수집을 위해 모델 생성에서 크게 3가지를 구현했다.
오늘 작성한 내용은 FlexibleCNN.py를 참고하면 된다. 모두 거기에 구현되어 있다. 즉, 한 것이라고는 데이터 수집을 위한 구현 밖에 없는 날이다.
Channel Generator
Layer에 따른 Channel Sequence를 생성하는 함수이다.
Parameters
depth: 말 그대로 모델의 합성곱 층의 레이어 수를 결정한다. 범위는 2~6으로 정했다.
pattern: 말 그대로 합성곱 층의 추이를 결정한다. 자세한 내용은 아래 Pattern Types에 후술.
growth_pattern: 합성곱층의 2계도함수라고 생각하면 될 듯. 빠르게 변하는지, 천천히 변하는지 등등을 결정한다. 이것도 아래 Growth_Pattern에 후술.
noise: 같은 모델이 생성되지 않도록 낮은 비율로 noise를 추가한다. 후술.
Pattern Types
Uniform: 말 그대로 Layer에 따른 Channel의 수가 일정하다. 실세계에서는 거의 사용되지 않지만, 데이터 수집용으로 추가했다.
Increasing: Layer에 따른 Channel의 수가 증가한다. 보통 CNN을 구현할 때 실제로 많이 사용한다.
Decreasing: Layer에 따른 Channel의 수가 감소한다.
Hourglass: 모래시계 모양이다. 중간에 Channel 수가 감소했다가 다시 증가한다.
Inverse_Hourglass: 항아리 모양이다. 중간에 증가했다가 다시 감소한다.

Growth_Pattern
패턴과, 최대/최소값이 정해지면 성장 곡선의 형태가 정해진다. 사실 실제 모델 개발에서는 별로 신경쓰지 않지만, 데이터 수집을 위해 추가한 parameter이다.
Linear: 선형으로 증가/감소한다.
Early: y=√(x)와 같이 초반에 빠르게 증가하는 개형
Late: y=x²과 같이 후반에 빠르게 증가하는 개형

Noise
Pattern과 Growth_Pattern을 통해 생성하면, 모델은 하나로만 정해진다. 하지만 다양한 데이터 수집을 위해서는 여기에 노이즈를 첨가하여 모델의 풀을 늘릴 필요가 있다.
종류는 ±0%, ±5%, ±10%의 3가지로, 각 레이어별 채널 수에 적당한 노이즈를 부여한다. 만약 노이즈를 부여한 결과 Pattern의 규칙에 위배된다면, 다시 적당한 정렬을 통해 규칙을 유지한다.
Pooling Generator
Channel들 사이에 풀링을 끼워넣는 함수이다.
Parameters
depth: 위의 Channel Generator에서의 depth와 같은 의미이다.
pool_count: 풀링을 몇 회 진행할지에 관한 규약이다. 당연히 depth보다 작거나 같다.
두 파라미터를 통해 적당히 랜덤한 조합을 생성한다. 사실 경우의 수도 몇 개 없기에 특별히 적을만한 것은 없다. 다만 주목할 점이라면 한 Conv Layer 이후에 연속 2번의 Pooling은 막아 두었다. 실제라면 그냥 Pooling Window를 2배 키운 것과 같은 효과이기에 실제 모델에서도 아예 불가능한 상황은 아니지만, 이렇게 하면 나중에 회귀 분석을 진행할 때 "Pooling 강도"라는 새로운 parameter가 필요해지기 때문에, 배제하였다.
Random Config
위에서 정의한 두 함수들을 바탕으로 최종적으로 하나의 모델 구조를 반환하는 함수이다. 얘는 파라미터가 좀 많다.
Parameters
depth: 합성곱 층 개수
pattern: 위에 있던 uniform, increasing 등등 그런 것들
growth_pattern: 아까 있던 linear, early, late
noise_ratio: 아까 있던 ±0%, ±5%, ±10%
pool_count: 아까 있던 거
아래 파라미터들의 자세한 내용은 후술한다.
seed
min_channel_lower, min_channel_upper
max_channel_limit
min_parameters, max_parameters
max_attempts
seed
random을 적용할 때 사용할 시드. 함수 실행할때 master_rng = random.Random(seed)로 추후에 이 모델 생성에 사용할 모든 rng를 하나로 통일한다. 아래 파라미터 설명에서 말하는 랜덤은 모두 이 master_rng로 생성한 것이라고 보면 된다.
min_channel_lower, min_channel_upper
모델의 최소 채널 수(= min_channels)를 [min_channel_lower, min_channel_upper]에서 임의의 정수로 정한다.
max_channel_limit
모델의 최대 채널 수(= max_channels)를 [min_channels, max_channel_limit]에서 임의의 정수로 정한다.
min_parameters, max_parameters
모델이 너무 커지거나 작아서 의미 없는 데이터가 되지 않도록 적당한 범위를 설정한다. 이 연구에서는 5,000~2,000,000이다.
max_attempts
위의 조건들을 바탕으로 Channel Generator와 Pooling Generator를 실행하게 된다. 하지만 파라미터 제약 조건에 맞지 않을 경우 다시 실행하는데, 이때 최대 횟수가 곧 max_attempt이다. 즉, 적당히 시도해보고 안되는 것 같으면 끝내는 것이다. 이 연구에서는 1,000을 사용한다.
마치며
적다 보니 내용이 엄청나게 길어졌지만, 별거 없다. 그냥 이 함수 3개면 모델을 무한정 만들어낼 수 있다. 데이터 야호!