머신러닝 입문 (6) — 자동미분(autograd) 직접 만들기
5편에서는 은닉층 하나짜리 신경망의 기울기를 손으로 유도했는데, 활성함수를 바꾸거나 층을 하나 더 얹으면 유도를 처음부터 다시 해야 한다. 프레임워크는 이 일을 자동미분(automatic differentiation)으로 대신한다. 이 글에서는 스칼라 autograd 엔진을 100줄…
5편에서는 은닉층 하나짜리 신경망의 기울기를 손으로 유도했는데, 활성함수를 바꾸거나 층을 하나 더 얹으면 유도를 처음부터 다시 해야 한다. 프레임워크는 이 일을 자동미분(automatic differentiation)으로 대신한다. 이 글에서는 스칼라 autograd 엔진을 100줄…
4편까지의 모델은 층이 하나라 기울기를 종이에 한 줄로 적을 수 있었지만, 층을 쌓으면 손실이 합성함수가 되어 기울기를 연쇄법칙으로 뒤에서 앞으로 전달해야 한다. 이것이 역전파(backpropagation)다. 이 글에서는 은닉층 하나짜리 신경망의 역전파를…
압축 저장소를 만든다면 압축률을 정확히 맞히기보다 "이 파일을 압축할 가치가 있는가"를 먼저 판정해야 하고, 잘못 판정하면 CPU를 헛쓰거나 저장 공간을 손해 본다. 이 글에서는 같은 데이터로 원본의 30% 미만으로 줄어드는가를…
2편의 정규방정식은 손실이 이차식일 때만 쓸 수 있고, 로지스틱 회귀나 신경망에는 그런 닫힌 해가 없다. 그래서 대부분의 학습은 기울기를 따라 조금씩 내려가는 경사하강법(gradient descent)으로 한다. 이 글에서는 같은 데이터로 경사하강을…
1편에서 np.linalg.lstsq가 내놓은 직선 ratio = 0.1936 * entropy - 0.6163이 무엇을 계산한 것인지는 건너뛰었다. 이 글에서는 손실을 미분해 정규방정식을 직접 풀고 lstsq와 같은 답이 나오는지 확인한 뒤, 설계행렬에 열을…
리눅스에서 개발하다 보면 대부분의 문제를 조건과 분기로 푼다. 그런데 이 파일을 gzip으로 압축하면 얼마나 줄어들까 같은 문제는 확장자로 if를 짜봐도 확장자 없는 실행 파일이나 이미 압축된 .gz에서 막히고, 머신러닝은 규칙을…
공유 라이브러리는 프로세스마다 다른 주소에 올라간다. ASLR이 켜져 있으면 같은 libc.so.6도 실행할 때마다 위치가 바뀐다. 그런데 .text는 읽기 전용으로 매핑되어 여러 프로세스가 물리 페이지를 공유하므로, call printf의 피연산자에 실제 주소를…
이번 주 LWN.net 위클리 에디션(9월 10일자) 주요 내용이다. 2년 넘게 끌어온 Rust never 타입(!) 안정화가 3,300개 크레이트를 흔드는 호환성 문제를 넘어 1.99에 들어가게 됐고, CERN은 컴파일러 플래그 하나 때문에 가속기…
스핀락(spinlock)과 뮤텍스(mutex)를 잘못 쓴 커널 코드는 대부분 조용히 지나간다. 초기화하지 않은 스핀락은 0으로 채워진 메모리라 x86에서는 그냥 동작하고, 스핀락 안에서 호출한 kmalloc(GFP_KERNEL)은 메모리가 넉넉하면 잠들지 않으니 아무 일도 없다. 그러다…
9월 6일 공개된 리눅스 커널 7.3-rc2에는 기능 추가 없이 코드 모양만 바꾸는 대형 패치가 하나 들어갔습니다. 키스 쿡(Kees Cook)이 보낸 kmalloc_obj() 전환 풀 리퀘스트입니다. 304개 파일에서 637줄이 추가되고 726줄이 삭제됐습니다.…