A BERT-based reverse dictionary of Korean proverbs

Overview

Wisdomify

  • Open In Colab
  • Run on Ainize

A BERT-based reverse-dictionary of Korean proverbs.

  • 김유빈 : 모델링 / 데이터 수집 / 프로젝트 설계 / back-end
  • 김종윤 : 데이터 수집 / 프로젝트 설계 / front-end / back-end
  • 임용택 : 모델링 / deploy / back-end

Related Projects:

Quick Start

Check the dependencies:

pytorch-lightning==1.3.7.post0
transformers==4.8.1

Clone the project and set up a virtualenv for the project:

git clone https://github.com/eubinecto/wisdomify.git
cd wisdomify
virtualenv wisdomifyenv
source wisdomifyenv/bin/activate  # activate the virtualenv
pip3 install -r ./requirements.txt  # install the required libraries onto the virtualenv

Download a pre-trained wisdomify and its related dataset with DVC.

version description
version_0.zip (1.5GB) the first minimal-viable-product of Wisdomify
version_1.zip (...) to be added...

Before downloading the model data and dataset, you must install DVC depending on your OS. After installing the DVC, you can download data with following command.

If your system is docker-like light OS, you can also install with pip. pip install 'dvc[gs]'

gcloud auth application-default login   
# as this repository uses google storage for dvc, please authenticate with your google account 
dvc pull
# follow the instruction from dvc after this command.

Make sure you have a directory structure like the following:

data
├── lightning_logs
│   ├── readme.md
│   └── version_0
│       ├── checkpoints
│       │   └── wisdomify_def_epoch=19_train_loss=0.00.ckpt
│       ├── events.out.tfevents.1624691069.eubinCloud.57195.0
│       └── hparams.yaml
├── wisdomdata
│   └── version_0
|       ├── wisdom2eg.tsv
|       └── wisdom2def.tsv
└── torchServeModel

Wisdomify a sentence:

python3 -m wisdomify.main.infer --ver="version_0" --desc="까불지말고 침착하여라"
### desc: 까불지말고 침착하여라 ###
0: (원숭이도 나무에서 떨어진다, 0.3917)
1: (산넘어 산, 0.2828)
2: (등잔 밑이 어둡다, 0.2192)
3: (가는 날이 장날, 0.0351)
4: (고래 싸움에 새우 등 터진다, 0.0264)
5: (꿩 대신 닭, 0.0241)
6: (갈수록 태산, 0.0197)
7: (핑계 없는 무덤 없다, 0.0009)
8: (서당개 삼 년이면 풍월을 읊는다, 0.0001)
9: (소문난 잔치에 먹을 것 없다, 0.0000)

Related Work

  • 기반이 되는 모델은 사전훈련된 BERT (Devlin et al., 2018)
  • 정확히는 한국어 구어체를 사전학습한 KcBERT를 사용함 (Junbum, 2020)
  • 사전훈련된 KcBERT를 reverse-dictionary task에 맞게 fine-tune함 (Yan et al., 2020)

How did I end up with Wisdomify?:

  1. Word2Vec: King = Queen - woman, 이런게 된다는게 너무 재미있고 신기하다. 이걸로 게임을 만들어볼 수 있지 않을까? - Toy 프로젝트: word-chemist
  2. 생각보다 잘 되는데? 그럼 Word2Vec로 reverse-dictionary도 구현할 수 있지 않을까? - 학사 졸업 프로젝트 - Idiomify
  3. Sum of Word2Vectors로 reverse-dictionary를 구현하기에는 분명한 한계가 보인다. 문장의 맥락을 이해하는 Language Model은 없는가? - 논문 리뷰: Attention is All you Need
  4. Attention의 목적이 Contextualised embedding을 얻기 위함임은 알겠다. 그런데 왜 각 파라미터를 Q, K, V라고 이름지었는가? 무엇에 비유를 하는 것인가?- What is Q, K, V? - Information Retrieval analogy
  5. Contextualised embedding을 활용한 사례에는 무엇이 있는가? - 논문 리뷰: Vokenization: Improving Language Understanding with Contextualized, Visual-Grounded Supervision
  6. Vokenisation 논문을 보니 BERT를 적극 활용하더라. BERT란 어떤 모델인가? - 집현전 중급 2조 BERT 논문리뷰
  7. 아, 혹시 사전훈련된 BERT를 활용한다면 적은 데이터를 가지고도 reverse-dictionary task를 구현할 수 있지 않을까? 누군가 이미 시도를 해보았을 것 같은데? - 논문리뷰: BERT for Monolingual and Cross-Lingual Reverse Dictionary
  8. 로스함수를 이해했다. 한번 BERT로 간단한 reverse-dictionary를 구현해보자 - Toy 프로젝트: fruitify - a reverse-dictionary of fruits!
  9. fruitify: 성공적인 첫 데모!
  10. BERT로 reverse-dictionary를 구현하는 방법을 이해했고, 실재로 구현도 해보았다. 이제 생각해보아야 하는 것은 reverse-dictionary로 풀만한 가치가 있는 문제를 찾는 것 - Wisdomify: 자기주도적으로 우리말 속담을 학습하는 것을 도와주는 reverse-dictionary.

Methods

The loss function

앞서 언급한 논문 (Yan et al., 2020)에서 제시한 reverse-dictionary task를 위한 loss:

BERT for monolingual reverse-dictionary

Hyper parameters

The hyper parameters used for version_0:

{
  "bert_model": "beomi/kcbert-base",
  "versions": {
    "version_0": {
      "desc": "The first minimal-viable-product of wisdomify",
      "data": "wisdom2def",
      "k": 11,
      "lr": 0.00001,
      "max_epochs": 20,
      "batch_size": 40,
      "repeat": 20,
      "num_workers": 4,
      "shuffle": true
    }
  }
}

Training

wisdomify_def_epoch=19_train_loss=0.00.ckpt
  • 훈련셋에서 로스가 0에 수렴할 때 까지 훈련을 진행함. 가능한 빠른 시일 내에 프로토타입을 만들어보는것이 목표였으므로, 일단 validation/test set 구축을 스킵, 오버피팅이 되더라도 훈련 셋에만 핏을 함.
  • 사이즈가 상당히 크므로, 나중에 knowledge distilation (Hinton, 2015)으로 경량화하는 것도 고려해봐야할 것.

Dataset

  • 10개의 속담 별로 5개의 서로다른 정의를 구글링으로 손수 수집. 사이즈가 작으므로 그냥 repo에 업로드 함: wisdom2def
  • 추후 데이터를 더 수집하게 되면 kaggle이나 dropbox에 업로드 해서 접근하는 편이 나을 것.

Examples

Positive examples

  • 갈수록 어렵다
### desc: 갈수록 어렵다 ###
0: ('산넘어 산', 0.9999836683273315)
1: ('갈수록 태산', 1.6340261936420575e-05)
2: ('꿩 대신 닭', 4.177704404639826e-09)
3: ('핑계 없는 무덤 없다', 4.246608897862103e-10)
4: ('원숭이도 나무에서 떨어진다', 4.91051192763603e-11)
5: ('가는 날이 장날', 3.620301280982119e-11)
6: ('등잔 밑이 어둡다', 3.410518395474682e-12)
7: ('고래 싸움에 새우 등 터진다', 2.889838230366905e-14)
8: ('소문난 잔치에 먹을 것 없다', 2.270246673757772e-14)
9: ('서당개 삼 년이면 풍월을 읊는다', 2.424753148985129e-15)
  • 근처에 있을 것이라고는 전혀 예상하지 못했다
### desc: 근처에 있을 것이라고는 전혀 예상하지 못했다 ###
0: ('등잔 밑이 어둡다', 0.934296190738678)
1: ('원숭이도 나무에서 떨어진다', 0.04902056232094765)
2: ('산넘어 산', 0.010009311139583588)
3: ('가는 날이 장날', 0.005946608260273933)
4: ('소문난 잔치에 먹을 것 없다', 0.0002701274352148175)
5: ('고래 싸움에 새우 등 터진다', 0.0002532936632633209)
6: ('갈수록 태산', 0.00010314056999050081)
7: ('핑계 없는 무덤 없다', 9.196436440106481e-05)
8: ('꿩 대신 닭', 8.55061716720229e-06)
9: ('서당개 삼 년이면 풍월을 읊는다', 3.365390739418217e-07)
  • 너 때문에 관계없는 내가 피해봤잖아
### desc: 너 때문에 관계없는 내가 피해봤잖아 ###
0: ('고래 싸움에 새우 등 터진다', 0.9243378043174744)
1: ('가는 날이 장날', 0.028463557362556458)
2: ('핑계 없는 무덤 없다', 0.026872390881180763)
3: ('등잔 밑이 어둡다', 0.012348096817731857)
4: ('소문난 잔치에 먹을 것 없다', 0.003390798345208168)
5: ('산넘어 산', 0.0026215193793177605)
6: ('갈수록 태산', 0.0010220635449513793)
7: ('원숭이도 나무에서 떨어진다', 0.0004960462101735175)
8: ('꿩 대신 닭', 0.00044754118425771594)
9: ('서당개 삼 년이면 풍월을 읊는다', 6.364324889318596e-08)
  • 쓸데없는 변명은 그만 둬
### desc: 쓸데없는 변명은 그만둬 ###
0: ('핑계 없는 무덤 없다', 0.6701037287712097)
1: ('꿩 대신 닭', 0.17732197046279907)
2: ('산넘어 산', 0.1395266205072403)
3: ('갈수록 태산', 0.01272804755717516)
4: ('가는 날이 장날', 0.00020182589651085436)
5: ('원숭이도 나무에서 떨어진다', 0.0001034122469718568)
6: ('고래 싸움에 새우 등 터진다', 1.2503404832386877e-05)
7: ('등잔 밑이 어둡다', 1.5657816447856021e-06)
8: ('소문난 잔치에 먹을 것 없다', 2.735970952016942e-07)
9: ('서당개 삼 년이면 풍월을 읊는다', 3.986170074576911e-11)

속담의 용례를 입력으로 주어도 용례에 맞는 속담을 예측할 수 있을까? 각 속담의 사전적 정의만 훈련에 사용되었다는 것을 고려해보았을 때, 만약 이것이 가능하다면 사전학습된 weight를 십분활용하고 있다는 것의 방증이 될 것.

  • 커피가 없으니 홍차라도 마시자
### desc: 커피가 없으니 홍차라도 마시자 ###
0: ('꿩 대신 닭', 0.5670634508132935)
1: ('가는 날이 장날', 0.15952838957309723)
2: ('산넘어 산', 0.14466965198516846)
3: ('등잔 밑이 어둡다', 0.10353685170412064)
4: ('소문난 잔치에 먹을 것 없다', 0.006912065204232931)
5: ('갈수록 태산', 0.00646367808803916)
6: ('서당개 삼 년이면 풍월을 읊는다', 0.006029943469911814)
7: ('원숭이도 나무에서 떨어진다', 0.004639457445591688)
8: ('핑계 없는 무덤 없다', 0.0011017059441655874)
9: ('고래 싸움에 새우 등 터진다', 5.46958799532149e-05)
  • 그 애가 도망쳐 버렸으면 아무나 대신 잡아넣어 숫자를 채워야 할 게 아니냐?
### desc: 그 애가 도망쳐 버렸으면 아무나 대신 잡아넣어 숫자를 채워야 할 게 아니냐? ###
0: ('꿩 대신 닭', 0.6022371649742126)
1: ('등잔 밑이 어둡다', 0.3207240402698517)
2: ('서당개 삼 년이면 풍월을 읊는다', 0.03545517101883888)
3: ('가는 날이 장날', 0.012123783119022846)
4: ('갈수록 태산', 0.011005728505551815)
5: ('원숭이도 나무에서 떨어진다', 0.010867268778383732)
6: ('핑계 없는 무덤 없다', 0.004052910953760147)
7: ('산넘어 산', 0.002024132991209626)
8: ('고래 싸움에 새우 등 터진다', 0.0013805769849568605)
9: ('소문난 잔치에 먹을 것 없다', 0.00012919674918521196)

  • 나는 어릴 적부터 카센터에서 잡일을 도맡아 하다 보니 이젠 혼자서 자동차 수리도 할수 있다.
### desc: 나는 어릴 적부터 카센터에서 잡일을 도맡아 하다 보니 이젠 혼자서 자동차 수리도 할수 있다. ###
0: ('서당개 삼 년이면 풍월을 읊는다', 0.5147183537483215)
1: ('등잔 밑이 어둡다', 0.34899067878723145)
2: ('가는 날이 장날', 0.12019266188144684)
3: ('원숭이도 나무에서 떨어진다', 0.011380248703062534)
4: ('산넘어 산', 0.002991838613525033)
5: ('갈수록 태산', 0.0007551977760158479)
6: ('꿩 대신 닭', 0.0004372508847154677)
7: ('소문난 잔치에 먹을 것 없다', 0.00040235655615106225)
8: ('고래 싸움에 새우 등 터진다', 7.436128362314776e-05)
9: ('핑계 없는 무덤 없다', 5.710194818675518e-05)
  • 맛집이라길래 일부러 먼길을 달려왔는데 막상 먹어보니 맛이 없더라
### desc: 맛집이라길래 일부러 먼길을 달려왔는데 막상 먹어보니 맛이 없더라 ###
0: ('소문난 잔치에 먹을 것 없다', 0.5269527435302734)
1: ('서당개 삼 년이면 풍월을 읊는다', 0.2070106714963913)
2: ('가는 날이 장날', 0.15454722940921783)
3: ('등잔 밑이 어둡다', 0.11061225831508636)
4: ('꿩 대신 닭', 0.0006726137944497168)
5: ('원숭이도 나무에서 떨어진다', 0.0001451421994715929)
6: ('산넘어 산', 3.2266420021187514e-05)
7: ('핑계 없는 무덤 없다', 1.288024850509828e-05)
8: ('갈수록 태산', 1.0781625860545319e-05)
9: ('고래 싸움에 새우 등 터진다', 3.4537756619101856e-06)

Negative examples

검색할 수 있는 속담이 모두 부정적인 속담이라서 그런지, 긍정적인 문장이 입력으로 들어오면 제대로 예측을 하지 못한다:

  • 결과가 좋아서 기쁘다
0: ('산넘어 산', 0.9329468011856079)
1: ('갈수록 태산', 0.05804209038615227)
2: ('꿩 대신 닭', 0.006065088324248791)
3: ('가는 날이 장날', 0.002668046159669757)
4: ('원숭이도 나무에서 떨어진다', 0.00024604308418929577)
5: ('핑계 없는 무덤 없다', 3.138219108222984e-05)
6: ('등잔 밑이 어둡다', 4.152606720708718e-07)
7: ('소문난 잔치에 먹을 것 없다', 2.1668449790013256e-07)
8: ('고래 싸움에 새우 등 터진다', 2.008734867331441e-08)
9: ('서당개 삼 년이면 풍월을 읊는다', 1.0531459260221254e-08)

"소문난 잔치에 먹을 것 없다"와 동일한 의미를 지님에도 불구하고, "실제로는 별거 없네"를 입력으로 받으면 "산 넘어 산"이 1등으로 출력. 하지만 훈련 셋에 포함된 샘플인 "소문과 실제가 일치하지 않는다"를 입력으로 받으면 정확하게 예측함. 즉 모델이 훈련셋에 오버피팅이 된 상태임을 확인할 수 있다:

  • 실제로는 별거없네 (훈련 셋에 포함되지 않은 정의)
### desc: 실제로는 별거없네 ###
0: ('산넘어 산', 0.9976289868354797)
1: ('갈수록 태산', 0.002168289152905345)
2: ('꿩 대신 닭', 0.00020149812917225063)
3: ('핑계 없는 무덤 없다', 9.218800869348343e-07)
4: ('등잔 밑이 어둡다', 1.6546708536679944e-07)
5: ('가는 날이 장날', 1.0126942839860931e-07)
6: ('원숭이도 나무에서 떨어진다', 9.898108288552976e-08)
7: ('소문난 잔치에 먹을 것 없다', 6.846833322526891e-09)
8: ('고래 싸움에 새우 등 터진다', 4.417973487047533e-10)
9: ('서당개 삼 년이면 풍월을 읊는다', 8.048845877989264e-14)
  • 소문과 실제가 일치하지 않는다 (훈련 셋에 포함된 정의)
### desc: 소문과 실제가 일치하지 않는다. ###
0: ('소문난 잔치에 먹을 것 없다', 0.999997615814209)
1: ('등잔 밑이 어둡다', 1.7779053678168566e-06)
2: ('가는 날이 장날', 5.957719508842274e-07)
3: ('갈수록 태산', 9.973800452200976e-09)
4: ('핑계 없는 무덤 없다', 2.4250623731347787e-09)
5: ('고래 싸움에 새우 등 터진다', 5.40873457133273e-10)
6: ('산넘어 산', 4.573414147390764e-10)
7: ('원숭이도 나무에서 떨어진다', 2.8081562075676914e-10)
8: ('꿩 대신 닭', 2.690336287081152e-10)
9: ('서당개 삼 년이면 풍월을 읊는다', 3.8126671958460534e-11)
  • 소문이랑 다르네 ("소문"이라는 단어에는 민감하게 반응한다.)
### desc: 소문이랑 다르네 ###
0: ('산넘어 산', 0.9770968556404114)
1: ('소문난 잔치에 먹을 것 없다', 0.01917330175638199)
2: ('갈수록 태산', 0.0035712094977498055)
3: ('꿩 대신 닭', 8.989872731035575e-05)
4: ('가는 날이 장날', 6.370477785822004e-05)
5: ('핑계 없는 무덤 없다', 1.7765859183782595e-06)
6: ('원숭이도 나무에서 떨어진다', 1.6799665445432765e-06)
7: ('등잔 밑이 어둡다', 1.6705245116099832e-06)
8: ('고래 싸움에 새우 등 터진다', 3.0059517541758396e-08)
9: ('서당개 삼 년이면 풍월을 읊는다', 4.33282611178587e-11)

Future Work

References

  • Devlin, J. Cheng, M. Lee, K. Toutanova, K. (2018). : Pre-training of Deep Bidirectional Transformers for Language Understanding.
  • Gururangan, S. Marasović, A. Swayamdipta, S. Lo, K. Beltagy, I. Downey, D. Smith, N. (2020). Don't Stop Pretraining: Adapt Language Models to Domains and Tasks
  • Hinton, G. Vinyals, O. Dean, J. (2015). Distilling the Knowledge in a Neural Network
  • Junbum, L. (2020). KcBERT: Korean Comments BERT
  • Yan, H. Li, X. Qiu, X. Deng, B. (2020). BERT for Monolingual and Cross-Lingual Reverse Dictionary
Comments
  • 기존 코드 리팩토링 & `RDBeta` 정의 및 학습하기

    기존 코드 리팩토링 & `RDBeta` 정의 및 학습하기

    Why?

    • https://github.com/wisdomify/wisdomify/issues/56#issuecomment-923674600

    What?

    • pre-training: 이미 학습된 kcBERT를 활용, 속담만을 MLM으로 학습 - 이때, 속담을 단일 토큰으로 취급하면서도, 속담 속 형태소의 임베딩도 활용을 한다.
    • fine-tuning: 정의 데이터에 핏. 알고리즘은 ver_0와 동일함.

    Todo's

    Canceled

    • [x] ~- RDZero, RDOne 정의.~
    • [x] ~- Builder, BuilderZero, BuilderOne을 정의.~
    • [x] ~- build_wisdom2subwords, build_wiskeys~
    • [x] ~- conf.json에 토크나이저 이름 / path도 추가하기!~

    리팩토링

    • [x] RD, RDAlpha, RDBeta 정의
    • [x] TensorBuilder 및 하위 빌더 정의
    • [x] 변경된 코드에 맞게, 테스트 리팩토링 하기
    • [x] 수지님, 유라님이 RDBeta.S_wisdom_figurative 만 구현하면 바로 테스트 해볼 수 있도록 환경 구성하기
    • [x] 그냥 XBuilder도 wisdom mask를 출력하도록 하기

    RDBeta

    • [x] @Yuuraa @ohsuz - S_wisdom_figurative 정의하고, 테스트 확인하기#68

    RDGamma

    • [ ] @Yuuraa - RDBeta의 구조를 따라가돼, linear layer 대신 attention을 사용하여 평균값을 구하는 방법을 시도해보기
    opened by eubinecto 28
  • version_0 model deploy with torch_serve

    version_0 model deploy with torch_serve

    TL;DR

    버전별로 모델을 서비스하고 버전별 A/B Test를 진행하기 위해 백엔드를 직접 다 만들기보단 해당 작업이 가능한 프레임 워크가 있다면 그걸 사용해보자. 오 torch_serve로 가능하다. 일단 version_0모델로 적용해보자.

    Why?

    현재 deploy되어 있는 version_0의 경우, 플라스크로 구현이 되어 있어 오직 한가지 모델만 Serving할 수 있다. 하지만 앞으로 데이터셋의 확장, 모델의 개선 그리고 피쳐 엔지니어링 등이 진행 됨에 따라 버전별로 모델이 새로 생성 될 것이다. 버전이 올라갈때마다 퍼포먼스가 무조건 개선 된다면 좋겠지만 항상 그럴수는 없을 것이다. 그러면 Front에 서비스 중인 모델의 버전을 이전 버전으로 롤백해야하는데 그럴때마다 플라스크를 수정하기보다 여러버전의 모델을 등록하고 필요에 따라 각 버전의 모델을 이용할 수 있는 것이 좋을 것이다.

    위 아이디어의 origin

    작년 여름에 네이버에서 인턴을 했을 때, 개발 → 스테이징 → 서비스, 세가지 단계로 모델을 공개/구분. (물론 개발 단계에서는 생성되는 모델이 많았을 것 하지만 실제 서비스, 스테이징으로 공개 되는 버전을 몇개 없었을 것.) 개발단계에서 구축 완료된 모델은 스테이징으로 올라가는 데 스테이징의 모델이 서비스에서 나오는 모델보다 성능이 좋지 않다면 (이때의 성능은 모델 training에서 사용되는 metrics가 아닌 특정 검색문장에 대한 속담 결과를 A/B test 진행해서 비교한다.) 스테이징에 있는 모델이 서비스 단계로 올라가지 못함.

    현재 우리의 프로젝트는 작은 시작 단계이지만 얼마 안 있어 프런트, 백엔드 그리고 stroyteller의 forward-dictionary까지 구축하게 되면 웹 서비스 로직이 꽤 커질 것이다. 아무리 백엔드를 깔끔하고 reusable하게 짠다 하더라도 모델이 새로 생성 될때마다 백엔드 로직을 건드리는 건 꽤 귀찮은 작업이 될것이다. (infer 로직이 변경되면 백엔드에서의 infer로직도 수정되어야한다. 물론 이것도 클래스로 래핑해서 재사용하면 되지만...)

    torch_serve를 이용하면 해당 방법이 가능하다고 한다.

    + alpha

    구현방법을 공부하며 실험하던중 "Management API"라는 게 있어 무엇인가하고 보니... torch_serve가 돌고 있는 서버가 있을 때 해당 서버에 REST API 를 통해서 모델을 추가, 워커 개수 조절 그리고 모델 제거 등등이 가능하다. 모델을 외부에 저장해둔 경우, 해당 주소를 입력해서 넣어주면 알아서 서버에 다운 받고 추가된다. (와...! 이게 제일 힘들었는데 ㅠㅠ 안그래도 도커내에서 다운받고 서비스하면 모델 다운로드하는 데에 걸리는 시간이 제일 길다. 앞으로 모델이 여러개 추가되서 모델별 비교 실험을 한다고 했을 때 백엔드 도커에 매 deploy마다 다운로드 받는 다고 하면... 음 끔찍하다 ㅋㅋㅋㅋ)

    What?

    torch_serve로 모델이 infer하게 해보자. 버전별 컨트롤을 하게 해준다. 일단은 version_0부터.

    opened by ArtemisDicoTiar 22
  • [CI/CD] Test before merge (with github action)

    [CI/CD] Test before merge (with github action)

    https://github.com/eubinecto/wisdomify/issues/15#issuecomment-876067094 젠킨스 같이 xml 혹은 yml로 어떤 조건에서 해당 테스트가 트리거 되어야하는 지 정해주면 테스트 실행후 merge가능인지 될듯

    젠킨스를 이미 내 프로젝트에서 사용하고 있으니 이 프로젝트에서는 깃헙 액션으로 트리거링해보자.

    enhancement 
    opened by ArtemisDicoTiar 13
  • Data Version Control (DVC) 적용하기

    Data Version Control (DVC) 적용하기

    Why?

    파이썬 파일, 설정 json등의 간단한 파일들은 git을 통해 버전 트레킹이 가능하며 Github에 업로드가 가능하다. 하지만 용량이 큰 파일 (약 2GB이상)의 경우 git에서는 트레킹이되지만 Github에 업로드가 불가능하다. 깃헙에 대용량 파일 업로드가 불가한 정책이 있기 때문이다. (아마도 용량이 큰 하나의 파일로 인해 전체 프로젝트의 깃 부피가 지나치게 커지는 것을 막기 위함인 것 같다.) 최근 딥러닝, 머신러닝등 기계 학습 기반의 모델들(serialised되었을 때 부피가 큼)을 연구하고 produce하는 society가 늘어남에 따라 위와 같은 큰 volume의 파일을 트레킹하는 데에 유용한 툴들이 개발되었다.

    우리의 프로젝트의 경우, 데이터셋이 꾸준히 업데이트 되고, 모델 또한 개선책을 마련하여 버전이 올라갈것이다. 그렇기 때문에 효과적으로 히스토리를 기록할 수 있으면 좋은데 사람이 직접하기엔 귀찮음과 부정확함이 생길 수 있다. 그래서 git과 같은 버전 컨트롤 도구를 추가하려 하는데 그중, 최근 Github에서 start개수가 많고 실제 ML프로젝트에서 많이 적용되는 것으로 보이는 DVC를 우리 프로젝트에 적용하려한다.

    What?

    DVC를 이용해 데이터셋, 모델 (serialised file)의 버전컨트롤을 해보자. 일단은 Version_0만 적용. remote 저장소는 최근에 만든 wisdomify.project의 구글 드라이브로.

    opened by ArtemisDicoTiar 12
  • Flask API implementation (storyteller, wisdomify)

    Flask API implementation (storyteller, wisdomify)

    TL;DR

    기존에 작성되어 있던 두 API 스크립트를 wisdomify에 integrate 시키자!

    WHY?

    스크립트의 플로우가 수정되면서 기존의 스크립트가 수정되어야했다. storyteller가 wisdomify에 통합되면서 storyteller API 스크립트도 재 작성해야한다.

    WHAT?

    storytellerAPI,wisdomifyAPI 그리고 main_deploy.py 구현

    TODOs

    • [x] storytellerAPI 구현
    • [x] wisdomifyAPI 구현
    • [x] main_deploy.py 구현, 수정
    • [x] 배포를 위한 Dockerfile 작성
    opened by ArtemisDicoTiar 11
  • infer time benchmark

    infer time benchmark

    현재 main.infer 실행에 대략적으로 측정되는 시간에는 모델 로드 시간이 포함되어 있다. 실제로 디플로이시에는 모델로드는 데몬이 최초 실행될때에만 실행되기 때문에 실질적인 infer시간에는 모델로드가 빠져야 맞을 듯하다.

    벤치마킹 툴이 여러개 있는 거 같다. 찾아보고 실험해보자.

    enhancement 
    opened by ArtemisDicoTiar 11
  • 속담 파싱 개선 : 속담 어절 삭제

    속담 파싱 개선 : 속담 어절 삭제

    Model Setting

    Version: 3 "bert_model": "beomi/kcbert-base", "desc": "[version_3]: Proverb parsed as [wisdom] token", "data_version": “1.0.0", "data_name": ["example"], "k": 11, "lr": 0.00001, "max_epochs": 20, "batch_size": 40, "repeat": 30 → 1, "num_workers": 0, "shuffle": true

    Data Setting

    Hugging Face path: “wisdomify/story" Version: “version_1.0.0"

    Analysis on Colab 코랩에서 진행 중..

    WHY? 속담을 파싱할 때, 사람이 직접하는 것이 좋을지, 혹은 모델에게 그것을 맡기는 것이 좋을지 실험해보고자 함.

    WHAT? 속담이 있는 어절을 날리고 학습을 진행시켜본다

    research 
    opened by teang1995 10
  • 속담 파싱 개선: [WISDOM] 토큰 활용

    속담 파싱 개선: [WISDOM] 토큰 활용

    Model Setting

    Version: 3 "bert_model": "beomi/kcbert-base", "desc": "[version_3]: Proverb parsed as [wisdom] token", "data_version": “1.0.0", "data_name": ["example"], "k": 11, "lr": 0.00001, "max_epochs": 20, "batch_size": 40, "repeat": 30 → 1, "num_workers": 0, "shuffle": true

    Data Setting

    Hugging Face path: “wisdomify/story" Version: “version_1.0.0"

    Analysis on Colab

    파이참에서 주피터를 실행하니 느려져서 코랩에서 진행!

    WHY?

    한글 속담 용례 문장에는 속담이 반드시 쓰여있다. 문제는 속담의 형태가 반드시 원형을 지키면서 쓰이지 않는다. 그렇기 때문에 속담을 올바르게 긁기가 어렵다.

    WHAT?

    형태소 분석을 통해 속담 부분을 올바르게 인지하고 해당 부분은 [MASK]*k [WISDOM]의 형태로 마스킹해보자.

    research 
    opened by ArtemisDicoTiar 10
  • 속담 용례 수집 시스템 구축하기 (version 1)

    속담 용례 수집 시스템 구축하기 (version 1)

    왜?

    속담의 용례를 가능한 많이 찾아야 한다.

    1. wisdomifier가 정의에 대한 설명이 아닌 예시문장으로 부터도 속담을 infer할 수 있게 하기 위해서
    2. 용례 말뭉치로 부터 해당 속담에 대한 유용한 정보를 얻을 수도 있기 때문 (e.g. collocation, word cloud)
    opened by eubinecto 10
  • 설문요청 게시글 작성하기

    설문요청 게시글 작성하기

    Why?

    정의 수집 설문의 적극적 참여를 유도하는 방법을 생각해보자.

    How?

    다음의 가이드 라인을 따라야 한다.

    1. 제일 중요한건 "너넨 그걸 왜하는거야?"에 대한 명확한 답을 하는 것. 즉Value Proposition을 피력하는 것이다. 비즈니스이건 오픈소스 프로젝트이건, 사람관계이던, 사람을 움직이는 것은 간판(e.g. 소속, 상품, 보상)이 아닌 가치(e.g. 재미있다, 돕고싶다, 나도 하고 싶다)이다.
    image image image 트위터도, 업스테이지도, 뉴럴링크도, 제일 처음으로 내세우는 것은 "우리 이만큼 돈벌고 있어요, 00학회에서 이만큼의 논문이 액셉되었어요"가 아니라, 어떤 가치를 창출하는지다. 인재들은 간판이 아닌 가치에 관심이 있기 때문에.
    1. 최대한 짧고 굵고 명확한 글을 써야 한다. 사람들의 소셜 미디어에서의 attention span은 굉장히 짧다. "더보기" 버튼이 나오는 글은 쓰면 안된다. 트위터의 최대 글자 개수에 한계가 있는 것에는 이유가 있다. 짧고 굵은 글이 사람들의 이목을 끈다.
    2. 깃허브 링크는 본문에 포함시킬 필요없다. 깃허브 링크는 그냥 댓글로 추가하기.

    To-do's

    • [x] 설문 요청 초안 작성 by @ArtemisDicoTiar
    • [x] 설문 요청 초안 작성 by @eubinecto
    • [x] 설문 요청 초안 작성 by @teang1995
    • [x] 설문 요청 초안 작성 by @ohsuz
    • [x] 비교, 대조 및 토론을 통한 최종본 병합
    • [ ] 오탈자 검사
    opened by eubinecto 7
  • eval 작동 안함

    eval 작동 안함

    Why?

    데이터 모듈 + 버전 컨트롤 넣은 뒤 eval이 작동안한다.

    What?

    대충 찾아보니 모델에 test_step이란 걸 추가할 수 있는 거 같다

    Form

    batch:0 (0.0, 0.0, 1.0, 1.0, 1.0)
    batch:1 (0.0, 0.0, 1.0, 1.0, 1.0)
    ### final ###
    data: wisdom2def
    median: 0.0
    var: 0.0
    top1: 1.0
    top10: 1.0
    top100: 1.0
    
    bug 
    opened by ArtemisDicoTiar 7
  • 코드 단순화하기. 좀 많이.

    코드 단순화하기. 좀 많이.

    Why?

    Less is more

    Wisdomify 프로젝트를 잠정 중단한 이후, the-clean-transformerthe-clean-rnns 프로젝트를 거치며 깨달은 점이다. 기능을 추가한다고 해서 무조건적으로 좋아지는 것이 아니다. 어쩔 때는 Less is more일 때가 있다.

    이 이슈를 통해 그런 문제를 다시 돌아보며 정리를 해보고자 한다.

    1. Flow로 아티팩트 생성 -> 그냥 스크립트로...

    2. Flow로 데이터 로드 및 다운로드 -> 그냥 fetchers.py로...

    3. if else로 레거시 관리 -> 그냥 git tag로...

    opened by eubinecto 0
Owner
null
天池中药说明书实体识别挑战冠军方案;中文命名实体识别;NER; BERT-CRF & BERT-SPAN & BERT-MRC;Pytorch

天池中药说明书实体识别挑战冠军方案;中文命名实体识别;NER; BERT-CRF & BERT-SPAN & BERT-MRC;Pytorch

zxx飞翔的鱼 751 Dec 30, 2022
Utilize Korean BERT model in sentence-transformers library

ko-sentence-transformers 이 프로젝트는 KoBERT 모델을 sentence-transformers 에서 보다 쉽게 사용하기 위해 만들어졌습니다. Ko-Sentence-BERT-SKTBERT 프로젝트에서는 KoBERT 모델을 sentence-trans

Junghyun 40 Dec 20, 2022
Transformer Based Korean Sentence Spacing Corrector

TKOrrector Transformer Based Korean Sentence Spacing Corrector License Summary This solution is made available under Apache 2 license. See the LICENSE

Paul Hyung Yuel Kim 3 Apr 18, 2022
LV-BERT: Exploiting Layer Variety for BERT (Findings of ACL 2021)

LV-BERT Introduction In this repo, we introduce LV-BERT by exploiting layer variety for BERT. For detailed description and experimental results, pleas

Weihao Yu 14 Aug 24, 2022
VD-BERT: A Unified Vision and Dialog Transformer with BERT

VD-BERT: A Unified Vision and Dialog Transformer with BERT PyTorch Code for the following paper at EMNLP2020: Title: VD-BERT: A Unified Vision and Dia

Salesforce 44 Nov 1, 2022
Pytorch-version BERT-flow: One can apply BERT-flow to any PLM within Pytorch framework.

Pytorch-version BERT-flow: One can apply BERT-flow to any PLM within Pytorch framework.

Ubiquitous Knowledge Processing Lab 59 Dec 1, 2022
A fast Text-to-Speech (TTS) model. Work well for English, Mandarin/Chinese, Japanese, Korean, Russian and Tibetan (so far). 快速语音合成模型,适用于英语、普通话/中文、日语、韩语、俄语和藏语(当前已测试)。

简体中文 | English 并行语音合成 [TOC] 新进展 2021/04/20 合并 wavegan 分支到 main 主分支,删除 wavegan 分支! 2021/04/13 创建 encoder 分支用于开发语音风格迁移模块! 2021/04/13 softdtw 分支 支持使用 Sof

Atomicoo 161 Dec 19, 2022
A collection of Korean Text Datasets ready to use using Tensorflow-Datasets.

tfds-korean A collection of Korean Text Datasets ready to use using Tensorflow-Datasets. TensorFlow-Datasets를 이용한 한국어/한글 데이터셋 모음입니다. Dataset Catalog |

Jeong Ukjae 20 Jul 11, 2022
Baseline code for Korean open domain question answering(ODQA)

Open-Domain Question Answering(ODQA)는 다양한 주제에 대한 문서 집합으로부터 자연어 질의에 대한 답변을 찾아오는 task입니다. 이때 사용자 질의에 답변하기 위해 주어지는 지문이 따로 존재하지 않습니다. 따라서 사전에 구축되어있는 Knowl

VUMBLEB 69 Nov 4, 2022
Official implementation of MLP Singer: Towards Rapid Parallel Korean Singing Voice Synthesis

MLP Singer Official implementation of MLP Singer: Towards Rapid Parallel Korean Singing Voice Synthesis. Audio samples are available on our demo page.

Neosapience 103 Dec 23, 2022
KLUE-baseline contains the baseline code for the Korean Language Understanding Evaluation (KLUE) benchmark.

KLUE Baseline Korean(한국어) KLUE-baseline contains the baseline code for the Korean Language Understanding Evaluation (KLUE) benchmark. See our paper fo

null 74 Dec 13, 2022
Korean Simple Contrastive Learning of Sentence Embeddings using SKT KoBERT and kakaobrain KorNLU dataset

KoSimCSE Korean Simple Contrastive Learning of Sentence Embeddings implementation using pytorch SimCSE Installation git clone https://github.com/BM-K/

null 34 Nov 24, 2022
Korean stereoypte detector with TUNiB-Electra and K-StereoSet

Korean Stereotype Detector Korean stereotype sentence classifier using K-StereoSet with TUNiB-Electra Web demo you can test this model easily in demo

Sae_Chan_Oh 11 Feb 18, 2022
🦅 Pretrained BigBird Model for Korean (up to 4096 tokens)

Pretrained BigBird Model for Korean What is BigBird • How to Use • Pretraining • Evaluation Result • Docs • Citation 한국어 | English What is BigBird? Bi

Jangwon Park 183 Dec 14, 2022
KakaoBrain KoGPT (Korean Generative Pre-trained Transformer)

KoGPT KoGPT (Korean Generative Pre-trained Transformer) https://github.com/kakaobrain/kogpt https://huggingface.co/kakaobrain/kogpt Model Descriptions

Kakao Brain 797 Dec 26, 2022
Generating Korean Slogans with phonetic and structural repetition

LexPOS_ko Generating Korean Slogans with phonetic and structural repetition Generating Slogans with Linguistic Features LexPOS is a sequence-to-sequen

Yeoun Yi 3 May 23, 2022
Korean extractive summarization. 2021 AI 텍스트 요약 온라인 해커톤 화성갈끄니까팀 코드

korean extractive summarization 2021 AI 텍스트 요약 온라인 해커톤 화성갈끄니까팀 코드 Leaderboard Notice Text Summarization with Pretrained Encoders에 나오는 bertsumext모델(ext

null 3 Aug 10, 2022
Training code for Korean multi-class sentiment analysis

KoSentimentAnalysis Bert implementation for the Korean multi-class sentiment analysis 왜 한국어 감정 다중분류 모델은 거의 없는 것일까?에서 시작된 프로젝트 Environment: Pytorch, Da

Donghoon Shin 3 Dec 2, 2022