세로형
Recent Posts
Recent Comments
Link
04-19 00:01
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

[9주차] 새벽 5시 캐글(kaggle) 필사하기 - 자연어처리(nlp) toxic 데이터 Attention 본문

kaggle(캐글)

[9주차] 새벽 5시 캐글(kaggle) 필사하기 - 자연어처리(nlp) toxic 데이터 Attention

이수진의 블로그 2019. 3. 18. 14:18

이전에 캐글(kaggle) nlp인 toxic 데이터를 가지고 필사를 했습니다

https://lsjsj92.tistory.com/448


이번에도 마찬가지로 toxic 데이터를 가지고 캐글 커널을 필사합니다.

기존에 했던 것과 같습니다. 하지만 어텐션 메커니즘이 추가된 코드이고 glove 데이터를 이용해서 모델 weight를 제공해줍니다.

특히 glove 데이터를 추가해서 word embedding을 하는 방법은 정말 많이 사용해서 이번 기회에 정리하고자 합니다.



언제나 그렇듯이 필요한 라이브러리르 불러옵니다

keras를 사용했고 모델과 전처리에 필요한 Tokenizer 및 LSTM, Embedding, Dropout 등을 가지고 옵니다

그리고 이번 모델에서는 Attention을 class로 만들어서 사용하기 때문에 keras의 backend가 필요합니다.

그리고 keras에 있는 initializers, regularizers등이 필요하고 이 커널의 특이점은 배치 정규화(batch normalization)을 사용합니다



먼저 어텐션(Attention) layer부터 만들어줍니다.

어텐션 메커니즘을 기반으로 만든 클래스입니다.

이 클래스는 keras의 Layer를 상속합니다



mask 하는 것과 call하는 것 등의 메소드를 같이 만들어주면서 어텐션 메커니즘이 작동하게 합니다



위는 기본 설정 변수들입니다.

특이한 것이 glove.840B.300d.txt 파일이 있습니다.

glove라는 것은 단어를 임베딩 시킨 데이터입니다

구글에 그냥 glove 치시면 다운로드 받으실 수 있습니다



한 번 glove를 불러서 출력을 해보면

CentOS라는 단어가 있는데 저 단어에 해당되는 벡터 값이 숫자로 쭉 이어져 있음을 볼 수 있습니다!

저 값들을 사용하는 것이죠

이렇게 사용하게 되면 단어가 미리 임베딩이 되어 있으니 Embedding layer에서 아예 맨 처음부터 하는 것보다 더 좋은 성능을

기대할 수 있습니다. 



저 glove 데이터를 가지고 dict 구조를 만들어줍니다.

파일을 읽어오면서 key에 word가 들어가고 value에 coef 값이 들어가게 합니다


그리고 밑에 보시면 정규표현식을 이용해서 특수문자도 제거하는 작업을 진행합니다



데이터를 불러가지고 올 때 데이터를 전처리하는 과정을 하나의 함수로 만들었습니다.

이 함수를 가지고 데이터를 소문자로 바꾸고, 특수문자 제거를 합니다.

그리고 만약 True로 설정되어 있다면 stopwords도 제거합니다



그래서 앞서 불러온 데이터를 하나하나 호출하면서 함수에다가 text를 넣어줍니다.

그리고 전처리된 결과가 반환되어 list에 append됩니다

이후 Tokenizer를 이용해서 단어를 잘라주고

길이만큼 padding 시켜줍니다



이제 embedding matrix를 만드는데요. np.zeros를 이용해서 깡통 list를 만들어줍니다.

그리고 tokenizer 과정에서 나온 word_index를 가지고 아까 glove 데이터랑 비교를 합니다.

또한, 만약 해당 단어가 가지고 있는 숫자 값이 MAX_NM_WORDS보다 크다면 넘어갑니다.

즉, MAX_NM_WORDS 까지의 단어만 메트릭스에 넣어줍니다!

만약 해당 단어가 glove에 있다면 embedding_matrix[i] = embedding_vector를 통해 넣어줍니다

embedding_vector는 embeddings_index.get(word)를 통해 glove에서 가져온 데이터입니다



그리고 모델을 만들어줍니다.

여기서 보셔야할 것은 Embedding layer를 만드는데 trainable = False로 되어 있습니다.

그리고 weights = [embedding_matrix]를 선언해줘서 해당 matrix를 이용하도록 합니다.

그리고 LSTM 레이어를 통과한 뒤 Attention layer를 통과해서 어텐션 메커니즘을 적용시켜줍니다


끝에는 BatchNormalization을 넣어줘서 배치 정규화를 해줍니다

(별 효과가 있는지는 모르겠습니다)




그리고 마찬가지로 fit을 이용해서 훈련시켜주면 끝!


이번 커널은 다른 것은 몰라도 Attention 매커니즘 적용과 glove를 적용시키는 방법에 대해서 알아보았습니다

반응형
그리드형
Comments