목록전체 글 (302)
elevne's Study Note

Transformer 모델은 Seq2Seq와 다르게 RNN을 사용하지 않고 Attention만 사용하기 때문에 단어 입력을 순차적으로 하나하나 받지 않고 한 번에 모든 단어를 입력으로 받는다. 순차적으로 받지 않게되면 단어의 위치 정보를 따로 입력해줄 필요가 있을 것이다. 이를 위해 사용하는 기법이 바로 Positional Encoding이다. Positional Encoding에서는 다음과 같은 함수가 사용된다. 위 함수에서는 Sin, Cos 함수를 사용하게 되는데 이는 위치 벡터값이 -1과 1사이의 값을 갖게끔 한다. 코드로는 다음과 같이 작성해볼 수 있다. def position(pos, i, dim): result = pos / np.power(10000, (2 * i) / np.float32(d..
이전 글에서 Index 생성 과정을 마쳤으니 이제 검색을 위한 코드를 작성해줄 차례이다. 다음과 같은 함수를 작성해주었다. public static SearchRequest listSearch(final String searchTerm){ try { final QueryBuilder query1 = QueryBuilders.matchQuery("field1", searchTerm).fuzziness(Fuzziness.AUTO); final QueryBuilder query2 = QueryBuilders.matchQuery("field2", searchTerm).fuzziness(Fuzziness.AUTO); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()..

Java Spring 프레임워크에서 Elasticsearch를 사용하여 검색 API를 구축하고자 하였다. 우선 Spring Initializr에서 다음 Dependencies를 추가해주고 Gradle Project를 생성해주었다. 프로젝트 폴더를 열고 필요한 파일들을 Gradle에서 자동으로 다운로드 되게끔 한다. application.properties 파일에 다음과 같이 작성해주었다. elasticsearch.url=localhost:9200 logging.level.org.springframework.data.elasticsearch.client.WIRE=TRACE Elasticsearch의 default 포트 값인 9200을 그대로 사용하였기에 위와 같이 적어주었고, 밑의 logging.level..

Transformer 모델에서는 Self Attention Layer 이후 Feed-Forward Neural Network를 거치게된다. 이는 Position-wise Feedforward Network라고도 표현되며 한 문장에 있는 단어토큰 벡터 각각에 대해 연산하는 네트워크이다. Transformer 모델은 Encoder과 Decoder로 분리되어 있긴 하지만 각각 Encoder, Decoder 안에 Hidde Layer을 쌓을 수 있다고 한다. Self Attention을 거치고 나온 결과값들을 FFN의 입력값으로 사용하여 Linear Layer(Dense)를 거치게 하는 것이다. 논문에서는 위 은닉층의 크기를 2048로 지정하여 사용하였고, 모델의 복잡도가 올라가는 것을 고려하여 Skip Con..

Elasticsearch는 검색엔진의 시초라고 불리는 루씬 기반의 오픈소스 검색엔진이다. 다양한 서치엔진이 있지만 Elasticsearch가 현재 각종 검색엔진 분야에서 지배적인 위치에 있다고 한다. NoSQL의 일종으로 분류할 수도 있고 MongoDB처럼 대용량 스토리지로 활용이 가능하긴 하지만 DB자체로 쓰기에는 안정성이 떨어진다고 한다. 많은 데이터를 다루는 어플리케이션을 구상 중이라면 Elastic Stack을 쓰는 것을 고려해볼 수 있다. Elastic Stack은 Beats, Logstash, Elasticsearch, Kibana로 이루어진 세트를 뜻한다. 위 도구들을 활용해서 어떠한 소스로부터도 어떠한 형식으로든 데이터를 불러오고 분석, 시각화 등을 준 실시간으로 진행할 수 있다. Elas..

Seq2Seq는 이전 글에서 언급한 것처럼 모델의 핵심적인 역할을 하는 Context Vector가 일종의 Bottle Neck 작용을 하여 성능적인 한계가 있는 모델이다. 이에 대한 대안으로 Transformer이라는 모델이 등장하였고 이는 현재에도 널리 사용되고 있는 모델이라고 한다. Transformer는 RNN을 사용하지 않지만, 이 또한 Seq2Seq와 마찬가지로 Encoder과 Decoder이 있다. Encoder에서 입력한 문장에 대한 정보와 Decoder에 입력한 문장 정보를 조합해서 Decoder 문장 다음에 나올 단어를 예측한다고 한다. Transformer에서는 Self-Attention이라는 것이 사용된다. Self-Attention이란 문장에서 각 단어 간 얼마나 관계가 있는지를 ..

앞서 글에서 미리 만들어둔 전처리 함수를 데이터에 적용하여 학습용 데이터 전처리는 완료되었다. 그 후 모델을 구성해보았다. class Encoder(tf.keras.layers.Layer): def __init__(self, wordDicSize, embeddingDim, encDim, batchSize): super(Encoder, self).__init__() self.batchSize = batchSize self.encDim = encDim self.wordDicSize = wordDicSize self.embeddingDim = embeddingDim self.embedding = tf.keras.layers.Embedding(self.wordDicSize, self.embeddingDim) s..

Github에 있는 한국어 Chatbot Data를 활용하여 Seq2Seq with Attention 모델을 실습해보고자 하였다. 데이터는 아래 링크에서 다운 받을 수 있었다. 링크: https://github.com/songys/Chatbot_data/blob/master/ChatbotData.csv 데이터는 아래와 같은 형식의 csv 파일이다. 본격적으로 시작하기 전, 이전 글에서 했던 것과 마찬가지로 Konlpy 라이브러리를 사용하여 형태소 분석을 진행해준 뒤, 각 문장의 길이를 형태소 개수를 기준으로 알아보았다. 길이의 분포도를 matplotlib을 사용하여 간단하게 그래프로 표현해보고자 하였다. 또, numpy의 간단한 함수들을(max, min, median) 통해 기초 통계값들을 확인해보았다...