Tuesday, June 20, 2017

MySQL on Ubuntu 16.04

우분투 16.04에 MySQL 최신버전 설치하기

  • 참고 사이트: https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-16-04
  • 설치 방법:
$ sudo apt-get update
$ sudo apt-get install mysql-server
$ sudo mysql_secure_installation

  • 설치 확인(MySQL은 설치되면 자동으로 시작된다.)
    • 방법1: 
$ systemctl status mysql.service
    • 방법2:
$ /etc/init.d/mysql status
$ mysql -uroot -p -e'show databases'

  • 삭제방법
(optional) $ sudo apt-get remove dbconfig-mysql
$ sudo apt-get purge mysql*
$ sudo apt-get autoremove
$ sudo apt-get autoclean
  • lightweight GUI client
    • emma @ Ubuntu Software center
      • cf. HeidiSQL(Windows), Sequel Pro(MAC)

Tuesday, June 13, 2017

Variational Inference 개념

VAE 논문을 읽다가 해당 개념을 찾아보게 되었다.
  • 목적: 
    • to approximate an intractable probability distribution, $p$, with a tractable(다루기 쉬운) one, $q$, in a way that makes them as ‘close’ as possible.
      • 복잡한 분포(distribution)을 조금 더 간단한 형태의 분포로 근사하여 쉽게 풀어보자는 것.
    • observation data가 주어져 있을 때 hypothesis에 대한 latent variable을 찾아야 하는 통계적 추론 문제(statistical inference problem)를 최적화 문제(optimization problem)로 re-write할 수 있다는 의미가 있음.
      • DL과의 연계성 측면: 대량 데이터의 다차원 공간에 대해 (경사 하강법 등 이용해서) 최적화 문제를 잘 풀 수 있다.
  • 이름의 어원: 
    • posterior(사후 확률 분포)를 가장 잘 설명하는 특정 분포를 찾아나가는(calculus of variations) 과정.
  • 참고: Quora Answer (by S. Wang, 2015 Mar.)
    • {세미나 시간에 질문자가 던진 꽤 어려운 질문이 있을 때, 발표자가 해당 질문을 손쉽게 conveniently reframe함으로써, 원래의 어려운 질문을 직접 대답하는 대신 reformulated question에 정확한 답을 주는 상황}을 떠올려 보자.
  • 참고: Variational Methods 소개(by E. Jang, 2016 Aug.)
    • 수식 표기가 정확하고, 개념적으로 친절하게 설명되어 있음
    • 고양이 이미지 분류 예시를 통해 posterior, likelihood 설명함.
  • 참고자료: 확률에 대한 개념 요약
    • 기계학습에 확률 $p(x)$을 도입하기 위해서는 실수 벡터를 입력으로 받아서 실수값을 출력하는 '함수'로 간주하면 조금 더 이해가 편할 것으로 생각됨; 따라서 distribution 또한 어떠한 파라미터를 가진 확률 함수 $p(x;\theta)$로 볼 수 있을 듯. 
통계/수학 문제에서 posterior를 직접 계산하기 어려운 경우가 많다. (because the normalization constant is intractable.) 즉, $X$가 observation 집합, $Z$가 latent variable 집합을 나타낸다고 하면, posterior $P(Z|X)$를 구하고 싶지만, 다음 식의 분모(denominator) 부분을 직접 계산하기 어려울 때가 많다.
$$P(Z|X)=\frac{P(Z,X)}{\int_{Z}P(Z,X)}$$
  • 접근 방안 1: MCMC를 이용해서 샘플링을 하는 방식; 만약 샘플링을 해야하는 parameter 개수가 많아질 경우, convergence가 매우 느려진다(slow to converge).
    • Markov chain Monte Carlo
  • 접근 방안 2: true posterior $P(Z|X)$를 approximate함으로써 손쉽게 계산한다. 이때, $V$를 approximate variational distribution의 parameter라고 하면 다음의 식으로 표현된다.
    • Bayesian model의 posterior distribution에 variational inference를 적용하는 것을 variational Bayes (VB)라고 부르기도 한단다.
      • a family of techniques for approximating intractable integrals arising in Bayesian inference and machine learning
$$P(Z|X)\approx Q(Z|V)=\prod_{i}Q(Z_{i}|V_{i})$$
  • 여기에서, (실제로 latent variables $Z$는 $X$와 independent하지 않을 수도 있지만,) 'mean field' approximation(평균 장 어림법, 평균 장 점근법)을 전제한다면(to restrict the family of variational distributions to a distribution that factorizes over each variable in $Z$), 문제를 더욱 쉽게 계산할 수 있다. 
    • $Z$가 서로 겹치지 않는(independent) 부분 집합 ${Z_1, \dots, Z_M}$으로 구성되어 있을 때, 전체 $Q(Z)$ 또한 각 부분집합의 $Q(Z_i)$으로 factorization 된다는 가정
$$Q(Z|V)=\prod_{i=1}^{M}Q(Z_i|V_i)$$
이제, Kullback Leibler (KL) divergence를 이용해서, $Q(Z|V)$가 최대한 $P(Z|X)$에 가까워지는 $V_{i}$를 계산할 수 있다.

$$\begin{eqnarray*}
V^{*} &=& arg\min_V D_{KL}(Q(Z|V)||P(Z|X)) \\
&=& arg \min_V \sum Q(Z|V)log\frac{Q(Z|V)}{P(Z|X)}
\end{eqnarray*} $$

따라서, estimation 문제가 최소값을 찾아야하는 optimization 문제로 바뀌었고, $V^{*}$를 찾게되면, $Q(Z|V^{*})$를 posterior에 대한 best guess로 사용하도록 한다.
$$ \begin{eqnarray*}
D_{KL}(Q||P) &\equiv& \int Q(Z)log\frac{Q(Z)}{P(Z|X)} = \mathbb{E}_Q(log\frac{Q(Z)}{P(Z|X)})\\
&=& \int Q(Z)log\frac{Q(Z)}{P(Z,X)} +\int Q(Z)log(P(X)) \\
&=& \int Q(Z)log\frac{Q(Z)}{P(Z,X)} + log(P(X))
\end{eqnarray*}$$
  • $log(P(X))$를 중심으로 decompose하면 다음과 같다.
$$\begin{eqnarray*}
log (P(X)) &=& log\frac{P(Z,X)}{P(Z|X)} \\
&=& log\frac{Q(Z)}{P(Z|X)}+log\frac{P(Z,X)}{Q(Z)}
\end{eqnarray*}$$

$$\mathbb{E}_Q(log (P(X))) = \mathbb{E}_Q(log\frac{Q(Z)}{P(Z|X)}+log\frac{P(Z,X)}{Q(Z)})$$
  • $log(P(X))$는 Q(Z)에 대해서 constant 하므로 다음과 같이 표현된다. 또한, $D_{KL}$은 nonnegative이므로, 두번째 항이 $log(P(X))$의 lower bound 또는 ELBO (evidence lower bound) $\mathcal{L}$라고 불린다. 그리고, 첫번째 항을 최소화하기 위해서는 결국 두번째 항을 최대화할 필요가 있다.
$$\begin{eqnarray*}
log (P(X)) &=& D_{KL}(Q||P) + \mathbb{E}_Q(log\frac{P(Z,X)}{Q(Z)}) \\
&=& D_{KL}(Q||P) + \mathcal{L}
\end{eqnarray*}$$

  • 이제, ELBO $\mathcal{L}$은 다음과 같이 전개된다.

$$\begin{eqnarray*}
\mathcal{L} &=& \mathbb{E}_Q ( \log{P(Z,X)} -\log{Q(Z)}) ) \\
&=& \mathbb{E}_Q ( \log{P(X|Z)} + \log{P(Z)} -\log{Q(Z)}) ) \\
&=& \mathbb{E}_Q ( \log{P(X|Z)} + \log{\frac{P(Z)}{Q(Z)}} ) \\
&=& \mathbb{E}_Q ( \log{P(X|Z)} ) + \int Q(Z)log\frac{P(Z)}{Q(Z)}
\end{eqnarray*}$$

Tuesday, March 14, 2017

apt remove vs purge (to delete a Ubuntu package)

In order to remove and re-install a package

  • $ sudo apt remove --purge {package}
    • or $ sudo apt purge {package}
  • $ sudo apt clean
  • $ sudo apt install {package}

Difference betweeb remove and purge

  • Reference
    • http://askubuntu.com/questions/231562/what-is-the-difference-between-apt-get-purge-and-apt-get-remove
  • remove: Packages installed are removed (Does NOT include configuration files)
  • purge:  Identical to remove except that any configuration files are deleted too.
    • However, any configuration files inside the user's home folder(/home) will not be touched. Only the files under /etc will be deleted by using purge

Removing ppa

  • Reference
    • https://websetnet.com/ko/remove-ppa-ubuntu-linux/
  • $ sudo apt-add-repository --remove ppa:{ppa information}

Sunday, April 19, 2015

Node.js 다루기

$ sudo apt-get update
$ sudo apt-get install nodejs npm

만약 node라는 명령어를 인식하지 못한다면, 다음 파일 수정해서 PATH 설정
>> /etc/environment

oracle jdk 설치
eclipse J2EE 설치
eclipse 플러그인: Aptana Studio 3 plugin 설치

대표적 npm 확장 모듈
- nodemon: 노드 실행 파일 변경시 노드 애플리케이션을 재시작. node 대신 nodemon으로 실행하면 된다.
- forever: 노드 실행 프로세스 유지. 잘못된 요청이나 실행 도중 오류 때문에 중지되더라도 재시작됨
- expresso: TDD 지원 프레임워크
- express: (경량화) 웹 개발 프레임워크. "express [프로젝트 디렉토리]"로 프로젝트 생성. 다음과 같은 명령어로 의존모듈 설치 가능
>> $ cd [프로젝트 디렉토리] && (sudo) npm install
- Jade: 뷰 템플릿 엔진. indenting을 통해 계층 구조 표현.
- Socket.IO: 실시간 웹 앱 개발
>> sudo npm install socket.io -g
- commander: 노드 명령줄 도구 개발
- Vows: BDD 지원 프레임워크
- node-inspector: 디버깅 지원 도구. node-jscoverage 포함(코드 커버리지 확장 모듈 포함)
- everyauth: 다양한 인증 서비스 지원
- 압축관련: node-zip, UglifyJS
- 로그와 성능 분석: log.io, Nodetime

* nohub: 리눅스에서 백그라운드 실행시키는 명령. hang-up signal이 발생해도 스크립트 동작이 멈추지 않음
>> nohub node ./server.js &

JxCore : js 패키징/배포/실행

$ sudo npm install [모듈명] (-g)
$ npm list (-g)
$ npm update [모듈명]
$ npm uninstall [모듈명]

npm registry 사이트: npmjs.org

데이터 다루기
- NoSQL 다루기: mongoose, mongolian
- SQL 다루기: node-mysql
- redis 다루기: redis (hiredis: 비동기 빠른 모듈)

* 오픈소스 자바스크립트 코드/텍스트 에디터 프로젝트
- ACE: ace.ajax.org
- CodeMirror: codemirror.net

Saturday, February 28, 2015

C에서 C++ 호출하기

참고: http://ospace.tistory.com/215

  • 파일 구성: 3개
    • Counter.h
      • C++헤더파일이자 멤버함수가 정의됨
    • counter_c.h
      • C에서 사용할 헤더파일
      • 이 파일은 Counter.h에 포함되어도 됩니다.
    • counter_c.cpp
      • counter_c.h에 있는 내용을 구현한 부분.
      • 주의할 것은 cpp로 C++로 컴파일됩니다. Counter.h의 cpp파일이 있다면 같이 포함해도 되며, 분리해도 됩니다.

위의 구현은 C++ 구현부와 C 호출부를 분리를 했습니다.
그래서 기존 라이브러리가 아닌 별도로 구성하여 관리할 수 있게 했습니다.



  • 컴파일 방법

# g++ -c counter_c.cpp

# gcc main.c counter_c.o –lstdc++

Windows 10 High DPI 에서 Java application의 Font 조절

Reference:  How do I run Java apps upscaled on a high-DPI display?  @superuser.com Summarize 1) Find java.exe you installed.  2) Righ...