일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 개인회고
- 그리디
- ODQA
- 알고리즘스터디
- dp
- 최단경로
- 프로그래머스
- python3
- 주간회고
- U_stage
- 다이나믹프로그래밍
- 파이썬 3
- 부스트캠프_AITech3기
- 기술면접
- 정렬
- 다시보기
- 부스트캠프_AITech_3기
- 이코테
- Level1
- 백준
- dfs
- 알고리즘_스터디
- mrc
- 백트랙킹
- 구현
- 그래프이론
- 이진탐색
- Level2_PStage
- Level2
- 단계별문제풀이
- Today
- Total
국문과 유목민
[일일리포트] Day 36 본문
해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.
▶ Today I Learned (핵심 요약 정리)
LSTM Temperature
RNN Based Language Model 기본과제를 진행하다가 문장 생성하는 코드에서 Temperature 하이퍼파라미터 값에 대해서 어떤 의미가 있는 지에 대해서 물어보셨다. 해당 파라미터의 의미를 자세히 몰랐기에 검색을 해서 알게 된 내용을 정리하고, 멘토님의 해답에 대한 내용도 같이 정리해서 올리고자 한다.
Temperature는 문장 생성 시 다양성을 조정하는데 사용되는 하이퍼파라미터이다. Temperature가 1보다 높아지게 되면 최종확률 값이 점차 평탄해지고, 무한대로가면 최종적으로는 균일 분포가 된다. 이를 다시 말하면 뽑일 확률이 낮았던 토큰이 더 잘 뽑히게 된다는 뜻으로, 다양한 문장을 생성할 수 있게 된다는 의미이다. 하지만 이렇게 생성된 문장의 경우 문법적으로 불안정하기 때문에 문맥이 맞지 않는 문장이 생성될 가능성이 높다.
반대로 Temperature가 1보다 낮으면 뽑힐 확률이 높은 토큰이 더 잘 뽑히게 된다. 따라서 이로 인해 Temperature를 올렸을 때와 반대로 다양한 문장이 생성되지 않게 되지만, 문맥에 맞는 안정된 문장이 생성될 확률이 높다.
이에 대해서 참고했던 사이트에서는 Temperature를 높혔을 때는 'more diversity and also more mistakes'하고, 낮췄을 때는 'more confident and also more conservative' 라고 설명하고 있다.
추가적으로 멘토님의 답변 중 인상깊었던 게 있는데, 질문으로 왜 Temeperature라는 이름을 붙였냐는 질문에 대해 Entropy개념으로 설명을 해주셨다. 온도가 올라가게 되면 Entropy의 운동량이 증가하므로 diversity가 증가하고, 낮아지면 운동량이 감소하므로 diversity가 감소하는 느낌으로 Temperatur라는 이름이 붙었다고 하셨다. 이를 듣고 확실하게 Temperature의 의미에 대해 이해할 수 있었다.
마지막으로 수학적인 정의에 대해 정리하도록 하겠다. NN은 softmax함수를 수행해 $z_i$를 다른 로짓과 비교해서 확률 벡터 $q(=q_1, ..., q_n)$를 생성하는 logit vector $z(=z_1, ..., z_n)$로 클래스 확률을 생성한다. 이때 T는 보통 1로 정의되는데, 이를 변경해서 문장 생성에 대한 diversity를 조절할 수 있다.
$$q_i = \frac{exp(z_i/T)}{\sum_{j}exp(z_j/T)}$$
참고사이트: What is Temperature in LSTM (and neural networks generally)?
함수 정리
과제를 진행하면서 사용법을 새로 알게된 함수에 대해서 간단하게 정리해두면 좋을 것 같아서 기록해둡니다.
get()
dictinory형태의 자료형을 다룰 때, get()함수를 이용해서 Key를 통해 Value를 가져올 수 있다. 하지만 특정 Key의 리스트를 가지고 dictionary에서 값을 가져오고자 할 때, Key 리스트에서 dictionary에 없는 값을 부르고자 하면 오류가 생길 수 있다. 이때, get()에 default값을 세팅해두면 dictionary에 없는 키를 넣었을 때, default값을 value로 내보낸다.
해당 함수의 경우 잘 사용한다면 dict 정의할 때도 사용할 수 있을 것 같다고 생각한다. (Pythonic한 코드짜기 쉽지 않다 쉽지 않아...)
# 다음 dict의 경우 "단어: id"로 정리된 dict에서 단어에 해당하는 id를 가져오는 코드이다.
# 여기서 dict의 없는 단어가 나올 경우 default값을 할당한다.
token_ids = [my_dict.get(token, default값) for token in sentence]
numel()
numel의 경우 Returns the total number of elements in the input tensor 라고 공식 Document에서 설명하고 있다. 말처럼 Tensor의 총 파라미터 개수를 알 수 있는 함수이다.
내 경우 이 함수를 잘 몰라서 len을 사용했었다. 이전에도 봤었던 함수인데 제대로 기억해놓지 않아서 실제로 필요할 때 사용하지는 못했었던 것 같아서 정리하고자 한다.
a = torch.randn(1, 2, 3, 4, 5)
torch.numel(a)
# 120
a = torch.zeros(4,4)
torch.numel(a)
# 16
▶ Review (생각)
강의에 대한 내용은 어제까지 다 정리를 해서 오늘은 과제를 하면서 정리하면 좋을 부분에 대해서 간단하게 몇 가지 정리를 했다. 사실 올릴 수 있다면 과제를 다 올리는게 가장 좋을 정도로 굉장히 좋은 과제였다. 하지만 정책상 올릴 수 없기에 간단하게 정리했다. 강의와 과제를 하면 할수록 부스트캠프에서 참 좋은 자료가 많다는 것을 느끼는 것 같다. 이번 주의 마지막 날이기에 구체적인 회고는 주간 회고에서 다루도록 하겠다.
'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글
[일일리포트] Day 37 (Transformer1) (0) | 2022.03.14 |
---|---|
[8주차] 개인 회고 (0) | 2022.03.11 |
[일일리포트] Day 35 (Seq2Seq, BEAM) (0) | 2022.03.10 |
[일일리포트] Day 34 (RNN, LSTM) (0) | 2022.03.08 |
[일일리포트] Day 33 (NLP Basic) (0) | 2022.03.07 |