

PintOS주차가 끝나니 마법같이 정신이 돌아왔다.
두통이 사라지고 정신이 맑아졌다.
그렇다, pintOS가 문제였던거다. 이제 ai 열심히 하면 된다.
전 팀원들한테는 미안하지만....
이번 주차는 mnist를 구현하는거다. 사실 주차라 하기에는 3일만에 끝내고 바로 다음 과제인 llm구현으로 넘어가야되서 다 합쳐서 13-14주차 인데. 그냥 편하게 13주차라고 하겠다.
이전에 대학교에서 전공으로 배웠던 적이 있다. 3학년 1학기동안 머신러닝을 배웠는데, 이걸 3일만에 끝내라니... 비전공자들한테 너무 가혹한게 아닌가 싶다. 그때도 머리 터지면서 배웠는데....
구현 자체는 어렵지는 않다. 코드를 TODO 형식으로 채워넣는 거다보니 사실 이해만 하면 되고, TODO 힌트가 너무 대놓고 있어서 채운다고 하면 바로 채울수 있다. numpy가 기능이 너무 많아서 좀 헷갈리는 거만 제외하면 말이다.
라이브러리는 numpy만 쓰기 떄문에 relu, softmax, affine 등등 우리가 직접 구현해야했다.
일단 구현에 앞서 예전에 대충 넘어갔던 개념들 정리부터 했다.

"예전에는 그냥 역전파를 쓰면 좋다." 만 기억을 하고 있었다. 깊게 파보지는 않았었다. 바로 구현으로 넘어가야 했기 때문이다. 지금은 이해했다.
우리가 역전파를 왜 하는가? 파라미터를 학습 시켜야 하기 때문이다. 역전파로 어떻게 파라미터를 학습시키냐? 역전파로 손실함수의 기울기를 넘기기 때문이다. 손실함수가 뭐냐? 실제 구해야 하는 값과의 차이 정도를 의미한다. 해당 파라미터에 대해 손실함수가 줄어드는 방향을 파라미터에게 넘겨 반영하면된다.
그럼 이걸 어떻게 모든 파라미터에게 그 손실함수의 미분값을 넘기느냐? 여기서 오차역전파법을 사용한다.
L을 손실함수라고 하고 어떤 가중치 파라미터를 W라고 하자.
목표는 W에 dL/dW를 빼는거다.(이유는 손실함수에서 설명)
(대충 그림으로 설명)
그런데 저 멀리 있는 L을 어떻게 끌고 와서 언제 미분을 하고, 그리고 다른 파라미터들에 대해서도 L에 미분해야 하는데 시간적으로 많이 복잡하다.
이걸 오차역전파법을 쓰면 아주 간단해진다. 간단히 요약하면 +면 그냥 넘기고 면 곱한 파라미터와 곱해서 넘긴다.
dL/dy는 출력값과 미분한거여서 보통 값이 구해진다.
y = wx + b라 할때 b에 반영하기 위해 dL/db를 구한다고 하면 dy/db = 1이므로 dL/dy dy db = dL/dy -> dL/db = dL/dy로 그대로 넘어간다.
만약 w에 반영하기 위해 dw/db를 구한다고 하면 dy/dw = x이므로 dL/dw = x dL/dy가 되므로 곱한 파라미터가 곱해져서 넘어간다. 이렇게 하면 순전파로 일일히 미분값을 구하는것보다 훨씬 빠르게 손실함수에 대한 미분 값을 구할수 있다.
ai가 뱉어낸 값과 실제 정답 간의 차이를 식으로 나타낸 함수다.
정답과 출력값 간의 차이가 적을 수록 좋으니 0으로 만드는것이 좋다.
손실함수 L을 y축으로 놓고 파라미터를 x축으로 놓는다면 x가 증가할 때 손실함수는 (차이는 절댓값이므로) 증가한다.
손실함수 L의 기울기는 보통 양수일 가능성이 높고, x에 대한 기울기의 반대 방향으로 x축을 이동시키면 L값도 일반적으로 줄어들 가능성이 높다. 그걸 경사하강법이라고 부르고 여기서 하나의 데이터에 대해 하나씩 무작위로 하강 시키는게 SGD다.
SGD에 문제가 있는데 결국 0에 가까워지면서 지그재그 움직인다는 것이다. 0에 가까워지는 값을 넘어서 x를 이동시키는 문제 말이다.
그걸 해결하기 위해서 0으로 가는 벡터방향은 유지시키기 위해 모멘텀이라는걸 쓰고
0에 가까워질수록 학습률을 대폭 늦추는 ada grad,
그거 2개를 짬뽕한 adam이 있다...
모멘텀이랑 ada-grad까지는 식을 이해했는데 adam은 뜬끔없이 지수 이동 평균이라는게 나와서 애를 좀 먹었다.
보니까 보통 주식에서 많이 쓰는거더라....
과제는 3일안에 저 위에 내용을 이해하고 mnist데이터를 97퍼센트 적중률로 분류해놓는 ai를 만드는 것이다. 과제 자체는 어느정도 구현된거에 TODO를 채워 넣는식이라 어렵지는 않았는데 예전 대학교 과제 생각나서 좀 울컥 했다.
사실 구현하는것보다 팀원들에게 설명하는데 시간을 더 쓴거 같기는 하다.
ai가 어떻게 숫자를 인식하게 되는건지... 오차역전파가 뭔지....
특히 저 숫자를 어떻게 인식하는지가 설명하기 어려웠는데 컨볼루션 아니면 은닉층을 까볼수가 없다보니 대충 층마다 이런식으로 이해 할'거다'라고 말해야하다보니 알거같은데도 모르겠어서 계속 물어본다....
학습 데이터가 적으면 과적합이 일어나서 꼭 그렇지는 않지만, 보통 잘 분류되는데 그걸 뭔가 원리를 설명하기가 정말 애매하다.
결과적으로 그럴수도 있음!이라고 해야되니 이게 맞나 싶긴하다.
우리 뇌를 흉내낸게 머신러닝인데 우리가 우리 뇌가 어떻게 작동하는지 대략적으로만 아니까
아마 그럴거라고 말하는게 맞긴 할거다.
그러니까 예시를 들자면....
(그림으로 설명)
사실 금~월요일 동안 한거여서 일주일이라고 하기는 그렇긴 한데, 옛날에 공부(사실 잘 해놓지는 않았는데) 해놓고 까먹은걸 확실히 다시 짚고 넘어가니 좋았다.
그런데 워낙 시간 압박이 크다보니 PintOS보다는 아니어도 그래도 힘들었다.
바로 다음으로 LLM을 만든다. 얼마나 시간이 부족할지는 모르겠지만 열심히 해야겠다.