분류 전체보기 87

MAP(Maximum A Posterior)

Bayes Theorem 조건부 확률 분포를 뒤집어 표현하는 방법 데이터가 주어졌을 때, 어떤 모델을 학습시키는 방법에는 MAP, MLE 두 방법이 있다. 위 수식에서, P(L|features) Posterior P(features|L)이 Likelihood P(L)이 Prior이다. 예를 들어, (김기현님 머신러닝 강의에서 가져온 예시) 절도 사건의 범인이 발자국을 남겼는데 그 사이즈가 240이라면, 범인은 남자인가 여자인가? 의 문제를 품에 있어서 가장 쉽게 접근하는 방법은 Likelihood를 비교해보는 것이다. 여자일 때의 발사이즈가 240인 사람, 남자일 때 발사이즈가 240인 사람을 비교해서 확률이 더 높은 쪽을 선택하는 것이다. 그런데, 이 접근법은 '남녀 성별 비율이 같다'고 가정을 깔고 ..

DL&ML/concept 2021.03.10

Likelihood & MLE(최대 우도 추정)

Likelihood & Maximum Likelihood Estimation(MLE) Likelihood(우도; 가능도)란? 어떤 모델(파라미터;확률분포)과 데이터가 주어졌을 때, 이 모델이 데이터를 얼마나 잘 설명하는지? 수치화 할 수 있는 척도이다. Likelihood는 모델의 파라미터 θ에 대한 함수이다. 관측된 데이터가 주어졌을 때, 어떤 파라미터 θ가 입력되느냐에 따라 Likelihood 함수 결과값의 높고 낮음이 결정 된다. 예를 들어, 이항 분포의 확률 B(n, p)을 정의하는 확률 질량 함수가 있고 n번 동전을 던져 x번 앞면이 나올 확률은 다음과 같이 구할 수 있다하자. 모델 파라미터 p를 모르는 상태에서 데이터를 관측한 결과 n=100, x=24가 나왔다면 이를 대입한 100C24 * ..

DL&ML/concept 2021.03.10

딥러닝 모델의 API화 (AWS lambda)

딥러닝 모델 (pytorch, keras, ...) 개발을 끝내고, 실 서비스를 위한 API화를 할 때 이전 까지 나는 보통 flask/gunicorn으로 감싸서 도커화 한 이후에 쿠버네티스에 띄우든, 독립된 서버에 띄우든 하는 방식을 생각해왔다. 이 때, AWS Lambda(람다)를 이용하면, API 서버를 직접 작성할 필요 없고, 특정 형식을 따르는 핸들러만 만들어 업로드하면 된다. (물론 자잘한 config가 필요하긴 함) API 서버 구현에서의 복잡도를 줄여주는 것 말고도 아마존웹서비스 람다 하면, 서비스 스케일 조정에 있어 매우 유연하다는 점을 빠뜨릴 수 없다. 어쨌든, 모델 및 예측 함수를 람다에 올리는 방법은 다양하다. 1. serverless 프레임워크를 이용 2. AWS의 sam(serv..

http&server 2021.01.27

멀티 프로세싱 프로그램에서 자식이 에러날 경우 부모 죽이기(pkill)

드론 관련 과제를 진행하면서 개발하고 있는 객체 트래킹 시스템 자체가 매우 복잡해졌다. 이 시스템은 채점 시스템에 업로드 되어 실행되고 결과를 내도록 작성되어있다. 마스터, 워커 프로세스들이 굉장히 다양하게 존재하고 과제 진행에 따라 이런 저런 자체 요구사항이 추가 되었는데 그 중 까다로웠던 것 하나가 특정 작업에 속해있는 워커(자식 프로세스)에서 에러가 나는 경우 가장 최상단에 위치한 프로그램 진입점에 해당하는 프로세스(predict.py)를 멈추게 하는 것이었다. 채점 시스템은 predict.py를 실행 시키고 predict.py는 여러 process를 띄우며, process들은 subprocess들을 띄운다. 트래킹 시스템을 구성하는 워커들이 동작하다 에러가 나는경우, 채점 시스템이 에러로 인식하기..

trouble shooting 2021.01.05

celery + flask 를 이용한 파이썬 비동기 처리 API 구현

flask는 유저의 요청을 동기적으로 처리한다. 실행 시간이 오래 걸릴 것으로 기대되는 엔드포인트의 경우, 비동기 처리 방식으로 구현하고 싶을 수 있는데 celery 를 이용해서 아래와 같이 구현하면 된다. celery의 백엔드로 레디스를 사용할 것이므로 먼저 설치&실행 해준다. 아래 코드에선 - 비동기 작업 (adder) 시작 - 특정 태스크(id)의 상태 체크 - 결과 받아보기 endpoint를 구현하였다. import os import sys import time from flask import Flask from flask import request from flask import jsonify from celery import Celery def make_celery(app): celery = ..

http&server 2021.01.05

Zookeeper를 이용한 분산 시스템 공용 데이터 관리

이미지 검색 시스템이 있고, 시스템 자체가 여러 대의 클러스터로 구성되어 있다. 특정 인물의 처리를 무시하기 위해서 PASS_LIST를 두어 공용으로 관리하고 싶은데 무겁게 DB까지는 쓸 필요가 없이, 주키퍼를 이용해서 노드를 만들어 놓고 데이터를 저장/접근하면 된다. (이미 주키퍼 앙상블이 구축되어 있다고 가정) 이후에, 모든 클러스터에서 주키퍼 앙상블에 접속하여 해당 노드에 저장된 값을 얻어서 의도된 작업을 수행하면 된다. ex) /abcsystem/passlist python client가 필요했기 때문에 kazoo.readthedocs.io/en/latest/basic_usage.html Basic Usage — kazoo 2.6.0 documentation To begin using Kazoo,..

dist. system 2020.11.03

133. Clone Graph

leetcode.com/problems/clone-graph/ Clone Graph - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 그래프를 클론하는 문제다. dfs로 접근했다. top to bottom으로 뻗어나갔다가 바텀 찍고 돌아오면서 자식 노드를 생성과 동시에 리턴하면서 부모로 모으는 식으로 하려 했는데 중복 체크에 있어서 애매한 부분이 있어 top to bottom으로 나가되 노드를 미리 생성하고 빈 껍데기라도 미리 리스팅 해서 부모에 추가하는 식으로..

algorithm 2020.11.01

785. Is Graph Bipartite?

leetcode.com/problems/is-graph-bipartite/ Is Graph Bipartite? - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 주어진 그래프가 bipartite(이분 그래프)인지 판단하는 문제다. 큐를 이용해서 dfs를 구현하였다. 168 ms, faster than 81.64% from collections import deque class Solution: def isBipartite(self, graph: List[List..

algorithm 2020.11.01