---
title: "MobileNet을 이해하기 위한 모든것"
url: https://agwo2.dev/MobileNet
author: "채은우 (Eunwoo Chae)"
date: 2025-09-23
tags: ["ML", "면접준비"]
summary: "MobileNet을 어디서부터 이해해볼까?!"
---

# MobileNet을 이해하기 위한 모든것

## 들어가는 말

해당 블로그는 면접준비를 하는 겸 MobileNet을 알고 있는 대로 정리해보는 글이다.

혹시나 MobileNet이 무엇인지 궁금해하는 사람도 있을 거 같아서 면접준비겸 CNN 내용부터 필수적인 것들만 집고 넘어가는 느낌으로 글을 써보았는데, 혹시나 도움이 되었으면 좋겠다.

아래서는 FNN, Convolution, CNN(with Forward & Backward propagation), Depth-wise Separable Convolution 등에 해당하는 내용을 다루어볼 예정이다.

## MobileNet이란?

기존 CNN에 비해서 매개변수의 수와 계산에 필요한 자원을 크게 줄인 CNN이라고 생각하면 된다. 때문에 우리의 휴대폰이나 노트북 같은 제한된 환경에서도 효율적으로 동작이 가능하다. 그렇다면 어떻게 그게 가능했던 것일까? 바로 Depthwise Separable Convolution을 이용했기 때문인데, 이는 먼저 쉽게 말해보면 기존의 CNN에서는 한 번에 복잡한 연산을 진행하던 것을 차원을 분리해서 진행하므로서 전체 계산량을 줄이는 방식이다. 자 이제 MobileNet이 기존의 CNN이라는 것보다 제한된 환경에서도 돌릴 수 있는 경량 아키텍쳐라는 것은 감이 왔을 것이다. 이제부터는 제대로 한 번 알아가보자.

![Fig1. 온디바이스에서 다양한 인식 작업에 적용될 수 있는 MobileNet](https://www.notion.so/image/attachment%3Afa0a8514-2baa-4bb1-b89f-e8655a29bb02%3A%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-23_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_2.15.59.png?table=block&id=277379b3-360f-80d4-b459-cf1cd196978c)

## 사전지식

### FNN

사실 MobileNet에 대해서 공부하려면 그 전신인 CNN과 또 CNN의 전신인 FNN에 대해서 알아볼 필요가 있다. 먼저 FNN이란 Fully-connected Neural Networks으로 한 layer의 모든 node가 다른 layer의 모든 node에 연결되어 있는 구조의 신경망을 말한다. 이런 신경망은 초기에 이미지를 처리해보고자 하는 시도가 있을때 아래 이미지와 같은 2차원의 이미지를 1차원으로 평탄화하여 입력 layer에 넣은 방식으로 사용되곤 했다. 그러나 3차원(가로, 세로, 색상) 정보를 그냥 1차원으로 평탄화하다보니 이미지의 본질적인 의미가 소실되고, 한 layer의 모든 node가 또 다른 layer의 모든 node에 연결되다 보니 막대한 양의 매개변수를 갖게된다는 문제가 있었다.

![Fig.2 이미지 평탄화와 FNN](https://www.notion.so/image/attachment%3Afe984d7f-f540-4a85-8b43-390aada90f11%3A%E1%84%86%E1%85%A9%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%AF_%E1%84%82%E1%85%A6%E1%86%BA_(MobileNet)_%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%85%E1%85%B5_%E1%84%86%E1%85%B5%E1%86%BE_%E1%84%80%E1%85%AE%E1%84%92%E1%85%A7%E1%86%AB.jpeg?table=block&id=275379b3-360f-80af-b96a-d58a3aa8f20a)

### CNN

그래서 등장한 것이 바로 CNN이다. 이 CNN의 장점은 기존 이미지가 가지는 본질적인 의미를 보존할 수 있게 해준다는 것이다. 입력된 이미지와 이미지의 특징을 알아볼 있도록 하는 일종의 filter를 Convolution과 Pooling하면서 나중에는 이미지 분류 등을 할 수 있게 만든 신경망 구조라고 생각하면 된다. 이때 필수적으로 Convolution과 Pooling의 경우 아래 설명과 같다.

![Fig.3 대표적인 CNN인 LeNet-5의 아키텍처](https://www.notion.so/image/attachment%3A13617328-455b-4335-9739-4337105a6f8f%3A1AxSYBoE_XlGe_XeUQ-COdw-1.webp?table=block&id=275379b3-360f-8086-b121-cb72c52cd503)

#### Convolution

합성곱 연산이라고도 부르는 Convolution은 정말 말 그대로 곱하고 합하는 연산이다. 아래와 같이 입력데이터가 주어지면 이에 대해서 filter를 통해 왼쪽에서 오른쪽, 위에서 아래로 stride씩 이동하면서 filter에 있는 값과 입력데이터를 곱하고 해당 값들을 모두 더해서 출력 데이터를 만들어내는 과정을 진행한다. 이때 stride는 filter를 이동시키는 간격이라고 생각하면 되고, 그렇게 해서 만들어진 출력 데이터를 feature map이라고 부른다. 

![Fig.4 Convolution 과정](https://www.notion.so/image/attachment%3A0683d488-783d-448f-b7ad-7499c6e817d4%3AJPEG_image-4CC9-9C93-14-0.jpeg?table=block&id=275379b3-360f-80e5-b0e0-de062003e32f)

또한 Convolution을 한 출력 데이터의 크기를 산정하는 방법은 다음 식과 같은데, 여기서 Padding이란 만약 stride를 크게 설정하는 경우 출력 데이터의 크기(높이x너비)가 작아질 수도 있으므로 이를 방지하기 위해서 기존 입력데이터 주위로 0과 같은 일정한 채널들을 채워넣는 것을 말한다. Fig.5을 참고하면 된다.

$$
(출력데이터\ 높이 또는 너비)=\frac{(입력데이터\ 높이또는너비)+2(Padding\ 크기)-(필터\ 높이또는너비)}{stride\ 크기}+1
$$

![Fig.5 Padding 시각화](https://www.notion.so/image/attachment%3Aee156f47-d881-4689-aa2b-9c1b9002fb86%3Apadding.png?table=block&id=275379b3-360f-80ef-8eff-fa94257caec4)

#### Pooling

출력 데이터의 크기를 줄이거나 특정 객체가 이미지에서 위치 이동을 하더라도 이 영향을 덜 받을 수 있도록 만들어주는 연산이다. Pooling의 종류로는 pooling 크기에서 가장 큰 값만을 취하는 Max-pooling, 평균값을 취하는 Average-pooling, 가장 작은 값을 취하는 Min-pooling이 있는데, 주로 이미지 안 객체 인식 분야에서는 Max-pooling이 사용된다. 또한 앞서 언급한 stride의 경우 pooling에서는 pooling 크기를 의미한다.

![Fig.5 Max-pooling](https://www.notion.so/image/attachment%3A2df4576c-7c83-49dc-907b-2050079f023b%3AJPEG_image-47AF-AF35-DA-0.jpeg?table=block&id=275379b3-360f-8090-9127-d42fbc71ec0d)

또한 객체가 이미지 안에서 이동하더라도 이 영향을 덜어준다는 것은 아래 Fig.6를 참고하면 이해할 수 있다.

![Fig.6 객체가 이미지 안에서 이동하더라도 이 영향을 덜어주는 location invariance 예시](https://www.notion.so/image/attachment%3A4c31068a-3166-459f-8cf6-e05d02989484%3AJPEG_image-4D8D-8CA1-1D-0.jpeg?table=block&id=275379b3-360f-8046-9454-c8270dd21a6d)

마지막으로 Pooling을 진행한 경우 출력되는 데이터의 크기도 아래와 같은 식을 통해 계산할 수 있다.

$$
(출력데이터\ 가로또는세로크기)=\frac{(입력데이터\ 가로또는세로크기)}{Pooling\ 크기(=stride)}
$$

### CNN의 학습과정

그렇다면 앞선 convolution이나 pooling을 가지는 CNN은 어떻게 학습을 진행할까? 우리는 익히 모델을 학습하는 과정에서 손실함수를 만들어 실제 정답과 모델의 예측값을 비교하고 이를 바탕으로 모델의 가중치를 제어함으로서 모델을 학습한다고 알고 있다. 그리고 CNN에서는 이러한 가중치를 제어함에 있어서 초반에는 굉장한 문제가 있었다. 이미지를 다루다보니 연산량이 매우 방대했는데, 이를 단순히 모델을 실행하고 결과를 바탕으로 모든 모델의 가중치를 조정하는 것은 거의 불가능에 가까웠기 때문이다. 하지만 불가능이란 없는 법 1980년대에 이미 나왔던 개념인 오차 역전파 BackPropagation을 적용해 해당 문제를 해결해낸다. 이 방식은 ChainRule을 이용하여 모델의 결과부터 첫 layer의 가중치까지를 거꾸로 학습해 나가는 방식으로 이를 이용하면 방대한 양의 연산 없이도 CNN 모델을 학습할 수 있다. 아래는 해당 과정을 단일 과정의 CNN을 예시로 들어서 수식으로 나타낸 것이다. 또한 그 아래는 오차 역전파에서 핵심적으로 사용되는 연쇄법칙 ChainRule에 대한 수학적 증명이다.

#### 오차 역전파(Back Propagation)

![](https://www.notion.so/image/attachment%3Afb144b94-9518-41d7-b579-64a2ab5c8356%3AIMG_9716.jpeg?table=block&id=277379b3-360f-8082-876c-e329298332cd)

![](https://www.notion.so/image/attachment%3Af5999160-adaf-4938-99b8-30fa70de320b%3AIMG_9717.jpeg?table=block&id=277379b3-360f-80ec-8f9a-ca2935cabd40)

![Fig.7 오차 역전파를 통한 GD까지의 유도 과정](https://www.notion.so/image/attachment%3A1d7df2f8-aea9-4955-ad63-c530192af88b%3AIMG_9718.jpeg?table=block&id=277379b3-360f-804f-92be-c9a3bd19da40)

오차 역전파 과정에서 구해진 기울기는 추후 이미지 가장 아래 있는 것처럼 경사 하강법 Gradient Descent를 통해 직접 모델의 가중치를 업데이트 하는 과정을 거치게 된다. Gradient Descent에 대한 내용은 아래 블로그를 참고하면 좋을 듯하다. [https://angeloyeo.github.io/2020/08/16/gradient_descent.html](https://angeloyeo.github.io/2020/08/16/gradient_descent.html)

#### 연쇄법칙 ChainRule 증명

![Fig.8 연쇄법칙 ChainRule 증명과정](https://www.notion.so/image/attachment%3Ac8976560-9298-4a88-a4e6-dea6a2ea5f5b%3AJPEG_image-4B87-9D80-15-0.jpeg?table=block&id=276379b3-360f-8076-afa9-fcead9478ed5)

사실 이미 자명하게 성립하니 굳이 이렇게 증명할 필요까지는 없지만 혹시나 ChainRule에 대해 궁금해 할수도 있고, 내가 다시 보는 과정에서 증명이 기억이 안날수도 있으니 첨부한다.

## 그렇다면 CNN보다 MobileNet은 무엇이 좋은가?

이제 사전지식에 대한 공부는 끝났다. 본격적으로 MobileNet에 대해서 알아볼 것이다. 앞선 블로그 글의 도입부에서 MobileNet는 기존 합성곱 신경망의 복잡한 연산을 나누어서 진행함으로서 제한된 환경에서도 동작할 수 있다고 말한바 있다. 지금부터는 복잡한 연산을 나누어서 진행한다는 것이 무슨 의미인지 알아보자.

### Depthwise Separable Convolution

나누어서 진행하는 것의 핵심적인 역할을 하는 것은 바로 입력 데이터에서 같은 깊의의 채널별 합성곱과 그렇게 해서 나온 결과값에 대해 각각의 채널별 모든 깊이의 값들간의 합성곱이다. 조금 더 이해를 돕기 위해 아래 이미지를 볼 수 있는데, 왼쪽에 있는 일반적인 합성곱 연산의 경우 $D_F \times D_F \times M$인 3차원 데이터에 대해서 바로 합성곱으로 처리하지만 오른쪽에 있는 Depthwise Separable 합성곱의 경우 $D_F \times D_F \times 1$ 크기를 가지는 $M$개의 채널별로 각각 $D_K \times D_K \times 1$ 크기 필터와 Depthwise Convolution을 진행한다. 그리고 그 결과값(⇒ 크기는 앞서 CNN 파트에서 언급한 출력데이터 크기 공식을 통해 구할 수 있음)에 대해서는 각각 서로 다른 특성을 학습할 수 있는 $N$개의 $1 \times 1 \times M$ 크기 필터와 Pointwise Convolution을 진행하여 최종 결과값(⇒ 크기는 앞서 CNN 파트에서 언급한 출력데이터 크기 공식을 통해 구할 수 있음)을 얻을 수 있다.

![Fig.9 왼쪽은 일반적인 합성곱 연산 과정, 오른쪽은 Depthwise Separable 합성곱 연산 과정](https://www.notion.so/image/attachment%3A12dacdca-5bc8-4911-8ae0-507e493b39d0%3AJPEG_image-4309-BF1A-29-0.jpeg?table=block&id=277379b3-360f-80ce-8c8b-da209c87af9e)

### 계산비용의 효율화

자자자 이제 거의 다왔다. 이제는 드디어 왜 Depthwise와 Pointwise의 두 단계를 가지는 Depthwise Separable Convolution가 일반적인 합성곱 연산보다 좋은지를 말할 차례이다. 이는 바로 제한된 환경에서도 돌아가기 수월할 정도로 기존보다 계산에 들어가는 비용이 낮기 때문이다. 먼저 일반적인 합성곱 연산의 경우 계산 비용은 다음과 같이 나타낼 수 있다.

$$
D_K⋅D_K⋅M⋅N⋅D_F⋅D_F
$$

3차원을 한 번에 계산하다보니 굉장히 값이 큰 것을 알 수 있다. 반면의 두 가지 과정을 나누어서 진행하는 Depthwise Separable Convolution의 아래와 같이 효율적인 계산 비용을 가진다는 것을 확인할 수 있다.

$$
D_K⋅D_K⋅M⋅D_F⋅D_F+M⋅N⋅D_F⋅D_F
$$

결국 두 연산 비용을 비교해보면 아래와 같고, MobileNet 논문의 표현을 인용하자면 일반적인 합성곱보다 약 8~9배 정도의 적은 계산량으로 비슷한 수준의 모델을 만들 수 있다고 한다.

$$
\frac{D_K⋅D_K⋅M⋅D_F⋅D_F+M⋅N⋅D_F⋅D_F}{D_K⋅D_K⋅M⋅N⋅D_F⋅D_F}= \frac{1}{N}+\frac{1}{D_k^2}
$$

그렇기 때문에 우리는 Depthwise Separable Convolution을 이용하는 MobileNet을 통해 휴대폰과 태블릿과 같은 매우 제한된 환경에서도 안정적으로 Face Recognition과 같은 이미지 처리를 수행할 수 있게된 것이다.

## 끝인사

지금까지 면접준비를 하는 겸 MobileNet에 대해서 꼬리질문 받드시 이것저것 한 번 정리해보았다. 그렇기에 각각의 내용만을 전문적으로 다룬 블로그에 비해서는 내용이 조금은 빈약할 수도 있을 것이다. 그 경우 아래 참고문헌 링크를 남겨두었으니 참고하길 바라며, 혹시나 오류가 있는 경우에는 아래 댓글을 통해 알려주면 적극적으로 수정하도록 하겠다.

## 참고문헌

1. [https://arxiv.org/pdf/1704.04861](https://arxiv.org/pdf/1704.04861)
2. [https://yjjo.tistory.com/9](https://yjjo.tistory.com/9)
3. [https://seeyapangpang.tistory.com/14](https://seeyapangpang.tistory.com/14)
4. [https://angeloyeo.github.io/2020/08/16/gradient_descent.html](https://angeloyeo.github.io/2020/08/16/gradient_descent.html)
5. [https://gooopy.tistory.com/55](https://gooopy.tistory.com/55)
6. [https://gooopy.tistory.com/69](https://gooopy.tistory.com/69)
7. [https://nittaku.tistory.com/271](https://nittaku.tistory.com/271)
8. [https://ko.wikipedia.org/wiki/편미분](https://ko.wikipedia.org/wiki/%ED%8E%B8%EB%AF%B8%EB%B6%84)
9. [https://ctkim.tistory.com/entry/모바일-넷](https://ctkim.tistory.com/entry/%EB%AA%A8%EB%B0%94%EC%9D%BC-%EB%84%B7)
10. [https://towardsdatascience.com/the-history-of-convolutional-neural-networks-for-image-classification-1989-today-5ea8a5c5fe20/](https://towardsdatascience.com/the-history-of-convolutional-neural-networks-for-image-classification-1989-today-5ea8a5c5fe20/)
11. [https://www.baeldung.com/cs/deep-neural-networks-padding](https://www.baeldung.com/cs/deep-neural-networks-padding)
12. [https://velog.io/@woojinn8/CNN-Network-1.-LeNet](https://velog.io/@woojinn8/CNN-Network-1.-LeNet)
13. [https://www.paepper.com/blog/posts/depthwise-separable-convolutions-in-pytorch/](https://www.paepper.com/blog/posts/depthwise-separable-convolutions-in-pytorch/)

---
출처: https://agwo2.dev/MobileNet
