Recursive Neural Tensor Network
24 Jun 2017 | Recursive Neural Networks
이번 글에서는 Recursive Neural Tensor Network(RNTN)에 대해 살펴보도록 하겠습니다. 이번 글 역시 고려대 강필성 교수님 강의를 정리하였음을 먼저 밝힙니다. 그럼 시작하겠습니다.
문제 및 데이터
RNTN은 Recursive Neural Networks의 발전된 형태로 Socher et al.(2013)이 제안한 모델입니다. RNTN의 입력값은 다음과 같이 문장이 단어, 구(phrase) 단위로 파싱(parsing)되어 있고 단어마다 긍정, 부정 극성(polarity)이 태깅돼 있는 형태입니다. 극성이라는 레이블 정보가 주어져 있는 파싱 트리를 기반으로 단어나 구를 벡터로 임베딩하고, 이 벡터를 기반으로 레이블을 예측하는 모델이 바로 RNTN입니다.
Simple Recursive Neural Network
RNTN 아키텍처를 살펴보려면 간단한 형태의 Recursive Neural Network를 먼저 살펴보는 것이 좋겠습니다. 아키텍처를 단순화한 그림은 다음과 같습니다. ‘very good’처럼 문법적, 의미적 응집성이 높은 입력값을 트리 형태로 결합하는 것이 Recursive Neural Network의 특징입니다.
Recursive Neural Network는 left child node와 right child node를 결합해 parent node를 만듭니다. 위 예시 그림 기준으로는 very와 good을 결합해 $p_1$을 만들고, 다시 not과 $p_1$을 결합해 $p_2$를 만드는 방식입니다. Recursive Neural Network의 순전파(feedforward propagation) 수식은 다음과 같습니다.
\[{ p }_{ 1 }=g\left( W\begin{bmatrix} b \\ c \end{bmatrix} \right) ,\quad { p }_{ 2 }=g\left( W\begin{bmatrix} b \\ { p }_{ 1 } \end{bmatrix} \right)\]
$[b,c]^T$는 $b$라는 left child node와 $c$라는 right child node를 위, 아래로 붙인(concatenate) 벡터로 left, right child node가 $R^d$차원의 벡터라면 이 둘이 합쳐진 $[b,c]^T$는 $R^{2d}$차원 벡터가 됩니다. 한편 parent node는 $R^d$차원이 되는데요. parent node는 $p_1$처럼 또 다른 child node가 될 수 있기 때문입니다.
$g$는 보통 하이퍼볼릭탄젠트를 쓰는데 비선형성(non-linearity)을 확보할 수 있는 다른 종류의 함수를 쓸 수도 있다고 합니다. $W$는 $d$ x $2d$ 크기의 행렬로 단어나 node 종류에 관계 없이 그 값을 공유합니다.
Matrix-Vector RNN
Matrix-Vector Recursive Neural Network(MV-RNN)은 simple RNN과 달리 결합하는 단어가 다르면 그 결합 과정 또한 다를 것이라는 전제가 깔려 있는 기법입니다. 그도 그럴 것이 개별 단어는 문법적, 어휘적 성질이 각기 다르고 결합시 구성요소가 다르면 그 합성물 또한 합성의 화학구조가 달라질 것이기 때문에 이러한 특성을 반영하는 것이 어쩌면 당연할 수 있겠습니다. MV-RNN을 단순화한 그림은 다음과 같습니다.
위 그림에서 $b$는 left child node의 $R^d$차원 단어 벡터입니다. $B$는 이 벡터에 해당하는 $R^{d×d}$ 크기의 행렬입니다. 예컨대 simple RNN 예시 그림 기준으로 보면 $b$는 very에 해당하는 2차원 벡터, $B$는 이 벡터에 해당하는 행렬이 됩니다. MV-RNN에서는 모든 단어, 모든 parent node에 대해 이러한 행렬을 설정해 둡니다. 다시 말해 $p_1$은 $b$와 $c$로 만들어진 parent node라 할 때 $p_1$에 해당하는 행렬 $P_1$도 만든다는 얘기입니다.
MV-RNN의 순전파 수식은 다음과 같습니다.
\[{ p }_{ 1 }=g\left( W\begin{bmatrix} Cb \\ Bc \end{bmatrix} \right) ,\quad P_{ 1 }=g\left( { W }_{ M }\begin{bmatrix} B \\ C \end{bmatrix} \right)\]
parent node vector $p_1$을 만드는 과정 먼저 보겠습니다. 우선 left child에 해당하는 단어벡터 $b$에 right child의 행렬 $C$를 내적합니다. right child에 해당하는 단어벡터 $c$에 left child의 행렬 $B$를 내적합니다. 이 결과물에 parent node vector로 합쳐주는 역할을 하는 $W$를 내적하고 비선형성을 획득하는 과정은 simple RNN과 동일합니다.
이번엔 parent node matrix $P_1$을 만드는 과정입니다. left child의 행렬 $B$에 right chlid의 행렬 $C$를 합친 후 parent node matrix로 합쳐주는 역할을 하는 $W_M$를 내적하고 비선형성을 부여한 뒤 $P_1$을 생성합니다.
그러면 각 요소별 차원수를 살펴보겠습니다. parent node vector $p_1$는 $R^d$ 차원의 벡터, $W$는 $R^{d×2d}$ 크기의 행렬입니다. parent node matrix $P_1$은 $R^{d×d}$ 크기의 행렬이며, $W_M$은 $R^{d×2d}$ 크기의 행렬입니다.
RNTN
RNTN은 MV-RNN의 계산복잡성을 완화하기 위해 제안된 기법입니다. MV-RNN은 말뭉치에 등장하는 모든 단어와 결합 가능한 모든 경우의 수에 해당하는 parent node에 대해 $R^{d×d}$ 크기의 행렬을 생성하기 때문에 꽤 비용이 높은 알고리즘입니다. 이를 개선하기 위해 RNTN은 Tensor 개념을 도입합니다. 이를 단순화한 그림은 다음과 같습니다.
RNTN은 모든 단어와 parent node에 대해 relational matrix를 생성하는 대신 모든 단어와 parent node가 공유하는 Tensor를 설정하는데요. 위 그림에서 $V$가 Tensor를 의미합니다. 그림을 보시면 이 텐서는 2층짜리 행렬이라고 보시면 됩니다. 위, 아래가 겹친 형태라 어쩔 수 없이 둘로 나누어 그려진 걸 확인할 수 있습니다. RNTN의 순전파 수식은 다음과 같습니다.
\[p=g\left( { \begin{bmatrix} b \\ c \end{bmatrix} }^{ T }{ V }^{ [1:d] }\begin{bmatrix} b \\ c \end{bmatrix}+W\begin{bmatrix} b \\ c \end{bmatrix} \right)\]
이해를 돕기 위해 1층 텐서만 살펴보겠습니다. 그림을 보시면 left child node에 해당하는 단어벡터 $b$와 right child node의 $c$의 차원수는 $R^d$(=2차원)입니다. 1층 텐서의 차원수는 $R^{2d×2d}$입니다. 따라서 Slice of Tensor Layer 가운데 1층의 결과물은 스칼라값 하나가 나오게 됩니다($[b,c]∈R^{1×2d}$, $V∈R^{2d×2d}$, $[b,c]^T∈R^{2d×1}$).
이를 확장해 텐서가 $d$층이라고 가정하면 Slice of Tensor Layer를 계산한 결과는 $R^d$차원의 벡터가 됩니다. 이는 $W$에 $[b,c]^T$를 내적한 Standard Layer의 차원수와 같습니다.
Softmax layer
앞서 데이터를 설명해드렸던 것처럼 입력문장엔 모든 단어, 구에 극성 레이블이 태깅돼 있습니다. 단어, 구 단위 분류 문제를 푸는 것과 같다는 얘기입니다. 예컨대 레이블 범주가 긍정, 부정, 중립 3가지라면 3범주 분류 문제가 됩니다. Simple Recursive Neural Network이든, MV-RNN이든, RNTN이든 동일한 Softmax Layer를 씁니다. 식은 다음과 같습니다.
\[{ y }^{ word }=softmax({ W }_{ S }\cdot word)\]
$word$는 $R^d$차원 벡터입니다. 만약 이 $word$가 말단의 child node라면 단어에 해당하는 벡터가 될 것이고 임의의 parent node라면 구로 추상화된 벡터가 될 것입니다. $W_S$의 차원수는 $R^{C×d}$가 됩니다. 여기에서 $C$는 범주 개수입니다.
위 수식의 결과물인 $y^{word}$는 $R^C$차원 벡터가 됩니다. 범주 수만큼의 확률값들이 존재하는 셈이지요. 이를 정답 레이블과 비교해 크로스 엔트로피 오차를 구하고 역전파를 수행해 전체 네트워크를 학습하는 구조입니다.
기법별 학습파라메터 비교
이번에는 기법별로 학습파라메터가 어떻게 다른지 비교해보겠습니다. MV-RNN이 학습파라메터 종류가 많고 크기가 제일 큽니다. simple RNN은 가장 적고, RNTN은 둘의 중간 정도됩니다.
구분
simple Recursive Neural Network
MV-RNN
RNTN
Word Vector
$d×1$
$d×1$
$d×1$
Softmax $W_S$
$C×d$
$C×d$
$C×d$
Compostion Weights
$W:d×2d$
$W:d×2d$, $W_M:d×2d$,$A,B,C…:d×d×$|$v$|
$W:d×2d$,$V^{[1:d]}:2d×2d×d$
이번 글에서는 Recursive Neural Tensor Network(RNTN)에 대해 살펴보도록 하겠습니다. 이번 글 역시 고려대 강필성 교수님 강의를 정리하였음을 먼저 밝힙니다. 그럼 시작하겠습니다.
문제 및 데이터
RNTN은 Recursive Neural Networks의 발전된 형태로 Socher et al.(2013)이 제안한 모델입니다. RNTN의 입력값은 다음과 같이 문장이 단어, 구(phrase) 단위로 파싱(parsing)되어 있고 단어마다 긍정, 부정 극성(polarity)이 태깅돼 있는 형태입니다. 극성이라는 레이블 정보가 주어져 있는 파싱 트리를 기반으로 단어나 구를 벡터로 임베딩하고, 이 벡터를 기반으로 레이블을 예측하는 모델이 바로 RNTN입니다.
Simple Recursive Neural Network
RNTN 아키텍처를 살펴보려면 간단한 형태의 Recursive Neural Network를 먼저 살펴보는 것이 좋겠습니다. 아키텍처를 단순화한 그림은 다음과 같습니다. ‘very good’처럼 문법적, 의미적 응집성이 높은 입력값을 트리 형태로 결합하는 것이 Recursive Neural Network의 특징입니다.
Recursive Neural Network는 left child node와 right child node를 결합해 parent node를 만듭니다. 위 예시 그림 기준으로는 very와 good을 결합해 $p_1$을 만들고, 다시 not과 $p_1$을 결합해 $p_2$를 만드는 방식입니다. Recursive Neural Network의 순전파(feedforward propagation) 수식은 다음과 같습니다.
\[{ p }_{ 1 }=g\left( W\begin{bmatrix} b \\ c \end{bmatrix} \right) ,\quad { p }_{ 2 }=g\left( W\begin{bmatrix} b \\ { p }_{ 1 } \end{bmatrix} \right)\]$[b,c]^T$는 $b$라는 left child node와 $c$라는 right child node를 위, 아래로 붙인(concatenate) 벡터로 left, right child node가 $R^d$차원의 벡터라면 이 둘이 합쳐진 $[b,c]^T$는 $R^{2d}$차원 벡터가 됩니다. 한편 parent node는 $R^d$차원이 되는데요. parent node는 $p_1$처럼 또 다른 child node가 될 수 있기 때문입니다.
$g$는 보통 하이퍼볼릭탄젠트를 쓰는데 비선형성(non-linearity)을 확보할 수 있는 다른 종류의 함수를 쓸 수도 있다고 합니다. $W$는 $d$ x $2d$ 크기의 행렬로 단어나 node 종류에 관계 없이 그 값을 공유합니다.
Matrix-Vector RNN
Matrix-Vector Recursive Neural Network(MV-RNN)은 simple RNN과 달리 결합하는 단어가 다르면 그 결합 과정 또한 다를 것이라는 전제가 깔려 있는 기법입니다. 그도 그럴 것이 개별 단어는 문법적, 어휘적 성질이 각기 다르고 결합시 구성요소가 다르면 그 합성물 또한 합성의 화학구조가 달라질 것이기 때문에 이러한 특성을 반영하는 것이 어쩌면 당연할 수 있겠습니다. MV-RNN을 단순화한 그림은 다음과 같습니다.
위 그림에서 $b$는 left child node의 $R^d$차원 단어 벡터입니다. $B$는 이 벡터에 해당하는 $R^{d×d}$ 크기의 행렬입니다. 예컨대 simple RNN 예시 그림 기준으로 보면 $b$는 very에 해당하는 2차원 벡터, $B$는 이 벡터에 해당하는 행렬이 됩니다. MV-RNN에서는 모든 단어, 모든 parent node에 대해 이러한 행렬을 설정해 둡니다. 다시 말해 $p_1$은 $b$와 $c$로 만들어진 parent node라 할 때 $p_1$에 해당하는 행렬 $P_1$도 만든다는 얘기입니다.
MV-RNN의 순전파 수식은 다음과 같습니다.
\[{ p }_{ 1 }=g\left( W\begin{bmatrix} Cb \\ Bc \end{bmatrix} \right) ,\quad P_{ 1 }=g\left( { W }_{ M }\begin{bmatrix} B \\ C \end{bmatrix} \right)\]parent node vector $p_1$을 만드는 과정 먼저 보겠습니다. 우선 left child에 해당하는 단어벡터 $b$에 right child의 행렬 $C$를 내적합니다. right child에 해당하는 단어벡터 $c$에 left child의 행렬 $B$를 내적합니다. 이 결과물에 parent node vector로 합쳐주는 역할을 하는 $W$를 내적하고 비선형성을 획득하는 과정은 simple RNN과 동일합니다.
이번엔 parent node matrix $P_1$을 만드는 과정입니다. left child의 행렬 $B$에 right chlid의 행렬 $C$를 합친 후 parent node matrix로 합쳐주는 역할을 하는 $W_M$를 내적하고 비선형성을 부여한 뒤 $P_1$을 생성합니다.
그러면 각 요소별 차원수를 살펴보겠습니다. parent node vector $p_1$는 $R^d$ 차원의 벡터, $W$는 $R^{d×2d}$ 크기의 행렬입니다. parent node matrix $P_1$은 $R^{d×d}$ 크기의 행렬이며, $W_M$은 $R^{d×2d}$ 크기의 행렬입니다.
RNTN
RNTN은 MV-RNN의 계산복잡성을 완화하기 위해 제안된 기법입니다. MV-RNN은 말뭉치에 등장하는 모든 단어와 결합 가능한 모든 경우의 수에 해당하는 parent node에 대해 $R^{d×d}$ 크기의 행렬을 생성하기 때문에 꽤 비용이 높은 알고리즘입니다. 이를 개선하기 위해 RNTN은 Tensor 개념을 도입합니다. 이를 단순화한 그림은 다음과 같습니다.
RNTN은 모든 단어와 parent node에 대해 relational matrix를 생성하는 대신 모든 단어와 parent node가 공유하는 Tensor를 설정하는데요. 위 그림에서 $V$가 Tensor를 의미합니다. 그림을 보시면 이 텐서는 2층짜리 행렬이라고 보시면 됩니다. 위, 아래가 겹친 형태라 어쩔 수 없이 둘로 나누어 그려진 걸 확인할 수 있습니다. RNTN의 순전파 수식은 다음과 같습니다.
\[p=g\left( { \begin{bmatrix} b \\ c \end{bmatrix} }^{ T }{ V }^{ [1:d] }\begin{bmatrix} b \\ c \end{bmatrix}+W\begin{bmatrix} b \\ c \end{bmatrix} \right)\]이해를 돕기 위해 1층 텐서만 살펴보겠습니다. 그림을 보시면 left child node에 해당하는 단어벡터 $b$와 right child node의 $c$의 차원수는 $R^d$(=2차원)입니다. 1층 텐서의 차원수는 $R^{2d×2d}$입니다. 따라서 Slice of Tensor Layer 가운데 1층의 결과물은 스칼라값 하나가 나오게 됩니다($[b,c]∈R^{1×2d}$, $V∈R^{2d×2d}$, $[b,c]^T∈R^{2d×1}$).
이를 확장해 텐서가 $d$층이라고 가정하면 Slice of Tensor Layer를 계산한 결과는 $R^d$차원의 벡터가 됩니다. 이는 $W$에 $[b,c]^T$를 내적한 Standard Layer의 차원수와 같습니다.
Softmax layer
앞서 데이터를 설명해드렸던 것처럼 입력문장엔 모든 단어, 구에 극성 레이블이 태깅돼 있습니다. 단어, 구 단위 분류 문제를 푸는 것과 같다는 얘기입니다. 예컨대 레이블 범주가 긍정, 부정, 중립 3가지라면 3범주 분류 문제가 됩니다. Simple Recursive Neural Network이든, MV-RNN이든, RNTN이든 동일한 Softmax Layer를 씁니다. 식은 다음과 같습니다.
\[{ y }^{ word }=softmax({ W }_{ S }\cdot word)\]$word$는 $R^d$차원 벡터입니다. 만약 이 $word$가 말단의 child node라면 단어에 해당하는 벡터가 될 것이고 임의의 parent node라면 구로 추상화된 벡터가 될 것입니다. $W_S$의 차원수는 $R^{C×d}$가 됩니다. 여기에서 $C$는 범주 개수입니다.
위 수식의 결과물인 $y^{word}$는 $R^C$차원 벡터가 됩니다. 범주 수만큼의 확률값들이 존재하는 셈이지요. 이를 정답 레이블과 비교해 크로스 엔트로피 오차를 구하고 역전파를 수행해 전체 네트워크를 학습하는 구조입니다.
기법별 학습파라메터 비교
이번에는 기법별로 학습파라메터가 어떻게 다른지 비교해보겠습니다. MV-RNN이 학습파라메터 종류가 많고 크기가 제일 큽니다. simple RNN은 가장 적고, RNTN은 둘의 중간 정도됩니다.
구분 | simple Recursive Neural Network | MV-RNN | RNTN |
---|---|---|---|
Word Vector | $d×1$ | $d×1$ | $d×1$ |
Softmax $W_S$ | $C×d$ | $C×d$ | $C×d$ |
Compostion Weights | $W:d×2d$ | $W:d×2d$, $W_M:d×2d$,$A,B,C…:d×d×$|$v$| | $W:d×2d$,$V^{[1:d]}:2d×2d×d$ |
Comments