写给程序员的机器学习入门 (七) - 双向递归模型 (BRNN) - 根据上下文补全单词
写给程序员的机器学习入门 (七) – 双向递归模型 (BRNN) – 根据上下文补全单词
这一篇将会介绍什么是双向递归模型和如何使用双向递归模型实现根据上下文补全句子中的单词。
双向递归模型
到这里为止我们看到的例子都是按原有顺序把输入传给递归模型的,例如传递第一天股价会返回根据第一天股价预测的涨跌,再传递第二天股价会返回根据第一天股价和第二天股价预测的涨跌,以此类推,这样的模型也称单向递归模型。如果我们要根据句子的一部分预测下一个单词,可以像下图这样做,这时 天气
会根据 今天
计算, 很好
会根据 今天
和 天气
计算:
那么如果想要预测在句子中间的单词呢?例如给出 今天
和 很好
预测 天气
,因为只能根据前面的单词预测,单向递归模型的效果会打折,这时候双向递归模型就派上用场了。双向递归模型 (BRNN, Bidirectional Recurrent Neural Network) 会先按原有顺序把输入传给递归模型,然后再按反向顺序把输入传给递归模型,然后合并正向输出和反向输出。如下图所示,hf
代表正向输出,hb
代表反向输出,把它们合并到一块就可以实现根据上下文预测中间的内容,今天
会根据反向的 天气
和 很好
计算,天气
会根据正向的 今天
和反向的 很好
计算,很好
会根据正向的 今天
和 天气
计算。
在 pytorch 中使用双向递归模型非常简单,只要在创建的时候传入参数 bidirectional = True
即可:
self.rnn = nn.GRU(
input_size = 20,
hidden_size = 50,
num_layers = 1,
batch_first = True,
bidirectional = True
)
单向递归模型会返回维度为 批次大小,输入次数,隐藏值数量
的 tensor,而双向递归模型会返回维度为 批次大小,输入次数,隐藏值数量*2
的 tensor。
你可能还会有疑问,双向递归模型会怎样处理批次呢?如果批次中每组数据的输入次数都不一样,那么反向计算的时候会不会从那些填充的 0 开始计算呢?以下是一个小实验,我们可以看到反向计算的时候 pytorch 会跳过结尾的填充值,不需要做特殊的处理