인프런 커뮤니티 질문&답변

David님의 프로필 이미지
David

작성한 질문수

딥러닝을 활용한 자연어 처리 (NLP) 과정 (기초부터 ChatGPT/생성 모델까지)

실습 - Sentiment Analysis (감성 분석) - IMDB - part2

감성 분석 실습 모델 만들때 질문 드립니다!

작성

·

270

0

다시 한 번 좋은 강의 너무 감사합니다 :)

회사에서 NLP로 업무가 바뀌며 열공하느라 질문이 많네요..^^;

 

 030_IMDB_movie_reviews.ipynb 의 아래 코드에서

model = Sequential([
    Embedding(vocab_size+1, 64),
    Bidirectional(tf.keras.layers.LSTM(64)),
    Dense(64, activation='relu'),
    Dense(1, activation='sigmoid')
])

embedding의 차원 64와 LSTM hidden size 64와 Dense의 64는 항상 같아야 되는게 맞나요?

 

tf.keras.layers.LSTM(64))

위 코드를 해석해보면, LSTM의 input에 대한 weight 개수가 64개 인데

 

Dense(64, activation='relu'),

그 weight들을 fully connected 뉴런들로 덧붙여주겠다는 뜻으로 해석하면 될까요?

 

답변 2

1

YoungJea Oh님의 프로필 이미지
YoungJea Oh
지식공유자

(질문1)embedding의 차원 64와 LSTM hidden size 64와 Dense의 64는 항상 같아야 되는게 맞나요?

아니요, Embedding의 차원 수, LSTM의 hidden size, 그리고 Dense layer의 뉴런 수가 항상 같을 필요는 없습니다. 이들은 모델의 구조나 복잡성, 문제의 복잡성에 따라 다르게 설정될 수 있습니다. 또한, 더 큰 수의 차원이나 뉴런을 사용하면 모델이 더 복잡한 패턴을 학습할 수 있지만, 너무 크게 설정하면 과적합의 위험이 있습니다.

Embedding layer의 차원 수 64는 각 단어를 64차원의 벡터로 변환한다는 것을 의미합니다. LSTM layer의 hidden size 64는 LSTM cell의 상태 벡터의 차원 수를 의미합니다. Dense layer의 뉴런 수 64는 이전 layer의 출력을 64차원의 벡터로 변환한다는 것을 의미합니다.

(질문2) 그렇습니다.

tf.keras.layers.LSTM(64) 이 부분은 LSTM의 hidden state의 크기가 64라는 뜻입니다. LSTM은 RNN(Recurrent Neural Network)의 한 종류로, 각 time step에서 hidden state를 계산하고 이를 다음 time step으로 전달합니다.

Dense(64, activation='relu') 이 부분은 Dense layer에 64개의 뉴런이 있고, activation function으로 ReLU(Rectified Linear Unit)를 사용한다는 뜻입니다.

tf.keras.layers.LSTM(64)의 출력 차원은 64이므로, 이를 Dense(64) 레이어와 연결하면 가중치의 개수는 64 * 64 즉, 4096개가 됩니다.

Dense 레이어에서는 각 입력 노드와 출력 노드 사이에 가중치가 하나씩 존재하며, 따라서 가중치의 총 개수는 입력 차원과 출력 차원의 곱이 됩니다.

Dense 레이어는 각 출력 노드에 대해 하나의 bias term을 가지므로, 실제 가중치의 총 개수는 64 * 64 + 64 즉, 4160개가 됩니다.

좋은 질문 감사합니다.

David님의 프로필 이미지
David
질문자

답변 감사합니다!

한가지 더 여쭙고 싶은데요.

LSTM hidden state vector가 64차원, dense layer의 뉴런이 32개일 경우, next tiem step으로 해당 dense layer를 거친 vector의 size는 32가 될텐데, 그러면 next input + 이전 hidden state vector가 어떻게 하나의 새로운 input으로 합쳐질 수 있나요?

YoungJea Oh님의 프로필 이미지
YoungJea Oh
지식공유자

LSTM의 hidden state vector 크기는 여전히 64차원 입니다. Dense layer를 거친 결과 (즉, 32차원의 출력)는 다음 timestep의 LSTM의 입력으로 직접 사용되지 않습니다.

LSTM의 hidden state와 Dense layer의 출력이 "합쳐져서" 새로운 입력을 생성하는 경우는 보통 없습니다. 이 두 벡터는 네트워크의 다른 부분에 서로 다른 방식으로 사용됩니다. Dense layer의 출력은 보통 네트워크의 최종 출력으로 사용되거나, 다른 Dense layer의 입력으로 사용됩니다. 반면 LSTM의 hidden state는 다음 timestep에서 LSTM layer의 입력에 사용됩니다.

좋은 질문 감사합니다.

David님의 프로필 이미지
David
질문자

image

"Dense layer의 출력은 보통 네트워크의 최종 출력으로 사용되거나, 다른 Dense layer의 입력으로 사용됩니다"

=> 제가 LSTM에서 dense layer에 대한 이해도가 부족한것 같습니다.

아래 코드의 Dense layer 2개가 각각 위 강의자료 그림에서 어느부분에 해당하는지 말씀해주실 수 있을까요? CNN에서 fully connected layer는 필터를 거쳐 나온 아웃풋들을 1차원으로 쭉 펼쳐 1차원벡터가 MLP로 들어가 softmax를 거쳐 output을 뽑는걸로 알고 있습니다.

RNN, LSTM에서는 어떤식으로 동작하는걸까요?

Dense(64, activation='relu'),
Dense(1, activation='sigmoid')
David님의 프로필 이미지
David
질문자

자문 자답인데요.

 

    Bidirectional(tf.keras.layers.LSTM(64), return_sequences=False),
    Dense(32, activation='relu'),
    Dense(1, activation='sigmoid')

위 코드처럼 return sequences를 false로 했을 경우, dense layer 32는 맨 마지막 time step 의 64차원 hidden state vector가 인풋으로 들어가서 32개의 아웃풋을 내주고 그 32개 아웃풋을 다시 1차원 벡터 (감성분석의 negative or positive) 로 결과물 반환" 이라고 이해하면 될까요?

YoungJea Oh님의 프로필 이미지
YoungJea Oh
지식공유자

LSTM cell 그림에는 Dense Layer 가 포함되어 있지 않습니다. 다음 링크의 그림 참조하세요.

https://miro.medium.com/max/875/1*SICYykT7ybua1gVJDNlajw.png

두번째 질문은,

그렇게 이해하시면 맞습니다.

LSTM 레이어의 return_sequences 파라미터는 LSTM 레이어가 각 time-step마다 출력을 반환할지, 아니면 마지막 time-step에서만 출력을 반환할지를 결정합니다.

return_sequences=False로 설정하면, LSTM 레이어는 마지막 time-step의 hidden state 벡터만 반환합니다. 따라서 이 벡터는 LSTM 레이어의 크기에 따라 결정되는데, 여기서는 64차원입니다.

이 64차원 벡터는 그다음 레이어인 Dense 레이어에 입력으로 사용됩니다. Dense 레이어는 입력을 받아 활성화 함수(이 경우 'relu')를 사용하여 출력을 생성합니다. 여기서의 Dense 레이어는 32개의 노드를 가지므로, 이 레이어의 출력은 32차원 벡터가 됩니다.

마지막 Dense 레이어는 이전 Dense 레이어의 32차원 벡터를 입력으로 받아, 'sigmoid' 활성화 함수를 사용하여 최종적으로 1차원 벡터를 출력합니다. 이는 이진 분류 문제(예: 감성 분석의 negative or positive)에서 사용되는 패턴입니다. 'sigmoid' 함수는 출력 값을 0과 1 사이로 제한하여, 확률로 해석될 수 있게 합니다.

0

David님의 프로필 이미지
David
질문자

상세한 답변 감사합니다.

David님의 프로필 이미지
David

작성한 질문수

질문하기