데이터과학 삼학년

Transfer learning 적용 정리 : universal sentence encoder multilingual 본문

Natural Language Processing

Transfer learning 적용 정리 : universal sentence encoder multilingual

Dan-k 2020. 8. 10. 17:27
반응형

Transfer learning : universal sentence encoder multilingual

적용 환경

  • TF 2.3 

 

실행 문제

  • 모델 등록 후 Online prediction 불가
    • 이유는….잘 모르겠음

  • Keyed model을 이용하여 batch prediction 처리 불가 (transfer learning sequential api 에서만 가능)
  • Bigquery ML model create 불가하여 online prediction 불가
    • tensorflow data size 가 허락된 양 268435456 보다 클 경우, create가 안됨

장점

  • 한가지 모델로 다중언어 처리 가능
  • 학습시 일부 언어 학습만으로도 예측에 다국어 처리 가능

단점

  • 제한된(불안정한) 환경
    • keyed model 적용 불가
    • bigquery ml 적용 불가

 

프로덕트 적용 검토

  • 아직은 transfer learning layer자체를 모델로 저장해 ai-platform에 적용하기에 몇가지 한계를 확인할 수 있었음
  • universal sentence encoder 적용사례 검토 결과, 보통 전처리 단계에서 embedding layer를 적용시켜 데이터를 변환 후 모델에 태우는 usecase를 많이 찾아볼 수 있었음  
  • text embedding transfer learning의 경우 아직 tf 1.x 버전에서 graph를 만들어 적용하는 사례가 많이 있음 (링크)
  • tf 2.x 를 위한 버전도 계속해서 업데이트되고 있어 조금더 지켜본후 적용할 필요가 있다고 보임



적용 코드

# -*- coding: utf-8 -*-

"""transfer_learning_use_multilingual.ipynb
Automatically generated by Colaboratory.
Original file is located at
    https://colab.research.google.com/drive/1DOfSOU358etXSACiLV7-8HKdbIK7esvd
"""

!pip install tensorflow_text



import urllib
import pandas as pd

import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_text
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import optimizers

from sklearn.model_selection import train_test_split



tf.__version__



## naver 영화데이터 불러오기

urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings_train.txt", filename="ratings_train.txt")
urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings_test.txt", filename="ratings_test.txt")


train_data = pd.read_table('ratings_train.txt')
test_data = pd.read_table('ratings_test.txt')

train_data['document'] = train_data['document'].apply(str)

X = train_data.iloc[:2000,:].document
y = train_data.iloc[:2000,:].label

X.head()


def encode_labels(sources):
  classes = [source for source in sources]
  one_hots = to_categorical(classes)
  return one_hots

X_train, X_valid, y_train, y_valid = train_test_split(X, encode_labels(y), test_size=0.1, random_state=42)
n_classes = 2

optimizer = optimizers.Adam(learning_rate=0.01)

use_url = "https://tfhub.dev/google/universal-sentence-encoder-multilingual/3"
use_url_large = "https://tfhub.dev/google/universal-sentence-encoder-multilingual-large/3"

loaded_obj = hub.load(use_url)

model = Sequential(
    [   
      hub.KerasLayer(use_url, input_shape=[], dtype=tf.string, trainable=False, name='USE-multilingual'),
      tf.keras.layers.Dense(2, activation="relu", name="layer1"),
      tf.keras.layers.Dense(3, activation="relu", name="layer2"),
      tf.keras.layers.Dense(2, activation="softmax", name="layer3")
    ]
)

model.compile(optimizer = tf.keras.optimizers.Adam(lr=1e-3), loss ='categorical_crossentropy', metrics =['accuracy'])
model.summary()


model.fit(X_train.values, y_train, epochs=2)

tf.keras.utils.plot_model(model, show_shapes=True, dpi=90)

MODEL_EXPORT_PATH = './use_model/'

tf.saved_model.save(model, MODEL_EXPORT_PATH)

loaded_model = tf.keras.models.load_model(MODEL_EXPORT_PATH)

test_sample = '나는 밥을 아주 맛있게 먹었습니다.'

loaded_model.predict([test_sample])

model.predict([test_sample])

 

728x90
반응형
LIST
Comments