OS X Yosemite 베타 설치 소감.

  • 플랫해진 화면이 매우 마음에 든다.
  • Dropbox나 Google Drive는 커스텀 폴더 아이콘을 쓰는데, 이게 Yosemite에서 새로 바뀐 폴더 아이콘에 대응하지 못해서 자기네들만 튄다.
  • 파인더에서 스크롤할 때 종종 flickering이 생긴다.
  • 작업 표시줄의 아이콘 간격이 일정하지 못하다. 아무래도 input method 아이콘은 업데이트가 안 된 듯.

Ruby를 배워야겠다

대학원 생활 동안 Python으로 코딩을 했고, 지금 다니고 있는 회사의 추천 엔진도 Python으로 되어 있어서 다른 언어를 건드리지 않고도 지금까지는 잘 살았었다.

그런데 추천 엔진을 제외한 회사 서비스 백엔드를 Ruby로 작성하는 마당에 Ruby를 마냥 외면할 수도 없고, 제대로 쓸 수 있는 언어가 Python 하나뿐인 것도 프로그래머로써는 부끄러운 일이라 오늘부터 Ruby를 공부하기로 했다.

근데 프로그래밍 언어를 제대로 배우려면 뭘 만들어 보는 게 제일 효과적이잖아. 내가 Ruby로 뭘 만들면 재미있을지 고민하다가 텔넷 BBS의 웹 인터페이스를 만들기로 했다. 웹 앱이니 Ruby on Rails도 익힐 수 있고, 텍스트 처리, 네트워크 프로그래밍 같은 것도 연습하기에 좋다. 게다가 Responsive하게 만들면 폰에서 BBS질 하기도 한결 편해진다.

BBS의 기능을 죄다 구현할 필요도 없고, 이 정도만 있으면 된다.

  • BBS 서버 상태 확인
  • 로그인, 로그아웃
  • 글 읽기, 코멘트 달기
  • 내 보드에 코멘트가 달리면 알림
  • 구독할 보드에 새 글이 올라오면 알림
  • 모바일 기기를 위한 스타일시트

여기에 더해서 이런 것도 있으면 좋을 것 같지만 굳이 시간을 들여서 만들 필요는 없을 것 같은 기능도 있다.

  • 밝은 색과 어두운 색 테마 하나씩
  • 내 보드 백업 및 검색하기
  • 내 보드 통계 dashboard
  • 내 글 읽은 사람 보기

다만 해당 BBS 유저들의 심기를 건드리지 않기 위해서 유저/보드 찾기 기능이나 흔적 남기지 않고 읽기 기능 같은 것은 안 넣을 생각이다.

쉬는 시간 쪼개서 짬짬이 만들어야지. 일단 github 저장소부터 팠다.

pv로 MySQL 백업 진행상황 보기

pv는 유닉스 파이프를 통해 데이터를 전달할 때 처리된 양과 예상 종료 시간을 보여주는 프로그램이다. mysqldump로 생성한 백업 파일로부터 DB를 복원할 때에도 다음과 같이 쓸 수 있다.

pv backup.sql | mysql db_name

이렇게 하면 pv가 다음과 같이 처리 과정을 보여 준다. 아무것도 없는 화면을 보며 마냥 기약 없이 기다리는 것보다는 훨씬 덜 답답하다.

1.7GiB 0:08:51 [1.03MiB/s] [===>              ] 16% ETA 0:46:12

OS X에는 pv가 없는데, homebrew로 금방 설치할 수 있다.

brew install pv

출처: http://major.io/2010/11/24/monitor-mysql-restore-progress-with-pv/

블로그 다시 시작

요새 너무 읽기만 하고 쓰지는 않은 것 같아서 좀 쓰는 습관을 들이기 위해서 시작했다. 뭔가 쓰면서 시간낭비를 하면 최소한 글은 남을테니.

MacDown 라는 마크다운 에디터를 내려받은 김에 마크다운 연습을 하겠다는 의미도 있다. Mou라는 에디터가 Tumblr에 바로 포스팅을 하게 해 준다길래 혹했는데 실제로 잘 되지는 않더라고.

일단 하루에 글 한 개씩 쓰는 것을 목표로 해 보자.

radiofun:

image

디자이너인 척을 하는 일이 어떻게 당신의 경력을 망치는지에 대해

Jordan Gadapee

Creative Director of @radius.radius의 크리에이티브 디렉터.

확실히 하자. 이 글은 스티브 잡스에 대한 이야기가 아니다. 스티브 잡스는 지도자, 선지자, 혹은 “Cards Against Humanity"에 따르면 "존나 마법사"이다. 누구도 감히 잡스가 가짜라고 말할 수는 없을 것이다. 이 글은 당신에 대한 이야기고, 당신이 디자이너인 척을 하면서 경력을 망치는 것에 대한 이야기이다.

이거 꼭 디자이너한테만 적용되는 소리는 아닌 듯 흑흑

일주일에 5일을 먹어도 영양불균형이 안 오면서 적당히 맛있고 간편한 음식이 어디 없을까? 저녁식사 고민하는 것도 지겹다.

우분투에서 numpy, scipy에 멀티코어 지원 추가하기

어이없게도 우분투에서 apt-get으로 설치할 수 있는 python-numpy, python-scipy 패키지들은 멀티코어 지원을 안 한다. 행렬 곱셈을 시켜 보면 쓰레드 한 개로만 돌아가는 것을 알 수 있음. 이건 배경에서 돌아가는 BLAS와 LAPACK 라이브러리가 멀티코어 지원을 하도록 컴파일되지 않았기 때문이므로, 얘네들을 다시 컴파일해서 깔아줘야 한다. 하지만 그 전에 미리 해 두어야 할 일이 있다.

  • gcc, g++, gfortran이 깔려 있고, 이들 모두가 같은 버전인지 확인한다. 버전이 다르다면 다시 설치해 주어야 하는데, 내 경우에는 CUDA 드라이버가 gcc에 의존성이 있어서 CUDA 드라이버도 제거했다가 재설치해야 했다.
  • 기존에 설치된 BLAS, LAPACK 패키지가 제거되어 있는가. libatlas, libblas, liblapack3* 따위의 패키지를 제거해 주도록 한다. 모든 패키지가 다 제거되진 못하게 되어 있는 것 같은데, 최대한 성심성의껏 제거하다 보면 libblas-dev 정도만 남을 것이다.
  • 당연히 numpy, scipy도 설치되어 있다면 제거한다.

위의 작업이 완료되었다면 openblas, lapack 순으로 다음과 같은 절차를 밟아 설치한다. sudo apt-get install build-dep <패키지명>; sudo apt-get source -b <패키지명>; sudo dpkg-i *.deb 그리고 numpy를 설치해야 하는데, pip로 설치하면 멀티코어 지원을 활용할 수 없다. openblas, lapack을 설치했을 때처럼 apt-get으로 python-numpy 패키지를 컴파일하고 설치하도록 하자.

scipy는 2013년 7월 24일 현재 우분투 12.10에서 설치할 수 있는 버전이 0.9였나 여튼 엄청 낮다. sudo pip install scipy로 설치해도 멀티코어를 쓸 수 있다.

끝 -_-

G. E. Hinton의 Dropout 정리.

신경망의 크기가 큰 경우 training set에 대해서 좋은 성능이 나오는 연결 강도의 조합은 매우 많은데, 이 중에서 test set에서도 높은 성능을 내는 경우는 소수에 불과하다. 이 문제를 극복하기 위해 많은 수의 연결 강도 조합을 학습한 후에 평균내어 사용할 수 있는데, 학습 시간 면에서 비효율적이다.

Dropout은 신경망을 학습시킬 때 매 training example에 대해 무작위로 50%의 은닉 노드를 제거한 채로 학습시킴으로써 무수히 많은 네트워크를 학습하는 효과를 지닌다.

Validation set에서의 각 노드가 있을 때의 성능에 따라 제거되는 확률을 조절하면 성능이 더 향상된다. 특히 입력-출력이 여러 종류의 관계의 조합으로 이루어진 경우, 확률을 입력에 대한 함수로써 학습할 수 있다. 이렇게 하면 매우 많은 experts의 mixture를 학습하는 것과 같은 효과를 얻을 수 있다. 하지만 확률을 어떻게 조절하는지 자세한 방법은 언급되어 있지 않다.

연결 강도의 L2-norm의 최대치를 정하는 방식으로 regularization을 수행하는데, 이는 학습 속도를 높게 잡는 것을 가능하게 하여 더 효과적인 해답 공간 탐색을 노리는 것이다. 더불어, 각 노드의 saturation을 방지하는 효과 역시 있을 것으로 보이나 문서에는 따로 언급이 되지 않았다.

저자들에 의하면 Bayesian model averaging은 posterior distribution에서 MCMC를 통해 모델을 샘플링한 후에 평균을 내는 식이며 당연히 시간이 많이 걸린다. Dropout은 모든 모델에 동일한 가중치를 주는 대신에 모델들이 연결강도를 공유하는 식으로 이 단점을 커버한다. 테스트 시점에는 수많은 모델의 출력값의 평균을 간단하게 평균값 네트워크를 사용하여 한번의 feed-forward로 얻음으로써 효과적으로 계산한다는 점도 장점이다.

Bagging과의 비교 역시 되어 있는데, bagging은 여러 개의 모델을 무작위로 추출한 샘플에 대해 학습시키고 전체를 같은 가중치로 평균내는 기술이다. Dropout은 bagging의 극단적인 경우로 볼 수 있는데, 각 모델에 대해서 단 하나의 학습 샘플만을 제공하되, 모든 모델이 연결강도를 공유함으로써 regularization을 수행하는 것으로 해석한다.

Dropout의 극단적인 케이스로 naive Bayes를 생각할 수 있는데, 모든 입력 차원에 대해 출력을 따로따로 학습하기 때문이다. 실제로 학습 데이터가 매우 적을 경우 logistic classification보다 나은 결과를 보인다고 한다.

이 방법은 fully-connected 네트워크와 convolutional 네트워크 모두에 무리없이 적용된다는 장점이 있으며, 두 경우 모두에서 성능 향상을 보인다. 그러나 convolutional network의 경우 convolutional 레이어에 적용했을 시에는 별다른 향상이 없고, 상위의 fully-connected 레이어에 적용할 때 성능 향상이 있다.

그 외의 학습 팁은 다음과 같다.

  • 한 layer만 하기보다는 모든 layer에 대해서 dropout
  • 0.1이나 0.9 등 극단적인 확률보다는 0.5의 확률로 dropout
  • 입력에는 0.5보다 더 많은 노드를 남김

Yann LeCun의 Efficent Backprop 내용 정리.

이 논문은 backpropagation을 사용하는 신경망을 효과적으로 학습시키는 방법에 대해 다루고 있다. 구현할 때 중요한 내용만 정리한다.

  • 데이터는 zero-mean, uncorrelated, unit-covariance로 맞출 것.
  • logistic보다는 tanh 함수를 쓰는 것이 더 좋다. 더 정확히는 1.7159 tanh(2/3 x)
  • weight는 각 노드의 fan-in (= 연결 갯수)의 제곱근에 반비례하는 크기로 초기화.
  • 학습 속도는 각 노드의 fan-in 갯수의 제곱근에 비례하게.

2013년 4월 동안에는 뭘 했나

  • 도약 과제 발표자료 작성 (~4.10)
  • KT 과제 관련 코딩 및 문서 작성 (4.11 ~ 4.24)
  • Spike and slab RBM 유도 (4.15 ~ 실패)
  • Spike and slab Factor Analyser 유도 및 구현 (4.15 ~ 현재)