Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chapter 2 BERT 이해하기 #3

Open
emphasis10 opened this issue Jan 12, 2022 · 20 comments
Open

Chapter 2 BERT 이해하기 #3

emphasis10 opened this issue Jan 12, 2022 · 20 comments
Assignees
Labels
weekly Weekly Q&A

Comments

@emphasis10
Copy link
Member

No description provided.

@shyram
Copy link
Member

shyram commented Jan 17, 2022

BERT에서 transformer와 달리 위치 임베딩을 사용하는 이유는 무엇인가요?

@mori8
Copy link
Member

mori8 commented Jan 18, 2022

transformer에서도 위치 임베딩을 사용하지 않나요?!

@shyram
Copy link
Member

shyram commented Jan 18, 2022

transformer에서도 위치 임베딩을 사용하지 않나요?!

Transformer에서는 sin, cos 함수를 사용해서 positional encoding을 벡터에 추가해 주는 연산을 합니다. 벡터의 위치에 따라서 discrete하게 정해져 있는 값을 사용하는 것 같습니다.

그런데 BERT에서는 positional encoding을 추가해 주지 않고 embedding을 따로 사용하는 것 같습니다. 왜 임베딩을 추가적으로 해주는 것 일까요??

@shyram
Copy link
Member

shyram commented Jan 18, 2022

Link의 설명에 따르면 position embedding을 range(0, max_len)으로 처리해 주는 것 같은데, 이렇게 하는게 삼각함수로 위치를 표현하는 것 보다 성능이 좋은 걸까요?

@shyram
Copy link
Member

shyram commented Jan 18, 2022

관련 논문이 있네요. 링크 첨부합니다~ Paper

@mori8
Copy link
Member

mori8 commented Jan 18, 2022

아하 트랜스포머에서는 위치 임베딩이 아니라 위치 인코딩을 사용했었군여 🥲
논문 공유 감사합니다!

@mori8
Copy link
Member

mori8 commented Jan 18, 2022

질문 있습니다!
BERT의 입력으로 문장이 한 개 혹은 두 개 들어올 수 있다고 하는데 두 문장 이상 입력할 수 없는 이유가 뭔가요? 왜 한 개 혹은 두 개의 문장을 넣어야 하는지..

@hee-suh
Copy link
Member

hee-suh commented Jan 18, 2022

질문 있습니다! BERT의 입력으로 문장이 한 개 혹은 두 개 들어올 수 있다고 하는데 두 문장 이상 입력할 수 없는 이유가 뭔가요? 왜 한 개 혹은 두 개의 문장을 넣어야 하는지..

사전 학습 시에 문장 사이에 [SEP]가 하나 들어있는 경우까지만 학습을 했기 때문에 두 문장을 초과하면 안되는 것 같습니다.
"BERT was not pretrained to handle multiple SEP tokens between sentences and does not have a third token_type"

@mori8
Copy link
Member

mori8 commented Jan 18, 2022

오 감사합니다!! 역시개발천재 🤭

@hee-suh
Copy link
Member

hee-suh commented Jan 18, 2022

저도 책 2.5 하위 단어 토큰화 알고리즘 내용 중 질문 있습니다. 오타인지, 제가 내용 이해를 잘못했는지 헷갈리는 부분입니다.

  1. 책 95쪽
    • 'I enjoyed the game'을 토큰화하면 [I, enjoyed, the, game]을 얻고 어휘 사전에 (I, enjoyed, the, game)이 있는지 확인하는 것이 맞죠?
    • 이때 vocabulary에 enjoyed가 없어서 enjoyed를 토큰으로 대체하는데, 그 위 예시인 'I play the game'을 보면 vocabulary에 play가 없고 played만 있는데 토큰으로 대체가 되지 않고 played가 최종 토큰에 들어갑니다. vocabulary에 있는 단어인 played에 play가 포함 관계여서 들어가는 건지, 아니면 'I play the game'이 'I played the game'의 오타인 건지 의문입니다.
  2. 책 101쪽
    • bear를 하위 단어로 [be, ar]로 나눴을 때 하위 단어 be가 어휘 사전에 있다고 하는데, 없는 것이 맞고 하위 단어 be와 ar을 모두 분할하여 최종 토큰이 [b, e, a, r]이 되는 것이 맞을까요?

@shyram
Copy link
Member

shyram commented Jan 18, 2022

'I enjoyed the game'을 토큰화하면 [I, enjoyed, the, game]을 얻고 어휘 사전에 (I, enjoyed, the, game)이 있는지 확인하는 것이 맞죠?

네 맞습니다.

이때 vocabulary에 enjoyed가 없어서 enjoyed를 토큰으로 대체하는데, 그 위 예시인 'I play the game'을 보면 vocabulary에 play가 없고 played만 있는데 토큰으로 대체가 되지 않고 played가 최종 토큰에 들어갑니다. vocabulary에 있는 단어인 played에 play가 포함 관계여서 들어가는 건지, 아니면 'I play the game'이 'I played the game'의 오타인 건지 의문입니다.

오타 맞는 것 같아요... "I played the game" 인듯... 95페이지 첫문단과 두번째 문단의 설명이 뭔가 서로 섞인 느낌입니다ㅠㅠ

bear를 하위 단어로 [be, ar]로 나눴을 때 하위 단어 be가 어휘 사전에 있다고 하는데, 없는 것이 맞고 하위 단어 be와 ar을 모두 분할하여 최종 토큰이 [b, e, a, r]이 되는 것이 맞을까요?

[b, e, a, <UMK>] 가 맞는 것 같습니다. vocabulary는 {a, b, c, e, l, m, n, o, s, t, u, st, me, men}으로 생성되고, 그 속에 {a, b, e}라는 단어가 있지만, {r}은 없기 때문에 토큰으로 대체됩니다.

@hee-suh
Copy link
Member

hee-suh commented Jan 18, 2022

답변 감사합니다! 74쪽에서도 H=512를 H=521로 써놓더니... 오탈자가 꽤 많네요^^.. 주의해서 읽어야겠어요

@emphasis10
Copy link
Member Author

[오탈자]
p.104 하위 단어 em을 분할하고 하위 단어는 [be, ##e, ##m]으로 구성된다.
-> [st, ##e, ##m]으로 구성된다.

@emphasis10
Copy link
Member Author

책이 외국 책이어서 K-패치를 살짝 할 수 있는 논문 하나를 간단하게 스터디 시간에 소개해드리겠습니다.
An Empirical Study of Tokenization Strategies for Various Korean NLP Tasks이라는 논문인데 흔히 Morpheme-aware BPE라고 부르고 관련 정보는 아래와 같습니다.

@emphasis10
Copy link
Member Author

질문 있습니다! BERT의 입력으로 문장이 한 개 혹은 두 개 들어올 수 있다고 하는데 두 문장 이상 입력할 수 없는 이유가 뭔가요? 왜 한 개 혹은 두 개의 문장을 넣어야 하는지..

사전 학습 시에 문장 사이에 [SEP]가 하나 들어있는 경우까지만 학습을 했기 때문에 두 문장을 초과하면 안되는 것 같습니다. "BERT was not pretrained to handle multiple SEP tokens between sentences and does not have a third token_type"

희님이 잘 찾으신 것 같습니다. 여기에 덧붙여서 조금 혼동이 있을 수 있는 내용에 대해 추가적으로 말씀드리자면 BERT 논문에는 이렇게 나와있습니다.

Throughout this work, a “sentence” can be an arbitrary span of contiguous text, rather than an actual linguistic sentence.

일반적으로 우리가 생각하는 언어학적인 문장의 의미와는 조금 다르다...가 포인트가 될 거 같습니다. 따라서 BERT에서의 sentence는 우리가 일반적으로 생각하는 paragraph도 들어갈 수 있다고 볼 수 있을 거 같네요! BERT에서 두 개의 문장(우리가 생각하는 그 문장 말고 BERT의 그 문장)을 Pretrain 한 목적은 다음과 같습니다.

To make BERT handle a variety of down-stream tasks, our input representation is able to unambiguously represent both a single sentence and a pair of sentences (e.g., h Question, Answeri) in one token sequence.

마지막으로 주의할 점은, 우리가 원래 생각하던 sentence를 넣든, paragraph를 넣든 좋지만 학습 시 사용한 최대 길이(max_len)을 넘길 수는 없다는 것입니다 ㅎㅎ

@hee-suh
Copy link
Member

hee-suh commented Jan 19, 2022

[CLS] 토큰은 어떻게 생성되길래 전체 문장의 집계 표현을 보유하는 걸까요...

@mori8
Copy link
Member

mori8 commented Jan 19, 2022

[CLS] 토큰은 어떻게 생성되길래 전체 문장의 집계 표현을 보유하는 걸까요...

https://stackoverflow.com/questions/62705268/why-bert-transformer-uses-cls-token-for-classification-instead-of-average-over
단순하게 [CLS] 토큰과 문장 내 다른 단어들 사이의 self-attention 계산으로 집계 표현이 생성되는 것 같습니다.
저 글 읽으면서 새로 알게 된건데, [CLS]의 표현 벡터 대신 문장 내 모든 단어들의 토큰의 표현 벡터의 평균치를 classification에 사용해도 된다고 하네요

@hee-suh
Copy link
Member

hee-suh commented Jan 19, 2022

링크 감사합니다! 링크 안에 Image source도 아주 좋네요ㅎㅎ 역시 NLP 전문가...

그런데... 링크 그림 중 last_hidden_states[0][:, 0, :] 에서 :, 0, :을 각각 all sentences, only the first position [CLS], all hidden unit outputs 이라고 설명해놓은 것을 보고 이해가 갈 뻔 했으나... 여전히 의문점 하나가 있습니다.

책 3장(책 117쪽)에도 [CLS]의 표현 벡터가 어디서부터 나오는지에 대한 설명이 있는 부분이 있습니다.
'I love Paris'를 입력 문장으로 넣었을 때, hidden_rep[0][0]은 첫 번째 토큰인 [CLS]의 표현 벡터를 제공하고, hidden_rep[0][1]은 두 번째 토큰인 I의 표현 벡터를 제공, hidden_rep[0][2]은 세 번째 토큰인 love의 표현 벡터를 제공한다고 되어있습니다.
책의 hidden_rep[0][0]이 링크 그림의 last_hidden_state[0][:, 0, :]에 해당하는 것 같은데, 그렇다면 책의 hidden_rep[0][1]last_hidden_state[0][:, 1, :] 인 듯 하고...
그렇다면 I, love, Paris 토큰의 표현 벡터를 얻는 방법과 [CLS]의 표현 벡터를 얻는 방법에 차이가 없어 보여서 왜 I, love, Paris 토큰은 각자의 표현 벡터를 갖는데 [CLS]는 문장 전체의 표현을 보유할 수 있게 되는 건지 잘 모르겠습니다.

글 쓰면서 깨달은 건데,
I, love, Paris는 self-attention 연산 시 자기 자신과 전체 문장에 있는 단어와 연결하면서 자기 자신의 표현 벡터를 얻는 것이고,
[CLS]는 전체 문장에서 자신에 대응하는 단어가 없기 때문에 전체 문장의 표현만을 얻게 되는 것이 맞을까요?

글이 매우매우 길어졌네요... 여기까지 읽으셨다면 매우매우 감사 🥺

@emphasis10
Copy link
Member Author

링크 감사합니다! 링크 안에 Image source도 아주 좋네요ㅎㅎ 역시 NLP 전문가...

그런데... 링크 그림 중 last_hidden_states[0][:, 0, :] 에서 :, 0, :을 각각 all sentences, only the first position [CLS], all hidden unit outputs 이라고 설명해놓은 것을 보고 이해가 갈 뻔 했으나... 여전히 의문점 하나가 있습니다.

책 3장(책 117쪽)에도 [CLS]의 표현 벡터가 어디서부터 나오는지에 대한 설명이 있는 부분이 있습니다. 'I love Paris'를 입력 문장으로 넣었을 때, hidden_rep[0][0]은 첫 번째 토큰인 [CLS]의 표현 벡터를 제공하고, hidden_rep[0][1]은 두 번째 토큰인 I의 표현 벡터를 제공, hidden_rep[0][2]은 세 번째 토큰인 love의 표현 벡터를 제공한다고 되어있습니다. 책의 hidden_rep[0][0]이 링크 그림의 last_hidden_state[0][:, 0, :]에 해당하는 것 같은데, 그렇다면 책의 hidden_rep[0][1]last_hidden_state[0][:, 1, :] 인 듯 하고... 그렇다면 I, love, Paris 토큰의 표현 벡터를 얻는 방법과 [CLS]의 표현 벡터를 얻는 방법에 차이가 없어 보여서 왜 I, love, Paris 토큰은 각자의 표현 벡터를 갖는데 [CLS]는 문장 전체의 표현을 보유할 수 있게 되는 건지 잘 모르겠습니다.

글 쓰면서 깨달은 건데, I, love, Paris는 self-attention 연산 시 자기 자신과 전체 문장에 있는 단어와 연결하면서 자기 자신의 표현 벡터를 얻는 것이고, [CLS]는 전체 문장에서 자신에 대응하는 단어가 없기 때문에 전체 문장의 표현만을 얻게 되는 것이 맞을까요?

글이 매우매우 길어졌네요... 여기까지 읽으셨다면 매우매우 감사 🥺

말씀하신대로 [CLS] token의 embedding을 얻는 방법 자체는 다른 token들과 다르지 않습니다. 다른 token들과 [CLS] token의 학습 과정의 차이를 생각해보면 다른 token들은 우리가 실제로 사용하는 언어 속에서 사용되는 token들이고, 일정한 패턴(우리가 생각하는 문법+외의 +++)이 있습니다. 이에 반해서 [CLS] token은 이러한 언어적인 문법을 고려하지 않고 문장의 맨 앞에 넣는 token이기 때문에 모델이 학습되면서 다른 token들처럼 특정 어떤 뜻을 가지도록 embedding이 학습되는 것이 아니라, 문장 내에서 별 뜻 없는데 그냥 맨 앞에 오는 애로 학습되는 것을 기대할 수 있습니다. 그렇다면 Self-attention layer를 거치면 문장 내에서 다른 token들을 고루고루 적절히 반영한 weighted sum이 [CLS] token의 representation으로 나올 수 있다고 기대할 수 있습니다. 하지만, 기대하는 것이기 때문에 학습을 거치고 실제로 사용하는 부분에 있어서 문장의 전체 token vector를 Average Pooling하는 것이 더 성능이 좋을 수도 있는 것이라고 생각합니다.

저는 이렇게 이해했는데(틀리면 어떡하지), 사실 평소에 의문을 갖지 않았던 부분이라 질문에 대한 답을 생각해보면서 도움이 많이 됐습니다 ㅎㅎ 스터디 시간에 조금 더 얘기해 보면 좋을 거 같네요!

@emphasis10
Copy link
Member Author

질문 많이 해주시고 서로 답변 많이 해주셔서 감사합니다. 남은 내용은 #7 에서 다루고 weekly issue는 닫겠습니다. 한 주 동안 고생 많으셨고 다음 주도 화이팅입니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
weekly Weekly Q&A
Projects
None yet
Development

No branches or pull requests

4 participants