本周任务
学课程
学习cs224n第七讲第八讲
TensorFlow入门
- 课件: lecture07
- 观看视频
- 学习笔记:TensorFlow
RNN和语言模型
读论文
- 论文原文: paper
- 论文分析: highlight
- 论文笔记:词嵌入对传统方法的启发
写作业
- 2.1 Tensorflow Softmax 基于TensorFlow的softmax分类
- 2.2 Neural Transition-Based Dependency Parsing 基于神经网络的依赖分析
第七课笔记
TensorFlow是一个图,图中的节点是某种运算,图的边是tensor(张量,n维数组),在节点之间流动。
建立图
variable:是节点,输出当前值。它通常是模型的参数,是你想进行微调,最小化损失的东西。
placeholder:是节点,是在执行的时候才会接受值得节点。网络中依赖外部数据的输入,在你建立图的时候就不想预先写进的值,但是在运行中需要用到这些值,那么就给他在建图的时候来个占位符(placeholder)。对于占位符不初始化任何的值,只定义数据类型和分配张量的shape。
Mathematical operations:数学操作节点。比如矩阵乘法、加法、ReLU激活函数等等。写成代码就是 tf.nn.relu()或者tf.matmul()。
上面的幻灯片用了几行代码构建好了运算图。现在还没有输入,也没有运行,自然无法获得h的值。
上述代码没有显式的声明节点和边,这是tf在背后自动构造的。
运行图
建立一个会话,tf里叫做session。可以通过session将图部署到某个执行环境(CPU、GPU) ,session就是到某个软硬件执行环境的绑定。
fetches:图形节点列表,返回节点输出。
feeds:是一个从图节点到我们想要的模型中运行的实际值的字典映射(就是从placeholder到其输入值的映射).
加了三行代码。首先tf.Session()建立一个session,你可以在里面写参数说明你用了什么硬件。然后session.run()初始化所有变量(后面印度小哥讲的时候说tf已经更新了,现在的初始化用 tf.global_variables_initializer())。第三行是计算了h,并做了字典给x输入了值。所以h 是和fetches对应的,x 是和feeds对应的。
训练模型
import TensorFlow as tf
prediction = tf.nn.softmax(...) #Output of neural network
label = tf.placeholder(tf.float32, [100, 10])
cross_entropy = -tf.reduce_sum(label * tf.log(prediction), axis=1)
做好定义,建好了图。然后要初始化optimizer 优化器对象。tf中有一个通用的抽象类叫做optimizer,这个类中的每一个子类都是针对特定学习算法的优化器。课程中选了梯度下降优化器进行演示。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
当运行到这个train_step节点的时候,这个minimize会进行两个操作。先对其参数,也就是cross_entropy计算梯度,它和图中的所有变量相关,然后第二步更新这些变量。tf在其所有的节点都附带了梯度操作,所以反向传播在tf是自动的很easy的完成了。
变量共享
当你建立大模型时,会有大量的变量。比如想生成一张图的多个实例,或者在多个GPU上训练同一个模型,就会有同一个变量在不同位置上出现。
这张幻灯片讲了tf的命名空间。我们可以使用tf.variable_scope()定义一个命名空间,然后用tf.get_variable()创建变量,如果发现这个命名空间下已经有了同名的,那么就直接指向了这个已经存在的变量;要是没有叫这名的,就创建一个新的出来。
第八课笔记
第八课讲了RNN的基本概念。现在主要用的两种模型LSTM和GRU都是基于RNN的模型,在下一课会讲到LSTM和GRU,所以这次偷个懒,笔记可以看这里:http://www.hankcs.com/nlp/cs224n-rnn-and-language-models.html