作业内容翻译:@胡杨(superhy199148@hotmail.com) && @面包君 && Fantzy同学
校正与调整:寒小阳 && 龙心尘
时间:2016年6月
出处:
http://blog.csdn.net/han_xiaoyang/article/details/51815683
http://blog.csdn.net/longxinchen_ml/article/details/51814343
说明:本文为斯坦福大学CS224d课程的中文版内容笔记,已得到斯坦福大学课程@Richard Socher教授的授权翻译
0. 前言
原本打算把作业和答案做个编排,一起发出来给大家看,无奈代码量有点大,贴上来以后文章篇幅过长,于是乎题目的代码解答放到了百度云盘,欢迎自行下载和运行或者调整。
1. Tensorflow 与 softmax(20分)
在本题中,我们会执行一个线性分类器,并会用到下面的交叉熵损失函数:
(请注意,这里行 x 的是行特征向量)。我们会通过Tensorflow 的自动微分功能来训练数据。
a.(4分)
在脚本q1_softmax.py
中,通过TensorFlow来构造softmax 函数。softmax的公式如下:
请注意,你不能使用Tensorflow内建的tf.nn.softmax
函数或者其他相关内建函数。这道题目做好的标准是你能够通过运行python q1_softmax.py
命令将这个函数跑起来(需要跑通一个测试用例。当然,不要求完全详尽的测试。)
b. (4分)
在脚本q1_softmax.py
中,通过TensorFlow来构造交叉熵损失函数(Cross Entropy Loss)。交叉熵损失函数的公式长这个样子:
在这里 y∈R5 是一个one-hot标签向量, Nc 是所有类目的数量。请注意,你不能使用Tensorflow内建的cross-entropy
函数或者其他相关内建函数。这道题目做好的标准是你能够通过运行Python q1_softmax.py
脚本将这个函数跑起来(需要写一个测试用例。当然,这同样不要求完全详尽的测试。)
c. (4分)
请仔细学习model.py
脚本中的model
类。并简要解释一下其中占位符变量 (place holder vaiables)和填充字典(feed dictionaries)函数的目的. 在q1_classifier.py
中填充好add_palceholders
和creat_feed_dict
这两个函数.
提示: 请注意配置变量(configuration variables)在config
类中已经储存好了,而在代码中你会用到它们。
答案:在Tensorflow 计算图中,占位符变量是作为其输入节点而存在的。而填充字典函数说明了在计算的时候怎么给这些占位符(或者其他)变量赋值。
d. (4分)
在脚本ql_classifier.py
中的add_model
函数里完成一个用softmax进行分类的基本流程。并在同一个脚本中的函数add_loss_op
中补充好交叉熵损失函数。 请注意,使用本题之前提供的函数,而不是 Tensorflow 内建函数。
e. (4分)
在脚本ql_classifier.py
中填充完成add_training_op
函数。 并解释为什么Tensorflow 的自动微分功能能省去我们直接求梯度的工作。你可以在我们提供的数据上顺利运行python ql_classifier.py
命令,并且确保能够跑通测试用例。这样你才能保证你的模型是合适的。
提示:请一定要使用在config
类中定义的学习率.
答案:只要正确定义好了计算图,Tensorflow就能自动应用反向传播算法来计算梯度。
2. 神经网络在命名实体识别中的应用(35分)
这一节中,我们会练习反向传播算法和训练深度神经网络,通过它们来实现命名实体识别。命名实体识别是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。
这其实就是一个5类分类问题(5选1的单选题)。这5类包括上面这4类和1个非实体类——也就是不代表任何实体的类(大部词语都属于这类)。
这个模型是一个单隐藏层神经网络,它有一个类似我们在word2vec中看到的表示层。 这里我们不需要求平均值或者抽样,而是明确地将上下文定义为一个“窗口”,这个“窗口”包含目标词和它左右紧邻的词,是一个3d维度的行向量:
这里的 xt−1,xt,xt+1 是one-hot行向量(|V|维),而 L∈R|V|×d 是嵌入矩阵,它的每一行 Li 其实就代表一个特定的词 i 。我们然后做如下预测:
之后通过交叉熵损失函数来评估误差:
为了计算整个训练集的损失,我们在对每个训练样本计算 J(θ) 之后将其求和(或者求平均值)。
对于本题,令 d=50 作为词向量的长度。3个向量组成了一个宽度为 3×50=150 的窗口。隐藏层有100个神经元,输出层有5个神经元.
(part a)
(5分)请计算损失函数 J(θ) 在下列模型各个参数上的梯度
,这里矩阵的维度分别是
提示:为了能够清晰的表示反向传播的过程,我们给您推荐两个小trick:
- 使用激活函数的值来代替激活函数的微分。就像作业1中的 sigmoid 函数一样,下面这个函数也可以起到相同的作用。
tanh(z)=2sigmoid(2z)−1 - 使用“残差向量”的形式来表示某一层的梯度。这意味着我们的链式法则,现在可以写成用括号括起来的向量(矩阵)乘法的形式,这将使您的分析过程大大简化。
值得注意的是,损失函数在模型各参数上的梯度应该化简到可以使用矩阵运算的形式。(通过作业1,相信您已经掌握的很熟练了:))
答案:
由提示公式可得:
可得偏微分如下: