基础模型

序列模型有Sequence to sequence模型和image to sequence 模型。前者最常见的应用是机器翻译。机器翻译模型的前半部分使用编码网络对输入的原文句子进行编码,后半部分使用解码网络生成对应的翻译。后者的图像描述与之类似。

机器翻译以句子中每个单词的一系列向量作为输入,可以称作条件语言模型,其输出的句子概率是相对于输入的条件概率。通过输入的原文句子,模型将会告诉我们各种翻译语句输出所对应的可能性。对于各种可能的翻译结果,我们需要找到一个使得条件概率最大化的翻译句子作为输出。所以设计机器翻译模型的一个重要步骤就是设计一个合适的算法,找到使得条件概率最大化的的结果。目前最通用的算法是束搜索(Beam Search)。

集束搜索

法语翻译成英语为例:

对于含10000个单词的词汇表,将法语句子输入到编码网络中得到句子的编码,通过一个Softmax层计算词汇表中所有单词输出的概率值,然后设置集束宽度的大小,这里设置为3,则取前3个输出概率最大的单词,并保存。

对前一步取得的三个单词,计算其与单词表中的所有单词组成词对的概率。并与上一步的概率相乘,得到两个词对的概率。有$3\times 10000$个选择,最后再选择前3个概率最大的输出对。循环往复,直至遇到句尾符号结束

长度归一化

对于集束搜索算法,求得的各个概率值较小,相乘后会得到更小的值。所以在实践中,将概率取log值,再进行求和取最大值,得到一个数值上更加稳定的算法。

此外,可以在$ T_{y} $上加上一个指数$ \alpha $,通过调整其大小获得更好的效果。

误差分析

集束搜索算法是一种近似搜索算法,也被称为启发式搜索算法。它的输出不能保证总是可能性最大的句子,需要进行误差分析确定潜在的算法错误或模型错误。分别计算人工翻译的概率$ P(y^{*}|x)$ 以及模型翻译的概率 $P(\hat y|x) $,比较两个概率的大小,就能知道是算法的问题还是模型的问题。

Bleu Score

Bleu Score用来评估翻译系统的准确性。其评估理念是观察机器生成的翻译结果中的每一个词是否出现在至少一个人工翻译结果的参考之中。

除评估单个词外,还可进行二元词组的评估,以两个相邻的单词作为一个二元词组来进行Bleu Score评估,得到机器翻译的二元词组的得分和其相应的得分上限,进而得到改进的精确度。

注意力模型

利用前面的编码和解码的RNN模型,能够实现较为准确度机器翻译结果。对于短句子来说,其性能是十分良好的,但是如果是很长的句子,翻译的结果就会变差。

在进行人工翻译的时候,人类并不像编码解码RNN模型那样记忆整个输入句子,再进行相应翻译,而是一部分一部分地进行翻译。注意力模型和人类的翻译过程相似,也是一部分一部分地进行长句子翻译。翻译时,针对每个单词的输出,一般来说与某个输出相关的的单词应该是集中在本单词附近。所以注意力模型会在每个输入块上计算注意力权重,不同的权重对每一步的输出结果有不同的影响。

一个包含注意力机制的机器翻译模型如下:

def model(Tx, Ty, n_a, n_s, human_vocab_size, machine_vocab_size):
    # 定义输入序列X和LSTM解码器的隐藏状态s0和c0
    X = Input(shape=(Tx, human_vocab_size))
    s0 = Input(shape=(n_s,), name='s0')
    c0 = Input(shape=(n_s,), name='c0')
    s = s0
    c = c0
    # 输出列表
    outputs = []
    # 定义双向LSTM
    a = Bidirectional(LSTM(n_a, return_sequences=True), name='bidirectional_1')(X)
    # 迭代Ty,记录输出outputs
    for t in range(Ty):
        # 在时间步t返回上下文向量
        context = one_step_attention(a, s)
        # 将上下文向量应用于后来的LSTM cell
        s, _, c = post_activation_LSTM_cell(context, initial_state=[s, c])
        # 传播至全连接层
        out = output_layer(s)
        outputs.append(out)
    model = Model(inputs=[X, s0, c0], outputs=outputs)
    return model

语音识别

语音识别是将一段音频信号转化为相应的文本信息。构建语音识别系统可以应用前面介绍的注意力模型。另外一种方法是使用CTC(Connectionist temporal classification)损失函数的语音识别模型。这种方法允许RNN模型输出重复字符和空白字符,强制使输出输入的大小保持一致。

触发字检测

许多智能语言助手都有触发字检测系统,RNN模型可以也用于这一系统,输入音频特征,检测触发字,将触发字前的输出标记为0,触发字后的输出标记为1。