작성자: 15기 조우영
https://kubig-2022-2.tistory.com/107
Original LSTM에서 사용되는 tanh의 변형인 squash activation function을 만들어주었다.
아래 Vanilla LSTM에서도 똑같이 적용될 Weight 계산법에 대해서 간단히 짚고 넘어가자.
왼쪽 식이 조금 더 익숙하겠지만 똑같은 연산을 오른쪽의 형식을 취해 할 시에, 6번 할 matrix multiplication을 2번으로 줄여주기 때문에 연산의 속도면에서 훨씬 유리해진다.
Forget gate가 추가되는 경우에는 왼쪽의 경우 matrix multiplication을 8번 해야하지만, 오른쪽의 형식을 취하면 똑같이 2번으로 가능하기 때문에 오른쪽의 방법을 사용한다.
위의 Original LSTM에 forget_gate 추가하거나, squash function을 tanh function으로 바꾸어주는 등 몇 가지 연산만 수정, 추가하여 얻어낼 수 있었다.
Kaggle에서 다운로드 할 수 있는 뉴욕 타임즈와 관련된 데이터로, 아래의 링크에서 ArticlesApril2018.csv를 다운로드해 기사의 제목을 사용하였다.
https://www.kaggle.com/aashita/nyt-comments
위의 데이터를 훈련시켜 LSTM을 통해 텍스트 생성하기
4번째, 5번째 기사 제목이 Unknown인데 이는 학습에 있어 불필요하기 때문에 삭제해주겠다.
제거 후의 결과는 위와 같다.
기사 제목에 존재하는 구두점들과, 기사 제목이 전부 소문자로 된 제목, 대문자도 포함된 제목 등 다양하기 때문에 전부 소문자로 바꾸어주었다.
그 이후 텐서플로우의 토크나이저를 이용하여 기사 제목들에 대한 토큰화를 진행하였다.
단어 집합에 대해 정수 인코딩을 진행하고 하나의 문장을 여러 줄로 분해하여 훈련 데이터를 구성했다.
* 데이터 구조:
단어 생성 시에 단어를 위와 같은 구조로 예측하기 때문에 본래의 기사 제목을 단어 단위로 분해하여 훈련 데이터를 구성한 것이다.
후에 예측이 끝나면 어떤 정수가 어떤 단어를 의미하는지 알아야하기 때문에 인덱스로부터 단어를 찾는 index_to_word를 만들었다.
자연어 처리를 하다보면 각 문장(또는 문서)은 서로 길이가 다른 경우가 많다. 그런데 기계는 길이가 전부 동일한 문서들에 대해서는 하나의 행렬로 보고, 한꺼번에 묶어서 처리할 수 있기 때문에, 병렬 연산을 위해서 여러 문장의 길이를 임의로 동일하게 맞춰준다.
위에서 살펴본 데이터 구조에 의거, 맨 오른쪽 단어를 label로 분리해주었다.
하이퍼파라미터인 임베딩 벡터의 차원은 10, 은닉 상태의 크기는 128이다.
해당 모델은 마지막 시점에서 모든 가능한 단어 중 하나의 단어를 예측하는 다중 클래스 분류 문제를 수행하는 모델이기 때문에 활성화 함수로 Softmax 함수를 사용하고, loss function으로는 Cross Entropy 함수를 사용하여 200 epoch를 수행합니다.
모델, 토크나이저, 시작하고자 하는 단어, 반복 횟수을 파라미터로 받아 텍스트를 생성하는 sentence_generation 함수를 정의해주었다.
과정에 대해서 간단히 살펴보자면 우선 토큰화, 패딩 등을 진행해 모델에 입력하여 예측을 해주고, 그 중 확률이 가장 큰 하나를 예측값으로 지정해준다. 그리고 이를 시작하고자 하는 단어, current_word와 이어주고, 이를 입력받은 반복횟수 만큼 반복해준다.
current_word를 how, 반복 횟수를 15로 했을 때 얻은 결과는 다음과 같다.
참고자료:
https://towardsdatascience.com/building-a-lstm-by-hand-on-pytorch-59c02a4ec091
댓글 영역