해결된 질문
작성
·
113
1
안녕하세요, 먼저 좋은 강의 제공해 주셔서 감사하게 잘 듣고 있다는 감사 말씀 드리고 싶습니다.
질문 사항은,
수업 중 정의하신 lstm 클래스의 forward 함수를 아래와 같이 정의 하셨는데요,
class LSTM(torch.nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim, num_layers, n_classes) -> None:
super(LSTM, self).__init__()
self.vocab_size = vocab_size
self.embedding_dim = embedding_dim
self.embedding = torch.nn.Embedding(vocab_size, embedding_dim)
self.lstm = torch.nn.LSTM(input_size=embedding_dim,
hidden_size=hidden_dim,
num_layers=num_layers,
batch_first=True,
dropout=0.2)
self.fc = torch.nn.Linear(in_features=hidden_dim, out_features=num_classes)
self.sigmoid = torch.nn.Sigmoid()
def forward(self, x):
x = self.embedding(x)
x, (h_n, c_n) = self.lstm(x)
x = torch.sum(h_n, dim=0)
x = self.fc(x)
return x
forward 함수의 마지막 부분에서 fc를 통과한 x를 self.sigmod 함수에 통과 시키지 않고 return 하여도 되는건지 궁금합니다.
답변 2
2
안녕하세요, 인프런 AI 인턴입니다.
forward 함수에서 fc
를 통과한 후 x
를 self.sigmoid
함수에 통과시키지 않고 return하는 것이 적합한지 여부는 해당 네트워크가 해결하고자 하는 문제의 종류와 네트워크의 마지막 출력층에 필요한 activation 함수에 따라 달라집니다.
만약 문제가 이진 분류(Binary Classification) 문제라면, sigmoid
함수를 사용하여 출력층에서의 값들을 0과 1 사이의 확률값으로 변환하는 것이 일반적입니다. 이렇게 하면 모델이 어떤 클래스에 속할 확률을 나타내게 되며, 이를 통해 최종 분류를 할 수 있습니다.
하지만, 여러분이 구현하신 LSTM
모델의 forward
함수에서 self.sigmoid
함수를 사용하지 않은 채로 return
을 하셨다면, 이는 마지막 레이어에서 활성화 함수를 적용하지 않겠다는 의미가 됩니다. 이 경우는 모델이 다중 클래스 분류(Multi-Class Classification)를 수행하고 있거나, 출력층에 어떤 특별한 활성화 함수를 적용하기보다는 raw output을 원하는 경우일 수 있습니다.
결론적으로, sigmoid
함수를 사용할지 여부는 문제의 성격과 모델 설계 의도에 따라 결정됩니다. 따라서 이진 분류 문제를 다루고 있고, 마지막에 확률값을 얻고 싶다면 sigmoid
함수를 적용해야 합니다. 그렇지 않고 다른 의도가 있다면 생략할 수도 있습니다.
0
안녕하세요 변정현입니다!
먼저 질문에 대한 답변이 늦어진점 양해 부탁드립니다.
좋은 질문 감사합니다!
제가 Sigmoid을 취하지 않은 이유는 torch.nn.LSTM 에서는 이미 output h_t은 sigmoid 함수의 값 o_t와 hyperbolic tangent 함수의 값 tanh(c_t)가 곱해졌기에, h_t의 각 요소는 -1 에서 1 사이의 값을 가집니다!
따라서 h_t 혹은 h_t의 합에 sigmoid 값을 다시 취하게 되면 해당 값이 너무 작아지게 되므로 모델의 학습이 느려지는 문제가 발생합니다.