λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
😎AI/DeepLearning_WIL

[DL/WIL] 3 ν…μŠ€νŠΈ 데이터λ₯Ό μœ„ν•œ 인곡 신경망

by SolaKim 2024. 11. 23.

μž…λ ₯ λ°μ΄ν„°μ˜ 흐름이 μ•žμœΌλ‘œλ§Œ μ „λ‹¬λ˜λŠ” 신경망을 ν”Όλ“œν¬μ›Œλ“œ 신경망(feedforward neural network)라고 ν•œλ‹€.
Fully connected neural network λ‚˜ Convolution neural network λŠ” κΈ°μ–΅ μž₯μΉ˜κ°€ μ—†μ–΄μ„œ, ν•˜λ‚˜μ˜ μƒ˜ν”Œ(λ˜λŠ” ν•˜λ‚˜μ˜ 배치)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •λ°©ν–₯ 계산을 μˆ˜ν–‰ν•˜κ³  λ‚˜λ©΄ κ·Έ μƒ˜ν”Œμ€ 버렀지고 λ‹€μŒ μƒ˜ν”Œμ„ μ²˜λ¦¬ν•  λ•Œ μž¬μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

신경망이 이전에 μ²˜λ¦¬ν–ˆλ˜ μƒ˜ν”Œμ„ λ‹€μŒ μƒ˜ν”Œμ„ μ²˜λ¦¬ν•˜λŠ”λ° μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ΄λ ‡κ²Œ 데이터 흐름이 μ•žμœΌλ‘œλ§Œ μ „λ‹¬λ˜μ–΄μ„œλŠ” κ³€λž€ν•˜λ‹€.
λ‹€μŒ μƒ˜ν”Œμ„ μœ„ν•΄μ„œ 이전 데이터가 신경망 측에 μˆœν™˜λ  ν•„μš”κ°€ μžˆλ‹€.

 

μˆœν™˜ 신경망(Recurrent Neural Network, RNN)

μˆœν™˜ μ‹ κ²½λ§μ—μ„œλŠ” νŠΉλ³„νžˆ 측을 cell 이라고 λΆ€λ₯Έλ‹€. ν•œ μ…€μ—λŠ” μ—¬λŸ¬ 개의 λ‰΄λŸ°μ΄ μžˆμ§€λ§Œ μ™„μ „ μ—°κ²° 신경망과 달리 λ‰΄λŸ°μ„ λͺ¨λ‘ ν‘œμ‹œν•˜μ§€ μ•Šκ³  ν•˜λ‚˜μ˜ μ…€λ‘œ 측을 ν‘œν˜„ν•œλ‹€. 또 μ…€μ˜ 좜λ ₯을 은닉 μƒνƒœ(Hidden state) 라고 λΆ€λ₯Έλ‹€.

μˆœν™˜ μ‹ κ²½λ§μ˜ κΈ°λ³Έ κ΅¬μ‘°λŠ” μž…λ ₯에 μ–΄λ–€ κ°€μ€‘μΉ˜λ₯Ό κ³±ν•˜κ³  ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό ν†΅κ³Όμ‹œμΌœ λ‹€μŒ 측으둜 λ³΄λ‚΄λŠ” 것이닀. μ΄λ•Œ 측의 좜λ ₯(즉 은닉 μƒνƒœ)λ₯Ό λ‹€μŒ νƒ€μž„ μŠ€ν…μ— μž¬μ‚¬μš©ν•œλ‹€.

일반적으둜 μˆœν™˜ μ‹ κ²½λ§μ—μ„œλŠ” ν™œμ„±ν™” ν•¨μˆ˜λ‘œ tanh ν•¨μˆ˜λ₯Ό 많이 μ‚¬μš©ν•œλ‹€.

tanh ν•¨μˆ˜λŠ” μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ™€λŠ” 달리 -1 ~ 1 μ‚¬μ΄μ˜ λ²”μœ„λ₯Ό 가진닀.

ν•˜μ§€λ§Œ, 사싀 μˆœν™˜μΈ΅μ€ 기본적으둜 λ§ˆμ§€λ§‰ νƒ€μž„μŠ€ν…μ˜ 은닉 μƒνƒœλ§Œ 좜λ ₯으둜 내보낸닀. 
μ…€μ˜ μž…λ ₯은 μƒ˜ν”Œλ§ˆλ‹€ νƒ€μž„μŠ€ν…(ex 단어 개수)κ³Ό λ‹¨μ–΄ν‘œν˜„μœΌλ‘œ 이루어진 2차원 배열이어야 ν•œλ‹€. λ”°λΌμ„œ 첫 번째 셀이 λ§ˆμ§€λ§‰ νƒ€μž„μŠ€ν…μ˜ 은닉 μƒνƒœλ§Œμ„ 좜λ ₯ν•΄μ„œλŠ” μ•ˆλœλ‹€. 이런 κ²½μš°μ—λŠ” λ§ˆμ§€λ§‰ 셀을 μ œμ™Έν•œ λ‹€λ₯Έ λͺ¨λ“  셀은 λͺ¨λ“  νƒ€μž„μŠ€ν…μ˜ μ€λ‹‰μƒνƒœλ₯Ό 좜λ ₯ν•œλ‹€. 

그렇기에 λ§ˆμ§€λ§‰ μ…€μ˜ 좜λ ₯이 1μ°¨μ›μ΄μ–΄μ„œ λ°€μ§‘μΈ΅μœΌλ‘œ λ³΄λ‚Όλ•Œ Flatten 클래슀둜 펼칠 ν•„μš”κ°€ μ—†λ‹€. 

 

 

자 이제, ν…μŠ€νŠΈ 데이터λ₯Ό μž…λ ₯으둜 λ°›λŠ” μˆœν™˜ 신경망을 λ§Œλ“€μ–΄λ³΄μž.

사싀 ν…μŠ€νŠΈ 자체λ₯Ό 신경망에 μ „λ‹¬ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. μ»΄ν“¨ν„°μ—μ„œ μ²˜λ¦¬ν•˜λŠ” λͺ¨λ“  것은 μ–΄λ–€ 숫자 데이터이닀. μ•žμ„œ ν•©μ„±κ³± μ‹ κ²½λ§μ—μ„œ 이미지λ₯Ό λ‹€λ£° λ•ŒλŠ” νŠΉλ³„ν•œ λ³€ν™˜μ„ ν•˜μ§€ μ•Šμ•˜λ‹€. μ΄λŠ” 이미지가 μ •μˆ˜ ν”½μ…€κ°’μœΌλ‘œ 이루어져 있기 λ•Œλ¬Έμ΄λ‹€.
ν…μŠ€νŠΈ λ°μ΄ν„°μ˜ 경우 단어λ₯Ό 숫자 λ°μ΄ν„°λ‘œ λ°”κΎΈλŠ” 일반적인 방법은 데이터에 λ“±μž₯ν•˜λŠ” λ‹¨μ–΄λ§ˆλ‹€ κ³ μœ ν•œ μ •μˆ˜λ₯Ό λΆ€μ—¬ν•˜λŠ” 것이닀.

일반적으둜 μ˜μ–΄ λ¬Έμž₯은 λͺ¨λ‘ μ†Œλ¬Έμžλ‘œ λ°”κΎΈκ³  ꡬ둣점을 μ‚­μ œν•œ λ‹€μŒ 곡백을 κΈ°μ€€μœΌλ‘œ λΆ„λ¦¬ν•œλ‹€. μ΄λ ‡κ²Œ λΆ„λ¦¬λœ 단어λ₯Ό 토큰(Token) 이라고 λΆ€λ₯Έλ‹€. ν•˜λ‚˜μ˜ μƒ˜ν”Œμ€ μ—¬λŸ¬ 개의 ν† ν°μœΌλ‘œ 이루어져 있고 1개의 토큰이 ν•˜λ‚˜μ˜ νƒ€μž„μŠ€ν…μ— ν•΄λ‹Ήν•œλ‹€.

토큰에 ν• λ‹Ήν•˜λŠ” μ •μˆ˜ 쀑에 λͺ‡ κ°œλŠ” νŠΉμ •ν•œ μš©λ„λ‘œ μ˜ˆμ•½λ˜μ–΄ μžˆλŠ” κ²½μš°κ°€ λ§Žλ‹€. 예λ₯Ό λ“€μ–΄ 0은 νŒ¨λ”©, 1은 λ¬Έμž₯의 μ‹œμž‘, 2λŠ” μ–΄νœ˜ 사전에 μ—†λŠ” 토큰을 λ‚˜νƒ€λ‚Έλ‹€.

μˆœν™˜ 신경망을 λ§Œλ“€λ•Œ 토큰을 μ •μˆ˜λ‘œ λ³€ν™˜ν•œ 데이터λ₯Ό input으둜 λ„£κ²Œ 되면 문제점이 ν•˜λ‚˜ 생긴닀. 
⚠ 큰 μ •μˆ˜μΌ 수둝 큰 ν™œμ„±ν™” 좜λ ₯을 λ§Œλ“ λ‹€. 사싀 단어에 μž„μ˜λ‘œ κ³ μœ ν•œ μ •μˆ˜λ₯Ό λΆ€μ—¬ν•  뿐이지, 20을 10보닀 더 μ€‘μš”μ‹œν•΄μ•Ό ν•  μ΄μœ λŠ” μ—†λ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ μ •μˆ˜κ°’μ— μžˆλŠ” 크기 속성을 μ—†μ• κ³  각 μ •μˆ˜λ₯Ό κ³ μœ ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ„λ‘ 원-ν•« 인코딩(One-hot Encoding)을 λ„μž…ν•  수 μžˆλ‹€.

원-ν•« 인코딩은 μ–΄λ–€ ν΄λž˜μŠ€μ— ν•΄λ‹Ήν•˜λŠ” μ›μ†Œλ§Œ 1이고 λ‚˜λ¨Έμ§€λŠ” λͺ¨λ‘ 0인 벑터이닀. λ³€ν™˜λœ 토큰을 원-ν•« μΈμ½”λ”©μœΌλ‘œ λ³€ν™˜ν•˜λ €λ©΄ μ–΄νœ˜ 사전 크기의 벑터가 λ§Œλ“€μ–΄μ§„λ‹€. 

μ΄λ ‡κ²Œ 원-ν•« 인코딩을 μ μš©ν•˜λ©΄ λ§Œμ•½ 총 500개의 λ‹¨μ–΄λ§Œ μ‚¬μš©ν•˜λ„λ‘ ν•˜λŠ” 데이터λ₯Ό 뢈러였고 100개 λ‹¨μ–΄λ‘œ 이루어진 (100, ) 크기의 ν…μŠ€νŠΈν˜• 데이터가 λ“€μ–΄μ˜€κ²Œ λœλ‹€λ©΄ (100, 500) 크기둜 λ³€ν™˜λœλ‹€.

keras.utils.to_categorical(train_data) 와 같은 μ½”λ“œλ₯Ό 톡해 원-ν•« 인코딩을 μ μš©ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ 원-ν•« μΈμ½”λ”©μ˜ 단점은 μž…λ ₯ 데이터가 μ—„μ²­ μ»€μ§„λ‹€λŠ” 것이닀. 토큰 1개λ₯Ό 500μ°¨μ›μœΌλ‘œ 늘렸기 λ•Œλ¬Έμ— λŒ€λž΅ 500λ°°κ°€ 컀진닀고 λ³Ό 수 μžˆλ‹€. μ΄λŠ” 썩 쒋은 λ°©λ²•μœΌλ‘œ 보이진 μ•ŠλŠ”λ‹€.

 

κ·Έλž˜μ„œ μ‹€μ œ μˆœν™˜ μ‹ κ²½λ§μ—μ„œλŠ” ν…μŠ€νŠΈν˜• 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ 주둜 단어 μž„λ² λ”©(Word Embedding)을 μ΄μš©ν•œλ‹€.

단어 μž„λ² λ”©μ€ μ •μˆ˜λ‘œ λ³€ν™˜λœ 토큰을 비ꡐ적 μž‘μ€ 크기의 μ‹€μˆ˜ 밀집 λ²‘ν„°λ‘œ λ³€ν™˜ν•œλ‹€. 이런 밀집 λ²‘ν„°λŠ” 단어 μ‚¬μ΄μ˜ 관계λ₯Ό ν‘œν˜„ν•  수 있기 λ•Œλ¬Έμ— μžμ—°μ–΄ μ²˜λ¦¬μ—μ„œ 쒋은 μ„±λŠ₯을 λ°œνœ˜ν•œλ‹€.

μΌ€λΌμŠ€μ—μ„œλŠ” keras.layers νŒ¨ν‚€μ§€ μ•„λž˜ Embedding 클래슀둜 μž„λ² λ”© κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. 이 클래슀λ₯Ό λ‹€λ₯Έ 측처럼 λͺ¨λΈμ— μΆ”κ°€ν•˜λ©΄ μ²˜μŒμ—λŠ” λͺ¨λ“  벑터가 λžœλ€ν•˜κ²Œ μ΄ˆκΈ°ν™”λ˜μ§€λ§Œ ν›ˆλ ¨μ„ 톡해 λ°μ΄ν„°μ—μ„œ 쒋은 단어 μž„λ² λ”©μ„ ν•™μŠ΅ν•œλ‹€.

model = keras.Sequential()
model.add(keras.layers.Embedding(500, 16, input_length=100))
model.add(keras.layers.SimpleRNN(8))
model.add(keras.layers.Dense(1, activation='sigmoid'))

Embedding 클래슀의 첫번째 λ§€κ°œλ³€μˆ˜ 500은 μ–΄νœ˜ μ‚¬μ „μ˜ 크기이닀. λ‘λ²ˆμ§Έ λ§€κ°œλ³€μˆ˜ 16은 μž„λ² λ”© λ²‘ν„°μ˜ 크기이닀. μ„Έλ²ˆμ§Έ λ§€κ°œλ³€μˆ˜ 100은 μž…λ ₯ μ‹œν€€μŠ€μ˜ 길이이닀. 

 

μ˜ˆμ‹œ 문제λ₯Ό ν•œλ²ˆ 보자.

Q: μ–΄λ–€ μˆœν™˜μΈ΅μ— (100, 10) 크기의 μž…λ ₯이 μ£Όμž…λ˜κ³  이 μˆœν™˜μΈ΅μ˜ λ‰΄λŸ° κ°œμˆ˜κ°€ 16개라면 이 측에 ν•„μš”ν•œ λͺ¨λΈμ˜ νŒŒλΌλ―Έν„° κ°œμˆ˜λŠ” λͺ‡κ°œμΌκΉŒ?

A: μž…λ ₯ μ‹œν€€μŠ€μ— μžˆλŠ” 토큰 λ²‘ν„°μ˜ 크기가 10이고 μˆœν™˜μΈ΅μ˜ λ‰΄λŸ° κ°œμˆ˜κ°€ 16μ΄λ―€λ‘œ Wx의 ν¬κΈ°λŠ” 10 x 16 = 160 κ°œμ΄λ‹€. μˆœν™˜μΈ΅μ˜ 은닉 μƒνƒœμ— κ³±ν•΄μ§€λŠ” wh의 ν¬κΈ°λŠ” 16 x 16 = 256 κ°œμ΄λ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ λ‰΄λŸ°λ§ˆλ‹€ 1κ°œμ”© 총 16개의 절편이 있기 λ•Œλ¬Έμ— 160 + 256 + 16 = 432κ°œμ΄λ‹€.

 

 

κ³ κΈ‰ μˆœν™˜μΈ΅ : LSTM κ³Ό GRU μ…€ 

더 λ‚˜μ•„κ°€ κ³ κΈ‰ μˆœν™˜μΈ΅μΈ LSTM κ³Ό GRU 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

μœ„μ˜ 두 개의 측듀은 SimpleRNN 보닀 계산이 훨씬 λ³΅μž‘ν•˜λ‹€. ν•˜μ§€λ§Œ μ„±λŠ₯이 λ›°μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— μˆœν™˜ 신경망에 많이 μ±„νƒλ˜κ³  μžˆλ‹€.

일반적으둜 κΈ°λ³Έ μˆœν™˜μΈ΅μ€ κΈ΄ μ‹œν€€μŠ€λ₯Ό ν•™μŠ΅ν•˜κΈ° μ–΄λ ΅λ‹€. μ΄λŠ” μ‹œν€€μŠ€κ°€ 길수둝 μˆœν™˜λ˜λŠ” 은닉 μƒνƒœμ— λ‹΄κΈ΄ 정보가 점차 ν¬μ„λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ 멀리 λ–¨μ–΄μ Έ μžˆλŠ” 단어 정보λ₯Ό μΈμ‹ν•˜λŠ” 데 μ–΄λ €μšΈ 수 μžˆλ‹€. 이λ₯Ό μœ„ν•΄ LSTM κ³Ό GRU 셀이 발λͺ… λ˜μ—ˆλ‹€.

 

LSTM (Long Short-Term Memory) λŠ” 단기 기얡을 였래 κΈ°μ–΅ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλ˜μ—ˆλ‹€. 

LSTM μ—λŠ” μž…λ ₯κ³Ό κ°€μ€‘μΉ˜λ₯Ό κ³±ν•˜κ³  μ ˆνŽΈμ„ 더해 ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό ν†΅κ³Όμ‹œν‚€λŠ” ꡬ쑰λ₯Ό μ—¬λŸ¬κ°œ 가지고 μžˆλ‹€. 이런 계산 κ²°κ³ΌλŠ” λ‹€μŒ νƒ€μž„μŠ€ν…μ— μž¬μ‚¬μš©λœλ‹€.

λ¨Όμ € LSTM 이 은닉 μƒνƒœλ₯Ό λ§Œλ“œλŠ” 방법을 μ•Œμ•„λ³΄μž.
은닉 μƒνƒœλŠ” μž…λ ₯κ³Ό 이전 νƒ€μž„μŠ€ν…μ˜ 은닉 μƒνƒœλ₯Ό κ°€μ€‘μΉ˜μ— κ³±ν•œ ν›„ ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό ν†΅κ³Όμ‹œμΌœ λ‹€μŒ 은닉 μƒνƒœλ₯Ό λ§Œλ“ λ‹€. 
μ΄λ•Œ κΈ°λ³Έ μˆœν™˜μΈ΅κ³Ό 달리 μ‹œκ·Έλͺ¨μ΄λ“œ ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 또 tanh ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό ν†΅κ³Όν•œ μ–΄λ–€ κ°’κ³Ό κ³±ν•΄μ Έμ„œ 은닉 μƒνƒœλ₯Ό λ§Œλ“ λ‹€.

WoλŠ” 은닉 μƒνƒœλ₯Ό 계산할 λ•Œ μ‚¬μš©ν•˜λŠ” κ°€μ€‘μΉ˜ Wx와 Whλ₯Ό 톡틀어 ν‘œν˜„ν•œ 것이닀. 

LSTM μ—λŠ” μˆœν™˜λ˜λŠ” μƒνƒœκ°€ 2κ°œμ΄λ‹€. 은닉 μƒνƒœλ§κ³  μ…€ μƒνƒœ(cell state) 라고 λΆ€λ₯΄λŠ” 값이 또 μžˆλ‹€. 은닉 μƒνƒœμ™€ 달리 μ…€ μƒνƒœλŠ” λ‹€μŒ 측으둜 μ „λ‹¬λ˜μ§€ μ•Šκ³  LSTM μ…€μ—μ„œλ§Œ μˆœν™˜λ˜λŠ” 값이닀. 

μ…€ μƒνƒœλŠ” μœ„ 그림의 μ΄ˆλ‘μƒ‰ c 뢀뢄이닀. λ˜ν•œ LSTM μ—λŠ” 총 4개의 셀이 μ‘΄μž¬ν•œλ‹€.
λ¨Όμ € μž…λ ₯κ³Ό 은닉 μƒνƒœλ₯Ό 각기 λ‹€λ₯Έ κ°€μ€‘μΉ˜μ— κ³±ν•œ λ‹€μŒ, ν•˜λ‚˜λŠ” μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ₯Ό ν†΅κ³Όμ‹œν‚€κ³  λ‹€λ₯Έ ν•˜λ‚˜λŠ” tanh ν•¨μˆ˜λ₯Ό 톡과 μ‹œν‚¨λ‹€.
κ·Έλ‹€μŒ 두 κ²°κ³Όλ₯Ό κ³±ν•œ ν›„ 이전 μ…€ μƒνƒœμ™€ λ”ν•œλ‹€. 이 κ²°κ³Όκ°€ μ΅œμ’…μ μΈ λ‹€μŒ μ…€ μƒνƒœκ°€ λ˜λŠ” 것이닀.

LSTM 은 마치 μž‘μ€ 셀을 μ—¬λŸ¬ 개 ν¬ν•¨ν•˜κ³  μžˆλŠ” 큰 μ…€κ³Ό κ°™λ‹€. μ€‘μš”ν•œ 것은 μž…λ ₯κ³Ό 은닉 μƒνƒœμ— κ³±ν•΄μ§€λŠ” κ°€μ€‘μΉ˜λ“€μ΄ λ‹€λ₯΄λ‹€λŠ” 점이닀. 

μœ„μ˜ 그림처럼 μ„Έ ꡰ데의 κ³±μ…ˆμ„ μ™Όμͺ½λΆ€ν„° μ‚­μ œ 게이트, μž…λ ₯ 게이트, 좜λ ₯ 게이트라고 λΆ€λ₯Έλ‹€.

μ‚­μ œ κ²Œμ΄νŠΈλŠ” μ…€ μƒνƒœμ— μžˆλŠ” 정보λ₯Ό μ œκ±°ν•˜κ³  μž…λ ₯ κ²Œμ΄νŠΈλŠ” μƒˆλ‘œμš΄ 정보λ₯Ό μ…€ μƒνƒœμ— μΆ”κ°€ν•œλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ 좜λ ₯ 게이트λ₯Ό ν†΅ν•΄μ„œ 이 μ…€ μƒνƒœκ°€ λ‹€μŒ 은닉 μƒνƒœλ‘œ 좜λ ₯λœλ‹€.

LSTM 은 λ‹€μŒκ³Ό 같이 keras둜 μ‚¬μš©ν•  수 μžˆλ‹€.

from tensorflow import keras

model = keras.Sequential()
model.add(keras.layers.Embedding(500, 16, input_length = 100))
model.add(keras.layers.LSTM(8))
model.add(keras.layers.Dense(1, activation='sigmoid'))

 

μˆœν™˜μΈ΅μ— λ“œλ‘­μ•„μ›ƒ μ μš©ν•˜κΈ°

Fully connected Neural Network 와 Convolution Neural Network μ—μ„œλŠ” Dropout 클래슀λ₯Ό μ‚¬μš©ν•΄ λ“œλ‘­μ•„μ›ƒμ„ μ μš©ν–ˆμ—ˆλ‹€. 이λ₯Ό 톡해 λͺ¨λΈμ΄ ν›ˆλ ¨ μ„ΈνŠΈμ— κ³ΌλŒ€μ ν•©μ΄ λ˜λŠ”κ²ƒμ„ 막을 수 μžˆμ—ˆλ‹€. Recurrent Neural Network μ—μ„œλ„ 자체적으둜 λ“œλ‘­μ•„μ›ƒ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. 두 가지가 μžˆλŠ”λ°,  dropout λ§€κ°œλ³€μˆ˜μ™€ recurrent_dropout이 μžˆλ‹€.

dropout λ§€κ°œλ³€μˆ˜λŠ” μ…€μ˜ μž…λ ₯에 λ“œλ‘­μ•„μ›ƒμ„ μ μš©ν•˜κ³ ,
recurrent_dropout λ§€κ°œλ³€μˆ˜λŠ” μˆœν™˜λ˜λŠ” 은닉 μƒνƒœμ— λ“œλ‘­μ•„μ›ƒμ„ μ μš©ν•œλ‹€. 
ν•˜μ§€λ§Œ 기술적 문제둜 인해 recurrent_dropout λ₯Ό μ‚¬μš©ν•˜λ©΄ GPU λ₯Ό μ‚¬μš©ν•˜μ§€ λͺ»ν•˜μ—¬ λͺ¨λΈμ˜ ν›ˆλ ¨μ†λ„κ°€ 맀우 느렀질 수 μžˆλ‹€.

 

μˆœν™˜μΈ΅μ„ μ—¬λŸ¬ 개 μ—°κ²°ν•˜κΈ°

μˆœν™˜μΈ΅μ„ μ—°κ²°ν•  λ•ŒλŠ” μ£Όμ˜ν•  점이 μžˆλ‹€. μˆœν™˜μΈ΅μ˜ 은닉 μƒνƒœλŠ” μƒ˜ν”Œμ˜ λ§ˆμ§€λ§‰ νƒ€μž„μŠ€ν…μ— λŒ€ν•œ 은닉 μƒνƒœλ§Œ λ‹€μŒ 측으둜 μ „λ‹¬ν•œλ‹€. 
ν•˜μ§€λ§Œ μˆœν™˜μΈ΅μ„ μŒ“κ²Œ 되면 λͺ¨λ“  μˆœν™˜μΈ΅μ˜ 순차 데이터가 ν•„μš”ν•˜λ‹€. λ”°λΌμ„œ μ•žμͺ½μ˜ μˆœν™˜μΈ΅μ΄ λͺ¨λ“  νƒ€μž„μŠ€ν…μ— λŒ€ν•œ 은닉 μƒνƒœλ₯Ό 좜λ ₯ν•΄μ•Ό ν•œλ‹€. 였직 λ§ˆμ§€λ§‰ μˆœν™˜μΈ΅λ§Œ λ§ˆμ§€λ§‰ νƒ€μž„μŠ€νƒμ˜ μ€λ‹‰μƒνƒœλ₯Ό 좜λ ₯ν•΄μ•Όν•œλ‹€.

μ΄λŠ” λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€.

from tensorflow import keras

model = keras.Sequential()
model.add(keras.layers.Embedding(500, 16, input_length = 100))
model.add(keras.layers.LSTM(8, dropout=0.3, return_sequences=True))
model.add(keras.layers.LSTM(8, dropout=0.3)
model.add(keras.layers.Dense(1, activation='sigmoid'))

μœ„μ˜ μ½”λ“œμ™€ 같이 μΌ€λΌμŠ€μ˜ μˆœν™˜μΈ΅μ—μ„œ λͺ¨λ“  νƒ€μž„μŠ€ν…μ˜ 은닉 μƒνƒœλ₯Ό 좜λ ₯ν•˜λ €λ©΄ λ§ˆμ§€λ§‰μ„ μ œμ™Έν•œ λ‹€λ₯Έ λͺ¨λ“  μˆœν™˜μΈ΅μ—μ„œ return_sequences λ§€κ°œλ³€μˆ˜λ₯Ό True 둜 μ§€μ •ν•˜λ©΄ λœλ‹€.

 

GRU (Gated Recurrent Unit) ꡬ쑰

GRU λŠ” λ‰΄μš• λŒ€ν•™κ΅ μ‘°κ²½ν˜„ κ΅μˆ˜κ°€ 발λͺ…ν•œ 셀이닀. 이 셀은 LSTM 을 κ°„μ†Œν™”ν•œ λ²„μ „μœΌλ‘œ 생각할 수 μžˆλ‹€. 이 셀은 LSTM 처럼 μ…€ μƒνƒœλ₯Ό κ³„μ‚°ν•˜μ§€ μ•Šκ³  은닉 μƒνƒœ ν•˜λ‚˜λ§Œ ν¬ν•¨ν•˜κ³  μžˆλ‹€. λ¨Όμ € GRU μ…€μ˜ 그림은 λ‹€μŒκ³Ό κ°™λ‹€.

GRU μ…€μ—λŠ” 은닉 μƒνƒœμ™€ μž…λ ₯에 κ°€μ€‘μΉ˜λ₯Ό κ³±ν•˜κ³  μ ˆνŽΈμ„ λ”ν•˜λŠ” μž‘μ€ 셀이 3개 λ“€μ–΄μžˆλ‹€. 2κ°œλŠ” μ‹œκ·Έλͺ¨μ΄λ“œ ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  ν•˜λ‚˜λŠ” tanh ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. μœ„ κ·Έλ¦Όμ—μ„œλŠ” 은닉 μƒνƒœμ™€ μž…λ ₯에 κ³±ν•΄μ§€λŠ” κ°€μ€‘μΉ˜λ₯Ό ν•©μ³μ„œ λ‚˜νƒ€λ‚˜ μžˆλ‹€.

맨 μ™Όμͺ½μ—μ„œ Wz λ₯Ό μ‚¬μš©ν•˜λŠ” μ…€μ˜ 좜λ ₯이 은닉 μƒνƒœμ— λ°”λ‘œ κ³±ν•΄μ Έ μ‚­μ œ 게이트 역할을 μˆ˜ν–‰ν•œλ‹€. 
이와 λ˜‘κ°™μ€ 좜λ ₯을 1μ—μ„œ λΊ€ λ‹€μŒμ— κ°€μž₯ 였λ₯Έμͺ½ Wg λ₯Ό μ‚¬μš©ν•˜λŠ” μ…€μ˜ 좜λ ₯에 κ³±ν•œλ‹€. μ΄λŠ” μž…λ ₯되

λŠ” 정보λ₯Ό μ œμ–΄ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.
κ°€μš΄λ° Wr 을 μ‚¬μš©ν•˜λŠ” μ…€μ—μ„œ 좜λ ₯된 값은 Wg 셀이 μ‚¬μš©ν•  은닉 μƒνƒœμ˜ 정보λ₯Ό μ œμ–΄ν•œλ‹€.

GRU 셀은 LSTM 보닀 κ°€μ€‘μΉ˜κ°€ 적기 λ•Œλ¬Έμ— κ³„μ‚°λŸ‰μ΄ μ μ§€λ§Œ LSTM λͺ»μ§€μ•Šμ€ 쒋은 μ„±λŠ₯을 λ‚΄λŠ”κ²ƒμœΌλ‘œ 유λͺ…ν•˜λ‹€.

from tensorflow import keras

model = keras.Sequential()
model.add(keras.layers.Embedding(500, 16, input_length = 100))
model.add(keras.layers.GRU(8))
model.add(keras.layers.Dense(1, activation='sigmoid'))

 

 

'😎AI > DeepLearning_WIL' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[DL/WIL] 2 ν•©μ„±κ³± 신경망(Convolution Neural Network, CNN)  (0) 2024.11.19