함수 Generic Go도 1.18 버전부터 Generic을 지원하기 시작했다. func 함수명[T any](n T) T {...} 함수명 뒤에 [ ]를 통해 제너릭을 선언할 수 있다. any는 모든 타입을 뜻하며, comparable은 ==, != 비교가 가능한 타입을 의미한다. 그 외 정의된 타입의 키워드(string, int...)들을 사용할 수 있다. func Power[T int | float64](n T) T { return n * n } |(OR)을 이용해 여러 타입을 작성할 수 있다. type Number interface { int | int16 | int32 | int64 | float32 | float64 } func Power[T Number](n T) T { return n * n..
Optimizer는 모델의 Training Loss를 최소화하는 방향으로 파라미터를 업데이트하는 중요한 역할을 한다. 쉽게 말해 모델을 어떤 방향으로 얼마만큼 업데이트할 것인지를 결정하는 역할을 한다. Optimizer는 Gradient Descent(경사하강법)를 기반으로 한다. 기울기(Gradient)는 학습 방향을 결정하고, 학습률은 학습할 정도를 결정한다. 여기까지 내용을 모른다면 "경사하강법과 학습률" 글을 먼저 이해해야 한다. 아래 내용은 Gradient Descent를 기반으로 한 여러 optimizer의 개념들을 설명한다. SGD momentum Adagrad RMSProp Adam [기호 정리] $w$: 가중치, $t$: 시점(step), $\mu$: 학습률, $L$: Loss 값. SG..
C언어의 기본 문법이나 OOP(객체지향)에 대한 기본 개념을 알고 있다는 전제로 작성된 글이다. 예제 코드의 간결함을 위해 아래 내용은 생략하고 기록하였다. #include using namespace std; C → C++ // C++ struct Sample { int id; char name[10]; }; /* C typedef struct { int id; char name[10]; } Sample; */ int main(void) { Sample sample = { 1, "DeneV" }; cout
딥러닝으로 모델을 학습시키기 위해 미분 값을 구하는 과정이 필요하다. 만약 왜 미분이 필요한지 모른다면 '경사하강법과 학습률'을 참고하면 된다. 해당 내용을 몰라도 이번 글을 이해하는 데는 문제가 없다. 문제점 Chain-rule 연산자와 미분 결과 계산 과정 시각화 역방향으로 계산 문제점 일반적으로 미분값을 구할 때, 도함수를 구한 후 값을 대입해 계산한다. $f(x)=ax^3+bx^2+c \\ \cfrac{d}{dx}f(x)=3ax^2+2bx$ 하지만 문제는 모델의 연산 과정이 너무 복잡하다. $f(x)=Linear(Droupout( ... (maxpool(relu(conv(...))))))$ 위 예시는 아주 기본적인 CNN 모델의 구조이다. 그리고 가장 많이 사용되는 손실 함수인 Cross Entr..