프로그래밍/파이썬

딥러닝과 텐서플로우 기초 (텐서플로우로 선형 회귀 문제 풀기)

매 석 2022. 10. 23. 15:51
반응형

1. 딥러닝이란?

- 기존 머신러닝에서는 사람이 기계가 학습할 데이터 특징을 설계했지만, 딥러닝에서는 데이터 입력에서부터 

  결과 출력까지 사람의 개입을 배제할 수 있다.
  과적합을 더욱 효과적으로 방지할 수 있는 드롭아웃 개념이 나오고, 컴퓨팅 파워 증가로 빅데이터에

  대한 처리가 가능해지면서 딥러닝뿐 아니라 머신러닝 기술 전반이 폭발적으로 발전했다.

 (머신러닝, 활성화 함수 내용은 아래 링크를 참조)

 

인공지능 머신러닝과 알고리즘 (Feat. 퍼셉트론 알고리즘, 활성화 함수)

1. 머신러닝이란? - 컴퓨터 시스템이 사용하는 알고리즘과 통계적 모델에 대한 과학적인 연구다. 컴퓨터는 명시적인 지시 사항들을 이용하는 대신에 모델과 추론에 의존하여 효과적으로 작업을

maeseok.tistory.com

 

2. 딥러닝에서 학습이란?

- 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것을 뜻한다.
  손실 함수는 신경망이 학습할 수 있도록 해주는 지표인데, 이 손실 함수의 결괏값을 가장 작게 만드는
  가중치 매개변수를 찾는 것이 학습의 목표다.

 

3. 텐서플로우란?

- 구글 브레인팀에서 심층 신경망 연구를 위해 개발한 머신러닝 라이브러리이다.
  현재는 더 높은 수준의 직관적인 케라스 API를 사용할 수 있어, 전체 코드가 깔끔해지고

  구현 과정에서 일어나는 실수가 줄어들었다.

 

4. 텐서의 차원

텐서플로에서 모든 데이터는 텐서 데이터 구조를 사용해서 표현한다. 
텐서는 동적 크기를 지니는 다차원 데이터 배열을 의미한다.
텐서는 n차원의 배열이나 리스트로도 표현할 수 있으며, 프로그램 내에서 모든 데이터는 텐서의 형태로 이동한다.
각각의 텐서는 차원, 형태, 자료형을 지니는데, 차원은 동적으로 변할 수 있다.

차원 수학 엔티티 파이썬 예시
0 스칼라(크기만 지님) s= 123
1 벡터(크기+방향) v = [1.1,2.2,3.3]
2 매트릭스(숫자 테이블) m = [[1,2,3], [4,5,6], [7,8,9]]
3 3-텐서(숫자 큐브) t = [[[2],[4],[6]], [[8],[10],[12]], [[14],[16],[18]]]
n n-텐서 ...

 

5. 텐서플로우로 선형 회귀 문제 풀기

텐서플로우로 선형 회귀 문제를 푸는 것은

머신러닝에서 h(x) = wx+b 에서 가중치(w)와 편향(b) 값을 알아내는 것과 똑같다.

여기서 사용되는 알고리즘은 경사 하강 알고리즘이다.

 

경사 하강 알고리즘
예측값과 실젯값이 얼마나 차이가 나는지 수치화한 것을 비용 또는 손실이라 한다.
비용 함수는 예측값과 실젯값의 차이를 제곱해서 평균 낸 값을 반환하는데, 이를 오차제곱평균이라 한다.
이렇게 비용 함수의 경사를 타고 내려가며 최솟값을 구해가는 방식을 경사 하강 알고리즘이라 한다.

import matplotlib.pylab as plt
import tensorflow as tf

x_data = [1, 2, 3, 4, 5]
#y=1*x+1 값을 준비
y_data = [2, 3, 4, 5, 6]

#가중치를 임의 값 0.7로 초기화
w = tf.Variable(0.7)
#편향을 임의 값 0.7로 초기화
b = tf.Variable(0.7)
#학습률을 설정
#너무 크면 비용이 커지는 오버슈팅 현상이 발생
#너무 작으면 시간이 너무 오래 걸린다.
learn = 0.01

#1회부터 1100회까지 반복
for i in range(1, 1100+1): 
    #내부의 계산 과정을 tape에 기록해두면
    #tape.gradient()함수를 이용해서 미분값을 구할 수 있다.
    with tf.GradientTape() as tape:
        #w*x+b로 가설을 정한다.
        hypo = w * x_data + b
        #손실 비용은 오차제곱평균으로 구한다.
        #tf.losses.mean_squared_error(y, y_hat)와 같다.
        cost = tf.reduce_mean((hypo - y_data)**2)
    #w와 b에 대해 손실을 미분해서 dw, db를 구한다.
    dw, db = tape.gradient(cost, [w, b])
    #w에서 학습률*dw값을 빼서 w에 저장
    w.assign_sub(learn * dw)
    b.assign_sub(learn * db)

 

6. 선형 회귀 문제 풀이 과정 시각화

 

위 사진과 같이 반복 학습을 통해 초기 설정한 값을 찾아냈다.

이것이 머신러닝의 기초가 되는 것이다.