티스토리 뷰
1️⃣ 딥러닝 모델의 학습 방법
▶ 딥러닝 모델의 구성 요소
▶ 딥러닝 모델의 학습 방법
Loss function 을 최소화하기 위해 최적화 알고리즘을 적용
→ 예측값과 실제값 간의 오차값을 최소화하기 위해 오차값을 최소화하는 모델의 인자를 찾는 알고리즘을 적용
손실 함수 (Loss Function)
- 실제값과 모델이 예측한 값 간의 차이를 계산해주는 함수
- 손실 함수의 값은 가중치와 편향을 업데이트하는 데에 사용된다.
- Loss(손실) : 예측값과 실제 값 간의 오차값
최적화 (Optimization)
- 오차값을 최소화하는 모델의 인자를 찾는 것
▶ Gradient Descent (GD)
- 가장 기본적인 최적화 알고리즘
- 신경망의 가중치들을 𝑊라고 했을 때, 손실함수 𝐿𝑜𝑠𝑠(𝑊)의 값을 최소화하기 위해 기울기 ∇𝐿𝑜𝑠𝑠(𝑊)를 이용하는 방법
- 손실 함수(loss function)의 미분값인 gradient를 이용해 모델에게 맞는 최적의 가중치(weight), 즉 손실 함수의 값을 최소화 하는 가중치를 구할 수 있는 알고리즘
각 가중치들의 기울기를 구하는 방법
- 딥러닝에서는 역전파(Backpropagation)을 통해 각 가중치들의 기울기를 구할 수 있다.
▶ 역전파 (Backpropagation)
Forward Propagation (순전파)
- 입력 값을 바탕으로 출력 값을 계산하는 과정
ex) 순전파 예시
Backpropagation (역전파)
- 목표 target 값과 실제 모델이 예측한 output 값이 얼마나 차이나는지 구한 후 오차값을
다시 뒤로 전파해가며 변수들을 갱신하는 알고리즘
- Forward propagation의 반대 방향으로 이루어지는 과정
- 다층 퍼셉트론 모델을 이루는 가중치들을 개선하기 위해 개발된 여러 알고리즘들 중 가장 유명하고 널리 쓰이는 방법
ex) 역전파 예시
2️⃣ 텐서플로우 (TensorFlow)
딥러닝 모델 구현을 위해서는
딥러닝 모델(파이썬) + 좋은 연산 장치(하드웨어) + 연산 장치 제어(C/C++) 등등 배울 것이 너무 많다.
→ 프레임워크를 통한 딥러닝 모델 구현
- 딥러닝 모델의 학습과 추론을 위한 프로그램
- 딥러닝 모델을 쉽게 구현, 사용가능
그 중 TensorFlow와 PyTorc가 현재 가장 많이 사용되고, 빠른 성장율을 가진 프레임워크이다.
▶ 텐서플로우
- 유연하고, 효율적이며, 확장성 있는 딥러닝 프레임워크
- 대형 클러스터 컴퓨터부터 스마트폰까지 다양한 디바이스에서 동작한다.
- 데이터 플로우 그래프를 사용하여 수치 연산을 하는 오픈소스 소프트웨어 라이브러리
- CPU나 GPU를 사용하여 연산을 구동시킬수 있으며, 머신러닝과 딥러닝 연구를 목적으로 구글 브레인 팀이 2015년에 개발했다.
텐서 (Tensor)
Tensor = Multidimensional Arrays = Data
딥러닝에서 텐서는 다차원 배열로 나타내는 데이터를 의미한다.
플로우 (Flow)
플로우는 데이터의 흐름을 의미한다.
텐서플로우에서 계산은 데이터 플로우 그래프로 수행
→ 그래프를 따라 데이터가 노드를 거쳐 흘러가면서 계산
텐서 + 플로우
딥러닝에서 데이터를 의미하는 텐서(tensor)와 데이터 플로우 그래프를 따라 연산이 수행되는 형태(Flow)의 합
▶ 텐서플로우 버전
텐서플로우 version.1
텐서플로우 1.X 에서는 아래와 같은 그래프 구조를 이용해 연산하도록 구성되어 있고, 모든 학습과 계산을 Session에서 진행한다.
따라서, 값을 계산하고 출력하기 위해서는 그래프 및 세션(Session) 생성 및 실행이 필요하다.
텐서플로우 version.2
2019년 9월부터 배포된 2.0 버전 이후부터는 즉시 실행(Eager Execution) 모드
→ 기능을 통해 계산 그래프, 세션 생성 없이 실행 가능
▶ 텐서플로우 기초 사용법
1) Constant Tensor (상수 텐서)
import tensorflow as tf
# 상수형 텐서 생성
tensor_a = tf.constant(value, dtype=None, shape=None, name=None)
# 모든 원소 값이 0인 텐서 생성
tensor_b = tf.zeros(shape, dtype=tf.float32, name=None)
# 모든 원소 값이 1인 텐서 생성
tensor_c = tf.ones(shape, dtype=tf.float32, name=None)
- value : 반환되는 상수값
- dtype : 반환되는 Tensor 타입
- shape : Tensor의 차원
- name : 텐서 이름
ex) 상수 텐서 생성 및 수식 정의
import tensorflow as tf
# 상수 텐서 생성
a = tf.constant([1,0],dtype=tf.float32)
# 수식 정의
def forward(x):
return W * x + b
# 텐서 계산 및 출력
output = forward(a)
print(output)
# Result
tf.Tensor([[1. 0.][1. 0.]], shape=(2, 2), dtype=float32)
2) Sequence Tensor (시퀀스 텐서)
import tensorflow as tf
# start에서 stop까지 증가하는 num 개수 데이터를 가진 텐서 생성
tensor_d = tf.linspace(start, stop, num, name=None)
- start : 시작 값
- stop : 끝 값
- num : 생성할 데이터 개수
- name : 텐서의 이름
import tensorflow as tf
# start에서 limit까지 delta씩 증가하는 데이터를 가진 텐서 생성 (일정한 증가량으로 증가하는 텐서)
tensor_e = tf.range(start, limit, delta, name=None)
- start : 시작 값
- limit : 끝 값
- delta : 증가량
- name : 텐서의 이름
3) Variable Tensor (변수 텐서)
import tensorflow as tf
# 변수형 텐서 생성
tensor_f = tf.Variable(initial_value=None, dtype= None, name= None)
- initial_value : 초기 값
- dtype : 반환되는 Tensor 타입
- name : 텐서의 이름
💡 텐서플로우 자료형
tf.float32 | 32-bit float |
tf.float64 | 64-bit float |
tf.int8 | 8-bit integer |
tf.int16 | 16-bit integer |
tf.int32 | 32-bit integer |
tf.uint8 | 8-bit unsigned integer |
tf.string | String |
tf.bool | Boolean |
💡 텐서플로우 이항연산자
tf.add(x, y) | x 텐서와 y 텐서를 더합니다. |
tf.subtract(x, y) | x 텐서에서 y 텐서를 뺍니다. |
tf.multiply(x, y) | x 텐서와 y 텐서를 곱합니다. |
tf.truediv(x, y) | x 텐서를 y 텐서로 나눕니다. |
3️⃣ 텐서플로우로 딥러닝 모델 구현하기
▶ 딥러닝 모델 구현 순서
1. 데이터셋 준비하기 : Epoch 와 Batch
Epoch
: 한 번의 epoch는 전체 데이터 셋에 대해 한 번 학습을 완료한 상태
Batch
: 나눠진 데이터 셋 (보통 mini-batch라고 표현)
ex) 총 데이터가 1000개, Batch size = 100
→ 1 iteration = 100개 데이터에 대해서 학습
→ 1 epoch = 100/Batch size = 10 iteration
💡 iteration는 epoch를 나누어서 실행하는 횟수를 의미
- Dataset API를 사용하여 딥러닝 모델 용 데이터 셋을 생성하기
data = np.random.sample((100,2))
labels = np.random.sample((100,1))
# numpy array로부터 데이터셋 생성
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)
2. 딥러닝 모델 구축하기 : 고수준 API 활용
- 텐서플로우의 패키지로 제공되는 고수준 API
- 딥러닝 모델을 간단하고 빠르게 구현 가능
딥러닝 모델 구축을 위한 Keras 메소드
1) 모델 클래스 객체 생성
tf.keras.models.Sequential()
2) 모델의 각 Layer 구성
tf.keras.layers.Dense(units, activation)
- units : 레이어 안의 Node의 수
- activation : 적용할 activation 함수 설정
3) 첫 번째 즉, Input Layer는 입력 형태에 대한 정보 필요 → input_shape / input_dim 인자 설정하기
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_dim=2, activation='sigmoid'),
tf.keras.layers.Dense(10, activation='sigmoid'),
tf.keras.layers.Dense(1, activation='sigmoid'),
])
4) 모델에 Layer 추가
[model].add(tf.keras.layers.Dense(units, activation))
- units : 레이어 안의 Node의 수
- activation : 적용할 activation 함수 설정
ex)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim=2, activation=‘sigmoid’))
model.add(tf.keras.layers.Dense(10, activation=‘sigmoid’))
model.add(tf.keras.layers.Dense(1, activation='sigmoid’))
3. 모델 학습시키기 : Keras 메소드
1) 모델 학습 방식을 설정하기 위한 함수
[model].compile(optimizer, loss)
- optimizer : 모델 학습 최적화 방법
- loss : 손실 함수 설정
2) 모델을 학습시키기 위한 함수
[model].fit(x, y)
- x : 학습 데이터
- y : 학습 데이터의 label
ex)
model.compile(loss='mean_squared_error’, optimizer=‘SGD')
model.fit(dataset, epochs=100)
4. 평가 및 예측하기 : Keras 메소드
1) 모델을 평가하기 위한 메소드
[model].evaluate(x, y)
- x : 테스트 데이터
- y : 테스트 데이터의 label
2) 모델로 예측을 수행하기 위한 함수
[model].predict(x)
- x : 예측하고자 하는 데이터
ex)
# 테스트 데이터 준비하기
dataset_test = tf.data.Dataset.from_tensor_slices((data_test, labels_test))
dataset_test = dataset.batch(32)
# 모델 평가 및 예측하기
model.evaluate(dataset_test)
predicted_labels_test = model.predict(data_test)
이 글은 엘리스의 AI트랙 5기 강의를 들으며 정리한 내용입니다.
'개발공부 > 🤖 DL & ML' 카테고리의 다른 글
[자연어 처리] 텍스트 전처리 및 단어 임베딩 (0) | 2022.11.03 |
---|---|
[CNN] Convolutional Neural Network (0) | 2022.11.02 |
[CNN] 이미지 데이터 (0) | 2022.11.01 |
[딥러닝 기초] 딥러닝 모델 학습의 문제점 (0) | 2022.11.01 |
[딥러닝 기초] 퍼셉트론 (0) | 2022.10.25 |
프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그