참고 : https://www.tensorflow.org/tutorials/
TIL: [Git] 원격 저장소에 파일 삭제하기
Git 캐시 삭제
[OS] macOS에 개발환경 구축하기
참고 :
- https://subicura.com/2017/11/22/mac-os-development-environment-setup.html
- https://younlab.github.io/2018-09-11/pyenv-&-pipenv-install
시스템 설정은 패스하고 설치 프로그램만 알려주겠다.
[ML] Reducing Loss
참고 :
- https://developers.google.com/machine-learning/crash-course/reducing-loss/an-iterative-approach
- https://developers.google.com/machine-learning/crash-course/reducing-loss/gradient-descent
- https://developers.google.com/machine-learning/crash-course/reducing-loss/learning-rate
손실 줄이기
반복 방식
머신러닝 모델이 반복을 통해 어떻게 손실을 줄일까?
처음에는 임의의 지점에서 시작하여 손실값을 알아낸다. 그런 후에 다른 값을 추정하여 손실값을 다시 확인한다. 이런 식으로 점점 손실값을 줄여나가는 것이다. 여기서 최적의 모델을 가능한 한 가장 효율적으로 찾아내는 것이 중요하다.
모델은, 하나 이상의 특성을 입력하여 하나의 예측을 출력하게 된다.
임의의 모델 함수 -> y' = b + wx'
b
와 w
의 초기값은 무엇으로 설정해야하는가?
선형 회귀 문제에서는 초기값이 중요하지 않으므로 임의의 값을 정해도 상관없다.
- b = 0
- w = 0
그리고 최초 특성 값이 10이라고 가정했을 때, 예측 함수에 입력하면 다음과 같이 출력된다. 이 과정은
손실 계산 과정
에 해당된다.
y' = 0 + 0(10)
y' = 0
위의 손실 계산 과정
은 이 모델에서 사용할 손실 함수
이다. 제곱 손실 함수를 사용한다고 가정했을 때, 손실 함수
는 두 개의 입력 값을 갖는다.
- y’ : 특성 x에 대한 모델의 예측 값이다.
- y : 특성 x에 대한 올바른 라벨이다.
그렇게 손실 계산 과정
을 통해 손실 함수
를 구한 뒤에는 매개변수 업데이트 계산 과정
을 하게 된다. 이 지점에서 머신러닝 시스템은 손실 함수
의 값을 검토하여 b
와 w
의 새로운 값을 생성한다.
이런 식으로 머신러닝 시스템이 이러한 모든 특성을 모든 라벨과 대조하여 재평가해서 손실 함수
의 새로운 값을 생성하여 새 매개변수 값을 출력한다고 하면, 그런 후 알고리즘이 손실 값이 가장 낮은 모델 매개변수를 발견할 때까지 반복 학습을 하게된다. 일반적으로 전체 손실이 변하지 않거나 매우 느리게 변할 때까지 계속 반복하게 된다.
이때 모델이 수렴했다고 이야기한다.
경사하강법
반복 방식 다이어그램
(위의 과정)의 매개변수 업데이트 계산 과정
의 알고리즘을 더 구체적으로 예를 들어보겠다.
w
의 가능한 모든 값에 대해 손실을 계산할 시간과 컴퓨팅 자료가 있다고 가정한다. 지금까지 봐왔던 회귀 문제에서 손실과 w
를 대응한 도표는 항상 볼록 함수 모양
을 할 것이다. 즉 항상 그릇 모양으로 나타난다.
볼록 함수
일 때, 이는 기울기가 정확히 0
인 지점에서 최소값이 하나만 존재하게 된다. 이 최소값에서 손실 함수가 수렴
한다.
여기서 전체 데이터 세트에 대해 예상할 수 있는 모든 w
값의 손실 함수
를 계산하는 것은 수렴 지점
을 찾는데 비효율적인 방법이다. 여기서 머신러닝
에서 널리 사용하는 경사하강법 이 있다.
경사하강법
w
에 대한 시작 값(시작점)을 선택한다. (시작점은 중요하지 않으므로 많은 알고리즘에서는w
을 0이나 임의의 값을 선택한다.)- 시작점에서
손실 곡선의 기울기
를 계산한다.기울기
는편미분의 벡터
로, 어느 방향이 더 정확한지 혹은 부정확한지 알려주게 된다.단일 가중치
에 대한손실의 기울기
는 미분 값과 같다.
- 기울기는 항상
손실 함수값
이 가장 크게 증가하는 방향을 향한다.경사하강법 알고리즘
은 최대한 빨리 손실을 줄이기 위해기울기의 반대 방향
으로 이동한다.
손실 함수 곡선
의 다음 지점을 결정하기 위해경사하강법 알고리즘
은 기울기의 크기 일부를 시작점에서 더한다.- 이 과정을 반복하여
최소값
에 점점 접근하게 된다.
학습률
기울기 벡터
는 방향
과 크기
를 모두 갖는다. 경사하강법 알고리즘
은 기울기에 학습률
또는 보폭
이라 불리는 스칼라
를 곱하여 다음 지점을 결정한다.
예를 들면, 기울기
가 2.5
이고 학습률
이 0.01
이면 경사하강법 알고리즘
은 이전 지점으로부터 0.025
떨어진 지점을 다음 지점으로 결정하게 된다.
초매개변수 는 프로그래머가 머신러닝 알고리즘
에서 조정하는 값이다. 대부분의 머신러닝 프로그래머
는 학습률
을 미세 조정
하는데 상당한 시간을 소비한다.
학습률
을 너무 작게 설정하면학습 시간
이 매우 오래 걸릴 것이다.학습률
을 너무 크게 설정하면양자역학 실험을 잘못한 것처럼
다음 지점이곡선의 최저점
을이탈
할 우려가 있다.
모든 회귀 문제에는 골디락스 학습률
이 있다. 골디락스 값
은 손실 함수
가 얼마나 평탄한지 여부와 관련이 있다.
손실 함수의 기울기
가 작다면 더 큰 학습률
을 시도해볼 수 있다. 그렇게 한다면 작은 기울기
를 보완하고 더 큰 보폭
을 만들어 낼 수 있다.
확률적 경사하강법
경사하강법
에서 배치
는 단일 반복에서 기울기를 계산하는 데 사용하는 예의 총 개수이다.
지금까지 배치
가 전체 데이터 세트
라고 가정했지만, 여기서 배치
는 어떤 규모인지에 따라 데이터 세트
에 어마어마한 예측값이 포함되는 경우가 많다.
즉 배치
가 거대해질 수 있다. 배치
가 너무 커지면 단일 반복으로도 계산하는 데 오랜 시간이 걸릴 수 있다.
배치가 거대해졌을 경우, 어떻게 하면 좀 더 효율적인 시간과 적은 계산으로 적절한 기울기를 얻어낼 수 있을까?
데이터 세트
에서 예를 무작위로 선택하게 된다면 훨신 적은 데이터 세트
로 중요한 평균값
을 추정할 수 있다.
확률적 경사하강법(SGD)
은 이런 사고를 더욱 확장한 것으로, 반복당 하나의 예(배치 크기 1)만을 사용한다. ‘확률적(Stochastic)’이란 단어는 각 배치를 포함하는 하나의 예가 무작위로 선택된다는 것을 의미한다.
반복이 충분하면 SGD
가 효과는 있지만 노이즈가 매우 심하다.
미니 배치 확률적 경사하강법(미니 배치 SGD)
는 전체 배치 반복과 SGD 간의 절충안이다.
미니 배치는 일반적으로 무작위로 선택한 10개에서 1,000개 사이의 예로 구성된다.
미니 배치 SGD는 SGD의 노이즈를 줄이면서도 전체 배치보다는 더 효율적이다.
[ML] Generalization
Generalization : peril-of-overfitting
일반화 : 과적합의 위험
적합한 모델을 찾게 되어도 그 후에 새 데이터를 추가할 때 이 모델은 주로 새 데이터에 적합하지 않은 것으로 확인이 된다. 이 모델은 학습한 데이터의 특성에 과적합한다.
과적합 모델은 학습하는 동안 손실이 적지만 새 데이터를 잘 예측하지 못한다. 현재 샘플(데이터)에 적합한 모델을 만들게 되면 이는 필요 이상으로 복잡한 모델이 될 가능성이 높아서 이는 과적합이 발생하게 된다.
머신러닝의 근본적인 과제는 데이터 적합도를 유지하는 동시에 최대한 단순화하는 것이다.
- 모델의 복잡성
- 학습 데이터에 대한 모델의 성능
이와 같은 요인을 기반으로 새 데이터에 맞게 모델이 일반화되는 정도를 통계적으로 설명하는 일반화 한계를 정의하게 된다.
즉, 머신러닝의 목표는 숨겨진 실제 확률 분포에서 추출되는 새 데이터를 잘 예측하는 것이다. 하지만 데이터 세트에서 모델을 만드는 경우 어떻게 이전에 보지 못한 데이터를 얻을 수 있을까?
- 학습 세트 : 모델을 학습시키기 위한 하위 세트
- 테스트 세트 : 모델을 테스트하기 위한 하위 세트
그에 대한 해결 방법으로 데이터 세트를 두 세트로 나누는 것이다.
- 테스트 세트가 충분히 크다.
- 같은 테스트 세트를 반복사용하지 않는다.
위와 같은 경우가 테스트 세트가 성능이 좋으며, 새 데이터에서도 성능이 좋다고 할 수 있다.
일반화에서는 기본적으로 3가지 사항을 가정한다.
- 분포에서 독립적이고 동일하게(i.i.d.) 임의로 예를 추출한다. 즉, 예시가 서로 영향을 미치지 않는다.
- 분포가 정상성을 보인다. 즉, 데이터 세트 내에서 분포가 달라지지 않는다.
- 같은 분포를 따르는 부분에서 예를 추출한다.
[ML] First Steps about Tensorflow
참고 : https://developers.google.com/machine-learning/crash-course/first-steps-with-tensorflow/toolkit
텐서플로우 첫걸음 : 도구
텐서플로우 도구함 현재 계층 구조
- 1층 : CPU, GPU, TPU 커널은 하나 이상의 플랫폼에서 작동
- 2층 : Tensorflow C++
- 3층 : Tensorflow Python C++ 커널을 래핑하는 오퍼레이션 제공
- 4층 : tf.layers, tf.losses, tf.metrics 일반 모델 구성요소용 재사용 가능 라이브러리
- 5층 : Tensorflow Estimators 높은 수준의 개체 지향 API
텐서플로우 도구함 계층구조
- 텐서플로우 : 낮은 수준의 API
- tf.layers/tf.losses/tf.metrics : 일반 모델 구성요소용 라이브러리
- 에스티메이터(tf.estimator) : 높은 수준의 OOP API
텐서플로우 구성 요소
- 그래프 프로토콜 버퍼
- 분산된 그래프를 실행하는 런타임
이 구성요소는 자바 컴파일러 및 JVM과 유사하다. JVM이 여러 하드웨어 플랫폼에서 구현되는 것과 마찬가지로 텐서플로우도 여러 CPU, GPU에서 구현된다.
어느 API를 사용해야 하는가?
높은 수준의 추상화를 사용해야한다. 추상화 수준이 높을수록 더 사용하기 쉽지만, 유연성이 떨어진다. 그래서 먼저 최고 수준의 API로 시작하여 모든 작업을 실행하는 것이 좋다.
특별한 모델링 문제를 해결하기 위해 더 유연한 추상화가 필요하면, 한 수준 아래로 이동한다. 각 수준은 낮은 수준의 API를 사용하여 제작되므로 계층구조를 낮추는 것이 합리적이다.
tf.estimator API
tf.estimator은 많은 실습에서 사용된다. 낮은 수준의 텐서플로우를 사용해도 실습의 모든 작업을 실행할 수 있지만, tf.estimator를 사용하면 코드 행 수가 크게 줄어들게 된다.
tf.estimator는 scikit-learn API와 호환된다. scikit-learn은 Python의 매우 인기 있는 오픈소스 ML 라이브러리로, 100,000명이 넘는 사람들이 이용하고 있다.
tf.estimator로 구현된 선형 회귀 프로그램의 형식은 대체로 다음과 같다.
import tensorflow as tf
# Set up a linear classifier
classifier = tf.estimator.LinearClassifier()
# Train the model on some example data
classifier.train(input_fn=train_input_fn, steps=2000)
# Use it to predict
predictions = classifier.predict(input_fn=predict_input_fn)
[DB] Connection pool
Connection Pool
이란 데이터베이스와 애플리케이션을 효율적으로 연결하는 라이브러리로 웹 애플리케이션에서 필수적이다.
웹 애플리케이션 서버로 상용 제품을 사용하면 보통 제조사에서 제공하는 커넥션 풀 구현체를 사용한다. 그 외에는 오픈소스 라이브러리로 Apache Commons DBCP
와 Tomcat-JDBC
, BoneCP
, HikariCP
등이 있다. 주로 많이 쓰이는 것은 HikariCP
라고 한다.
커넥션 풀 라이브러리를 잘 사용하면 데이터베이스와 애플리케이션의 일부분에서 발생하는 문제가 전체로 전파되지 않게 할 수 있고, 일시적인 문제가 긴 시간 이어지지 않게 할 수 있다. 반대로 값을 적절히 설정하지 않아 커넥션 풀이 애플리케이션에서 병목 지점이 되는 경우도 있다.
웹 애플리케이션의 요청은 대부분 DBMS로 연결되기 때문에 커넥션 풀 라이브러리 설정은 전체 애플리케이션의 성능과 안정성에 영향을 미치는 핵심이다.