2020년 9월 28일 월요일

논문 설명 - Sentence-BERT : Sentence Embeddings using Siamese BERT-Networks

 

논문 정보


Introduction

  • BERT 네트워크에 siamese, triplet 구조를 적용했다.
  • 이로 인해 기존의 BERT가 하지 못했던 large-scale의 similarity comparison, clustering, information retrieval 등을 할 수 있다.
  • BERT로 유사한 두 문장을 찾으려면 두 개의 문장을 한 개의 BERT 모델에 넣어야 유사도가 평가된다.
  • 따라서 문장이 10000개 있으면 10000 * 9999 / 2 번의 연산 후에야 랭킹을 할 수 있다.
  • Clustering이나 search에서는 각 문장을 벡터 공간에 매핑하는 작업을 보통 쓰며, BERT를 이용할 때는 출력을 평균내거나 [CLS] 토큰의 출력값을 이용한다.
  • 하지만 이랬을 때의 결과는 각 단어의 GloVe 벡터를 평균낸 것보다 좋지 않다.
  • 이에 siamese 네트워크로 문장을 벡터화할 수 있는 SBERT를 제안한다.
  • SBERT를 NLI 데이터로 fine-tuning 했다.


Model

  • BERT에서 fixed-size sentence embedding을 얻기 위해 풀링을 사용한다.
  • 방법은 총 3가지이며, [CLS]토큰 값 이용, 평균, max-over-time이 있다.
  • SNLI 데이터로 fine-tuning할 때의 구조는 위와 같다.
  • 두 문장의 출력값인 u, v 그리고 element-wise 차이값인 |u-v|를 concatenate한 후 파라미터를 추가하여 학습한다.

  • 실제 inference할 때나, regression 방식의 loss function을 쓸 때는 cosine-similarity를 이용한다. Training할 때, 계산된 cosine similarity와 gold label 간의 MSE를 minimize하는 방식으로 학습했다.
    참고 코드 링크

  • SNLI, MNLI 데이터를 이용하여 학습(fine-tuning)했다.


Evalution - Semantic Textual Similarity

  • 모델의 성능은 STS(Semantic Textual Similarity) task를 통해 평가했다.
  • 그리고 두 문장의 유사도를 계산하기 위해 cosine-similarity를 이용했다.

  1. Unsupervised STS
    • STS 데이터로는 학습하지 않는 상태의 SBERT의 성능을 평가했다.
    • 실험 결과는 cosine-similarity와 label 간의 Spearman's rank를 사용했다.
    • BERT의 출력을 썼을 때 결과가 안 좋았다.
    • Siamese 네트워크를 쓰니 결과가 좋아졌다.
    • RoBERTa 구조는 큰 차이가 없었다.
  2. Supervised STS
  3. SBERT에 사용한 학습 방법은 두가지이다. 하나는 원래 BERT를 STS 학습 데이터에 학습한 경우, 다른 하나는 NLI로 학습한 이후 STS 학습 데이터로 학습한 경우
    • STS 데이터셋의 학습용 데이터를 이용해 SBERT 모델을 학습시켰다.
    • 이 때는, regression 형태의 모델 구조, loss function을 사용했다.
    • SBERT도 성능이 좋아졌지만, BERT의 성능이 가장 많이 좋아졌다(여기서 BERT는 문장 두개를 입력으로 사용한 것 같다).
    • 그래서 성능만을 봤을 때는, 굳이 SBERT 구조를 사용할 필요가 없는 것 같다...?
    • 기여한 점이라면 단지 NLI 데이터로 먼저 학습하면 STS의 결과가 좋아진다 정도?
    • 그런데 이건 거의 당연한 거 아닌가?
    • 4.3, 4.4 생략

Evaluation - SentEval

  • 문장의 embedding을 feature로 하여 logistic regression을 하는 SentEval에 대해서 실험했다.
  • 대체적으로 가장 좋은 성능을 보였다.

Conclusion

  • BERT로 STS를 했을 경우 성능이 좋지 않았다고 한다.
  • 그래서 siamese 구조를 이용하여 fine-tuning할 수 있는 SBERT를 제안했고, significant한 성능 향상이 있었다.
  • 그리고 computationally efficient하며, BERT로 하기 힘들었던 clustering, retrieval 등을 할 수 있게 됐다.

"각 문장에 대한 BERT의 출력을 각각 pooling(avg)해서 layer를 하나 추가하고 NLI로 fine-tuning하면 sentence embedding이 좋아진다." 이다.


2020년 9월 24일 목요일

논문 설명 - RoBERTa : A Robustly Optimized BERT Pretraining Approach



논문 정보

Introduction
  • 이 논문은 BERT에 대한 replication study - 재현 연구 - 의 결과를 정리한 논문입니다.
  • 각 하이퍼 파라미터나 훈련 데이터의 크기 등이 성능에 어떤 영향을 미치는지를 평가했습니다.
  • 아직 BERT는 매우 undertrained 되어 있으며, 성능을 향상시킬 수 있는 법을 제안합니다.
    1. 더 오래, 배치 사이즈를 더 크게, 더 많은 데이터로 학습시킨다.
    2. Next Sentence Prediction loss를 없앤다.
    3. 더 긴 sequence로 학습한다.
    4. Masking을 매 번 바꾼다.
  • 이렇게 학습한 결과, GLUE와 SQuAD에서 더 좋은 성능을 얻었다고 합니다.

Experimental Setup

  1. Implementation
    • 대부분의 하이퍼 파라미터는 original BERT와 같게 했지만, peak learning rate과 warmup step 수를 변경하면서 실험했습니다.
    • 그리고 학습 결과가 Adam의 epsilon term에 굉장히 민감하며, 어떤 경우엔 더 좋은 성능을 얻거나 안정성이 향상됐습니다.
    • 그리고 배치 사이즈를 크게 할 때 beta2를 0.98로 하면 안정성이 늘어났습니다.
    • 또한 short sequence를 섞어서 학습하지 않았습니다.
    • Original BERT는 처음 90%의 학습을 짧은 sequence로 한 후에 긴 sequence로 학습했는데, 이와는 다르게 처음부터 끝까지 계속 full-length sequence로 학습했습니다.
  2. Data
    • BERT 형식의 모델들은 텍스트 데이터의 양이 많을 때 더 좋은 성능을 보였습니다.
    • 그래서 가능한 많은 데이터를 모으는 데 주력했습니다.
    • 사용한 데이터는 BookCorpus + Wikipedia - Original BERT에 사용된 데이터셋 2개, CC-News, OpenWebText, Stories로 총 160GB정도 입니다.
  3. Evaluation
    • GLUE, SQuAD, RACE task를 기준으로 평가했습니다.

Training Procedure Analysis

  1. Static vs. Dynamic Masking
    • 기존의 BERT는 preprocessing 단계에서 masking을 수행하여, 학습 단계에서 계속 같은 masking 데이터를 보게 됩니다.
    • 그래서 데이터를 10배로 복제해 매번 다른 masking을 갖도록 보완했습니다. 이 학습은 40 epoch만큼 수행됐습니다(Static masking 방법).
    • 또다른 방법으로 매번 데이터를 학습할 때마다 masking을 다르게 했습니다(Dynamic masking 방법).
    • 실험 결과 Dynamic이 조금... 더 좋다고 불 수 있습니다.
  2. Model Input Format and Next Sentence Prediction
    • 기존 BERT에서는 50%의 확률로 같은 문서에 속하지 않은 2 개의 입력이 들어왔고, 그것을 판별하는 Next Sentence Prediction loss가 있었습니다.
    • 하지만 이 loss의 효과에 대해 의문이 제기되었고,여러 방식으로 실험했습니다.
    • Segment-pair : 기존 BERT와 동일
    • Sentence-pair : segment가 아닌 sentence 단위. Sentence가 segment보다 짧으므로 배치 사이즈를 늘립니다.
    • Full-sentences : 항상 여러 개의 연속된 full sentence들을 입력으로 사용하여 document가 넘어가는 경우도 있습니다. 이 경우 중간에 separator token을 넣는다. 입력 데이터에서 알 수 있듯이 NSP가 없습니다.
    • Doc-sentences : Full-sentences와 거의 동일하지만 document를 넘어가는 경우가 없으며 이 때 입력이 짧아지는 만큼 배치 사이즈를 늘립니다. 역시 NSP가 없습니다.
    • Sentence-pair는 긴 상관관계를 찾지 못해 결과가 나빠진 것으로 보입니다. Full-sentence 결과를 보면 NSP가 없이 연속된 문장으로 학습하는 게 좋아 보입니다. 아마 BERT에서는 두개의 segment를 입력한 상태에서 NSP를 없앤 것 같습니다. 최종적으로 Doc-sentence의 결과가 가장 좋습니다. 하지만 배치 사이즈가 유동적이기에 앞으로 실험은 Full-sentence 방식으로 진행합니다.
  3. Training with large batches
    • 배치 사이즈가 크면 더 좋다(고 하는데, 8k가 2k보다 좋지는 않은 것 같습니다).
  4. Text encoding
    • GPT 방식인 byte 단위 subword vocabulary를 사용하여 BERT를 학습했습니다.
    • 그 결과 vocabulary 사이즈가 30k(BERT)에서 50k로 커졌으며, "unknown" 토큰 없이 인코딩이 가능해졌습니다.
    • 그만큼 파라미터는 15M개 늘어납니다(BERT-base).

RoBERTa
  • 같은 양의 데이터(3G 차이 나긴 하는데...)로 실험했을 때, 배치 사이즈가 커야 성능이 더 좋았습니다.
  • 그 외에, 더 많은 데이터로, 더 오래 학습했을 때 결과가 계속 좋아졌습니다.


끄읕...

2019년 12월 2일 월요일

논문 리뷰 - Knowledge Enhanced Contextual Word Representations

EMNLP를 다녀왔습니다.
재밌는 논문들이 많았는데, 앞으로 그 중 몇 개를 포스팅 해보려고 합니다.

첫번째 논문은 Knowledge Enhanced Contextual Word Representations 입니다.


논문 정보


  • 논문 링크 : https://arxiv.org/pdf/1909.04164.pdf
  • 저자 : Matthew E. Peters et al. from Allen AI, UC Irvine.
    • ELMo를 쓴 Matthew E. Peters가 1저자로 참여한 논문입니다.
  • 발표 학회 : EMNLP 2019


요약


  • 기존의 Pretrained model(BERT)에 Knowledge base(Wikipedia, Wordnet) 같은 외부 지식을 결합하는 방법을 제안
  • 이런 메카니즘을 활용한 Pretrained model은 외부 지식을 반영하는 word representation을 만들수 있음
  • 결합하는 방법은 주로 attention을 활용하였고, 많은 부분 - 특히 Knowledge에 관련된 - 은 이미 개발되거나 공개된 데이터, 알고리즘 등을 활용.
    뭔가 설명이 없이 툭 튀어나오면 이미 있는 걸 활용한 거라 생각하면 됩니다...


Introduction


  • ELMo, GPT, BERT 같은 모델들은 SOTA를 달성했지만, real world entity에 대한 기반(grounding)이 없고 factual knowledge를 알기 힘들다(Logan et al. 2019).
  • Knowledge bases(KBs)를 활용하면, raw text에서 적은 빈도로 등장하거나 long range dependency 문제로 학습이 힘든 정보들을 학습할 수 있다.
  • 우리는 여러 KB들의 정보를 pretrained model에 주입할 수 있는 KAR(Knowledge Attention and Recontextualization)이란 메카니즘을 제안한다.
  • 특정 task를 위한 모델에 외부 지식을 활용했던 이때까지의 다른 접근법들과는 다르게 이 방법으로 여러 task에 모두 활용될 수 있는 general representation을 얻을 수 있다.
  • BERT-base 모델에 KAR을 통해 Wikipedia와 Wordnet을 결합했을 때 BERT-large모델보다도 더 좋은 실험 결과를 얻었다.

KnowBert


Knowledge Bases


  • KB에 있는 K개의 entity들은 E차원의 임베딩 벡터 e_k로 표현되어 있다고 가정한다.
  • 또한 KB는, text에서 C 개의 entity 후보와 그들의 start, end index를 찾아주는 entity candidate selector를 갖고 있다고 가정한다. 
  • Entity candidate selector는 각 entity가 어떤 종류의 entity인지에 대한 prior 확률도 갖고 있다. (Prince가 가수인지, 자동차인지에 대한 확률)
  • Candidate의 숫자는 고정된 작은 수자(30)으로 제한하여 실행 시간이 KB의 크기와 상관없어진다.

KAR



  • 보통의 transformer 구조에서  H_i+1 = Transformer(H_i)이다. 하지만 특정 한 레이어에서는 knowledge를 활용하는 H_i+1 = KAR(H_i) 연산을 수행한다. 
  • KAR은 아래와 같은 구성요소들로 이루어져 있다.

Mention-span representation(번호 1, 2)
  • 처음으로, 적은 차원(200 또는 300) 차원으로 projection한다.
  • Entity candidate selector에서 받은 정보들(entity의 list, 각 entity들의 span)을 이용하여, 각 entity(그림 상의 Prince, Purple-Rain, Rain)에 해당하는 hidden vector들을 뽑아낸다(S에 해당).
  • 각 entity의 span 안에 있는 word piece들에 대한 hidden vector들을 self-attentive span pooling(Lee et al. 2017)을 이용하여 각 entity 당 하나의 hidden vector - mention-span representations, S - 로 뽑아낸다.


Entity linker(번호 3, 4)
  • Entity linker는 어떤 candidate를 이용할 지 구분하는 역할을 한다.
  • Se = Transformer(S) 를 통해 mention-span 간의 attention을 반영한 representation을 구한다.
  • This allows KnowBert to incorporate global information into each linking decision so that it can take advantage of entity-entity co-occurence and resolve which of several overlapping candidate mentions should be linked.
  • Se는 각 후보 entity를 평가하고 KB에서 얻은 entity prior를 통합하기 위해 활용된다(Kolitsas et al.).

  • 각 후보 span m 에 해당하는 mention-span vector se_m과, KB를 통해 얻은 entity의 embedding e_mk, prior p_mk로 어떤 entity가 현재의 context에 잘 맞는지 score를 매긴다(attention weight와 비슷한 개념).
  • 이 때, 2 층의 MLP를 이용하며 hidden units은 100이다.

  • 이 때, 정답 entity를 알고 있으면 entity의 scoring을 좀 더 정확히 하기 위한 학습이 가능하다. EL은 entity linker의 약자이다.
  • 위의 식에서 g는 정답 entity의 인덱스를 의미하며, 정답 entity의 임베딩 벡터와 prior를 이용해 얻은 score를 loss function에 활용한다.

Knowledge enhanced entity-span representations(번호 5)

  • 후보 entity들 중 score의 값이 일정 threshold 이하인 score들은 0으로 간주하여 무시한다.
  • Threshold 이상인 score들은 softmax normalization한다.

  • 이렇게 계산한 score와 embedding을 weighted sum을 한 후,
  • 기준의 Se에 더하여 KB의 entity embedding을 반영한 새로운 entity-span representation을 만들어낸다.

Recontextualization(번호 6, 7)
  • 이렇게 얻은 S'e를 이용하여 기존의 word piece representation을 recontextualize한다.
  • 그리고, 다시 BERT의 hidden vector size로 projection한다.
  • 여기서 W2는 맨 처음 차원을 줄이기 위해 쓰인 파라미터 W1의 matrix inverse이다.


Training Procedure



  • 우선 각 KB에서 entity embedding을 계산해야 한다. Entity embedding은 한 번 학습된 후에는 고정된다.
  • Entity linker를 학습시킬 수 있으면 다른 네트워크의 파라미터들은 고정시킨 채 미리 학습시켜 KB에 특화된 EL을 만든다.
  • 이후 최종적으로 Masked language model의 loss와 entity linker의 loss를 더하여 학습한다.
  • 여러 KB를 쓸 경우 각각 다른 레이어 사이에 배치한다.
  • Candidate mention span에 masking된 word piece가 하나라도 있을 경우 전체 entity들 word piece를 마스킹한다.

Experiments





  • Language Modeling 실험 결과. 위 실험에서 KnowBert는 BERT_base모델에 KAR을 적용한 모델이다.


  • Relation extraction task에서 좋은 성능을 기록했다.


Conclusion



  • KB를 효과적으로 language model에 반영할 수 있는 방법을 제안한다.
  • 실험을 통해 알고리즘의 효용성을 입증하였다.

2019년 12월 1일 일요일

맥북 포맷 에러 : no packages were eligible for install. contact the software manufacturer for assistance

회사에서 맥북을 더이상 안쓰려고... 포맷하고 반납했다.
포맷을 하는데

https://techsparx.com/computer-hardware/apple/macosx/install-osx-when-you-cant.html
위 그림처럼 이상한 에러가 났다.

내 경우, 해결책은 해당 버전 OS-El Capitan - 가 출시될 때 쯤의 날짜로 돌리는 것이었다.
대략 2015년 11월 쯤으로 했다.

방법은,
https://techsparx.com/computer-hardware/apple/macosx/install-osx-when-you-cant.html

Utilities -> Terminal을 열고
`date 1108080815` 명령어를 입력한다.
숫자는 [월][날짜][시간][분][연도] 형식을 따른다.

2019년 11월 25일 월요일

Is language modeling Self-supervised or Unsupervised?

도대체 Language model은 Unsupervised 모델인가? Self-supervised model인가? 둘 다인가?

Unsupervised


"Language modeling is usually framed as unsupervised distribution estimation"
https://arxiv.org/pdf/1810.04805.pdf

"Another notable family within unsupervised learning are autoregressive models, in which the data is split into a sequence of small pieces, each of which is predicted in turn. Such models can be used to generate data by successively guessing what will come next, feeding in a guess as input and guessing again. Language models, where each word is predicted from the words before it, are perhaps the best known example"
https://deepmind.com/blog/article/unsupervised-learning

"Unlike Peters et al. (2018a) and Radford et al. (2018), we do not use traditional left-to-right or right-to-left language models to pre-train BERT. Instead, we pre-train BERT using two unsupervised tasks, described in this section. This step is presented in the left part of Figure 1."
https://arxiv.org/pdf/1810.04805.pdf (BERT paper)



Self-supervised



"This idea has been widely used in language modeling. The default task for a language model is to predict the next word given the past sequence. BERT adds two other auxiliary tasks and both rely on self-generated labels."
https://lilianweng.github.io/lil-log/2019/11/10/self-supervised-learning.html

ALBERT: A Lite BERT for Self-supervised Learning of Language Representations
https://arxiv.org/abs/1909.11942

"A robustly optimized method for pretraining natural language processing (NLP) systems that improves on Bidirectional Encoder Representations from Transformers, or BERT, the self-supervised method released by Google in 2018. BERT is a revolutionary technique that achieved state-of-the-art results on a range of NLP tasks while relying on unannotated text drawn from the web, as opposed to a language corpus that’s been labeled specifically for a given task."
https://ai.facebook.com/blog/roberta-an-optimized-method-for-pretraining-self-supervised-nlp-systems/



Self-supervised is Unsupervised


Self supervised learning is an elegant subset of unsupervised learning where you can generate output labels ‘intrinsically’ from data objects by exposing a relation between parts of the object, or different views of the object.
https://towardsdatascience.com/self-supervised-learning-78bdd989c88b



결론은... 자기 마음대로 정의해서 쓴다.

2019년 11월 21일 목요일

TPU 사용 시 storage 관련 문제(HTTP 403, OutOfRangeError) 해결법

TPU에서 bert를 학습시키려고 했다.

VM 접속부터 여러 난관들이 있겠지만 ㅋㅋㅋ
Storage에 관련된 문제들이 두 개가 발생했다.


1. Checkpoint를 저장할 때 생기는 문제

Permission denied: Error executing an HTTP request: HTTP response code 403 with body '{
"error": {
"errors": [
{
"domain": "global",
"reason": "forbidden",
"message": "my_account_email does not have storage.objects.list access to object.~~."
}

2. OutOfRangeError (see above for traceback): End of sequence 에러


해결법
해결법은 내 tpu 서비스 계정에 storage에 대한 owner 권한을 주는 것이다.
Tpu 서비스 계정은 tpu를 누르면 맨 아래쪽에 표시된다.
형식은 service-{project 번호}@cloud-tpu.iam.gserviceaccount.com 이다.
프로젝트 번호는 Google cloud console 메인 페이지에 가면 project id 밑에 보인다.

Tpu 서비스 계정을 알았으면, 로컬 터미널에서 아래 명령을 실행하면 된다.
gsutil acl -r ch -u TPU계정:OWNER STORAGE_BUCKET_주소

* 참고 사항
READER WRITER 두개의 권한을 부여했더니 안 됐고, 꼭 OWNER 권한이 있어야 되는 것 같다.

-r 옵션은 recursive 옵션 같은데, 폴더 별로 따로 권한을 설정할 수도 있겠지만 최상위 폴더에 -r 옵션을 주어서 한 번에 전체 권한을 주는게 가장 속 편한 것 같다.
-r 옵션이 없으면 해당 폴더에만 권한이 생기고 하위 폴더에는 권한이 안 생기는 것 같다.
학습용 데이터와 학습된 모델을 다른 폴더에 저장하는 게 편할 것이기 때문에 폴더에 권한을 각각 주는 것보다 -r을 쓰는 게 좋을 듯하다.

2019년 11월 20일 수요일

Flask(web server) 상에서 matplotlib.pyplot 사용시 프로세스가 죽을 때

Tensorflow의 수행 결과를 간단하게 보여줄 데모 페이지를 만들게 되었다.
환경을 Flask - TF serving으로 구성하고, flask 상에서 matplotlib로 그래프를 만들어 페이지에 띄우도록 했다.
그런데 일정 횟수 이상으로 결과를 뽑으면 maplotlib 상에서 쓰레드 또는 메모리 관련 문제가 생겨 flask 프로세스가 죽는 문제가 발생했다.

이에 검색을 좀 해보니 홈페이지에 사용법을 설명해 놓아 따라해보니 문제가 해결되었다.
링크 : https://matplotlib.org/faq/howto_faq.html

Matplotlib 3.1 이전 버전의 경우
import matplotlib
matplotlib.use('Agg')
코드만 추가해주면 해결되었다.


-------------------------------------------------------------------------------------------------
그 이후 버전의 경우, 홈페이지의 코드대로
from matplotlib.figure import Figure
를 이용하면 되는 듯했다.

홈페이지 코드를 보면 pyplot없이 Figure()만으로 그래프를 그릴 수 있는 것 같은데 정확히는 모르겠다.
코드에 show()가 없는 것으로 봐서는 클라이언트에 전송하기 위한 용도로만 코드를 짠 것 같다.
Figure를 사용한 예제는 거의 pyplot.figure()던데...