
보이지 않는 것을 보는 힘: 복잡한 AI 모델을 직관적으로 이해하는 법
풀링포레스트 CTO 송찬영이 전하는 AI 모델의 직관적 이해법. Convolution, Padding, Stride 등 기본 원리의 시각화가 엔지니어링에 미치는 영향을 다룹니다.
송찬영
CTO

안녕하세요. 풀링포레스트 CTO 송찬영입니다.
기술 리더로서 조직을 이끌다 보면, 때로는 최첨단 논문보다 '기본기'에 대한 목마름을 더 강하게 느낄 때가 있습니다. 특히 AI 분야는 하루가 다르게 새로운 모델이 쏟아져 나오지만, 그 기저에 깔린 작동 원리는 놀라울 정도로 변하지 않는 견고한 수학적 토대 위에 서 있습니다. 하지만 솔직히 고백하자면, 저 역시 수많은 행렬 연산과 차원의 변화를 머릿속으로만 그려내다가 막막함을 느꼈던 순간이 한두 번이 아니었습니다.
개발자들이 흔히 겪는 '차원 불일치(Dimension Mismatch)' 오류나, 모델 성능이 예상보다 나오지 않을 때의 원인을 파헤쳐보면 의외로 아주 기초적인 연산 과정에서의 오해에서 비롯된 경우가 많습니다.
최근 팀원들과 기술 세미나를 준비하며 'Animated AI'라는 흥미로운 프로젝트를 접하게 되었습니다. 신경망(Neural Network)의 핵심 연산 과정을 시각화한 자료들인데, 단순히 예쁜 애니메이션을 넘어 엔지니어링 관점에서 시사하는 바가 매우 컸기에 오늘 그 이야기를 조금 나누어보려 합니다.
블랙박스를 연다는 것의 의미
우리는 흔히 딥러닝 모델을 '블랙박스'라고 부릅니다. 데이터가 들어가서 결과가 나오지만, 그 중간 과정이 너무 복잡해 직관적으로 이해하기 어렵기 때문입니다. 하지만 엔지니어라면 이 블랙박스 안을 들여다보려는 시도를 멈춰서는 안 됩니다.
가장 기본이 되는 Convolution(합성곱) 연산을 예로 들어보겠습니다. 단순히 "커널이 이미지를 훑으며 특징을 추출한다"라고 텍스트로 외우는 것과, 픽셀 위를 지나가는 커널의 움직임을 시각적으로 확인하는 것은 천지 차이입니다.
특히 Padding과 Stride의 개념은 실제 모델 최적화 과정에서 매우 중요합니다. 많은 주니어 개발자들이 패딩(Padding)을 단순히 '이미지 크기를 맞추기 위한 꼼수' 정도로 여기곤 합니다. 하지만 시각화된 자료를 보면, 패딩이 없을 때(Valid) 외곽 정보가 어떻게 소실되는지, 반대로 패딩을 주었을 때(Same) 가장자리의 특징이 어떻게 보존되는지 명확히 알 수 있습니다. 이는 곧 모델이 데이터의 경계선 정보를 얼마나 중요하게 다룰지를 결정하는 설계의 핵심이 됩니다.
Stride 또한 마찬가지입니다. Stride를 1로 설정했을 때와 2로 설정했을 때, 연산량이 어떻게 줄어들고 정보가 어떻게 압축되는지 눈으로 확인하면, 모델 경량화나 리소스 효율화를 고민할 때 훨씬 더 날카로운 직관을 가질 수 있습니다.

효율성을 향한 집착: Group과 Depthwise
풀링포레스트에서도 최근 모바일이나 엣지 디바이스에서의 AI 구동을 위한 최적화 작업에 많은 공을 들이고 있습니다. 이때 필수적으로 등장하는 것이 바로 Groups, Depthwise, Depthwise-Separable Convolution입니다.
일반적인 Convolution 연산은 채널 간의 모든 관계를 계산하기 때문에 파라미터 수가 기하급수적으로 늘어납니다. 하지만 채널을 그룹으로 묶거나(Groups), 각 채널을 별도로 연산(Depthwise)한 뒤 합치는 방식을 사용하면 연산량을 획기적으로 줄일 수 있습니다.
이 복잡한 과정을 머릿속으로만 상상하면 헷갈리기 쉽습니다. 하지만 애니메이션을 통해 채널들이 어떻게 분리되어 연산되고 다시 합쳐지는지를 보면, 왜 MobileNet 같은 경량화 모델들이 이 방식을 채택했는지, 그리고 그 과정에서 우리가 포기해야 할 정보(Trade-off)는 무엇인지가 명확해집니다. 기술적 의사결정은 이런 명확한 이해 위에서 이루어져야 합니다. 단순히 "남들이 쓰니까 좋다더라"가 아니라, "우리 서비스는 연산 속도가 중요하니 Depthwise 방식을 도입하되, 정확도 손실을 보정할 방법을 찾자"는 식의 논리가 필요합니다.
해상도를 다루는 기술: Pixel Shuffle
마지막으로 인상 깊었던 것은 Pixel Shuffle에 대한 시각화였습니다. 저해상도 이미지를 고해상도로 변환하는 초해상도(Super Resolution) 기술에서 자주 쓰이는 기법입니다.
단순히 픽셀 수를 늘리는 것이 아니라, 채널(Depth) 방향에 있는 정보들을 평면(Spatial)으로 재배치하여 해상도를 높이는 이 과정은 말로 설명하기 참 난해합니다. 하지만 시각적으로 데이터를 'Shuffle' 하고 'Unshuffle' 하는 과정을 보면, 데이터의 형태(Shape)를 조작하는 것이 곧 정보의 표현 방식을 바꾸는 것임을 깨닫게 됩니다.
기본으로 돌아가십시오
풀링포레스트 팀원들에게 제가 자주 하는 말이 있습니다. "도구를 쓰되, 도구에 매몰되지 말자."
PyTorch나 TensorFlow 같은 프레임워크는 Conv2d 함수 한 줄로 이 모든 복잡한 연산을 처리해 줍니다. 정말 편리한 세상입니다. 하지만 그 편리함에 취해 내부에서 어떤 일이 일어나는지 잊어버린다면, 우리는 영원히 'API 사용자'에 머무를 수밖에 없습니다.
문제가 생겼을 때, 혹은 한계에 부딪혔을 때 돌파구는 언제나 '기본 원리'에 있습니다. 오늘 소개한 개념들을 다시 한번 짚어보며, 여러분이 작성하고 있는 코드의 행렬들이 실제로 어떻게 춤추고 있는지 상상해 보시길 권합니다. 보이지 않던 데이터의 흐름이 보이기 시작할 때, 비로소 우리는 진짜 엔지니어링을 시작할 수 있습니다.
단단한 기본기 위에 혁신을 쌓아 올리는 것, 그것이 우리 개발자들이 지향해야 할 방향이라 믿습니다.


