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 시각화
•
시각화 품질을 별로 좋지 않음.