주제 설명
Spam data를 바탕으로 이를 spam인지 spam이 아닌지 판별을 하는 모델을 개발하였습니다. 해당 모델은 LSTM을 선정하여 진행하였습니다. LSTM(Long SHor-Term Memory)는 순환 신경망(recureent natural network, RNN)의 한 종류로 text데이터와 같은 sequence 데이터를 처리하는데 특히 유용한 알고리즘입니다. 이러한 이유로 spam 데이터를 선정하였으며, 해당 보고서에서는 LSTM을 이용하여 스팸 메일을 식별하는 문제를 다룰 것 입니다.
데이터 설명
이 프로젝트에서 사용된 데이터는 스팸과 스팸이 아닌 일반 메일로 레이블링된 이메일 데이터입니다. 데이터셋은 이메일의 본문 텍스트와 해당 이메일이 스팸인지 스팸이 아닌지를 나타내는 레이블로 구성되어있습니다. 데이터셋은 학습용과 테스트용으로 나눠져 있으며, Tokenizer를 사용하여 텍스트 데이터를 숫자 시퀀스로 변환합니다.
- 주어진 데이터셋을 불러온 후, ‘Tokenizer’를 사용하여 텍스트 데이터를 숫자 시퀀스로 변환합니다.
- 변환된 시퀀스는 ‘pad_sequences’를 사용하여 길이를 맞춰줍니다.
문제 설명
이 문제에서는 주어진 데이터셋을 사용하여 LSTM 모델을 학습시키고, 스팸인지 아닌지를 분류하는 문제를 해결합니다. 데이터셋을 불러오고 전처리한 후, LSTM 모델을 정의하고 학습을 진행합니다. 학습된 모델은 테스트 데이터에 적용하여 예측을 수행하고, 임계값을 기준으로 스팸인지 아닌지를 판별합니다.
작동원리
LSTM은 숫자 신경망의 한 종류로, 순차적인 데이터의 특성을 이해하고 기억하는 능력이 강화된 알고리즘입니다. LSTM은 입력 데이터의 임베딩, LSTM레이어, 밀집 레이어로 구성되어 있으며, 입력 시;퀀스를 처리하고 마지막 출력을 이용하여 스팸 여부를 예측합니다.
모델 구성은 다음과 같습니다.
- CustomLSTM 클래스는 LSTM 레이어를 직접 구현한 클래스입니다.
- ‘Net’클래스는 전체 모델을 정의하는 클래스입니다.
모델학습은 다음과 같습니다.
- 학습된 데이터를 ‘DataLoader’로 불러옵니다.
- ‘BCELoss’를 사용하여 이진 분류를 위한 손실 함수를 정의합니다.
- ‘Adam’ 옵티마이저를 사용하여 모델 파라미터를 업데이트합니다.
- 각 에폭(epoch)마다 학습 데이터로 모델을 학습 시킵니다.
결과분석
- 각 에폭(epoch)마다 손실값(loss)를 저장하고, 이를 시각화하여 학습 과정을 모니터링합니다.
- 테스트 데이터에 대해 학습된 모델을 사용하여 예측을 수행합니다.
- 예측 결과를 임의로 설정한 임계값(threshold)을 기준으로 스팸인지 아닌지로 분류하고, 메세지와 함께 결과를 출력합니다.
코드 설명
GPU를 사용할 수 있는 경우 GPU, 그렇지 않은 경우 CPU로 장치를 설정하였습니다.
데이터는 Kaggle에서 spam classifier dataset을 가져왔습니다.
텍스트 데이터를 숫자 시퀀스로 변환하고 패딩하는 이유는 다음과 같습니다.
신경망 모델은 숫자형 데이터를 입력으로 받아들이기 때문에, 이를 숫자로 변환해줍니다. Toknizer는 텍스트를 토큰화하여 각 단어를 고유한 숫자로 매핑합니다. 따라서 텍스트를 숫자 시퀀스로 변환함으로써 모델이 텍스 데이터를 이해하고 처리할 수 있도록 합니다.
pad_sequences를 통해 서로 다른 길이의 시퀀스를 동일한 길이로 맞춰줍니다. 이를 통해 모델이 일관된 크기의 입력을 받을 수 있게 되고, 배치 처리 등의 연산이 가능해집니다. 임의로 최대 단어 개수(max_feautures)를 설정하고 토큰화를 진행한 후 , 시퀀스 길이를 맞추는 과정은 텍스트 데이터를 신경망 모델에 적용하기 위한 필수적인 전처리 단계입니다.
해당 코드는 ClassLSTM에 대한 코드입니다. 이때 ‘input_sz’는 입력 차원의 크기, ‘hidden_sz’ 는 은닉 상태의 크기를 의미합니다. 이 메서드에서는 LSTM의 가중치 편향을 정의하기 위한 ‘W’,’U’,’bias’ 파라미터를 초기화합니다.
init_weight함수는 가중치를 초기화 하는 함수 입니다. 1을 hidden_size의 제곱근으로 나눠 이를 stdv로 설정한 후 가중치는 -stdv부터 stdv사이의 균등분포로 초기화됩니다. 해당 코드에서는 Xavier 초기화 방법을 사용하여 가중치를 초기화하는데, 이는 해당층의 입력과 출력 차원에 따라 적절한 분산을 가진 초기값을 부여합니다.
이후 foward함수에서는 LSTM의 순방향 전파를 구현합니다. 입력데이터의 ‘x’와 초기상태인 init_states를 받습니다. ‘hidden_seq’리스트에 시퀀스의 각 타임스텝에 대한 은닉 상태를 저장합니다. ‘gates’는 입력과 은닉 상태의 선형 변환 결과를 계산합니다. ‘i_t’, ‘f_t’ , ‘g_t’, ‘o_t’는 각각 입력게이터, 망각 게이트, 셀 게이트, 출력 게이트의 활성화 값을 계산합니다. 셀 상태인 ‘c_t’는 망각 게이트와 입력 게이트를 이용하여 업데이트 됩니다.
은닉상태는 ‘h_t’는 출력 게이트와 셀 상태의 tanh 값을 곱하여 계산됩니다.
‘hidden_seq’는 시퀀스 차원을 첫번째 축으로 변경하고 반환합니다.
따라서 ‘CustomLSTM’클래스는 Xavier초기화를 적용한 LSTM 레이어로, 입력 시퀀스에 대해 순전파 연산을 수행하며 시퀀스의 각 지점에서 은닉 상태를 계산합니다. 이는 LSTM 레이어의 핵심 동작을 구현하고 있습니다.
Net 클래스는 전체 네트워크 구조를 정의합니다. ‘ nn.Embedding’은 임베딩 레이어로, 단어를 고정된 길이의 벡터로 변환합니다. ‘CustomLSTM’을 사용하여 LSTM레이어로 정의
하고 , 마지막 시퀀스의 은닉 상태만 추출하여 ‘Linear’ 레이어를 통과시킵니다. 최종 출력은 Sigmoid 함수를 거쳐 확률로 변환됩니다.
이후 ‘Net’클래스의 인스턴스를 생성하고, 손실함수로 이진 교차 엔트로피 손실(‘nn.BCELoos’를 사용합니다. 옵티마이저로 Adam을 선택하고, 모델의 파라미터를 최적화합니다.
이후 Dataloader를 통해 data를 batch단위로 데이터를 로드합니다. 이후 주어진 epoch만큼 반복하며 데이터 로더에서 배취 단위로 데이터와 레이블을 가져옵니다. 해당 코드는 LSTM을 사용한 스팸 메세지 분류를 위한 모델을 정의하며, 학습을 진행하는 장면입니다.
'AI > AI Project' 카테고리의 다른 글
covid 데이터 선형회귀 (0) | 2023.09.13 |
---|---|
Spark MLLib Titanic Data - MulticlassClassification (0) | 2023.09.12 |
Yolov5모델로 쓰레기 탐지하기 (0) | 2023.09.12 |
Transformer로 spam 데이터 판별 (0) | 2023.09.10 |
한국어 리뷰 감정 사전 구축하기 using soynlp and konlyp (0) | 2023.02.11 |