컴퓨터에게 단어를 숫자로 표현하기 위해서, 단어장(Vocabulary)을 만들고, 중복되지 않는 인덱스(index) 로 바꿉니다.
궁극적으로 모든 문장을 일련의 정수로 바꿔줍니다. 이를 인코딩(Encoding) 이라고 합니다.
하지만 관계없는 숫자의 나열로 인코딩하는 것은 우리가 원하는 것이 아닙니다. 여전히 주관적인 숫자들 뿐입니다.
우리는 비슷한 의미의 단어는 같이 있고, 아니면 멀리 떨어져 있는 관계를 만들고 싶습니다. 그렇다면 어떻게 관계를 만들어 줘야 할까요?
한 가지 방법으로 "One hot Encoding"이 있을 수 있습니다.
길이가 단어장의 총 길이(∣V∣)인 벡터에서, 단어의 index 위치에 있는 값은 1, 나머지는 0으로 구성합니다.
어떻게 신경망이 토큰의 의미를 잡아낼수 있을까요?
결론은 각 토큰을 연속 벡터 공간(Continuous vector space) 에 투영하는 방법입니다. 이를 임베딩(Embedding) 이라고도 합니다.
Relation Network(Skip-Bigram):
문장안에 있는 모든 토큰 쌍(pairs)을 보고, 각 쌍에 대해서 신경망을 만들어서 문장표현을 찾습니다.
RN:
모든 다른 토큰의 관계를 봅니다. 모든 단어간의 관계를 봐서 효율적이지 못합니다.
CNN:
작은 범위의 토큰의 관계를 봅니다. 따라서 더 먼 거리의 단어간의 관계가 있을 경우 탐지할 수 없거나 더 많은 convolution 층을 쌓아야합니다.
하지만 CNN 방식을 가중치가 부여된 RN의 일종으로 볼 수도 있습니다.
: filter 가 위치한 부분에만 가중치 1을 주고 나머지는 0을 주어 무시하는 방식
그렇다면 가중치가 0 과 1 이 아닌 그 사이의 값으로 계산 할 수 있다면 어떨까요?
--> Self Attention
알파는 해당 관계가 중요한지 아닌지를 나타내는 weighting function(weight을 크게 줄지 작게 줄지를 결정), weight 범위 [0,1] (->sigmoid) 또는 다 더해서 1 의 contraint(->softmax)를 주는 식으로 구현
--> 문장전체를 보는 방식 : computational efficiency 문제 있음
--> optimaization 방식 :
일반적으로 gradient 를 이용한 BP 가능 .
: loss를 보고 각 노드마다 loss func에 contribute 정도가 있음 정도에 따라 값 조절
처음에 weight이 flat할 때 : learning이 잘 진행안됨 -> parameter initialization 이 까다로움
self attention을 이용한 machine transation system 을 만들때 어떤 hyper parameter가 중요한지에 대한 technical report 있음
Recurrent Neural Network(RNN):
메모리를 가지고 있어서 현재까지 읽는 정보를 저장할 수 있습니다.
문장의 정보를 시간의 순서에 따라 압축 할 수 있습니다.