프로그래밍 2016. 7. 4. 15:17

웹서버에서 로그파일같은게 계속 걸릴때, 

 git update-index --assume-unchanged ./logs/*

'프로그래밍' 카테고리의 다른 글

pip install mysql-python 실패시에  (0) 2016.07.07
Java 메모리 관리(스택프레임)  (1) 2016.06.05
유니코드와 인코딩에 대하여  (0) 2016.06.04
strategy pattern(전략 패턴)  (0) 2016.05.29
templete method 패턴  (0) 2016.05.29
//

대표적인 unsupervised learning 중 하나인 kmeans 에 대해여 알아보고, tensorflow를 이용하여 구현한 후 visualize해본다.

ipython notebook 에 코드 후 visualize.

https://github.com/laesunk/tensorflow_practice/blob/master/kmeans_tutorial.ipynb


다음차에 실 데이터를 scaling 하고 적용해본다.

참조 : https://tensorflowkorea.wordpress.com/3-텐서플로우-클러스터링-first-contact-with-tensorflow/

//
프로그래밍 2016. 6. 5. 17:44
자바 메모리 할당 및 관리에 대하여 궁금하여 몇개의 블로그 및 책을 참조하여 정리해본다.

물론 GC까지 하면 좋겠지만... 그렇지는 않고 언어레벨에서의 컨셉정도로 정리해보고자 한다.

자바의 메모리는 3개의 구역으로 나눠볼 수 있다. 스태틱(메소드), 스택, 힙

정리를 해보면

1. 객체의 인스턴스는 힙 영역에 생성.

2. 로직에 모든 클래스와 import 패키지들을 스태틱 영역에 위치시킨다. static 변수 메소드도 위치한다.

3. 각종 파라미터, 메소드내에 지역변수들은 모두 스택영역에서 생겼다가 사라진다.(프레임 단위의 관리를 한다.)

4. 콜 스택 관리를 한다. one() -> two() -> three()  순으로 함수가 호출 되었다면 three가 종료될 때까지 two는 대기 하다가 상위 메소드가 끝나고 계속 진행된다.  리턴이 있다면 아래 스택프레임(two)에 전달이 되고, three() 메소드에 대해 할당되었던 스택프레임은 삭제된다.

5. 물론 변수 scope의 원리에서 알 수 있듯이 스택프레임 외부에서 접근 할 수 없다.

'프로그래밍' 카테고리의 다른 글

pip install mysql-python 실패시에  (0) 2016.07.07
git 변경된 파일 무시하기.  (0) 2016.07.04
유니코드와 인코딩에 대하여  (0) 2016.06.04
strategy pattern(전략 패턴)  (0) 2016.05.29
templete method 패턴  (0) 2016.05.29
//
데이터eng 2016. 6. 5. 16:43

신경망을 이용한 classification 문제를 풀어보다가 multiclass 에 대한 처리 및 확률기반의 output이 필요하여 그 방법에 대하여 알아보고 정리한다.  Logistic regression 의 내용( cost function, optimize, loss, activation function 등의 개념)을 이용하여 정리하려는데 해당 알고리즘의 설명은 생략? 함...


아래는 일반적인 regression 의 cost function 이다. 데이터(x는 input data, w는 학습 파라미터) 와 실제값(y) 의 차이를 표현한것인데(에러^2 총합의 평균을 최소화한다는 법칙?), 이것을 Gradient Decent 알고리즘을 통하여 optimize(minimize) 하는 것을 반복하게 된다.  



하지만 이 결과값(output)은 input vector의 크기에 따라서 범위가 아주 클수도 작을 수도 있다. 수치 예측을 위한 문제에서 적합한 것이다.  그래서 우리는 분류문제에  출력값을 0 ~ 1 로 내주는 sigmoid 와 같은 특성함수를 사용하게 된다. 

그렇다면 시그모이드를 통과하는 regression 과정은 연산은 아래와 같게 된다.


 


가설함수가 바뀌었으니 최적화를 위해서 cost 함수를 적절하게 바꾸어야한다.(그냥 하게 되면 local minimum에 최약하다. 이부분은 자세한 그래프의 형태가 필요한데 생략. 간단하게는 단순 X^2의 그래프에서 만은 굴곡이 생기는 것으로 이해하면 되겠다.)  그래서 일반적으로  H(x)의 exponential 을 일반화 시키기 위해 log 를 취한다.




위를 그래프로 생각해보면 

y=1일 때는 H(x)=1 이면 cost=0가 되고, H(x)=0이면 cost= 무한대가 된다.( h(x)가 0일 수록 cost가 커지는 형태) 

y=0일 때는 H(x)=0 이면 cost=0가 되고, H(x)=1이면 cost= 무한대가 된다.( h(x)가 1일 수록 cost가 커지는 형태) 

이렇게 log 함수의 단조증가 성질을 이용하여 실제 값과 예측값의 차이에 비례?하는 cost를 만들어낸다.

이러한 cost 함수를 아래와 같이 다시 정의해 볼 수 있다.



위 식에 y=1, y=0을 각각 넣어 정리해보면 위의 분리된 식을 갖을 수 있다. (다만 하나로 표현해놓은것. 나중 살제 로직에서 한번에 cost 함수를 표현해야 하기 때문에)

3차원의 input vector(데이터)를 이용하여 3개의 multiclass 분류를 한다면 아래와 같이 표현이 가능하다(차례로 클래스1,2,3으로 가정). 

아래의 아웃풋을 각각 sigmoid 함수 연산을 통해 0 ~ 1 로 각각의 값을 구할 수 있겠다.




3개의 클래스에 대한 output(score) 이 나올 것인데, 우리는 이것에 대한 원하는 형태가 있다.

각 클래스에 대한 확률 형태( 합은 1, scale 된 수치(0~1) ) 를 원하는데, 여기서 사용되는 것이 softmax이다. 


y = H(x) = Wx 로 볼 수 있겠다.


이렇게 우리는 데이터로부터 각 클래스별 확률로 볼 수 있는 값을 갖을 수 있는 것이다. 그 후 최고 확률 수치를 갖는 것을 one-hot encoding (argmax) 로 찾아내어 분류결과를 낼 수 있다.


학습 시에 어떻게 에러(loss) 를 줄일가?

cross entropy!!

softmax 로 부터 정규화된 값을 통해 실제 정답과 비교하여 에러를 줄이는 것을 해야한다. 이부분에 많이 사용되는 것이 cross entropy라는 것이 있다. y 는 실제 데이터에서 주어진 정답, y^hat 은 모델의 예측값이다.



3 클래스의 분류라고 했을 때 y =[ [1,0,0], [0,1,0], [0,0,1] ] 을 갖을 수 있을 것이다. softmax를 통과한 y^hat 의 one-hot encoding vector와 각원소별 곱을 한다는 의미이다.  

똑같이 0~1 사이의 log 그래프의 무한대와 0 사이의 결과값을 이용하여 error 를 구하고 그 합을 최종 loss 로 취하게 된다.


'데이터eng' 카테고리의 다른 글

통계학 시작  (1) 2016.07.05
sigmoid 함수 미분 과정  (1) 2016.05.29
[라그랑제 승수]조건부 최적화 문제 풀기  (0) 2016.01.12
MLE(최우도 추정)에 관해  (0) 2015.12.31
bayes rule  (0) 2015.12.30
//
프로그래밍 2016. 6. 4. 23:08

API 몇개를 만들던 중 문자열이 심심치 않게 깨지는(euc-kr -> utf-8)  그리고 기타 특수문자들의 전송에 있어서 json 디코딩이 안되는 이런 뭐 몇가지 문제를 겪다가 기본 인코딩 원리 및 정확한 처리 방법을  알 필요가 있다고 생각하며 정리해본다.  

결국 바이트?비트? 전송을 어떤 크기로 잘라서 읽어 들여 특정 맵핑(표준 정의)에 맞추어 본다고 정리 할 수 있을듯 하다.(나만의 정리)

크게 본다면 문자를 표현하는것은 아스키를 처음으로 시작된다. 0x00 ~ 0xff 까지 255개의 문자를 정의한다. 

여기서 중요하게 생각해볼 것은 한글과 그것의 인코딩이다. 위에서 말한 아스키는 한글을 표현하기에 부족하다. 보통 중국,한국,일어에 사용되기 위해서는 더 큰 범위의 처리 방법이 필요한 것이다.

그렇다면 한글은 어떻게 표현되는것인가? 크게 조합형과 완성형으로 나누며, N바이트 완성형/조합형 식으로 나누어 볼 수 있다. 조합형이란 한글의 초/중/종성(19,21,28)에 각 코드를 부여하고 조합(11172개)하여 표현하게  하는 것이다. 그에 반해 완성형은 지금 쓰고 있는 글자 처럼 완성된 글자에 코드를 부여하는 방식이다. 

2바이트 조합형/완성형을 알아보면 

조합형에서는 초/중/종성에 각 5bit를 할당하여 맵핑하고, 처음 1bit(msb)는 1로 마킹하여 한글임을 표시하였다. 

완성형은 각 음절을 코드와 1:1 맵핑시킨 것이다. ISO 2022 표준을 기준으로 하였으며, 이것은 0xA1A1 ~ 0xFEFE(8836개)를 사용하였다. 하지만 한자에 4888, 러시아 1598을 사용하여 한글에는 2350개 밖에 사용되지 않았다. 그래서 몇개의 문자를 표현할 수 없었다. 그러다가 MS가 추가 재정하여 나머지 8822자를 추가하였다. 통합형 한글 코드, 확장 완성형이라고 한다.

이제 유니코드ㄱㅏ 나올 때이다. 중어, 일어등을 표현하기 위해서는 EUR-JP, EUC-CN 뭐 등등의 인코딩이 쓰인다. 하지만 우리는 이것들을 모두 사용하는 문서들을 표현해야한다. 어떻게 모든 문자를 표현하게 할가? 기존의 한가지 글자에 대한 표현방식을 사용할 수 없어, 나온 것이 유니코드이다. 이 모든것을 모아서 만들어낸것이다.  한글 11172 문자가 모두 표현가능하다.

유니코드에서는 코드포인트라는 것을 사용한다. A의 유니코드값은 U+0041로 표현한다. 31bit문자 집합이며, 현재까지 21bit내에서 다 표현이 가능하다고 한다. 

한글은 u+1100 ~ u+11FF사이에 한글 자모, u+AC00 ~ u+D7AF 사이의 한글 소리 마디 영역에 표현되어 있다.

유니코드의 인코딩 방식(utf-8)을 알아보자. 

U+0000~U+007F

 7

그대로 인코딩

U+0080~U+07FF

11         

110xxxxx 10xxxxxx

U+0800~U+FFFF

16

1110xxxx 10xxxxxx 10xxxxxx

U+10000~U+1FFFFF    

21

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

문자를 2진수로 표현 후 xxx부분에 기존 비트값을 넣어준다. 

"한글" 을 코드 포인트로 보면 U+D55C U+AE00인데, 이를 UTF-8 인코딩하면, 0xED 0x95 0x9C 0xEA 0xB8 0x80이 된다.

그리고 한글의 범위는 AC00 ~ D7AF 이므로 한글은 3바이트 인코딩으로 다 가능하게 된다.




'프로그래밍' 카테고리의 다른 글

git 변경된 파일 무시하기.  (0) 2016.07.04
Java 메모리 관리(스택프레임)  (1) 2016.06.05
strategy pattern(전략 패턴)  (0) 2016.05.29
templete method 패턴  (0) 2016.05.29
git fetch from remote  (0) 2016.04.07
//
프로그래밍 2016. 5. 29. 17:42
이전 포스트 ("http://smile2x.tistory.com/entry/templete-method-%ED%8C%A8%ED%84%B4-2") 에 이은 내용이다.
이번 내용은 스트레티지 패턴인데, 다른 점은 각 객체가 갖어야 할 다른 행동을 갖은 객체로 빼는 것이다.
아래서 주입이라는 단어를 사용하는데, 객체생성할 때 전략객체를 파라미터로 전달하는 것으로 알면 된다. 세가지의 협동? 으로 이루어지는데,
1. 각자 다른 전략(행동) 메소드를 갖는 전략(strategy) 객체
2. 전략 객체를 사용하는 객체 소비자(사용 클래스)
3. 전략 객체를 만들고, 사용객체에 주입하는 클라이언트

흐름 :
행동(전략)을 추상화 하는 interface 를 두고, 사용할 전략(strategy) 객체를 만들때 인터페이스를 통해 객체를 만들게 된다.
해당 interface를 구현하는 구현체(전략 클래스)들을 만든다.
해당 전략객체(인터페이스로 만들어진)를 사용(injection) 하여 객체를 사용한다.
전략행동의 인터페이스 를 만든다.
public interface Strategy {
	public abstract void runStrategy();

}
각 용도별 해당 인터페이스의 구현체를 만들어준다.
public class StrategyGun implements Strategy{
	public void runStrategy() {
		// TODO Auto-generated method stub
		System.out.println("빵빵, 총");		
	}

}

public class StrategySword implements Strategy{

	public void runStrategy() {
		// TODO Auto-generated method stub
		System.out.println("칼칼칼");		
	}

}
만들어진 전략을 사용하는 사용자 클래스를 만든다. interface class의 타입(Strategy) 으로 선언하고 나중에 파라미터는 구현체 타입의 instance 를 전달한다.
public class Soldier {
	public void run(Strategy strategy){
		strategy.runStrategy();
	}

}
아래는 실제 전략을 만들고 컨텍스트(사용클래스에) 주입하는 코드. new StrategyGun() 으로 생성하고, 해당 Strategy를 run 메소드에 주입하고 있다. 이렇게 함으로써 soldier 클래스 행동의 중복을 피하고, 앞으로 추가되는 무기류에 대해 Strategy의 구현체를 만들어주기만 하면 대응이 가능하도록 된 것이다.
 public class client {
	public static void main(String [] args){
		Strategy strategy = null;
		Soldier soldier = new Soldier();
		
		strategy = new StrategyGun();
		soldier.run(strategy);
		
		strategy  = new StrategySword();
		soldier.run(strategy);		
	}

}

'프로그래밍' 카테고리의 다른 글

Java 메모리 관리(스택프레임)  (1) 2016.06.05
유니코드와 인코딩에 대하여  (0) 2016.06.04
templete method 패턴  (0) 2016.05.29
git fetch from remote  (0) 2016.04.07
특정 주기로 로그 삭제  (0) 2016.01.05
//
프로그래밍 2016. 5. 29. 17:37
oop의 개념정도로 비즈니스 로직을 자주 코드 했는데, 디자인 패턴등의 책을 보고 적용해보고, 대략 비슷하면서도 정확히 집고 넘어가야할 내용이라고 생각들어 그 중 하나인 템플릿메소드 패턴, 스트레티지, 탬플릿 콜백 패턴에 대해서 쓰임새, 어디에 쓰면 좋을지 등을 생각해보고 정리하고자 한다.
큰 목적은 클래스간의 결합도를 낮추고, 기능응집도를 높이기 위한 작업들이다. 더 풀어 이야기 해보면 클래스간 의존도(특정 클래스의 인스턴스를 만들고 작동하기 위해서 여기저기 클래스들이 얽혀 있게되는 것)을 줄이는 것이다.
이렇게 함으로써 추후 변경되는 사항(요구사항은 언제든 바뀔 수 있기 때문에) 에 최소한의 비용(시간, human resource)를 들임으로써 수정에 용이성을 더할 수 있겠다.
이전에는 추상화를 위한 클래스를 여럿 만듦으로써 메모리등의 성능적인 측면에 의심이 많이 들었는데, 이런 작은 비용때문에 추후 유지관리에 힘들게 된다면 더 손실이 크다고 볼 수 있다. (이것은 자바의 메모리 할당과정을 보면서 조금 안심? 하게 되었는데, 추후 자바의 메모리 구조에 대해 더 포스팅하면서 정리해보도록 하겠다.) 아래는 탬플릿 메소드 패턴이다. 모 클래스( 해당 객체의 행동을 결정하는 행동 함수들을 모두 모아 놓고, 하위 상속객체에서 특정 행동 메소드를 오버라이드 하여 각 파생 클래스의 행동을 다시 만들어줄 수 있다. 행동 프레임?은 같지만 행동의 모양? 특성?이 다를 때 이용할 수 있겠다. 동물이 태어나고 울음 행동을 한다는 흐름은 같은데, 각 동물들의 울음소리가 다르다. 최상위 클래스 animal을 두고 dog, cat이 해당 메소드를 오버라이드 하여 울음 소리가 다르게 된다.
public abstract class Animal {
	public void play(){
		System.out.println("come on");
		playOut();
		runSomething();
		System.out.println("good");
	}
	public abstract void playOut();
	
	void runSomething(){
		System.out.println("HI HI");
	}
}
public class Cat extends Animal{
	@Override
	public void playOut() {
		System.out.println("miya~ miya~");
	}
	@Override
	public void runSomething(){
		System.out.println("고양이 HI HI");
	}
}
public class Dog extends Animal{
	@Override
	public void runSomething(){
		System.out.println("개 HI HI");
	}

	@Override
	public void playOut() {
		// TODO Auto-generated method stub
		System.out.println("wow wow");	
	}
}
public class main {
	public static void main(String[] args) {
		Animal a1 = new Dog();
		Animal a2 = new Cat();
		
		a1.play();
		
		a2.play();
	}
}
즉 정리하면 상위 클래싀의 메소드에서 하위 클래스가 오버라이딩한 메소드를 호출하는 내용이라고 할 수 있겠다.

'프로그래밍' 카테고리의 다른 글

유니코드와 인코딩에 대하여  (0) 2016.06.04
strategy pattern(전략 패턴)  (0) 2016.05.29
git fetch from remote  (0) 2016.04.07
특정 주기로 로그 삭제  (0) 2016.01.05
scrapy 설치 오류  (0) 2015.12.22
//
데이터eng 2016. 5. 29. 13:03

신경망 activation function으로 ㅅ자주 언급되는 sigmoid함수의 미분 과정이 필요하여 정리해본다.

신경망 학습 과정중에 backpropagation 단계에서 아래 미분된 sigmoid 함수의 값이 요구되어진다.

아래처럼 생겼다. 지수 a 값에 따른 변화이다.


                

                

               

               


아래는 미분 값으 변화이다. 양끝단으로 갈수록 미분값이 0에 수렴하게 되는데,

이러한 사항때문에 나중에 신경망에서 vanishing gradient 문제가 발생하게 된다.


참고 : http://roboticist.tistory.com/494

'데이터eng' 카테고리의 다른 글

통계학 시작  (1) 2016.07.05
softmax, cross_entropy 에 대하여  (0) 2016.06.05
[라그랑제 승수]조건부 최적화 문제 풀기  (0) 2016.01.12
MLE(최우도 추정)에 관해  (0) 2015.12.31
bayes rule  (0) 2015.12.30
//
Recurrent NeuralNetwork for NLP

RNN에 대하여 학습한 내용을 정리 공유 하고자 한다. Recurrent NeuralNetwork 의 줄임말이고, 주로 언어처리에서 많이 쓰이고 있다. 언어라는 것이 단어와 단어사이의 연관성, 즉 시계열성으로 볼 수 있기 때문이다. RNN은 이런 시계열 특성을 반영한 뉴럴넷 모델이다. 여러가지 모델로 만들어 볼 수 있는데. 이번 설명은 언어모델을 이용한 생성(generative model)을만드는 것에 대해 해볼 예정이다. 

RNN기본 구조

이것이 기본 구조이다. 겉보기엔 굉장히 심플? 하다.


X는 주어진 데이터의 한문장에서 분리된 한단어(토큰)이라고 보면 된다. A는 추후 나오지만 activation 단계이고, h는 결과 output이다.

키포인트는 펼쳐진 아래그림에서 볼 수 있다.


첫번째 유닛(X-> A -> h 의 계산 한번을 한 유닛으로 부르겠다.) 이 다음 유닛을 계산할 때 영향을 준다는 것이다. 

가운데 노드(A) 를  hidden state 라고 칭하는데 hidden state의 값이  다음 출력값의 계산에 영향을 주게 된다. 

수식으로 표현하면 아래와 같다.



이전 상태값(t-1) 과 현재 타임스텝(t)의 Input 의 계산결과(activation function) 값이 현재스텝의 상태값(hidden state)이 된다는 내용이다. 모든 스텝에서 같은 activation function 이 적용되기 때문에 저렇게 하나로 무리없이 표현이 가능하다.

좀 더 자세히 보게 되면




activation function 으로 tahn가 사용되었고( 물론 relu등을 사용할 수도 있지만 기본 RNN에서는 tahn을 사용하고 있다.)

뉴럴넷의 핵심은 결국 노드간,레이어간 최적 파라메터(w로 표현) 를 찾는 것이다. RNN에서는 세가지 파라메타가 나오는데, 

첫번째는 input(X)에서 hidden-state(A)사이, 두번째는 hidden-state(A_t-1) 와 다음 hidden-state(A_t) 사이, 세번째는 hidden-state(A)와 output(h) 사이에 존재한다.

해당 weight(W) 는 모든 타임스텝에 동일하게 적용이된다.


실제 데이터에 비유하여 알아본다.

케릭터단위 언어모델을 만들어가는 과정이다.  언어모델이란 보통 해당 단어 다음에 올 단어를 맞추는 것이라 이해하면 된다.) 

"hello" 라는 문장이 input으로 들어오게 되면. RNN input은 ["h","e","l","l","o" ] 가 되게 된다.

그리고 output에 대응되는 것은 ["e"," l "," l "o","end"] 가 된다.  이런 방식을 학습해 나가면서 언어모델을 만들게 된다. 

그럼 어떻게 단어를 벡터화 시킬것인가? 가장 간단한 방법은 사전 기반 one-hot encoding이다. 

이 사전은 데이터로부터 만들어야 한다. 여기서는 [h, e, l, o ] 를 vocabulary set으로 만든다(가정) 

그리고 이 단어를 기반으로 아래의 데이터를 만든다.

h = [1,0,0,0], e = [0,1,0,0], l = [0,0,1,0], o = [0,0,0,1].  이  데이터가 input으로 들어가게 된다. 

이 input은 초기 parameter(W_xh)와 곱 해지는데 아래와 같은 계산을 통해 값을 구한다.  


 


처음 단어(글자)는 이전 state 정보가 없기 때문에 랜덤 혹은 ㅇㅓ떤 다른방법?으로 초기화된 데이터를 이용하거나 이전 정보 없이 그대로 갈 수도 있겠다.

아래 보이는 것처럼 이전 hidden-state의 값이 다음 hidden-state계산에 관여하는 것을 볼 수 있다. 


그 다음은 아래와 같이 ouput을 만들어낸다. 사이즈 역시 해당 W에 의해 결정되는데 우리는 4개의 vocab 을 이용했으므로 사이즈 4의 아웃풋이 각 노드마다 계산되어져 나오게 된다. 


 



그 후 softmax 과정을 거쳐 (가장 큰 값의 인덱스 단어를 예측값으로 취함) 예측 한다. (위 그림은 softmax가 아닌 단순 wx+b 와 같다)

이 후 학습은 BPTT(back propagation through time) 이라고 하는데 기존 neuralnet의 학습(back propagation)과 거의 유사하지만 시간 스텝 파라미터에 대한 미분 과정이 더해진 과정이라고 보면 될 것 같다. 추 후 더 학습하고 정리하기로 한다.


참고 :http://cs224d.stanford.edu/syllabus.html

         https://www.youtube.com/user/hunkims



'데이터eng > Tensorflow:MachineLeaning' 카테고리의 다른 글

K-means 를 tensorflow에서 해보기  (0) 2016.07.03
//
프로그래밍/Hadoop ETC 2016. 5. 10. 14:17
hadoop fs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt


//