[부스트캠프 AI Tech] U-stage. 8-4

느린 개발자·2021년 3월 18일
1

부스트캠프 AI Tech

목록 보기
35/35
post-custom-banner

📌 Lightweight Modeling

대표적인 경량화 방법중 하나인 Quantization 에 대해 알아보도록 하고, 이를 이해하기 위해 필요한 기초적인 개념에 대해 살펴보도록 한다.


📄 Fixed Point vs Floating Point

컴퓨터는 01 로 이루어진 기계어로 표현된다. 그래서 우리가 사용하는 10진수를 2진수로 변환하여 컴퓨터가 이해할 수 있는 숫자로 표현할줄 알아야 한다. 정수(Integer)10진수 -> 2진수 변환은 익히 알고 있는데, 소수점이 포함된 실수(Real Number)는 어떻게 표현될까?

우선 소수부 변환 방식을 알아야 하는데 정수 변환 방법과는 반대로 변환하면 된다. 즉, 정수 10진수 -> 2진수 변환시 2로 나눠서 변환하였다면, 반대로 소수부는 2를 곱해서 변환한다. 구체적으로 0.625(10)0.625_{(10)} 를 2진수로 변환하는 과정은 다음과 같다.

0.6252=1.250.2510.252=0.50.500.52=1.00.01\begin{aligned} 0.625\ast\textcolor{blue}{2}&=\textcolor{red}{1}.25 \rightarrow 0.25 \cdots 1\\ 0.25\ast\textcolor{blue}{2}&=\textcolor{red}{0}.5 \rightarrow 0.5 \cdots 0\\ 0.5\ast\textcolor{blue}{2}&=\textcolor{red}{1}.0 \rightarrow 0.0 \cdots 1\\ \end{aligned}
0.625(10)=0.101(2)\therefore 0.625_{(10)}=0.101_{(2)}

✏️ Fixed Point

고정 소수점(Fixed Point) 표현 방식은 고정된 소수점을 기준으로 정수부, 소수부를 표현하는 것을 말한다. 위의 그림처럼 32-bit 체계를 쓴다고 가정한다면, 첫 비트는 부호를 결정하는 부호비트(Sign Bit)0 이면 양수 / 1 이면 음수 를 나타낸다. 나머지 비트들은 고정된 소수점을 기준으로 8-bit정수부(Integer Part) , 23-bit소수부(Fractional Part) 로 나뉘게 된다. 구체적으로 7.625(10)7.625_{(10)}를 고정 소수점으로 표현한다면 다음과 같다.

0 00000111 101000000000000\ \textcolor{gray}{00000}\textcolor{red}{111}\ \textcolor{blue}{101}\textcolor{gray}{00000000000}
  • Sign Bit : 양수이므로 0 으로 채운다.

  • Integer Part : 7(10)=111(2)7_{(10)}=\textcolor{red}{111}_{(2)} 이고 나머지 bit는 0 으로 채운다.

  • Fractional Part :0.625(10)=0.101(2)0.625_{(10)}=0.\textcolor{blue}{101}_{(2)} 이고 나머지 bit는 0 으로 채운다.$

고정 소수점 표현방식은 구현하기에는 편리하지만, 비트 수 대비 표현 가능한 수의 범위 또는 정밀도가 낮기 때문에 실수를 다룰 필요가 있는 범용 시스템에서는 거의 쓰이지 않고, 높은 정밀도가 필요 없는 소규모 시스템에서는 간혹 쓰이기도 한다고 한다.

✏️ Floating Point

부동 소수점(Floating Point) 표현 방식은 소수점이 고정되지 않고 좌우로 움직일 수 있도록 표현 하는것을 말한다. 위의 그림처럼 32-bit 체계를 따른다고 가정하면, IEEE 754 에 따르면 첫 비트는 부호를 결정하는 부호비트(Sign Bit)0 이면 양수 / 1 이면 음수 를 나타낸다. 나머지 비트들은 8-bit지수부(Exponent) , 23-bit가수부(Fraction/Mantissa) 로 나뉘게 된다. 그렇다면 지수부가수부는 무엇을 의미하는 것일까?

위에서 사용한 예제 7.625(10)=111.101(2)7.625_{(10)}={111.101_{(2)}} 를 사용하여 부동 소수점 방식으로 표현되는 과정을 살펴보도록 한다.

  1. 정규화 된 부동소수점 수

    여기서 말하는 정규화의 의미는 다음과 같이 1.???2n1.???\ast2^n 으로 표현하는 것을 말한다. 즉, 정수부에 1만 남을때까지 소수점을 좌 / 우로 소수점을 민다. 가령, 111.101(2){111.101_{(2)}} 를 정규화 하면 소수점을 왼쪽으로 밀어 1.11101(2)221.11101_{(2)}\ast2^2 를 얻게 된다. 주의할것은 만약 0.0011(2)0.0011_{(2)}를 정규화 한다면 소수점을 오른쪽으로 밀어 1.1(2)231.1_{(2)}\ast2^{-3} 로 정규화 한다.

  2. 가수부

    (1)번에서 얻은 정규화 된 부동 소수점 수 1.11101(2)221.11101_{(2)}\ast2^2 에서 가수부는 1.11101(2)1.11101_{(2)} 이다. 하지만 정규화 시 항상 정수부가 1 이 되도록 하기 때문에 소수점 이후의 부분 1.11101(2)1.\textcolor{blue}{11101}_{(2)} 만을 가수부에 표현한다. 이때 1Hidden Bit 라고 부르기도 한다 .

  1. 지수부

    (1)번에서의 예시처럼 지수의 부호는 양수 / 음수 의 값을 가질 수 있다.(부호 비트는 지수의 부호가 아닌 전체 숫자의 부호를 뜻하는 것이므로 혼동하지 않도록 한다.) 하지만 지수의 부호를 표현하기 위해 지수 부호비트를 새로 만드는것은 복잡한 일이다. 그래서 32-bit 체계를 기준으로 지수부가 8-bit로 표현 되므로 지수가 표현될수 있는 경우의 수 28=2562^8=256 를 양수, 음수로 나누어 0~126(00000000~01111110)음수(-127~-1) / 127(01111111)0 / 128~255(10000000~11111111)양수(1~128) 를 표현하도록 만든다. 구체적으로 (1)번에서 정규화된 부동 소수점 1.11101(2)221.11101_{(2)}\ast2^\textcolor{red}{2} 에서 지수는 2 이다. 이때 단순히 2=00000010(2)2=00000010_{(2)} 로 표현한다면 -125 를 의미하는 것이므로 bias=127 를 더한 2+127=129=10000001(2)2+127=129=\textcolor{red}{10000001}_{(2)} 를 지수부에 채운다.(만약 64-bit 체계라면 지수부는 11-bit , 가수부 는 52-bit 이다. 따라서 지수부는 211=20482^{11}=2048 를 표현할수 있기 때문에 bias=1023 이 된다.)

7.625(10)=111.101(2)7.625_{(10)}=111.101_{(2)} 를 부동 소수점으로 표현하는 과정을 다시 한번 정리하면 다음과 같다.

0 10000001 111010000000000000000000\ \textcolor{red}{10000001}\ \textcolor{blue}{11101}\textcolor{gray}{000000000000000000}
  • Sign Bit : 양수이므로 0 으로 채운다.

  • Exponent : 정규화된 부동 소수점 수 1.11101(2)221.{11101}_{(2)}\ast2^\textcolor{red}{2} 의 지수 부분 2bias=127 를 더해 2+127=129=10000001(2)2+127=129=\textcolor{red}{10000001}_{(2)} 를 지수부에 채운다.

  • Mantissa : 정규화된 부동 소수점 수 1.11101(2)221.\textcolor{blue}{11101}_{(2)}\ast2^2 의 소수점 오른쪽 부분을 채워넣고 나머지 bit는 0 으로 채운다.

부동소수점 표현 방식은 bias, 정규화 등 고정 소수점 표현 방식보다 복잡하지만 비트 수 대비 표현 가능한 수의 범위와 정밀도 측면에서 보다 우위에 있다.

✏️ Mini code

📄 Quantization


📚 Reference

Fixed Point vs Floating Point 1
Fixed Point vs Floating Point 2

profile
남들보단 느리지만, 끝을 향해
post-custom-banner

0개의 댓글