모두의 연구소 - 아이펠 리서치 과정 7주차

알파고라니·2023년 10월 23일
0

aiffel

목록 보기
8/15
post-thumbnail

7주차

7주차는 "딥러닝 한 번에 끝내기" 라는 노드를 2일만에 끝내고, "케라스 창시자에게 배우는 딥러닝" (이하 케창딥) 이라는 딥러닝 책을 공부하기 시작하는 주이다.

"딥러닝 한 번에 끝내기" 노드는 이틀만에 딥러닝 학습을 개괄적으로 다룬다. 개인적으로 크게 도움이 된 느낌은 아니였다. 그 이유는 이미 fundamental과 exploration 노드를 경험한 이후에 해당 노드가 진행되는데 그 내용이 비교적 부실하다고 생각했기 때문이다. 그래도 딥러닝 내용을 전반적으로 복습, 리마인드하는 것은 좋았다.

이후 "케창딥"은 이번 주에 chapter 2개 분량에 대해 공부를 했다.
케라스 API내부의 각각의 모듈이 "코드적으로" 어떻게 구성되어 있고 어떠한 역할을 하는 지, 그 기초적인 내용에 대해 알 수 있어서 학습에 흥미가(사실 없음) 있었다.
개인적으로 케창딥이 2회독째 인데, 첫 번째로 볼 때와는 다르게 보이는 것이 많아진 느낌이여서 나름(?) 뿌듯했다.

딥러닝 한 번에 끝내기

  1. 텐서의 표현과 연산
  2. 딥러닝 구조와 모델 학습
  3. 규제
  4. 가중치 초기화와 배치 정규화
  5. 간단한 딥러닝 프로젝트

케라스 창시자에게 배우는 딥러닝

  1. Chapter 2. 신경망의 수학적 구성 요소
  2. Chapter 3. keras와 tensorflow 소개

1. 딥러닝 한 번에 끝내기

1.1 텐서의 표현과 연산

딥러닝 기반의 학습이 이뤄질 때 keras, pytorch 모두 data container로서 tensor를 사용한다. tensor의 rank와 dimension을 이해하고 각 경우의 shape를 공부했다.
ex) rank 1 tensor => vector

아래의 그림을 참고하자!
tensor per rank

이를 텐서 표현으로 나타내기 위해서
상수는 tf.constant(), 변수는 tf.Variable()을 사용하여 나타낸다.
기본적으로 변하지 않는 값 즉, 상수로 tensor를 표현하지만 우리는 학습을 통해 가중치를 업데이트 하는 것이 필요하므로, 이 때 변수 tf.Variable()을 사용해준다.
실제로 tf.contant()의 요소를 바꾸거나 수정할 수 없다!

텐서 표현을 위해서 텐서 객체를 만들 때, 텐서의 요소와 데이터 타입을 정해줄 필요가 있다. 데이터 타입은 아래의 표에서 확인하자.

또한 각 텐서끼리의 여러가지 연산을 지원한다.
위의 내용을 예시 코드와 표를 보고 이해해보자.

#rank 2 tensor
t = tf.constant([[1, 2, 3],[4,5,6]]) 
print(t)
print(tf.rank(t))

# dtype 지정
f16 = tf.constant(2., dtype=tf.float16)
print(f16)

#텐서 타입 변환. tf.cast()
f32 = tf.cast(f16, tf.float32)
print(f32)

#텐서 형상 변환. tf.reshape()
x = tf.constant([[1], [2], [3]])
print(x)
print(x.shape)

y = tf.reshape(x, [1, 3])
print(y)
print(y.shape)

#텐서 전치 tf.transpose()
print(y)
print(tf.transpose(y))
print(y.shape)

1.2 딥러닝 구조와 모델 학습

케라스에서 제공하는 API들의 구성도를 살펴보면, 크게 Model API와 Layer API가 있고 필요한 모듈들을 Modules API를 호출해서 사용하는 구조이다.
구성도는 다음과 같이 이해할 수 있다.
케라스 구성도

  • Layer API
    케라스의 Layer API를 사용하여 모델의 층을 쉽고 편하게 구성할 수 있다.
    가장 기본이 되는(범용성이 큰) 것은 Input, Dense, Flatten, Activation 객체를 만들 때 사용하는 것이다.
    이는 직접 코드로 보는 것이 이해하기가 수월하다고 생각한다.
    각각을 코드로 구현하면 다음과 같다.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

#input 객체
keras.Input(shape=(28, 28), dtype=tf.float32)

#Dense 객체
layers.Dense(10, activation='relu', name='Dense Layer')

#Flatten 객체
inputs = keras.Input(shape=(28, 28, 1))
layer = layers.Flatten(input_shape=(28, 28, 1))(inputs)

#Activation 객체
layer = layers.Activation('sigmoid')
layer = layers.LeakyReLU()
  • 모델 학습: 손실 함수, 옵티마이저, 학습
    딥러닝 모델을 학습시킬 때 손실 함수, 옵티마이저가 필요하다.
    손실 함수와 옵티마이저에 어떤 것들이 있고 무슨 역할을 하는 지 알게되었다.
    일일히 설명하기에는 스압!주의가 될 것이기 때문에, model의 구조를 정의하고 compile시에 손실 함수와 옵티마이저를 적용시키는 것만 기억하자!

학습 flow

			  데이터 입력 -> 모델 생성 -> 모델 학습 -> 예측 결과
            

1.3 규제

딥러닝 한 번에 끝내기는 과대 적합(overfitting)을 방지하기 위해
다양한 규제 방법을 소개해준다.

  1. 파라미터 수를 적절히 조절하기(층 깊이, 수 증가/감소)
  2. L1/L2 regularization
  3. Dropout

L1/L2에서 중요한 개념은 손실 함수에 파라미터의 L1 / L2의 값을 더해줌으로써 손실함수이 최소화되는 방향만 고려하는 것이 아니라,
추가적으로 파라미터 값이 크게 안 커지도록 하는 방향을 추가해주는 것이다.
L2규제가 이상치에 더욱 robust하게 작용한다고 한다..!

-L1 regularization loss

-L2 regularization loss

dropout은 순전파 방향에서 활성화 할 노드의 개수나 층을 설정하는 것이다.
이를 통해 과적합을 막는 것이다.

각 규제가 어떻게 작용하길래 과적합을 방지하는 것인지는 따로 포스팅을 할 예정이다.

1.4 가중치 초기화와 배치 정규화

가중치 초기화는 말 그대로 가중치의 초기화에 대한 것을 건드리는 것을 의미한다.

만약 가중치의 값이 일부 값으로 치우치게 된다고 생각해보자.
순전파 방향으로 노드를 지나가는 동안 활성화 함수를 통과한 값들도 치우치게 되고, 결국 표현할 수 있는 신경망의 수가 적어지는 문제가 발생한다.
활성화 함수에 따라 추정되는 값들의 분포를 보면 이해하기가 쉽다.
가령 다음과 같은 표로 이해할 수 있을 것이다.

결과적으로는 모델의 활성화 값이 골고루 분포 되는 것이 중요하다.

1.5 간단한 딥러닝 프로젝트

딥러닝 한 번에 끝내기 실습을 총망라하여 세 가지의 아주아주 간단한 프로젝트를 진행하였다.

github repo:
간단한 딥러닝 프로젝트


2. 케라스 창시자에게 배우는 딥러닝

Chapter 2. 신경망의 수학적 구성 요소

신경망에서 사용하는 텐서와 그 연산에 대해서 공부하는 챕터였다.
특히 개인적으로 텐서 연산의 도함수로 그레이디언트를 계산할 때,
TF 내에서 어떻게 코드적으로 처리하는 지 궁금했는데 이게 어느정도 해결이 된 것 같다.(tf.GradientTape())

추가적으로 텐서 연산의 기하학적 해석에 대해 그루 분들과 다양한 얘기를 나누면서 모델이 어떻게 데이터 포인터를 설명하고자 하는 지 상상할 수 있게 되었다..!
(맞게 상상하는 지는 모름 ㅋㅋ)

Chapter 3. keras와 tensorflow 소개

텐서 객체를 생성하고 케라스 API에서 내부적으로 어떤 일이 일어나는 지 파악하는 챕터였다.
간단하게 정리하자면 핵심은 keras에 다양한 모듈이 있는데,
모델의 층 객체를 기준으로 layer 클래스가 가중치를 어떻게 저장하고, 어떻게 입출력의 크기를 추론하는 지에 대해 알 수 있었다는 것이다.

챕터2,3에서 실습한 코드는 아래 레포에 올려뒀다.
https://github.com/3n952/DL_study/tree/main/keras_deep

references

  1. 가중치 초기화 figure(작은 난수)
    https://velog.io/@cha-suyeon/DL-%EA%B0%80%EC%A4%91%EC%B9%98-%EC%B4%88%EA%B8%B0%ED%99%94Weights-Initialization
profile
함께 성장할 수 있는 AI Engineer가 되고 싶습니다

0개의 댓글