RNN에서 문자 정렬

seq2seq sort



정렬되지 않은 문자열에서 문자의 원래 문자열을 복원


  • seq2seq 작업 중 하나 인 정렬을 자연어로 확장합니다.
  • 문자 레벨 (문자 입도)에서 순서 정보를 잃은 벡터 정보에 벡터를 입력으로 원래 문장을 작성하려고합니다.

    원래의 상정하고 있던 유스 케이스로서는, 아이디어를 어울리는 브레인스토밍 등으로, 자주(잘) 스티커 메모 등을 사용해 키워드를 포스잇등으로 치고, 그 다음 최종적으로 말하고 싶은 것을 구축하는 것을, 잘 합니다만, 그러한 키워드군을 투입하는 것으로, 자연스럽게 이끌고 싶은 정보를 귀결시킬 수도 있다고 생각했습니다.

    단어로 하려고 하면 입력 차원이 고차원이 되어 네트워크 크기의 한계에 부딪히고 문자의 정렬 작업을 이번에는 주어 봅니다.

    선행 연구


  • ORDER MATTERS: SEQUENCE TO SEQUENCE FOR SETS

  • 문자열을 파괴하여 문자 입도의 벡터 열에서 원래 문자열의 배열을 복원합니다.


  • 동양경제씨의 온라인 컨텐츠 기사 타이틀을 이용
  • 문자 입도로 분해하여 Bag of Words와 같은 벡터 표현으로 변환
  • Encoder를 입력하고 문자를 벡터화하여 Decoder에서 원래 문자열의 배열을 예상합니다.

    네트워크



    어쩐지 시도하고 잘 작동하는 모델을 사용하고 싶습니다.
    enc = input_tensor
    enc = Flatten()(enc)
    enc = RepeatVector(30)(enc)
    enc = GRU(256, dropout=0.15, recurrent_dropout=0.1, return_sequences=True)(enc)
    enc = TimeDistribute(Dense(3000, activation='relu'))(enc)
    enc = Dropout(0.25)(enc)
    
    dec = Bidirect(GRU(512, dropout=0.30, recurrent_dropout=0.25, return_sequences=True))(enc)
    dec = TimeDistribute(Dense(3000, activation='relu'))(dec)
    dec = Dropout(0.5)(dec)
    dec = TimeDistribute(Dense(3000, activation='relu'))(dec)
    dec = Dropout(0.1)(dec)
    decode  = TimeDistribute(Dense(3135, activation='softmax'))(dec)
    



    그림 1. 만든 Encoder-Decoder의 정렬 작업

    전처리



    동양경제씨의 콘텐츠를 스크래핑
    $ python3 12-scan.py
    

    스크래핑 된 html 정보를 구문 분석하고 텍스트 정보를 검색합니다.
    $ python3 16-parse-html.py
    

    텍스트 정보와 벡터 정보 쌍 만들기
    $ python3 19-make_title_boc_pair.py 
    

    기계 학습 가능한 숫자의 벡터 정보로 변환
    $ python3 23-make_vector.py 
    

    학습



    학습하기

    (데이터 크기가 거대하기 때문에 128GByte 정도의 메인 메모리가 필요합니다)
    $ python3 24-train.py --train
    ...
    

    categorical_crossentropy의 손실이 0.3 정도로 떨어지면 어느 정도 예상이 가능합니다.
    GTX1060으로 3일 정도 필요했습니다

    평가



    입력에 사용한 순서가 무너진 정보와, 그들을 입력으로, 재정렬하고 그러한 문자의 페어는 이와 같이 됩니다
    入力 ['、', 'が', 'ル', 'ダ', '子', 'を', '日', '銀', '本', '団', '上', 'メ', '男', '定', '体', '以', '確', '球', '卓']
    出力 卓球男子団体、日本が銀メダ以以上を確定<EOS>
    
    入力 ['は', 'い', 'リ', 'た', 'ャ', 'ル', '界', 'し', 'に', 'て', '戦', '由', '表', 'シ', '挑', '自', '限', '現']
    出力 シャルリは表現の自由の限界に挑戦していた<EOS>
    
    入力 ['「', 'は', '」', 'た', '国', 'と', 'に', 'る', '消', 'え', '攻', '米', '北', '朝', '鮮', '先', 'よ', '撃', '制', '藻', '屑']
    出力 米国による「北朝鮮先制攻撃」は藻屑と消えた<EOS>
    
    入力 ['、', 'が', '国', '世', '界', '子', '主', '沸', '騰', 'す', '部', 'る', 'マ', 'ス', '業', '中', '品', '電', '救', 'ホ']
    出力 中国スマホが救世主、沸騰する電子部品業界<EOS>
    

    코드



    GitHub에 있습니다. 그래서 확인하십시오

    끝에



    처음에는 단어 입도의 벡터를 입력으로 문자열 복원을 하고 있었습니다만, 입력이 너무 고차원이 되어 버린 것, 컴퓨터 자원적으로 학습이 어렵다는 배경이 있었습니다

    그 때문에, 몇번이나 수법을 정리했습니다만, 캐릭터 입도는 학습이 간단한 반면, 그다지 재미있지 않습니다

    RNN에서 가장 큰 과제라고 느끼는 것은 온메모리로 입력용의 밀행렬을 유지하는 것이 어려운 것입니다. 메모리의 양이 유한이므로, 어떠한 방법으로 안정화시키는 방법이 요구되고 있습니다만, 어쩐지 좋은 방법 없을까요.
  • 좋은 웹페이지 즐겨찾기