기본 콘텐츠로 건너뛰기

라벨이 NLP인 게시물 표시

워드임베딩(Word Embedding)

단어를 임베딩 층의 입력으로 사용하기 위해서 입력 시퀀스의 각 단어들은 모두 정수 인코딩이 되어있어야 합니다. 워드임베딩 변환 과정 어떤 단어 → 단어에 부여된 고유한 정수값 → 임베딩 층 통과 → 밀집 벡터 임베딩 층은 입력 정수에 대해 밀집 벡터(dense vector)로 맵핑 하고 이 밀집 벡터는 인공 신경망의 학습 과정에서 가중치가 학습되는 것과 같은 방식으로 훈련 됩니다. 그리고 이 밀집 벡터를 임베딩 벡터 라고 부릅니다. 정수를 밀집 벡터 또는 임베딩 벡터로 맵핑하는 이유는 무엇일까요? 임베딩 테이블은 단어 집합의 크기만큼 행을 가지므로 모든 단어는 고유한 임베딩 벡터를 가집니다. 즉, 단어의 정수 인덱스는 임베딩 테이블에 대해서 Lookup을 수행하므로 고유한 임베딩 벡터를 결과 를 냅니다. 위의 그림에서는 임베딩 벡터의 차원이 4로 설정되어져 있습니다. 그리고 단어 great은 정수 인코딩 과정에서 1,918의 정수로 인코딩이 되었고 그에 따라 단어 집합의 크기만큼의 행을 가지는 테이블에서 인덱스 1,918번에 위치한 행을 단어 great의 임베딩 벡터로 사용합니다. 이 임베딩 벡터는 모델의 입력이 되고, 역전파 과정에서 단어 great의 임베딩 벡터값이 학습됩니다. 파이토치에서는 임베딩 벡터를 사용하는 방법이 크게 두 가지가 있습니다.  임베딩 층(embedding layer)을 만들어 훈련 데이터로부터 처음부터 임베딩 벡터를 학습하는 방법 사전에 훈련된 임베딩 벡터(pre-trained word embedding)들을 가져와 사용하는 방법 관련 소스는 다음 GIT에서 참고할 수 있습니다. Reference Source https://github.com/ynebula/NLP/blob/master/Word_Embedding/WordEmbedding.ipynb 감사합니다. Reference https://wikidocs.net/64779 https://wikidocs.net/64904

[워드임베딩-Word Embedding]워드투벡터(Word2Vec)

분산 표현(Distributed Representation) 희소 표현(sparse representation) - 원-핫 벡터 표현 방법은 각 단어간 유사성을 표현할 수 없다는 단점이 있습니다. 이를 위한 대안으로 단어의 '의미'를 다차원 공간에 벡터화하는  분산 표현(distributed representation) 이 이용됩니다. 그리고 이렇게 분산 표현을 이용하여 단어의 유사도를 벡터화하는 작업은 워드 임베딩(embedding) 작업에 속하기 때문에 임베딩 벡터(embedding vector) 라고 하며, 저차원을 가지므로 바로 앞의 챕터에서 배운 밀집 벡터(dense vector) 에도 속합니다.  분산 표현(distributed representation) 방법은 기본적으로 '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'라는 분포 가설(distributional hypothesis) 이라는 가정 하에 만들어진 표현 방법입니다. 강아지란 단어는 귀엽다, 예쁘다, 애교 등의 단어가 주로 함께 등장하는데 분포 가설에 따라서 저런 내용을 가진 텍스트를 벡터화한다면 저 단어들은 의미적으로 가까운 단어가 됩니다.  Example)  Sparse 표현 강아지 = [ 0 0 0 0 1 0 0 0 0 0 0 0 ... 중략 ... 0] Dense 표현  강아지 = [0.2 0.3 0.5 0.7 0.2 ... 중략 ... 0.2] 즉, 희소 표현은 고차원에 각 차원이 분리된 표현 방법이었다면, 분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산하여 표현합니다. 이런 표현 방법을 사용하면 단어 간 유사도를 계산할 수 있습니다. Word2Vec에는 CBOW(Continuous Bag of Words)와 Skip-Gram 두 가지 방식이 있습니다. CBOW(Continuous Bag of Words) CBOW는 주변에 있는 단어들을 가지고, 중간에 있는 단어들을 예측하는 방법입니다. 예문 : "The fat ca...

[Deep Learning-딥러닝]Transformer - Attention is all you need

Transformer - Attention is all you need 2017 년에 발명 된 Transformer는 전체 텍스트 입력을 동시에 처리하여 단어 (또는 sub-words) 간의 컨텍스트 관계(contextual relations)를 학습하는 어텐션 메커니즘을 사용한 모델입니다.  트랜스포머는 인코더, 디코더 두 부분으로 구성된다. 인코더는 인풋 텍스트와 벡터의 레터럴 표현읽는다(lateral representation of it (e.g. a vector for each word)). 디코더는 인코더 입력으로으로 부터 변화된 텍스트를 출력한다. Recurrent model은 순차적인 특성이 유지되는 장점이 있었음에도, long-term dependency problem이라는 단점을 가지고 있다. 이와 달리 transformer는 recurrence를 사용하지 않고,  attention mechanism만을 이용해 input과 output의 dependency를 알아낸다. Transformer는 attention만 사용해서 연산 량은 매우 줄었음에도 성능이 매우 높게 나오는 모델이다. Attention is All you need 논문에서, transformer는 6개의 encoder와 6개의 decoder로 구성되어 있다고 설명한다.  Encoder는 multi-head self-attention과 fully connected feed-forward network 두 개로 구성되어 있고, 각 layer에 residual connection과 layer normalization을 적용한다.  Decoder는 세 개의 sub-layers로 구성되어 있다. Illegal masking 방식을 적용한 multi-head self-attention과 encoder의 output을 K, V 로 전달받아 multi-head self-attention을 수행하는 layer와 fully connected feed-forward ...

[Deep Learning-딥러닝]Attention 신경망 - Seq2seq

Attention 기법 Attention Value는  Gradient Vanishing 문제를 보완하기 위한 방법으로, Encoder의 hidden state를 모아서 Decoder에서 이용하는 방법입니다.  Background Sequence-to-sequence model Seq2seq 모델은 번역 문제를 학습하기 위해서 많이 사용되는 RNN 구조 SOS(start of sequence), EOS(End of sequence)는 문장의 시작과 끝을 알리는 예약어 Encoder에서는 데이터가 단어 별로 입력되고, RNN 사이에 hidden state가 전달됨 Context에 Encoder의 모든 feature vector를 압축해서 담아 Decoder로 전달 Gradient vanishing 문제 발생 Context에 Encoder의 모든 정보를 담는데는 한계가 있음 입출력 연관 관계가 너무 멀리 떨어져 있으면 기울기 소실이 발생하여 학습이 잘 안됨 예) 번역에서 어순이 반대인 경우 Attention 구성 요소 Query: 질의, 찾고자 하는 대상/정보 Key: 키, 저장된 데이터를 찾고자 할 때 참조하는 값 Value: 값, 저장된 데이터 Dictionary: Key-Value Pair로 이루어진 집합 Querying Query를 날리면 Key를 비교해서 Value를 반환하는 과정을 말합니다. Attention mechanism Query를 날리면 Q에 대해 어떤 K가 유사한지 비교 유사도를 반영하여 V들을 합성한 것이 Attention Value Q와 K는 dimension이 n인 실수 Compare 함수는 Dot-Product(벡터의 내적 - Inner Product)으로 유사도 Normalize를 위해 Compare 결과에 Softmax 수행 Aggregation은 weighted sum을 많이 사용하며, 비슷할수록 더 많은 비중으로 출력됨 Attention - Seq2seq Seq2seq에서는 Encoder의 hidden layer...

[Deep Learning-딥러닝] GRU(Gated Recurrent Unit)

GRU(Gated Recurrent Unit) - LSTM의 간소화 LSTM의 연산 복잡도를 간소화한 GRU의 gate는 다음과 같습니다. Reset Gate(r): 현재 입력을 얼마나 사용할지 Forget Gate(z): 이전 hidden state 얼마나 잊을지 Hidden Gate(g, h): LSTM의 Cell state와 Hidden state의 역할을 모두 수행 Reset Gate Reset gate는 이전 hidden state와 현재 입력값을 이용해 생성되며, 활성화 함수는 sigmoid를 사용합니다. reset gate의 결과는 이후 g gate를 연산할 때 이전 hidden state를 조정합니다. 예) 입력값 ⓐ 나는 사과가 좋아합니다. ⓑ 너는 과일을 싫어합니다. Q) 나는 어떤 과일을 먹고 싶을까요? => 질문을 위해 ⓐ의 정보가 필요합니다. Reset gate는 ⓐ와 ⓑ를 구분하는 기능을 합니다. 수식 설명  이전 hidden state와 현재 입력값을 이용해 reset gate 생성 reset gate 결과는 현재 입력값을 조정하는데 사용 Forget Gate GRU의 Forget gate는 LSTM의 Forget gate와 Output gate의 역할 겸합니다.  Forget gate는 이전 hidden state와 현재 입력값을 이용해 생성되며, 활성화 함수는 sigmoid를 사용합니다. 이전 hidden state에 직접 곱해서 이전 hidden state의 특징을 제거 합니다.  이전 hidden state와 현재 입력값을 이용해 forget gate 생성 forget gate의 결과는 hidden state에서 이전 hidden state와 g의 값을 조정해 출력값을 내는데 사용 Hidden state GRU의 Hidden gate는 LSTM의 Cell state와 Hidden state의 역할을 모두 수행합니다. 즉....  GRU의 Hidden gate는 Reset gate, For...

[Deep Learning-딥러닝]SRU(Simple Recurrent Unit)

SRU(Simple Recurrent Unit) SRU는 병렬화와 시퀀스 모델링이 가능한 light recurrence한 unit입니다. 기존 RNN Architecture(RNN, LSTM, GRU)는 previous time step에 대한 의존성 때문에 병렬처리가 불가능하여 학습 속도가 느렸습니다. 이런 단점을 SRU는 높은 병렬화 및 시퀀스 모델링 기능을 제공하여 학습시간 단축시켰습니다. SRU는 분류, 질의응답에서 cuDNN-optimized LSTM보다 5~9배 빠른 속도를 보였고, LSTM과 convolutional models보다 좋은 성능을 보였습니다. 특징 SRU의 state연산은 time-dependent이지만, 각 state 차원은 independent입니다. 이것은 hidden dimension과 time steps에서 병렬화 연산하는 CUDA-level optimization으로 병렬 처리 가능합니다. SRU는 convolutions을 더 많은 recurrent 연결로 대체하였습니다(QRNN과 KNN과 같이). 이건 적은 연산으로 모델링을 유지합니다. SRU는 highway connection방법과 deep architecture에서 gradient전파에 맞게 조정된 매개 변수 초기화 체계를 사용하여 deep recurrent models training을 개선합니다. 연산방법 SRU는 forget gate, state, reset gate, hidden state 연산을 수행합니다. Light recurrence (1, 2번 수식) Forget gate: 정보 흐름을 제어 State: 이전 state와 현재 입력을 forget gate에 따라 조정 특징 - 문자열 정보를 위해 input x와 state c를 연산 - 이전 state에 영향을 받음 - 병렬처리를 위해 matrix multiplication 대신 point-wise multiplication 연산 수행 Highway network (3, 4번 수식) Hidden ...

Sentencepiece를 이용하여 Korean wiki data Vocab(단어집합) 만들기/생성

대학원 논문으로 XMLR을 이용하여 기계학습을  연구 중 입니다. 수치를 조금이라도 올리고 싶어 제공된 Vocab이 아닌 한글 위주의 Vocab을 만들어 학습 결과를 확인하기 위해 KorWiki를 이용해 Vocab을 만들어 보겠습니다. XMLR의 Vocab은 Sentencepiece로 생성됩니다. Sentencepiece를 Korean wiki data를 Vocab(단어집합)을 만들어 보겠습니다. 1. training data(Corpus) 수집  위키피디아는 정기적으로 덤프 파일로 릴리즈 한다. 다음 사이트에서 다운로드 할 수 있습니다. Korean wiki download site 메인화면: https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C 다운로드: https://dumps.wikimedia.org/kowiki/ 다운로드에 접속하면 날짜별로 리스트되어 있습니다. 안으로 들어가면 여러 파일이 있습니다. 메인화면에 들어가면 파일 용도를 확인할 수 있습니다. 내용은 다음과 같습니다. pages-articles.xml.bz2 - 일반 문서의 최신 버전만이 묶여 있고, 전체 편집 역사는 들어있지 않습니다. 대부분의 이용자는 이 파일을 이용하면 됩니다. pages-current.xml.bz2 - 모든 문서의 최신 버전이 묶여 있습니다. pages-full.xml.bz2/7z - 모든 문서(토론 포함)의 최신 버전이 묶여 있습니다. pages-meta-history.xml.bz2 - 모든 문서의 모든 편집 내역이 묶여 있습니다. pages-logging.xml.gz - 모든 문서와 사용자에 대한 행위 기록이 묶여 있습니다. abstract.xml.gz - 문서 요약이 묶여 있습니다. al...

SentencePiece 특징/기능 설명

SentencePiece는 신경망 기반 텍스트 생성 시스템에서 주로 사용 되는 unsupervised text 토큰화기 및 해독기로서(tokenizer and detokenizer) 신경 모델 학습 전에 어휘 크기(Vocab Size)가 미리 결정합니다. SentencePiece는 원시 문장(raw sentences)에서 직접 학습을 확장하여 subword 단위를 구현합니다(예: byte-pair-encoding(BPE) [Sennrich et al.] Punigram language model[Kudo.]). SentencePiece를 사용하면 언어 별 pre/postprocessing 의지하지 않는 end-to-end system을 만들 수 있습니다. (공식 Google 제품이 아닙니다.) Technical highlights  Purely data driven: SentencePiece는 문장에서 tokenization 및 detokenization 모델을 훈 련시킵니다. Pre-tokenization(Moses tokenizer/MeCab/KyTea)가 항상 필요한 것은 아닙니다.  Language independent: SentencePiece는 문자열을 Unicode characters처럼 취급합니다. 거기에 language-dependent logic은 없습니다. Multiple subword algorithms: BPE[Sennrich et al.]와 Unigram Language Model을 [Kudo.] 사용합니다. Subword regularization: SentencePiece는 subword regularization의 subword sampling을 구현합니다. Subword sampling은 NMT model의 robustness와 accuracy 향상에 도움을 줍니다. Fast and lightweight: Sementation 의 속도는 초당 약 50K 문장이며, memory footprin...

단어분리(Subword segmenation) 및 토큰나이져(Tokenizer) 방법론

기계가 훈련 단계에서 학습한 단어들의 집합을 단어 집합(vocabulary) 이라고 합니다. 단어집합은 텍스트의 모든 단어의 중복을 배제한 집합입니다. 그리고 테스트 단계에서 기계가 미처 배우지 못한 모르는 단어를 OOV(Out-Of-Vocabulary) 또는 UNK(Unknown Token) 라고 표현합니다. 단어분리(Subword segmenation) 효과 단어분리 작업은 하나의 단어는 의미있는 여러 내부 단어들(subwords)의 조합으로 구성된 경우가 많기 때문에, 기계가 아직 배운 적이 없는 단어에 대해 어느 정도 대처할 수 있도록 합니다. 1. 기존 단어 분리 방법 학습동안 단어집하을 만들기 위해 데이터의 단어 빈도수를 확인하고 중복을 배제하여 vocabulary를 만듭니다. 1) 훈련 데이터에 있는 단어와 등장 빈도수 확인 low : 5, lower : 2, newest : 6, widest : 3 2) vocabulary 만들기 low, lower, newest, widest 기존 단어분리 방법의 단점 테스트 단계에서 학습하지 못한 lowest는 OOV가 발생합니다. 2. BPE(Byte Pair Encoding) BPE(Byte pair encoding) 알고리즘은 1994년에 제안된 데이터 압축 알고리즘입니다. 자연어 처리에서의 BPE는 단어 분리(word segmentation) 알고리즘으로 사용됩니다. 수행방법 훈련 데이터에 있는 단어들을 모든 글자(chracters) 또는 유니코드(unicode) 단위로 단어 집합(vocabulary)를 만듬. 연속적으로 가장 많이 등장한 유니그램의 쌍을 찾아서 하나의 유니그램으로 통합함. 수행예제 딕셔너리의 모든 단어들을 글자(chracter) 단위로 분리하여 vocabulary를 만듭니다. # dictionary l o w : 5,  l o w e r : 2,  n e w e s t : 6,...

데이터 전처리 - 토큰화(Tokenization)

1. 토큰화(Tokenization) 정의 토큰화(tokenization)란 코퍼스를 의미있는 작은 단위로 나누는 작업 입니다. Vocab에 없는 단어일 경우 음절(character) 단위로 나눠지며, 음절도 Vocab에 없을 경우 Unknown token으로 처리됩니다. 2. 가장 간단한 토큰화 방법 간단한 토큰화 방법으로 특수문자 및 구두점 제거하고 공백(whitespace)을 기준 토큰화(Word Tokenization) 하는 방법이 있습니다. 입력: Time is an illusion. Lunchtime double so! 출력 : "Time", "is", "an", "illustion", "Lunchtime", "double", "so" 이 방법은 온점(.)이 문장의 경계가 아닌 $45.55 같은 경우 문제가 발생합니다. 또한 특수문자 $는 화폐를 의미하는 경우도 있습니다. 입력: What're your doing 출력 : "What", "re", "your", "doing" 아포스트로피('), 즉 압축된 단어도 고려가 되지 않은 문제점이 있습니다. 위의 예에서 re를 접어(clitic)이라고 합니다. Library Info from nltk.tokenize import word_tokenize from nltk.tokenize import WordPunctTokenizer  from tensorflow.keras.preprocessing.text import text_to_word_sequence 3. 문장 토큰화(Sentence Tokenization) 코퍼스를 문장 단위로 구분하는 방법입니다. 영어 문장 토큰화: NLTK - sent_tokenize 한글 문장 토큰화: KSS ...