본문 바로가기

word2v ec

기계학습 - Spark(7) - Word2Vec 코드분석 완결 지금까지 스파크 소스코드 분석을 통해 이해한 word2vec작동 원리에 대한 정리글을 올린다. word2vec은 아주 많은 양의 문장을 사용한 학습을 통해 단어들마다 고유의 벡터값을 산정하는데, 그 값에 따르면 유사한 성격의 단어들이 어느 한 지점에 몰리는 것을 볼 수 있다. 그러나 학습은 단어간의 연관성을 문장에서 서로 가까운 위치에 놓여 있는지에 따라 정해지기 때문에 한계도 있다. word2vec은 크게 두 단계로 나뉜다. 첫번째는 문장들의 단어들을 추려 빈도수에 따라 이진 트리를 구성하는 것이고, 두번째는 본격적으로 학습을 행하는 것이다. 1. 이진트리 구성 위의 그림은 이진트리를 구성할 때 사용하는 빈도수가 어떻게 적용되는지를 보여준다. 이 이진 트리는 소위 인공지능을 이용한 여러 이론에서 애용되.. 더보기
기계학습 - Spark(6) - Word2Vec, 학습하는 부분 코드 분석2 코딩 조금하는 놈이 적은 지식을 갖고 직관에 상당히 의존해서 Word2Vec 스칼라 구현코드를 분석하는 글이다. 따라서 이 글은 틀릴 수 있다. 이번회는 지난회의 다듬어지지 않은 생각이 한층 정리된 글이다. 결론에 가기전에 벡터 스칼라곱과 y'=ax + y를 처리하는 saxpy(Scalar Alpha X Plus Y)함수의 의미를 추리해 본다. 1. 스칼라곱은 아래처럼 다른 식으로 표현 가능한데. cos값의 성질에 따라 두 벡터의 내각이 90도 이내면 양수, 90도이면 0, 90~270이내면 음수, 270도이면 0 ... 등이 된다. 따라서 이 값은 정반대의 벡터의 곱부터 직교하는 벡터의 곱을 거쳐 같은 방향의 벡터 곱까지이다. 2. saxpy함수는 알파값과 매개변수로 2개의 배열을 받는데 앞의 배열 값.. 더보기
기계학습 - Spark(5) - Word2Vec, 학습하는 부분 코드 분석 이런 저런 주변의 일을 처리하고, 다시 Word2Vec.scala 소스코드중에서 학습을 하는 부분을 분석해봤다. 기반 지식에 대한 이해도 부족한 상황에서 직관에 상당히 의존하며 분석했다. 따라서 이 글은 틀린 내용을 담고 있을 수 있다. 학습은 전체에서 사용되는 상당히 큰 배열 (단어수 x 벡터차원수)과 부분적으로 사용되는 배열(벡터차원수)가 사용된다. 하나의 문장단위로 순서대로 학습을 하는데, 문장마다 첫 단어부터 마지막 단어까지 순서대로 학습한다. 일단 이 것만으로도 2중 반복문이다. 그리고 각각의 단어마다 앞, 뒤로 위치한 단어들을 추려서 학습하는데, 추리는 단어의 수는 정해져 있고, 다만 앞으로 몇번째 단어부터 처리할 것인지를 랜덤하게 선택한다. 위의 그림속의 문장을 보면, federal이라는 단.. 더보기
기계학습 - Spark(4) - Word2Vec Word2Vec에 대한 기술자료들을 찾아봤는데, 소개중심 또는 추상적인 이론중심으로 설명을 한데다 설명 또한 자세하지 않아 개발자 입장에서 이해하기 힘들다. 그래서 Spark 소스를 직접 분석해보기로 했다. 우선 .fit함수부터 시작했다.scala> val w2v = new Word2Vec().setInputCol("text").setOutputCol("result").setVectorSize(3).setMinCount(0)w2v: org.apache.spark.ml.feature.Word2Vec = w2v_d6ac8192b87f scala> val model = w2v.fit(df) Word2Vec객체는 내려받은 소스 폴더에서 찾아보니. "/spark/mllib/src/main/scala/org/apa.. 더보기
기계학습 - Spark(3) - Word2Vec, CountVectorizer Spark 교재중 Word2Vec, CountVectorizer 설명 페이지에는 샘플코드중 스칼라로 코딩된 부분을 이해한다. [링크] Word2Vec 샘플 스칼라 코드에서 .map(Tuple1.apply) 이 부분을 이해해보자. 여기서 map함수는 키-값의 맵을 구성하는 것이 아니라 맵리듀스의 맵으로 이해하면 된다. Seq 문으로 구성한 목록의 모든 구성요소에 대해 Tuple1.apply를 적용한다. 여기서 apply 호출을 눈여겨 보자. 'apply'는 스칼라 개발언어에서 아주 중요한 개념중의 하나이다. Tuple1객체는 생성자를 통해 인스턴스로 생성될 때, 생성자 매개변수로 하나의 데이터를 받아 그 데이터 하나로 구성된 tuple이 된다. 아래는 간단한 예다. scala> val t1 = new Tu.. 더보기