เรียนเป็นวิธีการรวมชุดของเวกเตอร์ที่เข้าเพียงหนึ่งเวกเตอร์มักจะผ่านการค้นหาเวกเตอร์ยูโดยปกติแล้วเป็นอินพุตสำหรับโมเดลหรือสถานะที่ซ่อนของขั้นตอนเวลาก่อนหน้าหรือสถานะที่ซ่อนอยู่ลดลงหนึ่งระดับ (ในกรณีของ LSTM แบบสแต็ก)viuvi
ผลลัพธ์มักถูกเรียกว่าบริบทเวกเตอร์cเนื่องจากมีบริบทที่เกี่ยวข้องกับขั้นตอนเวลาปัจจุบัน
บริบทเพิ่มเติมเวกเตอร์cนี้จะถูกป้อนเข้าสู่ RNN / LSTM เช่นกัน (สามารถต่อกับอินพุตดั้งเดิมได้) ดังนั้นบริบทสามารถใช้เพื่อช่วยในการทำนาย
วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการคำนวณความน่าจะเป็นเวกเตอร์p=softmax(VTu)และc=∑ipiviที่Vคือกำหนดการทั้งหมดก่อนหน้านี้viฉัน ค้นหาแบบทั่วไปเวกเตอร์uปัจจุบันรัฐซ่อนชั่วโมงเสื้อที
มีหลายรูปแบบเกี่ยวกับเรื่องนี้และคุณสามารถทำสิ่งต่าง ๆ ที่ซับซ้อนตามที่คุณต้องการ ตัวอย่างเช่นแทนที่จะใช้vTiuเป็นบันทึกหนึ่งอาจเลือกf(vi,u)แทนโดยที่fเป็นเครือข่ายประสาทเทียมโดยพลการ
กลไกความสนใจทั่วไปสำหรับตัวแบบลำดับต่อลำดับใช้p=softmax(qTtanh(W1vi+W2ht))โดยที่vคือสถานะที่ซ่อนของตัวเข้ารหัสและhtคือสถานะที่ซ่อนอยู่ในปัจจุบัน ของตัวถอดรหัส qและทั้งสองWเป็นพารามิเตอร์
เอกสารบางฉบับที่แสดงให้เห็นถึงความแตกต่างของแนวคิดความสนใจ:
เครือข่ายตัวชี้ใช้ความสนใจในการอ้างอิงอินพุตเพื่อแก้ไขปัญหาการเพิ่มประสิทธิภาพ combinatorial
เครือข่ายหน่วยงานที่เกิดขึ้นประจำรักษาสถานะหน่วยความจำแยกต่างหากสำหรับเอนทิตีที่แตกต่างกัน (คน / วัตถุ) ในขณะที่อ่านข้อความและอัพเดตสถานะหน่วยความจำที่ถูกต้องโดยใช้ความสนใจ
หม้อแปลงไฟฟ้ารุ่นนี้ยังให้ความสนใจอย่างกว้างขวาง สูตรของพวกเขาให้ความสนใจเล็กน้อยทั่วไปมากขึ้นและยังเกี่ยวข้องกับพาหะที่สำคัญki : ความสนใจน้ำหนักpจะคำนวณจริงระหว่างคีย์และการค้นหาและบริบทที่สร้างขึ้นแล้วกับviฉัน
นี่คือการดำเนินการอย่างรวดเร็วของรูปแบบหนึ่งของความสนใจแม้ว่าฉันไม่สามารถรับประกันความถูกต้องนอกเหนือจากความจริงที่ว่ามันผ่านการทดสอบง่ายๆ
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 )
รหัสเต็ม