모멘텀(Momentum) 모멘텀이란 물리학에서 쓰이는 용어인 운동량, 동력을 뜻하며 이를 옵티마이저 개념에 적용한 것이 모멘텀 옵티마이저이다. 우선 모멘텀을 이해하기 위해서는 이전에 등장한 경사하강법 계열들을 이해해야 하는데 이 개념이 나온 이유가 바로 경사하강법 특히 확률적 경사하강법(Stochastic Gradient Descent, SGD)에서 나온 개념이기 때문이다. SGD의 지그재그로 움직이며 최적화되는 것을 해결하기 위해서 나왔으며 너무 왔다갔다 해서 지역 최소값(local minimum)에 갇혀 빠져나오지 못하는 경우가 많은데 이를 위해 관성과 가속도 넣어서 지그재그가 아니라 한 방향으로 좀 더 이동할 수 있게 한 것이다. 현재 이동하는 방향과는 별개로 과거에 이동을 했었던 방향을 기억하여 ..
추천시스템의 개념 추천 시스템(Recommender System)에 대한 정의는 다음과 같이 정의 할 수 있다. 사용자의 행동 데이터와 대상 데이터(ex: 상품, 영화 등등)를 분석하여 사용자의 현재 상황에 가장 적절한 대상 데이터를 추천하는 시스템 적절한 추천을 만들기 위해서 수많은 사람들이 연구를 해왔고, 한 사이트내에서는 적게는 하나부터 많게는 몇백개(혹은 천개 이상일수도)의 알고리즘이 존재하기도 한다. 미국을 대표하는 FANG(Facebook, Amazon, Netflix, Google) 기업들 중, 추천 서비스를 매우 적극적으로 활용하는 기업이 아마존(Amazon)과 넷플릭스(Netflix)이고 특히 넷플릭스=추천서비스라는 기업으로 알려지게 되면서 그동안 국내에서도 등한시 했던 추천에 대한 연구..
바로 이전 포스팅에서는 형태소 분석기별 가장 중요한 명사를 추출하는 성능(속도 측면)을 비교해 봤습니다. 품사 태깅(pos-tagging)은 우리가 흔히 형태소 분석기라는 말과 동의어로 생각하는 기능으로 명사만 추출하는게 아니라 문장의 모든 품사를 분석하게 됩니다. 명사만 추출하는 것은 사실 어렵지 않습니다. 단어안에 명사를 그냥 찾으면 그만이니까요. 하지만 pos-tagging은 한국어 문법을 제대로 이해해야 하고, 분석 방법과 퀄리티에 따라 속도에 큰 영향을 주게 됩니다. 즉, 명사만 추출하는 것으로 속도가 오래 걸리지 않지만 대다수 pos-tagging 작업으로 인해서 형태소 분석기가 오래 걸리게 되는 것이죠. 예를 들어, 자모 단위로 분리해서 분석을 한다면 상당히 큰 cpu 자원을 사용할 수도 있..
최근 konlpy 사이트에 적혀 있는 형태소 분석기의 분석 속도와 실제로 느꼈던 kolnpy의 개별 형태소 분석기의 성능이 맞지 않는 것 같아서 비교적 용량이 많은 문장을 기반으로 형태소 분석기의 성능을 체크해보려고 합니다. 실험에 사용된 형태소 분석기는 총 3종인 코모란(Komoran), 꼬꼬마(Kkma), Okt(Open korean text)이며 꼬꼬마는 분석속도가 나쁜 것이 체감이 날 정도로 좋지 않지만 코모란과 okt의 분석 속도도 예상 밖인것 같아서 제대로 시간을 체크하고자 하였습니다. 공통코드 import urllib.request import time from konlpy.tag import Okt from konlpy.tag import Komoran from konlpy.tag impo..
데이터의 레이블(Label)들을 보면 숫자로 되어 있어서 그대로 사용할 수 있는 데이터가 있는 반면 대다수는 문자열 형태로 되어 있어서 한번 변환을 거쳐야 되는 경우가 많다. 레이블의 경우 의미가 없는 숫자보다는 문자형태로 되어 있어야 의미를 파악하기 쉽고 나중에 데이터를 검증하기도 용이하면 더 나아가 가시화(Visualization)등을 할 때에도 유리하다. 이 레이블을 숫자로 변경하는 방법은 우리가 직접 코드를 짜도 되고 크게 어려운 기술이 아니지만 이미 라이브러리(Library)가 존재하고 있는 상태이기 때문에 굳이 힘들게 짤 필요는 없을 것 같다. 이렇게 문자열 데이터를 숫자 형태로 레이블을 변환해주는 것을 레이블 인코딩이라고 하는데 사이킷런(scikit learn, sklearn)에서는 레이블 ..
사망선고가 내려졌는데 영원히 죽지 않고 계속 떠돌아 다니는 사람이 있다고 하면 믿을 것인가? 그러나 아직도 멀쩡히 죽지 않고 살아있는 사람이 있는데 바로 흑인 여성인 헨리에타 랙스(Henrietta Lacks)이다. 헨리에타 랙스(Henrietta Lacks) 1940년대에 실험에 쓰였던 세포들은 며칠 채 생존하지 못했기 때문에 과학자들은 실험을 진행하는 것보다 세포를 살리는 것에 더 많은 시간을 할애했었다. 1951년 미국 볼티모어에서 흑인 여성 헨리에타 랙스는 아랫배 통증을 느껴 존스홉킨스 병원을 찾았으나 자궁 경부암을 진단받았고 8개월 후에 사망을 하였다. 헨리에타의 사망 후 그녀의 종양 샘플에서 채취된 암세포는 연구원의 실험실로 보내졌고 그 실험실은 인간 세포를 배양하는 실험이었다. 인간의 세포는..
현재 가장 많이 사용되는 딥러닝(Deep Learning) 기반의 분산 표현(distributed representation) 워드임베딩(Word Embedding, 자연어를 기계가 이해할 수 있는 숫자 벡터 값으로 변경하는 기술)은 Word2vec이라 할 수 있다. Word2Vec 임베딩 기술은 단순하지만 성능이 우수해서 많이 사용되는데 치명적인 문제점도 존재한다. 바로 주어지는 단어(Corpus, 말뭉치)를 기반으로 학습을 진행하며 존재하지 않던 단어를 던졌을 때 에러가 발생하는 등 만능적인 모습을 보여주지 않는다. 당연히 학습 안된 단어는 나오지 말아야 되는거 아니냐? 할 수 있겠지만 이 문제를 해결하기 위한 방식이 연구되고 있었고, 페이스북(Facebook)에서 이를 보완하는 언어 모델이 등장한다..
확률적 경사하강법은 대표적이고 인간에게 아담과 같은 존재인 경사 하강법(Gradient Descent, GD)에게서 파생된 최적화 알고리즘(Optimizer, 옵티마이저)이다. 일단 본 포스팅에 앞서 경사 하강법에는 Mini Batch Gradient Descent도 있지만 보통 mini batch를 SGD를 포함시켜서 mini batch의 특징도 SGD로 설명 하였다. 경사 하강법의 단점과 확률적 경사하강법의 원리 그러나 GD에게는 치명적인 단점이 있는데 바로 한스텝 내딛을 때마다 전체 데이터를 이용하는 단점이 있다. 이를 등산으로 비교하자면, 내가 한걸음 옮길 때마다 지도랑 나침반보고 갈길 정한다는 것과 같다. 대충 들어도 엄청 비효율적인것 같지만 반면에 성능자체는 꽤 괜찮게 나올 수 있다는 것도 대..
기계학습(Machine Learning, 머신러닝)과 딥러닝(Deep Learning)이 현재 이정도까지 수준까지 발전하기에는 수많은 사람들의 노력과 정교한 수학적 모델들이 계속 고도화되었으며 많은 사람들이 실제 프로젝트에 활용하면서 무엇이 어떤 상황에 좋고 나쁨을 피드백하거나 논문등으로 발표하기 때문일거라 생각한다. 머신러닝의 성능 개선법 머신러닝, 딥러닝의 성능을 좌우하는 녀석 중에 옵티마이저(Optimizer, 최적화)가 있는데 DB를 잘아는 사람들은 옵티마이저가 최소의 Cost로 결과를 찾아주는 것으로 알고 있을 것이다. 사실 DB와 머신러닝, 딥러닝에서 말하는 옵티마이저의 궁극적인 목적은 동일할 것이다. DB에서 최소의 코스트로 결과를 찾는 개념과 신경망의 모델이 실제 결과와 예측 결과의 차이를..
순환신경망(RNN)의 개념 순환신경망(Recurrent Neural Network, RNN)은 입력과 출력을 시퀀스(Sequence) 단위로 처리하는 모델이다. 여기서 시퀀스란 연관된 연속의 데이터를 의미하며, 시계열 데이터에 적합한 신경망 모델이라 할 수 있다. ex) 자연어 처리, 순서를 가지는 정보, 연속적인 시간 간격으로 배치된 데이터 심층 신경망(Deep Neural Network, DNN)의 경우 파라미터들이 모두 독립적이었으나, RNN의 파라미터들은 모두 공유하는 것이 특징이다. 장기 의존성 문제점 (Long-Term Dependency Problem) 일반적인 RNN의 경우 짧은 시퀀스를 처리할 경우 유리하며, 관련 정보와 그 정보를 사용하는 지점 사이 거리가 멀어지는 경우 학습 능력이 현..
String부터 StringBuffer, StringBuilder까지 자바는 문자열을 다루기 위한 3개의 클래스를 제공한다. 개발 초기에는 아무런 생각 없이 String에 값을 계속 더하는 행위를 하지만, 이 방법이 잘못 되었다는 것은 개발이 어느정도 능숙해지고부터이다. String은 불변적인 객체이다보니 동적으로 문자열이 바뀌는 것에 취약하다. 그래서 새로운 문자열을 더할 경우 기존 문자열을 삭제하고 다시 두개의 문자열을 합친 후 String 변수에 보내는데 이때 garbage collector가 발생하게 된다. 최근의 자바 버전에서는 내부적으로 String에서도 문자열을 합칠 때 강제적으로 StringBuilder로 변하게 되는데 아무튼 적당한 문자열을 String에 하는 것은 큰 문제가 되지 않지만..
마이크로서비스 혹은 마이크로서비스 아키텍처는 크게 2가지의 목표를 가지고 일체형 서비스를 작은 컴포넌트화 시키는 것이다. 빠르게 개발하고 지속적으로 배포한다 -> Agile의 개념 쉽게 Scaling 할 수 있어야 한다 사실 마이크로 서비스는 현대에 들어서 애자일(Agile)이 뜨고, 가상화 및 클라우드 시스템의 등장으로 잦은 배포와 거대한 서버를 소형 서버로 쪼갤 수 있으므로 개발의 효율을 극대화하기 위해서 등장했다. python의 경우 djang과 flusk로 api를 쉽게 띄우며, spring의 경우 마이크로 아키텍처와 함께 스프링부트가 뜨면서 대형 프로젝트를 제외하면 대세가 되어가고 있다. 예를 들어, 어떤 거대한 웹사이트가 하나의 웹서비스(Monolithic Architecture, 모노리식 아..