Devfest2019

2019-10-20

쉽게 따라할 수 있는 한국어 임베딩 구축 - 이기창

단어 임베딩으로 문서 분류하기

  • 가장 많이 사용: fastText

핵심 컨셉

  • 문서에 속한 단어가 유사하면 문서 의미도 비슷하다.

문서 벡터를 어떻게 만드나?

  • 단어 임베딩의 합(sum)으로 문서 백터를 표현한다. (단어 벡터의 합 = 단어 벡터의 평균 = 문서 벡터의 중심)

실험으로 검증

  • 네이버 영화 리뷰 말뭉치 활용
  • 학습데이터(문장, label) 댓글을 모두 문서 벡터(단어 임베딩의 합)로 변환한다.
  • cosine similarity 가 가장 높은 학습 데이터의 label로 분류

시사점

  • 복잡한 딥러닝 모델을 써도 80%대 성능 기록
  • 단어 임베딩 품질이 좋으면 자연어처리 성능을 높일 수 있음

임베딩이 어떻게 의미를 가지는가

  • 말뭉치의 통계적 패턴이 들어있음

Back-of-Words

  • 단어 빈도를 센다.
  • 문서를 쓴이의 의도는 단어 사용 패턴에 드러난다.

ELMo, Bert

  • 단어가 어떤 순서로 나타나는지 살핀다. (bi-direction)
  • 시퀀스 정보에 ㅡ이미가 녹아있다.

Word2Vec, FastText, GloVe

  • 단어가 어떤 단어와 주로 같이 나타나는지 살핀다.
  • 문맥에 의미가 녹아있다.

문장 수준 임베딩 구축 및 활용 (요즘 대세): ELMo, BERT

  • 2014년은 워드 임베딩, 그 이후로 elmo (sentence embedding) 쪽으로 많이 연구되고 있음.

  • ELMo: bidirectional LSTM, + CNN (다음 단어를 예측)

  • BERT: (SOTA) Transformer network (Attention is all you need)

문장 수준 임베딩

  • 문장 수준 임베딩의 장점은 동음이의어 분간 가능
  • 문장의 문맥적 의미를 벡터화할 수 있음.

  • 토큰화 > vocabulary > 학습

BERT

  • https://github.com/yeontaek/BERT-Korean-Model
  • SKT: https://github.com/SKTBrain/KoBERT

임베딩 활용

  • 임베딩이 가장 크게 쓰일 수있는 분야는 전이학습.
  • 다른 네트워크의 입력값으로 사용돼 자연어 처리 성능을 높일 수 있음

  • Bengio > Data Augmentation > Mixup

Clean Code for ML/AI - 한성민

What is Clean Code

깨진 유리창 이론 ~ 코드 품질

보이 스카웃 규칙 - 떠날 때는 찾을 때 보다 캠프장을 더욱 께끗이 할 것.

Usecase

코드 악취 - 코드에 문제가 발생할 때 생기는 나쁜냄새

코드 악취 유형 1

  • branch는 코드 복잡도를 높이므로 너무 많이 사용하지 않는 것 이 좋음.
  • guard clause 패턴으로 코드를 아예 실행시키지 않도록 함.

코드 악취2 - 주석을 남용

  • 자세하고 친절한 주석을 함수 이름으로 바꿔보세요.

코드 악취 3 - 중복코드

  • 중복되는 코드 합치기

그밖의 코드 악취 케이스

  • 너무 긴 메소드
  • 너무 거대한 클래스
  • 상속 거부: 자식 클래스에서 부모 클래스의 규칙을 무시하고 오버라이드
  • 과도한 복잡성
  • 게으른 클래스: 클래스에 부여된 기능이 너무 적은 경우

실제 모델 코드 최적화: Attention-based bidirectional LSTM

  • 안쓰는 키워드 제거
  • 직접 기입되어 있는 설정 인수들을 전역 변수로 추출 (수정이 빈번하게 일어남)
  • 복잡성이 높은 로직은 함수로 추출
  • 조건식 단순화, 중복 코드 함수 추출 (모델 코드의 경우 조건을 사용하는 경우가 많음)
  • 모델 혹은 옵티마이저의 인수정보들을 전역 변수에서 설정 프레임워크를 이용한 파라미터로 전환 (google/gin-config)
  • 코드 컨벤션 공통화
    • single, double quotation
    • 함수 사이 2줄
    • 1줄을 넘어서는 함수 인수의 intent

configuration 관리툴

  • https://github.com/IDSIA/sacred

Lint, Quality gate

  • python lint 도구: pylint, flake8, pycodestyle
  • Quality gate 도구: code grade를 알려줌. (sonarqube, codeclimate, codebeat)

The anti-patterns

  • if/switch 절의 남용 -> key access를 통한 분기대체
  • 데이터 초기화와 데이터 삽입 로직의 분리: 고차함수를 이용한 대체

    ex) 빈 배열 > append로 배열 채움.

  • 타입(type)의 부재

Q&A

  • 모델 테스트: 기존 테스트의 결과와 유사도로 검증 (일정 유사도 이하면 error)

BERT in kaggle - 이유한, 이영수, 송원호

Transformer

  • Encoder - Decoder 구조임 (seq-to-seq NMT에서 많이 사용)

Encoder

  • self-attension, feed forword network가 있음

self-attension

  • sealed dot product -> (Q,K 내적)유사도를 구해서 scalaing

BERT

  • Pretraining (masked LM, Next sentence prediction)
  • Fine-tuning

  • Transformer의 Encoder만 사용함.

image domain과 비교

  • CNN -> self-attention
  • Residual Block -> Encoder Block
  • RESNET -> transformer
  • RESNET(pretrained) -> BERT (pretrained)

Toxic Jigsaw unintended bias in tocity classification

  • 정상 코멘트(문장, 문단, 단어,..)인지 악성 코멘트인지 분류하는 문제
  • 특정 키워드가 포함되면 악성으로 구분할 확률이 상당히 높아짐. (정상인데 악성으로 분류되는 경우)
  • 대회에서 키워드들을 제시함.
  • Metric: AUC, bias-AUC (특정 키워드가 포함되었지만 정상 코멘트를 잘 찾아내는 척도)

진행방법

  • Baseline: Fasttext -> RNN
  • evaluation EDA를 진행
  • 커스텀 loss function을 정의함.
  • 문맥에 따라 임베딩을 다르게 함. -> BERT를 활용
  • Ensemble 사용

Conclusion

  • 좋은 머신은 꼭 필요하다.
  • 작은 모델 뿐 아니라 큰 모델 역실 중요하다
  • Evaluation에 맞는 loss를 잘 정의해야한다.
  • 일찍 파이프라인을 구성하고 많은 실험을 시도한다.
  • 제한된 시간 하에 높ㅇ느 점수를 내야해서 속도를 줄이기 위한 여러 기술이 필요하다.

Molucle

분자 학습을 어떻게 시킬까?

왜 다양한 딥러닝 아키텍쳐가 필요할까?

  • 일반 머신러닝은 데이터를 표현하는데 한계가 있음 (LeCun)
  • 주어진 데이터 내에서 피쳐를 잘 추출해내기 위함
  • 데이터가 가진 정보는 다양한 형태, 관계, 성질을 가지기 때문

분자 -> 그래프로 표현

  • 문장으로 표현해본다면?
  • 분자가 가진 여러 정보들을 문장으로 표현 (e.g. 탄소 4개가 있음 등)
  • 각각의 정보들을 임베딩해 vector로 만듦.
  • vector를 이어붙여 float sentence 생성

캐글에서 높은 점수를 얻으려면?

(1) with diversity, do ensemble!

  • difreret model -> different layer, different hidden dim
  • different seed -> different training subset

(2) Pseudo labeling

  • 우리가 예측한 값을 target으로 한 test set으로 새로 학습하는것

(3) 함께 하라!

모델의 성능을 높이기 위해 생각해야할 것!

  • 데이터의 핵심 피쳐를 잘 표한할 수 있는 학습 방식을 선택하라. (CNN, RNN, GNN, Transformer, Embedding)
  • 데이터를 잘 학습할 수 있는 Loss function을 찾아라 (다 해봐야할).
  • 학습이 잘 될 수 있는 조건을 최적화시켜라 (학습 스케쥴, 구조 최적화 등)