CS224N 2019-20: Homework 3

实验大体思路与遇到的重难点:
a, init里构造stack,buffer,dependence。parse_step里将‘S’,‘LA’,’RA’转化成具体的stack,buffer,dependence互相转移的操作。比较简单,不做赘述。
b, 重点步骤实现思路为在minibatch_parse里面实现每次循环让一个batch的数据输入模型得到一批数据的下一步进而更新一批数据,如果这一批数据有哪一个这一步之后分析完了就从unfinished_parses里面删除,下一次循环会有新的一个数据进入。这里unfinished_parses是浅复制,用remove不会影响到partial_parses,但用del就不行之后就没法统计partial_parses里面的dependence了。
c, 这一问通过重载nn.Module实现自定义_init_,embedding_lookup以及forward方法,与传统模型有所差异的是,init里面不直接要求调研api实现linear层,而是申明几个自有权重与偏置矩阵,这就为后面实现forward增加了一点小小的难度,需要我们仔细考虑矩阵的shape保证运算顺利。说到矩阵shape,embedding_lookup里面也很费尽心机,怎样按行顺序遍历w,并在embedings维度0里面定位累积并把产生的(n_features*batch_size, embed_size)的数据reshape成(batch_size, n_features * embed_size)十分考验对数据维度的敏感性,最终通过index_select与view函数顺利解决。run.py里面比较值得一说的就是loss_func里面自带softmax之前forward就不需要了。

关于结果中验证集结果小于测试集我查了一下,大概率由Dropout造成,它能基本上确保您的测试准确性最好,优于您的训练准确性。Dropout迫使你的神经网络成为一个非常大的弱分类器集合,这就意味着,一个单独的分类器没有太高的分类准确性,只有当你把他们串在一起的时候他们才会变得更强大。

运行截图:
CS224N 2019-20: Homework 3
UAS:
验证集最佳UAS:88.54
测试集UAS:89.14

代码: https://github.com/Goden-Yang/CS224N-2019-20-Homework-3