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

🌐 [i18n-KO] docs: ko: Chap3 Transformer architectures for audio #94

Merged
merged 9 commits into from
Jul 24, 2023
16 changes: 16 additions & 0 deletions chapters/ko/_toctree.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,19 @@
sections:
- local: events/introduction
title: 라이브 μ„Έμ…˜κ³Ό μ›Œν¬μƒ΅

gabrielwithappy marked this conversation as resolved.
Show resolved Hide resolved
- title: 3단원. μ˜€λ””μ˜€μš© 트랜슀포머 μ•„ν‚€ν…μ²˜
sections:
- local: chapter3/introduction
title: 트랜슀퍼λͺ¨λΈ λŒμ•„λ³΄κΈ°
- local: chapter3/ctc
title: CTC μ•„ν‚€ν…μ²˜
- local: chapter3/seq2seq
title: Seq2Seq μ•„ν‚€ν…μ²˜
- local: chapter3/classification
title: μ˜€λ””μ˜€ λΆ„λ₯˜ μ•„ν‚€ν…μ²˜
- local: chapter3/quiz
title: ν€΄μ¦ˆ
quiz: 3
- local: chapter3/supplemental_reading
title: 보좩자료 및 λ¦¬μ†ŒμŠ€
35 changes: 35 additions & 0 deletions chapters/ko/chapter3/classification.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# μ˜€λ””μ˜€ λΆ„λ₯˜ μ•„ν‚€ν…μ²˜[[audio-classification-architectures]]

μ˜€λ””μ˜€ λΆ„λ₯˜μ˜ λͺ©ν‘œλŠ” μ˜€λ””μ˜€ μž…λ ₯에 λŒ€ν•œ 클래슀 λ ˆμ΄λΈ”μ„ μ˜ˆμΈ‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λͺ¨λΈμ€ 전체 μž…λ ₯ μ‹œν€€μŠ€λ₯Ό ν¬κ΄„ν•˜λŠ” 단일 클래슀 λ ˆμ΄λΈ”μ„ μ˜ˆμΈ‘ν•˜κ±°λ‚˜ λͺ¨λ“  μ˜€λ””μ˜€ ν”„λ ˆμž„(일반적으둜 μž…λ ₯ μ˜€λ””μ˜€μ˜ 20λ°€λ¦¬μ΄ˆλ§ˆλ‹€)에 λŒ€ν•œ λ ˆμ΄λΈ”μ„ μ˜ˆμΈ‘ν•  수 있으며, 이 경우 λͺ¨λΈμ˜ 좜λ ₯은 클래슀 λ ˆμ΄λΈ” ν™•λ₯ μ˜ μ‹œν€€μŠ€μž…λ‹ˆλ‹€. μ „μžμ˜ μ˜ˆλ‘œλŠ” μ–΄λ–€ μƒˆκ°€ νŠΉμ • μ†Œλ¦¬λ₯Ό λ‚΄λŠ”μ§€ κ°μ§€ν•˜λŠ” 것을 λ“€ 수 있고, ν›„μžμ˜ μ˜ˆλ‘œλŠ” νŠΉμ • μˆœκ°„μ— μ–΄λ–€ ν™”μžκ°€ λ§ν•˜λŠ”μ§€ μ˜ˆμΈ‘ν•˜λŠ” ν™”μž ꡬ뢄(speaker diarization)을 λ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

## μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ„ μ‚¬μš©ν•œ λΆ„λ₯˜[[classification-using-spectrograms]]

μ˜€λ””μ˜€ λΆ„λ₯˜λ₯Ό μˆ˜ν–‰ν•˜λŠ” κ°€μž₯ μ‰¬μš΄ 방법 쀑 ν•˜λ‚˜λŠ” 이미지 λΆ„λ₯˜ 문제인 κ²ƒμ²˜λŸΌ κ°€μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€!

μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ€ `(주파수, μ‹œν€€μŠ€ 길이)` λͺ¨μ–‘μ˜ 2차원 ν…μ„œλΌλŠ” 것을 κΈ°μ–΅ν•˜μ„Έμš”. [μ˜€λ””μ˜€ 데이터 챕터](../chapter1/audio_data)μ—μ„œ μ΄λŸ¬ν•œ μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ„ μ΄λ―Έμ§€λ‘œ κ·Έλ €λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ—¬λŸ¬λΆ„ μ•„μ‹œλ‚˜μš”? 말 κ·ΈλŒ€λ‘œ μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ„ μ΄λ―Έμ§€λ‘œ μ·¨κΈ‰ν•˜κ³  ResNetκ³Ό 같은 일반 CNN λΆ„λ₯˜κΈ° λͺ¨λΈμ— μ „λ‹¬ν•˜λ©΄ 맀우 쒋은 예츑 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. 더 쒋은 방법은 ViT와 같은 이미지 트랜슀포머 λͺ¨λΈμ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이것이 λ°”λ‘œ **μ˜€λ””μ˜€ μŠ€νŽ™νŠΈλ‘œκ·Έλž¨ 트랜슀포머**κ°€ ν•˜λŠ” μΌμž…λ‹ˆλ‹€. 이 λͺ¨λΈμ€ ViT λ˜λŠ” λΉ„μ „ 트랜슀포머 λͺ¨λΈμ„ μ‚¬μš©ν•˜λ©°, 일반 이미지 λŒ€μ‹  μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ„ μž…λ ₯으둜 μ „λ‹¬ν•©λ‹ˆλ‹€. 트랜슀포머의 μ…€ν”„ μ–΄ν…μ…˜ λ ˆμ΄μ–΄ 덕뢄에 이 λͺ¨λΈμ€ CNN보닀 κΈ€λ‘œλ²Œ μ»¨ν…μŠ€νŠΈλ₯Ό 더 잘 포착할 수 μžˆμŠ΅λ‹ˆλ‹€.

ViT와 λ§ˆμ°¬κ°€μ§€λ‘œ AST λͺ¨λΈμ€ μ˜€λ””μ˜€ μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ„ 16Γ—16ν”½μ…€μ˜ λΆ€λΆ„μ μœΌλ‘œ κ²ΉμΉ˜λŠ” 이미지 패치 μ‹œν€€μŠ€λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ 이 패치 μ‹œν€€μŠ€λŠ” 일련의 μž„λ² λ”©μœΌλ‘œ 투영되고, 이 μž„λ² λ”©μ€ ν‰μ†Œμ™€ 같이 트랜슀포머 인코더에 μž…λ ₯으둜 μ œκ³΅λ©λ‹ˆλ‹€. ASTλŠ” 인코더 μ „μš© 트랜슀포머 λͺ¨λΈμ΄λ―€λ‘œ 좜λ ₯은 16Γ—16 μž…λ ₯ νŒ¨μΉ˜λ§ˆλ‹€ ν•˜λ‚˜μ”© μˆ¨κ²¨μ§„ μƒνƒœ μ‹œν€€μŠ€μž…λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” 은닉 μƒνƒœλ₯Ό λΆ„λ₯˜ ν™•λ₯ μ— λ§€ν•‘ν•˜κΈ° μœ„ν•΄ μ‹œκ·Έλͺ¨μ΄λ“œ ν™œμ„±ν™”κ°€ ν¬ν•¨λœ κ°„λ‹¨ν•œ λΆ„λ₯˜ 계측이 μžˆμŠ΅λ‹ˆλ‹€.
gabrielwithappy marked this conversation as resolved.
Show resolved Hide resolved

<div class="flex justify-center">
<img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/ast.png" alt="μ˜€λ””μ˜€ μŠ€νŽ™νŠΈλ‘œκ·Έλž¨ νŠΈλžœμŠ€ν¬λ¨ΈλŠ” μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ—μ„œ κ°€μ Έμ˜¨ 일련의 νŒ¨μΉ˜μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€.">
</div>

λ…Όλ¬Έ [AST: μ˜€λ””μ˜€ μŠ€νŽ™νŠΈλ‘œκ·Έλž¨ 트랜슀포머](https://arxiv.org/pdf/2104.01778.pdf)μ—μ„œ κ°€μ Έμ˜¨ 이미지

<Tip>
πŸ’‘ μ—¬κΈ°μ„œλŠ” μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ΄ 이미지와 λ™μΌν•˜λ‹€κ³  κ°€μ •ν•˜μ§€λ§Œ, μ€‘μš”ν•œ 차이점이 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ΄λ―Έμ§€μ˜ λ‚΄μš©μ„ μœ„μ•„λž˜λ‘œ 이동해도 일반적으둜 이미지에 ν¬ν•¨λœ λ‚΄μš©μ˜ μ˜λ―ΈλŠ” λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ„ μœ„μ•„λž˜λ‘œ μ΄λ™ν•˜λ©΄ μ†Œλ¦¬μ— ν¬ν•¨λœ μ£ΌνŒŒμˆ˜κ°€ λ³€κ²½λ˜μ–΄ μ†Œλ¦¬μ˜ 성격이 μ™„μ „νžˆ λ‹¬λΌμ§‘λ‹ˆλ‹€. μ΄λ―Έμ§€λŠ” λ³€ν™˜ μ‹œμ—λ„ λ³€ν•˜μ§€ μ•Šμ§€λ§Œ μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ€ 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ„ μ΄λ―Έμ§€λ‘œ μ·¨κΈ‰ν•˜λŠ” 것은 μ‹€μ œλ‘œλŠ” 맀우 잘 μž‘λ™ν•  수 μžˆμ§€λ§Œ μ‹€μ œλ‘œλŠ” 같은 것이 μ•„λ‹ˆλΌλŠ” 점을 λͺ…μ‹¬ν•˜μ„Έμš”.
</Tip>

## λͺ¨λ“  νŠΈλžœμŠ€ν¬λ¨ΈλŠ” λΆ„λ₯˜κΈ°κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.[[any-transformer-can-be-a-classifier]]

[이전 μ„Ήμ…˜](ctc)μ—μ„œ CTCκ°€ 인코더 μ „μš© 트랜슀포머λ₯Ό μ‚¬μš©ν•˜μ—¬ μžλ™ μŒμ„± 인식을 μˆ˜ν–‰ν•˜λŠ” 데 효율적인 κΈ°μˆ μ΄λΌλŠ” 것을 μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ CTC λͺ¨λΈμ€ 이미 토큰화 μ–΄νœ˜μ—μ„œ 클래슀 λ ˆμ΄λΈ”μ— λŒ€ν•œ ν™•λ₯ μ„ μ˜ˆμΈ‘ν•˜λŠ” λΆ„λ₯˜κΈ°μž…λ‹ˆλ‹€. 라벨을 λ³€κ²½ν•˜κ³  νŠΉμˆ˜ν•œ CTC 손싀 λŒ€μ‹  일반 ꡐ차 μ—”νŠΈλ‘œν”Ό 손싀 ν•¨μˆ˜λ‘œ ν›ˆλ ¨ν•˜λ©΄ CTC λͺ¨λΈμ„ λ²”μš© μ˜€λ””μ˜€ λΆ„λ₯˜κΈ°λ‘œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
gabrielwithappy marked this conversation as resolved.
Show resolved Hide resolved

예λ₯Ό λ“€μ–΄, HF νŠΈλžœμŠ€ν¬λ¨Έμ—λŠ” `Wav2Vec2ForCTC` λͺ¨λΈλΏλ§Œ μ•„λ‹ˆλΌ `Wav2Vec2ForSequenceClassification` 및 `Wav2Vec2ForAudioFrameClassification` λͺ¨λΈλ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λͺ¨λΈμ˜ μ•„ν‚€ν…μ²˜ κ°„μ˜ μœ μΌν•œ 차이점은 λΆ„λ₯˜ κ³„μΈ΅μ˜ 크기와 μ‚¬μš©λ˜λŠ” 손싀 ν•¨μˆ˜μž…λ‹ˆλ‹€.

μ‹€μ œλ‘œ λͺ¨λ“  인코더 μ „μš© μ˜€λ””μ˜€ 트랜슀포머 λͺ¨λΈμ€ 은닉 μƒνƒœ μ‹œν€€μŠ€ μœ„μ— λΆ„λ₯˜ λ ˆμ΄μ–΄λ₯Ό μΆ”κ°€ν•˜μ—¬ μ˜€λ””μ˜€ λΆ„λ₯˜κΈ°λ‘œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (λΆ„λ₯˜κΈ°μ—λŠ” 일반적으둜 트랜슀포머 디코더가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)

전체 μ‹œν€€μŠ€μ— λŒ€ν•œ 단일 λΆ„λ₯˜ 점수λ₯Ό μ˜ˆμΈ‘ν•˜κΈ° μœ„ν•΄ λͺ¨λΈ(Wav2Vec2ForSequenceClassification)μ—μ„œλŠ” μˆ¨κ²¨μ§„ μƒνƒœμ˜ 평균을 κ΅¬ν•˜μ—¬ λΆ„λ₯˜ λ ˆμ΄μ–΄μ— μž…λ ₯ν•©λ‹ˆλ‹€. 좜λ ₯은 단일 ν™•λ₯  λΆ„ν¬μž…λ‹ˆλ‹€.

각 μ˜€λ””μ˜€ ν”„λ ˆμž„μ— λŒ€ν•΄ λ³„λ„μ˜ λΆ„λ₯˜λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄, λΆ„λ₯˜κΈ°(Wav2Vec2ForAudioFrameClassification)λŠ” μˆ¨κ²¨μ§„ μƒνƒœμ˜ μ‹œν€€μŠ€μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ λΆ„λ₯˜κΈ°μ˜ 좜λ ₯도 μ‹œν€€μŠ€μž…λ‹ˆλ‹€.
gabrielwithappy marked this conversation as resolved.
Show resolved Hide resolved
111 changes: 111 additions & 0 deletions chapters/ko/chapter3/ctc.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# CTC μ•„ν‚€ν…μ²˜ [[ctc-architectures]]

μ—°κ²°μ£Όμ˜ μ‹œκ°„ λΆ„λ₯˜(CTC, Connectionist Temporal Classification)λŠ” μžλ™ μŒμ„± 인식을 μœ„ν•œ 인코더 μ „μš© 트랜슀포머 λͺ¨λΈμ— μ‚¬μš©λ˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ λͺ¨λΈμ˜ μ˜ˆλ‘œλŠ” **Wav2Vec2**, **HuBERT** 및 **M-CTC-T**κ°€ μžˆμŠ΅λ‹ˆλ‹€.

인코더 μ „μš© νŠΈλžœμŠ€ν¬λ¨ΈλŠ” λͺ¨λΈμ˜ 인코더 λΆ€λΆ„λ§Œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— κ°€μž₯ κ°„λ‹¨ν•œ μ’…λ₯˜μ˜ νŠΈλžœμŠ€ν¬λ¨Έμž…λ‹ˆλ‹€. μΈμ½”λ”λŠ” μž…λ ₯ μ‹œν€€μŠ€(μ˜€λ””μ˜€ νŒŒν˜•)λ₯Ό 읽고 이λ₯Ό 좜λ ₯ μž„λ² λ”©μ΄λΌκ³ λ„ ν•˜λŠ” 은닉 μƒνƒœ μ‹œν€€μŠ€λ‘œ λ§€ν•‘ν•©λ‹ˆλ‹€.

CTC λͺ¨λΈμ„ μ‚¬μš©ν•˜λ©΄ 은닉 μƒνƒœ μ‹œν€€μŠ€μ— μΆ”κ°€ μ„ ν˜• 맀핑을 μ μš©ν•˜μ—¬ 클래슀 λ ˆμ΄λΈ” μ˜ˆμΈ‘μ„ μ–»μŠ΅λ‹ˆλ‹€. 클래슀 λ ˆμ΄λΈ”μ€ **μ•ŒνŒŒλ²³ 문자**(a, b, c, ...)μž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ μ–΄νœ˜κ°€ 26μžμ™€ λͺ‡ 개의 특수 ν† ν°μœΌλ‘œλ§Œ μ‘΄μž¬ν•˜λ©΄ 되기 λ•Œλ¬Έμ— μž‘μ€ λΆ„λ₯˜ ν—€λ“œλ‘œ λŒ€μƒ μ–Έμ–΄μ˜ λͺ¨λ“  단어λ₯Ό μ˜ˆμΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<div class="flex justify-center">
<img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/wav2vec2-ctc.png" alt="Transformer encoder with a CTC head on top">
</div>

μ§€κΈˆκΉŒμ§€λŠ” NLPμ—μ„œ BERT와 같은 λͺ¨λΈμ„ μ‚¬μš©ν•˜λŠ” 것과 맀우 μœ μ‚¬ν•©λ‹ˆλ‹€. 인코더 μ „μš© 트랜슀포머 λͺ¨λΈμ΄ ν…μŠ€νŠΈ 토큰을 인코더 μˆ¨κ²¨μ§„ μƒνƒœ μ‹œν€€μŠ€μ— λ§€ν•‘ν•œ λ‹€μŒ μ„ ν˜• 맀핑을 μ μš©ν•˜μ—¬ 각 μˆ¨κ²¨μ§„ μƒνƒœμ— λŒ€ν•΄ ν•˜λ‚˜μ˜ 클래슀 λ ˆμ΄λΈ” μ˜ˆμΈ‘μ„ μ–»μŠ΅λ‹ˆλ‹€.

μŒμ„±μ—μ„œλŠ” μ˜€λ””μ˜€ μž…λ ₯κ³Ό ν…μŠ€νŠΈ 좜λ ₯의 'μ •λ ¬(alignment)'을 μ•Œ 수 μ—†λ‹€λŠ” 점이 λ¬Έμ œμž…λ‹ˆλ‹€. μŒμ„±μ΄ λ§ν•˜λŠ” μˆœμ„œμ™€ ν…μŠ€νŠΈλ₯Ό 필사(transcribe)ν•˜λŠ” μˆœμ„œκ°€ κ°™λ‹€λŠ” 것은 μ•Œμ§€λ§Œ(μ†Œμœ„ λ‹¨μ‘°λ‘œμš΄ μ •λ ¬μ˜ 경우), ν•„μ‚¬ν•˜λŠ” ν…μŠ€νŠΈμ˜ λ¬Έμžκ°€ μ˜€λ””μ˜€μ™€ μ–΄λ–»κ²Œ μΌμΉ˜ν•˜λŠ”μ§€λŠ” μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. λ°”λ‘œ 이 λΆ€λΆ„μ—μ„œ CTC μ•Œκ³ λ¦¬μ¦˜μ΄ λ“±μž₯ν•©λ‹ˆλ‹€.

<Tip>
πŸ’‘ NLP λͺ¨λΈμ—μ„œ μ–΄νœ˜λŠ” 일반적으둜 κ°œλ³„ 문자뿐만 μ•„λ‹ˆλΌ λ‹¨μ–΄μ˜ 일뢀 λ˜λŠ” μ™„μ „ν•œ 단어λ₯Ό μ„€λͺ…ν•˜λŠ” 수천 개의 ν† ν°μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ CTC의 경우 μž‘μ€ μ–΄νœ˜κ°€ κ°€μž₯ 효과적이며 일반적으둜 50자 미만으둜 μœ μ§€ν•˜λ €κ³  λ…Έλ ₯ν•©λ‹ˆλ‹€. νŠΈμœ„ν„°μ—μ„œλŠ” κΈ€μžμ˜ λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λŒ€λ¬Έμž(λ˜λŠ” μ†Œλ¬Έμž)만 μ‚¬μš©ν•΄λ„ μΆ©λΆ„ν•©λ‹ˆλ‹€. μˆ«μžλŠ” 철자둜 ν‘œκΈ°ν•©λ‹ˆλ‹€(예: `"20"`은 `"twenty"`κ°€ λ©λ‹ˆλ‹€). 문자 외에도 μ΅œμ†Œν•œ 단어 ꡬ뢄 토큰(곡백)κ³Ό νŒ¨λ”© 토큰이 ν•„μš”ν•©λ‹ˆλ‹€. νŒ¨λ”© 토큰은 μžμ—°μ–΄ 처리 λͺ¨λΈκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μ—¬λŸ¬ 개의 μ˜ˆλ¬Έμ„ μΌκ΄„μ μœΌλ‘œ κ²°ν•©ν•  수 있게 ν•΄μ£Όμ§€λ§Œ, λͺ¨λΈμ΄ λ¬΄μŒμ„ μ˜ˆμΈ‘ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 토큰이기도 ν•©λ‹ˆλ‹€. μ˜μ–΄μ—μ„œλŠ” `'` 문자λ₯Ό μœ μ§€ν•˜λŠ” 것도 μœ μš©ν•©λ‹ˆλ‹€. `it`s`와 `its`λŠ” 맀우 λ‹€λ₯Έ 의미λ₯Ό κ°–κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
</Tip>

## 정렬을 μ–΄λ–»κ²Œ ν™•μΈν•˜μ§€?[[dude-wheres-my-alignment]]

μžλ™ μŒμ„± 인식(ASR)은 μ˜€λ””μ˜€λ₯Ό μž…λ ₯으둜 λ°›μ•„ ν…μŠ€νŠΈλ₯Ό 좜λ ₯으둜 μƒμ„±ν•©λ‹ˆλ‹€. ν…μŠ€νŠΈλ₯Ό μ˜ˆμΈ‘ν•˜λŠ” λ°©λ²•μ—λŠ” λͺ‡ 가지 선택지가 μžˆμŠ΅λ‹ˆλ‹€:

- κ°œλ³„ 문자둜 인식
- μŒμ†Œ(phonemes)둜 인식
- 단어 ν† ν°μœΌλ‘œ 인식

μžλ™ μŒμ„± 인식 λͺ¨λΈμ€ `(μ˜€λ””μ˜€, ν…μŠ€νŠΈ)` 쌍으둜 κ΅¬μ„±λœ 데이터 셋에 λŒ€ν•΄ ν•™μŠ΅λ˜λ©°, ν…μŠ€νŠΈλŠ” μ˜€λ””μ˜€ 파일의 μ‚¬λžŒμ΄ λ§Œλ“  ν•„μ‚¬λ³Έμž…λ‹ˆλ‹€. 일반적으둜 데이터 μ…‹μ—λŠ” μ˜€λ””μ˜€ νŒŒμΌμ—μ„œ μ–΄λ–€ λ‹¨μ–΄λ‚˜ 음절이 어디에 λ‚˜μ˜€λŠ”μ§€ μ•Œλ €μ£ΌλŠ” 타이밍 정보가 ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν›ˆλ ¨ 쀑에 타이밍 정보에 μ˜μ‘΄ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μž…λ ₯κ³Ό 좜λ ₯ μˆœμ„œλ₯Ό μ–΄λ–»κ²Œ μ •λ ¬ν•΄μ•Ό ν•˜λŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

μž…λ ₯이 1초짜리 μ˜€λ””μ˜€ 파일이라고 κ°€μ •ν•΄ λ΄…μ‹œλ‹€. **Wav2Vec2** λͺ¨λΈμ—μ„œλŠ” λ¨Όμ € CNN ν”Όμ²˜ 인코더λ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜€λ””μ˜€ μž…λ ₯을 더 짧은 μˆ¨κ²¨μ§„ μƒνƒœ μ‹œν€€μŠ€λ‘œ λ‹€μš΄μƒ˜ν”Œλ§ν•˜λŠ”λ°, μ—¬κΈ°μ—λŠ” μ˜€λ””μ˜€ 20λ°€λ¦¬μ΄ˆλ‹Ή ν•˜λ‚˜μ˜ μˆ¨κ²¨μ§„ μƒνƒœ 벑터가 μžˆμŠ΅λ‹ˆλ‹€. μ˜€λ””μ˜€ 1μ΄ˆμ— λŒ€ν•΄ 50개의 μˆ¨κ²¨μ§„ μƒνƒœ μ‹œν€€μŠ€λ₯Ό 트랜슀포머 μΈμ½”λ”λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. (μž…λ ₯ μ‹œν€€μŠ€μ—μ„œ μΆ”μΆœλœ μ˜€λ””μ˜€ μ„Έκ·Έλ¨ΌνŠΈλŠ” λΆ€λΆ„μ μœΌλ‘œ κ²ΉμΉ˜λ―€λ‘œ 20λ°€λ¦¬μ΄ˆλ§ˆλ‹€ ν•˜λ‚˜μ˜ μˆ¨κ²¨μ§„ μƒνƒœ 벑터가 좜λ ₯λ˜μ§€λ§Œ 각 μˆ¨κ²¨μ§„ μƒνƒœλŠ” μ‹€μ œλ‘œ 25λ°€λ¦¬μ΄ˆμ˜ μ˜€λ””μ˜€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.)
gabrielwithappy marked this conversation as resolved.
Show resolved Hide resolved

트랜슀포머 μΈμ½”λ”λŠ” μ΄λŸ¬ν•œ μˆ¨κ²¨μ§„ μƒνƒœ 각각에 λŒ€ν•΄ ν•˜λ‚˜μ˜ νŠΉμ§• ν‘œν˜„μ„ μ˜ˆμΈ‘ν•˜λ―€λ‘œ νŠΈλžœμŠ€ν¬λ¨Έλ‘œλΆ€ν„° 50개의 좜λ ₯ μ‹œν€€μŠ€λ₯Ό μˆ˜μ‹ ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 각 좜λ ₯의 차원은 768μž…λ‹ˆλ‹€. λ”°λΌμ„œ 이 μ˜ˆμ œμ—μ„œ 트랜슀포머 μΈμ½”λ”μ˜ 좜λ ₯ μ‹œν€€μŠ€λŠ” `(768, 50)` λͺ¨μ–‘을 κ°–μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 각 μ˜ˆμΈ‘μ€ μŒμ†Œ 지속 μ‹œκ°„λ³΄λ‹€ 짧은 25ms의 μ‹œκ°„μ„ ν¬ν•¨ν•˜λ―€λ‘œ 전체 단어가 μ•„λ‹Œ κ°œλ³„ μŒμ†Œ λ˜λŠ” 문자λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” 것이 ν•©λ¦¬μ μž…λ‹ˆλ‹€. CTCλŠ” μž‘μ€ μ–΄νœ˜μ—μ„œ κ°€μž₯ 잘 μž‘λ™ν•˜λ―€λ‘œ 문자λ₯Ό μ˜ˆμΈ‘ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

<div class="flex justify-center">
<img src="https://huggingface.co/datasets/huggingface-course/audio-course-images/resolve/main/cnn-feature-encoder.png" alt="The audio waveform gets mapped to a shorter sequence of hidden-states">
</div>

ν…μŠ€νŠΈ μ˜ˆμΈ‘μ„ μœ„ν•΄ 768차원 인코더 좜λ ₯ 각각을 μ„ ν˜• λ ˆμ΄μ–΄("CTC ν—€λ“œ")λ₯Ό μ‚¬μš©ν•˜μ—¬ 문자 λ ˆμ΄λΈ”μ— λ§€ν•‘ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ λͺ¨λΈμ€ 둜그λ₯Ό ν¬ν•¨ν•˜λŠ” `(50, 32)` ν…μ„œ(μ—¬κΈ°μ„œ 32λŠ” μ–΄νœ˜μ˜ 토큰 수)λ₯Ό μ˜ˆμΈ‘ν•©λ‹ˆλ‹€. μ‹œν€€μŠ€μ˜ 각 νŠΉμ§•μ— λŒ€ν•΄ ν•˜λ‚˜μ˜ μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•˜λ―€λ‘œ μ˜€λ””μ˜€μ˜ 각 μ΄ˆμ— λŒ€ν•΄ 총 50개의 문자λ₯Ό μ˜ˆμΈ‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ‹¨μˆœνžˆ 20msλ§ˆλ‹€ ν•œ 문자λ₯Ό μ˜ˆμΈ‘ν•œλ‹€λ©΄ 좜λ ₯ μ‹œν€€μŠ€λŠ” λ‹€μŒκ³Ό 같이 보일 수 μžˆμŠ΅λ‹ˆλ‹€:

```text
BRIIONSAWWSOMEETHINGCLOSETOPANICONHHISOPPONENT'SSFAACEWHENTHEMANNFINALLLYRREECOGGNNIIZEDHHISSERRRRORR ...
```

μžμ„Ένžˆ 보면 μ˜μ–΄μ™€ λ‹€μ†Œ λΉ„μŠ·ν•˜μ§€λ§Œ λ§Žμ€ λ¬Έμžκ°€ μ€‘λ³΅λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λͺ¨λΈμ΄ μž…λ ₯ μ‹œν€€μŠ€μ˜ μ˜€λ””μ˜€ 20λ°€λ¦¬μ΄ˆλ§ˆλ‹€ *μ–΄λ–€ 것*을 좜λ ₯ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ©°, ν•œ λ¬Έμžκ°€ 20λ°€λ¦¬μ΄ˆλ³΄λ‹€ κΈ΄ 기간에 걸쳐 λΆ„μ‚°λ˜μ–΄ 있으면 좜λ ₯에 μ—¬λŸ¬ 번 λ‚˜νƒ€λ‚˜κ²Œ λ©λ‹ˆλ‹€. 특히 ν›ˆλ ¨ μ€‘μ—λŠ” λŒ€λ³Έμ˜ 타이밍을 μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— 이λ₯Ό ν”Όν•  방법이 μ—†μŠ΅λ‹ˆλ‹€. CTCλŠ” μ΄λŸ¬ν•œ 쀑볡을 ν•„ν„°λ§ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

(μ‹€μ œλ‘œ 예츑된 μ‹œν€€μŠ€μ—λŠ” λͺ¨λΈμ΄ μ†Œλ¦¬κ°€ 무엇을 λ‚˜νƒ€λ‚΄λŠ”μ§€ 잘 λͺ¨λ₯Ό λ•Œλ‚˜ 문자 μ‚¬μ΄μ˜ 빈 곡간을 μœ„ν•œ λ§Žμ€ νŒ¨λ”© 토큰도 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λͺ…확성을 μœ„ν•΄ μ˜ˆμ œμ—μ„œ μ΄λŸ¬ν•œ νŒ¨λ”© 토큰을 μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€. μ˜€λ””μ˜€ μ„Έκ·Έλ¨ΌνŠΈκ°€ λΆ€λΆ„μ μœΌλ‘œ κ²ΉμΉ˜λŠ” 것도 좜λ ₯μ—μ„œ λ¬Έμžκ°€ μ€‘λ³΅λ˜λŠ” 또 λ‹€λ₯Έ μ΄μœ μž…λ‹ˆλ‹€.)

## CTC μ•Œκ³ λ¦¬μ¦˜[[the-ctc-algorithm]]

CTC μ•Œκ³ λ¦¬μ¦˜μ˜ 핡심은 ν”νžˆ **곡백 토큰**이라고 λΆˆλ¦¬λŠ” 특수 토큰을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 λͺ¨λΈμ΄ μ˜ˆμΈ‘ν•˜λŠ” 또 λ‹€λ₯Έ 토큰이며 μ–΄νœ˜μ˜ μΌλΆ€μž…λ‹ˆλ‹€. 이 μ˜ˆμ‹œμ—μ„œ 빈 토큰은 `_`둜 ν‘œμ‹œλ©λ‹ˆλ‹€. 이 특수 토큰은 문자 κ·Έλ£Ή κ°„μ˜ μ—„κ²©ν•œ 경계 역할을 ν•©λ‹ˆλ‹€.

CTC λͺ¨λΈμ˜ 전체 좜λ ₯은 λ‹€μŒκ³Ό 같을 수 μžˆμŠ΅λ‹ˆλ‹€:

```text
B_R_II_O_N_||_S_AWW_|||||_S_OMEE_TH_ING_||_C_L_O_S_E||TO|_P_A_N_I_C_||_ON||HHI_S||_OP_P_O_N_EN_T_'SS||_F_AA_C_E||_W_H_EN||THE||M_A_NN_||||_F_I_N_AL_LL_Y||||_RREE_C_O_GG_NN_II_Z_ED|||HHISS|||_ER_RRR_ORR||||
```

토큰 `|`λŠ” 단어 ꡬ뢄 λ¬Έμžμž…λ‹ˆλ‹€. 이 μ˜ˆμ—μ„œλŠ” 곡백 λŒ€μ‹  `|`λ₯Ό μ‚¬μš©ν•˜μ—¬ 단어 λ‚˜λˆ„κΈ° μœ„μΉ˜λ₯Ό 더 μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ„λ‘ ν–ˆμ§€λ§Œ λ™μΌν•œ μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

CTC 곡백 문자λ₯Ό μ‚¬μš©ν•˜λ©΄ 쀑볡 문자λ₯Ό 필터링할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 예츑된 μ‹œν€€μŠ€μ˜ λ§ˆμ§€λ§‰ 단어인 `_ER_RRR_ORR`을 μ‚΄νŽ΄λ΄…μ‹œλ‹€. CTC 곡백 토큰이 μ—†μœΌλ©΄ 이 λ‹¨μ–΄λŠ” λ‹€μŒκ³Ό 같이 λ³΄μž…λ‹ˆλ‹€:

```text
ERRRRORR
```

λ‹¨μˆœνžˆ μ€‘λ³΅λœ 문자λ₯Ό μ œκ±°ν•˜λ©΄ `EROR`이 λ©λ‹ˆλ‹€. μ΄λŠ” λΆ„λͺ… μ˜¬λ°”λ₯Έ μ² μžκ°€ μ•„λ‹™λ‹ˆλ‹€. ν•˜μ§€λ§Œ CTC 빈 토큰을 μ‚¬μš©ν•˜λ©΄ 각 κ·Έλ£Ήμ—μ„œ 쀑볡을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ:

```text
_ER_RRR_ORR
```

λŠ” μ•„λž˜μ™€ 같이 λ³€κ²½λ©λ‹ˆλ‹€.:

```text
_ER_R_OR
```

이제 `_` 빈 토큰을 μ œκ±°ν•˜μ—¬ μ΅œμ’… 단어λ₯Ό μ–»μŠ΅λ‹ˆλ‹€:

```text
ERROR
```

이 논리λ₯Ό `|`λ₯Ό ν¬ν•¨ν•œ 전체 ν…μŠ€νŠΈμ— μ μš©ν•˜κ³  남은 `|` 문자λ₯Ό 곡백으둜 λ°”κΎΈλ©΄ μ΅œμ’… CTC λ””μ½”λ”©λœ 좜λ ₯은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

```text
BRION SAW SOMETHING CLOSE TO PANIC ON HIS OPPONENT'S FACE WHEN THE MAN FINALLY RECOGNIZED HIS ERROR
```

μš”μ•½ν•˜μžλ©΄, λͺ¨λΈμ€ μž…λ ₯ νŒŒν˜•μ—μ„œ (λΆ€λΆ„μ μœΌλ‘œ κ²ΉμΉ˜λŠ”) μ˜€λ””μ˜€μ˜ 20msλ§ˆλ‹€ ν•˜λ‚˜μ˜ 토큰(문자)을 μ˜ˆμΈ‘ν•©λ‹ˆλ‹€. 이둜 인해 λ§Žμ€ 쀑볡이 λ°œμƒν•©λ‹ˆλ‹€. CTC 빈 토큰 덕뢄에 λ‹¨μ–΄μ˜ μ˜¬λ°”λ₯Έ 철자λ₯Ό νŒŒκ΄΄ν•˜μ§€ μ•Šκ³ λ„ μ΄λŸ¬ν•œ 쀑볡을 μ‰½κ²Œ μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 좜λ ₯ ν…μŠ€νŠΈλ₯Ό μž…λ ₯ μ˜€λ””μ˜€μ™€ μ •λ ¬ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 맀우 κ°„λ‹¨ν•˜κ³  νŽΈλ¦¬ν•œ λ°©λ²•μž…λ‹ˆλ‹€.

<Tip>
πŸ’‘ μ‹€μ œ Wav2Vec2 λͺ¨λΈμ—μ„œ CTC 빈 토큰은 νŒ¨λ”© 토큰 `<pad>`와 λ™μΌν•©λ‹ˆλ‹€. 이 λͺ¨λΈμ€ 예λ₯Ό λ“€μ–΄ ν˜„μž¬ 20ms의 μ˜€λ””μ˜€μ— λŒ€ν•΄ μ˜ˆμΈ‘ν•  λͺ…ν™•ν•œ λ¬Έμžκ°€ μ—†λŠ” κ²½μš°μ™€ 같이 μ΄λŸ¬ν•œ `<pad>` 토큰을 많이 μ˜ˆμΈ‘ν•©λ‹ˆλ‹€. νŒ¨λ”©μ— CTC λΈ”λž­ν‚Ήκ³Ό λ™μΌν•œ 토큰을 μ‚¬μš©ν•˜λ©΄ λ””μ½”λ”© μ•Œκ³ λ¦¬μ¦˜μ΄ λ‹¨μˆœν™”λ˜κ³  μ–΄νœ˜λ₯Ό μž‘κ²Œ μœ μ§€ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.
gabrielwithappy marked this conversation as resolved.
Show resolved Hide resolved
</Tip>

μΈμ½”λ”μ˜ 좜λ ₯ μ‹œν€€μŠ€κ°€ μ–΄νœ˜μ— 음ν–₯ νŠΉμ§•μ„ νˆ¬μ˜ν•˜λŠ” μ„ ν˜• λ ˆμ΄μ–΄λ‘œ μ΄λ™ν•˜κΈ° λ•Œλ¬Έμ— 트랜슀포머 인코더 λͺ¨λΈμ— CTCλ₯Ό μΆ”κ°€ν•˜λŠ” 것은 κ°„λ‹¨ν•©λ‹ˆλ‹€.λͺ¨λΈμ€ νŠΉμˆ˜ν•œ CTC μ†μ‹€λ‘œ ν›ˆλ ¨λ©λ‹ˆλ‹€.

CTC의 ν•œ 가지 단점은 'μ†Œλ¦¬'λŠ” μ •ν™•ν•˜μ§€λ§Œ '철자'λŠ” μ •ν™•ν•˜μ§€ μ•Šμ€ 단어λ₯Ό 좜λ ₯ν•  수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€.κ²°κ΅­ CTC ν—€λ“œλŠ” μ™„μ „ν•œ 단어가 μ•„λ‹Œ κ°œλ³„ 문자만 κ³ λ €ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ˜€λ””μ˜€ νŠΈλžœμŠ€ν¬λ¦½μ…˜μ˜ ν’ˆμ§ˆμ„ κ°œμ„ ν•˜λŠ” ν•œ 가지 방법은 μ™ΈλΆ€ μ–Έμ–΄ λͺ¨λΈμ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μ–Έμ–΄ λͺ¨λΈμ€ 기본적으둜 CTC 좜λ ₯ μœ„μ— λ§žμΆ€λ²• 검사기 역할을 ν•©λ‹ˆλ‹€.

## Wav2Vec2, HuBERT, M-CTC-T, ...의 차이점은 λ¬΄μ—‡μΈκ°€μš”?[[whats-the-difference-between-wav2vec2-hubert-mctct]]

λͺ¨λ“  트랜슀포머 기반 CTC λͺ¨λΈμ€ 맀우 μœ μ‚¬ν•œ μ•„ν‚€ν…μ²˜λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. 트랜슀포머 인코더(λ””μ½”λ”λŠ” μ•„λ‹˜)λ₯Ό μ‚¬μš©ν•˜λ©° κ·Έ μœ„μ— CTC ν—€λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ•„ν‚€ν…μ²˜ μΈ‘λ©΄μ—μ„œ 보면 λ‹€λ₯Έ μ λ³΄λ‹€λŠ” λΉ„μŠ·ν•œ 점이 더 λ§ŽμŠ΅λ‹ˆλ‹€.

Wav2Vec2와 M-CTC-T의 ν•œ 가지 차이점은 μ „μžλŠ” μ›μ‹œ μ˜€λ””μ˜€ νŒŒν˜•μ—μ„œ μž‘λ™ν•˜λŠ” 반면 ν›„μžλŠ” 멜 μŠ€νŽ™νŠΈλ‘œκ·Έλž¨μ„ μž…λ ₯으둜 μ‚¬μš©ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€. λ˜ν•œ 두 λͺ¨λΈμ€ μ„œλ‘œ λ‹€λ₯Έ λͺ©μ μœΌλ‘œ ν›ˆλ ¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, M-CTC-TλŠ” λ‹€κ΅­μ–΄ μŒμ„± 인식을 μœ„ν•΄ ν›ˆλ ¨λ˜μ—ˆκΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ μ•ŒνŒŒλ²³ 외에 ν•œμžλ₯Ό ν¬ν•¨ν•˜λŠ” 비ꡐ적 큰 CTC ν—€λ“œλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

Wav2Vec2와 HuBERTλŠ” μ™„μ „νžˆ λ™μΌν•œ μ•„ν‚€ν…μ²˜λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ 맀우 λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ ν•™μŠ΅λ©λ‹ˆλ‹€. Wav2Vec2λŠ” μ˜€λ””μ˜€μ˜ 마슀크된 뢀뢄에 λŒ€ν•œ μŒμ„± λ‹¨μœ„λ₯Ό μ˜ˆμΈ‘ν•˜μ—¬ BERT의 마슀크된 μ–Έμ–΄ λͺ¨λΈλ§κ³Ό 같이 사전 ν•™μŠ΅λ©λ‹ˆλ‹€. HuBERTλŠ” BERTμ—μ„œ ν•œ 걸음 더 λ‚˜μ•„κ°€ ν…μŠ€νŠΈ λ¬Έμž₯의 토큰과 μœ μ‚¬ν•œ 'κ°œλ³„ μŒμ„± λ‹¨μœ„'λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” 방법을 ν•™μŠ΅ν•˜μ—¬ κΈ°μ‘΄ NLP κΈ°μˆ μ„ μ‚¬μš©ν•˜μ—¬ μŒμ„±μ„ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ κ°•μ‘° ν‘œμ‹œλœ λͺ¨λΈλ§Œ 트랜슀포머 기반 CTC λͺ¨λΈμ΄ μ•„λ‹ˆλΌλŠ” 점을 λΆ„λͺ…νžˆ λ§μ”€λ“œλ¦½λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λΈλ„ 많이 μžˆμ§€λ§Œ λͺ¨λ‘ λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€λŠ” 것을 λ°°μ› μŠ΅λ‹ˆλ‹€.
Loading