%%time
def read_data(filename):
with codecs.open(filename, 'r', 'utf-8') as f:
data = [line.split(' ') for line in f.read().splitlines()]
return data
data = read_data('/content/gdrive/My Drive/자연어 처리 및 BERT 실습/wiki/wiki.txt')
print(len(data))
print(data[0])
이런식으로 데이터를 읽어오면 우아하게 처리할 수 있다. [~ for i in ~]이런 형식.
logp(o|c) c : 중심단어, o : 주변 단어, v : W의 행벡터, u : W'의 열벡터
GloVe 문서 전체의 통계정보(co-occurrent matrix) 사용 co-occureent matrix : 특정 단어를 기준으로 주변에 단어들이 몇번 나왔는지를 count한 matrix 학습이 빠르고, 작은 말뭉치에도 잘 적용됨. ->근데 사실 word2vec이랑 크게 다를 바 없어서 둘 다 해봄.
pij = P(j|i) : i가 나타났을 때, j가 등장할 확률. P의 i번째 행 중에서 j index 즉, P의 i행 모두를 더해서 분모로 만들고, Pj를 분자로 만들면 된다. f(Pij)를 사용하는 이유는, 너무 자주 인접하게 나오는 단어들을 보정해주려고.
지수함수적으로 값 변동이 크므로 log연산을 해준다.
Doc2Vec : 문서를 단어의 벡터 공간에 임베딩하여 벡터화. 1.문서 하나를 벡터로 취급. ->워드임베딩이나 진배없다. 2.paragraph id만 보고 예측해보는 task ->paragraph 자체만으로도 벡터 취급 같은 문장 내의 단어들은 유사성 높아짐.
W(hh) : h * h => hideen에서 hidden으로 가야 하니까. W(xh) : h * x W(hy) : y * h
gradient vanishing : gradient가 너무 작아져서 계산을 해도 차이가 없어지는 경우 ->error가 나지 않기 때문에 해결하기가 어려움 gradient exploding : gradient가 너무 커져서 계산할 수가 없어짐.
sigmoid 미분 -> y(1-y) <= 1/4 => time step을 10번만 해도 1/2^20 => 백만분의 1보다도 작아짐!
gradient vanishing을 해결하기 위해 LSTM이 고안
gradient exploding을 해결하기 위해 clip gradient 이용
LSTM : long term dependencies를 극복 고속도로를 하나 뚫어서, long term memory를 전달하는 길을 만들어줌.
forget gate : cell state로 들어온 long term memory를 잊어버릴건지, 넘겨줄건지 결정. 0 <= f(t) <= 1. 0일수록 잊고 1일수록 기억. ->이전의 정보와 현재의 정보를 비교해서 이전의 정보중 필요 없다고 판단되는 것들을 날리는 듯. 유사도 검사?
input gate : 새로운 input에 대한 정보를 얼마나 전달할지. 0<= i(t) <= 1. 실제 새로운 정보 C(t) (i(t)는 새로운 정보를 얼마나 반영할지라고 생각) forget gate와 Cell state를 반영해서 새로운 Cell state를 갱신 C(t) = f(t) * C(t-1) + i(t) * ~C(t)
highway network에서는 단순연산만 일어나므로 gradient의 변화가 크게 없다.
GRU : RNN cell 중 하나.
attention : decoder에서 나온 hidden vector와 encoder에서 나온 출력들로 attention scores를 계산한 후 softmax 취해서 attention 분포를 구한 후 weighted sum하면 attention output구할 수 있다. 이 attention output과 decoder output으로 output을 구한다.
seq2seq에서 attention 활용 가능. seq2seq trainning 과정 1. encoding 과정에서 src sentence를 읽고, 어떤 context vector를 만들지 판단 2. decoder에서 각 step마다 attention과정을 거쳐, 어떤 토큰을 관심있게 바라보고, 다음에 무엇을 generate할지 본다. 3. decoder에서 다음 타겟 토큰을 생성해내는 걸 반복해서 타겟 sentece를 생성해냄.
처음 나온 token이 잘못 나오면 그것의 영향을 받아 다음 token도 잘못 나올 확률이 크다. ->teacher forcing으로 극복.
seq2seq의 long term dependency 문제 극복하기 위해 attention 적용
pytorch에서 view는 tensor를 reshape하겠다는 뜻.
t1.view(-1,1)에서 -1는 들어올 값에 대해서 파이토치에게 판단해서 넣도록 맡기는 것.