텐서플로우 개념

텐서플로우는 구글(Google)에서 개발한 오픈소스 머신러닝 프레임워크이다. 딥러닝을 포함한 다양한 머신러닝 모델을 쉽게 만들고 학습시킬 수 있도록 설계되었으며, 특히 대규모 데이터 처리와 모듈화된 구성에 강점을 가지고 있다.

텐서플로우는 직관적인 코드 작성과 높은 유연성을 제공한다. 초보자부터 전문가까지 폭넓게 사용할 수 있으며, 특히 Keras API를 통해 간단한 코드로 복잡한 신경망도 쉽게 구현할 수 있다. 또한 다양한 하드웨어(CPU, GPU, TPU)에서 효율적으로 작동한다는 점도 큰 장점이다.

텐서플로우 개념

텐서플로우는 딥러닝 모델을 구성하고 학습시키기 위한 연산 기반 프레임워크이다. 기본적으로 데이터를 담는 단위인 텐서(Tensor), 연산 흐름을 정의하는 그래프(Graph), 그리고 이를 실행하는 세션(Session) 이라는 개념으로 구성된다. 현재는 더 직관적인 즉시 실행 모드(eager execution) 가 기본 설정으로 사용되며, 코드를 실행하면서 바로 결과를 확인할 수 있도록 도와준다.

ž   텐서(Tensor)

텐서는 텐서플로우의 기본 데이터 단위로, 숫자의 배열(스칼라, 벡터, 행렬 등)을 뜻한다.

모든 데이터는 내부적으로 텐서 형태로 처리되며, 차원(rank)에 따라 형태가 달라진다.

ž   그래프(Graph)

그래프는 연산의 흐름을 시각적으로 구성한 것으로, 각 연산을 노드로 표현하고 데이터 흐름을 간선으로 연결한다. 복잡한 연산 과정을 구조화하여 효율적으로 관리할 수 있게 한다.

ž   세션(Session)

그래프를 실제로 실행하는 환경이다. 과거에는 세션을 명시적으로 생성하고 run() 명령어로 연산을 실행했지만, 현재는 eager execution을 통해 코드를 작성하자마자 바로 실행되는 방식으로 간소화되었다.

이처럼 텐서플로우는 데이터를 처리하고 학습시키는 과정을 논리적 구조(그래프)와 수학적 연산(텐서)으로 표현하며, 이를 바탕으로 다양한 딥러닝 모델을 유연하게 구축할 수 있다.


인공신경망 기본 예제

이제 Jupyter Notebook을 활용해 본격적으로 강화학습 프로젝트를 진행해보자.

import tensorflow as tf #(1)
 
mnist = tf.keras.datasets.mnist #(2)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print("* shape:", x_train.shape, y_train.shape)
print("* shape test:", x_test.shape, y_test.shape)
print("* test data:\n", x_test)

model = tf.keras.models.Sequential([ #(3)
    tf.keras.layers.Flatten(input_shape=(28,28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])
 
model.compile(optimizer="Adam", #(4)
            loss='sparse_categorical_crossentropy',
            metrics=['accuracy']
    )
 
hist= model.fit(x_train, y_train, epochs=5) #(5)
 
model.evaluate(x_test, y_test, verbose=2) #(6)

인공신경망 개념: 프로그램 기본 구조

텐서플로우로 작성된 프로그램은 대부분 일정한 패턴을 따르고 있으며, 그 흐름을 이해하면 처음 접하는 사람도 쉽게 따라할 수 있다. 다음은 기본적인 구성 단계이며, 각 단계에서 수행되는 역할을 간략히 소개한다.

(1) 패키지 로딩
프로그램을 시작하면 가장 먼저 텐서플로우 라이브러리를 import tensorflow as tf 형태로 로딩한다. 텐서플로우는 다양한 기능을 포함하고 있기 때문에, 필요한 모듈을 불러오는 작업은 필수적인 시작점이다.

(2) 데이터셋 불러오기
다음으로는 학습에 사용할 데이터를 불러온다. 대표적인 예로 mnist 데이터셋이 있다. 이 데이터셋은 손글씨 숫자(0~9)가 포함된 이미지와 정답 레이블로 구성되어 있어, 인공신경망의 분류 학습에 널리 활용된다. 텐서플로우에서는 tf.keras.datasets.mnist.load_data()와 같은 방식으로 간단하게 불러올 수 있다.

(3) 신경망 모델 정의
데이터를 어떻게 학습할 것인지를 결정하는 단계로, 이 과정에서는 몇 개의 층(Layer)을 만들지, 각 층에 몇 개의 뉴런(Node)을 둘지 결정해야 한다. 예를 들어 Dense(128, activation='relu')와 같은 방식으로 은닉층을 정의하며, 이는 프로그래머가 실험을 통해 직접 설계하게 된다.

(4) 손실 함수와 최적화 함수 지정
모델을 학습시키기 위해 손실 함수(loss function)와 최적화 알고리즘(optimizer)을 정의한다. 손실 함수는 예측값과 실제값 간의 오차를 계산하며, 최적화 함수는 이 오차를 줄이는 방향으로 가중치를 업데이트하는 역할을 한다. 대표적인 손실 함수로는 sparse_categorical_crossentropy, 최적화 함수로는 Adam이 있다.

(5) 모델 학습
모든 구조가 완성되었다면, 학습 데이터를 모델에 주입해 학습을 시작한다. model.fit() 함수로 학습을 수행하며, 이 과정에서 에폭(epoch) 수나 배치 크기(batch size) 등 학습 관련 하이퍼파라미터를 지정하게 된다.

(6) 성능 평가 및 테스트
학습이 끝난 뒤에는 테스트 데이터를 사용해 모델의 성능을 평가한다. 이 단계에서는 예측값이 얼마나 정확한지를 model.evaluate()를 통해 확인할 수 있으며, 경우에 따라 예측 결과를 출력하거나 시각화하는 것도 가능하다.

이처럼 텐서플로우 프로그램은 위와 같은 일련의 과정을 순차적으로 수행하는 구조를 갖고 있다. 각 단계의 역할과 순서를 정확히 이해하면, 강화학습이나 이미지 인식 등 다양한 딥러닝 분야에도 효과적으로 응용할 수 있다. 이제 이 구조를 바탕으로 실제 예제를 따라가며 직접 신경망 모델을 구현해보자.

인공신경망 개념: 학습데이터 가져오기

가장 먼저 나오는 부분이 학습데이터 가져오는 부분이다. keras 페키지에서 다양한 학습데이터를 제공하고 있는데 여기에서는 이미지 형태의 숫자 데이터인 mnist 데이터 셋을 사용했다. minist는 모두 70000개의 데이터로 구성되어 있고 훈련(train)에 사용되는 데이터가 60000, 검증(test)에 사용되는 데이터가 10000개이다. 데이터를 로딩하면 기본적으로 훈련데이터와 검증데이터를 나두어서 반환한다.

Tip : 훈련(train) 데이터와 검증(test) 데이터

훈련 데이터와 검증 데이터 모두 동일한 데이터이다. 인공지능 모델을 학습할 때 데이터를 훈련 데이터와 검증 데이터로 나누는 이유는 모델을 학습할 때 사용된 데이터를 가지고 모델이 얼마나 정확한 지 검증하면 결과가 왜곡될 수 있기 때문이다. 시험보기 전에 풀었던 문제집 내용이 실제 시험이 그대로 나오는 것과 같은 경우이다.

따라서 인공신경망 공부를 위해 제공하는 많은 데이터셋은 기본적으로 학습 데이터와 검증 데이터를 나누어 제공하고 있다. 전체 데이터 중에 보통 70~80% 정도를 학습 데이터로 제공하고 나머지를 검증 데이터로 제공한다.

훈련 데이터는 28*28*60,000의 다차원 데이터 배열로 이루어져 있다. 배열로 구성된 데이터를 살펴보면 하나의 이미지는 28*28 배열로 표현되며 이런 배열(28*28 이미지)이 모두 60,000개 들어가 있다.

앞에서 살펴본 단일 인공신경망에서 입력층(Input Layer)에 있는 X를 정의하는 것과 같다.

인공신경망 개념: 인공신경망 구성

Mnist 학습데이터 셋을 다운로드 받았다면 이제 학습을 진행할 인공신경망을 구성해보자. Keras에서 제공하는 Sequential 클래스를 활용하는데 Sequential 클래스는 레이어를 순차적으로 연결시키는 기능을 제공한다. 먼저 입력층(Input Layer)을 구성하는데 이미지 하나씩 입력 받기 때문에 28*28 크기의 데이터를 입력 값으로 정의한다. 하지만 텐서플로우에서는 1차원 배열만 입력값으로 사용할 수 있기 때문에 28*28 데이터를 쭉 펴서(Flatten) 784개의 1차원 배열 데이터로 만들어준다.

다음으로 은닉층(Hidden Layer)를 구성하는데 은닉층에서는 활성함수로 relu를 사용하도록 지정했다. 앞의 사례에서는 sigmoid함수를 사용했다. relu함수는 sigmoid 함수와 유사하게 선형의 데이터를 비선형으로 만들어주는 함수라고 이해하도록 하자. 은닉층에서 노드를 128개 사용했다. 몇 개의 노드를 사용할 것인지는 학습자의 선택에 따른 문제이며, 데이터를 반복적으로 학습하면서 가장 적합한 은닉층의 노드 개수를 찾아내야 한다.

마지막으로 출력층(Output Layer)을 구성하는데 출력층의 개수는 학습 데이터가 가지고 있는 데이터 유형의 종류로 정해진다. Mnist 학습데이터셋은 0부터 9까지의 숫자를 분류하는 데이터이기 때문에 모두 10개의 출력 노드가 구성된다. 여기에서 활성 함수로 softmax를 사용했는데 softmax 함수는 출력 데이터가 0부터 1사이에 있는 값으로 나오도록 변형하고 모든 출력 데이터를 합한 값이 1이 되도록 만들어준다. , Softmax 함수를 사용하면 확률을 알 수 있게 된다. Softmax 함수를 통해 얻은 출력 값은 입력이 어떤 숫자에 해당하는지를 확률로 알려주는 것이다.

인공신경망 개념: 학습환경 설정

이제 학습을 진행하기 위한 환경을 설정해야 한다. 먼저 옵티마이저(Optimazer)는 오차를 최소화하는 알고리즘을 선택하는 것인데 앞서 배웠던 인공신경망에서는 경사하강법(Gradient Decent)을 사용했다. 경사하강법은 이해가 쉽고 인공지능 초기부터 많이 사용하던 알고리즘이지만 현재는 보다 효율적인 알고리즘이 많이 개발되어 많이 사용되지는 않는다. 예제에서는 경사하강법 대신 아담(Adam) 알고리즘을 사용했다. 아담 알고리즘에 대해서는 깊이 설명하지 않고 지나가도록 하겠다.

이제 오차를 정의해야 하는데 앞에서는 MSE(Mean Squared Error)를 사용했다. 실제 값과 예측 값의 차이를 구해서 제곱해서 다시 평균을 구한 값을 오차로 정의하고 경사하강법을 사용해서 이 값이 최소화되는 지점을 찾았다. MSE 보다 효율적인 sparse categorical cross entropy를 대신 사용한다. sparse categorical cross entropy는 오차를 정의하는 다른 방법 정도로 이해하고 여기에서는 자세한 설명을 생략하도록 한다.

다음으로 학습을 평가하는 메트릭스(metrics)를 정의했는데 여기에서는 정확도(accuracy)를 사용했다. 정확도를 말 그대로 예측과 실제 데이터가 얼마나 일치하는지를 확인하는 것이다. 정확도가 높을수록 인공신경망을 잘 구성되고 학습 환경이 효율적으로 설정됐다고 판단할 수 있다.

인공신경망 개념: 모델 학습

완성된 인공신경망은 model 변수에 저장된다. 인공신경망은 Sequential 객체이며 이 객체에서는 모델 학습을 위한 fit 함수를 지원하고 있다. 함수에 인자로 훈련 데이터 셋을 넣어주고, 학습을 몇 번 반복할 지 지정하는 epochs 값을 설정하면 학습이 진행된다. epochs 변수를 5로 설정하면 60000건의 학습 데이터를 5회 반복하면서 학습하게 된다. 프로그램을 실행하면 화면 하단에 학습이 진행되는 것을 확인할 수 있으며 각각의 epoch마다 loss accuracy를 확인할 수 있다. Loss는 오차항으로 값이 작을수록 좋으며, accuracy는 정확도를 나타내는 지표이기 때문에 1에 가까울 수록 좋다

인공신경망 개념: 모델 검증

모델의 정확도는 학습에 사용되지 않은 검증 데이터를 사용해서 알 수 있다. Mnist 데이터셋에서 제공하는 검증 데이터셋 x_test, y_test를 검증함수 evaluate에 입력하면 모델의 정확도를 알 수 있다. 출력 값에서 loss accuracy가 검증 데이터 셋으로 확인한 오차항과 정확도이다. Evaluate 함수 마지막에 들어가는 verbose는 출력을 어느 수준으로 할지 결정하는 역할을 하는데 Jupyte notebook을 사용하는 환경에서는 보통 2를 넣어준다.

이번 장에서는 인공지능의 기초 개념부터 시작해, 텐서플로우를 활용하여 인공신경망을 구성하고 학습시키는 기본적인 절차를 살펴보았다. 이 과정은 단순히 이론적 이해를 넘어서 실제 구현 능력을 기르는 데 매우 중요하다. 왜냐하면 현재 대부분의 강화학습 알고리즘이 인공신경망을 핵심 기반으로 삼고 있기 때문이다.

강화학습은 이론 자체로는 보상을 극대화하는 최적의 행동을 찾기 위한 알고리즘 체계이다. 하지만 이 알고리즘을 실제 코드로 구현하려면 수치 계산과 함수 최적화를 처리할 수 있는 프레임워크가 반드시 필요하다. 그 중심에 바로 텐서플로우(TensorFlow)와 같은 인공신경망 지원 패키지가 있다.

텐서플로우는 단순히 신경망을 만드는 도구를 넘어, 다양한 최적화 알고리즘, 데이터 처리 기능, 그리고 시각화 도구까지 폭넓게 지원한다. 특히 강화학습에서는 정책 네트워크(policy network)나 가치 함수(value function)를 인공신경망으로 모델링하는 경우가 많기 때문에, 텐서플로우를 능숙하게 다루는 능력은 강화학습 실습에 있어 사실상 필수라 할 수 있다.

만약 텐서플로우와 같은 프레임워크를 정확히 이해하지 못하면, 강화학습 알고리즘을 구현하는 데 오랜 시간이 걸릴 뿐 아니라, 잘못된 방식으로 네트워크를 구성하거나 비효율적인 학습을 초래할 수 있다. 따라서 이 장에서 학습한 내용을 바탕으로, 앞으로는 강화학습 알고리즘을 보다 깊이 있게 다루기 위한 기반을 탄탄히 다져야 한다.






댓글 쓰기

Please Select Embedded Mode To Show The Comment System.*

다음 이전