기본적으로 언어는 계층구조를 갖는다. 구(Phrase)와 절(Clause)처럼 단어가 모여서 구(phrase)을 이루고, 구가 모여서 절(clause)을 이룬다. 예를 들어, 형용사절을 들어본적이 있는가? "men in black"과 같이 "in black"이 형용사절을 이루고, 이러한 구가 모여서 명사절 등을 이룬다. 사람은 이와 같이 계층구조를 이루는 것을 이애할 수 있다. 유사하게, "이런 계층구조의 모델링을 명시하진 않았지만 Tree 구조를 이용한다면, 더 좋게 할 수 있지는 않을까"에 대한 질문이 본 페이퍼의 핵심이다.
본 페이퍼를 읽기 위해 다음의 배경지식이 필요함
1. Inductive bias (aka learning bias): 귀납적 편향. 학습편향. 모델이 경험하지 않은 데이터를 입력받았을 때, 출력을 예측하는데 사용하는 가정의 집합임. 정확히 학습되지 않은 것들을에 대해서 귀납적으로 학습한 것들이 있으니, 예측을 할 수 있지 않느냐의 대한 가정임.
=> 본 연구에서는 이러한 학습편향을 정보의 주기(생성~삭제)를 따로따로 관리하여(differentiation) 증진하겠다는 전략이다. High ranking neuron과 low ranking neuron으로 나눠서, 고순위의 뉴런들에서는 정보를 오래 가지고 있게하고, 저순위 뉴런에서는 정보를 빨리 잊게하는 테크닉을 보임.
Key technique: ON-LSTM
1. Cumax: Cumax은 Cumsum(cummulative summation)과 softmax을 합친것이다(합성함수다). 이를 사용하는 이유는뉴런의 랭킹을 결정할때 지나치게 명확히 high, low랭킹을 구분하는것을 피하기위해 사용되었다고한다. " To avoid a strict division between high-ranking and low-ranking neurons, we propose a new activation function, the cumulative softmax, or cumax(), to actively allocate neurons to store long/short-term information". Cumax에서 반환되는 값은 누적합이기에 연산도중에 1이뜨면, 그 이후의 인덱스의 값들은 모두 1일 것이다. 따라서, 어느 인덱스부터 1인지에 대한 기준이 되는 지를 표기했는데, $d_{t}^{f}$이다.
import tensorflow as tf
# Equation (6)
def cumax(x, axis=-1):
return tf.math.cumsum(tf.nn.softmax(x, axis), axis)
def split_point(x):
x = x.numpy()
return np.where(x == 1)[0].min()
2. LSTM : Ordered neuron LSTM은 기본적인 LSTM연산을 필요로하고, 그 위에다가 master gate을 부착한다. 그렇기에 LSTM연산도 포함된다.
class ONLSTM(tf.keras.layers.Layer):
def __init__(self, input_dim, hidden_unit):
super(ONLSTM, self).__init__()
self.input_dim = input_dim
self.hidden_unit = hidden_unit
def build(self):
# Equation 1-5: basic LSTM model
self.w_f = self.add_weight(shape=(self.input_dim, self.hidden_unit), name='standard_lstm_kernel')
self.w_i = self.add_weight(shape=(self.input_dim, self.hidden_unit), name='lstm_input_kernel')
self.w_o = self.add_weight(shape=(self.input_dim, self.hidden_unit), name='lstm_output_kernel')
self.w_c = self.add_weight(shape=(self.input_dim, self.hidden_unit), name='cell_memory_kernel')
self.u_f = self.add_weight(shape=(self.hidden_unit, self.hidden_unit), name='standard_recurrent_kernewl') # u_f
self.u_i = self.add_weight(shape=(self.hidden_unit, self.hidden_unit), name='lstm_input_recurrent_kernel')
self.u_o = self.add_weight(shape=(self.hidden_unit, self.hidden_unit), name='lstm_input_recurrent_kernel')
self.u_c = self.add_weight(shape=(self.hidden_unit, self.hidden_unit), name='lstm_input_recurrent_kernel')
self.b_f = self.add_weight(shape=(1, self.hidden_unit), name='forget_bias')
self.b_i = self.add_weight(shape=(1, self.hidden_unit), name='input_bias')
self.b_o = self.add_weight(shape=(1, self.hidden_unit), name='output_bias')
self.b_c = self.add_weight(shape=(1, self.hidden_unit), name='cell_bias')
def _base_lstm_op(self, x, h):
f_out = tf.nn.sigmoid(tf.tensordot(x, self.w_f) + tf.tensordot(h, self.u_f) + self.b_f)
i_out = tf.nn.sigmoid(tf.tensordot(x, self.w_i) + tf.tensordot(h, self.u_i) + self.b_i)
o_out = tf.nn.sigmoid(tf.tensordot(x, self.w_o) + tf.tensordot(h, self.u_o) + self.b_o)
c_out = tf.nn.tanh(tf.tensordot(x, self.w_c) + tf.tensordot(h, self.u_c) + self.b_c)
return o_out * tf.nn.tanh(c_out)
3. ON-LSTM: strucure gate mechanism:
def call(self, x, h):
h, outputs = self._base_lstm_op(x, h)
lstm_f = outputs[0]
lstm_i = outputs[1]
lstm_c_hat = outputs[2]
# Equation 9: master forget gate.
wx = tf.einsum('ij,jk->ik', x, self.w_f) # (1xhidden)
uh = tf.einsum('ij,jk->ik', h, self.u_f) # (1xhidden)
f_t = cumax(wx + uh + self.b_f) # (1 x hidden)
# Equation 10: master input gate.
i_t = 1 - cumax(wx + uh + self.b_i) # (1 x hidden)
# Equation 11:
w_t = f_t * i_t # (1 x hidden)
# Equation 12:
f_t_hat = f_t * (lstm_f * i_t + 1 - i_t)
# Equation 13:
i_t_hat = i_t * (lstm_i * f_t + 1 - f_t)
# Equation 14: first d_t neuron of the previous cell state will be complete erased.
c_t = f_t_hat * self.c_t + i_t_hat + lstm_c_hat
self.c_t = c_t
return h
Reference: https://openreview.net/forum?id=B1l6qiR5F7
'Best Paper review > Others' 카테고리의 다른 글
자연어처리의 고전 BERT, 5분 컷 이해 (0) | 2021.10.25 |
---|---|
ICLR 2018: FEW-SHOT LEARNING WITH Graph 풀이 (0) | 2021.06.22 |
ICLR2018: Graph Attention networks (GATs) (0) | 2021.06.17 |
Batch normalization 추론모드에서 사용? (0) | 2021.06.01 |
Transformer (트랜스포머) 해석 (0) | 2021.05.13 |