파이톨치

[BoostCamp AI Tech] Computer Vison Overview 본문

AI&ML/BoostCamp AI Tech

[BoostCamp AI Tech] Computer Vison Overview

파이톨치 2024. 8. 27. 18:59
728x90

Computer Vison

cv (computer vison)은 가장 수요가 높은 분야 중 하나이다. 

네이버 부스트캠프에서도 인원이 가장 많다. 또 응용할 수 있는 부분이 많다. (채용 공고도 많은 거 같다.)

그렇기 때문에, 여기부터는 조금 힘을 주어 정리해보려고 한다. 나에게 필요한 내용도 많고 재밌는 내용도 많다. 

이번엔 Overview인 만큼, 코드를 빼고 간단하게 보자. 

신경망 구조

바로, 본론으로 들어가보자. 

현대의 인공지능은 신경망 구조를 통해 돌아간다. 이미지를 숫자로 해석하고 이를 행렬곱 연산한다. 

이렇게 보면 굉장히 간단한 수학이다. 하지만 그 결과는 간단하지 않고 오히려 위대하다. 

 

한가지 재밌는 점은 저러한 가중치 또한 하나의 이미지 형태를 뛰기도 한다는 점이다. 

아래는 각각의 클래스에 대한 이미지 가중치를 시각화 한 것이다. 

말의 경우 실제 초원에 있는 말의 형태와 유사한 것을 볼 수 있다. (오른쪽 세번째가 말이다.) 

이러한 형태를 뛰는 이유는 평균적으로 저런 형태의 이미지가 많이 들어갔다고 생각될 수 있다. 

하지만, 반대로 말하면 저런 형태의 이미지가 아니면 모델 입장에서는 헷갈린다.  

왼쪽 이미지는 잘 학습하고 분류할 가능성이 높지만, 오른쪽 말은 모델이 모를 것이다. 

 

그렇기 때문에 데이터 증강 기법등을 사용하여 학습할 때에도 실제와 유사한 환경을 만들어주는 것이다. 

더 일반적이고 유연한 인공지능을 만들고 싶은 과학자들의 연구인 것이다. 

Convolution Neural Network (CNN 구조) 

또한, 일반적으로 우리가 생각하는 신경망을 Fully Connected Network라고 한다. 

이러한 모델은 가중치 연결이 너무나 많고, 위와 같은 이미지들에서 일반화를 잘 못하는 문제가 있었다. 

때문에 과학자들은 이것을 해결하기 위해서 Convolution Neural Network를 만들었다. 데이비드 허블과 토르스텐 비셀 할아버지님들이 1950년대에 개발했다. 엄청난 과거의 모델을 아직까지 사용한다는 것이 놀라울 따름이다. (허블 망원경이 생각난다.)

이것을 CNN이라고 부르는데, 지역적인 특징을 더 잘 학습하는 모델이다. 또한 FCN에 비해 가중치 연산도 적게 한다. 

 

최근의 CNN은 아래와 같이 발전해왔다. 1950년대에 개발된 것 치고는 꽤나 최근에 발전한 모양이다. 

CNN이 딥러닝에 적용된 것은 LeNet-5이라는 모델이라고 한다. 1998년에 개발되었다. 

이건 얀 르쿤이라는 유명한 할아버지가 만드셨다. (튜링 상 수상자이시다.) 

아래와 같은 구조인데, 최신 모델도 여기에 층만 추가한 것이다. 뭐든 최초는 의미가 있는 시도이다. 

AlexNet이라고 하는 것도 이것의 구조를 비슷하게 따른다. 

다른 것은 2개로 쪼개져 있는 것이 보이는데, 이것을 통해 GPU 병렬화 연산을 용이하게 했다고 한다. 

여기선 잘 안 보이는데, ReLU 활성화 함수와 Dropout (가중치를 일부 제거하는) 기법을 사용했다고 한다. 

학습 데이터는 유명한 ImageNet이다. (성능이 높아진 이유도 데이터의 개선도 있을 것이다.)  

Receptive field

알렉스 넷의 성능 개선이 확인 되면서 과학자들은 왜 이것이 좋았는지 연구를 했을 것이다. 

그 디자인 요소 중 하나는 Receptive field라는 개념이다. 이건 강의 들어도 잘 이해가 안 돼서 ChatGPT에게 물어보았다. (정말 공부하기 편한 세상에 살고 있다는 생각이 들었다.) 

(prompt) 컴퓨터 비전 분야에서 사용하는 Receptive field 개념을 알려줄 수 있어?
(chatgpt) Receptive field는 뉴런이 입력 이미지 상에서 '볼 수 있는' 영역을 의미합니다. 간단히 말해, CNN의 특정 레이어에서 각 뉴런이 입력 이미지의 어느 부분을 보는지를 결정하는 범위를 나타냅니다.

Receptive Field의 개념
Receptive field는 신경망의 각 뉴런이 입력 이미지의 어느 부분에 반응하는지를 결정하는 공간적인 영역입니다. 예를 들어, CNN의 첫 번째 합성곱 층(convolutional layer)에서는 작은 크기의 필터가 입력 이미지의 일부 패치에 적용됩니다. 이 필터의 크기(예: 3x3, 5x5 등)가 바로 receptive field의 크기를 결정합니다. 이 층의 각 뉴런은 필터가 적용된 입력 이미지의 작은 영역에만 반응합니다.

이러한 개념은 다음 레이어로 갈수록 점점 넓어집니다. 예를 들어, 첫 번째 레이어의 출력이 두 번째 레이어의 입력이 되면, 두 번째 레이어의 뉴런은 첫 번째 레이어의 출력으로부터 간접적으로 더 큰 영역의 입력 이미지를 감지하게 됩니다. 따라서 레이어가 깊어질수록 receptive field는 점점 더 커지며, 네트워크의 상위 레이어에서는 이미지의 더 넓은 부분(또는 전체)에 대한 정보를 통합하게 됩니다.

Receptive Field의 중요성
특징 추출: Receptive field는 CNN이 이미지의 어느 부분에서 특징을 추출하는지를 결정합니다. 작은 receptive field는 저수준의 특징(예: 엣지, 텍스처)을 추출하는 데 유용하며, 큰 receptive field는 고수준의 특징(예: 객체, 형태)을 추출하는 데 유용합니다.
객체 인식: 이미지에서 물체를 인식하려면 해당 객체를 덮을 수 있는 충분한 크기의 receptive field가 필요합니다. 따라서 모델의 깊이와 필터 크기를 적절히 설계하여 네트워크가 관심 있는 물체를 잘 인식할 수 있도록 해야 합니다.
정보 통합: 더 깊은 레이어의 뉴런들은 더 넓은 receptive field를 가지므로, 이미지를 더 큰 범위로 인식하고 다양한 정보를 통합하여 더 복잡한 특징을 학습할 수 있습니다.

 

다시 정리해보자면, 특정한 뉴런이 있을 때, 그 뉴런이 볼 수 있는 영역이다. 아래 그림과 같이 말이다. 얼마나 볼 수 있는지가 receptive field의 크기가 된다. 레이어가 지날 수록 이 영역은 점점 커진다. 또한 이것을 통해 영역의 특징을 추출하거나 객체 인식이 가능해 지는 것이다. 사람이 눈으로 세상을 보는 것과 얼핏 유사하다는 생각도 들었다.

 

과학자들의 다음 연구는 이러한 receptive field의 크기를 효과적으로 키우는 것이었다. 그렇게 해서 레이어를 점점 놓게 쌓게 되었고, 다음으로 VGG16과 VGG19가 나온 것이다. 뒤에 숫자가 레이어의 숫자이다. (하지만 의문은 필터의 크기를 키우면 안되나 하는 것이다.) -> 큰 필터를 사용하는 것보다 층을 깊게 쌓는 것이 효과적이면서 파라미터 수도 경량화가 가능했다고 한다. 또한 layer 사이에 활성함수 (non-linear 함수)도 많이 사용해서 학습을 더 잘하게 했다 한다. 

VGG16에서는 3x3 필터, 스트라이드 1로 고정했다. 이렇게 하면 디자인 패턴을 고정해서 실험을 하기 좋다고 한다. 하나의 블록을 정의하고 그 블록을 연결하는 식으로 코드가 짜여진다.  이렇게 해서 마지막에서 FCN을 넣어 다양한 작업에 적용시킨다.

Residual Network

19층 이후로는 그다지 성능적 이득을 보지 못해 VGG19까지 밖에 없다. 과학자들은 과적합을 의심했는데, 결과적으로 아니었다고 한다. 

마이크로소프트는 residual network를 통해 최적화를 해결했고 층을 늘려서 성능을 높였다. (굉장히 간단한 것들이 영향을 많이 주나 보다, 난해한 분야다...) 아래 보이는게 residual block이다. 간단히 층의 정보를 그대로 넘겨주는 것이다. 이것으로 문제를 해결했다. 

이것을 통해서 층이 길어지면서 생기는 기울기 소실 문제를 크게 완화할 수 있었다고 한다.

역전파 관점에서 생각해볼 때, relu 등을 통해서 기울기가 작아지긴 하지만 + 노드에서 값을 그대로 주기 때문이다. 

 

이 간단한 구조가 더 다양한 층의 조합으로 학습할 수 있다고 한다. 이건 좀 소름이다. 생각해보면 맞는 얘기인게, 값을 그대로 주면 0이 되어버리니까 층을 그냥 안 쓰게 될 수도 있는 것이다. 즉, 쓰고 안 쓰고 조합이 가능해진다. (이걸 알고 만들었을까...? 대박이네)

또한, 배치 정규화도 했다고 한다.  자세한 구조는 다음과 같다. 

마지막 박스 부분은 task에 따라 조금씩 바꾸어주면 될 것이다. 지금은 특징 추출을 위한 구조이다. 

아직까지 많이 사용하는 구조이다. 

Transformer

다음으로 등장하는 구조는 2017년에 나온 트랜스포머를 활용한 구조이다. 이를 Vision 분야에 적용하면 ViT라는 이름으로 나오게 된다. 

이 구조는 이미 많은 사람들이 알 것이라 생각된다. 기존의 순환적인 구조를 가지지 않고, Attention 구조만 가진다. 

이 구조는 들어온 단어의 hidden vector만 보고 연산하는 것이 아니라, 모든 단어의 관계를 보고 연산한다.

위에서 배운 개념을 차용하자면, receptive field가 전체 input에 모두 해당된다고 볼 수 있는 것이다. 

다만, K, Q, V가 무엇을 의미하는지는 맨날 헷갈린다. 우선, 내적을 한다는 것 자체가 벡터 간의 관계성을 보는 것이다.

먼저 Query 벡터와 Key 벡터를 내적하여 둘의 관계성을 본다. 이를 attention score라고 부르는데, 사실이게 중요한 값이다. 

내적후에 softmax를 취하기에 0~1 사이의 확률적인 값이 나오게 된다. 문장이 들어갔을 때, 특정한 단어와 특정한 단어 간의 중요도를 보는 것이다. 

 

아래 그림을 차근차근 보자. 문장이 단어로 쪼개지고 임베딩 층을 지나면 벡터가 된다. 이 벡터는 각각의 Q와 K로 만들어진다. 

이 Q, K를 모든 단어에 대해 만들어버린다. 그리고 Q와 K를 곱하면 단어 안에 있는 벡터 요소가 얼마나 유사한지 알게 된다. 

이것을 softmax를 통해 확률화 한다. 그럼 각각의 단어에 대한 확률값이 나온다. 

이것을 weight로 사용해서 value와 곱한다. 

 

이렇게 함으로써, I 라는 단어가 들어갔을 때, 집에가는 I 라는 의미를 지니는 벡터로 만들어주는 것이다. 

특징 중 하나는 헤드가 여러개 이기 때문에, 각 헤드 별로 문법적인 특징, 의미론적인 특징등을 학습하게 된다. 

 

이를 전체적인 구조로 보면 다음과 같다. 

디코더의 경우 masked 구조가 있다. self-attention을 할 때, 뒤쪽에 있는 단어를 마스킹해서 무시하게끔 만들어준다. 

중간의 멀티헤드는 인코더와 비슷해 보이지만, self-attention이 아닌 cross-attention으로 이루어져 있다. 

 

(user) self-attention과 cross-attention의 차이는?
(chatgpt) Self-Attention과 Cross-Attention은 주로 딥러닝 모델에서, 특히 Transformer 아키텍처에서 중요한 역할을 하는 두 가지 메커니즘입니다.
이 둘의 차이를 이해하려면 각각의 메커니즘이 무엇인지, 그리고 어떤 상황에서 사용되는지를 알아야 합니다.

1. Self-Attention
Self-Attention은 시퀀스 내의 모든 요소들이 서로 주의를 기울이도록 하는 메커니즘입니다. 이는 같은 시퀀스 내에서 중요한 정보를 학습하기 위해 사용됩니다.

Self-Attention의 주요 특징:
자기 자신에 대한 주의 (Self-Attention): 한 시퀀스의 모든 단어(또는 요소)가 그 시퀀스의 다른 모든 단어(요소)에 주의를 기울이는 방식입니다.

주로 사용하는 경우: 주로 NLP(Natural Language Processing)에서 텍스트의 맥락을 이해하거나, 같은 시퀀스 내에서 중요한 패턴을 학습하기 위해 사용됩니다. 예를 들어, "The cat sat on the mat"라는 문장에서, self-attention은 각 단어가 문장 내 다른 단어들과의 관계를 학습하는 데 사용됩니다.

동작 방식: Self-attention에서는 같은 시퀀스의 각 요소가 쿼리(query), 키(key), 밸류(value)로 변환됩니다. 그런 다음, 각 요소에 대해 쿼리와 다른 요소들의 키 사이의 내적(dot product)을 계산하여 주의도를 산출하고, 이를 이용해 가중합(weighted sum)을 구합니다. 이 결과는 각 요소의 컨텍스트를 반영한 새로운 표현을 생성합니다.

2. Cross-Attention
Cross-Attention은 두 개의 서로 다른 시퀀스 사이에서 주의 메커니즘을 적용하는 것입니다. 이는 한 시퀀스가 다른 시퀀스의 정보를 참조하고 학습하는 데 사용됩니다.

Cross-Attention의 주요 특징:
서로 다른 시퀀스에 대한 주의 (Cross-Attention): 한 시퀀스(주로 쿼리 시퀀스)가 다른 시퀀스(주로 키-밸류 시퀀스)에 주의를 기울이는 방식입니다.주로 사용하는 경우: 주로 두 개의 다른 시퀀스 간의 상관관계를 학습하기 위해 사용됩니다. 예를 들어, 기계 번역 작업에서 소스 언어 시퀀스와 타겟 언어 시퀀스 간의 관계를 학습하는 데 사용됩니다.

동작 방식: Cross-attention에서는 쿼리 시퀀스가 한 시퀀스에 속하고, 키와 밸류는 다른 시퀀스에 속합니다. 쿼리와 키 사이의 유사도를 계산하여 가중치를 얻고, 이 가중치를 다른 시퀀스의 밸류에 적용하여 최종 출력을 생성합니다.

 

ViT

위를 이해했으면 ViT는 구조적으로 크게 달라진 것은 없다.

 

트랜스포머를 이용해서 ViT를 만드는데, 한가지 다른 점은 단어가 아니라 패치 단위의 이미지가 들어간다는 점이다. 

이런 식으로 말이다. 트랜스포머 인코더를 self-attention을 해서 MLP(FCN) 층을 지나고, 분류 문제를 학습하게 된다. 

여기서 중요한 점은 패치 단위로 이미지를 잘라서 넣는다는 아이디어와 맨 앞에 들어가는 토큰이다. 

역사적으로는, 자연어 처리에서 트랜스포머의 성공이 선행됐다. 트랜스포머는 데이터를 많이 넣어줄수록 성능이 좋아지는 특징이 있기 때문에 이것을 vision 분야에도 적용해 본 결과이다. 결국, 다양하고 많은 데이터와 거대한 컴퓨터를 가진 자가 승리하는 싸움이 시작된 것이고, 엔비디아 주가가 폭등한 것이다. 

 

ViT도 효과적인 것이 입증 되었고, 그 후로 MAE, Swip ViT 등의 변형이 나오게 되었다. (생략) 

728x90