딥러닝의 간단한 개념
딥러닝 모델을 구현하기에 앞서서 딥러닝이란 무엇인가에 대해 살펴볼 필요가 있습니다. 딥러닝은 여러 연산의 조합을 깊게(길게) 연결된 모델을 통해 문제를 풀고자 하는 머신러닝 방법 중 하나입니다. 여기서 여러 연산의 조합은 1957년에 제안된 퍼셉트론("TLU"라고도 불림)이라는 개념에서 유래하는데, 입력(x)과 가중치의 곱셈의 합(선형결합)을 계산해 비선형함수에 대입하면서 문제를 풉니다. 이에 대한 식은 아래와 같습니다.
이런 TLU들이 층을 쌓아올리게 되면 일부 제약을 줄일 수 있다는 사실이 밝혀졌는데, 이를 다층퍼셉트론(MLP)라고 합니다. 그리고 이들이 모두 연결되어 있을 때, 즉 누군가의 결과값이 다음 층의 입력값인 구조에서 우리는 밀집층이라고 부릅니다.
각각의 TLU는 뉴런 층의 한 형태로 작용할 수 있습니다. 인공신경망(Artificial Neural Network; ANN)은 생물학적 신경망을 모사하여 형상화한 네트워크로 여기서는 TLU(더 포괄적인 개념으로는 뉴런층)을 서로 연결하여 구성하게 됩니다.
MLP는 입력층, 출력층, 그리고 나머지 사이의 은닉층(hidden layer)로 구분됩니다. 여기서 은닉층을 여러개 쌓아올린 인공신경망을 심층신경망(Deep Neural Network; DNN)이라고 하는데, 여기서 우리가 흔히 사용하는 딥러닝의 개념도 등장합니다. 즉, 쌓아올린 DNN에 훈련을 통해 학습시키고 연구하는 것을 딥러닝이라고 합니다.
딥러닝 모델을 구현하기에 앞서 간단한 개념은 위에서 살펴봤고, 파이썬 코드를 작성할 준비는 아래와 같이 시작할 수 있습니다.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
딥러닝을 파이썬을 이용해 구현하기 위해서는 대표적인 라이브러리가 여럿(Keras, TensorFlow, Pytorch 등)이 있는데 그중에서도 여기서는 TensorFlow2(이하 "TF")를 활용할 예정입니다. TF는 케라스를 자체적으로 구현하여 백엔드로 지원합니다. 이에 대해 더 궁금한 사항은 아래 링크에서 살펴보시기 바랍니다.
케라스를 통해 딥러닝을 구현하는 방법을 크게 세가지(Sequential API, Functional API, Subclassing API)로 구분하고 각각에 대해 살펴보고자 합니다.
시퀀셜 API (Sequential API)
시퀀셜 API는 이름에서 알 수 있듯이 여러 층을 단순히 일렬로 연결하여 이루어진 모델입니다. 즉, 하나의 입력(input)과 하나의 출력(output) 텐서만을 갖는 경우에 구현이 가능합니다. 비교적 단순한 구조인만큼 구현하기 쉽지만 아래의 경우에는 사용하기에 적절하지 않습니다.
- 입력층 / 출력층에 여러개의 입력 / 출력이 필요한 경우
- 은닉층 중 일부라도 여러개의 입력 / 출력이 필요한 경우
- 선형적 토폴로지를 갖지 않는 경우 (즉, cycle과 같은 복잡한 형태가 포함된 모델인 경우)
시퀀셜 API에 대한 구현은 다음과 같습니다.
model = keras.Sequential(
[
layers.Dense(2, activation="relu", name="layer1"),
layers.Dense(3, activation="relu", name="layer2"),
layers.Dense(4, name="layer3"),
]
)
또 다른 방식으로는 add 메서드를 통해 모델을 구현할 수 있습니다.
model = keras.Sequential()
model.add(layers.Dense(2, activation="relu"))
model.add(layers.Dense(3, activation="relu"))
model.add(layers.Dense(4))
더 세부적인 내용들은 아래 링크를 통해 확인이 가능합니다.
TensorFlow : The Sequential Model
함수형 API (Functional API)
함수형 API는 앞선 시퀀셜보다는 좀 더 유연한 적용이 가능합니다. 이름 그대로 어느 층을 함수의 입력값으로하여 결과값을 출력하는 방식으로 구현합니다. 기본적인 방법은 다음 예제 코드를 통해 확인할 수 있습니다.
# inputs은 사전에 정의됨
dense = layers.Dense(64, activation="relu")
x = dense(inputs)
x = layers.Dense(64, activation="relu")(x)
outputs = layers.Dense(10)(x)
model = keras.Model(inputs=inputs, outputs=outputs, name="mnist_model")
위에서 확인할 수 있듯이 함수형으로 구현하는 것은 y = f(x)처럼 작성해주면 됩니다. 더 많은 내용과 모델들을 통해 연습하고 싶다면, 아래 링크를 참조해주시기 바랍니다.
TensorFlow : The Functional API
서브클래싱 API (Subclassing API)
두 구현방법은 모두 사용할 층과 연결방식을 먼저 정의하는 것이 필요합니다. 모델을 분석 / 디버깅이 쉬우며, 다른 곳에서 사용하기도 복사나 공유를 통해서 쉽게 가능할 것 입니다. 하지만, 어떤 모델에서는 반복 / 조건문이 필요하거나 다양한 크기를 다뤄야 할 수도 있습니다. 이런 상황에서는 가장 유연하게 할 수 있는 동적인 구조가 필요합니다. 이처럼 명령형(imperative) 프로그래밍이 필요하다면 이용하는 것이 서브클래싱 API 입니다. 아래의 한 예시를 통해 확인하시기 바랍니다.
class Linear(keras.layers.Layer):
def __init__(self, units=32, input_dim=32):
super(Linear, self).__init__()
w_init = tf.random_normal_initializer()
self.w = tf.Variable(
initial_value=w_init(shape=(input_dim, units), dtype="float32"),
trainable=True,
)
b_init = tf.zeros_initializer()
self.b = tf.Variable(
initial_value=b_init(shape=(units,), dtype="float32"), trainable=True
)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
'Python > Data Analysis' 카테고리의 다른 글
[NLP] 임베딩과 Word2Vec 실습해보기 (0) | 2022.09.07 |
---|---|
[NLP] Char-RNN 을 활용하여 언어 모델링 실습 | 텍스트 생성 (0) | 2022.06.06 |
[NLP] N-gram 모델 구현하기 기초 | 임베딩, NLTK (0) | 2022.05.30 |
[NLP] Python으로 영어 가독성 테스트하기 | Flesch, Gunning fog (0) | 2020.09.28 |
[Modeling] 파이썬으로 선형계획법 최적화하기 | SciPy (0) | 2020.07.20 |