Backend

6.4 ELMo 활용

6.4 ELMo 활용

한국어 임베딩 p.265~

6.4.1 네트워크 개요

(예시) 네이버 영화 리뷰
입력값: ELMo 임베딩
ELMo 임베딩을 1개 층의 양방향 LSTM 레이어에 태움
각 LSTM 셀에서 나온 출력 벡터들에 어텐션 메커니즘 적용 → 고정된 길이의 히든 벡터
히든 벡터를 피드포워드 네트워크에 입력: 피드포워드 네트워크의 활성함수는 ReLU. → 로짓벡터
로짓벡터에 소프트맥스를 취해 긍정, 부정의 2차원의 확률 벡터를 만듦.
6.4.2 네트워크 구현
입력 레이어: ELMo 임베딩!!!
BidirectionalLanguageModel (#1) → bilm (객체 생성)
ELMo 모델의 문자 수준 컨볼루션 신경망, 양방향 LSTM 레이어에 해당하는 텐서플로 계산 그래프 생성
프리트레인된 학습 파라미터를 읽어들임
ids_placeholder (#2) : 각 단어 ID 시퀀스를 받는 입력 텐서 정의
→ bilm 객체에 입력
bilm (#3) : ELMo 임베딩을 계산할 밑바탕이 되는 임베딩을 리턴
embeddings_op
문자 수준 컨볼루션 신경망 출력 벡터
양방향 LSTM 레이어 출력 벡터
weight_layers (#4) : ELMo 임베딩을 리턴
weight_layers에 적용되는 가중치들은 파인 튜닝을 하면서 다른 학습 파라미터들과 함께 업데이트됨.
ELMoTuner
Tuner의 자식 클래스
Batcher 정의: 입력 단어들을 ID 변환
ELMo 파인 튜닝 네트워크의 텐서 그래프
ELMo의 파인 튜닝 네트워크 학습
별도의 어휘 집합을 필요로 하지 않음.
why? 문자 단위의 입력을 받고, 파인 튜닝 과정에서 입력 단어 시퀀스 다음 단어를 예측하는 과정이 생략되었기 때문.
단, 자주 등장하는 문자시퀀스를 미리 ID 시퀀스로 만들어 메모리에 들고 있으면 효율적인 학습 가능
<구성>
Batcher
lm_vocab_file : 어휘 집합 파일 위치
make_input: 입력값 생성함수
batcher.batch_sentences : 배치 문장 → 유니코드 ID로 변환
tune : ELMo 파인 튜닝 네트워크의 학습
global_step, optimizer, session 정의

6.4.3 튜토리얼

(※ ELMo의 파인 튜닝은 GPU가 있는 환경에서만 학습할 수 있음)
i.
학습 데이터와 프리트레이닝이 완료된 ELMo의 임베딩을 준비
ii.
ELMo 파인 튜닝 진행
tune-elmo.log 파일에 학습 전과정을 기록함.
iii.
tune-elmo.log 기록을 시각화 → loss, accuracy 값 확인
매 epoch마다 학습 손실 ↓, 테스트 데이터에 대한 정확도↑
학습 정확도가 1 epoch일 때부터 상당히 높음.
why? 대규모의 데이터를 프리트레이닝해 한국어의 의미적 문법적 정보들을 이미 이해하고 있기 때문
→ 파인 튜닝을 조금 하더라도 다운스트림 태스크를 효율적으로 수행 가능
iv.
ELMo 모델 평가 : ELMoEmbeddingEvaluator
max_characters_per_token: 토큰 하나당 최대 문자 길이
dimension : ELMo 임베딩의 차원 수
num_labels : ELMo를 파인 튜닝할 때의 분류 범주의 수
max_characters_per_token
dimension
v.
파인 튜닝 ELMo 모델의 예측
model.predict("이 영화 엄청 재미있네요") model.predict("이 영화 엄청 재미없네요")
Python
복사
[부정 확률, 긍정 확률] 의 2차원 확률 벡터 리턴
vi.
ELMo 임베딩 추출
토큰별 임베딩
입력 문장 → 형태소 분석(은전한닢) → 유니코드 ID 시퀀스 → 문자 단위 컨볼루션 레이어, 양방향 LSTM 레이어 통과 → 각 레이더의 출력 벡터 가중합 ⇒ 토큰별 임베딩 추출
model.get_token_vector_sequence : 형태소 분석 결과와 토큰별 ELMo 벡터들을 반환
문장 임베딩
model.get_sentence_vector : 형태소 분석 결과와 토큰 시퀀스의 마지막 단어에 해당하는 벡터
vii.
ELMo 임베딩 시각화
model.visualize_sentences : 입력 문장 → ELMo 문장 임베딩 → t-SNE로 2차원으로 축소 → Bokeh 시각화
model.visualize_between_senteces: 입력 문장 → ELMo 문장 임베딩 → 벡터 간 코사인 유사도 → Bokeh 시각화
시각화 품질을 별로 좋지 않음.