TensorFlow 그라데이션 테이프

Anika Tabassum Era 2024년2월15일
TensorFlow 그라데이션 테이프

TensorFlow는 동적 기계 학습 및 딥 러닝 분야를 위한 일관된 프레임워크 및 호환 가능한 작업 영역이 되는 데 중요한 역할을 했습니다.

가장 과장된 영역 중 하나는 신경망이며, 그 작동 원리는 경사 하강법 알고리즘의 도움으로 쉽게 입증될 수 있습니다. 그리고 TensorFlow는 이 경험을 향상시키는 데 필요한 거의 모든 라이브러리를 보장합니다.

기본 개념에 따르면 신경망은 인간의 뇌 세포가 작동, 결정, 인식 및 기능하는 방식입니다. 우리의 처리 장치는 한 번에 입력된 정보만 기억할 수 있습니다.

오히려 학습 속도를 따르고 상황 처리에 따라 연속적으로 수정합니다. 이 과정에서 비용 함수 또는 손실 함수 또는 부분 미분 또는 기본 용어 기울기라는 중요한 용어가 있습니다.

개념을 시각화하기 위해 공통 개념인 “선형 회귀” 모델을 보여주려고 했습니다. 기계 학습의 초보자가 아니라면 이미 익숙하다고 가정합니다.

이 모델이 하는 일은 회귀선의 도움으로 독립 변수와 종속 변수 사이의 관계를 추출하는 것입니다.

회귀선을 설정하는 동안 이 특정 사례의 기울기오차 제곱합(SSE)을 알아야 합니다. 모델을 훈련할 때 SSE가 최소값이 될 것으로 예상합니다.

끊임없는 과정은 이 훈련에만 도움이 됩니다. 여기에서 지정된 방정식의 출력을 계산하고 기울기 x 학습 속도로 드라이버 값을 다시 초기화합니다.

학습률은 우리의 손실 함수가 갑작스러운 결과를 나타내지 않도록 안정성을 보장합니다.

기본 값을 시작한 후 그라데이션에 따라 기본 값을 업데이트합니다. 이 역방향 패스는 모델이 제대로 학습되었는지 확인하는 데 필요합니다.

그래디언트 테이프는 업데이트된 입력출력과 함께 비용 함수를 연속적으로 저장하는 구성 요소입니다. 따라서 값의 세부 사항과 함께 전체 절차의 완전한 그림을 얻습니다.

예제를 통해 메서드를 시각화해 보겠습니다.

TensorFlow에서 그라데이션 테이프 사용

이 섹션에서는 이론적 개요를 다루지 않습니다. 오히려 실용적인 코드를 따라가며 그래디언트 테이프에 어떻게 의존하는지 보여주려고 노력할 것입니다.

이제 코드 베이스로 이동하겠습니다. 인스턴스에 Google Colab을 사용하고 있습니다.

처음에는 라이브러리 가져오기를 설정하고 드라이브에 대한 임의 데이터 세트를 생성합니다. 또한 변수가 어떻게 작동하는지 보기 위해 산점도를 그릴 것입니다.

# Necessary Imports
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import os

# Generating random data
x = np.random.uniform(0.0, 1.0, (200))
y = 0.3 + 0.5 * x + np.random.normal(0.0, 0.3, len(x))
# x
# y

plt.scatter(x, y)
plt.xlabel("Independent")
plt.ylabel("dependent")
plt.show()

출력:

tensorflow 1에서 그래디언트 테이프 사용

다음 코드 펜스에는 회귀 모델과 손실 함수 선언이 포함됩니다. 집중해야 할 중요한 부분은 회귀 모델이 종속 변수 y에 대한 예측 값을 출력하고 방정식은 다음과 같다는 것입니다.

<사업부>
$$
\모자 y = a + b * x
$$

여기서 x는 모델의 입력이라고도 하는 독립 변수입니다. 주로 주어진 y와 예측된 y^ 사이에 최소 오류가 있는지 확인하려고 합니다.

손실 함수에는 오차 제곱합(SSE)이 포함됩니다.

<사업부>
$$
SSE = \sum(y_i-\hat y_i)^2
$$

# The following equation for the model is ---->  y" = a + b * x
# Linear Regression
class regression:
    def __init__(self):
        self.a = tf.Variable(initial_value=0, dtype=tf.float32)
        self.b = tf.Variable(initial_value=0, dtype=tf.float32)

    def __call__(self, x):
        x = tf.convert_to_tensor(x, dtype=tf.float32)
        y_est = tf.add(self.a, tf.multiply(self.b, x))
        return y_est
model = regression()
# The loss function/ Cost function/ Optimization function (sum of square error)
def loss_func(y_true, y_pred):
    # both y_true and y_pred are tensors
    sse = tf.reduce_sum(tf.square(tf.subtract(y_true, y_pred)))
    return sse

다음으로 그라디언트 테이프를 포함하여 교육 섹션을 정의합니다. 변수 ab를 업데이트하는 방정식은 다음과 같습니다.

<사업부>
$$
a = a_i - \nabla(sse)|a *l_r
$$

<사업부>
$$
b = b_i - \nabla(sse)|b *l_r
$$

# Gradient Descent ----> a = ai - sse * lr (learning rate)
#                                      b = bi - sse * lr


def train(model, inputs, outputs, lr):
    # convert outputs to tensor
    y_true = tf.convert_to_tensor(outputs, dtype=tf.float32)

    # Gradient Tape
    with tf.GradientTape() as g:
        y_pred = model(inputs)
        current_loss = loss_func(y_true, y_pred)

    # slopes/ partal_differentiation/ gradients
    da, db = g.gradient(current_loss, [model.a, model.b])

    # update values

    model.a.assign_sub(da * lr)
    model.b.assign_sub(db * lr)

다음 세그먼트는 회귀선을 설정하는 것입니다. 우리는 더 나은 학습을 위한 몇 가지 시대를 설정할 것입니다.

손실 함수가 최소가 되는 포화점과 필요한 에포크 값을 조사했습니다. 전체 교육 섹션에서 출력이 어떻게 발생했는지 보기 위해 epoch 및 비용 값을 플로팅해 보겠습니다.

# Fitting
def plotting(x, y):
    plt.scatter(x, y)  # scatter
    plt.plot(x, model(x), "r--")
model = regression()
a_val = []
b_val = []
cost_val = []

# epochs
epochs = 70

# learning rate
lr = 0.001

for e in range(epochs):
    a_val.append(model.a)
    b_val.append(model.b)

    # prediction values and errors
    y_pred = model(x)
    cost_value = loss_func(y, y_pred)
    cost_val.append(cost_value)

    # Train
    train(model, x, y, lr)
    plotting(x, y)
    plt.show()
    print("Epoch: %d, Loss: %0.2f" % (e, cost_value))

마지막 시대의 출력 산점도:

tensorflow 2에서 그래디언트 테이프 사용

plt.plot(cost_val)
plt.xlabel("epochs")
plt.ylabel("cost values")

출력:

tensorflow 3에서 그래디언트 테이프 사용

따라서 0-10의 에포크 범위에서 비용 값이 크게 감소했다고 말할 수 있습니다. 그리고 모든 epoch를 실행하면 포화점이 64-65 epoch 근처에 있음을 알 수 있습니다.

기술적으로 그라디언트 테이프는 모든 해당 값을 수집하는 데 도움이 되므로 시각화가 더 직관적입니다. 링크에서 전체 코드를 미리 볼 수도 있습니다.

Anika Tabassum Era avatar Anika Tabassum Era avatar

Era is an observer who loves cracking the ambiguos barriers. An AI enthusiast to help others with the drive and develop a stronger community.

LinkedIn Facebook