My solution to cs224n assignment2
My solution
1.tensorflow
这个题目是一个编程题目,模板填空。
这个题目相当于给出了tensorflow实现的模板或者框架。有必要掌握这个常用的框架,相比以前写的tensorflow代码大多是零散的,需要了解学习这种写法(不过具体写起来还是要因地制宜,我觉得零散的写法简单地封装有时候写起来也不错),就像需要学习pytorch的框架的写法一样,直接把模型写在forward函数里面。
具体代码略,以前的tensorflow代码也写过很多了,就是没有掌握框架的写法。
2.transition-based dependency parser
模拟解析过程
模拟解析,比较容易:
stack | buffer | new dependency | transition |
---|---|---|---|
[ROOT] | [I, parsed, this, sentence, correctly] | None | Init |
[ROOT, I] | [parsed, this, sentence, correctly] | None | SHIFT |
[ROOT, I, parsed] | [this, sentence, correctly] | None | SHIFT |
[ROOT, parsed] | [this, sentence, correctly] | (parserd, I) | LEFT-ARC |
[ROOT, parsed, this] | [sentence, correctly] | None | SHIFT |
[ROOT, parsed, this, sentence] | [correctly] | None | SHIFT |
[ROOT, parsed, sentence] | [correctly] | (sentence, this) | LEFT-ARC |
[ROOT, parsed] | [correctly] | (parsed, sentence) | RIGHT-ARC |
[ROOT, parsed, corectly] | [] | None | SHIFT |
[ROOT, parsed] | [] | (parsed, correctly) | RIGHT-ARC |
[ROOT] | [] | (ROOT, parsed) | RIGHT-ARC |
NN解析算法的细节
除了按照模板填空补全算法,还有一些对NN的考察,以下为涉及到的知识点的简要简析:
1.初始化
2.dropout
3.Adam
梯度变化比较缓慢,不容易在最优解附近波动。另一方面,可以认为相当于渐进地一边调整一边计算了一个更大的minibatch,所以梯度会更准确。
这样调整后,还加入了v这个项,在一段时间梯度很大的时候用于减缓学习率防止滑出过远,一段时间梯度很小的时候增加学习率,使得梯度比较小的时候能不陷入局部极值。
4.L2 reg
正常的正则化
参数的保存和调优
框架还保存了dev集合上的最优记录对应的参数,用于测试
3.RNN LM
RNN
RNN定义
GRU, LSTM是属于gated的RNN,与RNN大体一致,只是加了门。
LSTM已经很熟悉了,下面是GRU的模型:
类似RNN的一些模型类称为QRNNs(类RNNs),QRNN内部可能加入卷积来捕获n-gram同时帮助并行加速。
困惑度的定义
困惑度的定义是语言模型中转移概率的概率倒数的几何平均。
所谓转移概率是指给出前面的语境,然后语言模型给出的正确单词的概率。那么我们根据转移概率与交叉熵的关系可知,交叉熵是困惑度的对数。
求导
和普通的BP没有本质区别,链式法则+维度调整,已经很熟了,所以我没去做。