` 1

https://www.youtube.com/watch?v=aNrqaOAt5P4&list=PLQY2H8rRoyvzuJw20FG82Lgm2SZjTdIXU&index=2


- 이번 동영상은 모델이 글을 읽는 학습 과정을 케라스를 통해 보여줍니다.

- 사람이 유치원을 다닐 때 글을 배우는 과정이 신경망이 글을 배우는 과정과 동일하다면서 영상을 시작합니다.

- NLP는 계속해서 진화하는 중이고, 사람 수준을 뛰어넘었습니다.


데이터 준비하기

- 신경망이 학습하기 위해선 데이터가 필요합니다. corpus와 같은 데이터말이죠.
먼저, 데이터를 확인해보겠습니다.
(데이터는 영상으로 대체합니다.)

lines = tf.data.TextLineDataset('./CBTest/data/cbt_train.txt')

for line in lines.take(3):
  print(line)

이 데이터를 그대로 사용하면 위험합니다. 데이터를 클린하게 만들어 줄 필요가 있습니다.

lines = lines.filter(
    lambda x: not tf.strings.regex_full_match(x, "_BOOK_TITLE_.*")
)

punctuation = r'[!"#$%&()\*\+,-\./:;<=>?@\[\\\]^_'{|}~\']'
lines = lines.map(lambda x: tf.strings.regex_replace(x, punctuation, ' '))

위의 결과와 비교해보세요. 클린해진 것을 한눈에 알 수 있습니다.

이제 모델에 데이터를 입력하기 위해 window 형태로 만들어야 합니다. 모든 문장의 길이는 같기 때문에 단순히 split만 해주면 되겠군요.

words = lines.map(tf.strings.split)
wordsets = words.unbatch().batch(11)

for row in wordsets.take(3):
  print(row)

모델이 정답은 알아야겠죠? 데이터의 마지막 단어를 레이블로 만들고 싶습니다.

def get_example_label(row):
  example = tf.strings.reduce_join(row[:-1], separator = ' ')
  example = tf.expand_dims(example, axis = 0)
  label = row[-1:]
  return example, label

data = wordsets.map(get_example_label)
data = data.shuffle(1000)

결과는 다음과 같습니다. 한 개의 긴 문장(학습용 데이터), 한 개의 레이블로 이루어져 있네요.

하지만 신경망 모델이 직접 언어를 배울 수는 없습니다. 오로지 숫자를 배울뿐이죠.
그래서 위와 같은 데이터를 다시 숫자로 변환해야 합니다.

vocab_size = 5000 # Maximum vocab size
vectorize_layer = tf.keras.layers.experimental.preprocessing.TextVectorization(max_tokens=vocab_size,
                                                                               output_sequence_length = 10)

이와 같은 전처리 레이어는 다양하게 keras에서 제공하고 있으며, tf.data.Datasets와 활용하면 매우 효과적입니다. 다음 그림에서 전처리 레이어가 얼마나 다양하게 존재하는지 알 수 있습니다.

 

모델 준비하기

이제 모델을 구성하면 됩니다.(seq2seq 모델)
케라스와 TensorFlow AddOnes를 활용하면 쉽게 구성할 수 있습니다. seq2seq 모델은 상당히 복잡한데, Encoder는 keras layer를 통해 쉽게 구성할 수 있고,  Decoder는 AddOnes를 활용하여 한번에 구성할 수 있는 것을 영상에서 보여줍니다.

TF 2.x에서는 학습 과정을 클린하고 모듈화된 과정을 제공하기 위해 노력한다고 합니다.
train_step을 직접 만들고, Gradient_Tape()를 활용하여 모델을 업데이트시키죠.

학습 단계를 정의했다면, 기존의 케라스와 동일하게 compile() 함수를 활용해서 과정을 설정합니다.
그래서 위의 train_step을 직접 정의해야 되냐고요?
model.fit() 함수를 사용하면 위의 과정이 전부 포함되어 있습니다.

model = MyModel()
model.compile(...)
model.fit(...)

케라스를 사용해서 우리는 만족할 수준의 모델 성능을 쉽게 얻을 수 있었습니다.
하지만 아직 하이퍼파라미터 튜닝을 진행해보지 않았군요.

 

하이퍼파라미터 튜닝하기

KerasTuner를 활용한다면 매우 쉽습니다!
코드에서 hp(hyperparameter 객체) 인자를 사용해 튜닝을 준비하고 있습니다.

import kerastuner as kt

def build_model(hp):
  model = EncoderDecoder(
    			rnn_units = hp.Int(
                			'units', min_value = 256, max_value = 1100, step = 256))
  model.compile(...)
  model.vectorize_layer.adapt(lines.batch(256))

  return model

케라스 튜너는 다음과 같이 사용합니다.

tuner = kt.tuners.RandomSearch(
  build_model,
  objective = 'accuracy',
  ...
  project_name = 'text_generation')
  
tuner.search(
  data.batch(256),
  epochs = 45,
  callbacks = [tf.keras.callbacks.ModelCheckpoint('text_gen')])

학습이 끝났으니 이제 모델이 잘 동작하는지 확인해야 합니다.
train_step처럼 predict_step을 정의해야 하지만, 케라스를 활용하면 model.predict()로 끝입니다!

마지막으로 텐서플로우 2.x는 large-scale의 text processing을 위해 다음 모듈을 제공합니다.

  • tf.text
  • KerasBert
  • TFHub text modules

Dev Summit을 여는 첫 번째 동영상 Kenote는 이번 Dev Summit에서 텐서플로우가 무엇을 이야기할지 간략하게 정리해준다.

https://www.youtube.com/watch?v=_lsjCH3fd00&t=687s


- 코로나의 영향으로 온라인 라이브로 진행합니다.

- 2019년은 텐서플로우에게 매우 중요한 해였습니다. 바로 텐서플로우 2.x를 배포하였기 때문이죠. 또, 배포함과 동시에 사용자의 접근성을 계속해서 고려하고 있습니다.(아마 Pytorch를 의식하지 않았을까요?, Keras, Eager Execution을 통해 텐서플로우의 편리함을 강조하고 있습니다)

- 이제금 TensorFlow 2.2 버전이 제공됩니다. 좀 더 Stable한 버전이 될 것으로 기대합니다.

- 영상에서는 TensorFlow Ecosystem을 언급하는데, 다음 그림을 보면 무엇인지 바로 확인할 수 있습니다.
(JAX도 포함되어 있고, CoLab 등 우리에게 필요한 것이 전부 있습니다!)

- ecosystem은 연구자, 실제 환경에서의 사용자, 기타 사용자에게까지 모든 것을 편리하게 제공합니다.

- 텐서플로우는 Meena, T5와 같은 NLP 모델를 예시로 다양한 sub fields에서 활약하고 있다.
- 연구자는 텐서보드(Tensorboards)를 활용해서 많은 부분을 피드백받을 수 있도록 한다. 실제로 2019년에 많은 논문에서 텐서보드를 활용하여 실험 결과를 공유하고 있다고 합니다.

- 텐서플로우 2.x는 매우 단순하다.
(Eager Execution, NumPy array 지원, tf.data를 통한 data pipeline handling, TF Datasets 등을 통해 쉽게 접근할 수 있다)
- 또, JAX를 본격적으로 활용하면서 연구자들이 매우 환영할 것으로 기대한다(아마 traning의 시간에 매우 영향을 끼칠 것으로 판단됨).

- 머신러닝 모델을 실제 제품에 적용하는 것은 매우 어려운 일인데, 텐서플로우 Ecosystem을 활용하면 큰 도움을 받을 수 있다.

  1. 케라스 API를 활용하면 텐서플로우를 더욱 쉽게 활용할 수 있다.
  2. TensorFlow Hub를 활용하면 pre-trained 모델, 각 분야의 모델 Demo 등을 CoLab을 통해 쉽게 사용해 볼 수 있다.
    (개인적으로 매우 좋은 것 같습니다. pre-trained 모델을 쉽게 사용할 수 있는 것은 딥러닝의 매~~~~우 큰 장점이란 것을 아니까요)
  3. 구글 클라우드 플랫폼 파이프라인을 활용하면 end-to-end production을 쉽게 구축할 수 있습니다.
  4. 케라스를 통해 TPU를 쉽게 활용할 수 있습니다.

- TF Lite는 latency 수준을 매우 낮췄다!(밑 그림의 회색 bar를 확인하세요.)
- TF Lite의 사용을 더욱 쉽게 할 수 있고, Android Studio와도 연동이 더욱 수월하게 할 수 있도록 진행하는 것 같습니다.
- 뿐만 아니라, TensorFlow.js에서도 매우 훌륭한 성능을 제공하는 것을 보여줍니다.

- TensorFlow Runtime이 새롭게 개편되었습니다. 효율적이고 최적화를 진행했기 때문에 더욱 빠르게 연구할 수 있을 것으로 기대합니다.

- TensorFlow는 다양한 질문에 대비할 준비가 되어 있다.

- TensorFlow가 가지고 있는 커뮤니티의 힘은 매우 강력합니다.
(실제로 국내에서도 그렇죠. TensorFlow KR 또는 Keras KR with FaceBook을 찾아보세요!)

- TensorFlow를 학습하기 위한 다양한 course를 제공하고 있고, deeplearning.ai를 활용해도 좋습니다.
- TensorFlow 자격증이 생겼습니다!
(Tensorflow.org/certificate 를 참고하세요)