• Post author:
  • Post category:python / 개발
  • Post comments:0 Comments
  • Post last modified:2020년 9월 13일
  • Reading time:2 min(s) read

Universal Sentence Encoder

설명

Universal Sentence Encoder는 구글에서 사전 학습한 모델로 문자열에 대한 Embedding을 학습된 형태로 제공한다. USE는 다양한 variation이 있는데, large 와 아닌것의 차이는 표현가능한 문자열 길이 ( 정확하게는 토큰의 갯수 ) 에 차이가 있는것 같다.

Universal Sentence Encoder를 이용한 문자열 문장에 대한 이진분류기를 tensorflow 로 모델링 하였다. 입력은 문자열 2종과(제목, 본문) 그 문자열의 주제 카테고리(5종) 그리고 그에 대한 2진 분류출력(긍정,부정) 으로 감안해주시면 좋겠다. 실제 문제는 다르지만 이의 분류 문제와 동일한 문제로 사상할수 있어서 이렇게 설명한다. 문제의 원본의 경우 업무상 발생 데이터라 공개 불가능한 부분이 있어 이처럼 표현 하도록 한다

이러한 모델을 구성 할 때, Universal Sentense Encoder 의 출력을 입력으로 사용하는 방법은 크게 두어가지쯤으로 나뉘는것 같다.

  1. 스트링 원본을 입력받아, 모델 상의 계층 중 Embedding 계층을 Universal SentenseEncoder 계층으로 구성하는것
  2. 스트링을 미리 Encoding 하여 모델의 입력시점에서 애초에 Embedding 된 vector 를 입력으로 주는 방법

이 글에서는 스트링을 미리 Encoding 하여 모델의 입력을 받는상황을 먼저 설명하고 그 이유와 다음글에서 스트링 원본을 입력으로 받는 모델에 대하여 설명하도록 한다.

def getModel(categorySize:int = 5)-> tensorflow.keras.Model:

    source_features = keras.Input( shape=( 512 ), dtype=tf.float32, name='inputTextEncoded1')  # Variable-length sequence of ints
    defect_features = keras.Input( shape=(512), dtype=tf.float32, name='inputTextEncoded2')  # Variable-length sequence of ints
    defect_type_input = (keras.Input(shape=(categorySize), name='defectType'))  # Variable-length sequence of ints

    # embedding_layer = tf_hub.KerasLayer(encoderPath, trainable=False)

    # source_features =embedding_layer(source_features)
    #
    #
    # # defect_features = (layers.Embedding(vocab_size, 8)(defect_line_input))
    # defect_features =embedding_layer(defect_features)



    LSTM_SOURCE_LENGTH = 150
    LSTM_DEFECT_LENGTH = 50

    # # source_features = tf.keras.layers.Bidirectional(layers.LSTM(LSTM_SOURCE_LENGTH),name='sourceBidrectionalLSTM')(source_features)
    # source_features = (layers.LSTM(LSTM_SOURCE_LENGTH,name='sourceLSTM'))(source_features)
    #
    # # defect_features =tf.keras.layers.Bidirectional(layers.LSTM(LSTM_DEFECT_LENGTH),name='defectBidrectionalLSTM')(defect_features)
    # defect_features = (layers.LSTM(LSTM_DEFECT_LENGTH,name='defectLSTM'))(defect_features)


    # Merge all available features into a single large vector via concatenation
    x = layers.concatenate([source_features, defect_features,defect_type_input])



    #히든 레이어 8개를 2계층으로 추가
    x = layers.Dense(256, activation='relu')(x)
    x = Dropout(0.5)(x)

    x = layers.Dense(128, activation='relu')(x)
    x = Dropout(0.4)(x)

    x = layers.Dense(64, activation='relu')(x)
    x = Dropout(0.3)(x)

    x = layers.Dense(32, activation='relu')(x)
    x = Dropout(0.2)(x)

    x = layers.Dense(16, activation='relu')(x)






    #결과 출력 계층 -> 가/부의 2차원 벡터로 표현
    ACTIVATION='softmax'
    print("Activation : ", ACTIVATION)
    # result_predictionLayer :Dense = layers.Dense(1, activation='relu', name='isFalsePositive')(x)
    result_predictionLayer: Dense = layers.Dense(2, activation=ACTIVATION, name='isTruePositive')(x)
    # result_predictionLayer: Dense = layers.Dense(1, activation='sigmoid', name='isFalsePositive')(x)
    # tensorflow.dtypes.cast(result_predictionLayer, tensorflow.float32)



    #위에서 모델링된 네트워크를 오브젝트로 변환
    mergedmodel = tensorflow.keras.Model(inputs=[source_features, defect_features,defect_type_input],
                                         outputs=[result_predictionLayer])






    return mergedmodel

위와 같은 형대로 모델 설계시에는, 입력 문자들에 대해 미리 Universal Sentence Encoder를 통과시켜서 적절한 512차원의 벡터로 준비된 데이터들을 모델의 입력으로 제공하여 학습을 진행하여아 한다.

댓글 남기기