로그 분석을 통한 보안 위험도 예측 AI 경진대회

최정명 팀 | Private 4th (0.89427) | CNNs+BiLSTM

2021.05.15 16:28 3,575 Views language

최정명 팀 | Private 4th (0.89427) | CNNs+BiLSTM

안녕하세요. 코드에 대한 내용은 주피터에 적어두었습니다.

재현성을 위해 seed 를 고정하였지만 완벽히 재현이 되진 않습니다. 특히 초반 vocab생성 과정에서 재실행을 할 때 마다 다른 vocab으로 생성이 되네요. 이유를 아시는분 알려주시면 감사합니다.

Code
로그인이 필요합니다
0 / 1000
최정명
2021.05.15 16:50

궁금한 것은 댓글로 적어주시면 답변 드리겠습니다!

크림우동
2021.05.15 22:06

모델 구조 중 질문사항이 한가지 있습니다.
임베딩 된 데이터를 1D conv에 집어넣기전에 movedim(x_, 1, 2)을 하신 이유가 무엇일까요?

최정명
2021.05.15 23:58

안녕하세요. 

모델에 입력되는 x의 shape는 (batch_size, sequence_length) 입니다.
embedding(x) 의 출력 shape은 (batch_size, sequence_length, embedding_dimension) 입니다.
conv의 입력으로는 (batch_size, embedding_dimension, sequence_length)가 입력되어 (batch_size, output_features, sequence_length)가 출력됩니다.

conv의 입력으로 넣기 위해 변환을 했습니다.

크림우동
2021.05.16 00:36

답변감사합니다. 죄송하지만 한가지 더 질문 드려도 괜찮을까요?
conv의 결과로 (batch_size, output_features, sequence_length)가 6개가 출력되어
torch.cat을 통해 (batch_size, output_features*6, Maxpool1d(sequence_length))가 됐는데
다시한번 더 movedim(tensor, 1, 2)를 진행하지 않고 Maxpool1d(sequence_length)를 lstm의 input_size로 넣으신 이유가 궁금합니다.

최정명
2021.05.16 03:42

저도 이 부분이 좀 의아했는데 다시 shape을 되돌리고 (batch_size, sequence_length, output_features*6)을 lstm의 input으로 넣고 훈련했을 때 훈련이 제대로 되지 않았습니다. ( loss가 줄어들지 않음)

self.lstm1 = nn.LSTM(input_size=output_features*6, hidden_size=32, bidirectional=True, num_layers=1, dropout=0.3)

이렇게 구성해서 사용했었는데 훈련이 제대로 되지 않았습니다.
어떤 이유에서인지는 모르겠네요. 다시 되돌리지 않고 sequence_length가 들어갔을 때 왜 잘 학습이 됐는지도 의문입니다.
보시고 추측되는 부분이 있을까요 ?..

그럼에도 불구하고 LSTM을 포함한 이유는 여러 커널 사이즈를 거친 Conv를 합치고 LSTM없이 output 까지 갔을 경우 제공된 level7에 대한 3개의 validation 데이터에서 각 class에 대한 예측 confidence가 한 class에 너무 높게 나왔습니다. 반대로 LSTM을 넣었을 때는 3개의 validation 데이터에서는 각 class에 대한 에측 confidence가 골고루 퍼져있었기 때문에 LSTM을 포함하여 학습하였습니다.




크림우동
2021.05.16 11:02

제 생각에는 (batch_size, sequence_length, output_features*6)을 lstm의 input으로 넣고 훈련했을때 성능이 안좋은 이유는
Lstm 레이어에 batch_first=True가 빠져있어 seq_len에 따른 데이터를 학습하는게 아니라 batch에 대해 학습이 진행됐기 때문이라 생각합니다.

그리고, 되돌리지 않고 성능이 잘 나온 이유는 잘 모르겠습니다.

친절한 답변 감사드리며, 수상 축하드립니다.

감사합니다.

최정명
2021.05.16 16:09

실험할 때 lstm layer에  batch_first=True로 파라미터를 넣고  (batch_size, sequence_length, output_features) 를 입력으로,
batch_first=False (Default)로 두고 (sequence_length, batch_size, output_features)를 입력으로
두 번 다 해보았지만 학습이 제대로 이루어 지지 않았습니다.

왜 훈련이 정상적으로 되고 반대로 정상적으로 되지 않았는지 이후 댓글을 보시는 분들 중 아시는 분이 있다면 알려주셨으면 좋겠네요 ㅎㅎ

제 모델은 결국 운 좋게.. 성능을 잘 내는 모델이 만들어진 것 같습니다.

질문 주셔서 감사합니다!