cs224n-Lecture-5 反向传播和项目建议

文章目录
  1. 1. 两层神经网络和完整的反向传播
  2. 2. 以计算图来理解反向传播
  3. 3. 以流动图理解反向传播
  4. 4. 实际神经网络中的误差信号

具体的项目建议我没有写下来,可以参看今年cs224n课程给出的项目列表

两层神经网络和完整的反向传播

· 相同的窗口定义
· 相同的得分函数
· 两个隐藏层

主要工作:通过神经网络函数计算激活值,最后通过U.Ta(3)得到最终结果。
课堂提问:在最后一层用了一个线性层的原因是什么?
答案:为了让这里的数学计算简单一点,并且为了介绍另外一种目标函数。其中并不是每个值都要正则化然后让它们像概率一样加起来等于1。如果只是想从一大堆东西里把某一个挑出来(比如把处在中间的位置上的有命名的实体找出来),那么只要它的值高,就很可能是它;反之,值低,那就很可能不是在中央位置上。
从某个角度上,也可以在 s 计算完之后加上一个sigmoid函数,从而把得到的结果称为概率,然后在模型中使用标准的交叉熵损失。

将上图左边的部分写为一个完整的式子:

对W(2)的求导也是相同的:

矩阵表示如下:

其中:

现在主要需要弄清楚的是:最底层穿进来的误差消息δ(2)是什么?
当已经求导到W(2)Tδ(3),作为下一个从下而上的更新,如果是在前一个模型中,这就是会达到单词向量的那个信号,最终的单词向量更新就会定义为这样,接着通过链式法则再来一遍。

求导小trick:把这个值都看作标量,这就成了只有一个变量的函数(From Richard老师)。
然后就能得到δ(2)的值:

最终求导结果如下:

也就是说,如果想要计算进入到一个新层的误差信号的话,你就需要某个形式的更高层的权重W的转置乘上穿进来的误差信号。

以计算图来理解反向传播

这里的内容感觉有点类似之前吴恩达老师课程里讲反向传播的内容,原先写过的笔记中有相应的内容,在计算图导数部分可以看到吴老师给出的反向传播演示。

由上图中的计算,F就是损失函数,x,y,z就是这里的参数,目的是让损失函数最小化。
下面给出一个稍微复杂一点的计算图来理解反向传播:

通常使用sigmoid的地方是某个隐层的激活函数,在多数情况下,x是函数输入,w是权重,假设我们想要计算函数关于其中所有的元素w和x的偏导数,假设x是2维的,w是3维的,然后w有一个额外的项作为偏置项。
将所有的计算投影在计算图上,分解每一步操作,然后就可以计算梯度和每个节点的局部梯度。
计算图的反向传播过程:
Step 1:初始化是1,反向之后要对1/x求导,得到-1/(1.37)²*(1.00)

Step 2:

Step 3:

Step 4:

注:每一次局部梯度乘上全局梯度或者说是更高层传下来的梯度信号的时候,当相乘之后,就得到了这个位置的真实梯度,所以乘之前并不是真正的梯度。它们只是一些计算梯度用的中间值。

除了上述操作之外,其实可以把计算路线上的这部分操作都合并在一起,作为路线上的一个节点。

以流动图理解反向传播

对于相同的计算方式,如果x在流动图里分出了两条路线,那么根据多变量链式法则,需要把分别来自这两条路线局部的梯度信号加起来。

假如存在多条路径时,计算方式如下:

下面是更复杂的流程图示意:

神经网络视作流程图的一个实例,如下所示:

沿着运算图反向走的过程中更新各个参数。

现在这些推导过程不需要手算,现存的软件包(比如tensorflow),可以自动推导梯度。

实际神经网络中的误差信号


还是这张图,是否能把这张图表述成一个流动图或者计算路线的方法呢?
Step 1:

Step 2:

Step 3: