전체 글 25

가중치가 크면 과적합(overfitting)이 발생하는 이유

일반적으로 가중치가 크면 과적합이 발생한다고 알려져 있다. 그래서 가중치의 크기를 규제하는 방법으로 L1-regularization, L2-regularization을 활용하곤 한다. (가중치 규제와 관련된 포스팅은 이 링크를 참고) https://ohsy0512.tistory.com/31 그러면 왜 가중치의 크기가 클 때 과적합이 발생할까? 이 주제에 대해서 한국어 자료부터 영어 자료까지 찾아봤지만 자세히 설명된 포스팅이 없었다. 그래서 나름 혼자 고민하면서 이해한 바를 설명해보려 한다. 다음의 예시를 보자. $x1$과 $x2$라는 feature가 있을 때, $x = x1 + x2$ 혹은 $x = 10x1 + 10x2$에 대하여 sigmoid(x)를 적용한 결과다. 두 그래프의 차이는 weight의 크..

AI/ML DL 2023.03.28

[AlexNet] ImageNet Classification with Deep CNN, 2012

AlexNet은 2012년에 이미지 분류 대회에서 우승을 하며 현대 CNN의 기초가 된 논문이다. LeNet 사실 CNN은 AlexNet에서 처음 사용된 것이 아니다. 1998년에 발표된 LeNet이라는 논문에서 CNN의 기반을 구성했다. Pooling, Padding, Activation, Fully Connected Layer로 이어지는 일련의 과정을 활용했으며, MSE Loss를 손실함수로 사용했다. MNIST Dataset을 기준으로 99.05%의 정확도를 달성했지만, 그게 한계였다. 얼굴이나 객체 인식과 같은 복잡한 패턴의 영상을 처리할 수 없었고 기존의 알고리즘이 더 주목을 받았다. 이후 CNN은 역사의 뒤안길로 사라지는 듯 보였다. AlexNet 그러다 AlexNet이 등장하게 된다. LeN..

AI/Paper Review 2023.03.25

[Pytorch 구조 학습하기]Dataset과 DataLoader

Pytorch의 Dataset 파이토치는 스레딩을 통한 데이터 병렬화, 데이터 증식 및 배치처리 같은 여러 복잡한 작업을 추상화하는 여러 유틸리티 클래스를 제공한다. 쉽게 말해 raw data를 쉽게 클래스로 만들도록 도와주는 도구라고 보면 된다. Pytorch의 torch.utils.data에서 Dataset 클래스를 상속해서 만든다. Dataset의 기본 구성 요소 Dataset 클래스를 크게 3가지 메서드로 구성된다. from torch.utils.data import Dataset class CustomDataset(Dataset): def __init__(self,): pass def __len__(self): pass def __getitem__(self, idx): pass __init__ ..

Naver Boostcamp 2023.03.21

가중치 규제(Weight Regularization)

이번주 AlexNet 논문을 읽으면서 weight decay가 언급되었는데 이참에 제대로 개념을 잡고 가는 게 좋을 것 같아서 따로 글을 적는다. 과적합(Overfitting) 과적합이란 모델이 훈련 데이터에만 지나치게 적응하여 시험 데이터에 제대로 반응하지 못하는 현상을 말한다. 그 반대 개념으로는 모델이 훈련 데이터도 제대로 학습하지 못한 상태를 말하는 과소적합(Overfitting)이 있다. 그런데 일반적으로 딥러닝에서 과소적합보다 과적합에 대한 해결방법이 많이 연구되는 것을 볼 수 있다. 왜 그럴까? 그 이유로는 딥러닝 모델은 직접 raw data에서 feature를 만들어 낸다는 점을 꼽을 수 있다. 학습과정에서 모델이 스스로 feature를 가공하고 추출하기 때문에, 처음부터 Architect..

AI/ML DL 2023.03.19

파이썬 함수 호출시 참조 호출 방법(Call by assignment)

기본적으로 c언어에서는 함수에 인자를 넘겨줄 때 두 가지 방법을 사용한다. C언어 Call by value 함수에 값을 복사해서 전달하는 방식이다. 인자로 전달되는 변수의 값을 함수의 파라미터에 저장한다. 이때 인자로 전달한 변수와 함수의 파라미터는 별개의 변수가 되며, 서로 영향을 미치지 않는다. #include void swap(int a, int b) { int temp; temp = a; a = b; b = temp; } int main() { int a, b; a = 10; b = 20; printf("swap 전 : %d %d\n", a, b); swap(a, b); printf("swap 후 : %d %d\n", a, b); return 0; } 즉 main에서의 a, b와 swap에서의 a..

[Pytorch 기본] apply

Apply apply는 모델 내에 이미 구현되어 있는 method가 아닌 사용자가 커스텀한 함수를 모델의 submodule에 전체적으로 적용하고 싶을 때 사용하는 기능이다. 모델 내부의 가중치값을 임의로 변경하거나 전체 submodule을 출력하는 등 다양하게 활용할 수 있다. pytorch 공식 문서에도 일반적으로 모델의 파라미터를 (사용자 임의대로) initializing할 때 사용한다고 적혀있다. 사용 방법은 예제를 보면 알 수 있다. >>> @torch.no_grad() >>> def init_weights(m): >>> print(m) >>> if type(m) == nn.Linear: >>> m.weight.fill_(1.0) >>> print(m.weight) >>> net = nn.Sequ..

Naver Boostcamp 2023.03.15

[Pytorch 기본]hook(pre forward hook, forward hook, backward hook)

1. Hook hook이란 패키지를 만드는 코드에서 중간에 원하는 코드를 삽입할 수 있는 기능이다. 순전파 이후에 모델의 가중치를 변경하거나, 파라미터 업데이트를 실시간으로 확인하는 등, 내 입맛대로 바꾸고 싶은 모델을 일부 변형하여 사용할 수 있다. hook은 크게 Tensor에 적용하는 hook과 Module에 적용하는 hook으로 나눌 수 있다. 1-1. Tensor Tensor는 forward hook이 없고 backward hook만 적용할 수 있다. import torch tensor = torch.rand(1, requires_grad=True) def tensor_hook(grad): pass tensor.register_hook(tensor_hook) # 🦆 tensor는 backward..

Naver Boostcamp 2023.03.15

[Pytorch 기본]nn.Module

nn.Module nn.Module 클래스는 여러 기능들을 한 곳에 모아놓는 상자 역할을 한다. nn.Module은 빈 상자일 뿐 이를 어떻게 사용할지는 온전히 설계자의 몫이다. 기본적인 클래스에 대한 설명은 파이토치 공식 문서에서 확인할 수 있다. https://pytorch.org/docs/stable/generated/torch.nn.Module.html?highlight=nn+module#torch.nn.Module Module — PyTorch 1.13 documentation Shortcuts pytorch.org 기본 구조 x1과 x2를 입력값으로 주면 두 변수의 합을 반환하는 클래스를 만들어 보려 한다. import torch from torch import nn # TODO : Add 모..

Naver Boostcamp 2023.03.14

[AI Math] 경사하강법

1. 미분 미분은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로, 머신러닝에서 최적화에 가장 많이 사용되는 기법이다. 고등학교 때 미적분을 들었다면 알겠지만 다음과 같이 표기한다. $f'(x)=lim_{h \to 0} {{f(x+h)-f(x)} \over {h}}$ 미분은 함수값의 변화량이자 함수의 기울기로 이해할 수 있다. 미분값은 함숫값을 증가시키거나 감소시킬 때 활용할 수 있다. 함숫값을 증가시키고 싶다면 미분값을 더하고, 감소시키고 싶다면 미분값을 빼면 된다. 함수의 극값에 도달하면 미분값이 0이 되어서 최적화 과정이 종료되게 된다. 이때 미분값을 더하는 방법을 경사상승법(gradient ascent)이라 하며, 함수의 극대값의 위치를 구할 때 사용한다. 반면 미분값을 빼는 방법을 경..

Naver Boostcamp 2023.03.12

[AI Math]행렬

행렬 행렬은 벡터를 원소로 가지는 2차원 배열이다. 행렬은 행과 열을 갖는다. 1. 행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱 행렬끼리 같은 모양을 가지면 덧셈, 뺄셈, 성분곱, 스칼라곱을 계산할 수 있다. 벡터와 마찬가지로 각 인덱스 위치끼리 연산하면 된다. 2. 행렬 곱셈 행렬 곱셈은 앞 행렬의 열과 뒤 행렬의 행의 수가 같아야 한다. 만약 $X_{mn}$와 $Y_{nl}$을 곱하면 결과는 m행과 l열로 구성된 행렬이 된다. 연산 결과가 이렇게 나타나는 이유는 행렬곱이 내적을 통한 연산이기 때문이다. 즉 행렬의 각 원소는 앞 행렬의 i번째 행벡터와 뒤 행렬의 j번째 열벡터를 내적한 결과로 구성되며, 곱의 순서에 따라 값이 달라지므로 앞 행렬과 뒤 행렬의 순서를 바꿀 수 없다. 3. 행렬을 이해하는 방법 ..

Naver Boostcamp 2023.03.12