【CS224n】斯坦福自然语言处理课程学习笔记二

爷,独闯天下 提交于 2020-02-08 17:27:43

第四讲 Word Window 分类与神经网络

  1. 分类:正则化处理
    正则化能够有效防止过拟合,当我们的特征较多时,很容易导致模型过拟合,或者引起指数爆炸,而正则化操作能够使得在某些具体的点拟合较差,但总体的拟合曲线更加平滑,并且泛化性能更好。
    在这里插入图片描述
  2. 词窗口分类
    词含义的定义:词的含义并不是单一定义的,无法在不结合上下文的状态下确定一个词的真正含义,因此,一个单词的真正含义取决于窗口内的上下文的词。
    如何进行窗口分类:首先我们需要训练一个softmax分类器,给中心词分配一个标签,然后用一个窗口把它前后的单词连接起来,将窗口内的单词的词向量拼接放入softmax分类器,此时的表示分类的结果。此时我们的总体目标是对所有的分类概率求和,
  3. 神经网络结构
    x:一个窗口,即多个词向量的拼接
    a:神经元激活向量,最终分类层的输入
    分类器:softmax
    在这里插入图片描述
  4. 最大间隔损失函数
    训练目标:让正确窗口的得分比错误窗口的得分更大,其差值最好定义为1
  5. 如何确保不陷入局部最优
    不停的随机更新,使得它很难陷入局部最优,但事实上,你的窗口越小,你的随机性越大。
    在很多情况下,局部最优解事实上非常接近你设想的全局最优解。

第五讲 反向传播和项目建议

  1. 两层神经网络和反向传播
    这里的U代表的只是一个向量,假定最后通过向量内积得到的列向量即为我们想要的类别,然而在实际操作中,应该有许多非线性函数代替此处的U。
    在这里插入图片描述
    这里的x均为列向量。
  2. 数据集划分
    数据集在划分时,训练集、验证集和测试集不应该有重叠。
    具有时间特征的数据不应该随机采样,如果采用随机采样,在划分数据集时可能会有交叉。

第六讲 语法和依存分析

  1. 描述人类语言结构的方法
    上下文无关文法:自定义一些规则,即一些成分文法。
    依存句法结构:通过找到句子当中每一个词所依赖的部分来描述句子结构,如果一个词修饰另一个词,或者是另外一些词的一个论证,那么它就是那个词的依赖。通常用箭头表示它们之间的依存关系。
  2. 依存句法树的优点
    可以被重复利用:而人类指定的语法规则有时候通常无法重用,每个人对语法规则有着自己的理解。
    使用了真实的覆盖面广的数据。
    能给出所有可能性及其各自的频率,也会给出不同可能性同时发生的频率。
    可以用来评估构建的任何系统,以及各种工具的好坏。
  3. 依存关系表示
    依存句法:有一个词法项之间的关系,或词之间的关系,只有词法项之间是二元的不对称关系,也就是我们在这些词法项之间画箭头,这些箭头则称为依存。
    在这里插入图片描述
  4. 如何做依存句法分析
    把句子中的每个词都提出来,然后判断这些词的独立项或者头部是什么。
    通常有一些限制条件:首先需要选择一个词作为ROOT独立项,其次不希望有环的出现。
    只要满足以上条件就可以生成一个依存树。
    箭头通常画在句子上面,可以有交叉。
    通过树不能恢复正确的词的有序性,也就是说词序无法通过依存树体现。
  5. 依存句法分析的方法
    动态编程法
    图算法(最小生成树算法)
    约束补偿问题
    确定型依存句法分析:在考虑每个词的依赖项时有点贪心,希望有一个机器学习的分类方法

第七讲 TensorFlow入门

  1. 什么是TensorFlow?
    Big idea:将数值计算表示为计算图来执行,TensorFlow程序的主干都将是一个图,图的节点就是一个操作,每个节点都会有多个输入和一个输出,节点之间的边表示在它们之间流动的张量,张量就是一个n维的数组。
    在这里插入图片描述
    该图表示的是含有一个隐藏层的神经网络图结构,其中使用了ReLU作为激活函数。
    图中的W和b是变量,变量是能够保存当前输出状态的节点,并且默认能够自动进行梯度更新,变量也是你想要微调,进行最小化损失的东西。
    图中的x表示占位符(Placeholders),占位符是哪些在执行时间才会接收值的节点,如果网络需要依赖外部输入的值,则x就是我们的输入,我们在初始化时,不需要初始化值,只需分配一个数据类型,并且分配一种大小的张量。
    数学操作节点,图中的MatMul表示矩阵乘法,ADD表示加法,ReLU表示激活函数。
    图仅仅定义,通过get_operation()调用时,则生成了一整张Tensor图。
  2. 如何执行TensorFlow?
    将其定义为一张图以后,我们将其部署到会话中,会话是与特定的执行上下文(CPU或GPU)的绑定。
    在这里插入图片描述
    sess.run(fetches,feeds)
    Fetches是返回节点输出的图形节点列表,即h。
    feeds是从图形节点到我们先要在模型中运行的实际值的字典映射,即x占位符的值。
  3. 如何优化TensorFlow?
    我们将使用label和prediction建立一个损失节点。
    计算梯度:在tensorflow中,我们使用minimize计算梯度,minimize实际上做了两件事:第一是计算参数的梯度,在这个例子中,参数为交叉熵,它和我们图中定义的所有变量相关,在这个例子中即为b和W,然后他会给这些变量根据梯度进行更新。
    在这里插入图片描述
  4. 如何利用TensorFlow定义一个线性回归?
def linear_regression():
	x = tf.placeholder(tf.float32, shape=(None,), name='x')
	y = tf.placeholder(tf.float32, shape=(None,), name='y')

	with tf.variable_scope('lreg') as scope:
		w = tf.Variable(np.random.normal(), name='W')
		y_pred = tf.mul(w, x)

		loss = tf.reduce_mean(tf.square(y_pred - y))
	return x, y, y_pred, loss
def run():
	x_batch, y_batch = generate_dataset()

	x, y, y_pred, loss = linear_regression()
	optimizer = tf.train.GradientDecentOptimizer(0.1).minimize(loss)#优化器
	
	init = tf.global_variables_initializer()
	with tf.Session() as session:
		session.run(init)

		feed_dict = {x: x_batch, y: y_batch}
		for _ in range(30):
			loss_val, _ = session.run([loss, optimizer, feed_dict])
			print('loss:', loss_val.mean())

		y_pred_batch = session.run(y_pred, {x: x_batch})
  1. 如何利用TensorFlow实现一个word2vec(skip-gram)?
# 首先定义一些参数
batch_size = 128
vocabulary_size = 500000
embedding_size = 128
num_sampled = 64

# load_data
train_data, val_data, reverse_dictionary = load_data()
print("Number of training examples:", len(train_data)*batch_size)
print("Number of validation examples:", len(val_data))

def skipgram():
	batch_inputs = tf.placeholder(tf.int32, shape=[batch_size,])
	batch_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
	val_dataset = tf.constant(val_data, dtype=tf.int32)

	with tf.variable_scope("word2vec") as scope:
		embeddings = tf.Variable(tf.random_uniform([vocabulary_size, 
							    embedding_size], 
							    -1.0, 1.0))
		
		batch_embeddings = tf.nn.embedding_lookup(embedding, batch_inputs)

		weights = tf.Variable(tf.truncated_normal([vocabulary_size,
							   embedding_size]),
							   stddev = 1.0/math.sqrt(embedding_size)))
		biases = tf.Variable(tf.zeros([vocabulary_size]))
		loss = tf.reduce_mean(tf.nn.nce_loss(weights=weights,
				      		     biases=biases
				      		     labels=batch_labels,
				      		     inputs=batch_inputs,
				      		     num_sampled=num_sampled,
				      		     num_classes=vocabulary_size))

		norm = tf.sqrt(tf.reduce_mean(tf.square(embeddings), 1, keep_dims=True))
		normalized_embeddings = embeddings/norm
		val_embeddings = tf.nn.embedding_lookup(normalized_embeddings, val_dataset)
		similarity = tf.matmul(val_embeddings, normalized_embeddings, transpose_b=True)

		return batch_inputs, batch_labels, normalized_embeddings, loss, similarity


def run():
	batch_inputs, batch_labels, normalized_embeddings, loss, similarity= skipgram()
	optimizer = tf.train.GradientDescentOptimizer(1.0).minimize(loss)
	
	init = tf.global_variables_initializer()
	with tf.Session() as sess:
		sess.run(init)

		average_loss = 0.0
		for step, batch_data in enumerate(train_data):
			inputs, labels = batch_data
			feed_dict = {batch_inputs: inputs, batch_labels: labels}

			_, loss_val = session.run([optimizer, loss], feed_dict)
			average_loss += loss_val

			if step % 1000 == 0:
				if step > 0:
					average_loss /= 1000
				print('loss at iter', step, ":", average_loss)
				average_loss = 0

			if step % 5000 == 0:
				sim = similarity.eval()
				for i in xrange(len(val_data)):
					top_k = 8
					nearest = (-sim[i, :]).argsort()[1:top_k+1]
					print_closest_words(val_data[i], nearest, reverse_dictionary)
		final_embeddings = normalized_embedding.eval()
#let's training
final_embeddings = run()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!