sueleesoossoo's devlog


  • Home

  • Categories

  • About

  • Archives

  • Tags

Get Started with Tensorflow

Posted on 2018-10-11 | 0 comments

참고 : https://www.tensorflow.org/tutorials/

Read more »

TIL: [Git] 원격 저장소에 파일 삭제하기

Posted on 2018-10-09 | 0 comments

Git 캐시 삭제

Read more »

[OS] macOS에 개발환경 구축하기

Posted on 2018-10-06 | 0 comments

참고 :

  • https://subicura.com/2017/11/22/mac-os-development-environment-setup.html
  • https://younlab.github.io/2018-09-11/pyenv-&-pipenv-install 시스템 설정은 패스하고 설치 프로그램만 알려주겠다.

Read more »

[ML] Reducing Loss

Posted on 2018-10-06 | 0 comments

참고 :

  • 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 값의 손실 함수를 계산하는 것은 수렴 지점을 찾는데 비효율적인 방법이다. 여기서 머신러닝에서 널리 사용하는 경사하강법 이 있다.

경사하강법

  1. w에 대한 시작 값(시작점)을 선택한다. (시작점은 중요하지 않으므로 많은 알고리즘에서는 w을 0이나 임의의 값을 선택한다.)
  2. 시작점에서 손실 곡선의 기울기를 계산한다. 기울기는 편미분의 벡터로, 어느 방향이 더 정확한지 혹은 부정확한지 알려주게 된다. 단일 가중치에 대한 손실의 기울기는 미분 값과 같다.
  • 기울기는 항상 손실 함수값이 가장 크게 증가하는 방향을 향한다. 경사하강법 알고리즘은 최대한 빨리 손실을 줄이기 위해 기울기의 반대 방향으로 이동한다.
  1. 손실 함수 곡선의 다음 지점을 결정하기 위해 경사하강법 알고리즘은 기울기의 크기 일부를 시작점에서 더한다.
  2. 이 과정을 반복하여 최소값에 점점 접근하게 된다.

학습률

기울기 벡터는 방향과 크기를 모두 갖는다. 경사하강법 알고리즘은 기울기에 학습률 또는 보폭이라 불리는 스칼라를 곱하여 다음 지점을 결정한다. 예를 들면, 기울기가 2.5이고 학습률이 0.01이면 경사하강법 알고리즘은 이전 지점으로부터 0.025 떨어진 지점을 다음 지점으로 결정하게 된다.

초매개변수 는 프로그래머가 머신러닝 알고리즘에서 조정하는 값이다. 대부분의 머신러닝 프로그래머는 학습률을 미세 조정하는데 상당한 시간을 소비한다.

  • 학습률을 너무 작게 설정하면 학습 시간이 매우 오래 걸릴 것이다.
  • 학습률을 너무 크게 설정하면 양자역학 실험을 잘못한 것처럼 다음 지점이 곡선의 최저점을 이탈할 우려가 있다.

모든 회귀 문제에는 골디락스 학습률이 있다. 골디락스 값은 손실 함수가 얼마나 평탄한지 여부와 관련이 있다.
손실 함수의 기울기가 작다면 더 큰 학습률을 시도해볼 수 있다. 그렇게 한다면 작은 기울기를 보완하고 더 큰 보폭을 만들어 낼 수 있다.

확률적 경사하강법

경사하강법에서 배치는 단일 반복에서 기울기를 계산하는 데 사용하는 예의 총 개수이다. 지금까지 배치가 전체 데이터 세트라고 가정했지만, 여기서 배치는 어떤 규모인지에 따라 데이터 세트에 어마어마한 예측값이 포함되는 경우가 많다. 즉 배치가 거대해질 수 있다. 배치가 너무 커지면 단일 반복으로도 계산하는 데 오랜 시간이 걸릴 수 있다.

배치가 거대해졌을 경우, 어떻게 하면 좀 더 효율적인 시간과 적은 계산으로 적절한 기울기를 얻어낼 수 있을까?

데이터 세트에서 예를 무작위로 선택하게 된다면 훨신 적은 데이터 세트로 중요한 평균값을 추정할 수 있다. 확률적 경사하강법(SGD)은 이런 사고를 더욱 확장한 것으로, 반복당 하나의 예(배치 크기 1)만을 사용한다. ‘확률적(Stochastic)’이란 단어는 각 배치를 포함하는 하나의 예가 무작위로 선택된다는 것을 의미한다. 반복이 충분하면 SGD가 효과는 있지만 노이즈가 매우 심하다.

미니 배치 확률적 경사하강법(미니 배치 SGD)는 전체 배치 반복과 SGD 간의 절충안이다.
미니 배치는 일반적으로 무작위로 선택한 10개에서 1,000개 사이의 예로 구성된다. 미니 배치 SGD는 SGD의 노이즈를 줄이면서도 전체 배치보다는 더 효율적이다.

Read more »

[ML] Generalization

Posted on 2018-10-06 | 0 comments

Generalization : peril-of-overfitting

일반화 : 과적합의 위험

적합한 모델을 찾게 되어도 그 후에 새 데이터를 추가할 때 이 모델은 주로 새 데이터에 적합하지 않은 것으로 확인이 된다. 이 모델은 학습한 데이터의 특성에 과적합한다.

과적합 모델은 학습하는 동안 손실이 적지만 새 데이터를 잘 예측하지 못한다. 현재 샘플(데이터)에 적합한 모델을 만들게 되면 이는 필요 이상으로 복잡한 모델이 될 가능성이 높아서 이는 과적합이 발생하게 된다.

머신러닝의 근본적인 과제는 데이터 적합도를 유지하는 동시에 최대한 단순화하는 것이다.

  • 모델의 복잡성
  • 학습 데이터에 대한 모델의 성능

이와 같은 요인을 기반으로 새 데이터에 맞게 모델이 일반화되는 정도를 통계적으로 설명하는 일반화 한계를 정의하게 된다.

즉, 머신러닝의 목표는 숨겨진 실제 확률 분포에서 추출되는 새 데이터를 잘 예측하는 것이다. 하지만 데이터 세트에서 모델을 만드는 경우 어떻게 이전에 보지 못한 데이터를 얻을 수 있을까?

  • 학습 세트 : 모델을 학습시키기 위한 하위 세트
  • 테스트 세트 : 모델을 테스트하기 위한 하위 세트

그에 대한 해결 방법으로 데이터 세트를 두 세트로 나누는 것이다.

  • 테스트 세트가 충분히 크다.
  • 같은 테스트 세트를 반복사용하지 않는다.

위와 같은 경우가 테스트 세트가 성능이 좋으며, 새 데이터에서도 성능이 좋다고 할 수 있다.

일반화에서는 기본적으로 3가지 사항을 가정한다.

  1. 분포에서 독립적이고 동일하게(i.i.d.) 임의로 예를 추출한다. 즉, 예시가 서로 영향을 미치지 않는다.
  2. 분포가 정상성을 보인다. 즉, 데이터 세트 내에서 분포가 달라지지 않는다.
  3. 같은 분포를 따르는 부분에서 예를 추출한다.
Read more »

[ML] First Steps about Tensorflow

Posted on 2018-10-06 | 0 comments

참고 : 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)
Read more »

[DB] Connection pool

Posted on 2018-10-06 | 0 comments

Connection Pool이란 데이터베이스와 애플리케이션을 효율적으로 연결하는 라이브러리로 웹 애플리케이션에서 필수적이다.
웹 애플리케이션 서버로 상용 제품을 사용하면 보통 제조사에서 제공하는 커넥션 풀 구현체를 사용한다. 그 외에는 오픈소스 라이브러리로 Apache Commons DBCP와 Tomcat-JDBC, BoneCP, HikariCP 등이 있다. 주로 많이 쓰이는 것은 HikariCP라고 한다.

커넥션 풀 라이브러리를 잘 사용하면 데이터베이스와 애플리케이션의 일부분에서 발생하는 문제가 전체로 전파되지 않게 할 수 있고, 일시적인 문제가 긴 시간 이어지지 않게 할 수 있다. 반대로 값을 적절히 설정하지 않아 커넥션 풀이 애플리케이션에서 병목 지점이 되는 경우도 있다.
웹 애플리케이션의 요청은 대부분 DBMS로 연결되기 때문에 커넥션 풀 라이브러리 설정은 전체 애플리케이션의 성능과 안정성에 영향을 미치는 핵심이다.

Read more »

TIL: [Spring] @ComponentScan & @Import

Posted on 2018-10-05 | 0 comments

ComponentScan

Read more »

TIL: [Spring] Springboot Start Project 시 유의할 점

Posted on 2018-10-04 | 0 comments

Spring Project를 만들 때

Read more »

TIL: [Spring] Stereotype-annotation

Posted on 2018-10-03 | 0 comments

Stereotype-annotation

Read more »
1 … 31 32 33 … 35
LEESOO

LEESOO

Junior Frontend Developer

345 posts
12 categories
35 tags
RSS
GitHub
© 2025 LEESOO
Powered by Jekyll
Theme - NexT.Muse