하루 종일 깃허브 특강을 들었지만 ,,
아직은 기초적인 부분을 가르쳐주시다보니
새로운 부분은 없었던 것 같다.
그리고 요새 플러터를 공부 중인데,
리액트 네이티브와는 다른 매력이 있는 것 같다.
CSS 하나 없이 UI를 구성하는데,
반응형 앱을 설계하기에 매우 좋을 것 같다.
디자이너가 원하는 UI가 어떤 식으로 구성 돼있냐에 따라서
리액트 네이티브와 플러터 중에서 어떤걸 쓸 지
고민해봐야겠다.
컴퓨터가 주어진 단어나 문장, 그리고 더 큰 문단이나 글을 이해하는 과정이다.
Sentences : "she loves this movie", "He loves her"
vocabulary : ["she", "loves", "this", "movie", "he", "her"]
one-hot-vector
she: [1 0 0 0 0 0]
, loves: [0 1 0 0 0 0]
,
this: [0 0 1 0 0 0]
, movie: [0 0 0 1 0 0]
,
he: [0 0 0 0 1 0]
, her: [0 0 0 0 0 1]
"she loves her": [1 1 0 0 0 1]
특정 클래스에서 문장별로 등장하는 단어의 빈도를 확인하여 비교한다.
문제는, 단어 하나만 안 나와도 확률이 0이 된다.
자연어를 단어들의 시퀀스라 볼 때, 단어들을 어떤 특정한 차원으로 이뤄진 공간에서의 한 점, 혹은 그 점의 좌표를 나타내는 벡터로 변환하는 기법
비슷한 의미의 단어는 비슷한 벡터값을 가진다. -> 벡터 간의 거리가 짧음.
이 때문에, 주변 단어를 파악해서 주변 단어들과 비슷한 단어를 찾을 수 있다.
한 문장에 대해서 sliding window를 활용하여 단어쌍들을 구하고, 이를 학습한다.
단어의 one hot vector를 구하고, 레이어(Embedding Layer)들을 통과한 후 softmax 레이어를 통과시켜 단어의 확률 분포를 구한다. 이 확률 분포가 GT와 근접하도록 레이어의 W들을 업데이트 한다.
one hot vector의 특성상 행렬곱에서 한 행 또는 한 열만 값이 남으므로 column vector를 뽑아와서 선형 결합을 하는 식으로 연산을 진행한다.(모든 행에 대해서 계산할 필요 x)
이 링크를 통해서 Word2Vec이 어떻게 학습되는지 볼 수 있다.
단어 간의 의미적인 관계를 벡터를 통해서 알 수 있다.
Word2Vec와과의 차이는, 각 입력 및 출력 단어쌍들에 대해서 학습 데이터에서 그 두 단어가 한 윈도우 내에서 총 몇번 동시에 등장했는지를 사전에 계산을 미리 하고, 입력 워드의 임베딩 벡터와 출력 워드의 임베딩 벡터 간의 내적 값에 로그 값을 취해서 그 값이 최대한 사전에 계산한 등장 횟수 값과 근접하도록 한 것이다.
학습 데이터 안에서 빈번한 데이터들에 대해서 여러번 학습하지 않기 때문에 중복된 계산을 줄일 수 있다. 이 때문에 상대적으로 더 빠르고 적은 데이터에서도 더 잘 동작한다.
를 가지고 를 업데이트할 때의 연산을 라고 하면, 는 와 연산하는 부분과 와 연산하는 부분으로 나눌 수 있으며, 그 예가 두번째 식이다.
전에 논문을 읽을 때 들었던 생각이,
char 단위로 글을 인식하는데 어떻게 성능이 좋을까? 였다.
솔직히 말하면, 지금도 확신이 없다.
단어를 형성하는 데에는 좋지만 그 맥락과 의미를 유지하지는 못할 것이라 생각한다.
DFS, BFS에서의 depth는 시간, 반복 횟수, 거리 등의 의미로 사용될 수 있다.
서두르지 말고,
한 발짝씩 나아가기