# Neural Programmer: Inducing Latent Programs with Gradient Descent笔记
## neural programmer模型
整个模型由四个部分组成:
* 一个RNN用于处理输入的问题
* 一个选择器用于在每一个time step,分别给一组操作和data segments赋予概率值
* 一组这个模型可以采用的操作
* 一个历史RNN用于记忆之前的操作和data segments
如下图
其中模型在t时刻的输出通过在data segments应用操作并按照概率加权得到,模型的最终输出是T时刻的输出
### 问题模型(question module)
question module将question tokens转换为一个distribution representation。在论文中,作者使用了RNN以及RNN最后的隐藏状态(hidden state)来表示。
类似于最常见的RNN,在机器翻译中的encoder-decoder模型中,将句子中每一个词的embedding作为每一个时刻的输入,取最终的hidden state作为该句子的一个表示。
对于每一个句子,作者除去了句子中的数字,并且将数字和数字左端那个词选出来单独保存为一个list
对于长句子,使用bidirectional RNN
### Selector选择器
selector在每一个时刻产生两个概率分布,一个用于set of operations,另一个用于set of columns。selector的输入是之前问题模型中得到的问题的表示和history RNN在时刻t的输出。
每一个operation由一个d维的向量表示,如果operation个数为O,那么可以用一个O*d的矩阵U来表示所有的operation.
**操作的选择**由以下公式决定
它就相当于将selector的输入(question representation 和 history RNN输出)拼接后接一个全联接层,一个激活层,一个全联接层后接 softmax 输出一个概率值
selector在每个时刻t也会产生columns的概率,用矩阵P(C*D)来表示column
**数据选择**
类似于操作选择
## Operations
Neural Programmer现在支持两种输出:a)标量 b)a list of items selected from the table
第一类输出用于"sum of elements in column C"类型的问题
第二类输出用于"Print elements in column A that are greater than 50"类型的问题
为了达到这样的目的,模型在每个时刻t维护来两种输出变量: scalar_answer, lookup_answer,除来这两个变量,模型还维护来另外一个变量row_select,用于表示选择row i的概率
neural programmer的关键是built-in的操作,这些操作可以接触到所有时间t之前的输出,下表所示
下图展示了如何计算输出
论文中给出了输出的变量的公式
###