본문 바로가기

반응형

Machine Learning Models

(56)
Vision Transformer (1) Transformer 관련 포스트 Transformer Transformer 구현 Transformer Positional Encoding Transformer 모델은 발표 이후에 자연어 처리 (NLP) 분야에서의 새로운 기준이 되어 왔습니다. 자연스럽게 self-attention 개념을 컴퓨터 비젼 분야에 적용하려는 시도가 많았는데요, Vision Transformer (ViT) 등장 이전에는 convolution 구조와 함께 제한적으로 사용되었고 ResNet 계열 모델을 필두로 한 CNN 을 완벽하게 대체할 수는 없었습니다. 구글에서 발표한 Vision Transformer 모델은 convolution 구조를 완전히 배제하고 Transformer 모델과 비슷하게 순수한 self-attention 만을..
Transformer Positional Encoding Transformer 제가 Transformer 논문 "Attention Is All You Need" 를 읽을때마다 느끼는 점은 self-attention, multi-head attention 모두 좋지만 positional encoding 기법만큼은 직관적으로 이해하기 쉽지 않다는 점입니다. 물론 Transformer 자체에는 입력 시퀀스 위치에 대한 정보가 없으니 positional encoding 이 필요하다는 사실은 당연하나 논문에서는 매우 짧게 cosine / sine 함수로 이루어진 식만 제공합니다. 그렇다면 위의 식은 어떠한 이유로 유도가 되었을까요? 한 번 살펴보도록 하겠습니다. Positional encoding Positional encoding 이란 주어진 시퀀스에서 특정한 위치에..
Label Smoothing Multi-class 분류를 위한 cross entropy loss 에서 목적함수의 타겟으로 사용되는 라벨은 일반적으로 정확히 하나의 클래스만 명확히 표현하는 (one-hot vector) hard 라벨이 사용됩니다. Label smoothing 기법은 한 클래스가 전체를 모두 차지하는 hard 라벨을 정답 클래스의 비중을 약간 줄이고 나머지 클래스의 비중을 늘리는 soft 라벨로 변환하는 기법인데요, 처음에는 Inception 구조의 성능을 높이고자 도입되었고 간단한 정규화 방법으로 image classification, speech recognition, machine translation 분야에 Table 1에서 처럼 적극적으로 사용되고 있습니다. $K$개의 클래스에 대해서 라벨을 얼마만큼 부드럽게..
CutMix 이번 포스트에서 살펴볼 내용은 네이버 Clova 에서 발표한 CutMix 입니다. 그동안 이미지 기반 태스크의 성능을 끌어올리기 위해 Mixup, Cutout 등과 같은 다양한 data augmentation 기법이 제안되었는데요, 이 방법들은 이미지에서 일부분을 잘라내서 0으로 채우거나 (Cutout) 다른 이미지와 겹침으로서 CNN 으로 하여금 이미지의 덜 중요한 부분까지 (사람으로 치면 머리가 아닌 다리) 포커싱하게 만드는 regional dropout 전략이라고 볼 수 있습니다. 하지만 Table 1에서 보다시피 Cutout 은 이미지의 일부분을 아예 삭제하여 정보 손실을 유발하고 Mixup 은 다른 이미지와 interpolate 함으로서 이미지 정보가 왜곡되어 버리는 현상이 발생합니다. CutM..
Mish 비선형 활성화 함수는 deep neuarl networks 설계에 필수적인 요소입니다. 초창기에는 sigmoid, tanh 같은 함수가 주로 사용되었지만 bounded 되어있는 특성상 gradient 포화현상이 발생하여 현재는 ReLU 함수가 거의 대부분의 (특히, CNN 계열의) neural networks 에서 대표적인 비선형 활성화 함수로 사용되고 있습니다. ReLU (Rectified Linear Unit) 은 sigmoid, tanh 함수에 비해 일반화 성능 및 수렴 속도가 좋다고 알려져 있지만 만능의 함수는 아닙니다. ReLU 의 대표적인 문제로는 dying ReLU 로서 이는 ReLU 함수 자체가 음수값을 아예 0으로 만들어버리기 때문에 값이 한번 음수가 되버리면 그 부분에 대해서는 기울기 ..
Pytorch - autograd 정의 Pytorch 에서는 어떠한 기능을 하는 블록 혹은 함수에 대해 forward() / backward() 를 "torch.autograd" 모듈로 새롭게 정의할 수 있습니다. 이는 "torch.autograd.Function" 클래스를 상속하여 "@staticmethod" 를 이용하여 입력에 대한 함수의 동작을 forward() 함수에, 함수 출력에 대한 기울기를 받아 입력에 대한 기울기를 계산하는 backward() 함수를 새롭게 정의합니다. Example Legendre polynomial $y=a+bP_3 (c+dx)$ 에서 $P_3=\frac{1}{2}(5x^3-3x)$의 Legendre 3차 다항식이라고 가정하겠습니다. $P_3$ 함수에 대한 forward / backward 는 "torch.a..
Pytorch - gather 이번 포스트에서는 Pytorch gather 함수를 알아보도록 하겠습니다. gather 함수는 scatter 함수와 정반대로 동작하는 함수로 주어진 "input" 텐서에서 "dim", "index" 에 맞게 값을 모아주는 역할을 합니다. torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor gather 함수는 "input" 텐서에서 "dim", "index" 에 해당하는 요소값으로 새로운 텐서를 구성합니다. 3차원 텐서에 대해서 다음과 같이 동작합니다. scatter 함수와 반대 동작인 것을 알 수 있습니다. out[i][j][k] = input[index[i][j][k]][j][k] # if dim == 0 out[i][j][..
Pytorch - scatter Pytorch 에는 새롭게 구성한 텐서에 원하는 인덱스에 맞게 값을 할당해주는 scatter 함수가 존재합니다. (Tensorflow 에도 존재합니다.) 이번 포스트에서는 scatter 함수의 동작원리에 대해 알아보도록 하겠습니다. 먼저 Pytorch 공식 문서에는 scatter 함수가 다음과 같이 in-place 함수로 정의되어 있습니다. scatter_(dim, index, src, reduce=None) → Tensor 언더바가 붙었으므로 "tensor.scatter_()" 형태로 동작하며, 파라미터로 주어진 "index" 에 맞게 "src" 의 값을 새로운 "tensor" 로 할당합니다. 예를 들어 3차원 텐서라면 다음과 같이 업데이트 됩니다. tensor[index[i][j][k]][j][k] ..

반응형