深度学习与自然语言处理(5)_斯坦福cs224d 大作业测验2与解答

这篇博客详细介绍了斯坦福大学CS224d课程的大作业,涵盖Tensorflow中的softmax和交叉熵损失函数实现,命名实体识别中的神经网络应用,以及递归神经网络在语言建模中的应用。作业涉及编程实践,包括梯度计算、反向传播算法和模型训练。
摘要由CSDN通过智能技术生成

作业内容翻译:@胡杨(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分)

在本题中,我们会执行一个线性分类器,并会用到下面的交叉熵损失函数:

JsoftmaxCE(W)=CE(y,softmax(xW))

(请注意,这里行 x 的是行特征向量)。我们会通过Tensorflow 的自动微分功能来训练数据。

a.(4分)
在脚本q1_softmax.py中,通过TensorFlow来构造softmax 函数。softmax的公式如下:

softmax(x)i=exijexj

请注意,你不能使用Tensorflow内建的tf.nn.softmax函数或者其他相关内建函数。这道题目做好的标准是你能够通过运行python q1_softmax.py命令将这个函数跑起来(需要跑通一个测试用例。当然,不要求完全详尽的测试。)

b. (4分)
在脚本q1_softmax.py中,通过TensorFlow来构造交叉熵损失函数(Cross Entropy Loss)。交叉熵损失函数的公式长这个样子:

CE(y,y^)=i=1Ncyilog(y^i)

在这里 yR5 是一个one-hot标签向量, Nc 是所有类目的数量。请注意,你不能使用Tensorflow内建的cross-entropy函数或者其他相关内建函数。这道题目做好的标准是你能够通过运行Python q1_softmax.py脚本将这个函数跑起来(需要写一个测试用例。当然,这同样不要求完全详尽的测试。)

c. (4分)
请仔细学习model.py脚本中的model类。并简要解释一下其中占位符变量 (place holder vaiables)和填充字典(feed dictionaries)函数的目的. 在q1_classifier.py中填充好add_palceholderscreat_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维度的行向量:

x(t)=[xt1L,xtL,xt+1L]R3d

这里的 xt1,xt,xt+1 是one-hot行向量(|V|维),而 LR|V|×d 是嵌入矩阵,它的每一行 Li 其实就代表一个特定的词 i 。我们然后做如下预测:
h=tanh(x(t)W+b1)

y^=softmax(hU+b2)

之后通过交叉熵损失函数来评估误差:
J(θ)=CE(y,y^)=i=15yilog(y^i)

为了计算整个训练集的损失,我们在对每个训练样本计算 J(θ) 之后将其求和(或者求平均值)。
对于本题,令 d=50 作为词向量的长度。3个向量组成了一个宽度为 3×50=150 的窗口。隐藏层有100个神经元,输出层有5个神经元.

(part a)
(5分)请计算损失函数 J(θ) 在下列模型各个参数上的梯度

JU Jb2 JW Jb1 JLi

,这里矩阵的维度分别是

UR100×5 b2R5 WR150×100 b1R100 LiR50

提示:为了能够清晰的表示反向传播的过程,我们给您推荐两个小trick:

  • 使用激活函数的值来代替激活函数的微分。就像作业1中的 sigmoid 函数一样,下面这个函数也可以起到相同的作用。
    tanh(z)=2sigmoid(2z)1
  • 使用“残差向量”的形式来表示某一层的梯度。这意味着我们的链式法则,现在可以写成用括号括起来的向量(矩阵)乘法的形式,这将使您的分析过程大大简化。

值得注意的是,损失函数在模型各参数上的梯度应该化简到可以使用矩阵运算的形式。(通过作业1,相信您已经掌握的很熟练了:))

答案:
由提示公式可得:

tanh(z)=4sigmoid(2z)(1sigmoid(2z))

可得偏微分如下:
JU=hT(yy^)

Jb2=yy^

Jh=(yy^)UT

JW=(x(t))T(Jhtanh(2(x(t)W+b1)))

Jb1=(Jhtanh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值