주의 메커니즘은 정확히 무엇입니까?


23

주의 메커니즘은 지난 몇 년 동안 다양한 딥 러닝 논문에서 사용되었습니다. Open AI의 연구 책임자 인 Ilya Sutskever는 다음과 같이 열정적으로 찬사를 보냈습니다 : https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0

Purdue University의 Eugenio Culurciello는 RNN과 LSTM을 순전히주의 기반 신경망에 찬성하여 포기해야한다고 주장했습니다.

https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0

이 과장 보인다, 그러나 순전히 관심 기반 모델은 시퀀스 모델링 작업에 아주 잘했던 것을 부인할 : 우리는 구글에서 적절하게 이름을 종이에 대한 모든 노하우는, 주의는 당신이 필요로하는 모든 것입니다

그러나 주의 기반 모델은 정확히 무엇 입니까? 그런 모델에 대한 명확한 설명을 아직 찾지 못했습니다. 과거 값을 고려하여 다변량 시계열의 새로운 값을 예측하려고한다고 가정합니다. LSTM 셀이있는 RNN을 사용하여이를 수행하는 방법은 분명합니다. 주의 기반 모델과 동일한 작업을 수행하려면 어떻게합니까?

답변:


20

주의는 종종 룩업 벡터 를 통해 벡터 세트를 하나의 벡터로 집계하는 방법입니다 . 일반적으로 는 모델에 대한 입력 또는 이전 시간 단계의 숨겨진 상태이거나 숨겨진 상태를 한 수준 아래로 쌓아 올린 것입니다 (적층 LSTM의 경우).viuvi

결과는 현재 시간 단계와 관련된 컨텍스트를 포함하므로 종종 컨텍스트 벡터 라고합니다 .c

이 추가 컨텍스트 벡터 는 RNN / LSTM에도 공급됩니다 (원래 입력과 간단히 연결될 수 있음). 따라서 컨텍스트를 사용하여 예측을 도울 수 있습니다.c

가장 간단한 방법은 확률 벡터 및 여기서 는 모든 이전 의 연결입니다 . 공통 조회 벡터 는 현재 숨겨진 상태 입니다.p=softmax(VTu)c=ipiviVviuht

이것에는 많은 변형이 있으며 원하는대로 복잡하게 만들 수 있습니다. 예를 들어, 를 로짓으로 사용하는 대신 대신 선택할 수 있습니다 . 여기서 는 임의의 신경망입니다.viTuf(vi,u)f

시퀀스-시퀀스 모델에 대한 일반적인주의 메커니즘은 . 여기서 는 인코더의 숨겨진 상태이고 는 현재 숨겨진 상태입니다. 디코더의 상태. 와 두 모두 매개 변수입니다.p=softmax(qTtanh(W1vi+W2ht))vhtqW

주의 아이디어에 다른 변형을 보여주는 일부 논문 :

포인터 네트워크 는 조합 최적화 문제를 해결하기 위해 참조 입력에주의를 기울입니다.

반복 엔티티 네트워크 는 텍스트를 읽는 동안 다른 엔티티 (사람 / 객체)에 대해 별도의 메모리 상태를 유지하고주의를 기울여 올바른 메모리 상태를 업데이트합니다.

변압기 모델은 또한 광범위한 관심을 기울입니다. 주의 집중 공식은 약간 더 일반적이며 키 벡터 도 포함 합니다.주의 가중치 는 실제로 키와 조회 사이에서 계산되며 컨텍스트는 로 구성됩니다 .kipvi


간단한 테스트를 통과했다는 사실을 넘어서는 정확성을 보장 할 수는 없지만 한 가지 형태의주의를 빠르게 구현합니다.

기본 RNN :

def rnn(inputs_split):
    bias = tf.get_variable('bias', shape = [hidden_dim, 1])
    weight_hidden = tf.tile(tf.get_variable('hidden', shape = [1, hidden_dim, hidden_dim]), [batch, 1, 1])
    weight_input = tf.tile(tf.get_variable('input', shape = [1, hidden_dim, in_dim]), [batch, 1, 1])

    hidden_states = [tf.zeros((batch, hidden_dim, 1), tf.float32)]
    for i, input in enumerate(inputs_split):
        input = tf.reshape(input, (batch, in_dim, 1))
        last_state = hidden_states[-1]
        hidden = tf.nn.tanh( tf.matmul(weight_input, input) + tf.matmul(weight_hidden, last_state) + bias )
        hidden_states.append(hidden)
    return hidden_states[-1]

새로운 숨겨진 상태가 계산되기 전에 몇 줄만 추가하면됩니다.

        if len(hidden_states) > 1:
            logits = tf.transpose(tf.reduce_mean(last_state * hidden_states[:-1], axis = [2, 3]))
            probs = tf.nn.softmax(logits)
            probs = tf.reshape(probs, (batch, -1, 1, 1))
            context = tf.add_n([v * prob for (v, prob) in zip(hidden_states[:-1], tf.unstack(probs, axis = 1))])
        else:
            context = tf.zeros_like(last_state)

        last_state = tf.concat([last_state, context], axis = 1)

        hidden = tf.nn.tanh( tf.matmul(weight_input, input) + tf.matmul(weight_hidden, last_state) + bias )

전체 코드


p=softmax(VTu)ic=ipivipiVTvVTv

1
zi=viTup=softmax(z)pi=eizjejz

ppi

1
그래, 내가 무엇을 의미하는
세무

@shimao 대화방을 만들었습니다. 대화에 관심이 있으시면 알려주십시오 (이 질문에 관한 것이 아님)
DeltaIV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.