딥러닝

[Deep Learning from Scratch] 8. 딥러닝

PKkomi 2023. 6. 26. 16:14

드디어 책의 마지막 장이다.

한동안 바빠서 책을 마무리하지 못해 슬펐다..

이번 장에서는 새로운 내용을 배운다기보다는 유용한 딥러닝 모델에 어떤 것이 있는지, 어떤 이유로 딥러닝이 주목받는지 등을 알아본다.

 

 


우리가 자주 사용했던 MNIST 데이터셋은 알고리즘의 정확도를 비교하기 위한 공개된 데이터셋이다.

순위를 확인해보면 Neural Network를 이용한 모델들이 순위권에 위치해있다.

상위 기법들을 참고해보면 Ensemble, learning rate reduction, data augmentation 등의 기법을 활용하여 정확도를 올린 것을 알 수 있다.

 

이중에서 data augmentation(데이터 확장)은 기존 데이터의 수가 적을 때 효과적인데, 입력 이미지를 회전 또는 이동시켜 데이터를 '인위적으로' 확장시키는 기법이다. 어려운 기법이 아니므로 지금까지 했던 내용을 바탕으로 직접 구현할 수 있다.

 

또한 신경망의 층의 깊이가 알고리즘의 정확도와 비례한다.

깊은 층의 이점 중 하나는 신경망의 매개변수 수가 줄어든다는 것이다.

5X5 필터를 이용하면 25개(5X5)의 매개변수가 필요하다. 하지만 3X3 필터를 두 개 사용하면 같은 크기의 결과를 얻는데 18개(2X3X3)의 매개변수만 필요하다.

5X5 합성곱연산의 예
2개의 3X3 합성곱 연산의 예

 

필터의 크기가 커질수록 여러 개의 작은 필터로 층을 나누면 매개변수의 수가 더 효율적으로 줄어든다는 것을 알 수 있다.

또한 층을 나누면 층마다 ReLU 등의 활성화 함수를 적용하여 신경망의 표현력이 더욱 향상될 수 있다. 활성화 함수가 비선형의 영향을 끼치면서 겹쳐진 비선형 함수들이 더욱 강한 표현력을 가질 수 있다.

 

또한 층을 따라 정보가 계층적으로(hierarchically) 전달될 수 있다. 층을 깊게 함으로써 층마다 표현하는 구조가 생기고, 구분하고자 하는 전체를 표현하는 것보다 층마다 나눠서 표현하기 때문에 더욱 효율적으로 학습이 가능하다.

 


이미지넷이라는 데이터셋이 존재한다. 이는 MNIST 데이터셋보다 더욱 큰 100만장 이상의 데이터를 가진 오픈 데이터셋이다.

이중에서 분류 부문에서는 1000개의 클래스를 분류하는 항목이 존재한다.

매년 알고리즘의 순위를 매기는데 2012년 AlexNet 이후로 선두는 대부분 딥러닝 방식이었다.

 

VGG는 Pooling 계층을 2~4회 연속으로 사용하는 방식을 사용하며 간단하면서도 효율적이다.

GoogLeNet은 약간 특이한 구조를 가지는데, 세로 방향 뿐만 아니라 가로 방향으로도 깊이를 가진다.

가로 방향의 폭을 '인셉션 구조'라고 하며 다음과 같은 모양을 가진다.

GoogLeNet의 인셉션 구조

 

이 구조는 크기가 다른 필터(와 풀링)를 여러 개 적용하여 그 결과를 결합한다. 그리고 이를 하나의 구성요소로 사용하여 전체 구조를 형성하는 것이 GoogLeNet이다. 

또한 이 신경망의 특징은 1X1 필터를 사용한 합성곱계층을 많이 사용하여 채널 쪽으로 크기를 줄이고, 매개변수 제거와 고속처리에 기여한다.

 

ResNet(Residual Network)은 층이 너무 깊으면 오히려 성능이 떨어지고 비효율적이게 되는 문제를 해결하기 위해

'skip connection(스킵 연결)'이라는 방식을 도입한다.

기존의 방식과는 다르게, 입력 데이터를 합성곱 계층을 건너뛰어 출력에 바로 더하는 구조를 사용한다.

weight layer는 합성곱 계층을 말한다.

기존의 방식에서는 두 합성곱 계층의 출력이 F(X)가 되나, 스킵 연결로 인해 출력이 F(X) + X가 되는 것이 핵심이다.

이는 역전파 때 스킵 연결이 신호 감쇠를 막아줘 층이 깊어질수록 학습이 효율적이게 만들어준다.

아무런 수정이 가해지지 않은 입력 데이터 x가 출력에 포함됨으로써 기울기가 지나치게 작아지거나 커지는 것을 방지하여 의미있는 기울기를 얻을 것이라 기대할 수 있다. 층이 깊어질수록 기울기가 작아져 소실되는 기존의 방식을 보완한 것이다.

하지만 이 방식 역시 여전히 층을 깊게 하는데 있어 한계는 존재한다.

 

추가로, 이미지넷이 제공하는 거대한 데이터셋을 이용하여 얻은 가중치 파라미터들을 실제 제품이나 다른 데이터에 활용하기도 한다. 실제로 효과적이며 많이 사용되고 있다. 이를 전이 학습(transfer learning)이라고 하며, 학습된 가중치 전체 혹은 일부를 다른 신경망에 복사해 초깃값으로 설정한 후, 그 상태로 재학습한다. 이 방법은 특히 보유한 데이터셋이 적을 때 유용하다.

 

 


딥러닝에서는 앞 장들에서 말했듯이, 대량의 단일-곱셈 누산이라는 방식을 사용하기 때문에 이를 어떻게 효율적으로 처리하느냐에 따라 딥러닝의 속도가 달라진다. 컴퓨터의 CPU는 복잡한 연산을 효율적으로 처리하는 반면, GPU는 단순한 계산에 대해 대량 병렬 연산에 특화되어 있다. 이로 인해 최근 딥러닝 프레임워크에서는 모두 GPU 연산을 사용한다. 

 

이를 통해 큰 폭의 연산 속도 향상이 있었지만, 여전히 딥러닝은 데이터를 학습하는데 많은 시간을 필요로 한다. 이를 해결하기 위해 분산 학습이라는 방식이 있다. 여러 개의 기기를 연결하여 대량의 GPU를 통해 데이터를 나눠서 학습하는 방식이다. 텐서플로와 같은 프레임워크에 이러한 모듈이 구현되어 있으며, 매우 어려운 문제들이 존재하기 때문에 이를 사용하는 것이 좋다. 내용을 자세히 알고 싶다면 텐서플로 기술 논문을 참조할 수 있다

 

계산 능력뿐만 아니라 메모리 용량과 버스 대역폭 등이 딥러닝 고속화에 병목이 될 수 잇다. 대량의 가중치 매개변수와 중간 데이터를 메모리에 저장하다보면 GPU의 한계를 넘어서 병목이 발생할 수 있다. 다행히도, 신경망은 데이터에 존재하는 어느정도의 노이즈에도 강건한 모습을 보여, 데이터의 비트 수를 줄여서 용량을 줄이는 방식을 사용하더라도 정확도가 쉽게 떨어지지 않는다. 이 때문에 데이터의 비트수를 줄이는 방식 역시 다양하게 연구되고 있다.

 

 

 


현재 딥러닝은 사물 검출, 분할(segmentation), 사진 캡션 생성 등의 분야에 사용되고 있다.

사물 검출은 이미지 속에 담긴 사물의 위치와 종류(클래스)를 알아내는 기술이다. R-CNN, Faster R-CNN 등의 기벙이 사용된다.

분할은 이미지를 픽셀 수준에서 분류하는 문제다. supervised data를 사용하여 입력 이미지의 모든 픽셀을 분류한다. FCN이라는 기법이 사용된다.

사진 캡션 생성은 사진이 주어지면 그 사진을 설명하는 글을 출력하는 문제다. NIC(Neutral Image Caption) 모델이 대표적이며 CNN과 RNN을 합성하여 만든 모델이다.

 

 

딥러닝을 사용한 한 가지 특이한 활용 방식에 강화학습(reinforcement learning)이 존재한다.

이는 정답이 주어진 데이터를 학습하는 지도학습 혹은 비지도학습과는 조금 다른 형식이다.

'에이전트'라는 것이 환경에 맞게 행동을 선택하고, 그 행동에 의해 환경이 변한다는 게 기본적인 틀이다. 환경이 변화화면 에이전트는 어떠한 보상을 얻는데, 더 나은 보상을 얻는 것이 강화학습의 목적이다.

강화학습의 기본 틀

 

강화학습은 불명확한 상황에서 명확한 지표로부터 역산하여 '예상 보상'을 정한다. 이를 통해 더 나은 보상을 얻는 방향으로 학습을 진행한다.

그 유명한 알파고에도 딥러닝과 강화학습이 이용되었다는 것을 통해 이 기술이 얼마나 큰 잠재력을 지니는지 알 수 있다.

 

 


마침내 책의 모든 장을 다루었다.

생각보다 오랜 시간이 걸렸지만, 그동안 알게 된 것을 잘 활용하여 다양한 프로젝트를 시도해보도록 하겠다.