대규모서비스를지탱하는기술 7

28
대규모 서비스를 지탱하는 기술 Ch.7 알고리즘 실용화 chois79 13625화요일

Transcript of 대규모서비스를지탱하는기술 7

Page 1: 대규모서비스를지탱하는기술 7

대규모 서비스를 지탱하는 기술Ch.7 알고리즘 실용화

chois79

13년 6월 25일 화요일

Page 2: 대규모서비스를지탱하는기술 7

Ch.7 에서 다루는 내용

1. 대규모 데이터를 앞둔 알고리즘 선택의 중요성

2. 알고리즘을 제품에 적용하기까지 어떤 과정이 필요한가?

13년 6월 25일 화요일

Page 3: 대규모서비스를지탱하는기술 7

대상이 되는 데이터가 크면 클수록 알고리즘이나 데이터 구조 선택이 속도에

영향을 미친다

13년 6월 25일 화요일

Page 4: 대규모서비스를지탱하는기술 7

그럼 알고리즘이 무엇인가?

어떤 값 또는 값의 집합을 입력으로하고어떤 값 또는 값의 집합을 출력으로 하는

명확하게 정의된 계산 절차-Introduction to Algorithms

13년 6월 25일 화요일

Page 5: 대규모서비스를지탱하는기술 7

알고리즘은 왜 배워야 하는가?

1. 컴퓨터 자원은 유한하다2. 엔지니어의 ‘공통 언어’3. 알고리즘을 알아둠으로써 새로운 문제에도 대처할 수 있다

13년 6월 25일 화요일

Page 6: 대규모서비스를지탱하는기술 7

알고리즘의 평가 방법

Order표기법

어떤 함수의 증가 양상을 다른 함수와의비교로 표현하는 방법

13년 6월 25일 화요일

Page 7: 대규모서비스를지탱하는기술 7

자주 사용되는 Order 표기

O(1) < O(log n) < O(n log n) < O (n2) < O (n3) ...O(nk) < O(2n)

대규모 데이터를 대상으로 한 경우n이 클 경우 실용성을 띄는 것은

O(n log n)까지

13년 6월 25일 화요일

Page 8: 대규모서비스를지탱하는기술 7

데이터 구조알고리즘과 뗄레야 뗄 수 없는 관계

상수항알고리즘을 구현하는 중에 입력의 크기에

의존하지 않지만 실행하지 않으면 안되는 처리함수 호출, if문.. 등.

구현을 포함해서 생각할때는 상수항에 대한고려도 필요

그밖에 고려사항

13년 6월 25일 화요일

Page 9: 대규모서비스를지탱하는기술 7

알고리즘의 실제 활용

13년 6월 25일 화요일

Page 10: 대규모서비스를지탱하는기술 7

하테나 다이어리의키워드 링크

13년 6월 25일 화요일

Page 11: 대규모서비스를지탱하는기술 7

키워드 링크란?

글을 작성하면 일부 키워드에 링크가 자동으로 걸려 클릭시 이 키워드를

설명하는 페이지로 이동하는 서비스

13년 6월 25일 화요일

Page 12: 대규모서비스를지탱하는기술 7

최초 구현 방법

정규 표현으로 구현하는 단순한 방법을 채택

모든 단어를 OR 조건으로 잇는 정규 표현을 사용(foo|bar|baz ...)

$text =~ s/(foo|bar|baz)/&replace_keyword($1)/ge;

13년 6월 25일 화요일

Page 13: 대규모서비스를지탱하는기술 7

문제 발생

키워드 갯수가 많이 늘어남!!

13년 6월 25일 화요일

Page 14: 대규모서비스를지탱하는기술 7

특히 시간이 많이 걸리는 부분

1. 정규 표현을 컴파일 하는 처리 - 미리 정규 표현식을 만들어 저장해 둠으로써 해결

2. 정규표현에서 패턴 매칭하는 처리 - 키워드 링크가 완료된 본문을 캐싱처리 > 근본적인 해결책에 이르지 못함

13년 6월 25일 화요일

Page 15: 대규모서비스를지탱하는기술 7

패턴매칭에 의한 키워드 링크의 문제점

정규표현식 알고리즘

패턴 매칭에 오토마톤을 사용패턴 매칭에 실패하면 다음 단어를 시도

(foo|bar|baz ... )

13년 6월 25일 화요일

Page 16: 대규모서비스를지탱하는기술 7

정규표현을 Trie 방법으로

탐색대상 데이터의 공통 접두사를 모아 놓은 트리 구조엣지를 순회하면서 종단이 발견될 경우 단어가 포함된 것으로 간주

키워드의 양에 상관 없이 대상의 단어 길이 만큼만 계산

13년 6월 25일 화요일

Page 17: 대규모서비스를지탱하는기술 7

Trie를 더 빠르게 AC법 도입패턴 매칭으로 진행되다가 도중에 실패했을 경우,

되돌아 오는 길의 엣지를 다시 Trie에 추가한 데이터 구조를 사용

되돌아 오는 길의 추가는 Trie의 루트부터 너비 우선 탐색으로 구성 가능

13년 6월 25일 화요일

Page 18: 대규모서비스를지탱하는기술 7

CPAN 라이브러리의 Regexp::List로 치환

Trie에 의해 최적화한 방법을 지원하며,정규 표현식 사용이 가능

13년 6월 25일 화요일

Page 19: 대규모서비스를지탱하는기술 7

직접 구현한 AC법VS. RegexpList

AC법을 직접 구현하여 도입함으로 계산량이 줄어들었지만정규 표현식의 각종 옵션을 쓰지 못하게 되어 유연성이 결여됨

Regex::List를 채택함으로써 계산량 및 유연성을 모두 확보

13년 6월 25일 화요일

Page 20: 대규모서비스를지탱하는기술 7

키워드 링크 결론

정규 표현 => AC법 => Regexp:List

처음부터 최적의 구현을 사용하는 것이 옳다고 할 수 없음.데이터가 작은 동안에는 오히려 단순한 것이 결과도 좋음.

하지만, 대규모가 될 시기를 대비해서 본질적인 문제의 해결방법을 염두에 두는 것이 필요

13년 6월 25일 화요일

Page 21: 대규모서비스를지탱하는기술 7

하테나 북마크의기사 분류

13년 6월 25일 화요일

Page 22: 대규모서비스를지탱하는기술 7

기사 분류란?

새로 도착한 기사를 내용 기반으로 자동으로 분류하여 사용자에게 카테고리로 분류해서 보여주는 기능

하테나 기사 분류는 베이지안 필터라는 원리를 사용

13년 6월 25일 화요일

Page 23: 대규모서비스를지탱하는기술 7

베이지안 필터의 원리

‘나이브 베이즈의 정리’를 기반으로 하는 알고리즘

P(C|D) 를 구하는 문제

D가 주어졌을때 C가 발생할 확률즉, D 문서가 주어졌을때 C 카테고리일 확률을 계산

13년 6월 25일 화요일

Page 24: 대규모서비스를지탱하는기술 7

베이즈 정리

P(A|B) 를 계산 가능한 식으로 변경

P(A|B) * P(B) = P(A^B)P(A^B) = P(A) * P(B|A)

즉, P(A|B) = P(B|A) * P(A) / P(B)

13년 6월 25일 화요일

Page 25: 대규모서비스를지탱하는기술 7

베이즈 정리를 적용

원하는 것은 확률 값이 아니라 카테고리 분류 즉, 모든 카테고리에 대한 확률의 우선 순위

P(C|D) = P(D|C) * P(C) / P(D)

모든 카테고리에 대해 P(D)는 같으므로 생략P(C), P(D|C)가 중요

13년 6월 25일 화요일

Page 26: 대규모서비스를지탱하는기술 7

P(D|C), P(C) 구하기

P(C)특정 카테고리가 출현할 확률

학습 데이터를 통해 C가 나타날 확률을 구함

P(D|C)문서는 단어의 집합

즉, P(D|C) => P(W1|C) * P(W2|C) .. P(Wn|C)학습 데이터에서 단어마다 어느 카테고리로 분류되었는지

횟수를 보존한 후 P(D|C)의 근사값을 구함

13년 6월 25일 화요일

Page 27: 대규모서비스를지탱하는기술 7

알고리즘이 실용화되기까지

베이지안 필터는 구조상으로 심플주요 부분은 스크립트 언어로 100 ~ 200 정도

But, 적용까지는...

13년 6월 25일 화요일

Page 28: 대규모서비스를지탱하는기술 7

1. C++ 로 개발한 분류 엔진을 서버화2. 서버와 통신해서 결과를 얻는 Perl 클라이언트 작성,

웹 애플리케이션에서호출3. 학습 데이터를 정기적으로 백업할 수 있는 기능 추가4. 학습 데이터 1,000 건을 수작업으로 준비5. 바람직한 정밀도가 나오는지 추적하기 위한 통계 구조 작성 정밀도 튜닝6. 다중화를 고려해서 스탠바이 시스템 구성7. 웹 애플리케이션 사용자 인터페이스 마련

실무 면에서는 고려해야 할 점은 꽤 많다

실제 베이지안 필터 적용 과정

13년 6월 25일 화요일