๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ต์œก/์ŠคํŒŒ๋ฅดํƒ€

[TIL] ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ AI 9๊ธฐ - 22ํšŒ

by gomdeng 2025. 2. 5.

๐Ÿถ ํ•™์Šต ๋ฒ”์œ„

  • ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ 
  • ๊ฐœ์ธ ๊ณต๋ถ€

 

๐Ÿถ ํ•™์Šต ๋‚ด์šฉ

โœจ ๊ฐœ์ธ ๊ณต๋ถ€

โœ”๏ธ ํ† ํฐ ์ž„๋ฒ ๋”ฉ
  1. ์ž„๋ฒ ๋”ฉ (embedding)
   1) ๊ฐœ๋…: ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธ๋ฅผ ๋‹ด์•„ ์ˆซ์ž ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ

  2. ํ† ํฐ ์ž„๋ฒ ๋”ฉ
   1) ๊ฐœ๋…: ํ† ํฐ์„ ์ž„๋ฒ ๋”ฉํ•˜๋Š” ์ž‘์—…
   2) ๋‚ด์šฉ
     - ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์ด ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 
       ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํ† ํฐ๊ณผ ํ† ํฐ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค.
     - ํ† ํฐ๊ณผ ํ† ํฐ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ† ํฐ์˜ ์˜๋ฏธ๋ฅผ ์ˆซ์ž๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
     - ํ† ํฐํ™”์—์„œ ๋ถ€์—ฌํ•œ ํ† ํฐ ์•„์ด๋””๋Š” ํ•˜๋‚˜์˜ ์ˆซ์ž์ผ ๋ฟ์ด๋ฏ€๋กœ ์ˆซ์ž์˜ ์˜๋ฏธ๋ฅผ ๋‹ด์„ ์ˆ˜ ์—†๋‹ค.
     - ์˜๋ฏธ๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ ์ˆซ์ž ์ง‘ํ•ฉ์ธ ๋ฒกํ„ฐ์—ฌ์•ผ ํ•œ๋‹ค.
     ๐Ÿšฉ ์œ„์— ๋‚ด์šฉ์— ๋งž๊ฒŒ ํ† ํฐ์„ ์ž„๋ฒ ๋”ฉํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
     ๐Ÿšฉ ํŒŒ์ดํ† ์น˜๊ฐ€ ์ œ๊ณตํ•˜๋Š” nn.Embedding ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


โœ”๏ธ ํ† ํฐํ™” ์ƒ˜ํ”Œ ์ฝ”๋“œ

# ํ…์ŠคํŠธ๋ฅผ ์ ์ ˆํ•œ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ” (๋„์–ด์“ฐ๊ธฐ ๊ธฐ์ค€)
input_text = "๋‚˜๋Š” ์ตœ๊ทผ ํŒŒ๋ฆฌ ์—ฌํ–‰์„ ๋‹ค๋…€์™”๋‹ค"
input_text_list = input_text.split()

print(input_text_list) # ['๋‚˜๋Š”', '์ตœ๊ทผ', 'ํŒŒ๋ฆฌ', '์—ฌํ–‰์„', '๋‹ค๋…€์™”๋‹ค']

# ํ† ํฐ (์ˆซ์žID ๋ถ€์—ฌ)
# ์•„์ด๋”” ๋”•์…”๋„ˆ๋ฆฌ์™€ ์•„์ด๋””
str2idx = {word:idx for idx, word in enumerate(input_text_list)} 
# ํ† ํฐ ๋”•์…”๋„ˆ๋ฆฌ ๋งŒ๋“ค๊ธฐ
idx2str = {idx:word for idx, word in enumerate(input_text_list)} 

print(str2idx) # {'๋‚˜๋Š”': 0, '์ตœ๊ทผ': 1, 'ํŒŒ๋ฆฌ': 2, '์—ฌํ–‰์„': 3, '๋‹ค๋…€์™”๋‹ค': 4}
print(idx2str) # {0: '๋‚˜๋Š”', 1: '์ตœ๊ทผ', 2: 'ํŒŒ๋ฆฌ', 3: '์—ฌํ–‰์„', 4: '๋‹ค๋…€์™”๋‹ค'}

# ํ† ํฐ์„ ํ† ํฐ ์•„์ด๋””๋กœ ๋ณ€ํ™˜
input_ids = [str2idx[word] for word in input_text_list]
print(input_ids) # [0, 1, 2, 3, 4]

 

โœ”๏ธ ํ† ํฐ ์ž„๋ฒ ๋”ฉ ์ƒ˜ํ”Œ ์ฝ”๋“œ

import torch
import torch.nn as nn

# 1. ์ž„๋ฒ ๋”ฉ ๋ ˆ์ด์–ด ์ƒ์„ฑ
# len(str2idx) ํฌ๊ธฐ์˜ ๋‹จ์–ด ์‚ฌ์ „๊ณผ ๊ฐ ๋‹จ์–ด์— ๋Œ€ํ•ด 16์ฐจ์›์˜ ๋ฒกํ„ฐ๋ฅผ ์ถœ๋ ฅ
embedding_dim = 16
embed_layer = nn.Embedding(len(str2idx), embedding_dim)

# 2. ์ž„๋ฒ ๋”ฉ ๋ณ€ํ™˜
# embed_layer๋ฅผ ํ†ตํ•ด ๊ฐ ๋‹จ์–ด์˜ ์ž„๋ฒ ๋”ฉ์„ ์กฐํšŒ 
# ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ฐ ๋‹จ์–ด๋Š” 16์ฐจ์›์˜ ๋ฒกํ„ฐ๋กœ ํ‘œํ˜„
# ์—ฌ๊ธฐ์„œ 5๋Š” ๋ฌธ์žฅ์˜ ๋‹จ์–ด ์ˆ˜, 16์€ ์ž„๋ฒ ๋”ฉ ์ฐจ์›
input_embeddings = embed_layer(torch.tensor(input_ids)) # (5, 16)

# 3. ์ž„๋ฒ ๋”ฉ ํ…์„œ ์กฐ์ •
# unsqueeze(0)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž„๋ฒ ๋”ฉ ํ…์„œ์˜ ์ฐจ์›์„ (1, 5, 16)์œผ๋กœ ์กฐ์ • 
# ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋ƒ„
# โ€ป ๋ฐฐ์น˜ ํฌ๊ธฐ(batch size)
#  - ๋จธ์‹  ๋Ÿฌ๋‹์—์„œ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ฌ ๋•Œ ํ•œ ๋ฒˆ์— ๋„คํŠธ์›Œํฌ์— ์ฃผ์ž…๋˜๋Š” ๋ฐ์ดํ„ฐ ์ƒ˜ํ”Œ์˜ ์ˆ˜
input_embeddings = input_embeddings.unsqueeze(0) # (1, 5, 16)

# 4. ์ž„๋ฒ ๋”ฉ ํ…์„œ์˜ ํ˜•ํƒœ ํ™•์ธ
input_embeddings.shape

 

 

๐Ÿถ ๋А๋‚€์ 

1. ๋‚˜์˜ ์ง‘์ค‘๋ ฅ ๋…ธ๋‹ต