注意力往往与encoder-decoder(seq2seq)框架搭在一起,假设我们编码前与解码后的序列如下:
编码时,我们将source通过非线性变换到中间语义:
则我们解码时,第i个输出为:
可以看到,不管i为多少,都是基于相同的中间语义C进行解码的,也就是说,我们的注意力对所有输出都是相同的。所以,注意力机制的任务就是突出重点,也就是说,我们的中间语义C对不同i应该有不同的侧重点,即上式变为:
常见的有Bahdanau Attention
e(h,s)代表一层全连接层。
及Luong Attention
代码的主要目标是通过一个描述时间的字符串,预测为数字形式的字符串。如“ten before ten o'clock a.m”预测为09:50
在jupyter上运行,代码如下:
1,导入模块,好像并没有全部使用到,如Permute,Multiply,Reshape,LearningRateScheduler等
1 from keras.layers importBidirectional, Concatenate, Permute, Dot, Input, LSTM, Multiply, Reshape2 from keras.layers importRepeatVector, Dense, Activation, Lambda3 from keras.optimizers importAdam4 #from keras.utils import to_categorical
5 from keras.models importload_model, Model6 #from keras.callbacks import LearningRateScheduler
7 importkeras.backend as K8
9 importmatplotlib.pyplot as plt10 %matplotlib inline11
12 importrandom13 #import math
14
15 importjson16 import numpy as np
2,加载数据集,以及翻译前和翻译后的词典
1 with open('data/Time Dataset.json','r') as f:2 dataset =json.loads(f.read())3 with open('data/Time Vocabs.json','r') as f:4 human_vocab, machine_vocab =json.loads(f.read())5
6 human_vocab_size =len(human_vocab)7 machine_vocab_size = len(machine_vocab)
这里human_vocab词典是将每个字符映射到索引,machine_vocab是将翻译后的字符映射到索引,因为翻译后的时间只包含0-9以及冒号:
3,定义数据处理方法
1 defpreprocess_data(dataset, human_vocab, machine_vocab, Tx, Ty):2 """
3 A method for tokenizing data.4
5 Inputs:6 dataset - A list of sentence data pairs.7 human_vocab - A dictionary of tokens (char) to id's.8 machine_vocab - A dictionary of tokens (char) to id's.9 Tx - X data size10 Ty - Y data size11
12 Outputs:13 X - Sparse tokens for X data14 Y - Sparse tokens fo